예제 #1
0
 public void logAndFailPartiallySubmittedTaskOfCommand(final AsyncTask task, String message) {
   log.info(
       "Failing partially submitted task AsyncTaskType '{}': Task '{}' Parent Command '{}'",
       task.getTaskType(),
       task.getTaskId(),
       task.getActionType());
   task.getTaskParameters().setTaskGroupSuccess(false);
   if (task.getActionType() == VdcActionType.Unknown) {
     removeTaskFromDbByTaskId(task.getTaskId());
     log.info(
         "Not calling endAction for partially submitted task and AsyncTaskType '{}': Task '{}' Parent Command '{}'",
         task.getTaskType(),
         task.getTaskId(),
         task.getActionType());
     return;
   }
   log.info(
       "Calling updateTask for partially submitted task and AsyncTaskType '{}': Task '{}' Parent Command"
           + " '{}' Parameters class '{}'",
       task.getTaskType(),
       task.getTaskId(),
       task.getActionType());
   AsyncTaskCreationInfo creationInfo =
       new AsyncTaskCreationInfo(Guid.Empty, task.getTaskType(), task.getStoragePoolId());
   SPMTask spmTask = coco.construct(creationInfo, task);
   AsyncTaskStatus failureStatus = new AsyncTaskStatus();
   failureStatus.setStatus(AsyncTaskStatusEnum.finished);
   failureStatus.setResult(AsyncTaskResultEnum.failure);
   failureStatus.setMessage(message);
   spmTask.setState(AsyncTaskState.Ended);
   spmTask.setLastTaskStatus(failureStatus);
   spmTask.updateTask(failureStatus);
 }
예제 #2
0
  /**
   * 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 = coco.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(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());
  }
예제 #3
0
 public SPMTask createTask(AsyncTaskType taskType, AsyncTaskParameters taskParameters) {
   return coco.construct(taskType, taskParameters, false);
 }