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