Skip to content

Commit 75c15fd

Browse files
authored
Allow storage plugins to get storage/volume stats without sending commands to hosts (apache#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
1 parent e573d0d commit 75c15fd

File tree

2 files changed

+38
-36
lines changed

2 files changed

+38
-36
lines changed

server/src/main/java/com/cloud/storage/StorageManagerImpl.java

Lines changed: 28 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -465,10 +465,13 @@ public Answer sendToPool(StoragePool pool, long[] hostIdsToTryFirst, Command cmd
465465

466466
@Override
467467
public Answer sendToPool(StoragePool pool, Command cmd) throws StorageUnavailableException {
468-
if (cmd instanceof GetStorageStatsCommand && pool.getPoolType() == StoragePoolType.PowerFlex) {
469-
// Get stats from the pool directly instead of sending cmd to host
470-
// Added support for ScaleIO/PowerFlex pool only
471-
return getStoragePoolStats(pool, (GetStorageStatsCommand) cmd);
468+
if (cmd instanceof GetStorageStatsCommand) {
469+
DataStoreProvider storeProvider = _dataStoreProviderMgr.getDataStoreProvider(pool.getStorageProviderName());
470+
DataStoreDriver storeDriver = storeProvider.getDataStoreDriver();
471+
if (storeDriver instanceof PrimaryDataStoreDriver && ((PrimaryDataStoreDriver)storeDriver).canProvideStorageStats()) {
472+
// Get stats from the pool directly instead of sending cmd to host
473+
return getStoragePoolStats(pool, (GetStorageStatsCommand) cmd);
474+
}
472475
}
473476

474477
Answer[] answers = sendToPool(pool, new Commands(cmd));
@@ -479,49 +482,40 @@ public Answer sendToPool(StoragePool pool, Command cmd) throws StorageUnavailabl
479482
}
480483

481484
private GetStorageStatsAnswer getStoragePoolStats(StoragePool pool, GetStorageStatsCommand cmd) {
482-
DataStoreProvider storeProvider = _dataStoreProviderMgr.getDataStoreProvider(pool.getStorageProviderName());
483-
DataStoreDriver storeDriver = storeProvider.getDataStoreDriver();
484485
GetStorageStatsAnswer answer = null;
485486

486-
if (storeDriver instanceof PrimaryDataStoreDriver && ((PrimaryDataStoreDriver)storeDriver).canProvideStorageStats()) {
487-
PrimaryDataStoreDriver primaryStoreDriver = (PrimaryDataStoreDriver)storeDriver;
488-
Pair<Long, Long> storageStats = primaryStoreDriver.getStorageStats(pool);
489-
if (storageStats == null) {
490-
answer = new GetStorageStatsAnswer((GetStorageStatsCommand) cmd, "Failed to get storage stats for pool: " + pool.getId());
491-
} else {
492-
answer = new GetStorageStatsAnswer((GetStorageStatsCommand) cmd, storageStats.first(), storageStats.second());
493-
}
487+
DataStoreProvider storeProvider = _dataStoreProviderMgr.getDataStoreProvider(pool.getStorageProviderName());
488+
DataStoreDriver storeDriver = storeProvider.getDataStoreDriver();
489+
PrimaryDataStoreDriver primaryStoreDriver = (PrimaryDataStoreDriver) storeDriver;
490+
Pair<Long, Long> storageStats = primaryStoreDriver.getStorageStats(pool);
491+
if (storageStats == null) {
492+
answer = new GetStorageStatsAnswer((GetStorageStatsCommand) cmd, "Failed to get storage stats for pool: " + pool.getId());
493+
} else {
494+
answer = new GetStorageStatsAnswer((GetStorageStatsCommand) cmd, storageStats.first(), storageStats.second());
494495
}
495496

496497
return answer;
497498
}
498499

499500
@Override
500501
public Answer getVolumeStats(StoragePool pool, Command cmd) {
501-
if (!(cmd instanceof GetVolumeStatsCommand)) {
502-
return null;
503-
}
504-
505502
DataStoreProvider storeProvider = _dataStoreProviderMgr.getDataStoreProvider(pool.getStorageProviderName());
506503
DataStoreDriver storeDriver = storeProvider.getDataStoreDriver();
507-
508-
if (storeDriver instanceof PrimaryDataStoreDriver && ((PrimaryDataStoreDriver)storeDriver).canProvideVolumeStats()) {
509-
PrimaryDataStoreDriver primaryStoreDriver = (PrimaryDataStoreDriver)storeDriver;
510-
HashMap<String, VolumeStatsEntry> statEntry = new HashMap<String, VolumeStatsEntry>();
511-
GetVolumeStatsCommand getVolumeStatsCommand = (GetVolumeStatsCommand) cmd;
512-
for (String volumeUuid : getVolumeStatsCommand.getVolumeUuids()) {
513-
Pair<Long, Long> volumeStats = primaryStoreDriver.getVolumeStats(pool, volumeUuid);
514-
if (volumeStats == null) {
515-
return new GetVolumeStatsAnswer(getVolumeStatsCommand, "Failed to get stats for volume: " + volumeUuid, null);
516-
} else {
517-
VolumeStatsEntry volumeStatsEntry = new VolumeStatsEntry(volumeUuid, volumeStats.first(), volumeStats.second());
518-
statEntry.put(volumeUuid, volumeStatsEntry);
519-
}
504+
PrimaryDataStoreDriver primaryStoreDriver = (PrimaryDataStoreDriver) storeDriver;
505+
HashMap<String, VolumeStatsEntry> statEntry = new HashMap<String, VolumeStatsEntry>();
506+
GetVolumeStatsCommand getVolumeStatsCommand = (GetVolumeStatsCommand) cmd;
507+
for (String volumeUuid : getVolumeStatsCommand.getVolumeUuids()) {
508+
Pair<Long, Long> volumeStats = primaryStoreDriver.getVolumeStats(pool, volumeUuid);
509+
if (volumeStats == null) {
510+
return new GetVolumeStatsAnswer(getVolumeStatsCommand, "Failed to get stats for volume: " + volumeUuid,
511+
null);
512+
} else {
513+
VolumeStatsEntry volumeStatsEntry = new VolumeStatsEntry(volumeUuid, volumeStats.first(),
514+
volumeStats.second());
515+
statEntry.put(volumeUuid, volumeStatsEntry);
520516
}
521-
return new GetVolumeStatsAnswer(getVolumeStatsCommand, "", statEntry);
522517
}
523-
524-
return null;
518+
return new GetVolumeStatsAnswer(getVolumeStatsCommand, "", statEntry);
525519
}
526520

527521
public Long chooseHostForStoragePool(StoragePoolVO poolVO, List<Long> avoidHosts, boolean sendToVmResidesOn, Long vmId) {

server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,12 @@
9595
import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
9696
import org.apache.cloudstack.engine.service.api.OrchestrationService;
9797
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
98+
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreDriver;
9899
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
100+
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProvider;
101+
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProviderManager;
99102
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore;
103+
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver;
100104
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
101105
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
102106
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService;
@@ -532,6 +536,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
532536
@Inject
533537
private UserVmDeployAsIsDetailsDao userVmDeployAsIsDetailsDao;
534538
@Inject
539+
private DataStoreProviderManager _dataStoreProviderMgr;
535540
private StorageManager storageManager;
536541
@Inject
537542
private ServiceOfferingJoinDao serviceOfferingJoinDao;
@@ -2108,9 +2113,12 @@ public HashMap<String, VolumeStatsEntry> getVolumeStatistics(long clusterId, Str
21082113
GetVolumeStatsCommand cmd = new GetVolumeStatsCommand(poolType, poolUuid, volumeLocators);
21092114
Answer answer = null;
21102115

2111-
if (poolType == StoragePoolType.PowerFlex) {
2116+
DataStoreProvider storeProvider = _dataStoreProviderMgr
2117+
.getDataStoreProvider(storagePool.getStorageProviderName());
2118+
DataStoreDriver storeDriver = storeProvider.getDataStoreDriver();
2119+
2120+
if (storeDriver instanceof PrimaryDataStoreDriver && ((PrimaryDataStoreDriver) storeDriver).canProvideVolumeStats()) {
21122121
// Get volume stats from the pool directly instead of sending cmd to host
2113-
// Added support for ScaleIO/PowerFlex pool only
21142122
answer = storageManager.getVolumeStats(storagePool, cmd);
21152123
} else {
21162124
if (timeout > 0) {

0 commit comments

Comments
 (0)