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