You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by mt...@apache.org on 2013/11/13 22:26:12 UTC

git commit: updated refs/heads/4.3 to 742bf3c

Updated Branches:
  refs/heads/4.3 27821d55b -> 742bf3ccc


CLOUDSTACK-4810: Enable hypervisor snapshots for CloudStack-managed storage (for XenServer and VMware)


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

Branch: refs/heads/4.3
Commit: 742bf3cccc1bf7e90f8419844e0bd78d69288563
Parents: 27821d5
Author: Mike Tutkowski <mi...@solidfire.com>
Authored: Wed Nov 13 14:24:56 2013 -0700
Committer: Mike Tutkowski <mi...@solidfire.com>
Committed: Wed Nov 13 14:25:31 2013 -0700

----------------------------------------------------------------------
 .../com/cloud/capacity/CapacityManagerImpl.java | 39 +++++++++++++++++++-
 .../com/cloud/storage/StorageManagerImpl.java   |  6 ++-
 2 files changed, 41 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/742bf3cc/server/src/com/cloud/capacity/CapacityManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/capacity/CapacityManagerImpl.java b/server/src/com/cloud/capacity/CapacityManagerImpl.java
index 52cab12..a4c1bd2 100755
--- a/server/src/com/cloud/capacity/CapacityManagerImpl.java
+++ b/server/src/com/cloud/capacity/CapacityManagerImpl.java
@@ -29,6 +29,10 @@ import javax.naming.ConfigurationException;
 
 import org.apache.log4j.Logger;
 
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreDriver;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProvider;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProviderManager;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver;
 import org.apache.cloudstack.framework.config.ConfigDepot;
 import org.apache.cloudstack.framework.config.ConfigKey;
 import org.apache.cloudstack.framework.config.Configurable;
@@ -70,6 +74,8 @@ import com.cloud.service.dao.ServiceOfferingDao;
 import com.cloud.storage.StorageManager;
 import com.cloud.storage.VMTemplateStoragePoolVO;
 import com.cloud.storage.VMTemplateVO;
+import com.cloud.storage.Volume;
+import com.cloud.storage.VolumeVO;
 import com.cloud.storage.dao.VMTemplatePoolDao;
 import com.cloud.storage.dao.VolumeDao;
 import com.cloud.utils.DateUtil;
@@ -132,6 +138,8 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager,
     ClusterDao _clusterDao;
     @Inject
     ConfigDepot _configDepot;
+    @Inject
+    DataStoreProviderManager _dataStoreProviderMgr;
 
     @Inject
     ClusterDetailsDao _clusterDetailsDao;
@@ -474,14 +482,41 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager,
 
     }
 
+    private long getUsedBytes(StoragePoolVO pool) {
+        long usedBytes = 0;
+
+        List<VolumeVO> volumes = _volumeDao.findByPoolId(pool.getId(), null);
+
+        if (volumes != null && volumes.size() > 0) {
+            DataStoreProvider storeProvider = _dataStoreProviderMgr.getDataStoreProvider(pool.getStorageProviderName());
+            DataStoreDriver storeDriver = storeProvider.getDataStoreDriver();
+            PrimaryDataStoreDriver primaryStoreDriver = null;
+
+            if (storeDriver instanceof PrimaryDataStoreDriver) {
+                primaryStoreDriver = (PrimaryDataStoreDriver)storeDriver;
+            }
+
+            for (VolumeVO volume : volumes) {
+                if (primaryStoreDriver != null) {
+                    usedBytes += primaryStoreDriver.getVolumeSizeIncludingHypervisorSnapshotReserve(volume, pool);
+                }
+                else {
+                    usedBytes += volume.getSize();
+                }
+            }
+        }
+
+        return usedBytes;
+    }
+
     @Override
     public long getAllocatedPoolCapacity(StoragePoolVO pool, VMTemplateVO templateForVmCreation) {
         long totalAllocatedSize = 0;
 
         // if the storage pool is managed, the used bytes can be larger than the sum of the sizes of all of the non-destroyed volumes
-        // in this case, just get the used bytes from the storage pool object
+        // in this case, call getUsedBytes(StoragePoolVO)
         if (pool.isManaged()) {
-            totalAllocatedSize = pool.getUsedBytes();
+            totalAllocatedSize = getUsedBytes(pool);
         }
         else {
             // Get size for all the non-destroyed volumes

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/742bf3cc/server/src/com/cloud/storage/StorageManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java
index e81e30e..b4446e7 100755
--- a/server/src/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/com/cloud/storage/StorageManagerImpl.java
@@ -1523,11 +1523,13 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
         if (requestedVolumes == null || requestedVolumes.isEmpty() || pool == null) {
             return false;
         }
-        // Only Solidfire type primary storage is using/setting Iops.
-        // This check will fix to return the storage has enough Iops when capacityIops is set to NULL for any PS Storage provider
+
+        // Only SolidFire-type primary storage is using/setting IOPS.
+        // This check returns true for storage that does not specify IOPS.
         if (pool.getCapacityIops() == null ) {
             return true;
         }
+
         long currentIops = 0;
         List<VolumeVO> volumesInPool = _volumeDao.findByPoolId(pool.getId(), null);