Michael Kublin has uploaded a new change for review.

Change subject: engine: AsyncTaskManager - restart fix part 1 (Logic)
......................................................................

engine: AsyncTaskManager - restart fix part 1 (Logic)

The following fix should change a current behaviour which is:
During creation child command which is asynchronious a parameters of parent
command are saved in DB (this ok), but parameters of parent comand also 
contains a list
of parameters of child commands (sic!).
So a first child command created we save a parent command with list of one 
command,
second command created list with two commands and etc...
After a restart and random child is choosen, so we have a random number of 
child parameters.
By the way , if list of child parameters is updated after saving a task to db, 
we will never have a correct list
(Example can be seen in one of the next patches)
Solution, save to DB parent parameters and appropriate child command parameter, 
during endAction() bnuild a list
of parameters.
One of the known bugs (a lot of unknown): During preview on vm after all task 
are send to host, perform restart.
All task are send, all task finished successfully, but disk still left in 
status Locked and the number of disks is
random
Benefits:
1. Bug is solved
2. Reduced serialization and desirialization (by current situation we have 
O(n^2) serialization/deserialization operations)
3. Most of the logic moved to the same place, no need to copy paste it all over 
a project
4. No need to make work arounds all over a project

What is still not solved:
If we will fail in the middle of task creation, we will not know if all task 
that we have that all tak that we wanted to start,
the fix is easy and will be send soon

Change-Id: I06507f537b2de0dc358a59aa27e62cbb042ccbb1
Signed-off-by: Michael Kublin <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskFactory.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskManager.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EntityAsyncTask.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskParameters.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/AsyncTasks.java
6 files changed, 36 insertions(+), 15 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/28/12128/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskFactory.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskFactory.java
index 0af39e4..5945531 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskFactory.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskFactory.java
@@ -29,13 +29,18 @@
      */
     public static SPMAsyncTask Construct(AsyncTaskCreationInfo creationInfo) {
         AsyncTasks asyncTask = 
DbFacade.getInstance().getAsyncTaskDao().get(creationInfo.getTaskID());
-        if (asyncTask == null || asyncTask.getaction_parameters() == null) {
-            asyncTask = new AsyncTasks(VdcActionType.Unknown, 
AsyncTaskResultEnum.success,
+        if (asyncTask == null || asyncTask.getActionParameters() == null) {
+            asyncTask =
+                    new AsyncTasks(VdcActionType.Unknown,
+                            AsyncTaskResultEnum.success,
                             AsyncTaskStatusEnum.running,
                             creationInfo.getTaskID(),
                             new VdcActionParametersBase(),
+                            new VdcActionParametersBase(),
                             creationInfo.getStepId(),
-                            asyncTask == null ? Guid.NewGuid() : 
asyncTask.getCommandId(),creationInfo.getStoragePoolID(),creationInfo.getTaskType());
+                            asyncTask == null ? Guid.NewGuid() : 
asyncTask.getCommandId(),
+                            creationInfo.getStoragePoolID(),
+                            creationInfo.getTaskType());
             creationInfo.setTaskType(AsyncTaskType.unknown);
         }
         AsyncTaskParameters asyncTaskParams = new 
AsyncTaskParameters(creationInfo, asyncTask);
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskManager.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskManager.java
index 8f8bed6..184f5da 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskManager.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskManager.java
@@ -458,7 +458,7 @@
     public synchronized void UpdateTaskWithActionParameters(Guid taskID, 
VdcActionParametersBase actionParameters) {
         if (_tasks.containsKey(taskID)) {
             AsyncTasks currentDbAsyncTask = 
_tasks.get(taskID).getParameters().getDbAsyncTask();
-            currentDbAsyncTask.setaction_parameters(actionParameters);
+            currentDbAsyncTask.setActionParameters(actionParameters);
             AsyncTaskUtils.updateAsyncTaskInDB(_tasks.get(taskID));
         }
     }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
index 9e8a422..e08ed04 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
@@ -1339,6 +1339,7 @@
                         AsyncTaskStatusEnum.running,
                         asyncTaskCreationInfo.getTaskID(),
                         parametersForTask,
+                        getParameters(),
                         asyncTaskCreationInfo.getStepId(),
                         
getCommandId(),asyncTaskCreationInfo.getStoragePoolID(),
                         asyncTaskCreationInfo.getTaskType()));
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EntityAsyncTask.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EntityAsyncTask.java
index 1a00ed9..13b1467 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EntityAsyncTask.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EntityAsyncTask.java
@@ -7,10 +7,10 @@
 import org.ovirt.engine.core.bll.context.CommandContext;
 import org.ovirt.engine.core.bll.job.ExecutionContext;
 import org.ovirt.engine.core.bll.job.ExecutionHandler;
+import org.ovirt.engine.core.common.action.VdcActionParametersBase;
 import org.ovirt.engine.core.common.action.VdcReturnValueBase;
 import org.ovirt.engine.core.common.asynctasks.AsyncTaskParameters;
 import org.ovirt.engine.core.common.asynctasks.EndedTaskInfo;
-import org.ovirt.engine.core.common.asynctasks.SetTaskGroupStatusVisitor;
 import org.ovirt.engine.core.common.businessentities.AsyncTasks;
 import org.ovirt.engine.core.compat.NGuid;
 import org.ovirt.engine.core.utils.log.Log;
@@ -116,14 +116,18 @@
 
         AsyncTasks dbAsyncTask = getParameters().getDbAsyncTask();
         for (EndedTaskInfo taskInfo : 
entityInfo.getEndedTasksInfo().getTasksInfo()) {
-            dbAsyncTask.getaction_parameters()
-                    .Accept(taskInfo, new SetTaskGroupStatusVisitor());
+            VdcActionParametersBase childTaskParameters =
+                    
taskInfo.getTaskParameters().getDbAsyncTask().getTaskParameters();
+            dbAsyncTask.getActionParameters().getImagesParameters()
+                    .add(childTaskParameters);
+            childTaskParameters
+                    
.setTaskGroupSuccess(taskInfo.getTaskStatus().getTaskEndedSuccessfully());
         }
 
         try {
             log.infoFormat("EntityAsyncTask::EndCommandAction [within thread] 
context: Attempting to EndAction '{0}', executionIndex: '{1}'",
                     entityInfo.getActionType(),
-                    dbAsyncTask.getaction_parameters().getExecutionIndex());
+                    dbAsyncTask.getActionParameters().getExecutionIndex());
 
             try {
                 /**
@@ -136,7 +140,7 @@
 
                 vdcReturnValue =
                         
Backend.getInstance().endAction(entityInfo.getActionType(),
-                                dbAsyncTask.getaction_parameters(),
+                                dbAsyncTask.getActionParameters(),
                                 new CommandContext(context));
             } catch (RuntimeException Ex) {
                 String errorMessage =
@@ -155,7 +159,7 @@
         }
 
         finally {
-            boolean isTaskGroupSuccess = 
dbAsyncTask.getaction_parameters().getTaskGroupSuccess();
+            boolean isTaskGroupSuccess = 
dbAsyncTask.getActionParameters().getTaskGroupSuccess();
             handleEndActionResult(entityInfo, vdcReturnValue, context, 
isTaskGroupSuccess);
             _endActionsInProgress.decrementAndGet();
         }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskParameters.java
index c0229f5..605e14a 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskParameters.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskParameters.java
@@ -40,7 +40,7 @@
     private Object _entityId;
 
     public Object getEntityId() {
-        return (_entityId == null) ? 
getDbAsyncTask().getaction_parameters().getEntityId() : _entityId;
+        return (_entityId == null) ? 
getDbAsyncTask().getActionParameters().getEntityId() : _entityId;
     }
 
     public void setEntityId(Object value) {
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/AsyncTasks.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/AsyncTasks.java
index c90ffb8..48e5bf8 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/AsyncTasks.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/AsyncTasks.java
@@ -18,12 +18,13 @@
     }
 
     public AsyncTasks(VdcActionType action_type, AsyncTaskResultEnum result, 
AsyncTaskStatusEnum status, Guid task_id,
-            VdcActionParametersBase action_parameters, NGuid stepId, Guid 
commandId, Guid storagePoolId, AsyncTaskType taskType) {
+            VdcActionParametersBase actionParameters, VdcActionParametersBase 
taskParameters, NGuid stepId, Guid commandId, Guid storagePoolId, AsyncTaskType 
taskType) {
         this.actionType = action_type;
         this.result = result;
         this.status = status;
         this.taskId = task_id;
-        this.setaction_parameters(action_parameters);
+        this.actionParameters = actionParameters;
+        this.taskParameters = taskParameters;
         this.stepId = stepId;
         this.startTime = new Date();
         this.commandId = commandId;
@@ -85,14 +86,24 @@
 
     private VdcActionParametersBase actionParameters;
 
-    public VdcActionParametersBase getaction_parameters() {
+    public VdcActionParametersBase getActionParameters() {
         return this.actionParameters;
     }
 
-    public void setaction_parameters(VdcActionParametersBase value) {
+    public void setActionParameters(VdcActionParametersBase value) {
         this.actionParameters = value;
     }
 
+    private VdcActionParametersBase taskParameters;
+
+    public VdcActionParametersBase getTaskParameters() {
+        return taskParameters;
+    }
+
+    public void setTaskParameters(VdcActionParametersBase taskParameters) {
+        this.taskParameters = taskParameters;
+    }
+
     private NGuid stepId;
 
     public NGuid getStepId() {


--
To view, visit http://gerrit.ovirt.org/12128
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I06507f537b2de0dc358a59aa27e62cbb042ccbb1
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Michael Kublin <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to