This is an automated email from the ASF dual-hosted git repository.
andrijapanic pushed a commit to branch 4.13
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/4.13 by this push:
new 6bf92fb server: Search zone-wide storage pool when allocation
algothrim is firstfitleastconsumed (#4002)
6bf92fb is described below
commit 6bf92fb13620b56a1d644840a42cd2590a4f4131
Author: Wei Zhou <[email protected]>
AuthorDate: Mon Apr 6 22:01:40 2020 +0200
server: Search zone-wide storage pool when allocation algothrim is
firstfitleastconsumed (#4002)
---
.../java/com/cloud/capacity/dao/CapacityDao.java | 2 +-
.../com/cloud/capacity/dao/CapacityDaoImpl.java | 22 +++++++++----
.../allocator/AbstractStoragePoolAllocator.java | 3 +-
.../allocator/ZoneWideStoragePoolAllocator.java | 38 ++++++++++++++++++++++
.../manager/allocator/impl/FirstFitAllocator.java | 3 +-
5 files changed, 58 insertions(+), 10 deletions(-)
diff --git
a/engine/schema/src/main/java/com/cloud/capacity/dao/CapacityDao.java
b/engine/schema/src/main/java/com/cloud/capacity/dao/CapacityDao.java
index fcccd56..f2735b8 100644
--- a/engine/schema/src/main/java/com/cloud/capacity/dao/CapacityDao.java
+++ b/engine/schema/src/main/java/com/cloud/capacity/dao/CapacityDao.java
@@ -56,5 +56,5 @@ public interface CapacityDao extends GenericDao<CapacityVO,
Long> {
float findClusterConsumption(Long clusterId, short capacityType, long
computeRequested);
- List<Long> orderHostsByFreeCapacity(Long clusterId, short capacityType);
+ List<Long> orderHostsByFreeCapacity(Long zoneId, Long clusterId, short
capacityType);
}
diff --git
a/engine/schema/src/main/java/com/cloud/capacity/dao/CapacityDaoImpl.java
b/engine/schema/src/main/java/com/cloud/capacity/dao/CapacityDaoImpl.java
index 5b14bd4..72d5b07 100644
--- a/engine/schema/src/main/java/com/cloud/capacity/dao/CapacityDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/capacity/dao/CapacityDaoImpl.java
@@ -903,20 +903,28 @@ public class CapacityDaoImpl extends
GenericDaoBase<CapacityVO, Long> implements
}
@Override
- public List<Long> orderHostsByFreeCapacity(Long clusterId, short
capacityTypeForOrdering){
+ public List<Long> orderHostsByFreeCapacity(Long zoneId, Long clusterId,
short capacityTypeForOrdering){
TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
List<Long> result = new ArrayList<Long>();
StringBuilder sql = new
StringBuilder(ORDER_HOSTS_BY_FREE_CAPACITY_PART1);
- if(clusterId != null) {
- sql.append("AND cluster_id = ?");
- }
- sql.append(ORDER_HOSTS_BY_FREE_CAPACITY_PART2);
+ if (zoneId != null) {
+ sql.append(" AND data_center_id = ?");
+ }
+ if (clusterId != null) {
+ sql.append(" AND cluster_id = ?");
+ }
+ sql.append(ORDER_HOSTS_BY_FREE_CAPACITY_PART2);
try {
pstmt = txn.prepareAutoCloseStatement(sql.toString());
pstmt.setShort(1, capacityTypeForOrdering);
- if(clusterId != null) {
- pstmt.setLong(2, clusterId);
+ int index = 2;
+ if (zoneId != null) {
+ pstmt.setLong(index, zoneId);
+ index ++;
+ }
+ if (clusterId != null) {
+ pstmt.setLong(index, clusterId);
}
ResultSet rs = pstmt.executeQuery();
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 ef5e21d..727d10a 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
@@ -94,6 +94,7 @@ public abstract class AbstractStoragePoolAllocator extends
AdapterBase implement
protected List<StoragePool> reorderPoolsByCapacity(DeploymentPlan plan,
List<StoragePool> pools) {
+ Long zoneId = plan.getDataCenterId();
Long clusterId = plan.getClusterId();
short capacityType;
if(pools != null && pools.size() != 0){
@@ -102,7 +103,7 @@ public abstract class AbstractStoragePoolAllocator extends
AdapterBase implement
return null;
}
- List<Long> poolIdsByCapacity =
capacityDao.orderHostsByFreeCapacity(clusterId, capacityType);
+ List<Long> poolIdsByCapacity =
capacityDao.orderHostsByFreeCapacity(zoneId, clusterId, capacityType);
if (s_logger.isDebugEnabled()) {
s_logger.debug("List of pools in descending order of free
capacity: "+ poolIdsByCapacity);
}
diff --git
a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/ZoneWideStoragePoolAllocator.java
b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/ZoneWideStoragePoolAllocator.java
index aa077f3..301704a 100644
---
a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/ZoneWideStoragePoolAllocator.java
+++
b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/ZoneWideStoragePoolAllocator.java
@@ -29,6 +29,8 @@ import org.springframework.stereotype.Component;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+import com.cloud.capacity.Capacity;
+import com.cloud.capacity.dao.CapacityDao;
import com.cloud.deploy.DeploymentPlan;
import com.cloud.deploy.DeploymentPlanner.ExcludeList;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
@@ -43,6 +45,8 @@ public class ZoneWideStoragePoolAllocator extends
AbstractStoragePoolAllocator {
private static final Logger LOGGER =
Logger.getLogger(ZoneWideStoragePoolAllocator.class);
@Inject
private DataStoreManager dataStoreMgr;
+ @Inject
+ private CapacityDao capacityDao;
@Override
@@ -110,6 +114,40 @@ public class ZoneWideStoragePoolAllocator extends
AbstractStoragePoolAllocator {
return !ScopeType.ZONE.equals(storagePoolVO.getScope()) ||
!storagePoolVO.isManaged();
}
+
+ @Override
+ protected List<StoragePool> reorderPoolsByCapacity(DeploymentPlan plan,
+ List<StoragePool> pools) {
+ Long zoneId = plan.getDataCenterId();
+ short capacityType;
+ if(pools != null && pools.size() != 0){
+ capacityType = pools.get(0).getPoolType().isShared() ?
Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED : Capacity.CAPACITY_TYPE_LOCAL_STORAGE;
+ } else{
+ return null;
+ }
+
+ List<Long> poolIdsByCapacity =
capacityDao.orderHostsByFreeCapacity(zoneId, null, capacityType);
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("List of zone-wide storage pools in descending order
of free capacity: "+ poolIdsByCapacity);
+ }
+
+ //now filter the given list of Pools by this ordered list
+ Map<Long, StoragePool> poolMap = new HashMap<>();
+ for (StoragePool pool : pools) {
+ poolMap.put(pool.getId(), pool);
+ }
+ List<Long> matchingPoolIds = new ArrayList<>(poolMap.keySet());
+
+ poolIdsByCapacity.retainAll(matchingPoolIds);
+
+ List<StoragePool> reorderedPools = new ArrayList<>();
+ for(Long id: poolIdsByCapacity){
+ reorderedPools.add(poolMap.get(id));
+ }
+
+ return reorderedPools;
+ }
+
@Override
protected List<StoragePool> reorderPoolsByNumberOfVolumes(DeploymentPlan
plan, List<StoragePool> pools, Account account) {
if (account == null) {
diff --git
a/server/src/main/java/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java
b/server/src/main/java/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java
index f4ad478..b6ee305 100644
---
a/server/src/main/java/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java
+++
b/server/src/main/java/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java
@@ -345,6 +345,7 @@ public class FirstFitAllocator extends AdapterBase
implements HostAllocator {
// Reorder hosts in the decreasing order of free capacity.
private List<? extends Host> reorderHostsByCapacity(DeploymentPlan plan,
List<? extends Host> hosts) {
+ Long zoneId = plan.getDataCenterId();
Long clusterId = plan.getClusterId();
//Get capacity by which we should reorder
String capacityTypeToOrder =
_configDao.getValue(Config.HostCapacityTypeToOrderClusters.key());
@@ -352,7 +353,7 @@ public class FirstFitAllocator extends AdapterBase
implements HostAllocator {
if("RAM".equalsIgnoreCase(capacityTypeToOrder)){
capacityType = CapacityVO.CAPACITY_TYPE_MEMORY;
}
- List<Long> hostIdsByFreeCapacity =
_capacityDao.orderHostsByFreeCapacity(clusterId, capacityType);
+ List<Long> hostIdsByFreeCapacity =
_capacityDao.orderHostsByFreeCapacity(zoneId, clusterId, capacityType);
if (s_logger.isDebugEnabled()) {
s_logger.debug("List of hosts in descending order of free capacity
in the cluster: "+ hostIdsByFreeCapacity);
}