Skip to content

Commit fa14921

Browse files
nvazquezdhslove
authored andcommitted
Fix: Condition for aborting migration, resume paused VMs on destination (apache#12331)
1 parent 70104cb commit fa14921

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
@@ -256,20 +256,21 @@ Use VIR_DOMAIN_XML_SECURE (value = 1) prior to v1.0.0.
256256
final Future<Domain> migrateThread = executor.submit(worker);
257257
executor.shutdown();
258258
long sleeptime = 0;
259+
final int migrateDowntime = libvirtComputingResource.getMigrateDowntime();
260+
boolean isMigrateDowntimeSet = false;
261+
259262
while (!executor.isTerminated()) {
260263
Thread.sleep(100);
261264
sleeptime += 100;
262-
if (sleeptime == 1000) { // wait 1s before attempting to set downtime on migration, since I don't know of a VIR_DOMAIN_MIGRATING state
263-
final int migrateDowntime = libvirtComputingResource.getMigrateDowntime();
264-
if (migrateDowntime > 0 ) {
265-
try {
266-
final int setDowntime = dm.migrateSetMaxDowntime(migrateDowntime);
267-
if (setDowntime == 0 ) {
268-
logger.debug("Set max downtime for migration of " + vmName + " to " + String.valueOf(migrateDowntime) + "ms");
269-
}
270-
} catch (final LibvirtException e) {
271-
logger.debug("Failed to set max downtime for migration, perhaps migration completed? Error: " + e.getMessage());
265+
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
266+
try {
267+
final int setDowntime = dm.migrateSetMaxDowntime(migrateDowntime);
268+
if (setDowntime == 0 ) {
269+
isMigrateDowntimeSet = true;
270+
logger.debug("Set max downtime for migration of " + vmName + " to " + String.valueOf(migrateDowntime) + "ms");
272271
}
272+
} catch (final LibvirtException e) {
273+
logger.debug("Failed to set max downtime for migration, perhaps migration completed? Error: " + e.getMessage());
273274
}
274275
}
275276
if (sleeptime % 1000 == 0) {
@@ -287,7 +288,7 @@ Use VIR_DOMAIN_XML_SECURE (value = 1) prior to v1.0.0.
287288
} catch (final LibvirtException e) {
288289
logger.info("Couldn't get VM domain state after " + sleeptime + "ms: " + e.getMessage());
289290
}
290-
if (state != null && state == DomainState.VIR_DOMAIN_RUNNING) {
291+
if (state != null && (state == DomainState.VIR_DOMAIN_RUNNING || state == DomainState.VIR_DOMAIN_PAUSED)) {
291292
try {
292293
DomainJobInfo job = dm.getJobInfo();
293294
logger.warn("Aborting migration of VM {} with domain job [{}] due to timeout after {} seconds. " +
@@ -334,6 +335,7 @@ Use VIR_DOMAIN_XML_SECURE (value = 1) prior to v1.0.0.
334335
if (logger.isDebugEnabled()) {
335336
logger.debug(String.format("Cleaning the disks of VM [%s] in the source pool after VM migration finished.", vmName));
336337
}
338+
resumeDomainIfPaused(destDomain, vmName);
337339
deleteOrDisconnectDisksOnSourcePool(libvirtComputingResource, migrateDiskInfoList, disks);
338340
libvirtComputingResource.cleanOldSecretsByDiskDef(conn, disks);
339341
}
@@ -408,6 +410,28 @@ Use VIR_DOMAIN_XML_SECURE (value = 1) prior to v1.0.0.
408410
return new MigrateAnswer(command, result == null, result, null);
409411
}
410412

413+
private DomainState getDestDomainState(Domain destDomain, String vmName) {
414+
DomainState dmState = null;
415+
try {
416+
dmState = destDomain.getInfo().state;
417+
} catch (final LibvirtException e) {
418+
logger.info("Failed to get domain state for VM: " + vmName + " due to: " + e.getMessage());
419+
}
420+
return dmState;
421+
}
422+
423+
private void resumeDomainIfPaused(Domain destDomain, String vmName) {
424+
DomainState dmState = getDestDomainState(destDomain, vmName);
425+
if (dmState == DomainState.VIR_DOMAIN_PAUSED) {
426+
logger.info("Resuming VM " + vmName + " on destination after migration");
427+
try {
428+
destDomain.resume();
429+
} catch (final Exception e) {
430+
logger.error("Failed to resume vm " + vmName + " on destination after migration due to : " + e.getMessage());
431+
}
432+
}
433+
}
434+
411435
/**
412436
* Gets the disk labels (vda, vdb...) of the disks mapped for migration on mapMigrateStorage.
413437
* @param diskDefinitions list of all the disksDefinitions of the VM.

0 commit comments

Comments
 (0)