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