Arik Hadas has uploaded a new change for review. Change subject: core: introduce PrepareForHibernate VM status ......................................................................
core: introduce PrepareForHibernate VM status This patch adds status for VM that reflects the state in which the VM is going to be hibernated but vdsm didn't start to save the memory state yet. When starting the hibernate command, this is the first status to be set fot the vm, then the images which are going to be used are created, and only when the 'hibernate' verb in the vdsm is called and vdsm reports back that it starts to do the migration to the file, the VM status will be changed to SavingState. Change-Id: Iebc8e0a7cd4b21e751393304ceee65d668d84ca4 Bug-Url: https://bugzilla.redhat.com/949281 Signed-off-by: Arik Hadas <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HibernateVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/StopVmCommandBase.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/VmValidator.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/VdcActionUtils.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VMStatus.java M backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/VmMapper.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ResourceManager.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsUpdateRunTimeInfo.java 8 files changed, 59 insertions(+), 45 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/11/14511/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 0f9f1f1..91f616c 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 @@ -100,7 +100,7 @@ getCompensationContext().snapshotEntityStatus(getVm().getDynamicData(), getVm().getStatus()); // Set the VM to SavingState to lock the VM,to avoid situation of multi VM hibernation. - getVm().setStatus(VMStatus.SavingState); + getVm().setStatus(VMStatus.PreparingForHibernate); Backend.getInstance() .getResourceManager() @@ -290,8 +290,8 @@ private void endSuccessfullyImpl() { if (getVm() != null) { - if (getVm().getStatus() != VMStatus.SavingState && getVm().getStatus() != VMStatus.Up) { - // If the Vm is not in SavingState status/Up, we shouldn't perform Hibernate on it, + if (getVm().getStatus() != VMStatus.PreparingForHibernate) { + // If the Vm is not PreparingForHibernate, we shouldn't perform Hibernate on it, // since if the Vm is in another status, something might have happend to it // that might prevent it from being hibernated. diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/StopVmCommandBase.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/StopVmCommandBase.java index f0d116a..88c333b 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/StopVmCommandBase.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/StopVmCommandBase.java @@ -53,7 +53,7 @@ addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_VM_NOT_FOUND); } else if (!getVm().isRunning() && getVm().getStatus() != VMStatus.Paused && getVm().getStatus() != VMStatus.NotResponding && getVm().getStatus() != VMStatus.Suspended) { - if (getVm().getStatus() == VMStatus.SavingState || getVm().getStatus() == VMStatus.RestoringState) { + if (getVm().getStatus().isHibernating() || getVm().getStatus() == VMStatus.RestoringState) { retValue = false; addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_VM_IS_SAVING_RESTORING); } else { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/VmValidator.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/VmValidator.java index 32fdca1..50b2c58 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/VmValidator.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/VmValidator.java @@ -42,7 +42,7 @@ } public ValidationResult vmNotSavingRestoring() { - if (vm.getStatus() == VMStatus.SavingState || vm.getStatus() == VMStatus.RestoringState) { + if (vm.getStatus().isHibernating() || vm.getStatus() == VMStatus.RestoringState) { return new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_VM_IS_SAVING_RESTORING); } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/VdcActionUtils.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/VdcActionUtils.java index a0c58ef..2a2a707 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/VdcActionUtils.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/VdcActionUtils.java @@ -175,6 +175,15 @@ VdcActionType.AddVmInterface, VdcActionType.UpdateVmInterface, VdcActionType.RemoveVmInterface, VdcActionType.CancelMigrateVm))); vmMatrix.put( + VMStatus.PreparingForHibernate, + new HashSet<VdcActionType>(Arrays.asList(VdcActionType.RunVm, + VdcActionType.RunVmOnce, VdcActionType.StopVm, VdcActionType.ShutdownVm, + VdcActionType.HibernateVm, VdcActionType.MigrateVm, VdcActionType.RemoveVm, + VdcActionType.AddVmTemplate, VdcActionType.ExportVm, VdcActionType.MoveVm, + VdcActionType.ImportVm, VdcActionType.ChangeDisk, + VdcActionType.AddVmInterface, VdcActionType.UpdateVmInterface, + VdcActionType.RemoveVmInterface, VdcActionType.CancelMigrateVm))); + vmMatrix.put( VMStatus.RestoringState, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.RunVm, VdcActionType.RunVmOnce, VdcActionType.StopVm, VdcActionType.ShutdownVm, diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VMStatus.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VMStatus.java index 136b1df..e7d995d 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VMStatus.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VMStatus.java @@ -20,7 +20,8 @@ Suspended(13), ImageIllegal(14), ImageLocked(15), - PoweringDown(16); + PoweringDown(16), + PreparingForHibernate(17); private int value; private static HashMap<Integer, VMStatus> valueToStatus = new HashMap<Integer, VMStatus>(); @@ -72,7 +73,7 @@ * @return true if this status indicates that the VM is paused or running for sure, otherwise false */ public boolean isRunningOrPaused() { - return this.isRunning() || this == Paused || this == SavingState || this == RestoringState; + return this.isRunning() || this == Paused || this.isHibernating() || this == RestoringState; } /** @@ -114,4 +115,14 @@ public boolean isStartingOrUp() { return this == Up || isStarting(); } + + /** + * This method reflects whether the VM is in the process of getting into + * hibernation mode. + * + * @return true if the VM is in the middle of hibernation process + */ + public boolean isHibernating() { + return this == SavingState || this == PreparingForHibernate; + } } diff --git a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/VmMapper.java b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/VmMapper.java index 3a1bfed..7417afc 100644 --- a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/VmMapper.java +++ b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/VmMapper.java @@ -622,24 +622,25 @@ @Mapping(from = VMStatus.class, to = VmStatus.class) public static VmStatus map(VMStatus entityStatus, VmStatus template) { switch (entityStatus) { - case Unassigned: return VmStatus.UNASSIGNED; - case Down: return VmStatus.DOWN; - case Up: return VmStatus.UP; - case PoweringUp: return VmStatus.POWERING_UP; - case PoweredDown: return VmStatus.POWERED_DOWN; - case Paused: return VmStatus.PAUSED; - case MigratingFrom: return VmStatus.MIGRATING; - case MigratingTo: return VmStatus.MIGRATING; - case Unknown: return VmStatus.UNKNOWN; - case NotResponding: return VmStatus.NOT_RESPONDING; - case WaitForLaunch: return VmStatus.WAIT_FOR_LAUNCH; - case RebootInProgress: return VmStatus.REBOOT_IN_PROGRESS; - case SavingState: return VmStatus.SAVING_STATE; - case RestoringState: return VmStatus.RESTORING_STATE; - case Suspended: return VmStatus.SUSPENDED; - case ImageLocked: return VmStatus.IMAGE_LOCKED; - case PoweringDown: return VmStatus.POWERING_DOWN; - default: return null; + case Unassigned: return VmStatus.UNASSIGNED; + case Down: return VmStatus.DOWN; + case Up: return VmStatus.UP; + case PoweringUp: return VmStatus.POWERING_UP; + case PoweredDown: return VmStatus.POWERED_DOWN; + case Paused: return VmStatus.PAUSED; + case MigratingFrom: return VmStatus.MIGRATING; + case MigratingTo: return VmStatus.MIGRATING; + case Unknown: return VmStatus.UNKNOWN; + case NotResponding: return VmStatus.NOT_RESPONDING; + case WaitForLaunch: return VmStatus.WAIT_FOR_LAUNCH; + case RebootInProgress: return VmStatus.REBOOT_IN_PROGRESS; + case PreparingForHibernate: + case SavingState: return VmStatus.SAVING_STATE; + case RestoringState: return VmStatus.RESTORING_STATE; + case Suspended: return VmStatus.SUSPENDED; + case ImageLocked: return VmStatus.IMAGE_LOCKED; + case PoweringDown: return VmStatus.POWERING_DOWN; + default: return null; } } diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ResourceManager.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ResourceManager.java index 1dd7562..fe5068b 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ResourceManager.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ResourceManager.java @@ -69,25 +69,18 @@ } } - // Cleanup all vms dynamic data. This is defencive code on power crash + // Cleanup all vms dynamic data. This is defensive code on power crash List<VM> vms = DbFacade.getInstance().getVmDao().getAll(); for (VM vm : vms) { if (!vm.isNotRunning()) { - // check if vm should be suspended - if (vm.getStatus() == VMStatus.SavingState) { - InternalSetVmStatus(vm, VMStatus.Suspended); - DbFacade.getInstance().getVmDynamicDao().update(vm.getDynamicData()); - DbFacade.getInstance().getVmStatisticsDao().update(vm.getStatisticsData()); - } else { - if (vm.getRunOnVds() != null) { - MultiValueMapUtils.addToMap(vm.getRunOnVds().getValue(), - vm.getId(), - _vdsAndVmsList, - new MultiValueMapUtils.HashSetCreator<Guid>()); - } - if (vm.getRunOnVds() != null && nonResponsiveVdss.contains(vm.getRunOnVds())) { - SetVmUnknown(vm); - } + if (vm.getRunOnVds() != null) { + MultiValueMapUtils.addToMap(vm.getRunOnVds().getValue(), + vm.getId(), + _vdsAndVmsList, + new MultiValueMapUtils.HashSetCreator<Guid>()); + } + if (vm.getRunOnVds() != null && nonResponsiveVdss.contains(vm.getRunOnVds())) { + SetVmUnknown(vm); } } } diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsUpdateRunTimeInfo.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsUpdateRunTimeInfo.java index 30e9b38..d2567f1 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsUpdateRunTimeInfo.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsUpdateRunTimeInfo.java @@ -1252,8 +1252,8 @@ VM vmToUpdate = _vmDict.get(runningVm.getId()); if (vmToUpdate == null - || (vmToUpdate.getStatus() != runningVm.getStatus() && !(vmToUpdate.getStatus() == VMStatus.SavingState && runningVm - .getStatus() == VMStatus.Up))) { + || (vmToUpdate.getStatus() != runningVm.getStatus() && + !(vmToUpdate.getStatus() == VMStatus.PreparingForHibernate && runningVm.getStatus() == VMStatus.Up))) { GetVmStatsVDSCommand<GetVmStatsVDSCommandParameters> command = new GetVmStatsVDSCommand<GetVmStatsVDSCommandParameters>(new GetVmStatsVDSCommandParameters( _vds, runningVm.getId())); @@ -1732,8 +1732,8 @@ props.remove("appList"); vmNewDynamicData.setAppList(vmToUpdate.argvalue.getAppList()); } else if (props.contains("status") - && vmToUpdate.argvalue.getDynamicData().getStatus() == VMStatus.SavingState) { - vmNewDynamicData.setStatus(VMStatus.SavingState); + && vmToUpdate.argvalue.getDynamicData().getStatus() == VMStatus.PreparingForHibernate) { + vmNewDynamicData.setStatus(VMStatus.PreparingForHibernate); props.remove("status"); } // if anything else changed -- To view, visit http://gerrit.ovirt.org/14511 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Iebc8e0a7cd4b21e751393304ceee65d668d84ca4 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Arik Hadas <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
