Ravi Nori has uploaded a new change for review.

Change subject: engine : Make Async Tasks Manager aware of child CoCo tasks
......................................................................

engine : Make Async Tasks Manager aware of child CoCo tasks

Child commands started by AsycTasks should be
considered by AsyncTaskManager before invoking
the endSuccessfully on the async task.

Change-Id: I0d877309fd150280cd7ba6993b341a9044a4572f
Signed-off-by: Ravi Nori <rn...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateSnapshotCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskManager.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandAsyncTask.java
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/CommandsCache.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandsCacheImpl.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/dal/src/main/java/org/ovirt/engine/core/dao/CommandEntityDao.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/CommandEntityDaoDbFacadeImpl.java
M packaging/dbscripts/command_entities_sp.sql
11 files changed, 76 insertions(+), 1 deletion(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/24/36824/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateSnapshotCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateSnapshotCommand.java
index 5d48427..04ef8dc 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateSnapshotCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateSnapshotCommand.java
@@ -8,6 +8,8 @@
 import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.ImagesActionsParametersBase;
+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.DiskImage;
 import org.ovirt.engine.core.common.businessentities.VolumeFormat;
@@ -88,6 +90,14 @@
         VDSReturnValue vdsReturnValue = null;
 
         try {
+            VdcActionParametersBase params = new VdcActionParametersBase();
+            VdcActionType parentCommand = getParameters().getParentCommand() 
!= VdcActionType.Unknown ?
+                    getParameters().getParentCommand() : 
VdcActionType.CreateAllSnapshotsFromVm;
+            params.setParentParameters(getParametersForTask(parentCommand, 
getParameters()));
+            params.setParentCommand(parentCommand);
+            
CommandCoordinatorUtil.executeAsyncCommand(VdcActionType.TestParent,
+                    params,
+                    cloneContextAndDetachFromParent());
             Guid taskId = getAsyncTaskId();
 
             vdsReturnValue =
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 16c51a2..66643c7 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
@@ -804,4 +804,13 @@
         return users;
     }
 
+    public boolean isAsyncTask(Guid cmdId) {
+        for (SPMTask task : _tasks.values()) {
+            if 
(task.getParameters().getDbAsyncTask().getCommandId().equals(cmdId)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
 }
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 94eb32d..122de28 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
@@ -16,7 +16,9 @@
 import org.ovirt.engine.core.common.asynctasks.AsyncTaskParameters;
 import org.ovirt.engine.core.common.asynctasks.EndedTaskInfo;
 import org.ovirt.engine.core.common.businessentities.AsyncTask;
+import org.ovirt.engine.core.common.businessentities.CommandEntity;
 import org.ovirt.engine.core.common.errors.VdcBLLException;
+import org.ovirt.engine.core.compat.CommandStatus;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.utils.threadpool.ThreadPoolUtil;
 import org.slf4j.Logger;
@@ -93,7 +95,7 @@
             clearAsyncTask();
         }
 
-        else if (entityInfo.ShouldEndAction()) {
+        else if (entityInfo.ShouldEndAction() && 
!hasRunningChildCoCoCommands()) {
             log.info(
                     "CommandAsyncTask::endActionIfNecessary: All tasks of 
command '{}' has ended -> executing 'endAction'",
                     getCommandId());
@@ -113,6 +115,18 @@
         }
     }
 
+    private boolean hasRunningChildCoCoCommands() {
+        Guid cmdId = getParameters().getDbAsyncTask().getCommandId();
+        Guid rootCmdId = getParameters().getDbAsyncTask().getRootCommandId();
+        for (CommandEntity entity : coco.getChildCmdsByParentCmdId(rootCmdId)) 
{
+            if (!CommandStatus.SUCCEEDED.equals(entity.getCommandStatus()) &&
+                    !coco.isAsyncTask(entity.getId())) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     private void endCommandAction() {
         CommandMultiAsyncTasks entityInfo = getCommandMultiAsyncTasks();
         VdcReturnValueBase vdcReturnValue = null;
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 3f83177..ec90ab6 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
@@ -62,6 +62,7 @@
 
     @Override
     public void persistCommand(CommandEntity cmdEntity, CommandContext 
cmdContext) {
+        initChildHierarchy();
         if (Guid.isNullOrEmpty(cmdEntity.getId())) {
             return;
         }
@@ -228,6 +229,10 @@
         return childIds;
     }
 
+    public List<CommandEntity> getChildCmdsByParentCmdId(Guid cmdId) {
+        return commandsCache.getChildCmdsByParentCmdId(cmdId);
+    }
+
     private void initChildHierarchy() {
         if (!childHierarchyInitialized) {
             synchronized(LOCK) {
@@ -360,6 +365,11 @@
                 new SPMTaskGuidBaseVDSCommandParameters(storagePoolID, 
vdsmTaskID));
     }
 
+    @Override
+    public boolean isAsyncTask(Guid cmdId) {
+        return AsyncTaskManager.getInstance().isAsyncTask(cmdId);
+    }
+
     private VDSReturnValue runVdsCommand(VDSCommandType commandType, 
VDSParametersBase parameters) {
         return 
Backend.getInstance().getResourceManager().RunVdsCommand(commandType, 
parameters);
     }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandsCache.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandsCache.java
index a65421d..1468a88 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandsCache.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandsCache.java
@@ -5,6 +5,7 @@
 import org.ovirt.engine.core.compat.DateTime;
 import org.ovirt.engine.core.compat.Guid;
 
+import java.util.List;
 import java.util.Set;
 
 public interface CommandsCache {
@@ -25,4 +26,5 @@
 
     public void updateCallBackNotified(Guid commandId);
 
+    List<CommandEntity> getChildCmdsByParentCmdId(Guid cmdId);
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandsCacheImpl.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandsCacheImpl.java
index 1ea5ac3..0b91f0e 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandsCacheImpl.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandsCacheImpl.java
@@ -100,4 +100,9 @@
             
DbFacade.getInstance().getCommandEntityDao().updateNotified(commandId);
         }
     }
+
+    @Override
+    public List<CommandEntity> getChildCmdsByParentCmdId(Guid cmdId) {
+        return 
DbFacade.getInstance().getCommandEntityDao().getCmdEntitiesByParentCmdId(cmdId);
+    }
 }
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 aff8279..7698a5a 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
@@ -27,4 +27,5 @@
     public void updateCommandStatus(Guid commandId, CommandStatus status);
     public void updateCommandExecuted(Guid commandId);
     public void updateCallBackNotified(Guid commandId);
+    public List<CommandEntity> getChildCmdsByParentCmdId(Guid cmdId);
 }
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 94c875b..b27daa7 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
@@ -65,4 +65,5 @@
 
     SPMTask construct(AsyncTaskType taskType, AsyncTaskParameters 
asyncTaskParams, boolean duringInit);
 
+    boolean isAsyncTask(Guid cmdId);
 }
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/CommandEntityDao.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/CommandEntityDao.java
index e0efee8..3747899 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/CommandEntityDao.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/CommandEntityDao.java
@@ -1,6 +1,7 @@
 package org.ovirt.engine.core.dao;
 
 import java.util.Date;
+import java.util.List;
 
 import org.ovirt.engine.core.common.businessentities.CommandEntity;
 import org.ovirt.engine.core.compat.CommandStatus;
@@ -18,4 +19,6 @@
 
     void removeAllBeforeDate(Date cutoff);
 
+    List<CommandEntity> getCmdEntitiesByParentCmdId(Guid parentId);
+
 }
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/CommandEntityDaoDbFacadeImpl.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/CommandEntityDaoDbFacadeImpl.java
index df4f3fa..5069cb6 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/CommandEntityDaoDbFacadeImpl.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/CommandEntityDaoDbFacadeImpl.java
@@ -4,6 +4,7 @@
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.Date;
+import java.util.List;
 
 import org.apache.commons.lang.StringUtils;
 import org.ovirt.engine.core.common.action.VdcActionParametersBase;
@@ -137,4 +138,13 @@
         
getCallsHandler().executeModification("DeleteCommandEntitiesOlderThanDate", 
parameterSource);
     }
 
+    @Override
+    public List<CommandEntity> getCmdEntitiesByParentCmdId(Guid parentId) {
+        MapSqlParameterSource parameterSource = 
getCustomMapSqlParameterSource()
+                .addValue("root_command_id", parentId);
+        return 
getCallsHandler().executeReadList("GetCommandEntitiesByParentCmdId",
+                mapper,
+                parameterSource);
+    }
+
 }
diff --git a/packaging/dbscripts/command_entities_sp.sql 
b/packaging/dbscripts/command_entities_sp.sql
index 86176c1..cd391e8 100644
--- a/packaging/dbscripts/command_entities_sp.sql
+++ b/packaging/dbscripts/command_entities_sp.sql
@@ -129,6 +129,16 @@
 END; $procedure$
 LANGUAGE plpgsql;
 
+CREATE OR REPLACE FUNCTION GetCommandEntitiesByParentCmdId (v_root_command_id 
uuid)
+RETURNS SETOF command_entities
+   AS $procedure$
+BEGIN
+      RETURN QUERY SELECT command_entities.*
+      FROM command_entities
+      WHERE root_command_id = v_root_command_id;
+END; $procedure$
+LANGUAGE plpgsql;
+
 CREATE OR REPLACE FUNCTION DeleteCommandEntity(v_command_id uuid)
 RETURNS VOID
    AS $procedure$


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

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

Reply via email to