From 3aa8c870f76a0c960b7ab5f748bf9b29a479de76 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Thu, 13 Jan 2011 12:21:34 -0500 Subject: [PATCH] libvirt on RHEL6 doesn't handle VM_RESUME event emitted from qemu, then libvirt thinks the vm is always in PAUSE state, while actually the vm is running after taking snapshot. So, need to manually resume the vm, in taking snapshot command... --- .../computing/LibvirtComputingResource.java | 30 +++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java index 46f381ff6ed..e537fbbf2d2 100644 --- a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java +++ b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java @@ -1279,6 +1279,13 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv DomainSnapshot snap = vm.snapshotLookupByName(snapshotName); snap.delete(0); } + + /*libvirt on RHEL6 doesn't handle resume event emitted from qemu*/ + vm = getDomain(cmd.getVmName()); + state = vm.getInfo().state; + if (state == DomainInfo.DomainState.VIR_DOMAIN_PAUSED) { + vm.resume(); + } } else { /*VM is not running, create a snapshot by ourself*/ final Script command = new Script(_manageSnapshotPath, _timeout, s_logger); @@ -1346,6 +1353,13 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv s_logger.debug(snapshot); DomainSnapshot snap = vm.snapshotLookupByName(snapshotName); snap.delete(0); + + /*libvirt on RHEL6 doesn't handle resume event emitted from qemu*/ + vm = getDomain(cmd.getVmName()); + state = vm.getInfo().state; + if (state == DomainInfo.DomainState.VIR_DOMAIN_PAUSED) { + vm.resume(); + } } else { command = new Script(_manageSnapshotPath, _timeout, s_logger); command.add("-d", snapshotPath); @@ -3868,12 +3882,18 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv File f =new File("/usr/bin/cloud-qemu-system-x86_64"); if (f.exists()) { return true; - } else { - f = new File("/usr/libexec/cloud-qemu-kvm"); - if (f.exists()) { - return true; - } + } + + f = new File("/usr/libexec/cloud-qemu-kvm"); + if (f.exists()) { + return true; } + + f = new File("/usr/bin/cloud-qemu-img"); + if (f.exists()) { + return true; + } + return false; }