package org.ovirt.engine.core.bll.storage.disk.image;
import javax.inject.Singleton;
import org.ovirt.engine.core.bll.storage.utils.VdsCommandsHelper;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.businessentities.HostJobInfo.HostJobStatus;
import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
import org.ovirt.engine.core.common.businessentities.storage.Image;
import org.ovirt.engine.core.common.constants.StorageConstants;
import org.ovirt.engine.core.common.vdscommands.GetVolumeInfoVDSCommandParameters;
import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
import org.ovirt.engine.core.compat.Guid;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Singleton
public final class VdsmImagePoller {
private static final Logger log = LoggerFactory.getLogger(VdsmImagePoller.class);
private VdsmImagePoller() {
}
protected HostJobStatus pollImage(Guid storagePoolId, Guid storageDomainId, Guid imageGroupId, Guid imageId,
int executionGeneration, Guid cmdId, VdcActionType actionType) {
Image imageInfo =
((DiskImage) VdsCommandsHelper.runVdsCommandWithoutFailover(
VDSCommandType.GetVolumeInfo,
new GetVolumeInfoVDSCommandParameters(storagePoolId,
storageDomainId,
imageGroupId,
imageId), storagePoolId, null).getReturnValue()).getImage();
if (imageInfo.getLeaseStatus() != null && !imageInfo.getLeaseStatus().isFree()) {
log.info("Command {} id: '{}': the volume lease is not FREE - the job is running",
actionType, cmdId);
return HostJobStatus.running;
}
if (imageInfo.getGeneration() == executionGeneration + 1) {
log.info("Command {} id: '{}': the volume lease is free and the generation was incremented - the " +
"job execution has completed successfully",
actionType, cmdId);
return HostJobStatus.done;
}
if (imageInfo.getGeneration() == executionGeneration + StorageConstants.ENTITY_FENCING_GENERATION_DIFF) {
log.info("Command {} id: '{}': the volume generation was incremented by the job fencing diff - the job " +
"was fenced and its status can be considered as failed",
actionType,
cmdId);
return HostJobStatus.failed;
}
log.info("Command {} id: '{}': couldn't determine the status of the job by entity polling", actionType, cmdId);
return null;
}
}