Ravi Nori has uploaded a new change for review. Change subject: engine : Introduction of CallBack interface ......................................................................
engine : Introduction of CallBack interface CallBack interface with endAction method has been introduced. This reduces the depency of AsyncTaskManager on bll. Change-Id: I0df6ec6d605ee667bdbc76b7a4e27bda6a7ba6e9 Signed-off-by: Ravi Nori <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandsFactory.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/job/ExecutionHandler.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/AsyncTaskManager.java R 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/EntityAsyncTask.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/SPMAsyncTask.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskManagerUtil.java A 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/CommandCoordinator.java 10 files changed, 107 insertions(+), 37 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/21/13821/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandsFactory.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandsFactory.java index 83322dc..8e15288 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandsFactory.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandsFactory.java @@ -36,6 +36,12 @@ private static ConcurrentMap<String, Class<CommandBase<? extends VdcActionParametersBase>>> commandsCache = new ConcurrentHashMap<String, Class<CommandBase<? extends VdcActionParametersBase>>>(VdcActionType.values().length); + private static CommandsFactory instance = new CommandsFactory(); + + public static CommandsFactory getInstance() { + return instance; + } + @SuppressWarnings("unchecked") public static <P extends VdcActionParametersBase> CommandBase<P> CreateCommand(VdcActionType action, P parameters) { try { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/job/ExecutionHandler.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/job/ExecutionHandler.java index 26847d5..9fdfcea 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/job/ExecutionHandler.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/job/ExecutionHandler.java @@ -50,6 +50,12 @@ private static final List<Class<?>> validationGroups = Arrays.asList(new Class<?>[] { PreRun.class }); + private static final ExecutionHandler instance = new ExecutionHandler(); + + public static ExecutionHandler getInstance() { + return instance; + } + /** * Creates and returns an instance of {@link Job} entity. * 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 b65e160..27247d3 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 @@ -1,5 +1,6 @@ package org.ovirt.engine.core.bll.tasks; +import org.ovirt.engine.core.bll.tasks.interfaces.CommandCoordinator; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo; @@ -27,7 +28,7 @@ * the info by which we construct the task. * @return */ - public static SPMAsyncTask Construct(AsyncTaskCreationInfo creationInfo) { + public static SPMAsyncTask Construct(CommandCoordinator coco, AsyncTaskCreationInfo creationInfo) { AsyncTasks asyncTask = DbFacade.getInstance().getAsyncTaskDao().get(creationInfo.getTaskID()); if (asyncTask == null || asyncTask.getActionParameters() == null) { asyncTask = @@ -44,7 +45,7 @@ creationInfo.setTaskType(AsyncTaskType.unknown); } AsyncTaskParameters asyncTaskParams = new AsyncTaskParameters(creationInfo, asyncTask); - return Construct(creationInfo.getTaskType(), asyncTaskParams, true); + return Construct(coco, creationInfo.getTaskType(), asyncTaskParams, true); } /** @@ -60,13 +61,13 @@ * the parameters by which we construct the task. * @return */ - public static SPMAsyncTask Construct(AsyncTaskType taskType, AsyncTaskParameters asyncTaskParams, boolean duringInit) { + public static SPMAsyncTask Construct(CommandCoordinator coco, AsyncTaskType taskType, AsyncTaskParameters asyncTaskParams, boolean duringInit) { try { SPMAsyncTask result = null; if (taskType == AsyncTaskType.unknown) { - result = new SPMAsyncTask(asyncTaskParams); + result = new SPMAsyncTask(coco, asyncTaskParams); } else { - result = new EntityAsyncTask(asyncTaskParams, duringInit); + result = new EntityAsyncTask(coco, asyncTaskParams, duringInit); } return result; } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskManager.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskManager.java index f8d9bb9..6c99afa 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskManager.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskManager.java @@ -12,6 +12,7 @@ import org.apache.commons.lang.exception.ExceptionUtils; import org.ovirt.engine.core.bll.Backend; +import org.ovirt.engine.core.bll.tasks.interfaces.CommandCoordinator; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo; @@ -60,17 +61,23 @@ /**Map of tasks in DB per storage pool that exist after restart **/ private ConcurrentMap<Guid, List<AsyncTasks>> tasksInDbAfterRestart = null; + private static AsyncTaskManager taskManager; + private static final Object LOCK = new Object(); + private CommandCoordinator coco; - - - private static final AsyncTaskManager _taskManager = new AsyncTaskManager(); - - public static AsyncTaskManager getInstance() { - return _taskManager; + public static AsyncTaskManager getInstance(CommandCoordinator coco) { + if (taskManager == null) { + synchronized(LOCK) { + if (taskManager == null) { + taskManager = new AsyncTaskManager(coco); + } + } + } + return taskManager; } - - private AsyncTaskManager() { + private AsyncTaskManager(CommandCoordinator coco) { + this.coco = coco; _tasks = new ConcurrentHashMap<Guid, SPMAsyncTask>(); SchedulerUtil scheduler = SchedulerUtilQuartzImpl.getInstance(); @@ -437,7 +444,7 @@ } public SPMAsyncTask CreateTask(AsyncTaskType taskType, AsyncTaskParameters taskParameters) { - return AsyncTaskFactory.Construct(taskType, taskParameters, false); + return AsyncTaskFactory.Construct(coco, taskType, taskParameters, false); } public synchronized void StartPollingTask(Guid taskID) { @@ -505,7 +512,7 @@ creationInfo.setStoragePoolID(sp.getId()); if (!_tasks.containsKey(creationInfo.getTaskID())) { try { - SPMAsyncTask task = AsyncTaskFactory.Construct(creationInfo); + SPMAsyncTask task = AsyncTaskFactory.Construct(coco, creationInfo); addTaskToManager(task); newlyAddedTasks.add(task); } catch (Exception e) { 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/CommandCoordinatorImpl.java similarity index 81% rename from backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinator.java rename to backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java index f96dcf5..973ae01 100644 --- 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/CommandCoordinatorImpl.java @@ -1,14 +1,22 @@ package org.ovirt.engine.core.bll.tasks; +import org.ovirt.engine.core.bll.tasks.interfaces.CommandCoordinator; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; import javax.transaction.Transaction; import org.ovirt.engine.core.bll.Backend; import org.ovirt.engine.core.bll.CommandBase; +import org.ovirt.engine.core.bll.CommandsFactory; +import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.interfaces.BackendInternal; +import org.ovirt.engine.core.bll.job.ExecutionContext; import org.ovirt.engine.core.bll.job.ExecutionHandler; +import org.ovirt.engine.core.bll.tasks.interfaces.CallBack; 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.action.VdcReturnValueBase; import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo; import org.ovirt.engine.core.common.asynctasks.AsyncTaskParameters; import org.ovirt.engine.core.common.businessentities.AsyncTaskResultEnum; @@ -21,21 +29,24 @@ 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.compat.NGuid; 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.TransactionSupport; -public class CommandCoordinator { +public class CommandCoordinatorImpl implements CallBack, CommandCoordinator { - private static final CommandCoordinator instance = new CommandCoordinator(); - private static final Log log = LogFactory.getLog(CommandCoordinator.class); + private static final CommandCoordinatorImpl instance = new CommandCoordinatorImpl(); + private static final Log log = LogFactory.getLog(CommandCoordinatorImpl.class); - public static CommandCoordinator getInstance() { + public static CommandCoordinatorImpl getInstance() { return instance; } - private CommandCoordinator() { + Map<NGuid, ExecutionContext> executionContextMap; + private CommandCoordinatorImpl() { + executionContextMap = new HashMap<>(); } /** @@ -112,7 +123,7 @@ command.getCommandId(),asyncTaskCreationInfo.getStoragePoolID(), asyncTaskCreationInfo.getTaskType())); p.setEntityId(command.getParameters().getEntityId()); - return AsyncTaskManager.getInstance().CreateTask(command.internalGetTaskType(), p); + return getAsyncTaskManager().CreateTask(command.internalGetTaskType(), p); } public void cancelTasks(final CommandBase command) { @@ -153,11 +164,23 @@ } } - private static AsyncTaskManager getAsyncTaskManager() { - return AsyncTaskManager.getInstance(); + @Override + public VdcReturnValueBase endAction( + NGuid stepId, + VdcActionType actionType, + AsyncTasks dbAsyncTask, + ExecutionContext context) { + VdcActionParametersBase parameters = dbAsyncTask.getActionParameters(); + CommandBase<?> command = CommandsFactory.getInstance().CreateCommand(actionType, parameters); + command.setContext(new CommandContext(context)); + return command.endAction(); } - protected BackendInternal getBackend() { + private AsyncTaskManager getAsyncTaskManager() { + return AsyncTaskManager.getInstance(this); + } + + private BackendInternal getBackend() { return Backend.getInstance(); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/EntityAsyncTask.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/EntityAsyncTask.java index 2779fdb..c69ccd0 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/EntityAsyncTask.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/EntityAsyncTask.java @@ -4,13 +4,12 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; -import org.ovirt.engine.core.bll.Backend; import org.ovirt.engine.core.bll.CommandBase; import org.ovirt.engine.core.bll.CommandsFactory; -import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.job.ExecutionContext; import org.ovirt.engine.core.bll.job.ExecutionHandler; +import org.ovirt.engine.core.bll.tasks.interfaces.CommandCoordinator; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.action.VdcReturnValueBase; import org.ovirt.engine.core.common.asynctasks.AsyncTaskParameters; @@ -52,8 +51,8 @@ return GetEntityMultiAsyncTasksByContainerId(getContainerId()); } - public EntityAsyncTask(AsyncTaskParameters parameters, boolean duringInit) { - super(parameters); + public EntityAsyncTask(CommandCoordinator coco, AsyncTaskParameters parameters, boolean duringInit) { + super(coco, parameters); boolean isNewCommandAdded = false; synchronized (_lockObject) { if (!_multiTasksByEntities.containsKey(getContainerId())) { @@ -159,9 +158,11 @@ } vdcReturnValue = - Backend.getInstance().endAction(entityInfo.getActionType(), - dbAsyncTask.getActionParameters(), - new CommandContext(context)); + coco.endAction( + stepId, + entityInfo.getActionType(), + dbAsyncTask, + context); } catch (VdcBLLException ex) { log.error(getErrorMessage(entityInfo)); log.error(ex.toString()); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/SPMAsyncTask.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/SPMAsyncTask.java index c3e1e16..292bf37 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/SPMAsyncTask.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/SPMAsyncTask.java @@ -4,6 +4,7 @@ import static org.ovirt.engine.core.common.config.ConfigValues.UknownTaskPrePollingLapse; import org.ovirt.engine.core.bll.job.ExecutionHandler; +import org.ovirt.engine.core.bll.tasks.interfaces.CommandCoordinator; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.asynctasks.AsyncTaskParameters; import org.ovirt.engine.core.common.businessentities.AsyncTaskStatus; @@ -20,7 +21,9 @@ import org.ovirt.engine.core.utils.log.LogFactory; public class SPMAsyncTask { - public SPMAsyncTask(AsyncTaskParameters parameters) { + CommandCoordinator coco; + public SPMAsyncTask(CommandCoordinator coco, AsyncTaskParameters parameters) { + this.coco = coco; setParameters(parameters); setState(AsyncTaskState.Initializing); } 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 1c4dc55..f0865ae 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 @@ -48,7 +48,7 @@ AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType parentCommand, String description, VdcObjectType entityType, Guid... entityIds) { - return CommandCoordinator.getInstance().createTask(command, + return CommandCoordinatorImpl.getInstance().createTask(command, asyncTaskCreationInfo, parentCommand, description, @@ -60,21 +60,21 @@ CommandBase command, AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType parentCommand) { - return CommandCoordinator.getInstance().concreteCreateTask(command, + return CommandCoordinatorImpl.getInstance().concreteCreateTask(command, asyncTaskCreationInfo, parentCommand); } public static void cancelTasks(final CommandBase command) { - CommandCoordinator.getInstance().cancelTasks(command); + CommandCoordinatorImpl.getInstance().cancelTasks(command); } public static void revertTasks(final CommandBase command) { - CommandCoordinator.getInstance().revertTasks(command); + CommandCoordinatorImpl.getInstance().revertTasks(command); } private static AsyncTaskManager getAsyncTaskManager() { - return AsyncTaskManager.getInstance(); + return AsyncTaskManager.getInstance(CommandCoordinatorImpl.getInstance()); } } 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 new file mode 100644 index 0000000..57f972f --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CallBack.java @@ -0,0 +1,11 @@ +package org.ovirt.engine.core.bll.tasks.interfaces; + +import org.ovirt.engine.core.bll.job.ExecutionContext; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.action.VdcReturnValueBase; +import org.ovirt.engine.core.common.businessentities.AsyncTasks; +import org.ovirt.engine.core.compat.NGuid; + +public interface CallBack { + public VdcReturnValueBase endAction(NGuid stepId, VdcActionType actionType, AsyncTasks dbAsyncTask, ExecutionContext context); +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CommandCoordinator.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CommandCoordinator.java new file mode 100644 index 0000000..11df2aa --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CommandCoordinator.java @@ -0,0 +1,12 @@ +package org.ovirt.engine.core.bll.tasks.interfaces; + +import org.ovirt.engine.core.bll.job.ExecutionContext; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.action.VdcReturnValueBase; +import org.ovirt.engine.core.common.businessentities.AsyncTasks; +import org.ovirt.engine.core.compat.NGuid; + + +public interface CommandCoordinator { + VdcReturnValueBase endAction(NGuid stepId, VdcActionType actionType, AsyncTasks dbAsyncTask, ExecutionContext context); +} -- To view, visit http://gerrit.ovirt.org/13821 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I0df6ec6d605ee667bdbc76b7a4e27bda6a7ba6e9 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
