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 b63574cd808..0e245920af3 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 @@ -238,4 +238,6 @@ public interface StorageManager extends StorageService { DiskTO getDiskWithThrottling(DataTO volTO, Volume.Type volumeType, long deviceId, String path, long offeringId, long diskOfferingId); + boolean isStoragePoolDatastoreClusterParent(StoragePool pool); + } diff --git a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java index 2398e91c90c..f5929f440c4 100644 --- a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java +++ b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java @@ -123,4 +123,6 @@ public interface PrimaryDataStoreDao extends GenericDao { List listLocalStoragePoolByPath(long datacenterId, String path); void deletePoolTags(long poolId); + + List listChildStoragePoolsInDatastoreCluster(long poolId); } diff --git a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java index fee9dc28bd0..7d6b2821e72 100644 --- a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java +++ b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java @@ -552,4 +552,10 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase public void deletePoolTags(long poolId) { _tagsDao.deleteTags(poolId); } + + @Override + public List listChildStoragePoolsInDatastoreCluster(long poolId) { + QueryBuilder sc = QueryBuilder.create(StoragePoolVO.class); + sc.and(sc.entity().getParent(), Op.EQ, poolId); + return sc.list(); } } diff --git a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/StoragePoolVO.java b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/StoragePoolVO.java index 24fcaa03f56..2cdcae54de2 100644 --- a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/StoragePoolVO.java +++ b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/StoragePoolVO.java @@ -119,6 +119,9 @@ public class StoragePoolVO implements StoragePool { @Enumerated(value = EnumType.STRING) private HypervisorType hypervisor; + @Column(name = "parent") + private Long parent; + @Override public long getId() { return id; @@ -373,6 +376,14 @@ public class StoragePoolVO implements StoragePool { return !isShared(); } + public Long getParent() { + return parent; + } + + public void setParent(Long parent) { + this.parent = parent; + } + @Override public boolean isInMaintenance() { return status == StoragePoolStatus.PrepareForMaintenance || status == StoragePoolStatus.Maintenance || status == StoragePoolStatus.ErrorInMaintenance || diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java index 23fb2142868..68efe16fd7a 100644 --- a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java +++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java @@ -217,6 +217,11 @@ public abstract class AbstractStoragePoolAllocator extends AdapterBase implement List requestVolumes = new ArrayList<>(); requestVolumes.add(volume); if (dskCh.getHypervisorType() == HypervisorType.VMware) { + // Skip the parent datastore cluster, consider only child storage pools in it + if (pool.getPoolType() == Storage.StoragePoolType.DatastoreCluster && storageMgr.isStoragePoolDatastoreClusterParent(pool)) { + return false; + } + try { boolean isStoragePoolStoragepolicyComplaince = storageMgr.isStoragePoolComplaintWithStoragePolicy(requestVolumes, pool); if (!isStoragePoolStoragepolicyComplaince) { diff --git a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java index 4f28fa29e72..b8a2f83d822 100644 --- a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java @@ -2613,6 +2613,15 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C return disk; } + @Override + public boolean isStoragePoolDatastoreClusterParent(StoragePool pool) { + List childStoragePools = _storagePoolDao.listChildStoragePoolsInDatastoreCluster(pool.getId()); + if (childStoragePools != null && !childStoragePools.isEmpty()) { + return true; + } + return false; + } + private void setVolumeObjectTOThrottling(VolumeObjectTO volumeTO, final ServiceOffering offering, final DiskOffering diskOffering) { volumeTO.setBytesReadRate(getDiskBytesReadRate(offering, diskOffering)); volumeTO.setBytesWriteRate(getDiskBytesWriteRate(offering, diskOffering));