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: Id95a80277ca82ccf034680a302159ca050ee7ba7 Signed-off-by: Ravi Nori <rn...@redhat.com> --- 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 M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandAsyncTask.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/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, 100 insertions(+), 46 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/75/26275/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 96e4dee..d2de8cf 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 @@ -39,6 +39,12 @@ "org.ovirt.engine.core.bll.scheduling.commands", "org.ovirt.engine.core.bll.scheduling.queries" }; + private static CommandsFactory instance = new CommandsFactory(); + + public static CommandsFactory getInstance() { + return instance; + } + private static ConcurrentMap<String, Class<CommandBase<? extends VdcActionParametersBase>>> commandsCache = new ConcurrentHashMap<String, Class<CommandBase<? extends VdcActionParametersBase>>>(VdcActionType.values().length); 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 af8a74b..6ed46f4 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 @@ -49,6 +49,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 37671db..84d49fa 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().getByVdsmTaskId(creationInfo.getVdsmTaskId()); if (asyncTask == null || asyncTask.getActionParameters() == null) { asyncTask = @@ -45,12 +46,12 @@ creationInfo.setTaskType(AsyncTaskType.unknown); } AsyncTaskParameters asyncTaskParams = new AsyncTaskParameters(creationInfo, asyncTask); - return construct(creationInfo.getTaskType(), asyncTaskParams, true); + return construct(coco, creationInfo.getTaskType(), asyncTaskParams, true); } - public static SPMAsyncTask construct(AsyncTaskCreationInfo creationInfo, AsyncTasks asyncTask) { + public static SPMAsyncTask construct(CommandCoordinator coco, AsyncTaskCreationInfo creationInfo, AsyncTasks asyncTask) { AsyncTaskParameters asyncTaskParams = new AsyncTaskParameters(creationInfo, asyncTask); - return construct(creationInfo.getTaskType(), asyncTaskParams, true); + return construct(coco, creationInfo.getTaskType(), asyncTaskParams, true); } /** @@ -66,13 +67,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 CommandAsyncTask(asyncTaskParams, duringInit); + result = new CommandAsyncTask(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 59b0306..63fd1e8 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 @@ -14,6 +14,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.VdcObjectType; import org.ovirt.engine.core.common.action.VdcActionType; @@ -72,13 +73,23 @@ private CountDownLatch irsBrokerLatch; - private static final AsyncTaskManager _taskManager = new AsyncTaskManager(); + private static AsyncTaskManager taskManager; + private static final Object LOCK = new Object(); + private CommandCoordinator coco; - 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(); @@ -304,12 +315,12 @@ }); } - public static void logAndFailTaskOfCommandWithEmptyVdsmId(Guid asyncTaskId, String message) { + public void logAndFailTaskOfCommandWithEmptyVdsmId(Guid asyncTaskId, String message) { AsyncTasks task = DbFacade.getInstance().getAsyncTaskDao().get(asyncTaskId); logAndFailTaskOfCommandWithEmptyVdsmId(task, message); } - public static void logAndFailTaskOfCommandWithEmptyVdsmId(final AsyncTasks task, String message) { + public void logAndFailTaskOfCommandWithEmptyVdsmId(final AsyncTasks task, String message) { log.infoFormat( "Failing task with empty vdsm id AsyncTaskType {0} : Task '{1}' Parent Command {2}", task.getTaskType(), @@ -329,7 +340,7 @@ task.getTaskId(), (task.getaction_type())); AsyncTaskCreationInfo creationInfo = new AsyncTaskCreationInfo(Guid.Empty, task.getTaskType(), task.getStoragePoolId()); - SPMAsyncTask spmTask = AsyncTaskFactory.construct(creationInfo, task); + SPMAsyncTask spmTask = AsyncTaskFactory.construct(coco, creationInfo, task); AsyncTaskStatus failureStatus = new AsyncTaskStatus(); failureStatus.setStatus(AsyncTaskStatusEnum.finished); failureStatus.setResult(AsyncTaskResultEnum.failure); @@ -618,7 +629,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 vdsmTaskId) { @@ -684,7 +695,7 @@ SPMAsyncTask task; if (partiallyCompletedCommandTasks.containsKey(creationInfo.getVdsmTaskId())) { AsyncTasks asyncTaskInDb = partiallyCompletedCommandTasks.get(creationInfo.getVdsmTaskId()); - task = AsyncTaskFactory.construct(creationInfo, asyncTaskInDb); + task = AsyncTaskFactory.construct(coco, creationInfo, asyncTaskInDb); if (task.getEntitiesMap() == null) { task.setEntitiesMap(new HashMap<Guid, VdcObjectType>()); } @@ -693,7 +704,7 @@ // Will result in failure of the command task.setPartiallyCompletedCommandTask(true); } else { - task = AsyncTaskFactory.construct(creationInfo); + task = AsyncTaskFactory.construct(coco, creationInfo); } addTaskToManager(task); newlyAddedTasks.add(task); 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 bb39bb2..6209f42 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 @@ -4,13 +4,12 @@ import java.util.HashMap; import java.util.Map; -import org.ovirt.engine.core.bll.Backend; import org.ovirt.engine.core.bll.CommandBase; import org.ovirt.engine.core.bll.CommandMultiAsyncTasks; 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.VdcActionType; import org.ovirt.engine.core.common.action.VdcReturnValueBase; @@ -40,8 +39,8 @@ return entityInfo; } - public CommandAsyncTask(AsyncTaskParameters parameters, boolean duringInit) { - super(parameters); + public CommandAsyncTask(CommandCoordinator coco, AsyncTaskParameters parameters, boolean duringInit) { + super(coco, parameters); boolean isNewCommandAdded = false; synchronized (_lockObject) { if (!_multiTasksByCommandIds.containsKey(getCommandId())) { @@ -148,10 +147,8 @@ context = ExecutionHandler.createFinalizingContext(stepId); } - vdcReturnValue = - Backend.getInstance().endAction(getEndActionType(dbAsyncTask), - dbAsyncTask.getActionParameters(), - new CommandContext(context)); + vdcReturnValue = coco.endAction(stepId, getEndActionType(dbAsyncTask), dbAsyncTask, context); + } catch (VdcBLLException ex) { log.error(getErrorMessage()); log.error(ex.toString()); 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 83% 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 ca5c384..7268e2f 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 @@ -4,11 +4,16 @@ import java.util.Map; 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.CommandCoordinator; 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.asynctasks.AsyncTaskType; @@ -27,16 +32,16 @@ import org.ovirt.engine.core.utils.log.LogFactory; import org.ovirt.engine.core.utils.threadpool.ThreadPoolUtil; -public class CommandCoordinator { +public class CommandCoordinatorImpl extends CommandCoordinator { - private static final CommandCoordinator instance = new CommandCoordinator(); + private static final CommandCoordinatorImpl instance = new CommandCoordinatorImpl(); private static final Log log = LogFactory.getLog(CommandCoordinator.class); - public static CommandCoordinator getInstance() { + public static CommandCoordinatorImpl getInstance() { return instance; } - private CommandCoordinator() { + private CommandCoordinatorImpl() { } /** @@ -54,11 +59,11 @@ * @return Guid of the created task. */ public Guid createTask(Guid taskId, - CommandBase command, - AsyncTaskCreationInfo asyncTaskCreationInfo, - VdcActionType parentCommand, - String description, - Map<Guid, VdcObjectType> entitiesMap) { + CommandBase command, + AsyncTaskCreationInfo asyncTaskCreationInfo, + VdcActionType parentCommand, + String description, + Map<Guid, VdcObjectType> entitiesMap) { Step taskStep = ExecutionHandler.addTaskStep(command.getExecutionContext(), StepEnum.getStepNameByTaskType(asyncTaskCreationInfo.getTaskType()), @@ -96,7 +101,7 @@ } public SPMAsyncTask createTask(AsyncTaskType taskType, AsyncTaskParameters taskParameters) { - return AsyncTaskFactory.construct(taskType, taskParameters, false); + return AsyncTaskFactory.construct(this, taskType, taskParameters, false); } public AsyncTasks getAsyncTask( @@ -181,8 +186,18 @@ } } + public VdcReturnValueBase endAction(Guid 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(); + } + private AsyncTaskManager getAsyncTaskManager() { - return AsyncTaskManager.getInstance(); + return AsyncTaskManager.getInstance(this); } protected BackendInternal getBackend() { 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 acbe1d8..030514e 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 @@ -6,6 +6,7 @@ import org.ovirt.engine.core.bll.Backend; 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; @@ -22,7 +23,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 07a6598..f22d8a3 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 @@ -49,7 +49,7 @@ VdcActionType parentCommand, String description, Map<Guid, VdcObjectType> entitiesMap) { - return CommandCoordinator.getInstance().createTask(taskId, + return CommandCoordinatorImpl.getInstance().createTask(taskId, command, asyncTaskCreationInfo, parentCommand, @@ -62,18 +62,18 @@ CommandBase command, AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType parentCommand) { - return CommandCoordinator.getInstance().concreteCreateTask(taskId, + return CommandCoordinatorImpl.getInstance().concreteCreateTask(taskId, 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); } public static AsyncTasks getAsyncTask( @@ -81,22 +81,22 @@ CommandBase command, AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType parentCommand) { - return CommandCoordinator.getInstance().getAsyncTask(taskId, command, asyncTaskCreationInfo, parentCommand); + return CommandCoordinatorImpl.getInstance().getAsyncTask(taskId, command, asyncTaskCreationInfo, parentCommand); } public static AsyncTasks createAsyncTask( CommandBase command, AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType parentCommand) { - return CommandCoordinator.getInstance().createAsyncTask(command, asyncTaskCreationInfo, parentCommand); + return CommandCoordinatorImpl.getInstance().createAsyncTask(command, asyncTaskCreationInfo, parentCommand); } public static void logAndFailTaskOfCommandWithEmptyVdsmId(Guid taskId, String message) { - AsyncTaskManager.logAndFailTaskOfCommandWithEmptyVdsmId(taskId, message); + getAsyncTaskManager().logAndFailTaskOfCommandWithEmptyVdsmId(taskId, message); } public static void logAndFailTaskOfCommandWithEmptyVdsmId(AsyncTasks task, String message) { - AsyncTaskManager.logAndFailTaskOfCommandWithEmptyVdsmId(task, message); + getAsyncTaskManager().logAndFailTaskOfCommandWithEmptyVdsmId(task, message); } public static void removeTaskFromDbByTaskId(Guid taskId) { @@ -104,7 +104,7 @@ } 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..808bf56 --- /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.Guid; + +public interface CallBack { + public VdcReturnValueBase endAction(Guid 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..ed21ae5 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CommandCoordinator.java @@ -0,0 +1,4 @@ +package org.ovirt.engine.core.bll.tasks.interfaces; + +public abstract class CommandCoordinator implements CallBack { +} -- To view, visit http://gerrit.ovirt.org/26275 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Id95a80277ca82ccf034680a302159ca050ee7ba7 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