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