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() {