Ravi Nori has uploaded a new change for review. Change subject: engine : Introduction of DecoratedCommand ......................................................................
engine : Introduction of DecoratedCommand This patch introduces the DecoratedCommand class that intercepts calls to endAction and calls handleEndActionResult Change-Id: I0ffe9899c324110502319078cf5fe16f3a4b8c11 Signed-off-by: Ravi Nori <[email protected]> --- 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/tasks/CommandAsyncTask.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/DecoratedCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CallBack.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/Command.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/Poller.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/TaskHelper.java 8 files changed, 127 insertions(+), 23 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/36/26336/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 b2de356..83a19ea 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 @@ -37,6 +37,7 @@ import org.ovirt.engine.core.bll.session.SessionDataContainer; import org.ovirt.engine.core.bll.tasks.SPMAsyncTaskHandler; import org.ovirt.engine.core.bll.tasks.TaskManagerUtil; +import org.ovirt.engine.core.bll.tasks.interfaces.Command; import org.ovirt.engine.core.bll.tasks.interfaces.SPMTask; import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.common.AuditLogType; @@ -94,7 +95,7 @@ import org.springframework.dao.DataAccessException; public abstract class CommandBase<T extends VdcActionParametersBase> extends AuditLogableBase implements - RollbackHandler, TransactionMethod<Object> { + RollbackHandler, TransactionMethod<Object>, Command<T> { /* Multiplier used to convert GB to bytes or vice versa. */ protected static final long BYTES_IN_GB = 1024 * 1024 * 1024; diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandAsyncTask.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandAsyncTask.java index 97c5839..682145b 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandAsyncTask.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandAsyncTask.java @@ -31,7 +31,7 @@ private static final Map<Guid, CommandMultiAsyncTasks> _multiTasksByCommandIds = new HashMap<Guid, CommandMultiAsyncTasks>(); - private CommandMultiAsyncTasks GetCommandMultiAsyncTasks() { + public CommandMultiAsyncTasks GetCommandMultiAsyncTasks() { CommandMultiAsyncTasks entityInfo = null; synchronized (_lockObject) { entityInfo = _multiTasksByCommandIds.get(getCommandId()); @@ -115,7 +115,6 @@ private void EndCommandAction() { CommandMultiAsyncTasks entityInfo = GetCommandMultiAsyncTasks(); VdcReturnValueBase vdcReturnValue = null; - ExecutionContext context = null; boolean endActionRuntimeException = false; AsyncTasks dbAsyncTask = getParameters().getDbAsyncTask(); @@ -139,15 +138,7 @@ dbAsyncTask.getActionParameters().getExecutionIndex()); try { - /** - * Creates context for the job which monitors the action - */ - Guid stepId = dbAsyncTask.getStepId(); - if (stepId != null) { - context = ExecutionHandler.createFinalizingContext(stepId); - } - - vdcReturnValue = coco.endAction(stepId, getEndActionType(dbAsyncTask), dbAsyncTask, context); + vdcReturnValue = coco.endAction(this); } catch (VdcBLLException ex) { log.error(getErrorMessage()); @@ -172,7 +163,7 @@ handleEndActionRuntimeException(entityInfo, dbAsyncTask); } else { boolean isTaskGroupSuccess = dbAsyncTask.getActionParameters().getTaskGroupSuccess(); - handleEndActionResult(entityInfo, vdcReturnValue, context, isTaskGroupSuccess); + handleEndActionResult(entityInfo, vdcReturnValue, coco.getExecutionContext(dbAsyncTask.getStepId()), isTaskGroupSuccess); } } } 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 9032f64..e2ef9b9 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 @@ -39,6 +39,7 @@ public class CommandCoordinatorImpl extends CommandCoordinator { + private static final String EXECUTION_CONTEXT_MAP_NAME = "executionContext"; private static final CommandCoordinatorImpl instance = new CommandCoordinatorImpl(); private static final Log log = LogFactory.getLog(CommandCoordinator.class); private CommandsCache commandsCache = new CommandsCacheImpl(); @@ -47,7 +48,10 @@ return instance; } + CacheWrapper<Guid, ExecutionContext> executionContextMap; + private CommandCoordinatorImpl() { + executionContextMap = CacheProviderFactory.<Guid, ExecutionContext>getCacheWrapper(EXECUTION_CONTEXT_MAP_NAME); } public Step addTaskStep(ExecutionContext context, StepEnum stepName, String description) { @@ -291,6 +295,71 @@ } } + public VdcReturnValueBase endAction(SPMTask task) { + AsyncTasks dbAsyncTask = task.getParameters().getDbAsyncTask(); + Guid stepId = dbAsyncTask.getStepId(); + VdcActionType actionType = getEndActionType(dbAsyncTask); + Guid commandId = dbAsyncTask.getActionParameters().getCommandId(); + VdcActionParametersBase parameters = dbAsyncTask.getActionParameters(); + try { + ExecutionContext context = null; + if (stepId != null) { + context = createFinalizingContext(stepId); + executionContextMap.put(stepId, context); + CommandEntity commandEntity = commandsCache.get(commandId); + if (!actionType.equals(commandEntity.getCommandType())) { + throw new RuntimeException("action types don't match"); + } else { + log.info("in CommandManager.endAction action types match " + actionType.toString()); + } + if (!parameters.equals(commandEntity.getCommandType())) { + throw new RuntimeException("parameters dont match"); + } else { + log.info("in CommandManager.endAction parameters match " + parameters.toString()); + } + } + CommandBase<?> command = CommandsFactory.getInstance().createCommand(actionType, parameters); + command.setContext(new CommandContext(context)); + return new DecoratedCommand(this, command, (CommandAsyncTask) task).endAction(); + } finally { + commandsCache.remove(commandId); + } + } + + private VdcActionType getEndActionType(AsyncTasks dbAsyncTask) { + VdcActionType commandType = dbAsyncTask.getActionParameters().getCommandType(); + if (!VdcActionType.Unknown.equals(commandType)) { + return commandType; + } + return dbAsyncTask.getaction_type(); + } + + @Override + public void endTaskJob(Guid stepId, boolean exitStatus) { + if (stepId != null) { + ExecutionContext context = executionContextMap.get(stepId); + ExecutionHandler.getInstance().endTaskJob(context, exitStatus); + executionContextMap.remove(stepId); + } + } + + public ExecutionContext createFinalizingContext(Guid stepId) { + return ExecutionHandler.getInstance().createFinalizingContext(stepId); + } + + @Override + public ExecutionContext getExecutionContext(Guid stepId) { + return executionContextMap.get(stepId); + } + + @Override + public boolean taskHasContext(Guid stepId) { + if (stepId == null) { + return false; + } + return executionContextMap.containsKey(stepId); + } + private AsyncTaskManager getAsyncTaskManager() { return AsyncTaskManager.getInstance(this); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/DecoratedCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/DecoratedCommand.java new file mode 100644 index 0000000..0cd3103 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/DecoratedCommand.java @@ -0,0 +1,31 @@ +package org.ovirt.engine.core.bll.tasks; + +import org.ovirt.engine.core.bll.tasks.interfaces.Command; +import org.ovirt.engine.core.bll.tasks.interfaces.CommandCoordinator; +import org.ovirt.engine.core.common.action.VdcActionParametersBase; +import org.ovirt.engine.core.common.action.VdcReturnValueBase; + +public class DecoratedCommand<T extends VdcActionParametersBase> implements Command<T> { + + private CommandCoordinator coco; + private Command<T> innerCommand; + private CommandAsyncTask task; + + public DecoratedCommand(CommandCoordinator coco, + Command<T> innerCommand, + CommandAsyncTask task) { + this.coco = coco; + this.innerCommand = innerCommand; + this.task = task; + } + + @Override + public VdcReturnValueBase endAction() { + return innerCommand.endAction(); + } + + @Override + public T getParameters() { + return innerCommand.getParameters(); + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CallBack.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CallBack.java index 808bf56..1f4a66d 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CallBack.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CallBack.java @@ -8,4 +8,5 @@ public interface CallBack { public VdcReturnValueBase endAction(Guid stepId, VdcActionType actionType, AsyncTasks dbAsyncTask, ExecutionContext context); + public VdcReturnValueBase endAction(SPMTask task); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/Command.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/Command.java new file mode 100644 index 0000000..fde2de1 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/Command.java @@ -0,0 +1,9 @@ +package org.ovirt.engine.core.bll.tasks.interfaces; + +import org.ovirt.engine.core.common.action.VdcActionParametersBase; +import org.ovirt.engine.core.common.action.VdcReturnValueBase; + +public interface Command<T extends VdcActionParametersBase> { + VdcReturnValueBase endAction(); + T getParameters(); +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/Poller.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/Poller.java index 32c7b2d..9e6e73c 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/Poller.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/Poller.java @@ -1,9 +1,15 @@ package org.ovirt.engine.core.bll.tasks.interfaces; +import java.util.ArrayList; import java.util.Map; + +import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo; import org.ovirt.engine.core.common.businessentities.AsyncTaskStatus; import org.ovirt.engine.core.compat.Guid; public interface Poller { + Map<Guid, AsyncTaskStatus> getAllTasksStatuses(Guid storagePoolID); + ArrayList<AsyncTaskCreationInfo> getAllTasksInfo(Guid storagePoolID); + } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/TaskHelper.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/TaskHelper.java index 309083d..9a393cc 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/TaskHelper.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/TaskHelper.java @@ -1,16 +1,10 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ package org.ovirt.engine.core.bll.tasks.interfaces; -import java.util.ArrayList; -import java.util.Map; +import org.ovirt.engine.core.bll.job.ExecutionContext; 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.AsyncTaskStatus; import org.ovirt.engine.core.common.businessentities.AsyncTasks; import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.compat.Guid; @@ -22,12 +16,14 @@ */ public interface TaskHelper { - ArrayList<AsyncTaskCreationInfo> getAllTasksInfo(Guid storagePoolID); - - Map<Guid, AsyncTaskStatus> getAllTasksStatuses(Guid storagePoolID); + public void endTaskJob(Guid stepId, boolean exitStatus); void stopTask(Guid storagePoolID, Guid vdsmTaskID); + public boolean taskHasContext(Guid stepId); + + public ExecutionContext getExecutionContext(Guid stepId); + public VDSReturnValue clearTask(Guid storagePoolID, Guid vdsmTaskID); public SPMTask construct(AsyncTaskCreationInfo creationInfo); -- To view, visit http://gerrit.ovirt.org/26336 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I0ffe9899c324110502319078cf5fe16f3a4b8c11 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Ravi Nori <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
