From 0d81e88601f015b23217832bca05fbed6d754f82 Mon Sep 17 00:00:00 2001 From: subhash yedugundla Date: Fri, 1 Sep 2017 14:30:55 +0530 Subject: [PATCH] CLOUDSTACK-8939: VM Snapshot size with memory correctly calculated in cloud.usage_event (XenServer) (#914) Fixing the error with snapshot size calculation in a vm with memory --- .../resource/CitrixResourceBase.java | 42 +++++++++++-------- .../CitrixCreateVMSnapshotCommandWrapper.java | 8 +++- .../CitrixDeleteVMSnapshotCommandWrapper.java | 9 +++- 3 files changed, 38 insertions(+), 21 deletions(-) diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java index 10c43075835..f960b9f09b9 100644 --- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java +++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java @@ -3333,7 +3333,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe return _instance; } - public long getVMSnapshotChainSize(final Connection conn, final VolumeObjectTO volumeTo, final String vmName) throws BadServerResponse, XenAPIException, XmlRpcException { + public long getVMSnapshotChainSize(final Connection conn, final VolumeObjectTO volumeTo, final String vmName, final String vmSnapshotName) throws BadServerResponse, XenAPIException, XmlRpcException { if (volumeTo.getVolumeType() == Volume.Type.DATADISK) { final VDI dataDisk = VDI.getByUuid(conn, volumeTo.getPath()); if (dataDisk != null) { @@ -3364,25 +3364,33 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe } } if (volumeTo.getVolumeType() == Volume.Type.ROOT) { - final Map allVMs = VM.getAllRecords(conn); - // add size of memory snapshot vdi - if (allVMs != null && allVMs.size() > 0) { - for (final VM vmr : allVMs.keySet()) { - try { - final String vName = vmr.getNameLabel(conn); - if (vName != null && vName.contains(vmName) && vmr.getIsASnapshot(conn)) { - final VDI memoryVDI = vmr.getSuspendVDI(conn); - if (!isRefNull(memoryVDI)) { - size = size + memoryVDI.getPhysicalUtilisation(conn); - final VDI pMemoryVDI = memoryVDI.getParent(conn); - if (!isRefNull(pMemoryVDI)) { - size = size + pMemoryVDI.getPhysicalUtilisation(conn); + VM vm = getVM(conn, vmName); + if(vm != null){ + Set vmSnapshots=vm.getSnapshots(conn); + if(vmSnapshots != null){ + for(VM vmsnap: vmSnapshots){ + try { + final String vmSnapName = vmsnap.getNameLabel(conn); + s_logger.debug("snapname " + vmSnapName); + if (vmSnapName != null && vmSnapName.contains(vmSnapshotName) && vmsnap.getIsASnapshot(conn)) { + s_logger.debug("snapname " + vmSnapName + "isASnapshot"); + VDI memoryVDI = vmsnap.getSuspendVDI(conn); + if (!isRefNull(memoryVDI)) { + size = size + memoryVDI.getPhysicalUtilisation(conn); + s_logger.debug("memoryVDI size :"+size); + String parentUuid = memoryVDI.getSmConfig(conn).get("vhd-parent"); + VDI pMemoryVDI = VDI.getByUuid(conn, parentUuid); + if (!isRefNull(pMemoryVDI)) { + size = size + pMemoryVDI.getPhysicalUtilisation(conn); + } + s_logger.debug("memoryVDI size+parent :"+size); } } + } catch (Exception e) { + s_logger.debug("Exception occurs when calculate snapshot capacity for memory: due to " + e.toString()); + continue; } - } catch (final Exception e) { - s_logger.debug("Exception occurs when calculate snapshot capacity for memory: due to " + e.toString()); - continue; + } } } diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixCreateVMSnapshotCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixCreateVMSnapshotCommandWrapper.java index 4550cf8b637..6bd843dadf0 100644 --- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixCreateVMSnapshotCommandWrapper.java +++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixCreateVMSnapshotCommandWrapper.java @@ -23,6 +23,7 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Set; +import com.cloud.utils.exception.CloudRuntimeException; import org.apache.cloudstack.storage.to.VolumeObjectTO; import org.apache.log4j.Logger; @@ -142,8 +143,11 @@ public final class CitrixCreateVMSnapshotCommandWrapper extends CommandWrapper