Skip to content

Commit 7b68615

Browse files
HA: set correct hostId of HA work for vm migration (#10591)
1 parent 8db248e commit 7b68615

File tree

3 files changed

+19
-4
lines changed

3 files changed

+19
-4
lines changed

engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5248,10 +5248,9 @@ public Outcome<VirtualMachine> migrateVmAwayThroughJobQueue(final String vmUuid,
52485248
workJob = newVmWorkJobAndInfo.first();
52495249
VmWorkMigrateAway workInfo = new VmWorkMigrateAway(newVmWorkJobAndInfo.second(), srcHostId);
52505250

5251-
workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
5251+
setCmdInfoAndSubmitAsyncJob(workJob, workInfo, vmId);
52525252
}
52535253

5254-
_jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vmId);
52555254

52565255
AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(workJob.getId());
52575256

engine/schema/src/main/java/com/cloud/vm/VMInstanceVO.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -502,7 +502,7 @@ public void setRemoved(Date removed) {
502502

503503
@Override
504504
public String toString() {
505-
return String.format("VM instance %s", ReflectionToStringBuilderUtils.reflectOnlySelectedFields(this, "id", "instanceName", "uuid", "type"));
505+
return String.format("VM instance %s", ReflectionToStringBuilderUtils.reflectOnlySelectedFields(this, "id", "instanceName", "uuid", "type", "state"));
506506
}
507507

508508
@Override

server/src/main/java/com/cloud/ha/HighAvailabilityManagerImpl.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,8 @@ protected void wakeupWorkers() {
342342
@Override
343343
public boolean scheduleMigration(final VMInstanceVO vm) {
344344
if (vm.getHostId() != null) {
345-
final HaWorkVO work = new HaWorkVO(vm.getId(), vm.getType(), WorkType.Migration, Step.Scheduled, vm.getHostId(), vm.getState(), 0, vm.getUpdated());
345+
Long hostId = VirtualMachine.State.Migrating.equals(vm.getState()) ? vm.getLastHostId() : vm.getHostId();
346+
final HaWorkVO work = new HaWorkVO(vm.getId(), vm.getType(), WorkType.Migration, Step.Scheduled, hostId, vm.getState(), 0, vm.getUpdated());
346347
_haDao.persist(work);
347348
s_logger.info("Scheduled migration work of VM " + vm.getUuid() + " from host " + _hostDao.findById(vm.getHostId()) + " with HAWork " + work);
348349
wakeupWorkers();
@@ -716,6 +717,14 @@ public Long migrate(final HaWorkVO work) {
716717
s_logger.info("Unable to find vm: " + vmId + ", skipping migrate.");
717718
return null;
718719
}
720+
if (VirtualMachine.State.Stopped.equals(vm.getState())) {
721+
s_logger.info(String.format("vm %s is Stopped, skipping migrate.", vm));
722+
return null;
723+
}
724+
if (VirtualMachine.State.Running.equals(vm.getState()) && srcHostId != vm.getHostId()) {
725+
s_logger.info(String.format("VM %s is running on a different host %s, skipping migration", vm, vm.getHostId()));
726+
return null;
727+
}
719728
s_logger.info("Migration attempt: for VM " + vm.getUuid() + "from host id " + srcHostId +
720729
". Starting attempt: " + (1 + work.getTimesTried()) + "/" + _maxRetries + " times.");
721730
try {
@@ -1022,6 +1031,13 @@ public WorkerThread(String name) {
10221031

10231032
@Override
10241033
public void run() {
1034+
try {
1035+
synchronized (this) {
1036+
wait(_timeToSleep);
1037+
}
1038+
} catch (final InterruptedException e) {
1039+
s_logger.info("Interrupted");
1040+
}
10251041
s_logger.info("Starting work");
10261042
while (!_stopped) {
10271043
_managedContext.runWithContext(new Runnable() {

0 commit comments

Comments
 (0)