Ravi Nori has uploaded a new change for review. Change subject: engine : Tunnel calls to AsyncTaskManager and introduce CoCo ......................................................................
engine : Tunnel calls to AsyncTaskManager and introduce CoCo All calls to AsyncTaskManager are made through TaskManagerUtil. This lets us move the code around without effecting other classes. CreateTask, CreateConcreteTask, CancelTask and RevertTask have been moved to CommandCoordinator, a new class. Which just has these four functions for now. Change-Id: Id5c2ff682dad2a33bc56409bb6c5c968936ebae5 Signed-off-by: Ravi Nori <rn...@redhat.com> --- 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/CreateSnapshotCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetTasksStatusesByTasksIDsQuery.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/InitBackendServicesOnStartupBean.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmFromImportExportCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsEventListener.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/memory/MemoryImageRemover.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinator.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskManagerUtil.java 13 files changed, 350 insertions(+), 144 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/74/26274/1 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 6f0425e..58ca7ae 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 @@ -1,8 +1,6 @@ package org.ovirt.engine.core.bll; import org.ovirt.engine.core.bll.tasks.SPMAsyncTask; -import org.ovirt.engine.core.bll.tasks.AsyncTaskManager; -import org.ovirt.engine.core.bll.tasks.AsyncTaskFactory; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; @@ -38,8 +36,8 @@ import org.ovirt.engine.core.bll.quota.QuotaStorageDependent; import org.ovirt.engine.core.bll.quota.QuotaVdsDependent; import org.ovirt.engine.core.bll.session.SessionDataContainer; -import org.ovirt.engine.core.bll.tasks.AsyncTaskUtils; import org.ovirt.engine.core.bll.tasks.SPMAsyncTaskHandler; +import org.ovirt.engine.core.bll.tasks.TaskManagerUtil; import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.VdcObjectType; @@ -48,13 +46,9 @@ import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VdcReturnValueBase; import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo; -import org.ovirt.engine.core.common.asynctasks.AsyncTaskParameters; import org.ovirt.engine.core.common.asynctasks.AsyncTaskType; import org.ovirt.engine.core.common.businessentities.ActionGroup; import org.ovirt.engine.core.common.businessentities.ActionVersionMap; -import org.ovirt.engine.core.common.businessentities.AsyncTaskResultEnum; -import org.ovirt.engine.core.common.businessentities.AsyncTaskStatus; -import org.ovirt.engine.core.common.businessentities.AsyncTaskStatusEnum; import org.ovirt.engine.core.common.businessentities.AsyncTasks; import org.ovirt.engine.core.common.businessentities.BusinessEntity; import org.ovirt.engine.core.common.businessentities.BusinessEntitySnapshot; @@ -67,12 +61,10 @@ import org.ovirt.engine.core.common.errors.VdcBllErrors; import org.ovirt.engine.core.common.errors.VdcBllMessages; import org.ovirt.engine.core.common.errors.VdcFault; -import org.ovirt.engine.core.common.job.ExternalSystemType; import org.ovirt.engine.core.common.job.Step; import org.ovirt.engine.core.common.job.StepEnum; import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.common.utils.ValidationUtils; -import org.ovirt.engine.core.common.vdscommands.SPMTaskGuidBaseVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.common.vdscommands.VDSParametersBase; import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; @@ -96,7 +88,6 @@ import org.ovirt.engine.core.utils.lock.LockManagerFactory; import org.ovirt.engine.core.utils.log.Log; import org.ovirt.engine.core.utils.log.LogFactory; -import org.ovirt.engine.core.utils.threadpool.ThreadPoolUtil; import org.ovirt.engine.core.utils.transaction.RollbackHandler; import org.ovirt.engine.core.utils.transaction.TransactionMethod; import org.ovirt.engine.core.utils.transaction.TransactionSupport; @@ -372,7 +363,7 @@ for (Guid asyncTaskId : getReturnValue().getTaskPlaceHolderIdList()) { AsyncTasks task = getAsyncTaskDao().get(asyncTaskId); if (task != null && Guid.isNullOrEmpty(task.getVdsmTaskId())) { - AsyncTaskManager.removeTaskFromDbByTaskId(task.getTaskId()); + TaskManagerUtil.removeTaskFromDbByTaskId(task.getTaskId()); } } @@ -1259,7 +1250,7 @@ } } - private boolean hasTasks() { + public boolean hasTasks() { return !getReturnValue().getVdsmTaskIdList().isEmpty(); } @@ -1369,8 +1360,6 @@ return persistAsyncTaskPlaceHolder(parentCommand, DEFAULT_TASK_KEY); } - - public Guid persistAsyncTaskPlaceHolder(VdcActionType parentCommand, final String taskKey) { if (taskKeyToTaskIdMap.containsKey(taskKey)) { return taskKeyToTaskIdMap.get(taskKey); @@ -1421,7 +1410,7 @@ public void deleteAsyncTaskPlaceHolder(String taskKey) { Guid taskId = taskKeyToTaskIdMap.remove(taskKey); if (!Guid.isNullOrEmpty(taskId)) { - AsyncTaskManager.removeTaskFromDbByTaskId(taskId); + TaskManagerUtil.removeTaskFromDbByTaskId(taskId); } } @@ -1436,11 +1425,11 @@ return taskKeyToTaskIdMap.get(taskKey); } /** - * Use this method in order to create task in the AsyncTaskManager in a safe way. If you use this method within a + * Use this method in order to create task in the TaskManagerUtil in a safe way. If you use this method within a * certain command, make sure that the command implemented the ConcreteCreateTask method. * * @param asyncTaskCreationInfo - * info to send to AsyncTaskManager when creating the task. + * info to send to TaskManagerUtil when creating the task. * @param parentCommand * VdcActionType of the command that its endAction we want to invoke when tasks are finished. * @param entityType @@ -1476,11 +1465,11 @@ } /** - * Use this method in order to create task in the AsyncTaskManager in a safe way. If you use this method within a + * Use this method in order to create task in the TaskManagerUtil in a safe way. If you use this method within a * certain command, make sure that the command implemented the ConcreteCreateTask method. * * @param asyncTaskCreationInfo - * info to send to AsyncTaskManager when creating the task. + * info to send to TaskManagerUtil when creating the task. * @param parentCommand * VdcActionType of the command that its endAction we want to invoke when tasks are finished. * @param entityType @@ -1520,11 +1509,11 @@ } /** - * Use this method in order to create task in the AsyncTaskManager in a safe way. If you use this method within a + * Use this method in order to create task in the TaskManagerUtil in a safe way. If you use this method within a * certain command, make sure that the command implemented the ConcreteCreateTask method. * * @param asyncTaskCreationInfo - * info to send to AsyncTaskManager when creating the task. + * info to send to TaskManagerUtil when creating the task. * @param parentCommand * VdcActionType of the command that its endAction we want to invoke when tasks are finished. * @param description @@ -1557,33 +1546,19 @@ createEntitiesMapForSingleEntityType(entityType, entityIds)); } - private Guid createTaskImpl(Guid taskId, - AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType parentCommand, - String description, - Map<Guid, VdcObjectType> entitiesMap) { - Step taskStep = - ExecutionHandler.addTaskStep(getExecutionContext(), - StepEnum.getStepNameByTaskType(asyncTaskCreationInfo.getTaskType()), - description); - if (taskStep != null) { - asyncTaskCreationInfo.setStepId(taskStep.getId()); - } - SPMAsyncTask task = concreteCreateTask(taskId, asyncTaskCreationInfo, parentCommand); - task.setEntitiesMap(entitiesMap); - AsyncTaskUtils.addOrUpdateTaskInDB(task); - getAsyncTaskManager().lockAndAddTaskToManager(task); - Guid vdsmTaskId = task.getVdsmTaskId(); - ExecutionHandler.updateStepExternalId(taskStep, vdsmTaskId, ExternalSystemType.VDSM); - return vdsmTaskId; - - } - private Map<Guid, VdcObjectType> createEntitiesMapForSingleEntityType(VdcObjectType entityType, Guid... entityIds) { Map<Guid, VdcObjectType> entitiesMap = new HashMap<Guid, VdcObjectType>(); for (Guid entityId : entityIds) { entitiesMap.put(entityId, entityType); } return entitiesMap; + } + + private Guid createTaskImpl(Guid taskId, + AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType parentCommand, + String description, + Map<Guid, VdcObjectType> entitiesMap) { + return TaskManagerUtil.createTask(taskId, this, asyncTaskCreationInfo, parentCommand, description, entitiesMap); } /** @@ -1597,43 +1572,17 @@ Guid taskId, AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType parentCommand) { - AsyncTaskParameters p = - new AsyncTaskParameters(asyncTaskCreationInfo, - getAsyncTask(taskId, asyncTaskCreationInfo, parentCommand)); - p.setEntityInfo(getParameters().getEntityInfo()); - return createTask(internalGetTaskType(), p); - } - - public SPMAsyncTask createTask(AsyncTaskType taskType, AsyncTaskParameters taskParameters) { - return AsyncTaskFactory.construct(taskType, taskParameters, false); + return TaskManagerUtil.concreteCreateTask(taskId, this, asyncTaskCreationInfo, parentCommand); } private AsyncTasks getAsyncTask( Guid taskId, AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType parentCommand) { - AsyncTasks asyncTask = null; - if (!taskId.equals(Guid.Empty)) { - asyncTask = DbFacade.getInstance().getAsyncTaskDao().get(taskId); - } - if (asyncTask != null) { - VdcActionParametersBase parentParameters = getParentParameters(parentCommand); - asyncTask.setaction_type(parentCommand); - asyncTask.setVdsmTaskId(asyncTaskCreationInfo.getVdsmTaskId()); - asyncTask.setActionParameters(parentParameters); - asyncTask.setTaskParameters(getParameters()); - asyncTask.setStepId(asyncTaskCreationInfo.getStepId()); - asyncTask.setCommandId(getCommandId()); - asyncTask.setRootCommandId(parentParameters.getCommandId()); - asyncTask.setStoragePoolId(asyncTaskCreationInfo.getStoragePoolID()); - asyncTask.setTaskType(asyncTaskCreationInfo.getTaskType()); - } else { - asyncTask = createAsyncTask(asyncTaskCreationInfo, parentCommand); - } - return asyncTask; + return TaskManagerUtil.getAsyncTask(taskId, this, asyncTaskCreationInfo, parentCommand); } - private VdcActionParametersBase getParentParameters(VdcActionType parentCommand) { + public VdcActionParametersBase getParentParameters(VdcActionType parentCommand) { VdcActionParametersBase parentParameters = getParametersForTask(parentCommand, getParameters()); if (parentParameters.getParametersCurrentUser() == null && getCurrentUser() != null) { parentParameters.setParametersCurrentUser(getCurrentUser()); @@ -1644,22 +1593,11 @@ private AsyncTasks createAsyncTask( AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType parentCommand) { - VdcActionParametersBase parentParameters = getParentParameters(parentCommand); - return new AsyncTasks(parentCommand, - AsyncTaskResultEnum.success, - AsyncTaskStatusEnum.running, - asyncTaskCreationInfo.getVdsmTaskId(), - parentParameters, - getParameters(), - asyncTaskCreationInfo.getStepId(), - getCommandId(), - parentParameters.getCommandId(), - asyncTaskCreationInfo.getStoragePoolID(), - asyncTaskCreationInfo.getTaskType()); + return TaskManagerUtil.createAsyncTask(this, asyncTaskCreationInfo, parentCommand); } /** @return The type of task that should be created for this command. Commands that do not create async tasks should throw a {@link UnsupportedOperationException} */ - private AsyncTaskType internalGetTaskType() { + public AsyncTaskType internalGetTaskType() { if (hasTaskHandlers()) { if (getParameters().getExecutionReason() == CommandExecutionReason.REGULAR_FLOW) { return getCurrentTaskHandler().getTaskType(); @@ -1676,7 +1614,7 @@ protected void startPollingAsyncTasks(Collection<Guid> taskIds) { for (Guid taskID : taskIds) { - getAsyncTaskManager().startPollingTask(taskID); + TaskManagerUtil.startPollingTask(taskID); } } @@ -1703,41 +1641,11 @@ } private void cancelTasks() { - if (hasTasks()) { - ThreadPoolUtil.execute(new Runnable() { - @Override - public void run() { - log.infoFormat("Rollback for command: {0}.", CommandBase.this.getClass().getName()); - try { - getAsyncTaskManager().cancelTasks(getReturnValue().getVdsmTaskIdList()); - } catch (Exception e) { - log.errorFormat("Failed to cancel tasks for command: {0}.", - CommandBase.this.getClass().getName()); - } - } - }); - } + TaskManagerUtil.cancelTasks(this); } protected void revertTasks() { - if (getParameters().getVdsmTaskIds() != null) { - // list to send to the pollTasks method - ArrayList<Guid> taskIdAsList = new ArrayList<Guid>(); - - for (Guid taskId : getParameters().getVdsmTaskIds()) { - taskIdAsList.add(taskId); - ArrayList<AsyncTaskStatus> tasksStatuses = getAsyncTaskManager().pollTasks( - taskIdAsList); - // call revert task only if ended successfully - if (tasksStatuses.get(0).getTaskEndedSuccessfully()) { - getBackend().getResourceManager().RunVdsCommand( - VDSCommandType.SPMRevertTask, - new SPMTaskGuidBaseVDSCommandParameters( - getStoragePool().getId(), taskId)); - } - taskIdAsList.clear(); - } - } + TaskManagerUtil.revertTasks(this); } protected EngineLock getLock() { @@ -2081,10 +1989,6 @@ protected QuotaManager getQuotaManager() { return QuotaManager.getInstance(); - } - - protected AsyncTaskManager getAsyncTaskManager() { - return AsyncTaskManager.getInstance(); } protected List<SPMAsyncTaskHandler> getTaskHandlers() { 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 9465637..dc2e542 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 @@ -4,7 +4,7 @@ import java.util.Arrays; import java.util.Date; -import org.ovirt.engine.core.bll.tasks.AsyncTaskManager; +import org.ovirt.engine.core.bll.tasks.TaskManagerUtil; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.ImagesActionsParametersBase; import org.ovirt.engine.core.common.action.ImagesContainterParametersBase; @@ -131,7 +131,7 @@ } } catch (Exception e) { log.errorFormat("Failed creating snapshot from image id -'{0}'", getImage().getImageId()); - AsyncTaskManager.logAndFailTaskOfCommandWithEmptyVdsmId(getAsyncTaskId(), + TaskManagerUtil.logAndFailTaskOfCommandWithEmptyVdsmId(getAsyncTaskId(), "Create snapshot failed at VDSM. DB task ID is " + getAsyncTaskId()); throw new VdcBLLException(VdcBllErrors.VolumeCreationError); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetTasksStatusesByTasksIDsQuery.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetTasksStatusesByTasksIDsQuery.java index 427e46e..beeaaea 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetTasksStatusesByTasksIDsQuery.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetTasksStatusesByTasksIDsQuery.java @@ -1,6 +1,6 @@ package org.ovirt.engine.core.bll; -import org.ovirt.engine.core.bll.tasks.AsyncTaskManager; +import org.ovirt.engine.core.bll.tasks.TaskManagerUtil; import org.ovirt.engine.core.common.queries.GetTasksStatusesByTasksIDsParameters; public class GetTasksStatusesByTasksIDsQuery<P extends GetTasksStatusesByTasksIDsParameters> @@ -11,6 +11,6 @@ @Override protected void executeQueryCommand() { - getQueryReturnValue().setReturnValue(AsyncTaskManager.getInstance().pollTasks(getParameters().getTasksIDs())); + getQueryReturnValue().setReturnValue(TaskManagerUtil.pollTasks(getParameters().getTasksIDs())); } } 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 50f648b..5edf6eb 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 @@ -5,7 +5,7 @@ import java.util.Map; import org.ovirt.engine.core.bll.memory.MemoryUtils; -import org.ovirt.engine.core.bll.tasks.AsyncTaskManager; +import org.ovirt.engine.core.bll.tasks.TaskManagerUtil; import org.ovirt.engine.core.bll.validator.LocalizedVmStatus; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.VdcObjectType; @@ -248,7 +248,7 @@ if (vmStatus != VMStatus.Up) { return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_VM_IS_NOT_UP); } - if (AsyncTaskManager.getInstance().entityHasTasks(getVmId())) { + if (TaskManagerUtil.entityHasTasks(getVmId())) { return failCanDoAction(VdcBllMessages.VM_CANNOT_SUSPENDE_HAS_RUNNING_TASKS); } // check if vm has stateless images in db in case vm was run once as stateless diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java index c850e28..b45d7d7 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java @@ -18,7 +18,7 @@ import org.ovirt.engine.core.bll.scheduling.MigrationHandler; import org.ovirt.engine.core.bll.scheduling.SchedulingManager; import org.ovirt.engine.core.bll.storage.StoragePoolStatusHandler; -import org.ovirt.engine.core.bll.tasks.AsyncTaskManager; +import org.ovirt.engine.core.bll.tasks.TaskManagerUtil; import org.ovirt.engine.core.common.action.MigrateVmParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.config.Config; @@ -60,7 +60,7 @@ ExtensionsManager.getInstance().dump(); AuthenticationProfileRepository.getInstance(); DbUserCacheManager.getInstance().init(); - AsyncTaskManager.getInstance().initAsyncTaskManager(); + TaskManagerUtil.initAsyncTaskManager(); ResourceManager.getInstance().init(); OvfDataUpdater.getInstance().initOvfDataUpdater(); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmCommand.java index 9ab201b..75e9e99 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmCommand.java @@ -1,6 +1,5 @@ package org.ovirt.engine.core.bll; -import org.ovirt.engine.core.bll.tasks.AsyncTaskManager; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -18,6 +17,7 @@ import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator; import org.ovirt.engine.core.bll.storage.StoragePoolValidator; import org.ovirt.engine.core.bll.tasks.TaskHandlerCommand; +import org.ovirt.engine.core.bll.tasks.TaskManagerUtil; import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.bll.validator.DiskImagesValidator; import org.ovirt.engine.core.bll.validator.MultipleStorageDomainsValidator; @@ -235,7 +235,7 @@ } // If it is force, we cannot remove if there are task - if (AsyncTaskManager.getInstance().hasTasksByStoragePoolId(getVm().getStoragePoolId())) { + if (TaskManagerUtil.hasTasksByStoragePoolId(getVm().getStoragePoolId())) { return failCanDoAction(VdcBllMessages.VM_CANNOT_REMOVE_HAS_RUNNING_TASKS); } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmFromImportExportCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmFromImportExportCommand.java index 4fbadf0..14f9d19 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmFromImportExportCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmFromImportExportCommand.java @@ -1,6 +1,5 @@ package org.ovirt.engine.core.bll; -import org.ovirt.engine.core.bll.tasks.AsyncTaskManager; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -9,6 +8,7 @@ import java.util.Map; import org.ovirt.engine.core.bll.memory.MemoryImageRemoverFromExportDomain; +import org.ovirt.engine.core.bll.tasks.TaskManagerUtil; import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.VdcObjectType; @@ -86,7 +86,7 @@ // not using getVm() since its overridden to get vm from export domain VM vm = getVmDAO().get(getVmId()); if (vm != null && vm.getStatus() == VMStatus.ImageLocked) { - if (AsyncTaskManager.getInstance().hasTasksForEntityIdAndAction(vm.getId(), VdcActionType.ExportVm)) { + if (TaskManagerUtil.hasTasksForEntityIdAndAction(vm.getId(), VdcActionType.ExportVm)) { return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_VM_DURING_EXPORT); } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java index dd34953..bbea855 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java @@ -16,7 +16,7 @@ import org.ovirt.engine.core.bll.scheduling.RunVmDelayer; import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator; import org.ovirt.engine.core.bll.storage.StorageHelperDirector; -import org.ovirt.engine.core.bll.tasks.AsyncTaskManager; +import org.ovirt.engine.core.bll.tasks.TaskManagerUtil; import org.ovirt.engine.core.common.action.RemoveVmHibernationVolumesParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VdcReturnValueBase; @@ -204,7 +204,7 @@ ExecutionHandler.createDefaultContexForTasks(getExecutionContext())); for (Guid taskId : vdcRetValue.getInternalVdsmTaskIdList()) { - AsyncTaskManager.getInstance().startPollingTask(taskId); + TaskManagerUtil.startPollingTask(taskId); } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsEventListener.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsEventListener.java index 4112f80..363a614 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsEventListener.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsEventListener.java @@ -16,7 +16,7 @@ import org.ovirt.engine.core.bll.job.ExecutionHandler; import org.ovirt.engine.core.bll.scheduling.SchedulingManager; import org.ovirt.engine.core.bll.storage.StoragePoolStatusHandler; -import org.ovirt.engine.core.bll.tasks.AsyncTaskManager; +import org.ovirt.engine.core.bll.tasks.TaskManagerUtil; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.AddVmFromScratchParameters; import org.ovirt.engine.core.common.action.FenceVdsActionParameters; @@ -283,7 +283,7 @@ @Override public void storagePoolUpEvent(StoragePool storagePool) { - AsyncTaskManager.getInstance().addStoragePoolExistingTasks(storagePool); + TaskManagerUtil.addStoragePoolExistingTasks(storagePool); } @Override 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 c12ebbb..e37ac7d 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 @@ -6,7 +6,7 @@ import org.ovirt.engine.core.bll.network.MacPoolManager; import org.ovirt.engine.core.bll.snapshots.SnapshotsManager; -import org.ovirt.engine.core.bll.tasks.AsyncTaskManager; +import org.ovirt.engine.core.bll.tasks.TaskManagerUtil; import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.common.FeatureSupported; import org.ovirt.engine.core.common.VdcObjectType; @@ -348,7 +348,7 @@ if (!vdsRetValue.getSucceeded()) { if (startPollingTasks) { - AsyncTaskManager.getInstance().startPollingTask(guid1); + TaskManagerUtil.startPollingTask(guid1); } return false; } @@ -357,8 +357,8 @@ getTaskIdList().add(guid2); if (startPollingTasks) { - AsyncTaskManager.getInstance().startPollingTask(guid1); - AsyncTaskManager.getInstance().startPollingTask(guid2); + TaskManagerUtil.startPollingTask(guid1); + TaskManagerUtil.startPollingTask(guid2); } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryImageRemover.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryImageRemover.java index eb9b4d5..e4bf159 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryImageRemover.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryImageRemover.java @@ -4,10 +4,10 @@ import java.util.List; import java.util.Set; -import org.ovirt.engine.core.bll.tasks.AsyncTaskManager; import org.ovirt.engine.core.bll.Backend; import org.ovirt.engine.core.bll.VmCommand; import org.ovirt.engine.core.bll.tasks.TaskHandlerCommand; +import org.ovirt.engine.core.bll.tasks.TaskManagerUtil; import org.ovirt.engine.core.common.businessentities.Disk; import org.ovirt.engine.core.common.errors.VDSError; import org.ovirt.engine.core.common.errors.VdcBLLException; @@ -96,11 +96,11 @@ if (startPollingTasks) { if (!Guid.Empty.equals(memoryImageRemovalTaskId)) { - AsyncTaskManager.getInstance().startPollingTask(memoryImageRemovalTaskId); + TaskManagerUtil.startPollingTask(memoryImageRemovalTaskId); } if (confImageRemovalTaskId != null && !Guid.Empty.equals(confImageRemovalTaskId)) { - AsyncTaskManager.getInstance().startPollingTask(confImageRemovalTaskId); + TaskManagerUtil.startPollingTask(confImageRemovalTaskId); } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinator.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinator.java new file mode 100644 index 0000000..ca5c384 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinator.java @@ -0,0 +1,192 @@ +package org.ovirt.engine.core.bll.tasks; + +import java.util.ArrayList; +import java.util.Map; +import org.ovirt.engine.core.bll.Backend; +import org.ovirt.engine.core.bll.CommandBase; +import org.ovirt.engine.core.bll.interfaces.BackendInternal; +import org.ovirt.engine.core.bll.job.ExecutionHandler; +import org.ovirt.engine.core.common.VdcObjectType; +import org.ovirt.engine.core.common.action.VdcActionParametersBase; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo; +import org.ovirt.engine.core.common.asynctasks.AsyncTaskParameters; +import org.ovirt.engine.core.common.asynctasks.AsyncTaskType; +import org.ovirt.engine.core.common.businessentities.AsyncTaskResultEnum; +import org.ovirt.engine.core.common.businessentities.AsyncTaskStatus; +import org.ovirt.engine.core.common.businessentities.AsyncTaskStatusEnum; +import org.ovirt.engine.core.common.businessentities.AsyncTasks; +import org.ovirt.engine.core.common.job.ExternalSystemType; +import org.ovirt.engine.core.common.job.Step; +import org.ovirt.engine.core.common.job.StepEnum; +import org.ovirt.engine.core.common.vdscommands.SPMTaskGuidBaseVDSCommandParameters; +import org.ovirt.engine.core.common.vdscommands.VDSCommandType; +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; +import org.ovirt.engine.core.utils.threadpool.ThreadPoolUtil; + +public class CommandCoordinator { + + private static final CommandCoordinator instance = new CommandCoordinator(); + private static final Log log = LogFactory.getLog(CommandCoordinator.class); + + public static CommandCoordinator getInstance() { + return instance; + } + + private CommandCoordinator() { + } + + /** + * 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. + * + * @param asyncTaskCreationInfo + * info to send to AsyncTaskManager when creating the task. + * @param parentCommand + * VdcActionType of the command that its EndAction we want to invoke when tasks are finished. + * @param entityType + * type of entities that are associated with the task + * @param entityIds + * Ids of entities to be associated with task + * @return Guid of the created task. + */ + public Guid createTask(Guid taskId, + CommandBase command, + AsyncTaskCreationInfo asyncTaskCreationInfo, + VdcActionType parentCommand, + String description, + Map<Guid, VdcObjectType> entitiesMap) { + Step taskStep = + ExecutionHandler.addTaskStep(command.getExecutionContext(), + StepEnum.getStepNameByTaskType(asyncTaskCreationInfo.getTaskType()), + description); + if (taskStep != null) { + asyncTaskCreationInfo.setStepId(taskStep.getId()); + } + SPMAsyncTask task = concreteCreateTask(taskId, command, asyncTaskCreationInfo, parentCommand); + task.setEntitiesMap(entitiesMap); + AsyncTaskUtils.addOrUpdateTaskInDB(task); + getAsyncTaskManager().lockAndAddTaskToManager(task); + Guid vdsmTaskId = task.getVdsmTaskId(); + ExecutionHandler.updateStepExternalId(taskStep, vdsmTaskId, ExternalSystemType.VDSM); + return vdsmTaskId; + + } + + /** + * Create the {@link SPMAsyncTask} object to be run + * @param taskId the id of the async task place holder in the database + * @param asyncTaskCreationInfo Info on how to create the task + * @param parentCommand The type of command issuing the task + * @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.setEntityInfo(command.getParameters().getEntityInfo()); + return createTask(command.internalGetTaskType(), p); + } + + public SPMAsyncTask createTask(AsyncTaskType taskType, AsyncTaskParameters taskParameters) { + return AsyncTaskFactory.construct(taskType, taskParameters, false); + } + + public 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) { + VdcActionParametersBase parentParameters = command.getParentParameters(parentCommand); + asyncTask.setaction_type(parentCommand); + asyncTask.setVdsmTaskId(asyncTaskCreationInfo.getVdsmTaskId()); + asyncTask.setActionParameters(parentParameters); + asyncTask.setTaskParameters(command.getParameters()); + asyncTask.setStepId(asyncTaskCreationInfo.getStepId()); + asyncTask.setCommandId(command.getCommandId()); + asyncTask.setRootCommandId(parentParameters.getCommandId()); + asyncTask.setStoragePoolId(asyncTaskCreationInfo.getStoragePoolID()); + asyncTask.setTaskType(asyncTaskCreationInfo.getTaskType()); + } else { + asyncTask = createAsyncTask(command, asyncTaskCreationInfo, parentCommand); + } + return asyncTask; + } + + public AsyncTasks createAsyncTask( + CommandBase command, + AsyncTaskCreationInfo asyncTaskCreationInfo, + VdcActionType parentCommand) { + VdcActionParametersBase parentParameters = command.getParentParameters(parentCommand); + return new AsyncTasks(parentCommand, + AsyncTaskResultEnum.success, + AsyncTaskStatusEnum.running, + asyncTaskCreationInfo.getVdsmTaskId(), + parentParameters, + command.getParameters(), + asyncTaskCreationInfo.getStepId(), + command.getCommandId(), + parentParameters.getCommandId(), + asyncTaskCreationInfo.getStoragePoolID(), + asyncTaskCreationInfo.getTaskType()); + } + + public void cancelTasks(final CommandBase command) { + if (command.hasTasks()) { + ThreadPoolUtil.execute(new Runnable() { + @Override + public void run() { + log.infoFormat("Rollback for command: {0}.", command.getClass().getName()); + try { + getAsyncTaskManager().cancelTasks(command.getReturnValue().getVdsmTaskIdList()); + } catch (Exception e) { + log.errorFormat("Failed to cancel tasks for command: {0}.", + command.getClass().getName()); + } + } + }); + } + } + + protected void revertTasks(CommandBase command) { + if (command.getParameters().getVdsmTaskIds() != null) { + // list to send to the pollTasks method + ArrayList<Guid> taskIdAsList = new ArrayList<Guid>(); + + for (Guid taskId : command.getParameters().getVdsmTaskIds()) { + taskIdAsList.add(taskId); + ArrayList<AsyncTaskStatus> tasksStatuses = getAsyncTaskManager().pollTasks( + taskIdAsList); + // call revert task only if ended successfully + if (tasksStatuses.get(0).getTaskEndedSuccessfully()) { + getBackend().getResourceManager().RunVdsCommand( + VDSCommandType.SPMRevertTask, + new SPMTaskGuidBaseVDSCommandParameters( + command.getStoragePool().getId(), taskId)); + } + taskIdAsList.clear(); + } + } + } + + private AsyncTaskManager getAsyncTaskManager() { + return AsyncTaskManager.getInstance(); + } + + protected BackendInternal getBackend() { + return Backend.getInstance(); + } + +} 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 new file mode 100644 index 0000000..07a6598 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskManagerUtil.java @@ -0,0 +1,110 @@ +package org.ovirt.engine.core.bll.tasks; + +import java.util.ArrayList; +import java.util.Map; + +import org.ovirt.engine.core.bll.CommandBase; +import org.ovirt.engine.core.common.VdcObjectType; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo; +import org.ovirt.engine.core.common.businessentities.AsyncTaskStatus; +import org.ovirt.engine.core.common.businessentities.AsyncTasks; +import org.ovirt.engine.core.common.businessentities.StoragePool; +import org.ovirt.engine.core.compat.Guid; + +public class TaskManagerUtil { + + public static void startPollingTask(Guid taskID) { + getAsyncTaskManager().startPollingTask(taskID); + } + + public static void addStoragePoolExistingTasks(StoragePool sp) { + getAsyncTaskManager().addStoragePoolExistingTasks(sp); + } + + public static boolean hasTasksForEntityIdAndAction(Guid id, VdcActionType type) { + return getAsyncTaskManager().hasTasksForEntityIdAndAction(id, type); + } + + public static boolean hasTasksByStoragePoolId(Guid storagePoolID) { + return getAsyncTaskManager().hasTasksByStoragePoolId(storagePoolID); + } + + public static void initAsyncTaskManager() { + getAsyncTaskManager().initAsyncTaskManager(); + } + + public static boolean entityHasTasks(Guid id) { + return getAsyncTaskManager().entityHasTasks(id); + } + + public static ArrayList<AsyncTaskStatus> pollTasks(java.util.ArrayList<Guid> taskIdList) { + return getAsyncTaskManager().pollTasks(taskIdList); + } + + public static Guid createTask( + Guid taskId, + CommandBase command, + AsyncTaskCreationInfo asyncTaskCreationInfo, + VdcActionType parentCommand, + String description, + Map<Guid, VdcObjectType> entitiesMap) { + return CommandCoordinator.getInstance().createTask(taskId, + command, + asyncTaskCreationInfo, + parentCommand, + description, + entitiesMap); + } + + public static SPMAsyncTask concreteCreateTask( + Guid taskId, + CommandBase command, + AsyncTaskCreationInfo asyncTaskCreationInfo, + VdcActionType parentCommand) { + return CommandCoordinator.getInstance().concreteCreateTask(taskId, + command, + asyncTaskCreationInfo, + parentCommand); + } + + public static void cancelTasks(final CommandBase command) { + CommandCoordinator.getInstance().cancelTasks(command); + } + + public static void revertTasks(final CommandBase command) { + CommandCoordinator.getInstance().revertTasks(command); + } + + public static AsyncTasks getAsyncTask( + Guid taskId, + CommandBase command, + AsyncTaskCreationInfo asyncTaskCreationInfo, + VdcActionType parentCommand) { + return CommandCoordinator.getInstance().getAsyncTask(taskId, command, asyncTaskCreationInfo, parentCommand); + } + + public static AsyncTasks createAsyncTask( + CommandBase command, + AsyncTaskCreationInfo asyncTaskCreationInfo, + VdcActionType parentCommand) { + return CommandCoordinator.getInstance().createAsyncTask(command, asyncTaskCreationInfo, parentCommand); + } + + public static void logAndFailTaskOfCommandWithEmptyVdsmId(Guid taskId, String message) { + AsyncTaskManager.logAndFailTaskOfCommandWithEmptyVdsmId(taskId, message); + } + + public static void logAndFailTaskOfCommandWithEmptyVdsmId(AsyncTasks task, String message) { + AsyncTaskManager.logAndFailTaskOfCommandWithEmptyVdsmId(task, message); + } + + public static void removeTaskFromDbByTaskId(Guid taskId) { + AsyncTaskManager.removeTaskFromDbByTaskId(taskId); + } + + private static AsyncTaskManager getAsyncTaskManager() { + return AsyncTaskManager.getInstance(); + } + +} -- To view, visit http://gerrit.ovirt.org/26274 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Id5c2ff682dad2a33bc56409bb6c5c968936ebae5 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