Yair Zaslavsky has uploaded a new change for review.

Change subject: [WIP] core: adding command async task
......................................................................

[WIP] core: adding command async task

This patch adds CommandAsyncTask - a class that extends SPMAsyncTask
and performs coordination by command-id

This patch also modifies CommandCoordinator, AsyncTaskManager and other
classes to support end of command coordination

At WIP - as was not yet verified.

Change-Id: I328527ec87d38d801cc376d66d0277d56fa7a747
Signed-off-by: Yair Zaslavsky <yzasl...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskManager.java
A 
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/CommandIdDecoratedCommand.java
M 
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/EntityAsyncTask.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/EntityIdDecoratedCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskManagerUtil.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CallBack.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CommandCoordinator.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/TaskHelper.java
11 files changed, 389 insertions(+), 58 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/68/14668/1

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 2d04251..6319c2d 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
@@ -667,4 +667,14 @@
         return false;
     }
 
+    public synchronized Map<Guid, SPMTask> getAllTasksByCommandIds(Set<Guid> 
childCommandIds) {
+        Map<Guid, SPMTask> tasks = new HashMap<Guid, SPMTask>();
+        for (SPMTask task : _tasks.values()) {
+            if 
(childCommandIds.contains(task.getParameters().getDbAsyncTask().getTaskParameters().getCommandId()))
 {
+                tasks.put(task.getVdsmTaskId(), task);
+            }
+        }
+        return tasks;
+    }
+
 }
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
new file mode 100644
index 0000000..16a16e0
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandAsyncTask.java
@@ -0,0 +1,242 @@
+package org.ovirt.engine.core.bll.tasks;
+
+import java.util.Map;
+import java.util.Set;
+
+import org.ovirt.engine.core.bll.tasks.interfaces.CommandCoordinator;
+import org.ovirt.engine.core.bll.tasks.interfaces.SPMTask;
+import org.ovirt.engine.core.common.action.VdcReturnValueBase;
+import org.ovirt.engine.core.common.asynctasks.AsyncTaskParameters;
+import org.ovirt.engine.core.common.businessentities.AsyncTasks;
+import org.ovirt.engine.core.common.businessentities.CommandEntity;
+import org.ovirt.engine.core.compat.Guid;
+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 CommandAsyncTask extends SPMAsyncTask {
+
+    private CommandEntity commandEntity;
+    private CommandEntity parentCommandEntity;
+
+    public CommandAsyncTask(CommandCoordinator coco,
+            AsyncTaskParameters parameters,
+            CommandEntity commandEntity, boolean duringInit) {
+        super(coco, parameters);
+        this.commandEntity = commandEntity;
+
+        parentCommandEntity = 
coco.getCommand(commandEntity.getParentCommandId());
+        parentCommandEntity.getChildCommandIds().add(commandEntity.getId());
+
+    }
+
+    @Override
+    public void concreteStartPollingTask() {
+        Map<Guid, SPMTask> tasks = getAllTasksFromParentCommand();
+        startPollingTask(tasks, getVdsmTaskId());
+    }
+
+    private Map<Guid, SPMTask> getAllTasksFromParentCommand() {
+        Set<Guid> childCommandIds = parentCommandEntity.getChildCommandIds();
+        Map<Guid, SPMTask> tasks =
+                TaskManagerUtil.getAllTasksByCommandIds(childCommandIds);
+        return tasks;
+    }
+
+
+    @Override
+    protected void OnTaskEndSuccess() {
+        LogEndTaskSuccess();
+        endCommandIfNecessary();
+    }
+
+    private void endCommandIfNecessary() {
+
+        if (parentCommandEntity == null) {
+            log.warnFormat(
+                    "No info is available for command '{0}', current task 
('{1}') was probably created while other tasks were in progress, clearing 
task.",
+                    getContainerId(),
+                    getVdsmTaskId());
+
+            clearAsyncTask();
+        }
+
+        else {
+            Map<Guid, SPMTask> tasks = getAllTasksFromParentCommand();
+
+            if (shouldEndCommand(tasks)) {
+                log.infoFormat(
+                    "All tasks of command {0} has ended -> executing 
'EndAction'",
+                    getContainerId());
+                markAllWithAttemptingEndAction(tasks);
+                ThreadPoolUtil.execute(new Runnable() {
+                    @SuppressWarnings("synthetic-access")
+                    @Override
+                    public void run() {
+                        endCommand();
+                    }
+                });
+            }
+        }
+    }
+
+    private void endCommand() {
+        AsyncTasks dbAsyncTask = getParameters().getDbAsyncTask();
+        VdcReturnValueBase vdcReturnValue = null;
+        try {
+            log.infoFormat("endCommand [within thread] context: Attempting to 
EndAction '{0}', executionIndex: '{1}'",
+                    parentCommandEntity.getId(),
+                    dbAsyncTask.getActionParameters().getExecutionIndex());
+
+            try {
+                vdcReturnValue =
+                        coco.endAction(this, parentCommandEntity.getId());
+            } catch (RuntimeException ex) {
+                log.error(ex.toString());
+                log.debug(ex);
+            }
+        }
+
+        catch (RuntimeException Ex2) {
+            log.error(
+                    "endAction [within thread]: An exception has been thrown 
(not related to 'EndAction' itself)",
+                    Ex2);
+        }
+
+        finally {
+            handleEndActionResult(vdcReturnValue);
+        }
+    }
+
+    @Override
+    protected void OnTaskEndFailure() {
+        LogEndTaskFailure();
+        endCommandIfNecessary();
+    }
+
+    @Override
+    protected void OnTaskDoesNotExist() {
+        LogTaskDoesntExist();
+        endCommandIfNecessary();
+    }
+
+    @Override
+    public boolean isEntityAsyncTask() {
+        return true;
+    }
+
+    public void startPollingTask(Map<Guid, SPMTask> tasks, Guid TaskID) {
+        if (tasks.containsKey(TaskID) &&
+                (tasks.get(TaskID).getParameters() != null
+                    && (tasks.get(TaskID).getParameters().getDbAsyncTask() != 
null))) {
+            for (SPMTask task : tasks.values()) {
+                if (task.getParameters() != null && 
task.getParameters().getDbAsyncTask() != null
+                        && task.getState() == AsyncTaskState.Initializing) {
+                    task.setState(AsyncTaskState.Polling);
+                }
+            }
+        } else {
+            log.warnFormat(
+                    "For some reason, task '{0}' has no parameters or no DB 
task - we don't know its action type",
+                    TaskID);
+        }
+    }
+
+    @Override
+    public Object getContainerId() {
+        return commandEntity.getParentCommandId();
+    }
+
+    public void markAllWithAttemptingEndAction(Map<Guid, SPMTask> tasks) {
+        for (SPMTask task : tasks.values()) {
+            task.setState(AsyncTaskState.AttemptingEndAction);
+        }
+    }
+
+    public boolean shouldEndCommand(Map<Guid, SPMTask> tasks) {
+        for (SPMTask task : tasks.values()) {
+            if (!AsyncTaskState.Ended.equals(task.getState())) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public void handleEndActionResult(
+            VdcReturnValueBase vdcReturnValue) {
+        boolean isTaskGroupSuccess = 
getParameters().getDbAsyncTask().getActionParameters().getTaskGroupSuccess();
+        try {
+            if (parentCommandEntity != null) {
+                log.infoFormat(
+                        "endAction for command {0} of type {1} completed, 
handling the result.",
+                        parentCommandEntity.getId(),
+                        parentCommandEntity.getCommandType());
+
+                Map<Guid, SPMTask> tasks = getAllTasksFromParentCommand();
+                if (vdcReturnValue == null || (!vdcReturnValue.getSucceeded() 
&& vdcReturnValue.getEndActionTryAgain())) {
+                    log.infoFormat(
+                            "endAction for commandndAction for command {0} of 
type {1}} hasn't succeeded, not clearing tasks, will attempt again next 
polling.",
+                            parentCommandEntity.getId(),
+                            parentCommandEntity.getCommandType());
+
+                    repoll(tasks);
+                } else {
+                    log.infoFormat(
+                            "endAction for commandndAction for command {0} of 
type {1} action type {0} {2}succeeded, clearing tasks.",
+                            parentCommandEntity.getId(),
+                            parentCommandEntity.getCommandType(),
+                            (vdcReturnValue.getSucceeded() ? "" : "hasn't "));
+
+                    /**
+                     * Terminate the job by the return value of EndAction. The
+                     * operation will end also the FINALIZING step.
+                     */
+                    coco.endTaskJob(this, vdcReturnValue.getSucceeded()
+                            && isTaskGroupSuccess);
+                    clearTasks(tasks);
+
+                    if (getAllCleared(tasks)) {
+                        log.infoFormat(
+                                "Remoing parent command {0}", 
getContainerId());
+                        removeCommand(parentCommandEntity.getId());
+                    }
+                }
+            }
+        } catch (RuntimeException ex) {
+            log.error("EntityAsyncTask::HandleEndActionResult [within thread]: 
an exception has been thrown", ex);
+        }
+    }
+
+    private void removeCommand(Guid commandId) {
+        coco.removeCommand(commandId);
+    }
+
+    private void clearTasks(Map<Guid, SPMTask> tasks) {
+        for (SPMTask task : tasks.values()) {
+                task.clearAsyncTask();
+        }
+    }
+
+    private boolean getAllCleared(Map<Guid, SPMTask> tasks) {
+        for (SPMTask task : tasks.values()) {
+            if (!taskWasCleared(task)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private boolean taskWasCleared(SPMTask task) {
+        AsyncTaskState taskState = task.getState();
+        return taskState == AsyncTaskState.Cleared || taskState == 
AsyncTaskState.ClearFailed;
+    }
+
+    private void repoll(Map<Guid, SPMTask> tasks) {
+        for (SPMTask task : tasks.values()) {
+                    task.setState(AsyncTaskState.Ended);
+        }
+    }
+
+    private static final Log log = LogFactory.getLog(EntityAsyncTask.class);
+}
+
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java
index dc76e44..1ac7c2b 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
@@ -53,7 +53,7 @@
     public static CommandCoordinatorImpl getInstance() {
         return instance;
     }
-    
+
     CacheWrapper<NGuid, ExecutionContext> executionContextMap;
     CommandsCache commandsCache = new CommandsCacheImpl();
 
@@ -62,21 +62,19 @@
     }
 
     @Override
-    public VdcReturnValueBase endAction(
-            NGuid stepId,
-            Object containerId,
-            VdcActionType actionType,
-            AsyncTasks dbAsyncTask) {
+    public VdcReturnValueBase endAction(SPMTask task, Object coordinator) {
+        AsyncTasks dbAsyncTask = task.getParameters().getDbAsyncTask();
+        NGuid stepId = dbAsyncTask.getStepId();
+        VdcActionType actionType = dbAsyncTask.getaction_type();
         Guid commandId = dbAsyncTask.getActionParameters().getCommandId();
         VdcActionParametersBase parameters = dbAsyncTask.getActionParameters();
+        CommandEntity commandEntity = null;
         try {
             ExecutionContext context = null;
             if (stepId != null) {
                 context = createFinalizingContext(stepId.getValue());
                 executionContextMap.put(stepId, context);
-            }
-            if (stepId != null) {
-                CommandEntity commandEntity = commandsCache.get(commandId);
+                commandEntity = commandsCache.get(commandId);
                 if (!actionType.equals(commandEntity.getCommandType())) {
                     throw new RuntimeException("action types dont match");
                 } else {
@@ -90,7 +88,7 @@
             }
             CommandBase<?> command = 
CommandsFactory.getInstance().CreateCommand(actionType, parameters);
             command.setContext(new CommandContext(context));
-            return new DecoratedCommand(command, dbAsyncTask, 
containerId).endAction();
+            return new EntityIdDecoratedCommand(this, command, 
(EntityAsyncTask) task, coordinator).endAction();
         } finally {
             commandsCache.remove(commandId);
         }
@@ -118,7 +116,8 @@
     }
 
     @Override
-    public void endTaskJob(NGuid stepId, boolean exitStatus) {
+    public void endTaskJob(SPMTask task, boolean exitStatus) {
+        NGuid stepId = task.getParameters().getDbAsyncTask().getStepId();
         if (stepId != null) {
             ExecutionContext context = executionContextMap.get(stepId);
             ExecutionHandler.getInstance().endTaskJob(context, exitStatus);
@@ -381,10 +380,12 @@
     }
 
     @Override
-    public void handleEndActionResult(
-            EntityMultiAsyncTasks entityInfo,
+    public void handleEndActionResult(EntityAsyncTask task,
             VdcReturnValueBase vdcReturnValue,
-            AsyncTasks dbAsyncTask) {
+            Object coordinator) {
+
+        EntityMultiAsyncTasks entityInfo = 
getEntityMultiAsyncTasks(coordinator);
+        AsyncTasks dbAsyncTask = task.getParameters().getDbAsyncTask();
         boolean isTaskGroupSuccess = 
dbAsyncTask.getActionParameters().getTaskGroupSuccess();
         try {
             if (entityInfo != null) {
@@ -409,7 +410,7 @@
                      * operation will end also the FINALIZING step.
                      */
                     if (taskHasContext(dbAsyncTask.getStepId())) {
-                        endTaskJob(dbAsyncTask.getStepId(), 
vdcReturnValue.getSucceeded() && isTaskGroupSuccess);
+                        endTaskJob(task, vdcReturnValue.getSucceeded() && 
isTaskGroupSuccess);
                     }
 
                     entityInfo.ClearTasks();
@@ -450,4 +451,14 @@
         return Backend.getInstance();
     }
 
+    @Override
+    public CommandEntity getCommand(NGuid commandId) {
+        return commandsCache.get(commandId);
+    }
+
+    @Override
+    public void removeCommand(NGuid commandId) {
+        commandsCache.remove(commandId);
+    }
+
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandIdDecoratedCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandIdDecoratedCommand.java
new file mode 100644
index 0000000..fb4789e
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandIdDecoratedCommand.java
@@ -0,0 +1,45 @@
+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;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.utils.log.Log;
+import org.ovirt.engine.core.utils.log.LogFactory;
+
+public class CommandIdDecoratedCommand<T extends VdcActionParametersBase> 
extends DecoratedCommand<T> {
+
+    private CommandAsyncTask task;
+    private Guid commandId;
+
+    public CommandIdDecoratedCommand(CommandCoordinator coco,
+            Command<T> command,
+            CommandAsyncTask task,
+            Guid commandId) {
+        super(coco, command);
+        this.task = task;
+        this.commandId = commandId;
+
+    }
+
+    @Override
+    public VdcReturnValueBase endAction() {
+        VdcReturnValueBase vdcReturnValue = null;
+        CommandAsyncTask t= null;
+        try {
+            vdcReturnValue = innerCommand.endAction();
+        } finally {
+            task.handleEndActionResult(vdcReturnValue);
+        }
+        return vdcReturnValue;
+    }
+
+    @Override
+    public T getParameters() {
+        return innerCommand.getParameters();
+    }
+
+    private static final Log log = 
LogFactory.getLog(EntityIdDecoratedCommand.class);
+
+}
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
index 8930f4d..6058b69 100644
--- 
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
@@ -1,46 +1,28 @@
 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;
-import org.ovirt.engine.core.common.businessentities.AsyncTasks;
-import org.ovirt.engine.core.utils.log.Log;
-import org.ovirt.engine.core.utils.log.LogFactory;
 
-public class DecoratedCommand<T extends VdcActionParametersBase> implements 
Command {
+public class DecoratedCommand<T extends VdcActionParametersBase> implements 
Command<T> {
 
-    private Command command;
-    private AsyncTasks dbAsyncTask;
-    private Object containerId;
-    private static final Log log = LogFactory.getLog(DecoratedCommand.class);
+    protected Command<T> innerCommand;
+    protected CommandCoordinator coco;
 
-    public DecoratedCommand(Command command, AsyncTasks dbAsyncTask, Object 
containerId) {
-        this.command = command;
-        this.dbAsyncTask = dbAsyncTask;
-        this.containerId = containerId;
+    public DecoratedCommand(CommandCoordinator coco, Command<T> innerCommand) {
+        this.innerCommand = innerCommand;
+        this.coco = coco;
     }
 
     @Override
     public VdcReturnValueBase endAction() {
-        VdcReturnValueBase vdcReturnValue = null;
-        try {
-            vdcReturnValue = command.endAction();
-        } finally {
-            CommandCoordinatorImpl coco = CommandCoordinatorImpl.getInstance();
-            CommandCoordinatorImpl.getInstance().handleEndActionResult(
-                    coco.getEntityMultiAsyncTasks(getContainerId()),
-                    vdcReturnValue,
-                    dbAsyncTask);
-        }
-        return vdcReturnValue;
+        return innerCommand.endAction();
     }
 
     @Override
-    public VdcActionParametersBase getParameters() {
-        return command.getParameters();
+    public T getParameters() {
+        return innerCommand.getParameters();
     }
 
-    private Object getContainerId() {
-        return containerId;
-    }
 }
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 11c225f..7144a22 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
@@ -1,13 +1,13 @@
 package org.ovirt.engine.core.bll.tasks;
 
 import java.util.ArrayList;
+
 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;
 import org.ovirt.engine.core.common.asynctasks.EndedTaskInfo;
 import org.ovirt.engine.core.common.businessentities.AsyncTasks;
-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;
@@ -117,13 +117,8 @@
                 /**
                  * Creates context for the job which monitors the action
                  */
-                NGuid stepId = dbAsyncTask.getStepId();
                 vdcReturnValue =
-                        coco.endAction(stepId,
-                                getContainerId(),
-                                entityInfo.getActionType(),
-                                dbAsyncTask
-                        );
+                        coco.endAction(this,getContainerId());
             } catch (RuntimeException 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/EntityIdDecoratedCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/EntityIdDecoratedCommand.java
new file mode 100644
index 0000000..24135e2
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/EntityIdDecoratedCommand.java
@@ -0,0 +1,37 @@
+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;
+import org.ovirt.engine.core.utils.log.Log;
+import org.ovirt.engine.core.utils.log.LogFactory;
+
+public class EntityIdDecoratedCommand<T extends VdcActionParametersBase> 
extends DecoratedCommand<T> {
+
+    private Object containerId;
+    private EntityAsyncTask task;
+    private static final Log log = 
LogFactory.getLog(EntityIdDecoratedCommand.class);
+
+    public EntityIdDecoratedCommand(CommandCoordinator coco,
+            Command<T> command,
+            EntityAsyncTask task,
+            Object containerId) {
+        super(coco, command);
+        this.task = task;
+        this.containerId = containerId;
+    }
+
+    @Override
+    public VdcReturnValueBase endAction() {
+        VdcReturnValueBase vdcReturnValue = null;
+        try {
+            vdcReturnValue = innerCommand.endAction();
+        } finally {
+            CommandCoordinatorImpl coco = CommandCoordinatorImpl.getInstance();
+            CommandCoordinatorImpl.getInstance().handleEndActionResult(task, 
vdcReturnValue, containerId);
+        }
+        return vdcReturnValue;
+    }
+
+}
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 3376fe7..287af52 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
@@ -1,7 +1,11 @@
 package org.ovirt.engine.core.bll.tasks;
 
 import java.util.ArrayList;
+import java.util.Map;
+import java.util.Set;
+
 import org.ovirt.engine.core.bll.CommandBase;
+import org.ovirt.engine.core.bll.tasks.interfaces.SPMTask;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.VdcActionType;
 import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo;
@@ -88,4 +92,8 @@
         return 
AsyncTaskManager.getInstance(CommandCoordinatorImpl.getInstance());
     }
 
+    public static Map<Guid, SPMTask> getAllTasksByCommandIds(Set<Guid> 
childCommandIds) {
+        return getAsyncTaskManager().getAllTasksByCommandIds(childCommandIds);
+    }
+
 }
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 d047604..30f3a19 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
@@ -1,10 +1,8 @@
 package org.ovirt.engine.core.bll.tasks.interfaces;
 
-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, Object containerId, 
VdcActionType actionType, AsyncTasks dbAsyncTask);
+    public VdcReturnValueBase endAction(SPMTask task, Object coordinator);
 }
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
index 81e9e7e..83f59d9 100644
--- 
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
@@ -5,5 +5,7 @@
 
 public abstract class CommandCoordinator implements CallBack, TaskHelper, 
Poller {
 
-    public abstract CommandEntity getCommand(NGuid parentCommandId);
+    public abstract CommandEntity getCommand(NGuid nGuid);
+
+    public abstract void removeCommand(NGuid commandId);
 }
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 fa8c23a..30d5a00 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
@@ -5,12 +5,13 @@
 package org.ovirt.engine.core.bll.tasks.interfaces;
 
 import java.util.ArrayList;
+
+import org.ovirt.engine.core.bll.tasks.EntityAsyncTask;
 import org.ovirt.engine.core.bll.tasks.EntityMultiAsyncTasks;
 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.AsyncTasks;
 import org.ovirt.engine.core.common.job.JobExecutionStatus;
 import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
 import org.ovirt.engine.core.compat.Guid;
@@ -25,7 +26,7 @@
 
     void endTaskStep(NGuid stepId, JobExecutionStatus exitStatus);
 
-    void endTaskJob(NGuid stepId, boolean exitStatus);
+    void endTaskJob(SPMTask task, boolean exitStatus);
 
     boolean taskHasContext(NGuid stepId);
 
@@ -47,5 +48,5 @@
 
     public SPMTask construct(AsyncTaskType taskType, AsyncTaskParameters 
asyncTaskParams, boolean duringInit);
 
-    public void handleEndActionResult(EntityMultiAsyncTasks entityInfo, 
VdcReturnValueBase vdcReturnValue, AsyncTasks dbAsyncTask);
+    public void handleEndActionResult(EntityAsyncTask task, VdcReturnValueBase 
vdcReturnValue, Object coordinator);
 }


--
To view, visit http://gerrit.ovirt.org/14668
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I328527ec87d38d801cc376d66d0277d56fa7a747
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Yair Zaslavsky <yzasl...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to