Search in sources :

Example 1 with HostJobStatus

use of org.ovirt.engine.core.common.businessentities.HostJobInfo.HostJobStatus in project ovirt-engine by oVirt.

the class HostJobCallback method childCommandsExecutionEnded.

@Override
protected void childCommandsExecutionEnded(CommandBase<?> command, boolean anyFailed, List<Guid> childCmdIds, CommandExecutionStatus status, int completedChildren) {
    Guid cmdId = command.getCommandId();
    CommandEntity commandEntity = commandCoordinatorUtil.getCommandEntity(cmdId);
    ActionParametersBase cmdParams = commandEntity.getCommandParameters();
    Guid job = ((HostJobCommandParameters) cmdParams).getHostJobId();
    HostJobStatus jobStatus = null;
    Guid vdsId = cmdParams.getVdsRunningOn();
    VDS vds = getVdsDao().get(vdsId);
    if (vds != null) {
        boolean jobsReportedByHost = false;
        if (vds.getStatus() == VDSStatus.Up) {
            HostJobInfo jobInfo;
            try {
                jobInfo = pollStorageJob(job, vdsId);
            } catch (Exception e) {
                // We shouldn't get an error when polling the host job (as it access the local storage only).
                // If we got an error, it will usually be a network error - so the host will either move
                // to Non Responsive or the polling will succeed on the next attempt.
                log.warn("Command {} id: '{}': Failed to poll the job '{}' on host '{}' (id: '{}'), will retry soon", commandEntity.getCommandType(), cmdId, job, vds.getName(), vdsId);
                return;
            }
            if (jobInfo != null) {
                handlePolledJobInfo(getCommand(cmdId), jobInfo);
                jobStatus = jobInfo.getStatus();
                updateStepProgress(commandEntity.getCommandContext().getStepId(), jobInfo.getProgress());
            }
            jobsReportedByHost = true;
        } else {
            log.warn("Command {} id: '{}': can't poll the job '{}' as host '{}' (id: '{}') isn't in status UP", commandEntity.getCommandType(), cmdId, job, vds.getName(), vdsId);
        }
        // If we couldn't determine job status by polling the host, we can try to determine it using different methods.
        if (jobStatus == null) {
            jobStatus = handleUndeterminedJobStatus(getCommand(cmdId), jobsReportedByHost);
        }
        if (jobStatus == null) {
            log.info("Command {} id: '{}': couldn't get the status of job '{}' on host '{}' (id: '{}'), assuming it's " + "still running", commandEntity.getCommandType(), cmdId, job, vds.getName(), vdsId);
            return;
        }
        if (jobStatus.isAlive()) {
            log.info("Command {} id: '{}': waiting for job '{}' on host '{}' (id: '{}') to complete", commandEntity.getCommandType(), cmdId, job, vds.getName(), vdsId);
            return;
        }
        log.info("Command {} id: '{}': job '{}' execution was completed with VDSM job status '{}'", commandEntity.getCommandType(), cmdId, job, jobStatus);
        if (command.shouldUpdateStepProgress() && jobStatus == HostJobStatus.done) {
            updateStepProgress(commandEntity.getCommandContext().getStepId(), MAX_PROGRESS);
        }
    } else {
        jobStatus = HostJobStatus.failed;
        log.info("Command {} id: '{}': job '{}' wasn't executed on any host, considering the job status as failed", commandEntity.getCommandType(), cmdId, job);
    }
    command.getParameters().setTaskGroupSuccess(status == CommandExecutionStatus.EXECUTED && jobStatus == HostJobStatus.done);
    command.setCommandStatus(command.getParameters().getTaskGroupSuccess() ? CommandStatus.SUCCEEDED : CommandStatus.FAILED);
    log.info("Command {} id: '{}': execution was completed, the command status is '{}'", command.getActionType(), command.getCommandId(), command.getCommandStatus());
}
Also used : HostJobStatus(org.ovirt.engine.core.common.businessentities.HostJobInfo.HostJobStatus) VDS(org.ovirt.engine.core.common.businessentities.VDS) CommandEntity(org.ovirt.engine.core.common.businessentities.CommandEntity) Guid(org.ovirt.engine.core.compat.Guid) HostJobInfo(org.ovirt.engine.core.common.businessentities.HostJobInfo) HostJobCommandParameters(org.ovirt.engine.core.common.action.HostJobCommandParameters) ActionParametersBase(org.ovirt.engine.core.common.action.ActionParametersBase)

Example 2 with HostJobStatus

use of org.ovirt.engine.core.common.businessentities.HostJobInfo.HostJobStatus in project ovirt-engine by oVirt.

the class GetHostJobsVDSCommand method parseJob.

private HostJobInfo parseJob(Map<String, Object> job) {
    Guid id = Guid.createGuidFromString((String) job.get(VdsProperties.jobId));
    HostJobType type = HostJobType.valueOf((String) job.get(VdsProperties.jobType));
    HostJobStatus status = HostJobStatus.valueOf((String) job.get(VdsProperties.jobStatus));
    String description = (String) job.get(VdsProperties.jobDescription);
    Integer jobProgress = job.containsKey(VdsProperties.jobProgress) ? ((Double) job.get(VdsProperties.jobProgress)).intValue() : null;
    VDSError error = null;
    if (job.containsKey(VdsProperties.jobError)) {
        Map<String, Object> errorInfo = (Map<String, Object>) job.get(VdsProperties.jobError);
        Integer code = (Integer) errorInfo.get(VdsProperties.jobErrorCode);
        String message = (String) errorInfo.get(VdsProperties.jobErrorMessage);
        error = new VDSError(EngineError.forValue(code), message);
    }
    return new HostJobInfo(id, description, type, status, jobProgress, error);
}
Also used : HostJobStatus(org.ovirt.engine.core.common.businessentities.HostJobInfo.HostJobStatus) VDSError(org.ovirt.engine.core.common.errors.VDSError) Guid(org.ovirt.engine.core.compat.Guid) HostJobType(org.ovirt.engine.core.common.businessentities.HostJobInfo.HostJobType) HostJobInfo(org.ovirt.engine.core.common.businessentities.HostJobInfo) Map(java.util.Map)

Example 3 with HostJobStatus

use of org.ovirt.engine.core.common.businessentities.HostJobInfo.HostJobStatus in project ovirt-engine by oVirt.

the class HostJobCallback method handleUndeterminedJobStatus.

private HostJobStatus handleUndeterminedJobStatus(CommandBase<? extends HostJobCommandParameters> cmd, boolean jobsReportedByHost) {
    // If the command supports entity polling, we can use it in order to determine the status.
    if (isEntityPollingSupported(cmd)) {
        log.info("Command {} id: '{}': attempting to determine the job status by polling the entity.", cmd.getActionType(), cmd.getCommandId());
        HostJobStatus jobStatus = pollEntity(cmd);
        if (jobStatus != null) {
            return jobStatus;
        }
        // If the job status couldn't been detected using entity polling and the command supports job fencing, we
        // can attempt to fence the job - which means that the host will fail to execute it if it attempts to.
        // Note that we may attempt to perform the fencing even if the job failed in case we couldn't determine
        // the job status, that'll confirm the job failure.
        // 
        // Fencing the operation will usually be performed by executing an asynchronous fencing command on the
        // entity the job is supposed to be performed on.
        // If a fencing command was executed, the callback will wait for it to end and then will try to poll the
        // entity again (it'll be detected as a running child command). On synchronous fencing/no fencing we
        // will attempt to poll the entity again.
        ((EntityPollingCommand) cmd).attemptToFenceJob();
        return null;
    }
    if (((HostJobCommand) cmd).failJobWithUndeterminedStatus()) {
        log.error("Command {} id: '{}': failed to determine the actual job status, considering as failed as per" + " the command implementation", cmd.getActionType(), cmd.getCommandId());
        return HostJobStatus.failed;
    }
    // (as the command doesn't support entity polling - so we don't have any way to poll it).
    if (jobsReportedByHost) {
        log.error("Command {} id: '{}': entity polling isn't supported and the job isn't reported by the host," + "assuming it failed so that the command execution will end.", cmd.getActionType(), cmd.getCommandId());
        return HostJobStatus.failed;
    }
    // if we couldn't determine the job status, we'll retry to poll it.
    log.error("Command {} id: '{}': failed to determine the actual job status, will retry to poll the job soon", cmd.getActionType(), cmd.getCommandId());
    return null;
}
Also used : HostJobStatus(org.ovirt.engine.core.common.businessentities.HostJobInfo.HostJobStatus) EntityPollingCommand(org.ovirt.engine.core.bll.storage.EntityPollingCommand)

Aggregations

HostJobStatus (org.ovirt.engine.core.common.businessentities.HostJobInfo.HostJobStatus)3 HostJobInfo (org.ovirt.engine.core.common.businessentities.HostJobInfo)2 Guid (org.ovirt.engine.core.compat.Guid)2 Map (java.util.Map)1 EntityPollingCommand (org.ovirt.engine.core.bll.storage.EntityPollingCommand)1 ActionParametersBase (org.ovirt.engine.core.common.action.ActionParametersBase)1 HostJobCommandParameters (org.ovirt.engine.core.common.action.HostJobCommandParameters)1 CommandEntity (org.ovirt.engine.core.common.businessentities.CommandEntity)1 HostJobType (org.ovirt.engine.core.common.businessentities.HostJobInfo.HostJobType)1 VDS (org.ovirt.engine.core.common.businessentities.VDS)1 VDSError (org.ovirt.engine.core.common.errors.VDSError)1