Ravi Nori has uploaded a new change for review. Change subject: core : Persist AsyncTask before submitting to vdsm ......................................................................
core : Persist AsyncTask before submitting to vdsm This is second patch for better support for cases of missing engine crash This patch persists the AsyncTask before submitting and then updates the async task with the id from vdsm. Change-Id: Ibc5a548cb53172e6399f4334f24163dd855291ab Signed-off-by: Ravi Nori <rn...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractSPMAsyncTaskHandler.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddImageFromScratchCommand.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/CreateCloneOfTemplateCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateImageTemplateCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateSnapshotCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HibernateVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyImageGroupCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveSnapshotSingleDiskCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveTemplateSnapshotCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RestoreFromSnapshotCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDiskCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskFactory.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskUtils.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskHandlerCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskManagerUtil.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/BackwardCompatibilityTaskCreationTest.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskCreationInfo.java 22 files changed, 265 insertions(+), 62 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/78/14078/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractSPMAsyncTaskHandler.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractSPMAsyncTaskHandler.java index 1ea8307..c9702d2 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractSPMAsyncTaskHandler.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractSPMAsyncTaskHandler.java @@ -36,7 +36,11 @@ if (getEnclosingCommand().getParameters().getTaskGroupSuccess()) { getReturnValue().setSucceeded(false); beforeTask(); - addTask(Backend.getInstance().getResourceManager() + Guid taskId = cmd.createAsyncTask(cmd.getActionType(), + getTaskObjectType(), + getTaskObjects()); + + addTask(taskId, Backend.getInstance().getResourceManager() .RunVdsCommand(getVDSCommandType(), getVDSParameters()), false); } ExecutionHandler.setAsyncJob(getEnclosingCommand().getExecutionContext(), true); @@ -48,23 +52,28 @@ revertTask(); VDSCommandType revertCommandType = getRevertVDSCommandType(); if (revertCommandType != null) { - addTask(Backend.getInstance().getResourceManager() + Guid taskId = cmd.createAsyncTask(cmd.getActionType(), + getTaskObjectType(), + getTaskObjects()); + + addTask(taskId, Backend.getInstance().getResourceManager() .RunVdsCommand(getRevertVDSCommandType(), getRevertVDSParameters()), true); } } - private void addTask(VDSReturnValue vdsReturnValue, boolean isRevertedTask) { + private void addTask(Guid taskId, VDSReturnValue vdsReturnValue, boolean isRevertedTask) { AsyncTaskCreationInfo taskCreationInfo = vdsReturnValue.getCreationInfo(); getReturnValue().getInternalTaskIdList().add(cmd.createTask( + taskId, taskCreationInfo, cmd.getActionType(), getTaskObjectType(), getTaskObjects()) ); - Guid taskId = taskCreationInfo.getVdsmTaskId(); - getReturnValue().getTaskIdList().add(taskId); + Guid vdsmTaskId = taskCreationInfo.getVdsmTaskId(); + getReturnValue().getTaskIdList().add(vdsmTaskId); if (isRevertedTask) { - log.infoFormat("Reverting task {0} with ID {1} on DataCenter {2}.", taskCreationInfo.getTaskType().name(), taskId, taskCreationInfo.getStoragePoolID()); + log.infoFormat("Reverting task {0} with ID {1} on DataCenter {2}.", taskCreationInfo.getTaskType().name(), vdsmTaskId, taskCreationInfo.getStoragePoolID()); } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddImageFromScratchCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddImageFromScratchCommand.java index 62bc58d..ea01f49 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddImageFromScratchCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddImageFromScratchCommand.java @@ -71,6 +71,10 @@ } protected boolean processImageInIrs() { + Guid taskId = this.createAsyncTask(getParameters().getParentCommand(), + VdcObjectType.Storage, + getParameters().getStorageDomainId()); + VDSReturnValue vdsReturnValue = runVdsCommand( VDSCommandType.CreateImage, new CreateImageVDSCommandParameters(getParameters().getStoragePoolId(), getParameters() @@ -81,7 +85,8 @@ if (vdsReturnValue.getSucceeded()) { getParameters().setTaskIds(new ArrayList<Guid>()); getParameters().getTaskIds().add( - createTask(vdsReturnValue.getCreationInfo(), + createTask(taskId, + vdsReturnValue.getCreationInfo(), getParameters().getParentCommand(), VdcObjectType.Storage, getParameters().getStorageDomainId())); 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 252e87f..351a90f 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 @@ -1247,6 +1247,18 @@ _returnValue.setFault(fault); } + public Guid createAsyncTask( + VdcActionType parentCommand) { + return TaskManagerUtil.createAsyncTask(this, parentCommand, null, EMPTY_GUID_ARRAY); + } + + public Guid createAsyncTask( + VdcActionType parentCommand, + VdcObjectType entityType, + Guid... entityIds) { + return TaskManagerUtil.createAsyncTask(this, parentCommand, entityType, entityIds); + } + /** * Use this method in order to create task in the AsyncTaskManager in a safe way. If you use this method within a * certain command, make sure that the command implemented the ConcreteCreateTask method. @@ -1261,11 +1273,13 @@ * Ids of entities to be associated with task * @return Guid of the created task. */ - protected Guid createTask(AsyncTaskCreationInfo asyncTaskCreationInfo, + protected Guid createTask( + Guid taskId, + AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType parentCommand, VdcObjectType entityType, Guid... entityIds) { - return TaskManagerUtil.createTask(this, asyncTaskCreationInfo, parentCommand, null, entityType, entityIds); + return TaskManagerUtil.createTask(taskId, this, asyncTaskCreationInfo, parentCommand, null, entityType, entityIds); } /** @@ -1275,8 +1289,8 @@ * @return An {@link SPMAsyncTask} object representing the task to be run */ public SPMTask concreteCreateTask - (AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType parentCommand) { - return TaskManagerUtil.concreteCreateTask(this, asyncTaskCreationInfo, parentCommand); + (Guid taskId, AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType parentCommand) { + return TaskManagerUtil.concreteCreateTask(taskId, this, asyncTaskCreationInfo, parentCommand); } /** * Use this method in order to create task in the AsyncTaskManager in a safe way. If you use this method within a @@ -1292,9 +1306,9 @@ * Ids of entities to be associated with task * @return Guid of the created task. */ - protected Guid createTask(AsyncTaskCreationInfo asyncTaskCreationInfo, + protected Guid createTask(Guid taskId, AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType parentCommand) { - return TaskManagerUtil.createTask(this, asyncTaskCreationInfo, parentCommand, null, null, EMPTY_GUID_ARRAY); + return TaskManagerUtil.createTask(taskId, this, asyncTaskCreationInfo, parentCommand, null, null, EMPTY_GUID_ARRAY); } /** @return The type of task that should be created for this command. Commands that do not create async tasks should throw a {@link UnsupportedOperationException} */ diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateCloneOfTemplateCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateCloneOfTemplateCommand.java index a8fc05f..d7d5a68 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateCloneOfTemplateCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateCloneOfTemplateCommand.java @@ -59,6 +59,11 @@ VDSReturnValue vdsReturnValue = null; try { + Guid taskId = this.createAsyncTask(VdcActionType.AddVmFromTemplate, + VdcObjectType.Storage, + getParameters().getStorageDomainId(), + getDestinationStorageDomainId()); + vdsReturnValue = Backend .getInstance() .getResourceManager() @@ -74,7 +79,10 @@ if (vdsReturnValue.getSucceeded()) { getReturnValue().getInternalTaskIdList().add( - createTask(vdsReturnValue.getCreationInfo(), VdcActionType.AddVmFromTemplate,VdcObjectType.Storage, + createTask(taskId, + vdsReturnValue.getCreationInfo(), + VdcActionType.AddVmFromTemplate, + VdcObjectType.Storage, getParameters().getStorageDomainId(), getDestinationStorageDomainId())); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateImageTemplateCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateImageTemplateCommand.java index 33958e0..e3292ad 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateImageTemplateCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateImageTemplateCommand.java @@ -48,6 +48,11 @@ DiskImage newImage = cloneDiskImage(getDestinationImageId()); fillVolumeInformation(newImage); + Guid taskId = this.createAsyncTask(VdcActionType.AddVmTemplate, + VdcObjectType.Storage, + getParameters().getStorageDomainId(), + getParameters().getDestinationStorageDomainId()); + VDSReturnValue vdsReturnValue = Backend .getInstance() .getResourceManager() @@ -62,8 +67,11 @@ .toString())); getReturnValue().getInternalTaskIdList().add( - createTask(vdsReturnValue.getCreationInfo(), VdcActionType.AddVmTemplate, - VdcObjectType.Storage, getParameters().getStorageDomainId(), + createTask(taskId, + vdsReturnValue.getCreationInfo(), + VdcActionType.AddVmTemplate, + VdcObjectType.Storage, + getParameters().getStorageDomainId(), getParameters().getDestinationStorageDomainId())); newImage.setId(destinationImageGroupID); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateSnapshotCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateSnapshotCommand.java index 8e408b8..eded9e6 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateSnapshotCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateSnapshotCommand.java @@ -82,6 +82,11 @@ VDSReturnValue vdsReturnValue = null; try { + Guid taskId = this.createAsyncTask(getParameters().getParentCommand(), + VdcObjectType.Storage, + getParameters().getStorageDomainId(), + getParameters().getDestinationImageId()); + vdsReturnValue = Backend .getInstance() @@ -103,7 +108,8 @@ if (vdsReturnValue.getSucceeded()) { getParameters().setTaskIds(new java.util.ArrayList<Guid>()); getParameters().getTaskIds().add( - createTask(vdsReturnValue.getCreationInfo(), + createTask(taskId, + vdsReturnValue.getCreationInfo(), getParameters().getParentCommand(), VdcObjectType.Storage, getParameters().getStorageDomainId(), diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HibernateVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HibernateVmCommand.java index 23916ff..1e1860b 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HibernateVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HibernateVmCommand.java @@ -112,6 +112,10 @@ } }); + Guid taskId1 = this.createAsyncTask(VdcActionType.HibernateVm, + VdcObjectType.Storage, + getStorageDomainId().getValue()); + Guid image1GroupId = Guid.NewGuid(); // this is temp code until SPM will implement the new verb that does // it for us: @@ -138,11 +142,14 @@ return; } Guid guid1 = - createTask(ret1.getCreationInfo(), + createTask(taskId1, + ret1.getCreationInfo(), VdcActionType.HibernateVm, VdcObjectType.Storage, getStorageDomainId().getValue()); getReturnValue().getTaskIdList().add(guid1); + + Guid taskId2 = this.createAsyncTask(VdcActionType.HibernateVm); // second vol should be 10kb Guid image2GroupId = Guid.NewGuid(); @@ -169,7 +176,7 @@ if (!ret2.getSucceeded()) { return; } - Guid guid2 = createTask(ret2.getCreationInfo(), VdcActionType.HibernateVm); + Guid guid2 = createTask(taskId2, ret2.getCreationInfo(), VdcActionType.HibernateVm); getReturnValue().getTaskIdList().add(guid2); // this is the new param that should be passed to the hibernate diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyImageGroupCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyImageGroupCommand.java index 89c239c..f056f68 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyImageGroupCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyImageGroupCommand.java @@ -59,6 +59,12 @@ Guid sourceDomainId = getParameters().getSourceDomainId() != null ? getParameters().getSourceDomainId() .getValue() : getDiskImage().getStorageIds().get(0); + + Guid taskId = this.createAsyncTask(getParameters().getParentCommand(), + VdcObjectType.Storage, + sourceDomainId, + getParameters().getStorageDomainId()); + if (getParameters().getUseCopyCollapse()) { vdsReturnValue = runVdsCommand( VDSCommandType.CopyImage, @@ -103,7 +109,8 @@ if (vdsReturnValue.getSucceeded()) { AsyncTaskCreationInfo taskCreationInfo = vdsReturnValue.getCreationInfo(); getReturnValue().getInternalTaskIdList().add( - createTask(taskCreationInfo, + createTask(taskId, + taskCreationInfo, getParameters().getParentCommand(), VdcObjectType.Storage, sourceDomainId, diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java index f16f844..11d9786 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java @@ -76,9 +76,14 @@ @Override protected void executeCommand() { if (getDiskImage() != null) { + Guid taskId = this.createAsyncTask(getParameters().getParentCommand(), + VdcObjectType.Storage, + getParameters().getStorageDomainId()); + VDSReturnValue vdsReturnValue = performImageVdsmOperation(); getReturnValue().getInternalTaskIdList().add( - createTask(vdsReturnValue.getCreationInfo(), + createTask(taskId, + vdsReturnValue.getCreationInfo(), getParameters().getParentCommand(), VdcObjectType.Storage, getParameters().getStorageDomainId())); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveSnapshotSingleDiskCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveSnapshotSingleDiskCommand.java index d1f81a2..c71d53a 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveSnapshotSingleDiskCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveSnapshotSingleDiskCommand.java @@ -34,6 +34,10 @@ Guid imageGroupId = getDiskImage().getimage_group_id() != null ? getDiskImage().getimage_group_id().getValue() : Guid.Empty; + Guid taskId = this.createAsyncTask(VdcActionType.RemoveSnapshot, + VdcObjectType.Storage, + storageDomainId); + VDSReturnValue vdsReturnValue = Backend .getInstance() .getResourceManager() @@ -46,7 +50,8 @@ if (vdsReturnValue != null && vdsReturnValue.getCreationInfo() != null) { getReturnValue().getInternalTaskIdList().add( - TaskManagerUtil.createTask(this, + TaskManagerUtil.createTask(taskId, + this, vdsReturnValue.getCreationInfo(), VdcActionType.RemoveSnapshot, ExecutionMessageDirector.resolveStepMessage(StepEnum.MERGE_SNAPSHOTS, getJobMessageProperties()), diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveTemplateSnapshotCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveTemplateSnapshotCommand.java index 7651dcb..dd12467 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveTemplateSnapshotCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveTemplateSnapshotCommand.java @@ -7,6 +7,7 @@ import org.ovirt.engine.core.common.vdscommands.DeleteImageGroupVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; +import org.ovirt.engine.core.compat.Guid; /** * This command is responsible for removing a template image. @@ -19,6 +20,10 @@ @Override protected void executeCommand() { + Guid taskId = this.createAsyncTask(VdcActionType.RemoveVmTemplate, + VdcObjectType.Storage, + getParameters().getStorageDomainId()); + VDSReturnValue vdsReturnValue = Backend .getInstance() .getResourceManager() @@ -30,7 +35,8 @@ if (vdsReturnValue.getSucceeded()) { getReturnValue().getInternalTaskIdList().add( - createTask(vdsReturnValue.getCreationInfo(), + createTask(taskId, + vdsReturnValue.getCreationInfo(), VdcActionType.RemoveVmTemplate, VdcObjectType.Storage, getParameters().getStorageDomainId())); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RestoreFromSnapshotCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RestoreFromSnapshotCommand.java index dc00016..a9ec6ae 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RestoreFromSnapshotCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RestoreFromSnapshotCommand.java @@ -106,6 +106,10 @@ Guid imageGroupId = getDiskImage().getimage_group_id() != null ? getDiskImage().getimage_group_id() .getValue() : Guid.Empty; + Guid taskId = this.createAsyncTask(VdcActionType.RestoreAllSnapshots, + VdcObjectType.Storage, + storageDomainId); + vdsReturnValue = runVdsCommand( VDSCommandType.DestroyImage, new DestroyImageVDSCommandParameters(storagePoolId, storageDomainId, imageGroupId, @@ -114,7 +118,8 @@ if (vdsReturnValue.getSucceeded()) { getReturnValue().getInternalTaskIdList().add( - createTask(vdsReturnValue.getCreationInfo(), + createTask(taskId, + vdsReturnValue.getCreationInfo(), VdcActionType.RestoreAllSnapshots, VdcObjectType.Storage, storageDomainId)); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java index 7b3bd61..e74704a 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java @@ -254,6 +254,8 @@ } }).size() > 0; + Guid taskId1 = this.createAsyncTask(parentCommand, VdcObjectType.Storage, imagesList[0]); + // delete first image // the next 'DeleteImageGroup' command should also take care of the // image removal: @@ -267,9 +269,10 @@ } Guid guid1 = - createTask(vdsRetValue1.getCreationInfo(), parentCommand, VdcObjectType.Storage, imagesList[0]); + createTask(taskId1, vdsRetValue1.getCreationInfo(), parentCommand, VdcObjectType.Storage, imagesList[0]); getTaskIdList().add(guid1); + Guid taskId2 = this.createAsyncTask(parentCommand); // delete second image // the next 'DeleteImageGroup' command should also take care of the // image removal: @@ -285,7 +288,7 @@ return false; } - Guid guid2 = createTask(vdsRetValue2.getCreationInfo(), parentCommand); + Guid guid2 = createTask(taskId2, vdsRetValue2.getCreationInfo(), parentCommand); getTaskIdList().add(guid2); if (startPollingTasks) { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDiskCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDiskCommand.java index bb29f21..521692a 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDiskCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDiskCommand.java @@ -76,11 +76,20 @@ } @Override - public Guid createTask(AsyncTaskCreationInfo asyncTaskCreationInfo, + public Guid createAsyncTask( VdcActionType parentCommand, VdcObjectType entityType, Guid... entityIds) { - return super.createTask(asyncTaskCreationInfo, parentCommand, entityType, entityIds); + return super.createAsyncTask(parentCommand, entityType, entityIds); + } + + @Override + public Guid createTask(Guid taskId, + AsyncTaskCreationInfo asyncTaskCreationInfo, + VdcActionType parentCommand, + VdcObjectType entityType, + Guid... entityIds) { + return super.createTask(taskId, asyncTaskCreationInfo, parentCommand, entityType, entityIds); } @Override diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java index f620a88..834c26b 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java @@ -70,11 +70,21 @@ } @Override - public Guid createTask(AsyncTaskCreationInfo asyncTaskCreationInfo, + public Guid createTask( + Guid taskId, + AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType parentCommand, VdcObjectType entityType, Guid... entityIds) { - return super.createTask(asyncTaskCreationInfo, parentCommand, entityType, entityIds); + return super.createTask(taskId, asyncTaskCreationInfo, parentCommand, entityType, entityIds); + } + + @Override + public Guid createAsyncTask( + VdcActionType parentCommand, + VdcObjectType entityType, + Guid... entityIds) { + return super.createAsyncTask(parentCommand, entityType, entityIds); } @Override diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskFactory.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskFactory.java index 0c90808..ac93578 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskFactory.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskFactory.java @@ -29,7 +29,7 @@ * @return */ public static SPMAsyncTask Construct(CommandCoordinator coco, AsyncTaskCreationInfo creationInfo) { - AsyncTasks asyncTask = DbFacade.getInstance().getAsyncTaskDao().get(creationInfo.getVdsmTaskId()); + AsyncTasks asyncTask = DbFacade.getInstance().getAsyncTaskDao().getByVdsmTaskId(creationInfo.getVdsmTaskId()); if (asyncTask == null || asyncTask.getActionParameters() == null) { asyncTask = new AsyncTasks(VdcActionType.Unknown, diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskUtils.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskUtils.java index 76b621e..014ea5a 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskUtils.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskUtils.java @@ -1,6 +1,9 @@ package org.ovirt.engine.core.bll.tasks; import org.ovirt.engine.core.bll.tasks.interfaces.SPMTask; +import org.ovirt.engine.core.common.VdcObjectType; +import org.ovirt.engine.core.common.businessentities.AsyncTasks; +import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.utils.log.Log; import org.ovirt.engine.core.utils.log.LogFactory; @@ -31,6 +34,24 @@ } } + public static void addOrUpdateTaskInDB(AsyncTasks task, + VdcObjectType entityType, + Guid... entityIds) { + try { + if (task != null) { + DbFacade.getInstance() + .getAsyncTaskDao() + .saveOrUpdate(task, + entityType, + entityIds); + } + } catch (RuntimeException e) { + log.error(String.format( + "Adding/Updating task %1$s to DataBase threw an exception.", + task.getTaskId()), e); + } + } + private static final Log log = LogFactory.getLog(AsyncTaskUtils.class); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java index ab02588..e57e3aa 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java @@ -35,6 +35,7 @@ import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.NGuid; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.utils.log.Log; import org.ovirt.engine.core.utils.log.LogFactory; import org.ovirt.engine.core.utils.threadpool.ThreadPoolUtil; @@ -42,7 +43,7 @@ public class CommandCoordinatorImpl extends CommandCoordinator { -private static final String EXECUTION_CONTEXT_MAP_NAME = "executionContext"; + private static final String EXECUTION_CONTEXT_MAP_NAME = "executionContext"; private static final CommandCoordinatorImpl instance = new CommandCoordinatorImpl(); private static final Log log = LogFactory.getLog(CommandCoordinatorImpl.class); @@ -69,23 +70,29 @@ executionContextMap.put(stepId, context); } if (stepId != null) { - CommandEntity commandEntity = commandEntityDAO.get(stepId); - if (!actionType.equals(commandEntity.getActionType())) { - throw new RuntimeException("action types dont match"); - } else { - log.info("in CommandManager.endAction action types match " + actionType.toString()); - } - if (!parameters.equals(commandEntity.getParameters())) { - throw new RuntimeException("parameters dont match"); - } else { - log.info("in CommandManager.endAction parameters match " + parameters.toString()); - } + debugCommandEntity(commandEntityDAO.get(stepId), actionType, parameters); } CommandBase<?> command = CommandsFactory.getInstance().CreateCommand(actionType, parameters); command.setContext(new CommandContext(context)); return new DecoratedCommand(command, dbAsyncTask).endAction(); } finally { commandEntityDAO.remove(stepId); + } + } + + private void debugCommandEntity(CommandEntity commandEntity, VdcActionType actionType, VdcActionParametersBase parameters) { + if (commandEntity == null) { + return; + } + if (!actionType.equals(commandEntity.getActionType())) { + throw new RuntimeException("action types dont match"); + } else { + log.info("in CommandManager.endAction action types match " + actionType.toString()); + } + if (!parameters.equals(commandEntity.getParameters())) { + throw new RuntimeException("parameters dont match"); + } else { + log.info("in CommandManager.endAction parameters match " + parameters.toString()); } } @@ -131,6 +138,28 @@ return executionContextMap.containsKey(stepId); } + public Guid createAsyncTask( + CommandBase command, + VdcActionType parentCommand, + VdcObjectType entityType, + Guid... entityIds) { + Guid retValue = Guid.Empty; + + Transaction transaction = TransactionSupport.suspend(); + + try { + AsyncTasks task = createAsyncTask(command, new AsyncTaskCreationInfo(), parentCommand); + retValue = task.getTaskId(); + AsyncTaskUtils.addOrUpdateTaskInDB(task, entityType, entityIds); + } catch (RuntimeException ex) { + log.errorFormat("Error during createAsyncTask for command: {0}. Exception {1}", this.getClass().getName(), ex); + } finally { + TransactionSupport.resume(transaction); + } + + return retValue; + } + /** * Use this method in order to create task in the AsyncTaskManager in a safe * way. If you use this method within a certain command, make sure that the @@ -146,6 +175,7 @@ * @return Guid of the created task. */ public Guid createTask( + Guid taskId, CommandBase command, AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType parentCommand, @@ -162,7 +192,7 @@ if (taskStep != null) { asyncTaskCreationInfo.setStepId(taskStep.getId()); } - SPMAsyncTask task = concreteCreateTask(command, asyncTaskCreationInfo, parentCommand); + SPMAsyncTask task = concreteCreateTask(taskId, command, asyncTaskCreationInfo, parentCommand); retValue = task.getVdsmTaskId(); task.setEntityType(entityType); task.setAssociatedEntities(entityIds); @@ -192,16 +222,46 @@ * @return An {@link SPMAsyncTask} object representing the task to be run */ public SPMAsyncTask concreteCreateTask( + Guid taskId, CommandBase command, AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType parentCommand) { + AsyncTaskParameters p = + new AsyncTaskParameters(asyncTaskCreationInfo, + getAsyncTask(taskId, command, asyncTaskCreationInfo, parentCommand)); + p.setEntityId(command.getParameters().getEntityId()); + return CreateTask(internalGetTaskType(command), p); + } + private AsyncTasks getAsyncTask( + Guid taskId, + CommandBase command, + AsyncTaskCreationInfo asyncTaskCreationInfo, + VdcActionType parentCommand) { + AsyncTasks asyncTask = null; + if (!taskId.equals(Guid.Empty)) { + asyncTask = DbFacade.getInstance().getAsyncTaskDao().get(taskId); + } + if (asyncTask != null) { + asyncTask.setVdsmTaskId(asyncTaskCreationInfo.getVdsmTaskId()); + asyncTask.setStepId(asyncTaskCreationInfo.getStepId()); + asyncTask.setStoragePoolId(asyncTaskCreationInfo.getStoragePoolID()); + asyncTask.setTaskType(asyncTaskCreationInfo.getTaskType()); + } else { + asyncTask = createAsyncTask(command, asyncTaskCreationInfo, parentCommand); + } + return asyncTask; + } + + private AsyncTasks createAsyncTask( + CommandBase command, + AsyncTaskCreationInfo asyncTaskCreationInfo, + VdcActionType parentCommand) { VdcActionParametersBase parentParameters = command.getParametersForTask(parentCommand, command.getParameters()); if (parentParameters.getParametersCurrentUser() == null && command.getCurrentUser() != null) { parentParameters.setParametersCurrentUser(command.getCurrentUser()); } - AsyncTaskParameters p = - new AsyncTaskParameters(asyncTaskCreationInfo, new AsyncTasks(parentCommand, + return new AsyncTasks(parentCommand, AsyncTaskResultEnum.success, AsyncTaskStatusEnum.running, asyncTaskCreationInfo.getVdsmTaskId(), @@ -209,9 +269,7 @@ command.getParameters(), asyncTaskCreationInfo.getStepId(), command.getCommandId(), asyncTaskCreationInfo.getStoragePoolID(), - asyncTaskCreationInfo.getTaskType())); - p.setEntityId(command.getParameters().getEntityId()); - return CreateTask(internalGetTaskType(command), p); + asyncTaskCreationInfo.getTaskType()); } public SPMAsyncTask CreateTask(AsyncTaskType taskType, AsyncTaskParameters taskParameters) { @@ -309,15 +367,13 @@ private AsyncTaskManager getAsyncTaskManager() { return AsyncTaskManager.getInstance(this); } - private final Map<Object, EntityMultiAsyncTasks> multiTasksByEntities = new HashMap<Object, EntityMultiAsyncTasks>(); - private static final Object _lockObject = new Object(); @Override public boolean buildEntityMultiAsyncTasksIfNotExists(Object containerId) { - synchronized(_lockObject) { + synchronized (_lockObject) { if (!multiTasksByEntities.containsKey(containerId)) { multiTasksByEntities.put(containerId, new EntityMultiAsyncTasks(containerId)); return true; @@ -328,14 +384,14 @@ @Override public EntityMultiAsyncTasks getEntityMultiAsyncTasks(Object containerId) { - synchronized(_lockObject) { + synchronized (_lockObject) { return multiTasksByEntities.get(containerId); } } @Override public void removeEntityMultiAsyncTasks(Object containerId) { - synchronized(_lockObject) { + synchronized (_lockObject) { multiTasksByEntities.remove(containerId); } } @@ -406,6 +462,7 @@ new SPMTaskGuidBaseVDSCommandParameters(storagePoolID, taskID)).getReturnValue(); return (AsyncTaskStatus) ((tempVar instanceof AsyncTaskStatus) ? tempVar : null); } + @Override public Map<Guid, AsyncTaskStatus> getAllTasksStatuses(Guid storagePoolID) { return (Map<Guid, AsyncTaskStatus>) runVdsCommand(VDSCommandType.SPMGetAllTasksStatuses, @@ -415,5 +472,4 @@ private BackendInternal getBackend() { return Backend.getInstance(); } - } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskHandlerCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskHandlerCommand.java index 98974e9..3f2fdb8 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskHandlerCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskHandlerCommand.java @@ -20,9 +20,14 @@ void setExecutionContext(ExecutionContext executionContext); - Guid createTask(AsyncTaskCreationInfo asyncTaskCreationInfo, + Guid createTask(Guid taskId, + AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType parentCommand, VdcObjectType entityType, Guid... entityIds); + Guid createAsyncTask( + VdcActionType parentCommand, + VdcObjectType entityType, + Guid... entityIds); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskManagerUtil.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskManagerUtil.java index 18e64fa..0491f54 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskManagerUtil.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskManagerUtil.java @@ -44,12 +44,23 @@ return getAsyncTaskManager().pollTasks(taskIdList); } + public static Guid createAsyncTask( + CommandBase command, + VdcActionType parentCommand, + VdcObjectType entityType, + Guid... entityIds) { + return CommandCoordinatorImpl.getInstance().createAsyncTask(command, parentCommand, entityType, entityIds); + } + public static Guid createTask( + Guid taskId, CommandBase command, AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType parentCommand, String description, VdcObjectType entityType, Guid... entityIds) { - return CommandCoordinatorImpl.getInstance().createTask(command, + return CommandCoordinatorImpl.getInstance().createTask( + taskId, + command, asyncTaskCreationInfo, parentCommand, description, @@ -58,10 +69,13 @@ } public static SPMTask concreteCreateTask( + Guid taskId, CommandBase command, AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType parentCommand) { - return CommandCoordinatorImpl.getInstance().concreteCreateTask(command, + return CommandCoordinatorImpl.getInstance().concreteCreateTask( + taskId, + command, asyncTaskCreationInfo, parentCommand); } diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/BackwardCompatibilityTaskCreationTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/BackwardCompatibilityTaskCreationTest.java index 79841c7..8b6e9011 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/BackwardCompatibilityTaskCreationTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/BackwardCompatibilityTaskCreationTest.java @@ -158,7 +158,7 @@ AsyncTaskCreationInfo info = nextAsyncTaskCreationInfo(); - SPMTask spmAsyncTask = cmd.concreteCreateTask(info, cmd.getParameters().getParentCommand()); + SPMTask spmAsyncTask = cmd.concreteCreateTask(Guid.Empty, info, cmd.getParameters().getParentCommand()); assertEquals("wrong storage pool ID", info.getStoragePoolID(), spmAsyncTask.getStoragePoolID()); assertEquals("wrong task ID", info.getVdsmTaskId(), spmAsyncTask.getVdsmTaskId()); assertEquals("wrong task result", AsyncTaskResultEnum.success, spmAsyncTask.getLastTaskStatus().getResult()); @@ -180,7 +180,7 @@ PermissionsOperationsParametes params = new PermissionsOperationsParametes(); AddPermissionCommand<PermissionsOperationsParametes> cmd = spy( new AddPermissionCommand<PermissionsOperationsParametes>(params)); - cmd.concreteCreateTask(nextAsyncTaskCreationInfo(), VdcActionType.Unknown); + cmd.concreteCreateTask(Guid.Empty, nextAsyncTaskCreationInfo(), VdcActionType.Unknown); } /** @return A randomly generated {@link AsyncTaskCreationInfo} object */ diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskCreationInfo.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskCreationInfo.java index 4a214ce..cc750ea 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskCreationInfo.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskCreationInfo.java @@ -17,8 +17,8 @@ public AsyncTaskCreationInfo() { } - public AsyncTaskCreationInfo(Guid taskID, AsyncTaskType taskType, Guid storagePoolID) { - setVdsmTaskId(taskID); + public AsyncTaskCreationInfo(Guid vdsmTaskID, AsyncTaskType taskType, Guid storagePoolID) { + setVdsmTaskId(vdsmTaskID); setTaskType(taskType); setStoragePoolID(storagePoolID); } -- To view, visit http://gerrit.ovirt.org/14078 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ibc5a548cb53172e6399f4334f24163dd855291ab Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Ravi Nori <rn...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches