This is an automated email from the ASF dual-hosted git repository.

dahn pushed a commit to branch 4.19
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.19 by this push:
     new 7b68615bd97 HA: set correct hostId of HA work for vm migration (#10591)
7b68615bd97 is described below

commit 7b68615bd976712dc810726ee8241fd35dd9ebaf
Author: Wei Zhou <weiz...@apache.org>
AuthorDate: Thu Apr 17 09:02:46 2025 +0100

    HA: set correct hostId of HA work for vm migration (#10591)
---
 .../java/com/cloud/vm/VirtualMachineManagerImpl.java   |  3 +--
 .../src/main/java/com/cloud/vm/VMInstanceVO.java       |  2 +-
 .../java/com/cloud/ha/HighAvailabilityManagerImpl.java | 18 +++++++++++++++++-
 3 files changed, 19 insertions(+), 4 deletions(-)

diff --git 
a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java
 
b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java
index 055c1a2d444..f2e90decdea 100755
--- 
a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java
+++ 
b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -5248,10 +5248,9 @@ public class VirtualMachineManagerImpl extends 
ManagerBase implements VirtualMac
             workJob = newVmWorkJobAndInfo.first();
             VmWorkMigrateAway workInfo = new 
VmWorkMigrateAway(newVmWorkJobAndInfo.second(), srcHostId);
 
-            workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+            setCmdInfoAndSubmitAsyncJob(workJob, workInfo, vmId);
         }
 
-        _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vmId);
 
         
AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(workJob.getId());
 
diff --git a/engine/schema/src/main/java/com/cloud/vm/VMInstanceVO.java 
b/engine/schema/src/main/java/com/cloud/vm/VMInstanceVO.java
index f3560d68f49..320c9a30fb4 100644
--- a/engine/schema/src/main/java/com/cloud/vm/VMInstanceVO.java
+++ b/engine/schema/src/main/java/com/cloud/vm/VMInstanceVO.java
@@ -502,7 +502,7 @@ public class VMInstanceVO implements VirtualMachine, 
FiniteStateObject<State, Vi
 
     @Override
     public String toString() {
-        return String.format("VM instance %s", 
ReflectionToStringBuilderUtils.reflectOnlySelectedFields(this, "id", 
"instanceName", "uuid", "type"));
+        return String.format("VM instance %s", 
ReflectionToStringBuilderUtils.reflectOnlySelectedFields(this, "id", 
"instanceName", "uuid", "type", "state"));
     }
 
     @Override
diff --git a/server/src/main/java/com/cloud/ha/HighAvailabilityManagerImpl.java 
b/server/src/main/java/com/cloud/ha/HighAvailabilityManagerImpl.java
index 81ae44a9763..aa43e6b9161 100644
--- a/server/src/main/java/com/cloud/ha/HighAvailabilityManagerImpl.java
+++ b/server/src/main/java/com/cloud/ha/HighAvailabilityManagerImpl.java
@@ -342,7 +342,8 @@ public class HighAvailabilityManagerImpl extends 
ManagerBase implements Configur
     @Override
     public boolean scheduleMigration(final VMInstanceVO vm) {
         if (vm.getHostId() != null) {
-            final HaWorkVO work = new HaWorkVO(vm.getId(), vm.getType(), 
WorkType.Migration, Step.Scheduled, vm.getHostId(), vm.getState(), 0, 
vm.getUpdated());
+            Long hostId = VirtualMachine.State.Migrating.equals(vm.getState()) 
? vm.getLastHostId() : vm.getHostId();
+            final HaWorkVO work = new HaWorkVO(vm.getId(), vm.getType(), 
WorkType.Migration, Step.Scheduled, hostId, vm.getState(), 0, vm.getUpdated());
             _haDao.persist(work);
             s_logger.info("Scheduled migration work of VM " + vm.getUuid() + " 
from host " + _hostDao.findById(vm.getHostId()) + " with HAWork " + work);
             wakeupWorkers();
@@ -716,6 +717,14 @@ public class HighAvailabilityManagerImpl extends 
ManagerBase implements Configur
             s_logger.info("Unable to find vm: " + vmId + ", skipping 
migrate.");
             return null;
         }
+        if (VirtualMachine.State.Stopped.equals(vm.getState())) {
+            s_logger.info(String.format("vm %s is Stopped, skipping migrate.", 
vm));
+            return null;
+        }
+        if (VirtualMachine.State.Running.equals(vm.getState()) && srcHostId != 
vm.getHostId()) {
+            s_logger.info(String.format("VM %s is running on a different host 
%s, skipping migration", vm, vm.getHostId()));
+            return null;
+        }
         s_logger.info("Migration attempt: for VM " + vm.getUuid() + "from host 
id " + srcHostId +
                 ". Starting attempt: " + (1 + work.getTimesTried()) + "/" + 
_maxRetries + " times.");
         try {
@@ -1022,6 +1031,13 @@ public class HighAvailabilityManagerImpl extends 
ManagerBase implements Configur
 
         @Override
         public void run() {
+            try {
+                synchronized (this) {
+                    wait(_timeToSleep);
+                }
+            } catch (final InterruptedException e) {
+                s_logger.info("Interrupted");
+            }
             s_logger.info("Starting work");
             while (!_stopped) {
                 _managedContext.runWithContext(new Runnable() {

Reply via email to