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

Reply via email to