Ravi Nori has uploaded a new change for review.

Change subject: engine : Persist Async Task root command in command_entities
......................................................................

engine : Persist Async Task root command in command_entities

Persist async task's root command information
in command entities table.

Modifies the async tasks table and store the root
command id and action type in the async_tasks table
and all other information needs to rebuild the root
command in the command entities table.

The action type is left in the async task table to enable
upgrading from 3.4 to 3.5.1 or later

Change-Id: I7ec5c072c6f3153c9396b0ce0be8e7c59cbefea1
Bug-Url: https://bugzilla.redhat.com/1133041
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/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/AsyncTaskUtils.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CoCoAsyncTaskHelper.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
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorUtil.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/interfaces/AsyncTaskCRUDOperations.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CommandCRUDOperations.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/TaskHelper.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/BackwardCompatibilityTaskCreationTest.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskParameters.java
R 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/AsyncTask.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAO.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAODbFacadeImpl.java
M 
backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/AsyncTaskDAOTest.java
M backend/manager/modules/dal/src/test/resources/fixtures.xml
M 
frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml
M packaging/dbscripts/async_tasks_sp.sql
A packaging/dbscripts/upgrade/03_05_1040_async_tasks_add_root_command_id.sql
22 files changed, 355 insertions(+), 303 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/18/32718/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 354b695..2e608df 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
@@ -53,7 +53,7 @@
 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.AsyncTasks;
+import org.ovirt.engine.core.common.businessentities.AsyncTask;
 import org.ovirt.engine.core.common.businessentities.BusinessEntity;
 import org.ovirt.engine.core.common.businessentities.BusinessEntitySnapshot;
 import 
org.ovirt.engine.core.common.businessentities.BusinessEntitySnapshot.EntityStatusSnapshot;
@@ -365,7 +365,7 @@
                 @Override
                 public Void runInTransaction() {
                     for (Guid asyncTaskId : 
getReturnValue().getTaskPlaceHolderIdList()) {
-                        AsyncTasks task = 
CommandCoordinatorUtil.getAsyncTaskFromDb(asyncTaskId);
+                        AsyncTask task = 
CommandCoordinatorUtil.getAsyncTaskFromDb(asyncTaskId);
                         if (task != null && 
Guid.isNullOrEmpty(task.getVdsmTaskId())) {
                             
CommandCoordinatorUtil.removeTaskFromDbByTaskId(task.getTaskId());
                         }
@@ -1485,7 +1485,7 @@
             } else {
                 
creationInfo.setTaskType(getCurrentTaskHandler().getTaskType());
             }
-            final AsyncTasks task = createAsyncTask(creationInfo, 
parentCommand);
+            final AsyncTask task = createAsyncTask(creationInfo, 
parentCommand);
             taskId = task.getTaskId();
             TransactionScopeOption scopeOption =
                     getTransactive() ? TransactionScopeOption.RequiresNew : 
TransactionScopeOption.Required;
@@ -1504,7 +1504,7 @@
         return taskId;
     }
 
-    private void saveTaskAndPutInMap(String taskKey, AsyncTasks task) {
+    private void saveTaskAndPutInMap(String taskKey, AsyncTask task) {
         CommandCoordinatorUtil.saveAsyncTaskToDb(task);
         taskKeyToTaskIdMap.put(taskKey, task.getTaskId());
     }
@@ -1696,7 +1696,7 @@
         return parentParameters;
     }
 
-    private AsyncTasks createAsyncTask(
+    private AsyncTask createAsyncTask(
             AsyncTaskCreationInfo asyncTaskCreationInfo,
             VdcActionType parentCommand) {
         return CommandCoordinatorUtil.createAsyncTask(this, 
asyncTaskCreationInfo, parentCommand);
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 6a51f63..57791fa 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
@@ -6,10 +6,10 @@
 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.AsyncTask;
 import org.ovirt.engine.core.common.businessentities.AsyncTaskResultEnum;
 import org.ovirt.engine.core.common.businessentities.AsyncTaskStatusEnum;
-import org.ovirt.engine.core.common.businessentities.AsyncTasks;
-import org.ovirt.engine.core.compat.CommandStatus;
+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;
@@ -26,29 +26,31 @@
      * @return
      */
     public static SPMAsyncTask construct(CommandCoordinator coco, 
AsyncTaskCreationInfo creationInfo) {
-        AsyncTasks asyncTask = 
coco.getByVdsmTaskId(creationInfo.getVdsmTaskId());
+        AsyncTask asyncTask = 
coco.getByVdsmTaskId(creationInfo.getVdsmTaskId());
         if (asyncTask == null || asyncTask.getActionParameters() == null) {
-            CommandStatus cmdStatus = asyncTask == null ? 
CommandStatus.UNKNOWN : asyncTask.getCommandStatus();
-            asyncTask =
-                    new AsyncTasks(VdcActionType.Unknown,
-                            AsyncTaskResultEnum.success,
-                            AsyncTaskStatusEnum.running,
-                            creationInfo.getVdsmTaskId(),
-                            new VdcActionParametersBase(),
-                            new VdcActionParametersBase(),
-                            creationInfo.getStepId(),
-                            asyncTask == null ? Guid.newGuid() : 
asyncTask.getCommandId(),
-                            asyncTask == null ? Guid.newGuid() : 
asyncTask.getRootCommandId(),
-                            creationInfo.getStoragePoolID(),
-                            creationInfo.getTaskType(),
-                            cmdStatus);
+            asyncTask = new AsyncTask(AsyncTaskResultEnum.success,
+                    AsyncTaskStatusEnum.running,
+                    creationInfo.getVdsmTaskId(),
+                    creationInfo.getStepId(),
+                    creationInfo.getStoragePoolID(),
+                    creationInfo.getTaskType(),
+                    getCommandEntity(coco, asyncTask == null ? Guid.newGuid() 
: asyncTask.getRootCommandId()),
+                    getCommandEntity(coco, asyncTask == null ? Guid.newGuid() 
: asyncTask.getCommandId()));
             creationInfo.setTaskType(AsyncTaskType.unknown);
         }
         AsyncTaskParameters asyncTaskParams = new 
AsyncTaskParameters(creationInfo, asyncTask);
         return construct(coco, creationInfo.getTaskType(), asyncTaskParams, 
true);
     }
 
-    public static SPMAsyncTask construct(CommandCoordinator coco, 
AsyncTaskCreationInfo creationInfo, AsyncTasks asyncTask) {
+    private static CommandEntity getCommandEntity(CommandCoordinator coco, 
Guid cmdId) {
+        CommandEntity cmdEntity = coco.getCommandEntity(cmdId);
+        if (cmdEntity == null) {
+            cmdEntity = coco.createCommandEntity(cmdId, VdcActionType.Unknown, 
new VdcActionParametersBase());
+        }
+        return cmdEntity;
+    }
+
+    public static SPMAsyncTask construct(CommandCoordinator coco, 
AsyncTaskCreationInfo creationInfo, AsyncTask asyncTask) {
         AsyncTaskParameters asyncTaskParams = new 
AsyncTaskParameters(creationInfo, asyncTask);
         return construct(coco, creationInfo.getTaskType(), asyncTaskParams, 
true);
     }
@@ -70,7 +72,7 @@
         try {
             SPMAsyncTask result = null;
             if (taskType == AsyncTaskType.unknown ||
-                    asyncTaskParams.getDbAsyncTask().getaction_type() == 
VdcActionType.Unknown) {
+                    asyncTaskParams.getDbAsyncTask().getActionType() == 
VdcActionType.Unknown) {
                 result = new SPMAsyncTask(coco, asyncTaskParams);
             } else {
                 result = new CommandAsyncTask(coco, asyncTaskParams, 
duringInit);
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 d1c3664..5d01364 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
@@ -21,10 +21,10 @@
 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.AsyncTask;
 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.StoragePool;
 import org.ovirt.engine.core.common.config.Config;
 import org.ovirt.engine.core.common.config.ConfigValues;
@@ -62,12 +62,12 @@
     private final int _cacheTimeInMinutes;
 
     /**Map of tasks in DB per storage pool that exist after restart **/
-    private ConcurrentMap<Guid, List<AsyncTasks>> tasksInDbAfterRestart = null;
+    private ConcurrentMap<Guid, List<AsyncTask>> tasksInDbAfterRestart = null;
 
     /**
      * Map of tasks for commands that have been partially submitted to vdsm
      */
-    private Map<Guid, AsyncTasks> partiallyCompletedCommandTasks = new 
ConcurrentHashMap<>();
+    private Map<Guid, AsyncTask> partiallyCompletedCommandTasks = new 
ConcurrentHashMap<>();
 
     private CountDownLatch irsBrokerLatch;
 
@@ -107,23 +107,23 @@
 
     public void initAsyncTaskManager() {
         tasksInDbAfterRestart = new ConcurrentHashMap();
-        Map<Guid, List<AsyncTasks>> rootCommandIdToTasksMap = 
groupTasksByRootCommandId(coco.getAllAsyncTasksFromDb());
+        Map<Guid, List<AsyncTask>> rootCommandIdToTasksMap = 
groupTasksByRootCommandId(coco.getAllAsyncTasksFromDb());
         int numberOfCommandsWithEmptyVdsmId = 0;
-        for (Entry<Guid, List<AsyncTasks>> entry : 
rootCommandIdToTasksMap.entrySet()) {
+        for (Entry<Guid, List<AsyncTask>> entry : 
rootCommandIdToTasksMap.entrySet()) {
             if 
(hasTasksWithoutVdsmId(rootCommandIdToTasksMap.get(entry.getKey()))) {
                 log.infoFormat("Root Command {0} has tasks without vdsm id.", 
entry.getKey());
                 numberOfCommandsWithEmptyVdsmId++;
             }
         }
         irsBrokerLatch = new CountDownLatch(numberOfCommandsWithEmptyVdsmId);
-        for (Entry<Guid, List<AsyncTasks>> entry : 
rootCommandIdToTasksMap.entrySet()) {
+        for (Entry<Guid, List<AsyncTask>> entry : 
rootCommandIdToTasksMap.entrySet()) {
             if 
(hasTasksWithoutVdsmId(rootCommandIdToTasksMap.get(entry.getKey()))) {
                 log.infoFormat("Root Command {0} has tasks without vdsm id.", 
entry.getKey());
                 
handleTasksOfCommandWithEmptyVdsmId(rootCommandIdToTasksMap.get(entry.getKey()));
             }
-            for (AsyncTasks task : entry.getValue()) {
+            for (AsyncTask task : entry.getValue()) {
                 if (!hasEmptyVdsmId(task)) {
-                    tasksInDbAfterRestart.putIfAbsent(task.getStoragePoolId(), 
new ArrayList<AsyncTasks>());
+                    tasksInDbAfterRestart.putIfAbsent(task.getStoragePoolId(), 
new ArrayList<AsyncTask>());
                     
tasksInDbAfterRestart.get(task.getStoragePoolId()).add(task);
                 }
             }
@@ -202,7 +202,7 @@
         if (_tasks != null) {
             for (SPMTask task : _tasks.values()) {
                 if (isCurrentTaskLookedFor(id, task)
-                        && 
type.equals(task.getParameters().getDbAsyncTask().getaction_type())) {
+                        && 
type.equals(task.getParameters().getDbAsyncTask().getActionType())) {
                     return true;
                 }
             }
@@ -210,7 +210,7 @@
         return false;
     }
 
-    public void handleTasksOfCommandWithEmptyVdsmId(final List<AsyncTasks> 
tasks) {
+    public void handleTasksOfCommandWithEmptyVdsmId(final List<AsyncTask> 
tasks) {
         ThreadPoolUtil.execute(new Runnable() {
             @SuppressWarnings("synthetic-access")
             @Override
@@ -220,7 +220,7 @@
                     public Object runInTransaction() {
                         try {
                             boolean isPartiallySubmittedCommand = 
isPartiallySubmittedCommand(tasks);
-                            for (AsyncTasks task : tasks) {
+                            for (AsyncTask task : tasks) {
                                 
handleTaskOfCommandWithEmptyVdsmId(isPartiallySubmittedCommand, task);
                             }
                             return null;
@@ -240,8 +240,8 @@
      * @param tasks
      * @return
      */
-    private boolean isPartiallySubmittedCommand(List<AsyncTasks> tasks) {
-        for (AsyncTasks task : tasks) {
+    private boolean isPartiallySubmittedCommand(List<AsyncTask> tasks) {
+        for (AsyncTask task : tasks) {
             // if one of the tasks has a vdsm id, the command was partially
             // submitted to vdsm
             if (!hasEmptyVdsmId(task)) {
@@ -257,9 +257,9 @@
      * @param tasksInDB
      * @return
      */
-    private Map<Guid, List<AsyncTasks>> 
groupTasksByRootCommandId(List<AsyncTasks> tasksInDB) {
-        Map<Guid, List<AsyncTasks>> rootCommandIdToCommandsMap = new 
HashMap<>();
-        for (AsyncTasks task : tasksInDB) {
+    private Map<Guid, List<AsyncTask>> 
groupTasksByRootCommandId(List<AsyncTask> tasksInDB) {
+        Map<Guid, List<AsyncTask>> rootCommandIdToCommandsMap = new 
HashMap<>();
+        for (AsyncTask task : tasksInDB) {
             MultiValueMapUtils.addToMap(task.getRootCommandId(), task, 
rootCommandIdToCommandsMap);
         }
         return rootCommandIdToCommandsMap;
@@ -270,8 +270,8 @@
      * @param tasks
      * @return
      */
-    private boolean hasTasksWithoutVdsmId(List<AsyncTasks> tasks) {
-        for (AsyncTasks task : tasks) {
+    private boolean hasTasksWithoutVdsmId(List<AsyncTask> tasks) {
+        for (AsyncTask task : tasks) {
             if (hasEmptyVdsmId(task)) {
                 return true;
             }
@@ -279,7 +279,7 @@
         return false;
     }
 
-    private static boolean hasEmptyVdsmId(AsyncTasks task) {
+    private static boolean hasEmptyVdsmId(AsyncTask task) {
         return Guid.Empty.equals(task.getVdsmTaskId());
     }
 
@@ -297,7 +297,7 @@
      */
     private void handleTaskOfCommandWithEmptyVdsmId(
             final boolean isPartiallySubmittedCommand,
-            final AsyncTasks task) {
+            final AsyncTask task) {
         if (isPartiallySubmittedCommand) {
             if (hasEmptyVdsmId(task)) {
                 removeTaskFromDbByTaskId(task.getTaskId());
@@ -318,31 +318,31 @@
     }
 
     public void logAndFailTaskOfCommandWithEmptyVdsmId(Guid asyncTaskId, 
String message) {
-        AsyncTasks task = coco.getAsyncTaskFromDb(asyncTaskId);
+        AsyncTask task = coco.getAsyncTaskFromDb(asyncTaskId);
         if (task != null) {
             logAndFailTaskOfCommandWithEmptyVdsmId(task, message);
         }
     }
 
-    public void logAndFailTaskOfCommandWithEmptyVdsmId(final AsyncTasks task, 
String message) {
+    public void logAndFailTaskOfCommandWithEmptyVdsmId(final AsyncTask task, 
String message) {
         log.infoFormat(
                 "Failing task with empty vdsm id AsyncTaskType {0} : Task 
'{1}' Parent Command {2}",
                 task.getTaskType(),
                 task.getTaskId(),
-                (task.getaction_type()));
+                (task.getActionType()));
         task.getTaskParameters().setTaskGroupSuccess(false);
-        if (task.getaction_type() == VdcActionType.Unknown) {
+        if (task.getActionType() == VdcActionType.Unknown) {
             removeTaskFromDbByTaskId(task.getTaskId());
             log.infoFormat(
                     "Not calling endAction for task with out vdsm id and 
AsyncTaskType {0} : Task '{1}' Parent Command {2}",
                     task.getTaskType(),
                     task.getTaskId(),
-                    (task.getaction_type()));
+                    (task.getActionType()));
             return;
         }
         log.infoFormat("Calling updateTask for task with out vdsm id and 
AsyncTaskType {0} : Task '{1}' Parent Command {2} Parameters class {3}", 
task.getTaskType(),
                     task.getTaskId(),
-                    (task.getaction_type()));
+                    (task.getActionType()));
         AsyncTaskCreationInfo creationInfo = new 
AsyncTaskCreationInfo(Guid.Empty, task.getTaskType(), task.getStoragePoolId());
         SPMTask spmTask = coco.construct(creationInfo, task);
         AsyncTaskStatus failureStatus = new AsyncTaskStatus();
@@ -354,12 +354,12 @@
         spmTask.updateTask(failureStatus);
     }
 
-    private static VdcActionType getEndActionType(AsyncTasks dbAsyncTask) {
+    private static VdcActionType getEndActionType(AsyncTask dbAsyncTask) {
         VdcActionType commandType = 
dbAsyncTask.getActionParameters().getCommandType();
         if (!VdcActionType.Unknown.equals(commandType)) {
             return commandType;
         }
-        return dbAsyncTask.getaction_type();
+        return dbAsyncTask.getActionType();
     }
 
     public static void removeTaskFromDbByTaskId(Guid taskId) {
@@ -387,7 +387,7 @@
 
             if (task.getParameters().getDbAsyncTask().getStartTime().getTime() 
< maxTime) {
                 AuditLogableBase logable = new AuditLogableBase();
-                logable.addCustomValue("CommandName", 
task.getParameters().getDbAsyncTask().getaction_type().toString());
+                logable.addCustomValue("CommandName", 
task.getParameters().getDbAsyncTask().getActionType().toString());
                 logable.addCustomValue("Date", 
task.getParameters().getDbAsyncTask().getStartTime().toString());
 
                 // if task is not finish and not unknown then it's in running
@@ -399,7 +399,7 @@
                     AuditLogDirector.log(logable, 
AuditLogType.TASK_STOPPING_ASYNC_TASK);
 
                     log.infoFormat("Cleaning zombie tasks: Stopping async task 
{0} that started at {1}",
-                            
task.getParameters().getDbAsyncTask().getaction_type(), task
+                            
task.getParameters().getDbAsyncTask().getActionType(), task
                                     
.getParameters().getDbAsyncTask().getStartTime());
 
                     task.stopTask(true);
@@ -407,7 +407,7 @@
                     AuditLogDirector.log(logable, 
AuditLogType.TASK_CLEARING_ASYNC_TASK);
 
                     log.infoFormat("Cleaning zombie tasks: Clearing async task 
{0} that started at {1}",
-                            
task.getParameters().getDbAsyncTask().getaction_type(), task
+                            
task.getParameters().getDbAsyncTask().getActionType(), task
                                     
.getParameters().getDbAsyncTask().getStartTime());
 
                     task.clearAsyncTask(true);
@@ -577,7 +577,7 @@
                 log.infoFormat(
                         "Adding task '{0}' (Parent Command {1}, Parameters 
Type {2}), {3}.",
                         task.getVdsmTaskId(),
-                        
(task.getParameters().getDbAsyncTask().getaction_type()),
+                        
(task.getParameters().getDbAsyncTask().getActionType()),
                         task.getParameters().getClass().getName(),
                         (task.getShouldPoll() ? "polling started."
                                 : "polling hasn't started yet."));
@@ -587,12 +587,12 @@
                 addTaskToMap(task.getVdsmTaskId(), task);
             } else {
                 SPMTask existingTask = _tasks.get(task.getVdsmTaskId());
-                if 
(existingTask.getParameters().getDbAsyncTask().getaction_type() == 
VdcActionType.Unknown
-                        && 
task.getParameters().getDbAsyncTask().getaction_type() != 
VdcActionType.Unknown) {
+                if 
(existingTask.getParameters().getDbAsyncTask().getActionType() == 
VdcActionType.Unknown
+                        && 
task.getParameters().getDbAsyncTask().getActionType() != VdcActionType.Unknown) 
{
                     log.infoFormat(
                             "Task '{0}' already exists with action type 
'Unknown', now overriding it with action type '{1}'",
                             task.getVdsmTaskId(),
-                            
task.getParameters().getDbAsyncTask().getaction_type());
+                            
task.getParameters().getDbAsyncTask().getActionType());
 
                     // Set the indication to true for logging _tasks status on
                     // next quartz execution.
@@ -695,7 +695,7 @@
                         try {
                             SPMTask task;
                             if 
(partiallyCompletedCommandTasks.containsKey(creationInfo.getVdsmTaskId())) {
-                                AsyncTasks asyncTaskInDb = 
partiallyCompletedCommandTasks.get(creationInfo.getVdsmTaskId());
+                                AsyncTask asyncTaskInDb = 
partiallyCompletedCommandTasks.get(creationInfo.getVdsmTaskId());
                                 task = coco.construct(creationInfo, 
asyncTaskInDb);
                                 if (task.getEntitiesMap() == null) {
                                     task.setEntitiesMap(new HashMap<Guid, 
VdcObjectType>());
@@ -743,9 +743,9 @@
         }
 
 
-        List<AsyncTasks> tasksInDForStoragePool = 
tasksInDbAfterRestart.get(sp.getId());
+        List<AsyncTask> tasksInDForStoragePool = 
tasksInDbAfterRestart.get(sp.getId());
         if (tasksInDForStoragePool != null) {
-            for (AsyncTasks task : tasksInDForStoragePool) {
+            for (AsyncTask task : tasksInDForStoragePool) {
                 if (!_tasks.containsKey(task.getVdsmTaskId())) {
                     coco.removeByVdsmTaskId(task.getVdsmTaskId());
                 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskUtils.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskUtils.java
index 88a80a2..c1211c2 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskUtils.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskUtils.java
@@ -7,8 +7,8 @@
 
 import org.ovirt.engine.core.bll.tasks.interfaces.SPMTask;
 import org.ovirt.engine.core.common.VdcObjectType;
+import org.ovirt.engine.core.common.businessentities.AsyncTask;
 import org.ovirt.engine.core.common.businessentities.AsyncTaskEntity;
-import org.ovirt.engine.core.common.businessentities.AsyncTasks;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.compat.TransactionScopeOption;
 import org.ovirt.engine.core.dal.dbbroker.DbFacade;
@@ -67,7 +67,7 @@
         return results;
     }
 
-    private static void addOrUpdateTaskInDB(AsyncTasks asyncTask) {
+    private static void addOrUpdateTaskInDB(AsyncTask asyncTask) {
         CommandCoordinatorUtil.addOrUpdateTaskInDB(asyncTask);
     }
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CoCoAsyncTaskHelper.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CoCoAsyncTaskHelper.java
index 639b6df..2194fe6 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CoCoAsyncTaskHelper.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CoCoAsyncTaskHelper.java
@@ -19,10 +19,10 @@
 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.AsyncTask;
 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.CommandEntity;
 import org.ovirt.engine.core.common.job.ExternalSystemType;
 import org.ovirt.engine.core.common.job.Step;
@@ -145,35 +145,20 @@
         }
     }
 
-    public List<AsyncTasks> getAllAsyncTasksFromDb(CommandCoordinator coco) {
-        List<AsyncTasks> asyncTasks = 
DbFacade.getInstance().getAsyncTaskDao().getAll();
-        for (AsyncTasks asyncTask : asyncTasks) {
-            map(coco.getCommandEntity(asyncTask.getCommandId()), asyncTask);
+    public List<AsyncTask> getAllAsyncTasksFromDb(CommandCoordinator coco) {
+        List<AsyncTask> asyncTasks = 
DbFacade.getInstance().getAsyncTaskDao().getAll();
+        for (AsyncTask asyncTask : asyncTasks) {
+            
asyncTask.setRootCmdEntity(getCommandEntity(asyncTask.getRootCommandId()));
+            
asyncTask.setChildCmdEntity(getCommandEntity(asyncTask.getCommandId()));
         }
         return asyncTasks;
     }
 
-    private void map(CommandEntity cmdEntity, AsyncTasks asyncTask) {
-        if (cmdEntity != null) {
-            asyncTask.setTaskParameters(cmdEntity.getCommandParameters());
-            asyncTask.setRootCommandId(cmdEntity.getRootCommandId());
-            asyncTask.setCommandStatus(cmdEntity.getCommandStatus());
-            asyncTask.setCommandType(cmdEntity.getCommandType());
-            asyncTask.setCreatedAt(cmdEntity.getCreatedAt());
-            asyncTask.setCallBackEnabled(cmdEntity.isCallBackEnabled());
+    private CommandEntity getCommandEntity(Guid cmdId) {
+        CommandEntity cmdEntity = coco.getCommandEntity(cmdId);
+        if (cmdEntity == null) {
+            cmdEntity = coco.createCommandEntity(cmdId, VdcActionType.Unknown, 
new VdcActionParametersBase());
         }
-    }
-
-    private CommandEntity map(AsyncTasks asyncTask, CommandEntity entity) {
-        CommandStatus status = entity == null ? asyncTask.getCommandStatus() : 
entity.getCommandStatus();
-        CommandEntity cmdEntity = entity == null ? new CommandEntity() : 
entity;
-        cmdEntity.setId(asyncTask.getCommandId());
-        cmdEntity.setCommandParameters(asyncTask.getTaskParameters());
-        cmdEntity.setRootCommandId(asyncTask.getRootCommandId());
-        cmdEntity.setCommandStatus(status);
-        cmdEntity.setCommandType(asyncTask.getCommandType());
-        cmdEntity.setCreatedAt(asyncTask.getCreatedAt());
-        cmdEntity.setCallBackEnabled(asyncTask.isCallBackEnabled());
         return cmdEntity;
     }
 
@@ -181,22 +166,24 @@
      * This method is always called from with in a transaction
      * @param asyncTask
      */
-    public void saveAsyncTaskToDb(final AsyncTasks asyncTask) {
+    public void saveAsyncTaskToDb(final AsyncTask asyncTask) {
         TransactionSupport.executeInScope(TransactionScopeOption.Required, new 
TransactionMethod<Void>() {
 
             @Override
             public Void runInTransaction() {
                 DbFacade.getInstance().getAsyncTaskDao().save(asyncTask);
-                coco.persistCommand(map(asyncTask, 
coco.getCommandEntity(asyncTask.getCommandId())));
+                coco.persistCommand(asyncTask.getRootCmdEntity());
+                coco.persistCommand(asyncTask.getChildCmdEntity());
                 return null;
             }
         });
     }
 
-    public AsyncTasks getAsyncTaskFromDb(Guid asyncTaskId) {
-        AsyncTasks asyncTask = 
DbFacade.getInstance().getAsyncTaskDao().get(asyncTaskId);
+    public AsyncTask getAsyncTaskFromDb(Guid asyncTaskId) {
+        AsyncTask asyncTask = 
DbFacade.getInstance().getAsyncTaskDao().get(asyncTaskId);
         if (asyncTask != null) {
-            map(coco.getCommandEntity(asyncTask.getCommandId()), asyncTask);
+            
asyncTask.setRootCmdEntity(getCommandEntity(asyncTask.getRootCommandId()));
+            
asyncTask.setChildCmdEntity(getCommandEntity(asyncTask.getCommandId()));
         }
         return asyncTask;
     }
@@ -206,12 +193,15 @@
 
             @Override
             public Integer runInTransaction() {
-                AsyncTasks asyncTask = 
DbFacade.getInstance().getAsyncTaskDao().get(taskId);
+                AsyncTask asyncTask = 
DbFacade.getInstance().getAsyncTaskDao().get(taskId);
                 int retVal = 
DbFacade.getInstance().getAsyncTaskDao().remove(taskId);
                 if (asyncTask != null && 
!Guid.isNullOrEmpty(asyncTask.getCommandId())) {
                     CommandEntity cmdEntity = 
coco.getCommandEntity(asyncTask.getCommandId());
                     if (cmdEntity != null && !cmdEntity.isCallBackEnabled()) {
                         coco.removeCommand(asyncTask.getCommandId());
+                        if 
(!coco.hasCommandEntitiesWithRootCommandId(asyncTask.getRootCommandId())) {
+                            coco.removeCommand(asyncTask.getRootCommandId());
+                        }
                     }
                 }
                 return retVal;
@@ -219,10 +209,11 @@
         });
     }
 
-    public AsyncTasks getByVdsmTaskId(Guid vdsmTaskId) {
-        AsyncTasks asyncTask = 
DbFacade.getInstance().getAsyncTaskDao().getByVdsmTaskId(vdsmTaskId);
+    public AsyncTask getByVdsmTaskId(Guid vdsmTaskId) {
+        AsyncTask asyncTask = 
DbFacade.getInstance().getAsyncTaskDao().getByVdsmTaskId(vdsmTaskId);
         if (asyncTask != null) {
-            map(coco.getCommandEntity(asyncTask.getCommandId()), asyncTask);
+            
asyncTask.setRootCmdEntity(getCommandEntity(asyncTask.getRootCommandId()));
+            
asyncTask.setChildCmdEntity(getCommandEntity(asyncTask.getCommandId()));
         }
         return asyncTask;
     }
@@ -232,12 +223,15 @@
 
             @Override
             public Integer runInTransaction() {
-                AsyncTasks asyncTask = 
DbFacade.getInstance().getAsyncTaskDao().getByVdsmTaskId(vdsmTaskId);
+                AsyncTask asyncTask = 
DbFacade.getInstance().getAsyncTaskDao().getByVdsmTaskId(vdsmTaskId);
                 int retVal = 
DbFacade.getInstance().getAsyncTaskDao().removeByVdsmTaskId(vdsmTaskId);
                 if (asyncTask != null && 
!Guid.isNullOrEmpty(asyncTask.getCommandId())) {
                     CommandEntity cmdEntity = 
coco.getCommandEntity(asyncTask.getCommandId());
                     if (cmdEntity != null && !cmdEntity.isCallBackEnabled()) {
                         coco.removeCommand(asyncTask.getCommandId());
+                        if 
(!coco.hasCommandEntitiesWithRootCommandId(asyncTask.getRootCommandId())) {
+                            coco.removeCommand(asyncTask.getRootCommandId());
+                        }
                     }
                 }
                 return retVal;
@@ -245,27 +239,24 @@
         });
     }
 
-    public void addOrUpdateTaskInDB(final AsyncTasks asyncTask) {
+    public void addOrUpdateTaskInDB(final AsyncTask asyncTask) {
         TransactionSupport.executeInScope(TransactionScopeOption.Required, new 
TransactionMethod<Void>() {
 
             @Override
             public Void runInTransaction() {
-                CommandEntity cmdEntity = 
coco.getCommandEntity(asyncTask.getCommandId());
-                if (asyncTask.getstatus() == AsyncTaskStatusEnum.finished) {
-                    cmdEntity.setCommandStatus(CommandStatus.SUCCEEDED);
-                }
-                coco.persistCommand(map(asyncTask, cmdEntity));
+                coco.persistCommand(asyncTask.getRootCmdEntity());
+                coco.persistCommand(asyncTask.getChildCmdEntity());
                 
DbFacade.getInstance().getAsyncTaskDao().saveOrUpdate(asyncTask);
                 return null;
             }
         });
     }
 
-    public AsyncTasks getAsyncTask(Guid taskId,
+    public AsyncTask getAsyncTask(Guid taskId,
             CommandBase command,
             AsyncTaskCreationInfo asyncTaskCreationInfo,
             VdcActionType parentCommand) {
-        AsyncTasks asyncTask = null;
+        AsyncTask asyncTask = null;
         if (!taskId.equals(Guid.Empty)) {
             asyncTask = getAsyncTaskFromDb(taskId);
         }
@@ -274,7 +265,7 @@
                 
command.getParameters().setCommandType(command.getActionType());
             }
             VdcActionParametersBase parentParameters = 
command.getParentParameters(parentCommand);
-            asyncTask.setaction_type(parentCommand);
+            asyncTask.setActionType(parentCommand);
             asyncTask.setVdsmTaskId(asyncTaskCreationInfo.getVdsmTaskId());
             asyncTask.setActionParameters(parentParameters);
             asyncTask.setTaskParameters(command.getParameters());
@@ -291,31 +282,52 @@
         return asyncTask;
     }
 
-    public AsyncTasks createAsyncTask(
+    public AsyncTask createAsyncTask(
             CommandBase command,
             AsyncTaskCreationInfo asyncTaskCreationInfo,
             VdcActionType parentCommand) {
+        Guid parentCommandId = command.getParameters().getParentParameters() 
== null ? Guid.Empty : 
command.getParameters().getParentParameters().getCommandId();
         VdcActionParametersBase parentParameters = 
command.getParentParameters(parentCommand);
         if 
(VdcActionType.Unknown.equals(command.getParameters().getCommandType())) {
             command.getParameters().setCommandType(command.getActionType());
         }
-        AsyncTasks asyncTask = new AsyncTasks(parentCommand,
-                AsyncTaskResultEnum.success,
+        AsyncTask asyncTask = new AsyncTask(AsyncTaskResultEnum.success,
                 AsyncTaskStatusEnum.running,
                 asyncTaskCreationInfo.getVdsmTaskId(),
-                parentParameters,
-                command.getParameters(),
                 asyncTaskCreationInfo.getStepId(),
-                command.getCommandId(),
-                command.getParameters().getParentParameters() == null ? 
Guid.Empty : command.getParameters().getParentParameters().getCommandId(),
                 asyncTaskCreationInfo.getStoragePoolID(),
                 asyncTaskCreationInfo.getTaskType(),
-                command.getCommandStatus());
+                getParentCommandEntity(parentCommandId,
+                        parentCommand,
+                        parentParameters),
+                getChildCommandEntity(command, parentCommand));
         return asyncTask;
     }
 
+    private CommandEntity getChildCommandEntity(CommandBase command, 
VdcActionType parentCommand) {
+        CommandEntity cmdEntity = 
coco.getCommandEntity(command.getCommandId());
+        if (cmdEntity == null) {
+            command.persistCommand(parentCommand, command.getCallBack() != 
null);
+        }
+        return coco.getCommandEntity(command.getCommandId());
+    }
+
+    private CommandEntity getParentCommandEntity(Guid cmdId,
+                                                 VdcActionType actionType,
+                                                 VdcActionParametersBase 
parameters) {
+        CommandEntity cmdEntity = coco.getCommandEntity(cmdId);
+        if (cmdEntity == null) {
+            cmdEntity = coco.createCommandEntity(cmdId, actionType, 
parameters);
+            if (!Guid.isNullOrEmpty(cmdId)) {
+                cmdEntity.setCommandStatus(CommandStatus.ACTIVE);
+                coco.persistCommand(cmdEntity);
+            }
+        }
+        return cmdEntity;
+    }
+
     public VdcReturnValueBase endAction(SPMTask task, ExecutionContext 
context) {
-        AsyncTasks dbAsyncTask = task.getParameters().getDbAsyncTask();
+        AsyncTask dbAsyncTask = task.getParameters().getDbAsyncTask();
         VdcActionType actionType = getEndActionType(dbAsyncTask);
         VdcActionParametersBase parameters = dbAsyncTask.getActionParameters();
         CommandBase<?> command = CommandsFactory.createCommand(actionType, 
parameters);
@@ -323,12 +335,12 @@
         return new DecoratedCommand(command).endAction();
     }
 
-    private VdcActionType getEndActionType(AsyncTasks dbAsyncTask) {
+    private VdcActionType getEndActionType(AsyncTask dbAsyncTask) {
         VdcActionType commandType = 
dbAsyncTask.getActionParameters().getCommandType();
         if (!VdcActionType.Unknown.equals(commandType)) {
             return commandType;
         }
-        return dbAsyncTask.getaction_type();
+        return dbAsyncTask.getActionType();
     }
 
     /**
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 2150847..18837af 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
@@ -15,7 +15,7 @@
 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.common.businessentities.AsyncTask;
 import org.ovirt.engine.core.common.errors.VdcBLLException;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.utils.log.Log;
@@ -56,11 +56,11 @@
 
         if (duringInit && isNewCommandAdded) {
             CommandBase<?> command =
-                    
CommandsFactory.createCommand(parameters.getDbAsyncTask().getaction_type(),
+                    
CommandsFactory.createCommand(parameters.getDbAsyncTask().getActionType(),
                             parameters.getDbAsyncTask().getActionParameters());
             if (!command.acquireLockAsyncTask()) {
                 log.warnFormat("Failed to acquire locks for command {0} with 
parameters {1}",
-                        parameters.getDbAsyncTask().getaction_type(),
+                        parameters.getDbAsyncTask().getActionType(),
                         parameters.getDbAsyncTask().getActionParameters());
             }
         }
@@ -118,7 +118,7 @@
         ExecutionContext context = null;
         boolean endActionRuntimeException = false;
 
-        AsyncTasks dbAsyncTask = getParameters().getDbAsyncTask();
+        AsyncTask dbAsyncTask = getParameters().getDbAsyncTask();
         ArrayList<VdcActionParametersBase> imagesParameters = new 
ArrayList<VdcActionParametersBase>();
         for (EndedTaskInfo taskInfo : 
entityInfo.getEndedTasksInfo().getTasksInfo()) {
             VdcActionParametersBase childTaskParameters =
@@ -175,12 +175,12 @@
         }
     }
 
-    private VdcActionType getEndActionType(AsyncTasks dbAsyncTask) {
+    private VdcActionType getEndActionType(AsyncTask dbAsyncTask) {
         VdcActionType commandType = 
dbAsyncTask.getActionParameters().getCommandType();
         if (!VdcActionType.Unknown.equals(commandType)) {
             return commandType;
         }
-        return dbAsyncTask.getaction_type();
+        return dbAsyncTask.getActionType();
     }
 
     private String getErrorMessage() {
@@ -188,9 +188,9 @@
                 
getParameters().getDbAsyncTask().getActionParameters().getCommandType());
     }
 
-    private void handleEndActionRuntimeException(CommandMultiAsyncTasks 
commandInfo, AsyncTasks dbAsyncTask) {
+    private void handleEndActionRuntimeException(CommandMultiAsyncTasks 
commandInfo, AsyncTask dbAsyncTask) {
         try {
-            VdcActionType actionType = 
getParameters().getDbAsyncTask().getaction_type();
+            VdcActionType actionType = 
getParameters().getDbAsyncTask().getActionType();
             log.infoFormat(
                     "CommandAsyncTask::HandleEndActionResult: endAction for 
action type '{0}' threw an unrecoverable RuntimeException the task will be 
cleared.",
                     actionType);
@@ -215,7 +215,7 @@
             ExecutionContext context,
             boolean isTaskGroupSuccess) {
         try {
-            VdcActionType actionType = 
getParameters().getDbAsyncTask().getaction_type();
+            VdcActionType actionType = 
getParameters().getDbAsyncTask().getActionType();
             log.infoFormat(
                     "CommandAsyncTask::HandleEndActionResult [within thread]: 
endAction for action type '{0}' completed, handling the result.",
                     actionType);
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 43f5739..25b560e 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
@@ -24,8 +24,8 @@
 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.AsyncTask;
 import org.ovirt.engine.core.common.businessentities.AsyncTaskStatus;
-import org.ovirt.engine.core.common.businessentities.AsyncTasks;
 import org.ovirt.engine.core.common.businessentities.CommandEntity;
 import org.ovirt.engine.core.common.vdscommands.IrsBaseVDSCommandParameters;
 import 
org.ovirt.engine.core.common.vdscommands.SPMTaskGuidBaseVDSCommandParameters;
@@ -62,12 +62,18 @@
 
     @Override
     public void persistCommand(CommandEntity cmdEntity, CommandContext 
cmdContext) {
+        if (Guid.isNullOrEmpty(cmdEntity.getId())) {
+            return;
+        }
         persistCommand(cmdEntity);
         saveCommandContext(cmdEntity.getId(), cmdContext);
     }
 
     @Override
     public void persistCommand(CommandEntity cmdEntity) {
+        if (Guid.isNullOrEmpty(cmdEntity.getId())) {
+            return;
+        }
         CommandEntity existingCmdEntity = commandsCache.get(cmdEntity.getId());
         if (existingCmdEntity != null) {
             cmdEntity.setExecuted(existingCmdEntity.isExecuted());
@@ -106,7 +112,16 @@
 
     @Override
     public CommandEntity getCommandEntity(Guid commandId) {
-        return commandsCache.get(commandId);
+        return Guid.isNullOrEmpty(commandId) ? null : 
commandsCache.get(commandId);
+    }
+
+    @Override
+    public CommandEntity createCommandEntity(Guid cmdId, VdcActionType 
actionType, VdcActionParametersBase params) {
+        CommandEntity cmdEntity = new CommandEntity();
+        cmdEntity.setId(cmdId);
+        cmdEntity.setCommandType(actionType);
+        cmdEntity.setCommandParameters(params);
+        return cmdEntity;
     }
 
     public List<CommandEntity> getCommandsWithCallBackEnabled() {
@@ -191,6 +206,19 @@
         commandsCache.updateCallBackNotified(commandId);
     }
 
+    public boolean hasCommandEntitiesWithRootCommandId(Guid rootCommandId) {
+        CommandEntity cmdEntity;
+        for (Guid cmdId : commandsCache.keySet()) {
+            cmdEntity = commandsCache.get(cmdId);
+            if (cmdEntity != null && 
!Guid.isNullOrEmpty(cmdEntity.getRootCommandId()) &&
+                    !cmdEntity.getRootCommandId().equals(cmdId) &&
+                    cmdEntity.getRootCommandId().equals(rootCommandId)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     public List<Guid> getChildCommandIds(Guid cmdId) {
         initChildHierarchy();
         List<Guid> childIds = Collections.EMPTY_LIST;
@@ -235,15 +263,15 @@
         }
     }
 
-    public List<AsyncTasks> getAllAsyncTasksFromDb() {
+    public List<AsyncTask> getAllAsyncTasksFromDb() {
         return coCoAsyncTaskHelper.getAllAsyncTasksFromDb(this);
     }
 
-    public void saveAsyncTaskToDb(final AsyncTasks asyncTask) {
+    public void saveAsyncTaskToDb(final AsyncTask asyncTask) {
         coCoAsyncTaskHelper.saveAsyncTaskToDb(asyncTask);
     }
 
-    public AsyncTasks getAsyncTaskFromDb(Guid asyncTaskId) {
+    public AsyncTask getAsyncTaskFromDb(Guid asyncTaskId) {
         return coCoAsyncTaskHelper.getAsyncTaskFromDb(asyncTaskId);
     }
 
@@ -251,7 +279,7 @@
         return coCoAsyncTaskHelper.removeTaskFromDbByTaskId(taskId);
     }
 
-    public AsyncTasks getByVdsmTaskId(Guid vdsmTaskId) {
+    public AsyncTask getByVdsmTaskId(Guid vdsmTaskId) {
         return coCoAsyncTaskHelper.getByVdsmTaskId(vdsmTaskId);
     }
 
@@ -259,7 +287,7 @@
         return coCoAsyncTaskHelper.removeByVdsmTaskId(vdsmTaskId);
     }
 
-    public void addOrUpdateTaskInDB(final AsyncTasks asyncTask) {
+    public void addOrUpdateTaskInDB(final AsyncTask asyncTask) {
         coCoAsyncTaskHelper.addOrUpdateTaskInDB(asyncTask);
     }
 
@@ -267,7 +295,7 @@
         return coCoAsyncTaskHelper.createTask(taskType, taskParameters);
     }
 
-    public AsyncTasks getAsyncTask(
+    public AsyncTask getAsyncTask(
             Guid taskId,
             CommandBase command,
             AsyncTaskCreationInfo asyncTaskCreationInfo,
@@ -275,7 +303,7 @@
         return coCoAsyncTaskHelper.getAsyncTask(taskId, command, 
asyncTaskCreationInfo, parentCommand);
     }
 
-    public AsyncTasks createAsyncTask(
+    public AsyncTask createAsyncTask(
             CommandBase command,
             AsyncTaskCreationInfo asyncTaskCreationInfo,
             VdcActionType parentCommand) {
@@ -342,7 +370,7 @@
     }
 
     @Override
-    public SPMTask construct(AsyncTaskCreationInfo creationInfo, AsyncTasks 
asyncTask) {
+    public SPMTask construct(AsyncTaskCreationInfo creationInfo, AsyncTask 
asyncTask) {
         return AsyncTaskFactory.construct(this, creationInfo.getTaskType(), 
new AsyncTaskParameters(creationInfo, asyncTask), true);
     }
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorUtil.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorUtil.java
index 97672a7..f23a173 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorUtil.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorUtil.java
@@ -13,8 +13,8 @@
 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.businessentities.AsyncTask;
 import org.ovirt.engine.core.common.businessentities.AsyncTaskStatus;
-import org.ovirt.engine.core.common.businessentities.AsyncTasks;
 import org.ovirt.engine.core.common.businessentities.CommandEntity;
 import org.ovirt.engine.core.common.businessentities.StoragePool;
 import org.ovirt.engine.core.compat.CommandStatus;
@@ -88,7 +88,7 @@
         coco.revertTasks(command);
     }
 
-    public static AsyncTasks getAsyncTask(
+    public static AsyncTask getAsyncTask(
             Guid taskId,
             CommandBase command,
             AsyncTaskCreationInfo asyncTaskCreationInfo,
@@ -96,7 +96,7 @@
         return coco.getAsyncTask(taskId, command, asyncTaskCreationInfo, 
parentCommand);
     }
 
-    public static AsyncTasks createAsyncTask(
+    public static AsyncTask createAsyncTask(
             CommandBase command,
             AsyncTaskCreationInfo asyncTaskCreationInfo,
             VdcActionType parentCommand) {
@@ -107,7 +107,7 @@
         getAsyncTaskManager().logAndFailTaskOfCommandWithEmptyVdsmId(taskId, 
message);
     }
 
-    public static void logAndFailTaskOfCommandWithEmptyVdsmId(AsyncTasks task, 
String message) {
+    public static void logAndFailTaskOfCommandWithEmptyVdsmId(AsyncTask task, 
String message) {
         getAsyncTaskManager().logAndFailTaskOfCommandWithEmptyVdsmId(task, 
message);
     }
 
@@ -115,11 +115,11 @@
         AsyncTaskManager.removeTaskFromDbByTaskId(taskId);
     }
 
-    public static AsyncTasks getAsyncTaskFromDb(Guid asyncTaskId) {
+    public static AsyncTask getAsyncTaskFromDb(Guid asyncTaskId) {
          return coco.getAsyncTaskFromDb(asyncTaskId);
     }
 
-    public static void saveAsyncTaskToDb(AsyncTasks asyncTask) {
+    public static void saveAsyncTaskToDb(AsyncTask asyncTask) {
         coco.saveAsyncTaskToDb(asyncTask);
     }
 
@@ -127,7 +127,7 @@
         return coco.removeTaskFromDbByTaskId(taskId);
     }
 
-    public static void addOrUpdateTaskInDB(AsyncTasks asyncTask) {
+    public static void addOrUpdateTaskInDB(AsyncTask asyncTask) {
         coco.addOrUpdateTaskInDB(asyncTask);
     }
 
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 d19dc9b..ce9f272 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
@@ -202,7 +202,7 @@
                             getVdsmTaskId(),
                             getState(),
                             (getParameters().getDbAsyncTask()
-                                    .getaction_type()),
+                                    .getActionType()),
                             getParameters()
                                     .getClass().getName()),
                     e);
@@ -279,7 +279,7 @@
         log.infoFormat(
                 "BaseAsyncTask::onTaskEndSuccess: Task '{0}' (Parent Command 
{1}, Parameters Type {2}) ended successfully.",
                 getVdsmTaskId(),
-                (getParameters().getDbAsyncTask().getaction_type()),
+                (getParameters().getDbAsyncTask().getActionType()),
                 getParameters()
                         .getClass().getName());
     }
@@ -294,7 +294,7 @@
                 "BaseAsyncTask::logEndTaskFailure: Task '{0}' (Parent Command 
{1}, Parameters Type {2}) ended with failure:"
                         + "\r\n" + "-- Result: '{3}'" + "\r\n" + "-- Message: 
'{4}'," + "\r\n" + "-- Exception: '{5}'",
                 getVdsmTaskId(),
-                (getParameters().getDbAsyncTask().getaction_type()),
+                (getParameters().getDbAsyncTask().getActionType()),
                 getParameters()
                         .getClass().getName(),
                 getLastTaskStatus().getResult(),
@@ -312,7 +312,7 @@
         log.errorFormat(
                 "BaseAsyncTask::logTaskDoesntExist: Task '{0}' (Parent Command 
{1}, Parameters Type {2}) does not exist.",
                 getVdsmTaskId(),
-                (getParameters().getDbAsyncTask().getaction_type()),
+                (getParameters().getDbAsyncTask().getActionType()),
                 getParameters()
                         .getClass().getName());
     }
@@ -334,7 +334,7 @@
 
             log.errorFormat("SPMAsyncTask::PollTask: Task '{0}' (Parent 
Command {1}, Parameters Type {2}) " +
                         "was not found in VDSM, will change its status to 
unknown.",
-                        getVdsmTaskId(), 
(getParameters().getDbAsyncTask().getaction_type()),
+                        getVdsmTaskId(), 
(getParameters().getDbAsyncTask().getActionType()),
                         getParameters().getClass().getName());
         } else {
             returnedStatusTask = cachedStatusTask;
@@ -360,7 +360,7 @@
                     formatString,
                     getVdsmTaskId(),
                     (getParameters().getDbAsyncTask()
-                            .getaction_type()),
+                            .getActionType()),
                     getParameters().getClass().getName(),
                     cachedStatusTask.getStatus(),
                     ((cachedStatusTask.getStatus() == 
AsyncTaskStatusEnum.finished) ? (String
@@ -373,7 +373,7 @@
                     formatString,
                     getVdsmTaskId(),
                     (getParameters().getDbAsyncTask()
-                            .getaction_type()),
+                            .getActionType()),
                     getParameters().getClass().getName(),
                     cachedStatusTask.getStatus(),
                     ((cachedStatusTask.getStatus() == 
AsyncTaskStatusEnum.finished) ? (String
@@ -393,7 +393,7 @@
                 log.infoFormat(
                         "SPMAsyncTask::StopTask: Attempting to stop task '{0}' 
(Parent Command {1}, Parameters Type {2}).",
                         getVdsmTaskId(),
-                        (getParameters().getDbAsyncTask().getaction_type()),
+                        (getParameters().getDbAsyncTask().getActionType()),
                         getParameters().getClass().getName());
 
                 coco.stopTask(getStoragePoolID(), getVdsmTaskId());
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/AsyncTaskCRUDOperations.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/AsyncTaskCRUDOperations.java
index 12af4a8..7f24e4b 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/AsyncTaskCRUDOperations.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/AsyncTaskCRUDOperations.java
@@ -1,16 +1,16 @@
 package org.ovirt.engine.core.bll.tasks.interfaces;
 
-import org.ovirt.engine.core.common.businessentities.AsyncTasks;
+import org.ovirt.engine.core.common.businessentities.AsyncTask;
 import org.ovirt.engine.core.compat.Guid;
 
 import java.util.List;
 
 public interface AsyncTaskCRUDOperations {
-    public abstract List<AsyncTasks> getAllAsyncTasksFromDb();
-    public abstract void saveAsyncTaskToDb(AsyncTasks asyncTask);
-    public abstract AsyncTasks getAsyncTaskFromDb(Guid asyncTaskId);
+    public abstract List<AsyncTask> getAllAsyncTasksFromDb();
+    public abstract void saveAsyncTaskToDb(AsyncTask asyncTask);
+    public abstract AsyncTask getAsyncTaskFromDb(Guid asyncTaskId);
     public abstract int removeTaskFromDbByTaskId(Guid taskId) throws 
RuntimeException;
-    public abstract AsyncTasks getByVdsmTaskId(Guid vdsmTaskId);
+    public abstract AsyncTask getByVdsmTaskId(Guid vdsmTaskId);
     public abstract int removeByVdsmTaskId(Guid vdsmTaskId);
-    public abstract void addOrUpdateTaskInDB(AsyncTasks asyncTask);
+    public abstract void addOrUpdateTaskInDB(AsyncTask asyncTask);
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CommandCRUDOperations.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CommandCRUDOperations.java
index f833c2c..aff8279 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CommandCRUDOperations.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CommandCRUDOperations.java
@@ -2,6 +2,8 @@
 
 import org.ovirt.engine.core.bll.CommandBase;
 import org.ovirt.engine.core.bll.context.CommandContext;
+import org.ovirt.engine.core.common.action.VdcActionParametersBase;
+import org.ovirt.engine.core.common.action.VdcActionType;
 import org.ovirt.engine.core.common.businessentities.CommandEntity;
 import org.ovirt.engine.core.compat.CommandStatus;
 import org.ovirt.engine.core.compat.DateTime;
@@ -10,6 +12,8 @@
 import java.util.List;
 
 public interface CommandCRUDOperations {
+    public boolean hasCommandEntitiesWithRootCommandId(Guid rootCommandId);
+    public CommandEntity createCommandEntity(Guid cmdId, VdcActionType 
actionType, VdcActionParametersBase params);
     public List<Guid> getChildCommandIds(Guid commandId);
     public CommandEntity getCommandEntity(Guid commandId);
     public CommandStatus getCommandStatus(Guid 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 99f96d6..94c875b 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
@@ -10,8 +10,8 @@
 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.AsyncTask;
 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;
 
@@ -48,20 +48,20 @@
 
     void revertTasks(CommandBase command);
 
-    AsyncTasks getAsyncTask(
+    AsyncTask getAsyncTask(
             Guid taskId,
             CommandBase command,
             AsyncTaskCreationInfo asyncTaskCreationInfo,
             VdcActionType parentCommand);
 
-    public AsyncTasks createAsyncTask(
+    public AsyncTask createAsyncTask(
             CommandBase command,
             AsyncTaskCreationInfo asyncTaskCreationInfo,
             VdcActionType parentCommand);
 
     SPMTask construct(AsyncTaskCreationInfo creationInfo);
 
-    SPMTask construct(AsyncTaskCreationInfo creationInfo, AsyncTasks 
asyncTask);
+    SPMTask construct(AsyncTaskCreationInfo creationInfo, AsyncTask asyncTask);
 
     SPMTask construct(AsyncTaskType taskType, AsyncTaskParameters 
asyncTaskParams, boolean duringInit);
 
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/BackwardCompatibilityTaskCreationTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/BackwardCompatibilityTaskCreationTest.java
index 031b0b2..948860d 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/BackwardCompatibilityTaskCreationTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/BackwardCompatibilityTaskCreationTest.java
@@ -46,6 +46,7 @@
 import org.ovirt.engine.core.dal.dbbroker.DbFacade;
 import org.ovirt.engine.core.dal.dbbroker.DbFacadeLocator;
 import org.ovirt.engine.core.dao.AsyncTaskDAO;
+import org.ovirt.engine.core.dao.CommandEntityDao;
 import org.ovirt.engine.core.utils.MockConfigRule;
 import org.ovirt.engine.core.utils.MockEJBStrategyRule;
 import org.ovirt.engine.core.utils.RandomUtils;
@@ -84,6 +85,9 @@
         AsyncTaskDAO asyncTaskDao = mock(AsyncTaskDAO.class);
         when(asyncTaskDao.getAll()).thenReturn(Collections.EMPTY_LIST);
         when(dbFacade.getAsyncTaskDao()).thenReturn(asyncTaskDao);
+        CommandEntityDao cmdEntityDao = mock(CommandEntityDao.class);
+        when(dbFacade.getCommandEntityDao()).thenReturn(cmdEntityDao);
+        when(cmdEntityDao.getAll()).thenReturn(Collections.EMPTY_LIST);
     }
 
     @SuppressWarnings({ "unchecked", "rawtypes"})
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskParameters.java
index 0147e8f..42aa392 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskParameters.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskParameters.java
@@ -2,17 +2,17 @@
 
 import java.io.Serializable;
 
-import org.ovirt.engine.core.common.businessentities.AsyncTasks;
+import org.ovirt.engine.core.common.businessentities.AsyncTask;
 import org.ovirt.engine.core.compat.Guid;
 
 public class AsyncTaskParameters implements Serializable {
-    private AsyncTasks privateDbAsyncTask;
+    private AsyncTask privateDbAsyncTask;
 
-    public AsyncTasks getDbAsyncTask() {
+    public AsyncTask getDbAsyncTask() {
         return privateDbAsyncTask;
     }
 
-    protected void setDbAsyncTask(AsyncTasks value) {
+    protected void setDbAsyncTask(AsyncTask value) {
         privateDbAsyncTask = value;
     }
 
@@ -26,7 +26,7 @@
         privateCreationInfo = value;
     }
 
-    public AsyncTaskParameters(AsyncTaskCreationInfo info, AsyncTasks 
dbAsyncTask) {
+    public AsyncTaskParameters(AsyncTaskCreationInfo info, AsyncTask 
dbAsyncTask) {
         setCreationInfo(info);
         setDbAsyncTask(dbAsyncTask);
     }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/AsyncTasks.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/AsyncTask.java
similarity index 68%
rename from 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/AsyncTasks.java
rename to 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/AsyncTask.java
index b24c61e..837821d 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/AsyncTasks.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/AsyncTask.java
@@ -10,69 +10,59 @@
 import org.ovirt.engine.core.compat.CommandStatus;
 import org.ovirt.engine.core.compat.Guid;
 
-public class AsyncTasks implements Serializable {
+public class AsyncTask implements Serializable {
     private static final long serialVersionUID = 5913365704117183118L;
-    private CommandEntity cmdEntity;
-    private VdcActionType actionType;
     private AsyncTaskResultEnum result;
-    private Date startTime;
+    private AsyncTaskStatusEnum status;
     private Guid vdsmTaskId;
     private Guid storagePoolId;
-    private VdcActionParametersBase actionParameters;
     private Guid taskId;
     private Guid commandId;
+    private Guid rootCommandId;
     private Guid stepId;
     private AsyncTaskType taskType;
+    private Date startTime;
+    private CommandEntity rootCmdEntity;
+    private CommandEntity childCmdEntity;
 
-    public AsyncTasks() {
-        actionType = VdcActionType.Unknown;
+    public AsyncTask() {
         result = AsyncTaskResultEnum.success;
         status = AsyncTaskStatusEnum.unknown;
         vdsmTaskId = Guid.Empty;
         commandId = Guid.Empty;
-        cmdEntity = new CommandEntity();
-        cmdEntity.setId(commandId);
-        cmdEntity.setRootCommandId(Guid.Empty);
-        cmdEntity.setCommandType(VdcActionType.Unknown);
+        rootCommandId = Guid.Empty;
+        rootCmdEntity = new CommandEntity();
+        childCmdEntity = new CommandEntity();
     }
 
-    public AsyncTasks(VdcActionType action_type,
-                      AsyncTaskResultEnum result,
-                      AsyncTaskStatusEnum status,
-                      Guid vdsmTaskId,
-                      VdcActionParametersBase parentParameters,
-                      VdcActionParametersBase taskParameters,
-                      Guid stepId,
-                      Guid commandId,
-                      Guid rootCommandId,
-                      Guid storagePoolId,
-                      AsyncTaskType taskType,
-                      CommandStatus cmdStatus) {
-        this.actionType = action_type;
+    public AsyncTask(AsyncTaskResultEnum result,
+                     AsyncTaskStatusEnum status,
+                     Guid vdsmTaskId,
+                     Guid stepId,
+                     Guid storagePoolId,
+                     AsyncTaskType taskType,
+                     CommandEntity rootCmdEntity,
+                     CommandEntity childCmdEntity) {
         this.result = result;
         this.status = status;
         this.vdsmTaskId = vdsmTaskId;
-        this.actionParameters = parentParameters;
         this.stepId = stepId;
         this.startTime = new Date();
-        this.commandId = commandId;
+        this.commandId = childCmdEntity.getId();
+        this.rootCommandId = rootCmdEntity.getId();
         this.storagePoolId = storagePoolId;
         this.taskId = Guid.newGuid();
         this.taskType = taskType;
-        cmdEntity = new CommandEntity();
-        cmdEntity.setId(commandId);
-        cmdEntity.setRootCommandId(rootCommandId);
-        cmdEntity.setCommandStatus(cmdStatus);
-        cmdEntity.setCommandParameters(taskParameters);
-        cmdEntity.setCommandType(taskParameters.getCommandType());
+        this.rootCmdEntity = rootCmdEntity;
+        this.childCmdEntity = childCmdEntity;
     }
 
-    public VdcActionType getaction_type() {
-        return actionType;
+    public VdcActionType getActionType() {
+        return rootCmdEntity.getCommandType();
     }
 
-    public void setaction_type(VdcActionType value) {
-        this.actionType = value;
+    public void setActionType(VdcActionType value) {
+        this.rootCmdEntity.setCommandType(value);
     }
 
     public Date getStartTime() {
@@ -90,8 +80,6 @@
     public void setresult(AsyncTaskResultEnum value) {
         this.result = value;
     }
-
-    private AsyncTaskStatusEnum status;
 
     public AsyncTaskStatusEnum getstatus() {
         return this.status;
@@ -118,19 +106,19 @@
     }
 
     public VdcActionParametersBase getActionParameters() {
-        return actionParameters;
+        return rootCmdEntity.getCommandParameters();
     }
 
     public void setActionParameters(VdcActionParametersBase value) {
-        this.actionParameters = value;
+        this.rootCmdEntity.setCommandParameters(value);
     }
 
     public VdcActionParametersBase getTaskParameters() {
-        return cmdEntity.getCommandParameters();
+        return childCmdEntity.getCommandParameters();
     }
 
     public void setTaskParameters(VdcActionParametersBase value) {
-        cmdEntity.setCommandParameters(value);
+        childCmdEntity.setCommandParameters(value);
     }
 
     public Guid getStepId() {
@@ -146,39 +134,39 @@
         if (!VdcActionType.Unknown.equals(commandType)) {
             return commandType;
         }
-        return getaction_type();
+        return getActionType();
     }
 
     public CommandStatus getCommandStatus() {
-        return cmdEntity.getCommandStatus();
+        return childCmdEntity.getCommandStatus();
     }
 
     public void setCommandStatus(CommandStatus status) {
-        cmdEntity.setCommandStatus(status);
+        childCmdEntity.setCommandStatus(status);
     }
 
     public void setCommandType(VdcActionType cmdType) {
-        cmdEntity.setCommandType(cmdType);
+        childCmdEntity.setCommandType(cmdType);
     }
 
     public VdcActionType getCommandType() {
-        return cmdEntity.getCommandType();
+        return childCmdEntity.getCommandType();
     }
 
     public void setCreatedAt(Date createdAt) {
-        cmdEntity.setCreatedAt(createdAt);
+        childCmdEntity.setCreatedAt(createdAt);
     }
 
     public Date getCreatedAt() {
-        return cmdEntity.getCreatedAt();
+        return childCmdEntity.getCreatedAt();
     }
 
     public Guid getRootCommandId() {
-        return cmdEntity.getRootCommandId();
+        return rootCommandId;
     }
 
     public void setRootCommandId(Guid rootCommandId) {
-        cmdEntity.setRootCommandId(rootCommandId);
+        this.rootCommandId = rootCommandId;
     }
 
     public Guid getCommandId() {
@@ -187,7 +175,6 @@
 
     public void setCommandId(Guid commandId) {
         this.commandId = commandId;
-        this.cmdEntity.setId(commandId);
     }
 
     public Guid getStoragePoolId() {
@@ -207,11 +194,11 @@
     }
 
     public void setCallBackEnabled(boolean enabled) {
-        cmdEntity.setCallBackEnabled(enabled);
+        childCmdEntity.setCallBackEnabled(enabled);
     }
 
     public boolean isCallBackEnabled() {
-        return cmdEntity.isCallBackEnabled();
+        return childCmdEntity.isCallBackEnabled();
     }
 
     @Override
@@ -221,7 +208,7 @@
         results = prime * results + ((vdsmTaskId == null) ? 0 : 
vdsmTaskId.hashCode());
         results = prime * results + ((stepId == null) ? 0 : stepId.hashCode());
         results = prime * results + ((commandId == null) ? 0 : 
commandId.hashCode());
-        results = prime * results + ((actionType == null) ? 0 : 
actionType.hashCode());
+        results = prime * results + ((rootCmdEntity.getCommandType() == null) 
? 0 : rootCmdEntity.getCommandType().hashCode());
         results = prime * results + ((result == null) ? 0 : result.hashCode());
         results = prime * results + ((status == null) ? 0 : status.hashCode());
         results = prime * results + ((startTime == null) ? 0 : 
startTime.hashCode());
@@ -241,16 +228,32 @@
         if (getClass() != obj.getClass()) {
             return false;
         }
-        AsyncTasks other = (AsyncTasks) obj;
+        AsyncTask other = (AsyncTask) obj;
         return (ObjectUtils.objectsEqual(vdsmTaskId, other.vdsmTaskId)
                 && ObjectUtils.objectsEqual(taskId, other.taskId)
                 && ObjectUtils.objectsEqual(stepId, other.stepId)
                 && ObjectUtils.objectsEqual(commandId, other.commandId)
-                && actionType == other.actionType
+                && ObjectUtils.objectsEqual(rootCommandId, other.rootCommandId)
                 && result == other.result
                 && status == other.status
                 && ObjectUtils.objectsEqual(startTime, other.startTime)
                 && ObjectUtils.objectsEqual(storagePoolId, other.storagePoolId)
                 && ObjectUtils.objectsEqual(taskType, other.taskType));
     }
+
+    public CommandEntity getRootCmdEntity() {
+        return rootCmdEntity;
+    }
+
+    public void setRootCmdEntity(CommandEntity rootCmdEntity) {
+        this.rootCmdEntity = rootCmdEntity;
+    }
+
+    public CommandEntity getChildCmdEntity() {
+        return childCmdEntity;
+    }
+
+    public void setChildCmdEntity(CommandEntity childCmdEntity) {
+        this.childCmdEntity = childCmdEntity;
+    }
 }
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAO.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAO.java
index 4bf4cf2..f8508e8 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAO.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAO.java
@@ -3,12 +3,12 @@
 import java.util.Collection;
 import java.util.List;
 
+import org.ovirt.engine.core.common.businessentities.AsyncTask;
 import org.ovirt.engine.core.common.businessentities.AsyncTaskEntity;
-import org.ovirt.engine.core.common.businessentities.AsyncTasks;
 import org.ovirt.engine.core.compat.Guid;
 
 /**
- * <code>AsyncTaskDAO</code> defines a type which performs CRUD operations on 
instances of {@link AsyncTasks}.
+ * <code>AsyncTaskDAO</code> defines a type which performs CRUD operations on 
instances of {@link org.ovirt.engine.core.common.businessentities.AsyncTask}.
  *
  *
  */
@@ -19,14 +19,14 @@
      * @param id the task id
      * @return the task
      */
-    AsyncTasks get(Guid id);
+    AsyncTask get(Guid id);
 
     /**
      * Retrieves the task with the specified VDSM taskId
      * @param vdsmTaskId id of the task as reported by VDSM
      * @return the task
      */
-    AsyncTasks getByVdsmTaskId(Guid vdsmTaskId);
+    AsyncTask getByVdsmTaskId(Guid vdsmTaskId);
     /**
      * Gets async task Ids by a given entity Id.
      * @param entityId the Id of the entity to return the tasks for
@@ -48,21 +48,21 @@
      *
      * @return the list of tasks
      */
-    List<AsyncTasks> getAll();
+    List<AsyncTask> getAll();
 
     /**
      * Saves or updates the specified task
      *
      * @param task the task
      */
-    void saveOrUpdate(AsyncTasks task);
+    void saveOrUpdate(AsyncTask task);
 
     /**
      * Updates the specified task.
      *
      * @param task the task
      */
-    void update(AsyncTasks task);
+    void update(AsyncTask task);
 
     /**
      * Removes the task with the specified id.
@@ -76,7 +76,7 @@
      *
      * @param task the task to save
      */
-    void save(AsyncTasks newAsyncTask);
+    void save(AsyncTask newAsyncTask);
 
     /**
      * Removes the specified task according to its VDSM task id.
@@ -91,7 +91,7 @@
      * @param entityId
      * @return
      */
-    List<AsyncTasks> getTasksByEntity(Guid entityId);
+    List<AsyncTask> getTasksByEntity(Guid entityId);
 
     void insertAsyncTaskEntities(Collection<AsyncTaskEntity> 
asyncTaskEntities);
 
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAODbFacadeImpl.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAODbFacadeImpl.java
index 1c5235e..fdc60ee 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAODbFacadeImpl.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAODbFacadeImpl.java
@@ -8,12 +8,11 @@
 
 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.AsyncTaskType;
+import org.ovirt.engine.core.common.businessentities.AsyncTask;
 import org.ovirt.engine.core.common.businessentities.AsyncTaskEntity;
 import org.ovirt.engine.core.common.businessentities.AsyncTaskResultEnum;
 import org.ovirt.engine.core.common.businessentities.AsyncTaskStatusEnum;
-import org.ovirt.engine.core.common.businessentities.AsyncTasks;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.dal.dbbroker.CustomMapSqlParameterSource;
 import org.ovirt.engine.core.dal.dbbroker.DbEngineDialect;
@@ -57,20 +56,19 @@
         }
     }
 
-    private static class AsyncTaskRowMapper implements RowMapper<AsyncTasks> {
+    private static class AsyncTaskRowMapper implements RowMapper<AsyncTask> {
         public static final AsyncTaskRowMapper instance = new 
AsyncTaskRowMapper();
 
         @Override
-        public AsyncTasks mapRow(ResultSet rs, int rowNum) throws SQLException 
{
-            AsyncTasks entity = new AsyncTasks();
-            
entity.setaction_type(VdcActionType.forValue(rs.getInt("action_type")));
+        public AsyncTask mapRow(ResultSet rs, int rowNum) throws SQLException {
+            AsyncTask entity = new AsyncTask();
             
entity.setresult(AsyncTaskResultEnum.forValue(rs.getInt("result")));
             
entity.setstatus(AsyncTaskStatusEnum.forValue(rs.getInt("status")));
             entity.setTaskId(getGuidDefaultEmpty(rs, "task_id"));
             entity.setVdsmTaskId(getGuid(rs, "vdsm_task_id"));
-            
entity.setActionParameters(deserializeParameters(rs.getString("action_parameters"),
 rs.getString("action_params_class")));
             entity.setStepId(getGuid(rs, "step_id"));
             entity.setCommandId(getGuidDefaultEmpty(rs, "command_id"));
+            entity.setRootCommandId(getGuidDefaultEmpty(rs, 
"root_command_id"));
             
entity.setStartTime(DbFacadeUtils.fromDate(rs.getTimestamp("started_at")));
             entity.setTaskType(AsyncTaskType.forValue(rs.getInt("task_type")));
             entity.setStoragePoolId(getGuidDefaultEmpty(rs, 
"storage_pool_id"));
@@ -90,17 +88,16 @@
 
     private static class AsyncTaskParameterSource extends 
CustomMapSqlParameterSource {
 
-        public AsyncTaskParameterSource(DbEngineDialect dialect, AsyncTasks 
task) {
+        public AsyncTaskParameterSource(DbEngineDialect dialect, AsyncTask 
task) {
             super(dialect);
-            addValue("action_type", task.getaction_type());
+            addValue("action_type", task.getActionType());
             addValue("result", task.getresult());
             addValue("status", task.getstatus());
             addValue("vdsm_task_id", task.getVdsmTaskId());
             addValue("task_id", task.getTaskId());
-            addValue("action_parameters", 
serializeParameters(task.getActionParameters()));
-            addValue("action_params_class", 
task.getActionParameters().getClass().getName());
             addValue("step_id", task.getStepId());
             addValue("command_id", task.getCommandId());
+            addValue("root_command_id", task.getRootCommandId());
         }
 
         private static String serializeParameters(VdcActionParametersBase 
params) {
@@ -122,7 +119,7 @@
     };
 
     @Override
-    public AsyncTasks get(Guid id) {
+    public AsyncTask get(Guid id) {
         MapSqlParameterSource parameterSource = 
getCustomMapSqlParameterSource()
                 .addValue("task_id", id);
 
@@ -130,25 +127,25 @@
     }
 
     @Override
-    public AsyncTasks getByVdsmTaskId(Guid vdsmTaskId) {
+    public AsyncTask getByVdsmTaskId(Guid vdsmTaskId) {
         MapSqlParameterSource parameterSource = 
getCustomMapSqlParameterSource()
                 .addValue("vdsm_task_id", vdsmTaskId);
         return getCallsHandler().executeRead("GetAsyncTasksByVdsmTaskId", 
AsyncTaskRowMapper.instance, parameterSource);
     }
 
     @Override
-    public List<AsyncTasks> getAll() {
+    public List<AsyncTask> getAll() {
         MapSqlParameterSource parameterSource = 
getCustomMapSqlParameterSource();
 
         return getCallsHandler().executeReadList("GetAllFromasync_tasks", 
AsyncTaskRowMapper.instance, parameterSource);
     }
 
-    private AsyncTaskParameterSource getTaskParameterSource(AsyncTasks task) {
+    private AsyncTaskParameterSource getTaskParameterSource(AsyncTask task) {
         return new AsyncTaskParameterSource(dialect, task);
     }
 
     @Override
-    public void saveOrUpdate(AsyncTasks task) {
+    public void saveOrUpdate(AsyncTask task) {
         AsyncTaskParameterSource parameterSource = 
getTaskParameterSource(task);
         parameterSource.addValue("started_at", task.getStartTime());
         parameterSource.addValue("storage_pool_id", task.getStoragePoolId());
@@ -157,7 +154,7 @@
     }
 
     @Override
-    public void save(AsyncTasks task) {
+    public void save(AsyncTask task) {
         AsyncTaskParameterSource parameterSource = 
getTaskParameterSource(task);
         parameterSource.addValue("started_at", task.getStartTime());
         parameterSource.addValue("storage_pool_id", task.getStoragePoolId());
@@ -166,7 +163,7 @@
     }
 
     @Override
-    public void update(AsyncTasks task) {
+    public void update(AsyncTask task) {
         logNullParameters(task);
 
         AsyncTaskParameterSource parameterSource = 
getTaskParameterSource(task);
@@ -174,7 +171,7 @@
         getCallsHandler().executeModification("Updateasync_tasks", 
parameterSource);
     }
 
-    private static void logNullParameters(AsyncTasks task) {
+    private static void logNullParameters(AsyncTask task) {
         if (task.getActionParameters() == null) {
             StringBuilder sb = new StringBuilder("Null action_parameters:\n");
             StackTraceElement[] st = Thread.currentThread().getStackTrace();
@@ -217,7 +214,7 @@
     }
 
     @Override
-    public List<AsyncTasks> getTasksByEntity(Guid entityId) {
+    public List<AsyncTask> getTasksByEntity(Guid entityId) {
         MapSqlParameterSource parameterSource = 
getCustomMapSqlParameterSource()
                 .addValue("entity_id", entityId);
         return getCallsHandler().executeReadList("GetAsyncTasksByEntityId",
diff --git 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/AsyncTaskDAOTest.java
 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/AsyncTaskDAOTest.java
index 89d096a..b50c70f 100644
--- 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/AsyncTaskDAOTest.java
+++ 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/AsyncTaskDAOTest.java
@@ -13,15 +13,13 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.ovirt.engine.core.common.VdcObjectType;
-import org.ovirt.engine.core.common.action.AddDiskParameters;
-import org.ovirt.engine.core.common.action.AddImageFromScratchParameters;
 import org.ovirt.engine.core.common.action.VdcActionParametersBase;
 import org.ovirt.engine.core.common.action.VdcActionType;
 import org.ovirt.engine.core.common.asynctasks.AsyncTaskType;
+import org.ovirt.engine.core.common.businessentities.AsyncTask;
 import org.ovirt.engine.core.common.businessentities.AsyncTaskEntity;
 import org.ovirt.engine.core.common.businessentities.AsyncTaskResultEnum;
 import org.ovirt.engine.core.common.businessentities.AsyncTaskStatusEnum;
-import org.ovirt.engine.core.common.businessentities.AsyncTasks;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.compat.TransactionScopeOption;
 
@@ -33,8 +31,8 @@
 public class AsyncTaskDAOTest extends BaseDAOTestCase {
     private static final int TASK_COUNT = 2;
     private AsyncTaskDAO dao;
-    private AsyncTasks newAsyncTask;
-    private AsyncTasks existingAsyncTask;
+    private AsyncTask newAsyncTask;
+    private AsyncTask existingAsyncTask;
 
     private VdcActionParametersBase params;
     private VdcActionParametersBase taskParams;
@@ -55,11 +53,11 @@
         taskParams.setParentParameters(params);
 
         // create some test data
-        newAsyncTask = new AsyncTasks();
+        newAsyncTask = new AsyncTask();
         newAsyncTask.setTaskId(Guid.newGuid());
         newAsyncTask.setVdsmTaskId(Guid.newGuid());
         newAsyncTask.setStartTime(new Date());
-        newAsyncTask.setaction_type(VdcActionType.AddDisk);
+        newAsyncTask.setActionType(VdcActionType.AddDisk);
         newAsyncTask.setstatus(AsyncTaskStatusEnum.running);
         newAsyncTask.setresult(AsyncTaskResultEnum.success);
         newAsyncTask.setActionParameters(params);
@@ -77,7 +75,7 @@
      */
     @Test
     public void testGetWithInvalidId() {
-        AsyncTasks result = dao.get(Guid.newGuid());
+        AsyncTask result = dao.get(Guid.newGuid());
 
         assertNull(result);
     }
@@ -91,7 +89,7 @@
 
     @Test
     public void testGetAsyncTaskEntitiesById() {
-        List<AsyncTasks> tasks = 
dao.getTasksByEntity(FixturesTool.ENTITY_WITH_TASKS_ID);
+        List<AsyncTask> tasks = 
dao.getTasksByEntity(FixturesTool.ENTITY_WITH_TASKS_ID);
         assertNotNull(tasks);
         assertEquals(tasks.size(), 1);
     }
@@ -124,7 +122,7 @@
      */
     @Test
     public void testGet() {
-        AsyncTasks result = dao.get(existingAsyncTask.getTaskId());
+        AsyncTask result = dao.get(existingAsyncTask.getTaskId());
 
         assertNotNull(result);
         assertEquals(existingAsyncTask, result);
@@ -135,7 +133,7 @@
      */
     @Test
     public void testGetAll() {
-        List<AsyncTasks> result = dao.getAll();
+        List<AsyncTask> result = dao.getAll();
 
         assertEquals(TASK_COUNT, result.size());
     }
@@ -147,7 +145,7 @@
     public void testSave() {
         dao.save(newAsyncTask);
 
-        AsyncTasks result = dao.get(newAsyncTask.getTaskId());
+        AsyncTask result = dao.get(newAsyncTask.getTaskId());
         /*
          * //Setting startTime to null is required as DB auto generates //the 
value of start time //Without this, the
          * comparison would fail result.setStartTime(null);
@@ -162,17 +160,10 @@
     public void testUpdate() {
         existingAsyncTask.setstatus(AsyncTaskStatusEnum.aborting);
         existingAsyncTask.setresult(AsyncTaskResultEnum.failure);
-        existingAsyncTask.setaction_type(VdcActionType.AddDisk);
-        AddDiskParameters addDiskToVmParams = new AddDiskParameters();
-        addDiskToVmParams.setSessionId("SESSION_ID");
-        AddImageFromScratchParameters taskParameters = new 
AddImageFromScratchParameters();
-        taskParameters.setParentParameters(addDiskToVmParams);
-        taskParameters.setParentCommand(VdcActionType.AddDisk);
-        existingAsyncTask.setActionParameters(addDiskToVmParams);
-        existingAsyncTask.setTaskParameters(taskParameters);
+        existingAsyncTask.setActionType(VdcActionType.AddDisk);
         dao.update(existingAsyncTask);
 
-        AsyncTasks result = dao.get(existingAsyncTask.getTaskId());
+        AsyncTask result = dao.get(existingAsyncTask.getTaskId());
 
         assertEquals(existingAsyncTask, result);
     }
@@ -182,7 +173,7 @@
      */
     @Test
     public void testRemove() {
-        AsyncTasks result = dao.get(existingAsyncTask.getTaskId());
+        AsyncTask result = dao.get(existingAsyncTask.getTaskId());
         assertNotNull(result);
 
         assertEquals(dao.remove(existingAsyncTask.getTaskId()), 1);
@@ -200,7 +191,7 @@
 
     @Test
     public void testGetTaskByVdsmTaskId() {
-        AsyncTasks result = 
dao.getByVdsmTaskId(FixturesTool.EXISTING_VDSM_TASK_ID);
+        AsyncTask result = 
dao.getByVdsmTaskId(FixturesTool.EXISTING_VDSM_TASK_ID);
         assertNotNull(result);
         assertEquals(existingAsyncTask, result);
 
@@ -208,7 +199,7 @@
 
     @Test
     public void testRemoveByVdsmTaskId() {
-        AsyncTasks result = 
dao.getByVdsmTaskId(FixturesTool.EXISTING_VDSM_TASK_ID);
+        AsyncTask result = 
dao.getByVdsmTaskId(FixturesTool.EXISTING_VDSM_TASK_ID);
         assertNotNull(result);
 
         
assertEquals(dao.removeByVdsmTaskId(existingAsyncTask.getVdsmTaskId()), 1);
@@ -228,21 +219,14 @@
     public void testSaveOrUpdate() {
         existingAsyncTask.setstatus(AsyncTaskStatusEnum.aborting);
         existingAsyncTask.setresult(AsyncTaskResultEnum.failure);
-        existingAsyncTask.setaction_type(VdcActionType.AddDisk);
-        AddDiskParameters addDiskToVmParams = new AddDiskParameters();
-        addDiskToVmParams.setSessionId("SESSION_ID");
-        AddImageFromScratchParameters taskParameters = new 
AddImageFromScratchParameters();
-        taskParameters.setParentParameters(addDiskToVmParams);
-        taskParameters.setParentCommand(VdcActionType.AddDisk);
-        existingAsyncTask.setActionParameters(addDiskToVmParams);
-        existingAsyncTask.setTaskParameters(taskParameters);
-        List<AsyncTasks> tasks = dao.getAll();
+        existingAsyncTask.setActionType(VdcActionType.AddDisk);
+        List<AsyncTask> tasks = dao.getAll();
         assertNotNull(tasks);
         int tasksNumber = tasks.size();
         dao.saveOrUpdate(existingAsyncTask);
         tasks = dao.getAll();
         assertEquals(tasksNumber, tasks.size());
-        AsyncTasks taskFromDb = dao.get(existingAsyncTask.getTaskId());
+        AsyncTask taskFromDb = dao.get(existingAsyncTask.getTaskId());
         assertNotNull(taskFromDb);
         assertEquals(taskFromDb, existingAsyncTask);
         dao.saveOrUpdate(newAsyncTask);
diff --git a/backend/manager/modules/dal/src/test/resources/fixtures.xml 
b/backend/manager/modules/dal/src/test/resources/fixtures.xml
index cb9024b..63d4069 100644
--- a/backend/manager/modules/dal/src/test/resources/fixtures.xml
+++ b/backend/manager/modules/dal/src/test/resources/fixtures.xml
@@ -77,6 +77,22 @@
             <null/>
             <value>ACTIVE</value>
         </row>
+        <row>
+            <value>440fd52b-3400-4cdd-8d3f-c9d03704b0aa</value>
+            <value>1</value>
+            <null/>
+            <value>2010-11-29 15:57:10</value>
+            <null/>
+            <value>ACTIVE</value>
+        </row>
+        <row>
+            <value>440fd52b-3400-4cdd-8d3f-c9d03704b0ab</value>
+            <value>1</value>
+            <null/>
+            <value>2010-11-29 15:57:10</value>
+            <null/>
+            <value>ACTIVE</value>
+        </row>
     </table>
 
     <table name="async_tasks">
@@ -85,16 +101,18 @@
         <column>status</column>
         <column>result</column>
         <column>command_id</column>
+        <column>root_command_id</column>
         <column>started_at</column>
         <column>storage_pool_id</column>
         <column>task_type</column>
         <column>vdsm_task_id</column>
         <row>
             <value>340fd52b-3400-4cdd-8d3f-c9d03704b0aa</value>
-            <value>1</value> <!--  Add VM -->
+            <value>1</value> <!-- Add VM -->
             <value>2</value> <!--  Running -->
             <value>0</value> <!--  Success -->
             <value>340fd52b-3400-4cdd-8d3f-c9d03704b0aa</value>
+            <value>440fd52b-3400-4cdd-8d3f-c9d03704b0aa</value>
             <value>2010-12-01 14:13:07</value>
             <value>6d849ebf-755f-4552-ad09-9a090cda105d</value>
             <value>3</value>
@@ -102,10 +120,11 @@
         </row>
         <row>
             <value>340fd52b-3400-4cdd-8d3f-c9d03704b0ab</value>
-            <value>1</value> <!--  Add VM -->
+            <value>1</value> <!-- Add VM -->
             <value>2</value> <!--  Running -->
             <value>0</value> <!--  Success -->
             <value>340fd52b-3400-4cdd-8d3f-c9d03704b0ab</value>
+            <value>440fd52b-3400-4cdd-8d3f-c9d03704b0ab</value>
             <value>2010-12-01 14:13:07</value>
             <value>6d849ebf-755f-4552-ad09-9a090cda105d</value>
             <value>3</value>
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml
 
b/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml
index 2520f6f..f6e9faa 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml
@@ -174,7 +174,7 @@
                <include name="common/businessentities/MigrationSupport.java" />
                <include 
name="common/businessentities/VdsTransparentHugePagesState.java" />
                <include name="common/businessentities/OvfExportOnlyField.java" 
/>
-               <include name="common/businessentities/AsyncTasks.java" />
+               <include name="common/businessentities/AsyncTask.java" />
                <include 
name="common/businessentities/NonOperationalReason.java" />
                <include 
name="common/businessentities/MigrateOnErrorOptions.java" />
                <include name="common/businessentities/TagsVmMapId.java" />
diff --git a/packaging/dbscripts/async_tasks_sp.sql 
b/packaging/dbscripts/async_tasks_sp.sql
index 01ad67a..005b885 100644
--- a/packaging/dbscripts/async_tasks_sp.sql
+++ b/packaging/dbscripts/async_tasks_sp.sql
@@ -6,18 +6,17 @@
        v_status INTEGER,
        v_vdsm_task_id UUID,
        v_task_id UUID,
-        v_action_parameters text,
-       v_action_params_class varchar(256),
        v_step_id UUID,
        v_command_id UUID,
+       v_root_command_id UUID,
         v_started_at timestamp WITH TIME ZONE,
        v_storage_pool_id UUID,
        v_async_task_type INTEGER)
 RETURNS VOID
    AS $procedure$
 BEGIN
-INSERT INTO async_tasks(action_type, result, status, vdsm_task_id, task_id, 
action_parameters, action_params_class, step_id, command_id, 
started_at,storage_pool_id, task_type)
-       VALUES(v_action_type, v_result, v_status, v_vdsm_task_id, v_task_id, 
v_action_parameters, v_action_params_class, v_step_id, v_command_id, 
v_started_at, v_storage_pool_id, v_async_task_type);
+INSERT INTO async_tasks(action_type, result, status, vdsm_task_id, task_id, 
step_id, command_id, root_command_id, started_at,storage_pool_id, task_type)
+       VALUES(v_action_type, v_result, v_status, v_vdsm_task_id, v_task_id, 
v_step_id, v_command_id, v_root_command_id, v_started_at, v_storage_pool_id, 
v_async_task_type);
 END; $procedure$
 LANGUAGE plpgsql;
 
@@ -27,10 +26,9 @@
        v_status INTEGER,
        v_vdsm_task_id UUID,
        v_task_id UUID,
-       v_action_parameters text,
-       v_action_params_class varchar(256),
        v_step_id UUID,
        v_command_id UUID,
+       v_root_command_id UUID,
         v_storage_pool_id UUID)
 RETURNS VOID
 
@@ -41,10 +39,9 @@
       SET action_type = v_action_type,
           result = v_result,
           status = v_status,
-          action_parameters = v_action_parameters,
-          action_params_class = v_action_params_class,
           step_id = v_step_id,
           command_id = v_command_id,
+          root_command_id = v_root_command_id,
           vdsm_task_id = v_vdsm_task_id,
           storage_pool_id = v_storage_pool_id
       WHERE task_id = v_task_id;
@@ -56,10 +53,9 @@
        v_status INTEGER,
        v_vdsm_task_id UUID,
        v_task_id UUID,
-       v_action_parameters text,
-       v_action_params_class varchar(256),
        v_step_id UUID,
        v_command_id UUID,
+       v_root_command_id UUID,
         v_started_at timestamp WITH TIME ZONE,
        v_storage_pool_id UUID,
        v_async_task_type INTEGER)
@@ -68,9 +64,9 @@
 BEGIN
       IF NOT EXISTS (SELECT 1 from async_tasks where async_tasks.task_id = 
v_task_id) THEN
             PERFORM Insertasync_tasks(v_action_type, v_result, v_status, 
v_vdsm_task_id, v_task_id,
-            v_action_parameters, v_action_params_class, v_step_id, 
v_command_id, v_started_at, v_storage_pool_id, v_async_task_type);
+            v_step_id, v_command_id, v_root_command_id, v_started_at, 
v_storage_pool_id, v_async_task_type);
       ELSE
-            PERFORM Updateasync_tasks(v_action_type, v_result, v_status, 
v_vdsm_task_id, v_task_id, v_action_parameters, v_action_params_class, 
v_step_id, v_command_id, v_storage_pool_id);
+            PERFORM Updateasync_tasks(v_action_type, v_result, v_status, 
v_vdsm_task_id, v_task_id, v_step_id, v_command_id, v_root_command_id, 
v_storage_pool_id);
       END IF;
 END; $procedure$
 LANGUAGE plpgsql;
diff --git 
a/packaging/dbscripts/upgrade/03_05_1040_async_tasks_add_root_command_id.sql 
b/packaging/dbscripts/upgrade/03_05_1040_async_tasks_add_root_command_id.sql
new file mode 100644
index 0000000..9c5e2b1
--- /dev/null
+++ b/packaging/dbscripts/upgrade/03_05_1040_async_tasks_add_root_command_id.sql
@@ -0,0 +1,3 @@
+select fn_db_add_column('async_tasks', 'root_command_id', 'UUID DEFAULT NULL');
+select fn_db_drop_column ('async_tasks', 'action_parameters');
+select fn_db_drop_column ('async_tasks', 'action_params_class');


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I7ec5c072c6f3153c9396b0ce0be8e7c59cbefea1
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.5
Gerrit-Owner: Ravi Nori <rn...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to