Greg Padgett has uploaded a new change for review. Change subject: [WIP] core, db, packaging: introduce EntityTask ......................................................................
[WIP] core, db, packaging: introduce EntityTask Introduce EntityTask, a new task type for non-SPM tasks. Rather than being run on the SPM, these tasks are run based on the state of a given entity, for example a VM. If the VM migrates, the host running the task may change. Because the behavior is dependent upon the specific command being executed, commands have a set of callbacks that the task manager can query to ascertain the status of the task or to alter the task state (see the CommandCallback interface). Appropriate changes have been made to the AsyncTaskManager so that management of these tasks and SPM tasks share as much of the same operational flow as possible, with divergence made to adjust for the different task monitoring and update requirements. Change-Id: I59392247ff2caf997030f4cf975273b3bac69c33 Signed-off-by: Greg Padgett <gpadg...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractSPMAsyncTaskHandler.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandCallback.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskBase.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/CommandCoordinatorImpl.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/EntityAsyncTask.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/AsyncTask.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/action/VdcReturnValueBase.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskCategory.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskCreationInfo.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskParameters.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskType.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/AsyncTasks.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAODbFacadeImpl.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/AbstractBackendActionableResource.java M frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml M packaging/dbscripts/async_tasks_sp.sql M packaging/dbscripts/common_sp.sql M packaging/dbscripts/inst_sp.sql A packaging/dbscripts/upgrade/03_05_0320_alter_async_tasks_for_non_spm_tasks.sql M packaging/setup/plugins/ovirt-engine-setup/ovirt-engine/upgrade/asynctasks.py 23 files changed, 370 insertions(+), 129 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/13/26913/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractSPMAsyncTaskHandler.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractSPMAsyncTaskHandler.java index 7fe62a4..15c87b5 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractSPMAsyncTaskHandler.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractSPMAsyncTaskHandler.java @@ -68,7 +68,9 @@ Guid vdsmTaskId = taskCreationInfo.getVdsmTaskId(); getReturnValue().getVdsmTaskIdList().add(vdsmTaskId); if (isRevertedTask) { - log.infoFormat("Reverting task {0} with ID {1} on DataCenter {2}.", taskCreationInfo.getTaskType().name(), vdsmTaskId, taskCreationInfo.getStoragePoolID()); + log.infoFormat("Reverting task {0} with ID {1} on {2} {3}.", + taskCreationInfo.getTaskType().name(), vdsmTaskId, + taskCreationInfo.getObjectType().getVdcObjectTranslation(), taskCreationInfo.getObjectId()); } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandCallback.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandCallback.java new file mode 100644 index 0000000..805bd21 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandCallback.java @@ -0,0 +1,12 @@ +package org.ovirt.engine.core.bll; + +import org.ovirt.engine.core.common.businessentities.AsyncTaskResultEnum; +import org.ovirt.engine.core.compat.Guid; + +public interface CommandCallback { + public boolean isActive(Guid taskId); + + public void stopTask(Guid taskId); + + public AsyncTaskResultEnum getFinalStatus(Guid taskId); +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskBase.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskBase.java index fe1c9c0..9380832 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskBase.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskBase.java @@ -51,10 +51,6 @@ return getParameters().getVdsmTaskId(); } - public Guid getStoragePoolID() { - return getParameters().getStoragePoolID(); - } - private AsyncTaskState privateState = AsyncTaskState.forValue(0); public AsyncTaskState getState() { @@ -75,6 +71,16 @@ private AsyncTaskStatus _lastTaskStatus = new AsyncTaskStatus(AsyncTaskStatusEnum.init); @Override + public VdcObjectType getObjectType() { + return getParameters().getObjectType(); + } + + @Override + public Guid getObjectId() { + return getParameters().getObjectId(); + } + + @Override public AsyncTaskStatus getLastTaskStatus() { return _lastTaskStatus; } 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 f977b1e..c8cfe8c 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 @@ -20,10 +20,8 @@ * as retrieved from the vdsm). Use in order to construct tasks when service * is initializing. * - * @param taskID - * the ID of the task to construct. - * @param pollingEnabled - * true if we want to start polling the task, false otherwise. + * @param coco + * a CommandCoordinator reference to hand this task * @param creationInfo * the info by which we construct the task. * @return @@ -43,7 +41,8 @@ creationInfo.getStepId(), asyncTask == null ? Guid.newGuid() : asyncTask.getCommandId(), asyncTask == null ? Guid.newGuid() : asyncTask.getRootCommandId(), - creationInfo.getStoragePoolID(), + creationInfo.getObjectType(), + creationInfo.getObjectId(), creationInfo.getTaskType()); asyncTask.setParentCommandId(parentCmdId); asyncTask.setCommandStatus(cmdStatus); @@ -61,10 +60,8 @@ /** * Constructs a task based on its type and the task type's parameters. * - * @param taskID - * the ID of the task to construct. - * @param pollingEnabled - * true if we want to start polling the task, false otherwise. + * @param coco + * a CommandCoordinator reference to hand this task * @param taskType * the type of the task which we want to construct. * @param asyncTaskParams @@ -74,10 +71,17 @@ public static AsyncTaskBase construct(CommandCoordinator coco, AsyncTaskType taskType, AsyncTaskParameters asyncTaskParams, boolean duringInit) { try { AsyncTaskBase result = null; - if (taskType == AsyncTaskType.unknown) { - result = new AsyncTaskBase(coco, asyncTaskParams); - } else { + switch (taskType.getTaskCategory()) { + case SPMAsyncTask: + result = new SPMAsyncTask(coco, asyncTaskParams); + break; + case CommandAsyncTask: result = new CommandAsyncTask(coco, asyncTaskParams, duringInit); + break; + case EntityAsyncTask: + // TODO GP need duringInit param? + result = new EntityAsyncTask(coco, asyncTaskParams); + break; } return result; } 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 29ef972..884d66e 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 @@ -15,9 +15,11 @@ import org.apache.commons.lang.exception.ExceptionUtils; import org.ovirt.engine.core.bll.tasks.interfaces.AsyncTask; import org.ovirt.engine.core.bll.tasks.interfaces.CommandCoordinator; +import org.ovirt.engine.core.bll.tasks.interfaces.SPMTask; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.asynctasks.AsyncTaskCategory; import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo; import org.ovirt.engine.core.common.asynctasks.AsyncTaskParameters; import org.ovirt.engine.core.common.asynctasks.AsyncTaskType; @@ -118,9 +120,11 @@ handleTasksOfCommandWithEmptyVdsmId(rootCommandIdToTasksMap.get(entry.getKey())); } for (AsyncTasks task : entry.getValue()) { - if (!hasEmptyVdsmId(task)) { - tasksInDbAfterRestart.putIfAbsent(task.getStoragePoolId(), new ArrayList<AsyncTasks>()); - tasksInDbAfterRestart.get(task.getStoragePoolId()).add(task); + if (!hasEmptyVdsmId(task) + && (task.getTaskType().getTaskCategory() == AsyncTaskCategory.SPMAsyncTask + || task.getTaskType().getTaskCategory() == AsyncTaskCategory.EntityAsyncTask)) { + tasksInDbAfterRestart.putIfAbsent(task.getObjectId(), new ArrayList<AsyncTasks>()); + tasksInDbAfterRestart.get(task.getObjectId()).add(task); } } } @@ -185,7 +189,8 @@ boolean retVal = false; if (_tasks != null) { for (AsyncTask task : _tasks.values()) { - if (task.getStoragePoolID().equals(storagePoolID)) { + if (task instanceof SPMAsyncTask + && ((SPMAsyncTask) task).getStoragePoolID().equals(storagePoolID)) { retVal = true; break; } @@ -337,7 +342,8 @@ 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())); - AsyncTaskCreationInfo creationInfo = new AsyncTaskCreationInfo(Guid.Empty, task.getTaskType(), task.getStoragePoolId()); + AsyncTaskCreationInfo creationInfo + = new AsyncTaskCreationInfo(Guid.Empty, task.getTaskType(), task.getObjectType(), task.getObjectId()); AsyncTask spmTask = coco.construct(creationInfo, task); AsyncTaskStatus failureStatus = new AsyncTaskStatus(); failureStatus.setStatus(AsyncTaskStatusEnum.finished); @@ -451,26 +457,30 @@ /** * Update task status based on asyncTaskMap. * - * @param asyncTaskMap - Task statuses Map fetched from VDSM. + * @param poolsAllTasksMap - Task statuses Map fetched from VDSM. */ private void updateTaskStatuses( Map<Guid, Map<Guid, AsyncTaskStatus>> poolsAllTasksMap) { for (AsyncTask task : _tasks.values()) { if (task.getShouldPoll()) { - Map<Guid, AsyncTaskStatus> asyncTasksForPoolMap = poolsAllTasksMap - .get(task.getStoragePoolID()); + if (task instanceof SPMTask) { + Map<Guid, AsyncTaskStatus> asyncTasksForPoolMap = poolsAllTasksMap + .get(((SPMTask) task).getStoragePoolID()); - // If the storage pool id exists - if (asyncTasksForPoolMap != null) { - AsyncTaskStatus cachedAsyncTaskStatus = asyncTasksForPoolMap - .get(task.getVdsmTaskId()); + // If the storage pool id exists + if (asyncTasksForPoolMap != null) { + AsyncTaskStatus cachedAsyncTaskStatus = asyncTasksForPoolMap + .get(task.getVdsmTaskId()); - // task found in VDSM. - task.updateTask(cachedAsyncTaskStatus); + // task found in VDSM. + task.updateTask(cachedAsyncTaskStatus); + } + } else { + // TODO GP we're already passing different parameters, why not make a new signature... + task.updateTask(null); } } } - } /** @@ -520,8 +530,8 @@ Set<Guid> poolsOfActiveTasks = new HashSet<Guid>(); for (AsyncTask task : _tasks.values()) { - if (task.getShouldPoll()) { - poolsOfActiveTasks.add(task.getStoragePoolID()); + if (task instanceof SPMTask && task.getShouldPoll()) { + poolsOfActiveTasks.add(((SPMTask) task).getStoragePoolID()); } } return poolsOfActiveTasks; @@ -538,11 +548,13 @@ Set<Guid> poolsOfClearedAndOldTasks = new HashSet<Guid>(); ConcurrentMap<Guid, AsyncTask> activeTaskMap = new ConcurrentHashMap<Guid, AsyncTask>(); for (AsyncTask task : _tasks.values()) { - if (!cachingOver(task)) { - activeTaskMap.put(task.getVdsmTaskId(), task); - poolsOfActiveTasks.add(task.getStoragePoolID()); - } else { - poolsOfClearedAndOldTasks.add(task.getStoragePoolID()); + if (task instanceof SPMTask) { + if (!cachingOver(task)) { + activeTaskMap.put(task.getVdsmTaskId(), task); + poolsOfActiveTasks.add(((SPMTask) task).getStoragePoolID()); + } else { + poolsOfClearedAndOldTasks.add(((SPMTask) task).getStoragePoolID()); + } } } @@ -682,7 +694,8 @@ final List<AsyncTask> newlyAddedTasks = new ArrayList<AsyncTask>(); for (AsyncTaskCreationInfo creationInfo : currPoolTasks) { - creationInfo.setStoragePoolID(sp.getId()); + creationInfo.setObjectType(VdcObjectType.StoragePool); + creationInfo.setObjectId(sp.getId()); if (!_tasks.containsKey(creationInfo.getVdsmTaskId())) { try { AsyncTask task; 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 8e05317..e705497 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 @@ -60,14 +60,18 @@ * this method within a certain command, make sure that the command implemented the * ConcreteCreateTask method. * + * @param taskId + * vdsm task id of this task + * @param command + * Command object associated with this task * @param asyncTaskCreationInfo * info to send to AsyncTaskManager when creating the task. * @param parentCommand * VdcActionType of the command that its EndAction we want to invoke when tasks are finished. - * @param entityType - * type of entities that are associated with the task - * @param entityIds - * Ids of entities to be associated with task + * @param description + * description of the command + * @param entitiesMap + * Map of entities associated with this task * @return Guid of the created task. */ public Guid createTask(Guid taskId, @@ -284,7 +288,8 @@ asyncTask.setStepId(asyncTaskCreationInfo.getStepId()); asyncTask.setCommandId(command.getCommandId()); asyncTask.setRootCommandId(parentParameters.getCommandId()); - asyncTask.setStoragePoolId(asyncTaskCreationInfo.getStoragePoolID()); + asyncTask.setObjectType(asyncTaskCreationInfo.getObjectType()); + asyncTask.setObjectId(asyncTaskCreationInfo.getObjectId()); asyncTask.setTaskType(asyncTaskCreationInfo.getTaskType()); asyncTask.setParentCommandId(command.getParameters().getParentParameters() == null ? Guid.Empty : command.getParameters().getParentParameters().getCommandId()); asyncTask.setCommandStatus(command.getCommandStatus()); @@ -309,7 +314,8 @@ asyncTaskCreationInfo.getStepId(), command.getCommandId(), parentParameters.getCommandId(), - asyncTaskCreationInfo.getStoragePoolID(), + asyncTaskCreationInfo.getObjectType(), + asyncTaskCreationInfo.getObjectId(), asyncTaskCreationInfo.getTaskType()); asyncTask.setParentCommandId(command.getParameters().getParentParameters() == null ? Guid.Empty : command.getParameters().getParentParameters().getCommandId()); asyncTask.setCommandStatus(command.getCommandStatus()); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/EntityAsyncTask.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/EntityAsyncTask.java new file mode 100644 index 0000000..3ddb0f5 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/EntityAsyncTask.java @@ -0,0 +1,59 @@ +package org.ovirt.engine.core.bll.tasks; + +import org.ovirt.engine.core.bll.CommandCallback; +import org.ovirt.engine.core.bll.tasks.interfaces.CommandCoordinator; +import org.ovirt.engine.core.common.asynctasks.AsyncTaskParameters; +import org.ovirt.engine.core.common.businessentities.AsyncTaskResultEnum; +import org.ovirt.engine.core.common.businessentities.AsyncTaskStatus; +import org.ovirt.engine.core.common.businessentities.AsyncTaskStatusEnum; + +/** + * Tasks associated with a particular entity, such as a VM. + */ +public class EntityAsyncTask extends AsyncTaskBase { + private CommandCallback command; + + public EntityAsyncTask(CommandCoordinator coco, AsyncTaskParameters parameters) { + super(coco, parameters); + // Retrieve command for access to its CommandCallback methods; in Java 8 we can make them static. + this.command = (CommandCallback) coco.retrieveCommand(this.getCommandId()); + // The command was submitted to VDSM before this task object was created. + setLastTaskStatus(new AsyncTaskStatus(AsyncTaskStatusEnum.running)); + } + + @Override + public void updateTask(AsyncTaskStatus returnTaskStatus) { + if (getLastTaskStatus().getTaskIsRunning()) { + if (!isActive()) { + setState(AsyncTaskState.Ended); + AsyncTaskStatus taskStatus = new AsyncTaskStatus(AsyncTaskStatusEnum.finished); + // TODO GP need to handle unknown? + taskStatus.setResult(getFinalStatus()); + if (taskStatus.getResult() == AsyncTaskResultEnum.failure) { + // TODO GP try to retrieve a more detailed failure message + taskStatus.setMessage("Unknown EntityAsyncTask execution failure"); //$NON-NLS-1$ + } + setLastTaskStatus(taskStatus); + } + } + + if (!getLastTaskStatus().getTaskIsRunning()) { + // Either we set this status ourselves, or something bad happened (cancellation?) + HandleEndedTask(); + } + } + + private boolean isActive() { + return command.isActive(getVdsmTaskId()); + } + + private AsyncTaskResultEnum getFinalStatus() { + return command.getFinalStatus(getVdsmTaskId()); + } + + @Override + protected void stopTaskRemote() { + command.stopTask(getVdsmTaskId()); + } + +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/AsyncTask.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/AsyncTask.java index efaddd95..c543c0d 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/AsyncTask.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/AsyncTask.java @@ -39,7 +39,9 @@ AsyncTaskState getState(); - Guid getStoragePoolID(); + VdcObjectType getObjectType(); + + Guid getObjectId(); Guid getVdsmTaskId(); @@ -65,3 +67,4 @@ void setEntitiesMap(Map<Guid, VdcObjectType> entitiesMap); } + 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 0e6e227..0ed7120 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 @@ -161,7 +161,8 @@ AsyncTaskCreationInfo info = nextAsyncTaskCreationInfo(); AsyncTask spmAsyncTask = cmd.concreteCreateTask(Guid.Empty, info, cmd.getParameters().getParentCommand()); - assertEquals("wrong storage pool ID", info.getStoragePoolID(), spmAsyncTask.getStoragePoolID()); + assertEquals("wrong object type", info.getObjectType(), spmAsyncTask.getObjectType()); + assertEquals("wrong object ID", info.getObjectId(), spmAsyncTask.getObjectId()); assertEquals("wrong task ID", info.getVdsmTaskId(), spmAsyncTask.getVdsmTaskId()); assertEquals("wrong task result", AsyncTaskResultEnum.success, spmAsyncTask.getLastTaskStatus().getResult()); assertEquals("wrong task status", AsyncTaskStatusEnum.init, spmAsyncTask.getLastTaskStatus().getStatus()); @@ -189,7 +190,8 @@ private static AsyncTaskCreationInfo nextAsyncTaskCreationInfo() { AsyncTaskCreationInfo info = new AsyncTaskCreationInfo(); info.setStepId(Guid.newGuid()); - info.setStoragePoolID(Guid.newGuid()); + info.setObjectType(VdcObjectType.StoragePool); + info.setObjectId(Guid.newGuid()); info.setVdsmTaskId(Guid.newGuid()); info.setTaskType(RandomUtils.instance().nextEnum(AsyncTaskType.class)); return info; diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcReturnValueBase.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcReturnValueBase.java index 26d5891..3d8f910 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcReturnValueBase.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcReturnValueBase.java @@ -110,26 +110,32 @@ isSyncronious = value; } + // TODO GP new style tasks public ArrayList<Guid> getVdsmTaskIdList() { return vdsmTaskIdList; } + // TODO GP new style tasks public void setVdsmTaskIdList(ArrayList<Guid> value) { vdsmTaskIdList = value; } + // TODO GP new style tasks public ArrayList<Guid> getTaskPlaceHolderIdList() { return taskPlaceHolderIdList; } + // TODO GP new style tasks public void setTaskPlaceHolderIdList(ArrayList<Guid> value) { taskPlaceHolderIdList = value; } + // TODO GP new style tasks public ArrayList<Guid> getInternalVdsmTaskIdList() { return internalVdsmTaskIdList; } + // TODO GP new style tasks public boolean getHasAsyncTasks() { return (getVdsmTaskIdList() != null && getVdsmTaskIdList().size() > 0); } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskCategory.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskCategory.java new file mode 100644 index 0000000..8439a83 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskCategory.java @@ -0,0 +1,15 @@ +package org.ovirt.engine.core.common.asynctasks; + +public enum AsyncTaskCategory { + SPMAsyncTask, + CommandAsyncTask, + EntityAsyncTask; + + public int getValue() { + return this.ordinal(); + } + + public static AsyncTaskCategory forValue(int value) { + return values()[value]; + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskCreationInfo.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskCreationInfo.java index 82afece..2f33075 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskCreationInfo.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskCreationInfo.java @@ -2,13 +2,18 @@ import java.io.Serializable; +import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.compat.Guid; public class AsyncTaskCreationInfo implements Serializable { + private static final long serialVersionUID = -3656717504769791630L; + private Guid vdsmTaskID; private Guid privateStoragePoolID; private AsyncTaskType privateTaskType; + private VdcObjectType objectType; + private Guid objectID; /** * The id of the step which monitors the task execution @@ -22,7 +27,15 @@ public AsyncTaskCreationInfo(Guid vdsmTaskID, AsyncTaskType taskType, Guid storagePoolID) { setVdsmTaskId(vdsmTaskID); setTaskType(taskType); - setStoragePoolID(storagePoolID); + setObjectType(VdcObjectType.StoragePool); + setObjectId(storagePoolID); + } + + public AsyncTaskCreationInfo(Guid vdsmTaskID, AsyncTaskType taskType, VdcObjectType objectType, Guid objectID) { + setVdsmTaskId(vdsmTaskID); + setTaskType(taskType); + setObjectType(objectType); + setObjectId(objectID); } public Guid getVdsmTaskId() { @@ -41,14 +54,6 @@ privateTaskType = value; } - public Guid getStoragePoolID() { - return privateStoragePoolID; - } - - public void setStoragePoolID(Guid value) { - privateStoragePoolID = value; - } - public Guid getStepId() { return stepId; } @@ -57,4 +62,44 @@ this.stepId = stepId; } + public VdcObjectType getObjectType() { + // Remain backwards compatible with serialized instances that had only storagePoolID + if (objectType == null && privateStoragePoolID != null) { + setObjectType(VdcObjectType.StoragePool); + } + return objectType; + } + + public void setObjectType(VdcObjectType type) { + this.objectType = type; + } + + public Guid getObjectId() { + // Remain backwards compatible with serialized instances that had only storagePoolID + if (objectID == null && privateStoragePoolID != null) { + setObjectId(privateStoragePoolID); + } + return objectID; + } + + public void setObjectId(Guid objectID) { + this.objectID = objectID; + } + + /* We can't use readObject() to help properly deserialize old class versions because + * it's unsupported by GWT until version 2.6. Instead, we change the accessors to + * fill in for the new fields at runtime. + */ + /* + private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { + // Translate the old format (with a storagePoolID) to the new format + in.defaultReadObject(); + if (getObjectType() == null && getObjectId() == null && getStoragePoolID() != null) { + setObjectType(VdcObjectType.StoragePool); + setObjectId(getStoragePoolID()); + setStoragePoolID(null); + } + } + */ + } 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..e9894b6 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,10 +2,14 @@ import java.io.Serializable; +import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.businessentities.AsyncTasks; import org.ovirt.engine.core.compat.Guid; public class AsyncTaskParameters implements Serializable { + + private static final long serialVersionUID = -9210820315001271668L; + private AsyncTasks privateDbAsyncTask; public AsyncTasks getDbAsyncTask() { @@ -31,8 +35,12 @@ setDbAsyncTask(dbAsyncTask); } - public Guid getStoragePoolID() { - return getCreationInfo().getStoragePoolID(); + public VdcObjectType getObjectType() { + return getCreationInfo().getObjectType(); + } + + public Guid getObjectId() { + return getCreationInfo().getObjectId(); } public Guid getVdsmTaskId() { @@ -51,4 +59,5 @@ public AsyncTaskParameters() { } + } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskType.java index a5c9e94..2a33b56 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskType.java @@ -1,17 +1,19 @@ package org.ovirt.engine.core.common.asynctasks; public enum AsyncTaskType { - unknown, - copyImage, - moveImage, - createVolume, - deleteVolume, - deleteImage, - mergeSnapshots, - cloneImageStructure, - syncImageData, - extendImageSize, - downloadImageFromStream; + unknown(AsyncTaskCategory.SPMAsyncTask), + copyImage(AsyncTaskCategory.CommandAsyncTask), + moveImage(AsyncTaskCategory.CommandAsyncTask), + createVolume(AsyncTaskCategory.CommandAsyncTask), + deleteVolume(AsyncTaskCategory.CommandAsyncTask), + deleteImage(AsyncTaskCategory.CommandAsyncTask), + mergeSnapshots(AsyncTaskCategory.CommandAsyncTask), + cloneImageStructure(AsyncTaskCategory.CommandAsyncTask), + syncImageData(AsyncTaskCategory.CommandAsyncTask), + extendImageSize(AsyncTaskCategory.CommandAsyncTask), + downloadImageFromStream(AsyncTaskCategory.CommandAsyncTask); + + private AsyncTaskCategory taskCategory; public int getValue() { return this.ordinal(); @@ -20,4 +22,12 @@ public static AsyncTaskType forValue(int value) { return values()[value]; } + + private AsyncTaskType(AsyncTaskCategory taskCategory) { + this.taskCategory = taskCategory; + } + + public AsyncTaskCategory getTaskCategory() { + return this.taskCategory; + } } 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/AsyncTasks.java index 3db94ad..e26971d 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/AsyncTasks.java @@ -3,6 +3,7 @@ import java.io.Serializable; import java.util.Date; +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; @@ -32,7 +33,8 @@ Guid stepId, Guid commandId, Guid rootCommandId, - Guid storagePoolId, + VdcObjectType objectType, + Guid objectId, AsyncTaskType taskType) { this.actionType = action_type; this.result = result; @@ -42,7 +44,8 @@ this.stepId = stepId; this.startTime = new Date(); this.commandId = commandId; - this.storagePoolId = storagePoolId; + this.objectType = objectType; + this.objectId = objectId; this.taskId = Guid.newGuid(); this.taskType = taskType; cmdEntity = new CommandEntity(); @@ -192,15 +195,25 @@ this.cmdEntity.setId(commandId); } - public Guid getStoragePoolId() { - return storagePoolId; + public VdcObjectType getObjectType() { + return objectType; } - public void setStoragePoolId(Guid storagePoolId) { - this.storagePoolId = storagePoolId; + public void setObjectType(VdcObjectType objectType) { + this.objectType = objectType; } - private Guid storagePoolId; + private VdcObjectType objectType; + + public Guid getObjectId() { + return objectId; + } + + public void setObjectId(Guid objectId) { + this.objectId = objectId; + } + + private Guid objectId; public AsyncTaskType getTaskType() { return taskType; @@ -223,7 +236,8 @@ results = prime * results + ((result == null) ? 0 : result.hashCode()); results = prime * results + ((status == null) ? 0 : status.hashCode()); results = prime * results + ((startTime == null) ? 0 : startTime.hashCode()); - results = prime * results + ((storagePoolId == null) ? 0 : storagePoolId.hashCode()); + results = prime * results + ((objectType == null) ? 0 : objectType.hashCode()); + results = prime * results + ((objectId == null) ? 0 : objectId.hashCode()); results = prime * results + ((taskType == null) ? 0 : taskType.hashCode()); return results; } @@ -248,7 +262,8 @@ && result == other.result && status == other.status && ObjectUtils.objectsEqual(startTime, other.startTime) - && ObjectUtils.objectsEqual(storagePoolId, other.storagePoolId) + && objectType == other.objectType + && ObjectUtils.objectsEqual(objectId, other.objectId) && ObjectUtils.objectsEqual(taskType, other.taskType)); } } 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 b2e64d2..49dda4b 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 @@ -73,7 +73,8 @@ entity.setCommandId(getGuidDefaultEmpty(rs, "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")); + entity.setObjectType(VdcObjectType.forValue(rs.getInt("object_type"))); + entity.setObjectId(getGuidDefaultEmpty(rs, "object_id")); return entity; } @@ -151,7 +152,8 @@ public void saveOrUpdate(AsyncTasks task) { AsyncTaskParameterSource parameterSource = getTaskParameterSource(task); parameterSource.addValue("started_at", task.getStartTime()); - parameterSource.addValue("storage_pool_id", task.getStoragePoolId()); + parameterSource.addValue("object_type", task.getObjectType()); + parameterSource.addValue("object_id", task.getObjectId()); parameterSource.addValue("async_task_type", task.getTaskType()); getCallsHandler().executeModification("InsertOrUpdateAsyncTasks", parameterSource); } @@ -160,7 +162,8 @@ public void save(AsyncTasks task) { AsyncTaskParameterSource parameterSource = getTaskParameterSource(task); parameterSource.addValue("started_at", task.getStartTime()); - parameterSource.addValue("storage_pool_id", task.getStoragePoolId()); + parameterSource.addValue("object_type", task.getObjectType()); + parameterSource.addValue("object_id", task.getObjectId()); parameterSource.addValue("async_task_type", task.getTaskType()); getCallsHandler().executeModification("Insertasync_tasks", parameterSource); } @@ -170,7 +173,8 @@ logNullParameters(task); AsyncTaskParameterSource parameterSource = getTaskParameterSource(task); - parameterSource.addValue("storage_pool_id", task.getStoragePoolId()); + parameterSource.addValue("object_type", task.getObjectType()); + parameterSource.addValue("object_id", task.getObjectId()); getCallsHandler().executeModification("Updateasync_tasks", parameterSource); } diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/AbstractBackendActionableResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/AbstractBackendActionableResource.java index a322dc7..f15d3c6 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/AbstractBackendActionableResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/AbstractBackendActionableResource.java @@ -39,6 +39,7 @@ try { VdcReturnValueBase actionResult = doAction(task, params); if (actionResult.getHasAsyncTasks()) { + // TODO GP any changes for new style tasks; look for other usages of getHasAsyncTasks() if (expectBlocking(action)) { CreationStatus status = awaitCompletion(actionResult, pollingType); if (status != CreationStatus.FAILED){ @@ -77,6 +78,7 @@ setJobLink(action, actionResult); } if (actionResult.getHasAsyncTasks()) { + // TODO GP new style tasks if (expectBlocking(action)) { CreationStatus status = awaitCompletion(actionResult, pollingType); return actionStatus(status, action, addLinks(newModel(id))); 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 38ee7b0..519f8aa 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 @@ -251,6 +251,7 @@ <include name="common/businessentities/RoleGroupMapId.java" /> <include name="common/asynctasks/AsyncTaskCreationInfo.java" /> <include name="common/asynctasks/AsyncTaskType.java" /> + <include name="common/asynctasks/AsyncTaskCategory.java" /> <!-- SearchBackend --> <include name="common/VdcEventNotificationUtils.java" /> diff --git a/packaging/dbscripts/async_tasks_sp.sql b/packaging/dbscripts/async_tasks_sp.sql index 694429f..084884c 100644 --- a/packaging/dbscripts/async_tasks_sp.sql +++ b/packaging/dbscripts/async_tasks_sp.sql @@ -2,39 +2,41 @@ -- [async_tasks] Table -- Create or replace FUNCTION Insertasync_tasks(v_action_type INTEGER, - v_result INTEGER, - v_status INTEGER, - v_vdsm_task_id UUID, - v_task_id UUID, - v_task_parameters text, - v_task_params_class varchar(256), - v_step_id UUID, - v_command_id UUID, + v_result INTEGER, + v_status INTEGER, + v_vdsm_task_id UUID, + v_task_id UUID, + v_task_parameters text, + v_task_params_class varchar(256), + v_step_id UUID, + v_command_id UUID, v_started_at timestamp WITH TIME ZONE, - v_storage_pool_id UUID, - v_async_task_type INTEGER) + v_object_type INTEGER, + v_object_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, task_parameters, task_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_task_parameters, v_task_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, task_parameters, task_params_class, step_id, command_id, started_at, object_type, object_id, task_type) + VALUES(v_action_type, v_result, v_status, v_vdsm_task_id, v_task_id, v_task_parameters, v_task_params_class, v_step_id, v_command_id, v_started_at, v_object_type, v_object_id, v_async_task_type); END; $procedure$ LANGUAGE plpgsql; Create or replace FUNCTION Updateasync_tasks(v_action_type INTEGER, - v_result INTEGER, - v_status INTEGER, - v_vdsm_task_id UUID, - v_task_id UUID, - v_task_parameters text, - v_task_params_class varchar(256), - v_step_id UUID, - v_command_id UUID, - v_storage_pool_id UUID) + v_result INTEGER, + v_status INTEGER, + v_vdsm_task_id UUID, + v_task_id UUID, + v_task_parameters text, + v_task_params_class varchar(256), + v_step_id UUID, + v_command_id UUID, + v_object_type INTEGER, + v_object_id UUID) RETURNS VOID - --The [async_tasks] table doesn't have a timestamp column. Optimistic concurrency logic cannot be generated + --The [async_tasks] table doesn't have a timestamp column. Optimistic concurrency logic cannot be generated AS $procedure$ BEGIN UPDATE async_tasks @@ -46,31 +48,33 @@ step_id = v_step_id, command_id = v_command_id, vdsm_task_id = v_vdsm_task_id, - storage_pool_id = v_storage_pool_id + object_type = v_object_type, + object_id = v_object_id WHERE task_id = v_task_id; END; $procedure$ LANGUAGE plpgsql; Create or replace FUNCTION InsertOrUpdateAsyncTasks(v_action_type INTEGER, - v_result INTEGER, - v_status INTEGER, - v_vdsm_task_id UUID, - v_task_id UUID, - v_task_parameters text, - v_task_params_class varchar(256), - v_step_id UUID, - v_command_id UUID, - v_started_at timestamp WITH TIME ZONE, - v_storage_pool_id UUID, - v_async_task_type INTEGER) + v_result INTEGER, + v_status INTEGER, + v_vdsm_task_id UUID, + v_task_id UUID, + v_task_parameters text, + v_task_params_class varchar(256), + v_step_id UUID, + v_command_id UUID, + v_started_at timestamp WITH TIME ZONE, + v_object_type INTEGER, + v_object_id UUID, + v_async_task_type INTEGER) RETURNS VOID AS $procedure$ 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_task_parameters, v_task_params_class, v_step_id, v_command_id, v_started_at, v_storage_pool_id, v_async_task_type); + v_task_parameters, v_task_params_class, v_step_id, v_command_id, v_started_at, v_object_type, v_object_id, v_async_task_type); ELSE - PERFORM Updateasync_tasks(v_action_type, v_result, v_status, v_vdsm_task_id, v_task_id, v_task_parameters, v_task_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_task_parameters, v_task_params_class, v_step_id, v_command_id, v_object_type, v_object_id); END IF; END; $procedure$ LANGUAGE plpgsql; @@ -137,13 +141,14 @@ END; $procedure$ LANGUAGE plpgsql; +-- note: VdcObjectType.StoragePool = 14 Create or replace FUNCTION GetAsyncTasksByStoragePoolId(v_storage_pool_id UUID) RETURNS SETOF idUuidType STABLE AS $procedure$ BEGIN RETURN QUERY SELECT async_tasks.task_id FROM async_tasks - WHERE storage_pool_id = v_storage_pool_id; + WHERE object_type = 14 AND object_id = v_storage_pool_id; END; $procedure$ LANGUAGE plpgsql; diff --git a/packaging/dbscripts/common_sp.sql b/packaging/dbscripts/common_sp.sql index aa14456..b683673 100644 --- a/packaging/dbscripts/common_sp.sql +++ b/packaging/dbscripts/common_sp.sql @@ -517,7 +517,7 @@ v_record async_tasks_info_rs; -- selects storage_pool_id uuid found in async_tasks - v_tasks_cursor cursor for select distinct storage_pool_id from async_tasks; + v_tasks_cursor cursor for select distinct object_id from async_tasks where object_type = 14; begin OPEN v_tasks_cursor; diff --git a/packaging/dbscripts/inst_sp.sql b/packaging/dbscripts/inst_sp.sql index 3badb02..424155a 100644 --- a/packaging/dbscripts/inst_sp.sql +++ b/packaging/dbscripts/inst_sp.sql @@ -79,3 +79,24 @@ LANGUAGE plpgsql; +-- Query basic info on existing async tasks +CREATE OR REPLACE FUNCTION inst_get_async_tasks() + RETURNS TABLE(action_type INTEGER, task_id UUID, started_at TIMESTAMP WITH TIME ZONE, name VARCHAR) + AS $procedure$ +DECLARE + cond_sql TEXT; +BEGIN + + IF (NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE LOWER(table_name) = 'async_tasks' AND LOWER(column_name) = 'storage_pool_id')) + THEN + cond_sql := 'async_tasks.object_type = 14 AND async_tasks.object_id = storage_pool.id'; + ELSE + cond_sql := 'async_tasks.storage_pool_id = storage_pool.id'; + END IF; + + RETURN QUERY EXECUTE 'SELECT async_tasks.action_type, async_tasks.task_id, async_tasks.started_at, storage_pool.name' + || ' FROM async_tasks, storage_pool' + || ' WHERE ' || cond_sql; + +END; $procedure$ +LANGUAGE plpgsql; diff --git a/packaging/dbscripts/upgrade/03_05_0320_alter_async_tasks_for_non_spm_tasks.sql b/packaging/dbscripts/upgrade/03_05_0320_alter_async_tasks_for_non_spm_tasks.sql new file mode 100644 index 0000000..940cd5e --- /dev/null +++ b/packaging/dbscripts/upgrade/03_05_0320_alter_async_tasks_for_non_spm_tasks.sql @@ -0,0 +1,6 @@ +-- change async_tasks storage_pool_id to allow id of any object type +select fn_db_rename_column('async_tasks', 'storage_pool_id', 'object_id'); +select fn_db_add_column('async_tasks', 'object_type', 'INTEGER'); + +-- existing values correspond to VdcObjectType.StoragePool (14) +UPDATE async_tasks SET object_type = 14 WHERE object_type IS NULL AND object_id IS NOT NULL; diff --git a/packaging/setup/plugins/ovirt-engine-setup/ovirt-engine/upgrade/asynctasks.py b/packaging/setup/plugins/ovirt-engine-setup/ovirt-engine/upgrade/asynctasks.py index 63de634..7fee0e4 100644 --- a/packaging/setup/plugins/ovirt-engine-setup/ovirt-engine/upgrade/asynctasks.py +++ b/packaging/setup/plugins/ovirt-engine-setup/ovirt-engine/upgrade/asynctasks.py @@ -152,15 +152,10 @@ def _getRunningTasks(self, dbstatement): + # TODO GP: any need to try and stop/compensate new-style tasks? tasks = dbstatement.execute( statement=""" - select - async_tasks.action_type, - async_tasks.task_id, - async_tasks.started_at, - storage_pool.name - from async_tasks, storage_pool - where async_tasks.storage_pool_id = storage_pool.id + select * from inst_get_async_tasks() """, ownConnection=True, transaction=False, -- To view, visit http://gerrit.ovirt.org/26913 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I59392247ff2caf997030f4cf975273b3bac69c33 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Greg Padgett <gpadg...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches