Yair Zaslavsky has uploaded a new change for review. Change subject: [WIP] core: Distingushing between entity and vdsm task ids ......................................................................
[WIP] core: Distingushing between entity and vdsm task ids This patch is first in series of patches to handle the required mechanism described at the bug (better support for cases of missing tasks upon engine crash). One of the steps in the proposed solution is to diffrentiate between an entity ID provided by engine and the vdsm task ID provided by VDSM. The first patch simply adds the vdsmTaskId column, and since older code relied on this id (even though inserted to a "task_id" column) this patch suggested appropriate fixes. One of the issues that will be handled in future patches is not to include the VDSM task ID at the insert_AsyncTasks stored procedure, but at this point this is not addressed (as this will be a part of a patch handling splitting the insert of task from getting vdsm task id + updating in db) Change-Id: Iebfc85569ba1aa8bd840f7239f83b7f921a4bd8f Bug-Url: https://bugzilla.redhat.com/873546 Signed-off-by: Yair Zaslavsky <yzasl...@redhat.com> --- M backend/manager/dbscripts/async_tasks_sp.sql A backend/manager/dbscripts/upgrade/03_01_1520_add_vdsm_task_id_to_async_tasks.sql M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractSPMAsyncTaskHandler.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskFactory.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskManager.java 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/EntityAsyncTask.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EntityMultiAsyncTasks.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SPMAsyncTask.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskUtils.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/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/businessentities/async_tasks.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/java/org/ovirt/engine/core/dao/FixturesTool.java M backend/manager/modules/dal/src/test/resources/fixtures.xml M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/HSMGetAllTasksInfoVDSCommand.java 20 files changed, 201 insertions(+), 90 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/30/9230/1 diff --git a/backend/manager/dbscripts/async_tasks_sp.sql b/backend/manager/dbscripts/async_tasks_sp.sql index 7ae9a52..a090319 100644 --- a/backend/manager/dbscripts/async_tasks_sp.sql +++ b/backend/manager/dbscripts/async_tasks_sp.sql @@ -4,6 +4,7 @@ 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_action_parameters text, v_action_params_class varchar(256), @@ -17,8 +18,8 @@ RETURNS VOID AS $procedure$ BEGIN -INSERT INTO async_tasks(action_type, result, status, 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_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, 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_entities (async_task_id,entity_id,entity_type) SELECT v_task_id,id,v_entity_type from fnsplitteruuid(v_entity_ids); END; $procedure$ @@ -28,6 +29,7 @@ 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_action_parameters text, v_action_params_class varchar(256), @@ -35,7 +37,6 @@ v_command_id UUID) RETURNS VOID - --The [async_tasks] table doesn't have a timestamp column. Optimistic concurrency logic cannot be generated AS $procedure$ BEGIN UPDATE async_tasks @@ -45,7 +46,8 @@ action_parameters = v_action_parameters, action_params_class = v_action_params_class, step_id = v_step_id, - command_id = v_command_id + command_id = v_command_id, + vdsm_task_id = v_vdsm_task_id WHERE task_id = v_task_id; END; $procedure$ LANGUAGE plpgsql; @@ -66,6 +68,21 @@ BEGIN DELETE FROM async_tasks WHERE task_id = v_task_id; + GET DIAGNOSTICS deleted_rows = ROW_COUNT; + RETURN deleted_rows; + +END; $procedure$ +LANGUAGE plpgsql; + + +Create or replace FUNCTION DeleteAsyncTasksByVdsmTaskId(v_vdsm_task_id UUID) +RETURNS integer + AS $procedure$ +DECLARE +deleted_rows int; +BEGIN + DELETE FROM async_tasks + WHERE vdsm_task_id = v_vdsm_task_id; GET DIAGNOSTICS deleted_rows = ROW_COUNT; RETURN deleted_rows; @@ -103,3 +120,14 @@ END; $procedure$ LANGUAGE plpgsql; + +Create or replace FUNCTION GetAsyncTasksByVdsmTaskId(v_vdsm_task_id UUID) RETURNS SETOF async_tasks + AS $procedure$ +BEGIN + RETURN QUERY SELECT * + FROM async_tasks + WHERE vdsm_task_id = v_vdsm_task_id; + +END; $procedure$ +LANGUAGE plpgsql; + diff --git a/backend/manager/dbscripts/upgrade/03_01_1520_add_vdsm_task_id_to_async_tasks.sql b/backend/manager/dbscripts/upgrade/03_01_1520_add_vdsm_task_id_to_async_tasks.sql new file mode 100644 index 0000000..a437ba1 --- /dev/null +++ b/backend/manager/dbscripts/upgrade/03_01_1520_add_vdsm_task_id_to_async_tasks.sql @@ -0,0 +1,4 @@ +select fn_db_add_column('async_tasks', 'vdsm_task_id', 'UUID DEFAULT NULL'); +DROP INDEX if exists IDX_vdsm_task_id; +CREATE INDEX IDX_vdsm_task_id ON async_tasks(vdsm_task_id); + 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 de26985..abc92c0 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 @@ -56,7 +56,7 @@ getTaskObjectType(), getTaskObjects()) ); - getReturnValue().getTaskIdList().add(taskCreationInfo.getTaskID()); + getReturnValue().getTaskIdList().add(taskCreationInfo.getVdsmTaskId()); } @Override diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskFactory.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskFactory.java index 0564cad..63eebc1 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskFactory.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskFactory.java @@ -28,11 +28,11 @@ * @return */ public static SPMAsyncTask Construct(AsyncTaskCreationInfo creationInfo) { - async_tasks asyncTask = DbFacade.getInstance().getAsyncTaskDao().get(creationInfo.getTaskID()); + async_tasks asyncTask = DbFacade.getInstance().getAsyncTaskDao().getByVdsmTaskId(creationInfo.getVdsmTaskId()); if (asyncTask == null || asyncTask.getaction_parameters() == null) { asyncTask = new async_tasks(VdcActionType.Unknown, AsyncTaskResultEnum.success, AsyncTaskStatusEnum.running, - creationInfo.getTaskID(), + creationInfo.getVdsmTaskId(), new VdcActionParametersBase(), creationInfo.getStepId(), asyncTask == null ? Guid.NewGuid() : asyncTask.getCommandId(),creationInfo.getStoragePoolID(),creationInfo.getTaskType()); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskManager.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskManager.java index 9d1feba..0dd79b9 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskManager.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskManager.java @@ -260,7 +260,7 @@ // If the storage pool id exists if (asyncTasksForPoolMap != null) { AsyncTaskStatus cachedAsyncTaskStatus = asyncTasksForPoolMap - .get(task.getTaskID()); + .get(task.getVdsmTaskId()); // task found in VDSM. task.UpdateTask(cachedAsyncTaskStatus); @@ -339,7 +339,7 @@ Map<Guid, SPMAsyncTask> activeTaskMap = new HashMap<Guid, SPMAsyncTask>(); for (SPMAsyncTask task : _tasks.values()) { if (!CachingOver(task)) { - activeTaskMap.put(task.getTaskID(), task); + activeTaskMap.put(task.getVdsmTaskId(), task); poolsOfActiveTasks.add(task.getStoragePoolID()); } else { poolsOfClearedAndOldTasks.add(task.getStoragePoolID()); @@ -391,10 +391,10 @@ } else { - if (!_tasks.containsKey(task.getTaskID())) { + if (!_tasks.containsKey(task.getVdsmTaskId())) { log.infoFormat( "Adding task '{0}' (Parent Command {1}, Parameters Type {2}), {3}.", - task.getTaskID(), + task.getVdsmTaskId(), (task.getParameters().getDbAsyncTask().getaction_type()), task.getParameters().getClass().getName(), (task.getShouldPoll() ? "polling started." @@ -402,19 +402,19 @@ // Set the indication to true for logging _tasks status on next // quartz execution. - AddTaskToMap(task.getTaskID(), task); + AddTaskToMap(task.getVdsmTaskId(), task); } else { - SPMAsyncTask existingTask = _tasks.get(task.getTaskID()); + SPMAsyncTask existingTask = _tasks.get(task.getVdsmTaskId()); if (existingTask.getParameters().getDbAsyncTask().getaction_type() == VdcActionType.Unknown && task.getParameters().getDbAsyncTask().getaction_type() != VdcActionType.Unknown) { log.infoFormat( "Task '{0}' already exists with action type 'Unknown', now overriding it with action type '{1}'", - task.getTaskID(), + task.getVdsmTaskId(), task.getParameters().getDbAsyncTask().getaction_type()); // Set the indication to true for logging _tasks status on // next quartz execution. - AddTaskToMap(task.getTaskID(), task); + AddTaskToMap(task.getVdsmTaskId(), task); } } } @@ -527,14 +527,14 @@ for (AsyncTaskCreationInfo creationInfo : currPoolTasks) { creationInfo.setStoragePoolID(sp.getId()); - if (!_tasks.containsKey(creationInfo.getTaskID())) { + if (!_tasks.containsKey(creationInfo.getVdsmTaskId())) { try { SPMAsyncTask task = AsyncTaskFactory.Construct(creationInfo); addTaskToManager(task); newlyAddedTasks.add(task); } catch (Exception e) { log.errorFormat("Failed to load task of type {0} with id {1}, due to: {2}.", - creationInfo.getTaskType(), creationInfo.getTaskID(), + creationInfo.getTaskType(), creationInfo.getVdsmTaskId(), ExceptionUtils.getRootCauseMessage(e)); } } @@ -552,7 +552,7 @@ }); for (SPMAsyncTask task : newlyAddedTasks) { - StartPollingTask(task.getTaskID()); + StartPollingTask(task.getVdsmTaskId()); } log.infoFormat( 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 85f58a0..05701bd 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 @@ -1137,12 +1137,12 @@ asyncTaskCreationInfo.setStepId(taskStep.getId()); } SPMAsyncTask task = concreteCreateTask(asyncTaskCreationInfo, parentCommand); - retValue = task.getTaskID(); + retValue = task.getVdsmTaskId(); task.setEntityType(entityType); task.setAssociatedEntities(entityIds); AsyncTaskUtils.addOrUpdateTaskInDB(task); getAsyncTaskManager().lockAndAddTaskToManager(task); - retValue = task.getTaskID(); + retValue = task.getVdsmTaskId(); ExecutionHandler.updateStepExternalId(taskStep, retValue, ExternalSystemType.VDSM); } catch (RuntimeException ex) { log.errorFormat("Error during CreateTask for command: {0}. Exception {1}", getClass().getName(), ex); @@ -1167,7 +1167,7 @@ new AsyncTaskParameters(asyncTaskCreationInfo, new async_tasks(parentCommand, AsyncTaskResultEnum.success, AsyncTaskStatusEnum.running, - asyncTaskCreationInfo.getTaskID(), + asyncTaskCreationInfo.getVdsmTaskId(), parametersForTask, asyncTaskCreationInfo.getStepId(), getCommandId(),asyncTaskCreationInfo.getStoragePoolID(), diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EntityAsyncTask.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EntityAsyncTask.java index 8bdce7b..eaacba5 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EntityAsyncTask.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EntityAsyncTask.java @@ -66,7 +66,7 @@ @Override protected void ConcreteStartPollingTask() { EntityMultiAsyncTasks entityInfo = GetEntityMultiAsyncTasks(); - entityInfo.StartPollingTask(getTaskID()); + entityInfo.StartPollingTask(getVdsmTaskId()); } @Override @@ -81,7 +81,7 @@ log.warnFormat( "EntityAsyncTask::EndActionIfNecessary: No info is available for entity '{0}', current task ('{1}') was probably created while other tasks were in progress, clearing task.", getContainerId(), - getTaskID()); + getVdsmTaskId()); ClearAsyncTask(); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EntityMultiAsyncTasks.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EntityMultiAsyncTasks.java index e007fcc..564f758 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EntityMultiAsyncTasks.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EntityMultiAsyncTasks.java @@ -38,11 +38,11 @@ public void AttachTask(EntityAsyncTask asyncTask) { synchronized (_listTasks) { - if (!_listTasks.containsKey(asyncTask.getTaskID())) { + if (!_listTasks.containsKey(asyncTask.getVdsmTaskId())) { log.infoFormat("EntityMultiAsyncTasks::AttachTask: Attaching task '{0}' to entity '{1}'.", - asyncTask.getTaskID(), getContainerId()); + asyncTask.getVdsmTaskId(), getContainerId()); - _listTasks.put(asyncTask.getTaskID(), asyncTask); + _listTasks.put(asyncTask.getVdsmTaskId(), asyncTask); } } } @@ -169,11 +169,11 @@ log.infoFormat( "EntityMultiAsyncTasks::StartPollingNextTask: Starting to poll next task " + "(task ID: '{0}', action type '{1}')", - task.getTaskID(), + task.getVdsmTaskId(), task.getParameters().getDbAsyncTask().getaction_type()); setActionType(VdcActionType.Unknown); - StartPollingTask(task.getTaskID()); + StartPollingTask(task.getVdsmTaskId()); break; } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SPMAsyncTask.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SPMAsyncTask.java index d0f72a4..0882243 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SPMAsyncTask.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SPMAsyncTask.java @@ -53,7 +53,7 @@ privateParameters = value; } - public Guid getTaskID() { + public Guid getVdsmTaskId() { return getParameters().getTaskID(); } @@ -123,7 +123,7 @@ if (state != AsyncTaskState.AttemptingEndAction && state != AsyncTaskState.Cleared && state != AsyncTaskState.ClearFailed) { - log.infoFormat("BaseAsyncTask::StartPollingTask: Starting to poll task '{0}'.", getTaskID()); + log.infoFormat("BaseAsyncTask::StartPollingTask: Starting to poll task '{0}'.", getVdsmTaskId()); ConcreteStartPollingTask(); } } @@ -194,7 +194,7 @@ log.error( String.format( "BaseAsyncTask::PollAndUpdateTask: Handling task '%1$s' (State: %2$s, Parent Command: %3$s, Parameters Type: %4$s) threw an exception", - getTaskID(), + getVdsmTaskId(), getState(), (getParameters().getDbAsyncTask() .getaction_type()), @@ -234,15 +234,15 @@ protected void RemoveTaskFromDB() { try { - if (DbFacade.getInstance().getAsyncTaskDao().remove(getTaskID()) != 0) { - log.infoFormat("BaseAsyncTask::RemoveTaskFromDB: Removed task {0} from DataBase", getTaskID()); + if (DbFacade.getInstance().getAsyncTaskDao().removeByVdsmId(getVdsmTaskId()) != 0) { + log.infoFormat("BaseAsyncTask::RemoveTaskFromDB: Removed task {0} from DataBase", getVdsmTaskId()); } } catch (RuntimeException e) { log.error(String.format( "BaseAsyncTask::RemoveTaskFromDB: Removing task %1$s from DataBase threw an exception.", - getTaskID()), e); + getVdsmTaskId()), e); } } @@ -266,7 +266,7 @@ protected void LogEndTaskSuccess() { log.infoFormat( "BaseAsyncTask::OnTaskEndSuccess: Task '{0}' (Parent Command {1}, Parameters Type {2}) ended successfully.", - getTaskID(), + getVdsmTaskId(), (getParameters().getDbAsyncTask().getaction_type()), getParameters() .getClass().getName()); @@ -281,7 +281,7 @@ log.errorFormat( "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}'", - getTaskID(), + getVdsmTaskId(), (getParameters().getDbAsyncTask().getaction_type()), getParameters() .getClass().getName(), @@ -299,7 +299,7 @@ protected void LogTaskDoesntExist() { log.errorFormat( "BaseAsyncTask::LogTaskDoesntExist: Task '{0}' (Parent Command {1}, Parameters Type {2}) does not exist.", - getTaskID(), + getVdsmTaskId(), (getParameters().getDbAsyncTask().getaction_type()), getParameters() .getClass().getName()); @@ -322,7 +322,7 @@ log.errorFormat("SPMAsyncTask::PollTask: Task '{0}' (Parent Command {1}, Parameters Type {2}) " + "was not found in VDSM, will change its status to unknown.", - getTaskID(), (getParameters().getDbAsyncTask().getaction_type()), + getVdsmTaskId(), (getParameters().getDbAsyncTask().getaction_type()), getParameters().getClass().getName()); } else { returnedStatusTask = cachedStatusTask; @@ -346,7 +346,7 @@ if (cachedStatusTask.getTaskIsInUnusualState()) { log.warnFormat( formatString, - getTaskID(), + getVdsmTaskId(), (getParameters().getDbAsyncTask() .getaction_type()), getParameters().getClass().getName(), @@ -359,7 +359,7 @@ else { log.infoFormat( formatString, - getTaskID(), + getVdsmTaskId(), (getParameters().getDbAsyncTask() .getaction_type()), getParameters().getClass().getName(), @@ -378,7 +378,7 @@ .getInstance() .getResourceManager() .RunVdsCommand(VDSCommandType.SPMGetTaskStatus, - new SPMTaskGuidBaseVDSCommandParameters(getStoragePoolID(), getTaskID())).getReturnValue(); + new SPMTaskGuidBaseVDSCommandParameters(getStoragePoolID(), getVdsmTaskId())).getReturnValue(); returnValue = (AsyncTaskStatus) ((tempVar instanceof AsyncTaskStatus) ? tempVar : null); } @@ -386,7 +386,7 @@ log.error( String.format( "SPMAsyncTask::PollTask: Polling task '%1$s' (Parent Command %2$s, Parameters Type %3$s) threw an exception, task is still considered running.", - getTaskID(), + getVdsmTaskId(), (getParameters().getDbAsyncTask().getaction_type()), getParameters().getClass().getName()), e); @@ -395,7 +395,7 @@ if (returnValue == null) { log.errorFormat( "SPMAsyncTask::PollTask: Polling task '{0}' (Parent Command {1}, Parameters Type {2}) failed, task is still considered running.", - getTaskID(), + getVdsmTaskId(), (getParameters().getDbAsyncTask().getaction_type()), getParameters() .getClass().getName()); @@ -411,7 +411,7 @@ if (returnValue.getTaskIsInUnusualState()) { log.warnFormat( formatString, - getTaskID(), + getVdsmTaskId(), (getParameters().getDbAsyncTask().getaction_type()), getParameters().getClass().getName(), returnValue.getStatus(), @@ -422,7 +422,7 @@ else { log.infoFormat( formatString, - getTaskID(), + getVdsmTaskId(), (getParameters().getDbAsyncTask().getaction_type()), getParameters().getClass().getName(), returnValue.getStatus(), @@ -439,17 +439,17 @@ try { log.infoFormat( "SPMAsyncTask::StopTask: Attempting to stop task '{0}' (Parent Command {1}, Parameters Type {2}).", - getTaskID(), + getVdsmTaskId(), (getParameters().getDbAsyncTask().getaction_type()), getParameters().getClass().getName()); Backend.getInstance() .getResourceManager() .RunVdsCommand(VDSCommandType.SPMStopTask, - new SPMTaskGuidBaseVDSCommandParameters(getStoragePoolID(), getTaskID())); + new SPMTaskGuidBaseVDSCommandParameters(getStoragePoolID(), getVdsmTaskId())); } catch (RuntimeException e) { log.error( - String.format("SPMAsyncTask::StopTask: Stopping task '%1$s' threw an exception.", getTaskID()), + String.format("SPMAsyncTask::StopTask: Stopping task '%1$s' threw an exception.", getVdsmTaskId()), e); } finally { setState(AsyncTaskState.Polling); @@ -461,17 +461,17 @@ VDSReturnValue vdsReturnValue = null; try { - log.infoFormat("SPMAsyncTask::ClearAsyncTask: Attempting to clear task '{0}'", getTaskID()); + log.infoFormat("SPMAsyncTask::ClearAsyncTask: Attempting to clear task '{0}'", getVdsmTaskId()); vdsReturnValue = Backend .getInstance() .getResourceManager() .RunVdsCommand(VDSCommandType.SPMClearTask, - new SPMTaskGuidBaseVDSCommandParameters(getStoragePoolID(), getTaskID())); + new SPMTaskGuidBaseVDSCommandParameters(getStoragePoolID(), getVdsmTaskId())); } catch (RuntimeException e) { log.error(String.format("SPMAsyncTask::ClearAsyncTask: Clearing task '%1$s' threw an exception.", - getTaskID()), e); + getVdsmTaskId()), e); } if (!isTaskStateError(vdsReturnValue)) { @@ -497,7 +497,7 @@ && vdsReturnValue.getVdsError().getCode() == VdcBllErrors.TaskStateError) { log.infoFormat( "SPMAsyncTask::ClearAsyncTask: At time of attemp to clear task '{0}' the response code was {2} and message was {3}. Task will not be cleaned", - getTaskID(), + getVdsmTaskId(), vdsReturnValue.getVdsError().getCode(), vdsReturnValue.getVdsError().getMessage()); return true; @@ -510,7 +510,7 @@ } protected void LogTaskCleanFailure() { - log.errorFormat("SPMAsyncTask::ClearAsyncTask: Clearing task '{0}' failed.", getTaskID()); + log.errorFormat("SPMAsyncTask::ClearAsyncTask: Clearing task '{0}' failed.", getVdsmTaskId()); } private static final Log log = LogFactory.getLog(SPMAsyncTask.class); 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 1c3cbf2..03c8676 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 @@ -18,9 +18,9 @@ public static void addOrUpdateTaskInDB(SPMAsyncTask asyncTask) { try { if (asyncTask.getParameters().getDbAsyncTask() != null) { - if (DbFacade.getInstance().getAsyncTaskDao().get(asyncTask.getTaskID()) == null) { + if (DbFacade.getInstance().getAsyncTaskDao().getByVdsmTaskId(asyncTask.getVdsmTaskId()) == null) { log.infoFormat("Adding task {0} to DataBase", - asyncTask.getTaskID()); + asyncTask.getVdsmTaskId()); saveAsyncTaskInDB(asyncTask); } else { updateAsyncTaskInDB(asyncTask); @@ -29,7 +29,7 @@ } catch (RuntimeException e) { log.error(String.format( "Adding/Updating task %1$s to DataBase threw an exception.", - asyncTask.getTaskID()), e); + asyncTask.getVdsmTaskId()), e); } } 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 e3fbfa5..a061f46 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 @@ -152,7 +152,7 @@ SPMAsyncTask spmAsyncTask = cmd.concreteCreateTask(info, cmd.getParameters().getParentCommand()); assertEquals("wrong storage pool ID", info.getStoragePoolID(), spmAsyncTask.getStoragePoolID()); - assertEquals("wrong task ID", info.getTaskID(), spmAsyncTask.getTaskID()); + 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()); assertEquals("wrong task state", AsyncTaskState.Initializing, spmAsyncTask.getState()); @@ -180,7 +180,7 @@ AsyncTaskCreationInfo info = new AsyncTaskCreationInfo(); info.setStepId(Guid.NewGuid()); info.setStoragePoolID(Guid.NewGuid()); - info.setTaskID(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/asynctasks/AsyncTaskCreationInfo.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskCreationInfo.java index b246b0d..3849d93 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 @@ -5,7 +5,7 @@ public class AsyncTaskCreationInfo { - private Guid privateTaskID = new Guid(); + private Guid vdsmTaskId = new Guid(); private Guid privateStoragePoolID = new Guid(); private AsyncTaskType privateTaskType = AsyncTaskType.forValue(0); @@ -18,17 +18,17 @@ } public AsyncTaskCreationInfo(Guid taskID, AsyncTaskType taskType, Guid storagePoolID) { - setTaskID(taskID); + setVdsmTaskId(taskID); setTaskType(taskType); setStoragePoolID(storagePoolID); } - public Guid getTaskID() { - return privateTaskID; + public Guid getVdsmTaskId() { + return vdsmTaskId; } - public void setTaskID(Guid value) { - privateTaskID = value; + public void setVdsmTaskId(Guid value) { + vdsmTaskId = value; } public AsyncTaskType getTaskType() { 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 3bbc564..8224b99 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 @@ -34,7 +34,7 @@ } public Guid getTaskID() { - return getCreationInfo().getTaskID(); + return getCreationInfo().getVdsmTaskId(); } private Object _entityId; diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/async_tasks.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/async_tasks.java index 851e4da..0ea6f14 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/async_tasks.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/async_tasks.java @@ -26,22 +26,21 @@ public class async_tasks implements Serializable { private static final long serialVersionUID = 5913365704117183118L; - - public async_tasks() { } - public async_tasks(VdcActionType action_type, AsyncTaskResultEnum result, AsyncTaskStatusEnum status, Guid task_id, + public async_tasks(VdcActionType action_type, AsyncTaskResultEnum result, AsyncTaskStatusEnum status, Guid vdsmTaskId, VdcActionParametersBase action_parameters, NGuid stepId, Guid commandId, Guid storagePoolId, AsyncTaskType taskType) { this.actionType = action_type; this.result = result; this.status = status; - this.taskId = task_id; + this.vdsmTaskId = vdsmTaskId; this.setaction_parameters(action_parameters); this.stepId = stepId; this.startTime = new Date(); this.commandId = commandId; this.storagePoolId = storagePoolId; + this.taskId = Guid.NewGuid(); this.taskType = taskType; } @@ -73,6 +72,17 @@ this.startTime = startTime; } + private Guid taskId; + + public void setTaskId(Guid taskId) { + this.taskId = taskId; + } + + public Guid getTaskId() { + return this.taskId; + } + + public AsyncTaskResultEnum getresult() { return this.result; } @@ -98,14 +108,14 @@ @GenericGenerator(name = "system-uuid", strategy = "org.ovirt.engine.core.dao.GuidGenerator") @Column(name = "task_id") @Type(type = "guid") - private Guid taskId = new Guid(); + private Guid vdsmTaskId = new Guid(); - public Guid gettask_id() { - return this.taskId; + public Guid getVdsmTaskId() { + return this.vdsmTaskId; } - public void settask_id(Guid value) { - this.taskId = value; + public void setVdsmTaskId(Guid value) { + this.vdsmTaskId = value; } @Column(name = "action_parameters") @@ -169,7 +179,7 @@ results = prime * results + ((actionType == null) ? 0 : actionType.hashCode()); results = prime * results + ((result == null) ? 0 : result.hashCode()); results = prime * results + ((status == null) ? 0 : status.hashCode()); - results = prime * results + ((taskId == null) ? 0 : taskId.hashCode()); + 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 + ((startTime == null) ? 0 : startTime.hashCode()); @@ -188,6 +198,11 @@ if (getClass() != obj.getClass()) return false; async_tasks other = (async_tasks) obj; + if (taskId == null) { + if (other.taskId != null) + return false; + } else if (!taskId.equals(other.taskId)) + return false; if (actionParameters == null) { if (other.actionParameters != null) return false; @@ -199,10 +214,10 @@ return false; if (status != other.status) return false; - if (taskId == null) { - if (other.taskId != null) + if (vdsmTaskId == null) { + if (other.vdsmTaskId != null) return false; - } else if (!taskId.equals(other.taskId)) + } else if (!vdsmTaskId.equals(other.vdsmTaskId)) return false; if (stepId == null) { if (other.stepId != null) { 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 fc6a0f7..8be7e0a 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 @@ -20,6 +20,14 @@ */ async_tasks get(Guid id); + + /** + * Retrieves the task with the specified VDSM taskId + * @param vdsmTaskId id of the task as reported by VDSM + * @return the task + */ + async_tasks getByVdsmTaskId(Guid vdsmTaskId); + /** * Gets async task Ids by a given entity Id. * @param entityId the Id of the entity to return the tasks for @@ -73,4 +81,11 @@ */ void save(async_tasks newAsyncTask); + + /** + * Removes the specified task according to its VDSM task id. + * @param vdsmTaskId the VDSM task id. + */ + int removeByVdsmId(Guid vdsmTaskId); + } 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 77f2a08..fa2a448 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 @@ -53,7 +53,8 @@ entity.setaction_type(VdcActionType.forValue(rs.getInt("action_type"))); entity.setresult(AsyncTaskResultEnum.forValue(rs.getInt("result"))); entity.setstatus(AsyncTaskStatusEnum.forValue(rs.getInt("status"))); - entity.settask_id(Guid.createGuidFromString(rs.getString("task_id"))); + entity.setTaskId(Guid.createGuidFromString(rs.getString("task_id"))); + entity.setVdsmTaskId(Guid.createGuidFromString(rs.getString("vdsm_task_id"))); entity.setaction_parameters(deserializeParameters(rs.getString("action_parameters"),rs.getString("action_params_class"))); entity.setStepId(NGuid.createGuidFromString(rs.getString("step_id"))); entity.setCommandId(Guid.createGuidFromString(rs.getString("command_id"))); @@ -80,7 +81,8 @@ addValue("action_type", task.getaction_type()); addValue("result", task.getresult()); addValue("status", task.getstatus()); - addValue("task_id", task.gettask_id()); + addValue("vdsm_task_id", task.getVdsmTaskId()); + addValue("task_id", task.getTaskId()); addValue("action_parameters", serializeParameters(task.getaction_parameters())); addValue("action_params_class",task.getaction_parameters().getClass().getName()); addValue("step_id", task.getStepId()); @@ -175,4 +177,20 @@ parameterSource.addValue("storage_pool_id", storagePoolId); return getCallsHandler().executeReadList("GetAsyncTasksByStoragePoolId", IdRowMapper.instance, parameterSource); } + + @Override + public async_tasks getByVdsmTaskId(Guid vdsmTaskId) { + MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() + .addValue("vdsm_task_id", vdsmTaskId); + + return getCallsHandler().executeRead("GetAsyncTasksByVdsmTaskId", AsyncTaskRowMapper.instance, parameterSource); + } + + @Override + public int removeByVdsmId(Guid vdsmTaskId) { + MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() + .addValue("vdsm_task_id", vdsmTaskId); + + return getCallsHandler().executeModificationRowsAffected("DeleteAsyncTasksByVdsmTaskId", parameterSource); + } } 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 b7445af..a048a2f 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 @@ -46,7 +46,8 @@ // create some test data newAsyncTask = new async_tasks(); - newAsyncTask.settask_id(Guid.NewGuid()); + newAsyncTask.setTaskId(Guid.NewGuid()); + newAsyncTask.setVdsmTaskId(Guid.NewGuid()); newAsyncTask.setStartTime(new Date()); newAsyncTask.setaction_type(VdcActionType.AddDisk); newAsyncTask.setstatus(AsyncTaskStatusEnum.running); @@ -104,7 +105,7 @@ */ @Test public void testGet() { - async_tasks result = dao.get(existingAsyncTask.gettask_id()); + async_tasks result = dao.get(existingAsyncTask.getTaskId()); assertNotNull(result); assertEquals(existingAsyncTask, result); @@ -127,7 +128,7 @@ public void testSave() { dao.save(newAsyncTask); - async_tasks result = dao.get(newAsyncTask.gettask_id()); + async_tasks result = dao.get(newAsyncTask.getTaskId()); /* //Setting startTime to null is required as DB auto generates //the value of start time @@ -147,7 +148,7 @@ List<Guid> asyncTasks = dao.getAsyncTaskIdsByEntity(storageId); assertNotNull(asyncTasks); assertEquals(asyncTasks.size(),1); - assertEquals(asyncTasks.get(0),newAsyncTask.gettask_id()); + assertEquals(asyncTasks.get(0),newAsyncTask.getTaskId()); } /** @@ -163,7 +164,7 @@ existingAsyncTask.setaction_parameters(addDiskToVmParams); dao.update(existingAsyncTask); - async_tasks result = dao.get(existingAsyncTask.gettask_id()); + async_tasks result = dao.get(existingAsyncTask.getTaskId()); assertEquals(existingAsyncTask, result); } @@ -173,14 +174,40 @@ */ @Test public void testRemove() { - async_tasks result = dao.get(existingAsyncTask.gettask_id()); + async_tasks result = dao.get(existingAsyncTask.getTaskId()); assertNotNull(result); - assertEquals(dao.remove(existingAsyncTask.gettask_id()), 1); - result = dao.get(existingAsyncTask.gettask_id()); + assertEquals(dao.remove(existingAsyncTask.getTaskId()), 1); + result = dao.get(existingAsyncTask.getTaskId()); assertNull(result); - assertEquals(dao.remove(existingAsyncTask.gettask_id()), 0); + assertEquals(dao.remove(existingAsyncTask.getTaskId()), 0); + + // The removed task is associated with an entity, try to fetch + // tasks for the entity, and see no task is returned + List<Guid> taskIds = dao.getAsyncTaskIdsByEntity(FixturesTool.ENTITY_WITH_TASKS_ID); + assertNotNull(taskIds); + assertTrue(taskIds.isEmpty()); + } + + @Test + public void testGetTaskByVdsmTaskId() { + async_tasks result = dao.getByVdsmTaskId(FixturesTool.EXISTING_VDSM_TASK_ID); + assertNotNull(result); + assertEquals(existingAsyncTask, result); + + } + + @Test + public void testRemoveByVdsmTaskId() { + async_tasks result = dao.getByVdsmTaskId(FixturesTool.EXISTING_VDSM_TASK_ID); + assertNotNull(result); + + assertEquals(dao.removeByVdsmId(existingAsyncTask.getTaskId()), 1); + result = dao.get(existingAsyncTask.getVdsmTaskId()); + + assertNull(result); + assertEquals(dao.remove(existingAsyncTask.getVdsmTaskId()), 0); // The removed task is associated with an entity, try to fetch // tasks for the entity, and see no task is returned diff --git a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/FixturesTool.java b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/FixturesTool.java index e9e90fa..0a8a72e 100644 --- a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/FixturesTool.java +++ b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/FixturesTool.java @@ -194,6 +194,7 @@ * Predefined async task */ protected static final Guid EXISTING_TASK_ID = new Guid("340fd52b-3400-4cdd-8d3f-C9d03704b0aa"); + protected static final Guid EXISTING_VDSM_TASK_ID = new Guid("140fd52b-3400-4cdd-8d3f-C9d03704b0aa"); /** * ID of an existing snapshot diff --git a/backend/manager/modules/dal/src/test/resources/fixtures.xml b/backend/manager/modules/dal/src/test/resources/fixtures.xml index 37c3347..bb05065 100644 --- a/backend/manager/modules/dal/src/test/resources/fixtures.xml +++ b/backend/manager/modules/dal/src/test/resources/fixtures.xml @@ -41,6 +41,7 @@ <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 --> @@ -51,6 +52,7 @@ <value>2010-12-01 14:13:07</value> <value>6d849ebf-755f-4552-ad09-9a090cda105d</value> <value>3</value> + <value>140fd52b-3400-4cdd-8d3f-c9d03704b0aa</value> </row> <row> <value>340fd52b-3400-4cdd-8d3f-c9d03704b0ab</value> @@ -62,6 +64,7 @@ <value>2010-12-01 14:13:07</value> <value>6d849ebf-755f-4552-ad09-9a090cda105d</value> <value>3</value> + <value>140fd52b-3400-4cdd-8d3f-c9d03704b0ab</value> </row> </table> diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/HSMGetAllTasksInfoVDSCommand.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/HSMGetAllTasksInfoVDSCommand.java index 566bd4b..fa4f0d7 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/HSMGetAllTasksInfoVDSCommand.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/HSMGetAllTasksInfoVDSCommand.java @@ -56,7 +56,7 @@ } AsyncTaskCreationInfo tempVar = new AsyncTaskCreationInfo(); - tempVar.setTaskID(taskID); + tempVar.setVdsmTaskId(taskID); tempVar.setTaskType(taskType); AsyncTaskCreationInfo task = tempVar; -- To view, visit http://gerrit.ovirt.org/9230 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Iebfc85569ba1aa8bd840f7239f83b7f921a4bd8f Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Yair Zaslavsky <yzasl...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches