Search in sources :

Example 6 with SPMTask

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());
}
Also used : AsyncTaskCreationInfo(org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo) SPMTask(org.ovirt.engine.core.bll.tasks.interfaces.SPMTask) ArrayList(java.util.ArrayList) AsyncTask(org.ovirt.engine.core.common.businessentities.AsyncTask) EngineException(org.ovirt.engine.core.common.errors.EngineException)

Aggregations

SPMTask (org.ovirt.engine.core.bll.tasks.interfaces.SPMTask)6 AsyncTaskCreationInfo (org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo)2 AsyncTaskStatus (org.ovirt.engine.core.common.businessentities.AsyncTaskStatus)2 Guid (org.ovirt.engine.core.compat.Guid)2 ArrayList (java.util.ArrayList)1 HashSet (java.util.HashSet)1 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)1 AsyncTask (org.ovirt.engine.core.common.businessentities.AsyncTask)1 EngineException (org.ovirt.engine.core.common.errors.EngineException)1 AuditLogable (org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogable)1 AuditLogableImpl (org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableImpl)1