You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by sa...@apache.org on 2014/01/03 13:57:27 UTC

git commit: updated refs/heads/4.3 to 3964a56

Updated Branches:
  refs/heads/4.3 741634b87 -> 3964a566f


CLOUDSTACK-5701: physical size is not getting updated in snapshot_store_ref table.


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/3964a566
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/3964a566
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/3964a566

Branch: refs/heads/4.3
Commit: 3964a566f7e6bf5db837973b2f065796764d2269
Parents: 741634b
Author: Sanjay Tripathi <sa...@citrix.com>
Authored: Fri Jan 3 18:16:41 2014 +0530
Committer: Sanjay Tripathi <sa...@citrix.com>
Committed: Fri Jan 3 18:20:31 2014 +0530

----------------------------------------------------------------------
 .../cloudstack/storage/to/SnapshotObjectTO.java |  9 +++++++++
 .../storage/snapshot/SnapshotObject.java        |  1 +
 .../datastore/ObjectInDataStoreManagerImpl.java |  1 +
 .../xen/resource/XenServerStorageProcessor.java | 21 ++++++++++++++++++--
 scripts/vm/hypervisor/xenserver/vmopsSnapshot   | 17 ++++++++++++++--
 5 files changed, 45 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3964a566/core/src/org/apache/cloudstack/storage/to/SnapshotObjectTO.java
----------------------------------------------------------------------
diff --git a/core/src/org/apache/cloudstack/storage/to/SnapshotObjectTO.java b/core/src/org/apache/cloudstack/storage/to/SnapshotObjectTO.java
index 55e34e4..aa2a4f5 100644
--- a/core/src/org/apache/cloudstack/storage/to/SnapshotObjectTO.java
+++ b/core/src/org/apache/cloudstack/storage/to/SnapshotObjectTO.java
@@ -38,6 +38,7 @@ public class SnapshotObjectTO implements DataTO {
     private long id;
     private boolean quiescevm;
     private String[] parents;
+    private Long physicalSize = (long) 0;
 
 
     public SnapshotObjectTO() {
@@ -94,6 +95,14 @@ public class SnapshotObjectTO implements DataTO {
         this.path = path;
     }
 
+    public Long getPhysicalSize() {
+        return this.physicalSize;
+    }
+
+    public void setPhysicalSize(Long physicalSize ) {
+        this.physicalSize = physicalSize;
+    }
+
     public VolumeObjectTO getVolume() {
         return volume;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3964a566/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java
----------------------------------------------------------------------
diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java
index ee02eed..63ca1bd 100644
--- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java
+++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java
@@ -281,6 +281,7 @@ public class SnapshotObject implements SnapshotInfo {
             } else if (answer instanceof CopyCmdAnswer) {
                 SnapshotObjectTO snapshotTO = (SnapshotObjectTO) ((CopyCmdAnswer) answer).getNewData();
                 snapshotStore.setInstallPath(snapshotTO.getPath());
+                snapshotStore.setSize(snapshotTO.getPhysicalSize());
                 if (snapshotTO.getParentSnapshotPath() == null) {
                     snapshotStore.setParentSnapshotId(0L);
                 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3964a566/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java
index d9a5164..9d47ce6 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java
@@ -114,6 +114,7 @@ public class ObjectInDataStoreManagerImpl implements ObjectInDataStoreManager {
                 ss.setDataStoreId(dataStore.getId());
                 ss.setRole(dataStore.getRole());
                 ss.setVolumeId(snapshotInfo.getVolumeId());
+                ss.setSize(snapshotInfo.getSize()); // this is the virtual size of snapshot in primary storage.
                 SnapshotDataStoreVO snapshotDataStoreVO = snapshotDataStoreDao.findParent(dataStore.getRole(), dataStore.getId(),snapshotInfo.getVolumeId());
                 if (snapshotDataStoreVO != null) {
                     ss.setParentSnapshotId(snapshotDataStoreVO.getSnapshotId());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3964a566/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageProcessor.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageProcessor.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageProcessor.java
index b8e0b6a..5df37ea 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageProcessor.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageProcessor.java
@@ -1167,6 +1167,16 @@ public class XenServerStorageProcessor implements StorageProcessor {
 
     }
 
+    protected Long getSnapshotSize(Connection conn, String primaryStorageSRUuid, String snapshotUuid, Boolean isISCSI, int wait) {
+        String physicalSize = hypervisorResource.callHostPluginAsync(conn, "vmopsSnapshot", "getSnapshotSize", wait,
+                "primaryStorageSRUuid", primaryStorageSRUuid, "snapshotUuid", snapshotUuid, "isISCSI", isISCSI.toString());
+        if (physicalSize == null || physicalSize.isEmpty()) {
+            return (long) 0;
+        } else {
+            return Long.parseLong(physicalSize);
+        }
+    }
+
     protected String backupSnapshot(Connection conn, String primaryStorageSRUuid, String localMountPoint, String path, String secondaryStorageMountPath, String snapshotUuid, String prevBackupUuid, Boolean isISCSI, int wait) {
         String backupSnapshotUuid = null;
 
@@ -1196,7 +1206,7 @@ public class XenServerStorageProcessor implements StorageProcessor {
             if (status != null && status.equalsIgnoreCase("1") && backupSnapshotUuid != null) {
                 s_logger.debug("Successfully copied backupUuid: " + backupSnapshotUuid
                         + " to secondary storage");
-                return backupSnapshotUuid;
+                return results;
             } else {
                 errMsg = "Could not copy backupUuid: " + backupSnapshotUuid
                         + " from primary storage " + primaryStorageSRUuid + " to secondary storage "
@@ -1291,6 +1301,7 @@ public class XenServerStorageProcessor implements StorageProcessor {
         // By default assume failure
         String details = null;
         String snapshotBackupUuid = null;
+        Long physicalSize = null;
         Map<String, String> options = cmd.getOptions();
         boolean fullbackup = Boolean.parseBoolean(options.get("fullSnapshot"));
         try {
@@ -1340,6 +1351,8 @@ public class XenServerStorageProcessor implements StorageProcessor {
                     snapshotSr = hypervisorResource.createNfsSRbyURI(conn, new URI(snapshotMountpoint), false);
                     VDI backedVdi = hypervisorResource.cloudVDIcopy(conn, snapshotVdi, snapshotSr, wait);
                     snapshotBackupUuid = backedVdi.getUuid(conn);
+                    String primarySRuuid = snapshotSr.getUuid(conn);
+                    physicalSize = getSnapshotSize(conn, primarySRuuid, snapshotBackupUuid, isISCSI, wait);
 
                     if( destStore instanceof SwiftTO) {
                         try {
@@ -1390,9 +1403,12 @@ public class XenServerStorageProcessor implements StorageProcessor {
                         throw new CloudRuntimeException("S3 upload of snapshots " + snapshotPaUuid + " failed");
                     }
                 } else {
-                    snapshotBackupUuid = backupSnapshot(conn, primaryStorageSRUuid, localMountPoint, folder,
+                    String results = backupSnapshot(conn, primaryStorageSRUuid, localMountPoint, folder,
                             secondaryStorageMountPath, snapshotUuid, prevBackupUuid, isISCSI, wait);
 
+                    String[] tmp = results.split("#");
+                    snapshotBackupUuid = tmp[1];
+                    physicalSize = Long.parseLong(tmp[2]);
                     finalPath = folder + File.separator + snapshotBackupUuid;
                 }
             }
@@ -1401,6 +1417,7 @@ public class XenServerStorageProcessor implements StorageProcessor {
 
             SnapshotObjectTO newSnapshot = new SnapshotObjectTO();
             newSnapshot.setPath(finalPath);
+            newSnapshot.setPhysicalSize(physicalSize);
             if (fullbackup) {
                 newSnapshot.setParentSnapshotPath(null);
             } else {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3964a566/scripts/vm/hypervisor/xenserver/vmopsSnapshot
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/vmopsSnapshot b/scripts/vm/hypervisor/xenserver/vmopsSnapshot
index a9a5a72..5fd69a6 100755
--- a/scripts/vm/hypervisor/xenserver/vmopsSnapshot
+++ b/scripts/vm/hypervisor/xenserver/vmopsSnapshot
@@ -487,6 +487,18 @@ def getVhdParent(session, args):
 
     return  baseCopyUuid
 
+def getSnapshotSize(session, args):
+    primaryStorageSRUuid      = args['primaryStorageSRUuid']
+    snapshotUuid              = args['snapshotUuid']
+    isISCSI                   = getIsTrueString(args['isISCSI'])
+
+    primarySRPath = getPrimarySRPath(primaryStorageSRUuid, isISCSI)
+    logging.debug("primarySRPath: " + primarySRPath)
+
+    snapshotVHD  = getVHD(snapshotUuid, isISCSI)
+    snapshotPath = os.path.join(primarySRPath, snapshotVHD)
+    physicalSize = vhdutil.getSizePhys(snapshotPath)
+    return str(physicalSize)
 
 def backupSnapshot(session, args):
     logging.debug("Called backupSnapshot with " + str(args))
@@ -515,6 +527,7 @@ def backupSnapshot(session, args):
     prevBackupUuid = prevBackupUuid.split("/")[-1]
     # Check existence of snapshot on primary storage
     isfile(baseCopyPath, isISCSI)
+    physicalSize = vhdutil.getSizePhys(baseCopyPath)
     if prevBackupUuid:
         # Check existence of prevBackupFile
         prevBackupVHD = getBackupVHD(prevBackupUuid)
@@ -535,7 +548,7 @@ def backupSnapshot(session, args):
         # If there was a previous snapshot
         setParent(prevBackupFile, backupFile)
 
-    txt = "1#" + backupUuid
+    txt = "1#" + backupUuid + "#" + str(physicalSize)
     return txt
 
 @echo
@@ -596,6 +609,6 @@ def revert_memory_snapshot(session, args):
     return "0"
 
 if __name__ == "__main__":
-    XenAPIPlugin.dispatch({"getVhdParent":getVhdParent,  "create_secondary_storage_folder":create_secondary_storage_folder, "delete_secondary_storage_folder":delete_secondary_storage_folder, "post_create_private_template":post_create_private_template, "backupSnapshot": backupSnapshot, "deleteSnapshotBackup": deleteSnapshotBackup, "unmountSnapshotsDir": unmountSnapshotsDir, "revert_memory_snapshot":revert_memory_snapshot})
+    XenAPIPlugin.dispatch({"getVhdParent":getVhdParent,  "create_secondary_storage_folder":create_secondary_storage_folder, "delete_secondary_storage_folder":delete_secondary_storage_folder, "post_create_private_template":post_create_private_template, "backupSnapshot": backupSnapshot, "deleteSnapshotBackup": deleteSnapshotBackup, "unmountSnapshotsDir": unmountSnapshotsDir, "revert_memory_snapshot":revert_memory_snapshot, "getSnapshotSize":getSnapshotSize})