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 0a88e71 Check the pool used space from the bytes used in the storage
pool stats collector, for non-default primary storage pools that cannot
provide stats. (#5586)
0a88e71 is described below
commit 0a88e710b21c819efcfdecbed480cdeb78158bec
Author: sureshanaparti <[email protected]>
AuthorDate: Mon Oct 25 16:53:07 2021 +0530
Check the pool used space from the bytes used in the storage pool stats
collector, for non-default primary storage pools that cannot provide stats.
(#5586)
* Check the pool used space from the bytes used in the storage pool stats
collector, for non-default primary storage pools that cannot provide stats.
Also, Update the used bytes from the pool stats answer for non-default
primary storage pools if the pool can provide stats.
* Update server/src/main/java/com/cloud/storage/StorageManagerImpl.java
Co-authored-by: Daniel Augusto Veronezi Salvador
<[email protected]>
* space fix
Co-authored-by: Rohit Yadav <[email protected]>
Co-authored-by: Daniel Augusto Veronezi Salvador
<[email protected]>
---
.../java/com/cloud/storage/StorageManager.java | 2 +
.../main/java/com/cloud/server/StatsCollector.java | 3 +-
.../java/com/cloud/storage/StorageManagerImpl.java | 45 ++++++++++++++++------
3 files changed, 37 insertions(+), 13 deletions(-)
diff --git
a/engine/components-api/src/main/java/com/cloud/storage/StorageManager.java
b/engine/components-api/src/main/java/com/cloud/storage/StorageManager.java
index 7976b31..a62876a 100644
--- a/engine/components-api/src/main/java/com/cloud/storage/StorageManager.java
+++ b/engine/components-api/src/main/java/com/cloud/storage/StorageManager.java
@@ -180,6 +180,8 @@ public interface StorageManager extends StorageService {
public Answer getVolumeStats(StoragePool pool, Command cmd);
+ boolean canPoolProvideStorageStats(StoragePool pool);
+
/**
* Checks if a host has running VMs that are using its local storage pool.
* @return true if local storage is active on the host
diff --git a/server/src/main/java/com/cloud/server/StatsCollector.java
b/server/src/main/java/com/cloud/server/StatsCollector.java
index 36c0372..ce09ed0 100644
--- a/server/src/main/java/com/cloud/server/StatsCollector.java
+++ b/server/src/main/java/com/cloud/server/StatsCollector.java
@@ -1035,7 +1035,7 @@ public class StatsCollector extends ManagerBase
implements ComponentMethodInterc
s_logger.warn("Not setting capacity bytes,
received " + ((StorageStats)answer).getCapacityBytes() + " capacity for pool
ID " + poolId);
}
}
- if (pool.getUsedBytes() !=
((StorageStats)answer).getByteUsed() &&
pool.getStorageProviderName().equalsIgnoreCase(DataStoreProvider.DEFAULT_PRIMARY))
{
+ if (pool.getUsedBytes() !=
((StorageStats)answer).getByteUsed() &&
(pool.getStorageProviderName().equalsIgnoreCase(DataStoreProvider.DEFAULT_PRIMARY)
|| _storageManager.canPoolProvideStorageStats(pool))) {
pool.setUsedBytes(((StorageStats)
answer).getByteUsed());
poolNeedsUpdating = true;
}
@@ -1055,7 +1055,6 @@ public class StatsCollector extends ManagerBase
implements ComponentMethodInterc
s_logger.error("Error trying to retrieve storage stats", t);
}
}
-
}
class AutoScaleMonitor extends ManagedContextRunnable {
diff --git a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java
b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java
index 6535843..c340da2 100644
--- a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java
@@ -48,6 +48,7 @@ import javax.inject.Inject;
import com.cloud.agent.api.GetStoragePoolCapabilitiesAnswer;
import com.cloud.agent.api.GetStoragePoolCapabilitiesCommand;
import com.cloud.network.router.VirtualNetworkApplianceManager;
+import com.cloud.server.StatsCollector;
import com.cloud.upgrade.SystemVmTemplateRegistration;
import org.apache.cloudstack.annotation.AnnotationService;
import org.apache.cloudstack.annotation.dao.AnnotationDao;
@@ -469,13 +470,9 @@ public class StorageManagerImpl extends ManagerBase
implements StorageManager, C
@Override
public Answer sendToPool(StoragePool pool, Command cmd) throws
StorageUnavailableException {
- 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);
- }
+ if (cmd instanceof GetStorageStatsCommand &&
canPoolProvideStorageStats(pool)) {
+ // Get stats from the pool directly instead of sending cmd to host
+ return getStoragePoolStats(pool, (GetStorageStatsCommand) cmd);
}
Answer[] answers = sendToPool(pool, new Commands(cmd));
@@ -502,6 +499,13 @@ public class StorageManagerImpl extends ManagerBase
implements StorageManager, C
}
@Override
+ public boolean canPoolProvideStorageStats(StoragePool pool) {
+ DataStoreProvider storeProvider =
_dataStoreProviderMgr.getDataStoreProvider(pool.getStorageProviderName());
+ DataStoreDriver storeDriver = storeProvider.getDataStoreDriver();
+ return storeDriver instanceof PrimaryDataStoreDriver &&
((PrimaryDataStoreDriver)storeDriver).canProvideStorageStats();
+ }
+
+ @Override
public Answer getVolumeStats(StoragePool pool, Command cmd) {
DataStoreProvider storeProvider =
_dataStoreProviderMgr.getDataStoreProvider(pool.getStorageProviderName());
DataStoreDriver storeDriver = storeProvider.getDataStoreDriver();
@@ -2265,14 +2269,14 @@ public class StorageManagerImpl extends ManagerBase
implements StorageManager, C
private boolean checkUsagedSpace(StoragePool pool) {
// Managed storage does not currently deal with accounting for
physically used space (only provisioned space). Just return true if "pool" is
managed.
- // StatsCollector gets the storage stats from the ScaleIO/PowerFlex
pool directly, limit the usage based on the capacity disable threshold
- if (pool.isManaged() && pool.getPoolType() !=
StoragePoolType.PowerFlex) {
+ if (pool.isManaged() && !canPoolProvideStorageStats(pool)) {
return true;
}
- double storageUsedThreshold =
CapacityManager.StorageCapacityDisableThreshold.valueIn(pool.getDataCenterId());
long totalSize = pool.getCapacityBytes();
- double usedPercentage = ((double)pool.getUsedBytes() /
(double)totalSize);
+ long usedSize = getUsedSize(pool);
+ double usedPercentage = ((double)usedSize / (double)totalSize);
+ double storageUsedThreshold =
CapacityManager.StorageCapacityDisableThreshold.valueIn(pool.getDataCenterId());
if (s_logger.isDebugEnabled()) {
s_logger.debug("Checking pool " + pool.getId() + " for storage,
totalSize: " + pool.getCapacityBytes() + ", usedBytes: " + pool.getUsedBytes() +
", usedPct: " + usedPercentage + ", disable threshold: " +
storageUsedThreshold);
@@ -2287,6 +2291,25 @@ public class StorageManagerImpl extends ManagerBase
implements StorageManager, C
return true;
}
+ private long getUsedSize(StoragePool pool) {
+ if
(pool.getStorageProviderName().equalsIgnoreCase(DataStoreProvider.DEFAULT_PRIMARY)
|| canPoolProvideStorageStats(pool)) {
+ return (pool.getUsedBytes());
+ }
+
+ StatsCollector sc = StatsCollector.getInstance();
+ if (sc != null) {
+ StorageStats stats = sc.getStoragePoolStats(pool.getId());
+ if (stats == null) {
+ stats = sc.getStorageStats(pool.getId());
+ }
+ if (stats != null) {
+ return (stats.getByteUsed());
+ }
+ }
+
+ return 0;
+ }
+
@Override
public boolean storagePoolHasEnoughIops(List<Volume> requestedVolumes,
StoragePool pool) {
if (requestedVolumes == null || requestedVolumes.isEmpty() || pool ==
null) {