Arik Hadas has uploaded a new change for review. Change subject: core: tm ......................................................................
core: tm Change-Id: Ibb01cc2a72b3358e23c727d646363c919a77bcfc Signed-off-by: Arik Hadas <aha...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HibernateVmCommand.java 1 file changed, 53 insertions(+), 62 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/69/37669/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HibernateVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HibernateVmCommand.java index 9d4fa81..859b3f9 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HibernateVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HibernateVmCommand.java @@ -1,6 +1,5 @@ package org.ovirt.engine.core.bll; -import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; @@ -11,13 +10,16 @@ import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.FeatureSupported; import org.ovirt.engine.core.common.VdcObjectType; +import org.ovirt.engine.core.common.action.AddDiskParameters; import org.ovirt.engine.core.common.action.LockProperties; import org.ovirt.engine.core.common.action.LockProperties.Scope; import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.action.VdcReturnValueBase; import org.ovirt.engine.core.common.action.VmOperationParameterBase; import org.ovirt.engine.core.common.asynctasks.AsyncTaskType; import org.ovirt.engine.core.common.asynctasks.EntityInfo; import org.ovirt.engine.core.common.businessentities.DiskImage; +import org.ovirt.engine.core.common.businessentities.DiskInterface; import org.ovirt.engine.core.common.businessentities.Snapshot.SnapshotType; import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.StorageType; @@ -27,11 +29,11 @@ import org.ovirt.engine.core.common.errors.VdcBLLException; import org.ovirt.engine.core.common.errors.VdcBllMessages; import org.ovirt.engine.core.common.locks.LockingGroup; +import org.ovirt.engine.core.common.queries.IdQueryParameters; +import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.common.utils.Pair; -import org.ovirt.engine.core.common.vdscommands.CreateImageVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.HibernateVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; -import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.slf4j.Logger; @@ -41,9 +43,6 @@ @NonTransactiveCommandAttribute(forceCompensation = true) public class HibernateVmCommand<T extends VmOperationParameterBase> extends VmOperationCommandBase<T> { private static final Logger log = LoggerFactory.getLogger(HibernateVmCommand.class); - - private static final String SAVE_IMAGE_TASK_KEY = "SAVE_IMAGE_TASK_KEY"; - private static final String SAVE_RAM_STATE_TASK_KEY = "SAVE_RAM_STATE_TASK_KEY"; private boolean isHibernateVdsProblematic; private Guid cachedStorageDomainId; @@ -70,12 +69,6 @@ return lockProperties.withScope(Scope.Command); } - @Override - protected void insertAsyncTaskPlaceHolders() { - persistAsyncTaskPlaceHolder(getParameters().getParentCommand(), SAVE_IMAGE_TASK_KEY); - persistAsyncTaskPlaceHolder(getParameters().getParentCommand(), SAVE_RAM_STATE_TASK_KEY); - } - /** * Finds an active data/master storage domain which has enough space to store the hibernation volumes * @@ -97,65 +90,63 @@ @Override protected void perform() { - final Guid taskId1 = getAsyncTaskId(SAVE_IMAGE_TASK_KEY); + Guid dumpDiskId = createMemoryDumpDisk(); + Guid metadataDiskId = createMemoryMetadataDisk(); - Guid image1GroupId = Guid.newGuid(); - - Guid hiberVol1 = Guid.newGuid(); - final VDSReturnValue ret1 = - runVdsCommand( - VDSCommandType.CreateImage, - new CreateImageVDSCommandParameters( - getStoragePoolId(), - getStorageDomainId(), - image1GroupId, - getVm().getTotalMemorySizeInBytes(), - getMemoryVolumeType(), - VolumeFormat.RAW, - hiberVol1, - "")); - - if (!ret1.getSucceeded()) { - return; - } - - Guid guid1 = createTask(taskId1, ret1.getCreationInfo(), VdcActionType.HibernateVm); - getReturnValue().getVdsmTaskIdList().add(guid1); - - Guid taskId2 = getAsyncTaskId(SAVE_RAM_STATE_TASK_KEY); - - // second vol should be 10kb - Guid image2GroupId = Guid.newGuid(); - - Guid hiberVol2 = Guid.newGuid(); - VDSReturnValue ret2 = - runVdsCommand( - VDSCommandType.CreateImage, - new CreateImageVDSCommandParameters(getStoragePoolId(), - getStorageDomainId(), - image2GroupId, - MemoryUtils.META_DATA_SIZE_IN_BYTES, - VolumeType.Sparse, - VolumeFormat.COW, - hiberVol2, - "")); - - if (!ret2.getSucceeded()) { - return; - } - Guid guid2 = createTask(taskId2, ret2.getCreationInfo(), VdcActionType.HibernateVm); - getReturnValue().getVdsmTaskIdList().add(guid2); + DiskImage dumpDisk = getDisk(dumpDiskId); + DiskImage metadataDisk = getDisk(metadataDiskId); getSnapshotDAO().updateHibernationMemory(getVmId(), MemoryUtils.createMemoryStateString( getStorageDomainId(), getStoragePoolId(), - image1GroupId, hiberVol1, image2GroupId, hiberVol2)); - - getParameters().setVdsmTaskIds(new ArrayList<Guid>(getReturnValue().getVdsmTaskIdList())); + dumpDisk.getId(), dumpDisk.getImageId(), metadataDisk.getId(), metadataDisk.getImageId())); setSucceeded(true); } + private DiskImage getDisk(Guid diskId) { + return runInternalQuery(VdcQueryType.GetDiskByDiskId, new IdQueryParameters(diskId)).getReturnValue(); + } + + private Guid createMemoryMetadataDisk() { + DiskImage image = new DiskImage(); + image.setDiskAlias(String.format("%s_Hibernation_metadata", getVm().getName())); + image.setDescription("Meta-data for hibernated VM"); + image.setSize(MemoryUtils.META_DATA_SIZE_IN_BYTES); + image.setVolumeType(VolumeType.Sparse); + image.setvolumeFormat(VolumeFormat.COW); + image.setDiskInterface(DiskInterface.VirtIO); + return addDisk(image); + } + + private Guid createMemoryDumpDisk() { + DiskImage image = new DiskImage(); + image.setDiskAlias(String.format("%s_Hibernation_dump", getVm().getName())); + image.setDescription("Memory dump for hibernated VM"); + image.setSize(getVm().getTotalMemorySizeInBytes()); + image.setVolumeType(getMemoryVolumeType()); + image.setvolumeFormat(VolumeFormat.RAW); + image.setDiskInterface(DiskInterface.VirtIO); + return addDisk(image); + } + + private Guid addDisk(DiskImage disk) { + AddDiskParameters addDiskParameters = new AddDiskParameters(Guid.Empty, disk); + addDiskParameters.setStorageDomainId(getStorageDomainId()); + addDiskParameters.setParentCommand(getActionType()); + addDiskParameters.setParentParameters(getParameters()); + VdcReturnValueBase vdcReturnValue = + runInternalActionWithTasksContext(VdcActionType.AddDisk, addDiskParameters); + + if (vdcReturnValue.getSucceeded()) { + getTaskIdList().addAll(vdcReturnValue.getInternalVdsmTaskIdList()); + return vdcReturnValue.getActionReturnValue(); + } else { + throw new VdcBLLException(vdcReturnValue.getFault().getError(), + String.format("Failed to create disk! %s", disk.getDiskAlias())); + } + } + @Override protected AsyncTaskType getTaskType() { return AsyncTaskType.createVolume; -- To view, visit http://gerrit.ovirt.org/37669 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ibb01cc2a72b3358e23c727d646363c919a77bcfc Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Arik Hadas <aha...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches