Skip to content

Commit 496bc03

Browse files
authored
Fix: Condition for aborting migration, resume paused VMs on destination (#12331)
1 parent cf36fb0 commit 496bc03

File tree

1 file changed

+35
-11
lines changed

1 file changed

+35
-11
lines changed

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapper.java

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -243,20 +243,21 @@ Use VIR_DOMAIN_XML_SECURE (value = 1) prior to v1.0.0.
243243
final Future<Domain> migrateThread = executor.submit(worker);
244244
executor.shutdown();
245245
long sleeptime = 0;
246+
final int migrateDowntime = libvirtComputingResource.getMigrateDowntime();
247+
boolean isMigrateDowntimeSet = false;
248+
246249
while (!executor.isTerminated()) {
247250
Thread.sleep(100);
248251
sleeptime += 100;
249-
if (sleeptime == 1000) { // wait 1s before attempting to set downtime on migration, since I don't know of a VIR_DOMAIN_MIGRATING state
250-
final int migrateDowntime = libvirtComputingResource.getMigrateDowntime();
251-
if (migrateDowntime > 0 ) {
252-
try {
253-
final int setDowntime = dm.migrateSetMaxDowntime(migrateDowntime);
254-
if (setDowntime == 0 ) {
255-
logger.debug("Set max downtime for migration of " + vmName + " to " + String.valueOf(migrateDowntime) + "ms");
256-
}
257-
} catch (final LibvirtException e) {
258-
logger.debug("Failed to set max downtime for migration, perhaps migration completed? Error: " + e.getMessage());
252+
if (!isMigrateDowntimeSet && migrateDowntime > 0 && sleeptime >= 1000) { // wait 1s before attempting to set downtime on migration, since I don't know of a VIR_DOMAIN_MIGRATING state
253+
try {
254+
final int setDowntime = dm.migrateSetMaxDowntime(migrateDowntime);
255+
if (setDowntime == 0 ) {
256+
isMigrateDowntimeSet = true;
257+
logger.debug("Set max downtime for migration of " + vmName + " to " + String.valueOf(migrateDowntime) + "ms");
259258
}
259+
} catch (final LibvirtException e) {
260+
logger.debug("Failed to set max downtime for migration, perhaps migration completed? Error: " + e.getMessage());
260261
}
261262
}
262263
if (sleeptime % 1000 == 0) {
@@ -272,7 +273,7 @@ Use VIR_DOMAIN_XML_SECURE (value = 1) prior to v1.0.0.
272273
} catch (final LibvirtException e) {
273274
logger.info("Couldn't get VM domain state after " + sleeptime + "ms: " + e.getMessage());
274275
}
275-
if (state != null && state == DomainState.VIR_DOMAIN_RUNNING) {
276+
if (state != null && (state == DomainState.VIR_DOMAIN_RUNNING || state == DomainState.VIR_DOMAIN_PAUSED)) {
276277
try {
277278
DomainJobInfo job = dm.getJobInfo();
278279
logger.info(String.format("Aborting migration of VM [%s] with domain job [%s] due to time out after %d seconds.", vmName, job, migrateWait));
@@ -314,6 +315,7 @@ Use VIR_DOMAIN_XML_SECURE (value = 1) prior to v1.0.0.
314315
if (logger.isDebugEnabled()) {
315316
logger.debug(String.format("Cleaning the disks of VM [%s] in the source pool after VM migration finished.", vmName));
316317
}
318+
resumeDomainIfPaused(destDomain, vmName);
317319
deleteOrDisconnectDisksOnSourcePool(libvirtComputingResource, migrateDiskInfoList, disks);
318320
libvirtComputingResource.cleanOldSecretsByDiskDef(conn, disks);
319321
}
@@ -378,6 +380,28 @@ Use VIR_DOMAIN_XML_SECURE (value = 1) prior to v1.0.0.
378380
return new MigrateAnswer(command, result == null, result, null);
379381
}
380382

383+
private DomainState getDestDomainState(Domain destDomain, String vmName) {
384+
DomainState dmState = null;
385+
try {
386+
dmState = destDomain.getInfo().state;
387+
} catch (final LibvirtException e) {
388+
logger.info("Failed to get domain state for VM: " + vmName + " due to: " + e.getMessage());
389+
}
390+
return dmState;
391+
}
392+
393+
private void resumeDomainIfPaused(Domain destDomain, String vmName) {
394+
DomainState dmState = getDestDomainState(destDomain, vmName);
395+
if (dmState == DomainState.VIR_DOMAIN_PAUSED) {
396+
logger.info("Resuming VM " + vmName + " on destination after migration");
397+
try {
398+
destDomain.resume();
399+
} catch (final Exception e) {
400+
logger.error("Failed to resume vm " + vmName + " on destination after migration due to : " + e.getMessage());
401+
}
402+
}
403+
}
404+
381405
/**
382406
* Gets the disk labels (vda, vdb...) of the disks mapped for migration on mapMigrateStorage.
383407
* @param diskDefinitions list of all the disksDefinitions of the VM.

0 commit comments

Comments
 (0)