From 2637a86ac2018323f90625609263004d489a9156 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Thu, 16 Apr 2020 15:14:47 +0200 Subject: [PATCH] kvm: suspend/resume in deleting vm snapshot on kvm (#4033) --- .../wrapper/LibvirtDeleteVMSnapshotCommandWrapper.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtDeleteVMSnapshotCommandWrapper.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtDeleteVMSnapshotCommandWrapper.java index 9efec950af3..a0faa37ac12 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtDeleteVMSnapshotCommandWrapper.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtDeleteVMSnapshotCommandWrapper.java @@ -24,6 +24,7 @@ import org.apache.cloudstack.storage.to.VolumeObjectTO; import org.apache.log4j.Logger; import org.libvirt.Connect; import org.libvirt.Domain; +import org.libvirt.DomainInfo.DomainState; import org.libvirt.DomainSnapshot; import org.libvirt.LibvirtException; @@ -58,6 +59,9 @@ public final class LibvirtDeleteVMSnapshotCommandWrapper extends CommandWrapper< snapshot = dm.snapshotLookupByName(cmd.getTarget().getSnapshotName()); + s_logger.debug("Suspending domain " + vmName); + dm.suspend(); // suspend the vm to avoid image corruption + snapshot.delete(0); // only remove this snapshot, not children return new DeleteVMSnapshotAnswer(cmd, cmd.getVolumeTOs()); @@ -100,6 +104,10 @@ public final class LibvirtDeleteVMSnapshotCommandWrapper extends CommandWrapper< } finally { if (dm != null) { try { + if (dm.getInfo().state == DomainState.VIR_DOMAIN_PAUSED) { + s_logger.debug("Resuming domain " + vmName); + dm.resume(); + } dm.free(); } catch (LibvirtException l) { s_logger.trace("Ignoring libvirt error.", l);