This is an automated email from the ASF dual-hosted git repository.

rohit pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/master by this push:
     new 491a10b  storage: publish delete usage event for snapshot deletion 
(#3212)
491a10b is described below

commit 491a10be0c77716ead01961f50328f5d81c6497c
Author: Rohit Yadav <[email protected]>
AuthorDate: Wed Apr 10 17:12:55 2019 +0530

    storage: publish delete usage event for snapshot deletion (#3212)
    
    Problem: Users are billed for destroyed VMs with VM snapshots because usage 
records don't get that the VM and VM snapshots are removed.
    Root Cause: The destroyVirtualMachine and expungeVirtualMachine APIs were 
removing VM snapshots but not generating VMSNAPSHOT.DELETE usage event due to 
which the VM snapshots were not marked as removed in the usage_vmsnapshot table.
    Solution: The issue was fixed by emitting the proper usage event for all 
the VM snapshots of a VM that is destroyed.
---
 .../cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java    | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git 
a/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java
 
b/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java
index ebe8b27..19777f0 100644
--- 
a/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java
+++ 
b/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java
@@ -423,6 +423,12 @@ public class DefaultVMSnapshotStrategy extends ManagerBase 
implements VMSnapshot
             s_logger.debug("Failed to change vm snapshot state with event 
ExpungeRequested");
             throw new CloudRuntimeException("Failed to change vm snapshot 
state with event ExpungeRequested: " + e.getMessage());
         }
+        UserVm userVm = userVmDao.findById(vmSnapshot.getVmId());
+        List<VolumeObjectTO> volumeTOs = 
vmSnapshotHelper.getVolumeTOList(userVm.getId());
+        for (VolumeObjectTO volumeTo: volumeTOs) {
+            volumeTo.setSize(0);
+            publishUsageEvent(EventTypes.EVENT_VM_SNAPSHOT_DELETE, vmSnapshot, 
userVm, volumeTo);
+        }
         return vmSnapshotDao.remove(vmSnapshot.getId());
     }
 }

Reply via email to