From 5f86dad4cb098eb103cb24d839e264acee352a18 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Wed, 9 Oct 2024 16:28:24 +0530 Subject: [PATCH] improve cluster overcommit value cache Signed-off-by: Abhishek Kumar --- .../java/com/cloud/dc/ClusterDetailsDao.java | 4 ++++ .../com/cloud/dc/ClusterDetailsDaoImpl.java | 20 +++++++++++++++++++ .../cloud/capacity/CapacityManagerImpl.java | 20 +++++++++---------- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/engine/schema/src/main/java/com/cloud/dc/ClusterDetailsDao.java b/engine/schema/src/main/java/com/cloud/dc/ClusterDetailsDao.java index 06c9c525504..6be8e67479f 100644 --- a/engine/schema/src/main/java/com/cloud/dc/ClusterDetailsDao.java +++ b/engine/schema/src/main/java/com/cloud/dc/ClusterDetailsDao.java @@ -16,6 +16,8 @@ // under the License. package com.cloud.dc; +import java.util.Collection; +import java.util.List; import java.util.Map; import com.cloud.utils.db.GenericDao; @@ -29,6 +31,8 @@ public interface ClusterDetailsDao extends GenericDao { ClusterDetailsVO findDetail(long clusterId, String name); + Map findDetails(long clusterId, Collection names); + void deleteDetails(long clusterId); String getVmwareDcName(Long clusterId); diff --git a/engine/schema/src/main/java/com/cloud/dc/ClusterDetailsDaoImpl.java b/engine/schema/src/main/java/com/cloud/dc/ClusterDetailsDaoImpl.java index 0e40f8475c1..a4f6acb9057 100644 --- a/engine/schema/src/main/java/com/cloud/dc/ClusterDetailsDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/dc/ClusterDetailsDaoImpl.java @@ -16,13 +16,16 @@ // under the License. package com.cloud.dc; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.ConfigKey.Scope; import org.apache.cloudstack.framework.config.ScopedConfigStorage; +import org.apache.commons.collections.CollectionUtils; import com.cloud.utils.crypt.DBEncryptionUtil; import com.cloud.utils.db.GenericDaoBase; @@ -82,6 +85,23 @@ public class ClusterDetailsDaoImpl extends GenericDaoBase findDetails(long clusterId, Collection names) { + if (CollectionUtils.isEmpty(names)) { + return new HashMap<>(); + } + SearchBuilder sb = createSearchBuilder(); + sb.and("clusterId", sb.entity().getClusterId(), SearchCriteria.Op.EQ); + sb.and("name", sb.entity().getName(), SearchCriteria.Op.IN); + sb.done(); + SearchCriteria sc = sb.create(); + sc.setParameters("clusterId", clusterId); + sc.setParameters("name", names.toArray()); + List results = search(sc, null); + return results.stream() + .collect(Collectors.toMap(ClusterDetailsVO::getName, ClusterDetailsVO::getValue)); + } + @Override public void deleteDetails(long clusterId) { SearchCriteria sc = ClusterSearch.create(); diff --git a/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java b/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java index a35fd5f5889..d87dcab1ac4 100644 --- a/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java +++ b/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java @@ -148,7 +148,7 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, @Inject MessageBus _messageBus; - private LazyCache> clusterValuesCache; + private LazyCache> clusterValuesCache; private SingleCache> serviceOfferingsCache; private QueuedExecutor hostCapacityUpdateExecutor; @@ -170,7 +170,7 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, public boolean start() { _resourceMgr.registerResourceEvent(ResourceListener.EVENT_PREPARE_MAINTENANCE_AFTER, this); _resourceMgr.registerResourceEvent(ResourceListener.EVENT_CANCEL_MAINTENANCE_AFTER, this); - clusterValuesCache = new LazyCache<>(16, 60, this::getClusterValues); + clusterValuesCache = new LazyCache<>(128, 60, this::getClusterValues); serviceOfferingsCache = new SingleCache<>(60, this::getServiceOfferingsMap); hostCapacityUpdateExecutor.startProcessing(); return true; @@ -652,9 +652,11 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, hostCapacityUpdateExecutor.queueRequest(host); } - protected Pair getClusterValues(long clusterId) { - return new Pair<>(_clusterDetailsDao.findDetail(clusterId, VmDetailConstants.CPU_OVER_COMMIT_RATIO), - _clusterDetailsDao.findDetail(clusterId, VmDetailConstants.MEMORY_OVER_COMMIT_RATIO)); + protected Pair getClusterValues(long clusterId) { + Map map = _clusterDetailsDao.findDetails(clusterId, + List.of(VmDetailConstants.CPU_OVER_COMMIT_RATIO, VmDetailConstants.CPU_OVER_COMMIT_RATIO)); + return new Pair<>(map.get(VmDetailConstants.CPU_OVER_COMMIT_RATIO), + map.get(VmDetailConstants.CPU_OVER_COMMIT_RATIO)); } @@ -712,12 +714,10 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, } vms.addAll(vosMigrating); - Pair clusterValues = + Pair clusterValues = clusterValuesCache.get(host.getClusterId()); - ClusterDetailsVO clusterDetailCpu = clusterValues.first(); - ClusterDetailsVO clusterDetailRam = clusterValues.second(); - Float clusterCpuOvercommitRatio = Float.parseFloat(clusterDetailCpu.getValue()); - Float clusterRamOvercommitRatio = Float.parseFloat(clusterDetailRam.getValue()); + Float clusterCpuOvercommitRatio = Float.parseFloat(clusterValues.first()); + Float clusterRamOvercommitRatio = Float.parseFloat(clusterValues.second()); for (VMInstanceVO vm : vms) { Float cpuOvercommitRatio = 1.0f; Float ramOvercommitRatio = 1.0f;