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

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


The following commit(s) were added to refs/heads/main by this push:
     new 75c15fd  Allow storage plugins to get storage/volume stats without 
sending commands to hosts (#4826)
75c15fd is described below

commit 75c15fd0d6afb10fb243f0870f7c56cfe173c251
Author: slavkap <[email protected]>
AuthorDate: Tue Sep 28 22:17:34 2021 +0300

    Allow storage plugins to get storage/volume stats without sending commands 
to hosts (#4826)
    
    * Allow storage plugins to use storage/volume stats
    
    Allow the rest of the storage plugins, not only ScaleIO to implement and
    use the storage/volume statistics directly instead of sending cmd to
    hosts
    
    * Get the store driver from pool instead of passing it as argument
    
    required change from code review to pick the store driver from pool not
    to pass it as argument
---
 .../java/com/cloud/storage/StorageManagerImpl.java | 62 ++++++++++------------
 .../main/java/com/cloud/vm/UserVmManagerImpl.java  | 12 ++++-
 2 files changed, 38 insertions(+), 36 deletions(-)

diff --git a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java 
b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java
index 07e3668..b53efc4 100644
--- a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java
@@ -465,10 +465,13 @@ public class StorageManagerImpl extends ManagerBase 
implements StorageManager, C
 
     @Override
     public Answer sendToPool(StoragePool pool, Command cmd) throws 
StorageUnavailableException {
-        if (cmd instanceof GetStorageStatsCommand && pool.getPoolType() == 
StoragePoolType.PowerFlex) {
-            // Get stats from the pool directly instead of sending cmd to host
-            // Added support for ScaleIO/PowerFlex pool only
-            return getStoragePoolStats(pool, (GetStorageStatsCommand) cmd);
+        if (cmd instanceof GetStorageStatsCommand) {
+            DataStoreProvider storeProvider = 
_dataStoreProviderMgr.getDataStoreProvider(pool.getStorageProviderName());
+            DataStoreDriver storeDriver = storeProvider.getDataStoreDriver();
+            if (storeDriver instanceof PrimaryDataStoreDriver && 
((PrimaryDataStoreDriver)storeDriver).canProvideStorageStats()) {
+                // Get stats from the pool directly instead of sending cmd to 
host
+                return getStoragePoolStats(pool, (GetStorageStatsCommand) cmd);
+            }
         }
 
         Answer[] answers = sendToPool(pool, new Commands(cmd));
@@ -479,18 +482,16 @@ public class StorageManagerImpl extends ManagerBase 
implements StorageManager, C
     }
 
     private GetStorageStatsAnswer getStoragePoolStats(StoragePool pool, 
GetStorageStatsCommand cmd) {
-        DataStoreProvider storeProvider = 
_dataStoreProviderMgr.getDataStoreProvider(pool.getStorageProviderName());
-        DataStoreDriver storeDriver = storeProvider.getDataStoreDriver();
         GetStorageStatsAnswer answer = null;
 
-        if (storeDriver instanceof PrimaryDataStoreDriver && 
((PrimaryDataStoreDriver)storeDriver).canProvideStorageStats()) {
-            PrimaryDataStoreDriver primaryStoreDriver = 
(PrimaryDataStoreDriver)storeDriver;
-            Pair<Long, Long> storageStats = 
primaryStoreDriver.getStorageStats(pool);
-            if (storageStats == null) {
-                answer = new GetStorageStatsAnswer((GetStorageStatsCommand) 
cmd, "Failed to get storage stats for pool: " + pool.getId());
-            } else {
-                answer = new GetStorageStatsAnswer((GetStorageStatsCommand) 
cmd, storageStats.first(), storageStats.second());
-            }
+        DataStoreProvider storeProvider = 
_dataStoreProviderMgr.getDataStoreProvider(pool.getStorageProviderName());
+        DataStoreDriver storeDriver = storeProvider.getDataStoreDriver();
+        PrimaryDataStoreDriver primaryStoreDriver = (PrimaryDataStoreDriver) 
storeDriver;
+        Pair<Long, Long> storageStats = 
primaryStoreDriver.getStorageStats(pool);
+        if (storageStats == null) {
+            answer = new GetStorageStatsAnswer((GetStorageStatsCommand) cmd, 
"Failed to get storage stats for pool: " + pool.getId());
+        } else {
+            answer = new GetStorageStatsAnswer((GetStorageStatsCommand) cmd, 
storageStats.first(), storageStats.second());
         }
 
         return answer;
@@ -498,30 +499,23 @@ public class StorageManagerImpl extends ManagerBase 
implements StorageManager, C
 
     @Override
     public Answer getVolumeStats(StoragePool pool, Command cmd) {
-        if (!(cmd instanceof GetVolumeStatsCommand)) {
-            return null;
-        }
-
         DataStoreProvider storeProvider = 
_dataStoreProviderMgr.getDataStoreProvider(pool.getStorageProviderName());
         DataStoreDriver storeDriver = storeProvider.getDataStoreDriver();
-
-        if (storeDriver instanceof PrimaryDataStoreDriver && 
((PrimaryDataStoreDriver)storeDriver).canProvideVolumeStats()) {
-            PrimaryDataStoreDriver primaryStoreDriver = 
(PrimaryDataStoreDriver)storeDriver;
-            HashMap<String, VolumeStatsEntry> statEntry = new HashMap<String, 
VolumeStatsEntry>();
-            GetVolumeStatsCommand getVolumeStatsCommand = 
(GetVolumeStatsCommand) cmd;
-            for (String volumeUuid : getVolumeStatsCommand.getVolumeUuids()) {
-                Pair<Long, Long> volumeStats = 
primaryStoreDriver.getVolumeStats(pool, volumeUuid);
-                if (volumeStats == null) {
-                    return new GetVolumeStatsAnswer(getVolumeStatsCommand, 
"Failed to get stats for volume: " + volumeUuid, null);
-                } else {
-                    VolumeStatsEntry volumeStatsEntry = new 
VolumeStatsEntry(volumeUuid, volumeStats.first(), volumeStats.second());
-                    statEntry.put(volumeUuid, volumeStatsEntry);
-                }
+        PrimaryDataStoreDriver primaryStoreDriver = (PrimaryDataStoreDriver) 
storeDriver;
+        HashMap<String, VolumeStatsEntry> statEntry = new HashMap<String, 
VolumeStatsEntry>();
+        GetVolumeStatsCommand getVolumeStatsCommand = (GetVolumeStatsCommand) 
cmd;
+        for (String volumeUuid : getVolumeStatsCommand.getVolumeUuids()) {
+            Pair<Long, Long> volumeStats = 
primaryStoreDriver.getVolumeStats(pool, volumeUuid);
+            if (volumeStats == null) {
+                return new GetVolumeStatsAnswer(getVolumeStatsCommand, "Failed 
to get stats for volume: " + volumeUuid,
+                        null);
+            } else {
+                VolumeStatsEntry volumeStatsEntry = new 
VolumeStatsEntry(volumeUuid, volumeStats.first(),
+                        volumeStats.second());
+                statEntry.put(volumeUuid, volumeStatsEntry);
             }
-            return new GetVolumeStatsAnswer(getVolumeStatsCommand, "", 
statEntry);
         }
-
-        return null;
+        return new GetVolumeStatsAnswer(getVolumeStatsCommand, "", statEntry);
     }
 
     public Long chooseHostForStoragePool(StoragePoolVO poolVO, List<Long> 
avoidHosts, boolean sendToVmResidesOn, Long vmId) {
diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java 
b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
index d9ebe66..6a5054f 100644
--- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
@@ -95,8 +95,12 @@ import 
org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationSe
 import 
org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
 import org.apache.cloudstack.engine.service.api.OrchestrationService;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreDriver;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
+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.PrimaryDataStore;
+import 
org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService;
@@ -532,6 +536,7 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
     @Inject
     private UserVmDeployAsIsDetailsDao userVmDeployAsIsDetailsDao;
     @Inject
+    private DataStoreProviderManager _dataStoreProviderMgr;
     private StorageManager storageManager;
     @Inject
     private ServiceOfferingJoinDao serviceOfferingJoinDao;
@@ -2108,9 +2113,12 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
                 GetVolumeStatsCommand cmd = new 
GetVolumeStatsCommand(poolType, poolUuid, volumeLocators);
                 Answer answer = null;
 
-                if (poolType == StoragePoolType.PowerFlex) {
+                DataStoreProvider storeProvider = _dataStoreProviderMgr
+                        
.getDataStoreProvider(storagePool.getStorageProviderName());
+                DataStoreDriver storeDriver = 
storeProvider.getDataStoreDriver();
+
+                if (storeDriver instanceof PrimaryDataStoreDriver && 
((PrimaryDataStoreDriver) storeDriver).canProvideVolumeStats()) {
                     // Get volume stats from the pool directly instead of 
sending cmd to host
-                    // Added support for ScaleIO/PowerFlex pool only
                     answer = storageManager.getVolumeStats(storagePool, cmd);
                 } else {
                     if (timeout > 0) {

Reply via email to