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
