use of org.ovirt.engine.core.bll.tasks.interfaces.SPMTask in project ovirt-engine by oVirt.
the class AsyncTaskManager method addStoragePoolExistingTasks.
/**
* Retrieves from the specified storage pool the tasks that exist on it and
* adds them to the manager.
*
* @param sp the storage pool to retrieve running tasks from
*/
public void addStoragePoolExistingTasks(StoragePool sp) {
List<AsyncTaskCreationInfo> currPoolTasks = null;
try {
currPoolTasks = coco.getAllTasksInfo(sp.getId());
} catch (RuntimeException e) {
log.error("Getting existing tasks on Storage Pool '{}' failed: {}", sp.getName(), e.getMessage());
log.debug("Exception", e);
}
if (currPoolTasks != null && currPoolTasks.size() > 0) {
synchronized (this) {
final List<SPMTask> newlyAddedTasks = new ArrayList<>();
for (AsyncTaskCreationInfo creationInfo : currPoolTasks) {
creationInfo.setStoragePoolID(sp.getId());
if (!tasks.containsKey(creationInfo.getVdsmTaskId())) {
try {
SPMTask task;
if (partiallyCompletedCommandTasks.containsKey(creationInfo.getVdsmTaskId())) {
AsyncTask asyncTaskInDb = partiallyCompletedCommandTasks.get(creationInfo.getVdsmTaskId());
task = coco.construct(creationInfo, asyncTaskInDb);
if (task.getEntitiesMap() == null) {
task.setEntitiesMap(new HashMap<>());
}
partiallyCompletedCommandTasks.remove(task.getVdsmTaskId());
// mark it as a task of a partially completed command
// Will result in failure of the command
task.setPartiallyCompletedCommandTask(true);
} else {
task = asyncTaskFactory.construct(creationInfo);
}
addTaskToManager(task);
newlyAddedTasks.add(task);
} catch (Exception e) {
log.error("Failed to load task of type '{}' with id '{}': {}.", creationInfo.getTaskType(), creationInfo.getVdsmTaskId(), ExceptionUtils.getRootCauseMessage(e));
log.debug("Exception", e);
}
}
}
TransactionSupport.executeInNewTransaction(() -> {
for (SPMTask task : newlyAddedTasks) {
AsyncTaskUtils.addOrUpdateTaskInDB(coco, task);
}
return null;
});
for (SPMTask task : newlyAddedTasks) {
startPollingTask(task.getVdsmTaskId());
}
log.info("Discovered {} tasks on Storage Pool '{}', {} added to manager.", currPoolTasks.size(), sp.getName(), newlyAddedTasks.size());
}
} else {
log.info("Discovered no tasks on Storage Pool '{}'", sp.getName());
}
List<AsyncTask> tasksInDForStoragePool = tasksInDbAfterRestart.get(sp.getId());
if (tasksInDForStoragePool != null) {
for (AsyncTask task : tasksInDForStoragePool) {
if (!tasks.containsKey(task.getVdsmTaskId())) {
coco.removeByVdsmTaskId(task.getVdsmTaskId());
}
}
}
// Either the tasks were only in DB - so they were removed from db, or they are polled -
// in any case no need to hold them in the map that represents the tasksInDbAfterRestart
tasksInDbAfterRestart.remove(sp.getId());
}
Aggregations