From 2ca264ca4d78d89f7f190d6e4c6af81f5f3d7569 Mon Sep 17 00:00:00 2001 From: Mike Tutkowski Date: Sun, 21 Jan 2018 03:19:54 -0700 Subject: [PATCH] CLOUDSTACK-10244: Cache whether to migrate storage (#2416) KVM online storage migration fails, this fixes use of whether to migrate storage using a cached variable. --- .../kvm/resource/wrapper/LibvirtMigrateCommandWrapper.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapper.java index 6ed56fb75ad..30f0e20ddd9 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapper.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapper.java @@ -132,8 +132,11 @@ public final class LibvirtMigrateCommandWrapper extends CommandWrapper mapMigrateStorage = command.getMigrateStorage(); + // migrateStorage is declared as final because the replaceStorage method may mutate mapMigrateStorage, but + // migrateStorage's value should always only be associated with the initial state of mapMigrateStorage. + final boolean migrateStorage = MapUtils.isNotEmpty(mapMigrateStorage); - if (MapUtils.isNotEmpty(mapMigrateStorage)) { + if (migrateStorage) { xmlDesc = replaceStorage(xmlDesc, mapMigrateStorage); } @@ -142,7 +145,7 @@ public final class LibvirtMigrateCommandWrapper extends CommandWrapper worker = new MigrateKVMAsync(libvirtComputingResource, dm, dconn, xmlDesc, MapUtils.isNotEmpty(mapMigrateStorage), + final Callable worker = new MigrateKVMAsync(libvirtComputingResource, dm, dconn, xmlDesc, migrateStorage, command.isAutoConvergence(), vmName, command.getDestinationIp()); final Future migrateThread = executor.submit(worker); executor.shutdown();