From 78f73c1bc631fdba997fe19d44cdd0ea58243e11 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Thu, 4 Feb 2021 10:13:57 +0100 Subject: [PATCH 1/5] server: Fix update capacity for hosts take long time if there are many service offerings (#4623) Steps to reproduce the issue: (1)Create 10000 service offerings (by db changes below or cloudmonkey). ``` DROP PROCEDURE IF EXISTS cloud.insert_service_offering; DELIMITER $$ CREATE PROCEDURE cloud.insert_service_offering() BEGIN DECLARE count INT DEFAULT 10000; SET @offeringid = (select max(id)+1 from disk_offering); WHILE count > 0 DO INSERT INTO disk_offering (id,name,uuid,display_text,disk_size,type,created) values (@offeringid,'test-offering-wei',uuid(), 'test-offering-wei',0,'Service',now()); INSERT INTO service_offering (id,cpu,speed,ram_size) values (@offeringid, 1, 500,256); SET @offeringid = @offeringid + 1; SET count = count - 1; END WHILE; END $$ DELIMITER ; CALL cloud.insert_service_offering(); mysql> CALL cloud.insert_service_offering(); Query OK, 0 rows affected (2 min 30.85 sec) ``` (2) Check the total time of periodical capacity check in cloudstack. Without this patch, it spend 2.5 seconds (2 hosts) ``` 2021-01-15 16:10:12,793 DEBUG [c.c.a.AlertManagerImpl] (CapacityChecker:ctx-5d5f3b3b) (logid:f5eb68ba) Running Capacity Checker ... 2021-01-15 16:10:15,287 DEBUG [c.c.a.AlertManagerImpl] (CapacityChecker:ctx-5d5f3b3b) (logid:f5eb68ba) Done running Capacity Checker ... ``` With this patch ,it spend 1.3 seconds (2 hosts) ``` 2021-01-15 16:12:43,604 DEBUG [c.c.a.AlertManagerImpl] (CapacityChecker:ctx-a2a7f3f1) (logid:f7e0a4c5) Running Capacity Checker ... 2021-01-15 16:12:44,927 DEBUG [c.c.a.AlertManagerImpl] (CapacityChecker:ctx-a2a7f3f1) (logid:f7e0a4c5) Done running Capacity Checker ... ``` If there are 100 hosts, the total time will be reduced from 100+ seconds to around 10 seconds. --- .../java/com/cloud/capacity/CapacityManager.java | 5 +++++ .../main/java/com/cloud/alert/AlertManagerImpl.java | 12 +++++++++++- .../java/com/cloud/capacity/CapacityManagerImpl.java | 11 +++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/engine/components-api/src/main/java/com/cloud/capacity/CapacityManager.java b/engine/components-api/src/main/java/com/cloud/capacity/CapacityManager.java index 98287bb279d..8827ca41d3c 100644 --- a/engine/components-api/src/main/java/com/cloud/capacity/CapacityManager.java +++ b/engine/components-api/src/main/java/com/cloud/capacity/CapacityManager.java @@ -16,10 +16,13 @@ // under the License. package com.cloud.capacity; +import java.util.Map; + import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; import com.cloud.host.Host; +import com.cloud.service.ServiceOfferingVO; import com.cloud.storage.VMTemplateVO; import com.cloud.vm.VirtualMachine; @@ -99,6 +102,8 @@ public interface CapacityManager { void updateCapacityForHost(Host host); + void updateCapacityForHost(Host host, Map offeringsMap); + /** * @param pool storage pool * @param templateForVmCreation template that will be used for vm creation diff --git a/server/src/main/java/com/cloud/alert/AlertManagerImpl.java b/server/src/main/java/com/cloud/alert/AlertManagerImpl.java index 5a7a8b436e0..75b8cc7f3b4 100644 --- a/server/src/main/java/com/cloud/alert/AlertManagerImpl.java +++ b/server/src/main/java/com/cloud/alert/AlertManagerImpl.java @@ -75,6 +75,8 @@ import com.cloud.host.HostVO; import com.cloud.network.dao.IPAddressDao; import com.cloud.org.Grouping.AllocationState; import com.cloud.resource.ResourceManager; +import com.cloud.service.ServiceOfferingVO; +import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.StorageManager; import com.cloud.utils.NumbersUtil; import com.cloud.utils.component.ManagerBase; @@ -121,6 +123,8 @@ public class AlertManagerImpl extends ManagerBase implements AlertManager, Confi private ConfigurationManager _configMgr; @Inject protected ConfigDepot _configDepot; + @Inject + ServiceOfferingDao _offeringsDao; private Timer _timer = null; private long _capacityCheckPeriod = 60L * 60L * 1000L; // One hour by default. @@ -275,8 +279,14 @@ public class AlertManagerImpl extends ManagerBase implements AlertManager, Confi // get all hosts...even if they are not in 'UP' state List hosts = _resourceMgr.listAllNotInMaintenanceHostsInOneZone(Host.Type.Routing, null); if (hosts != null) { + // prepare the service offerings + List offerings = _offeringsDao.listAllIncludingRemoved(); + Map offeringsMap = new HashMap(); + for (ServiceOfferingVO offering : offerings) { + offeringsMap.put(offering.getId(), offering); + } for (HostVO host : hosts) { - _capacityMgr.updateCapacityForHost(host); + _capacityMgr.updateCapacityForHost(host, offeringsMap); } } if (s_logger.isDebugEnabled()) { diff --git a/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java b/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java index 5530e53fdc4..f851471b0e0 100644 --- a/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java +++ b/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java @@ -627,7 +627,12 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, for (ServiceOfferingVO offering : offerings) { offeringsMap.put(offering.getId(), offering); } + updateCapacityForHost(host, offeringsMap); + } + @DB + @Override + public void updateCapacityForHost(final Host host, final Map offeringsMap) { long usedCpuCore = 0; long reservedCpuCore = 0; long usedCpu = 0; @@ -664,6 +669,9 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, ramOvercommitRatio = Float.parseFloat(vmDetailRam); } ServiceOffering so = offeringsMap.get(vm.getServiceOfferingId()); + if (so == null) { + so = _offeringsDao.findByIdIncludingRemoved(vm.getServiceOfferingId()); + } if (so.isDynamic()) { usedMemory += ((Integer.parseInt(vmDetails.get(UsageEventVO.DynamicParameters.memory.name())) * 1024L * 1024L) / ramOvercommitRatio) * @@ -703,6 +711,9 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, } ServiceOffering so = offeringsMap.get(vm.getServiceOfferingId()); Map vmDetails = _userVmDetailsDao.listDetailsKeyPairs(vm.getId()); + if (so == null) { + so = _offeringsDao.findByIdIncludingRemoved(vm.getServiceOfferingId()); + } if (so.isDynamic()) { reservedMemory += ((Integer.parseInt(vmDetails.get(UsageEventVO.DynamicParameters.memory.name())) * 1024L * 1024L) / ramOvercommitRatio) * From 4de6ac3c05093999807585bbe7688a5c20cd79a3 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Thu, 4 Feb 2021 10:14:47 +0100 Subject: [PATCH 2/5] server: Get vm network/disk statistics and update database per host (#4601) * server: Get vm network/disk statistics and update database per host * #4601 : modify debug message --- .../java/com/cloud/server/StatsCollector.java | 55 +++++++++---------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/server/src/main/java/com/cloud/server/StatsCollector.java b/server/src/main/java/com/cloud/server/StatsCollector.java index f8ca6576108..86f02c28ea2 100644 --- a/server/src/main/java/com/cloud/server/StatsCollector.java +++ b/server/src/main/java/com/cloud/server/StatsCollector.java @@ -684,18 +684,17 @@ public class StatsCollector extends ManagerBase implements ComponentMethodInterc return; } // collect the vm disk statistics(total) from hypervisor. added by weizhou, 2013.03. - s_logger.trace("Running VM disk stats ..."); - try { - Transaction.execute(new TransactionCallbackNoReturn() { - @Override - public void doInTransactionWithoutResult(TransactionStatus status) { - s_logger.debug("VmDiskStatsTask is running..."); + s_logger.debug("VmDiskStatsTask is running..."); - SearchCriteria sc = createSearchCriteriaForHostTypeRoutingStateUpAndNotInMaintenance(); - sc.addAnd("hypervisorType", SearchCriteria.Op.IN, HypervisorType.KVM, HypervisorType.VMware); - List hosts = _hostDao.search(sc, null); + SearchCriteria sc = createSearchCriteriaForHostTypeRoutingStateUpAndNotInMaintenance(); + sc.addAnd("hypervisorType", SearchCriteria.Op.IN, HypervisorType.KVM, HypervisorType.VMware); + List hosts = _hostDao.search(sc, null); - for (HostVO host : hosts) { + for (HostVO host : hosts) { + try { + Transaction.execute(new TransactionCallbackNoReturn() { + @Override + public void doInTransactionWithoutResult(TransactionStatus status) { List vms = _userVmDao.listRunningByHostId(host.getId()); List vmIds = new ArrayList(); @@ -706,7 +705,7 @@ public class StatsCollector extends ManagerBase implements ComponentMethodInterc HashMap> vmDiskStatsById = _userVmMgr.getVmDiskStatistics(host.getId(), host.getName(), vmIds); if (vmDiskStatsById == null) - continue; + return; Set vmIdSet = vmDiskStatsById.keySet(); for (Long vmId : vmIdSet) { @@ -793,10 +792,10 @@ public class StatsCollector extends ManagerBase implements ComponentMethodInterc } } } - } - }); - } catch (Exception e) { - s_logger.warn("Error while collecting vm disk stats from hosts", e); + }); + } catch (Exception e) { + s_logger.warn(String.format("Error while collecting vm disk stats from host %s : ", host.getName()), e); + } } } } @@ -812,16 +811,16 @@ public class StatsCollector extends ManagerBase implements ComponentMethodInterc return; } // collect the vm network statistics(total) from hypervisor - try { - Transaction.execute(new TransactionCallbackNoReturn() { - @Override - public void doInTransactionWithoutResult(TransactionStatus status) { - s_logger.debug("VmNetworkStatsTask is running..."); + s_logger.debug("VmNetworkStatsTask is running..."); - SearchCriteria sc = createSearchCriteriaForHostTypeRoutingStateUpAndNotInMaintenance(); - List hosts = _hostDao.search(sc, null); + SearchCriteria sc = createSearchCriteriaForHostTypeRoutingStateUpAndNotInMaintenance(); + List hosts = _hostDao.search(sc, null); - for (HostVO host : hosts) { + for (HostVO host : hosts) { + try { + Transaction.execute(new TransactionCallbackNoReturn() { + @Override + public void doInTransactionWithoutResult(TransactionStatus status) { List vms = _userVmDao.listRunningByHostId(host.getId()); List vmIds = new ArrayList(); @@ -832,7 +831,7 @@ public class StatsCollector extends ManagerBase implements ComponentMethodInterc HashMap> vmNetworkStatsById = _userVmMgr.getVmNetworkStatistics(host.getId(), host.getName(), vmIds); if (vmNetworkStatsById == null) - continue; + return; Set vmIdSet = vmNetworkStatsById.keySet(); for (Long vmId : vmIdSet) { @@ -912,10 +911,10 @@ public class StatsCollector extends ManagerBase implements ComponentMethodInterc } } } - } - }); - } catch (Exception e) { - s_logger.warn("Error while collecting vm network stats from hosts", e); + }); + } catch (Exception e) { + s_logger.warn(String.format("Error while collecting vm network stats from host %s : ", host.getName()), e); + } } } } From db4f9e9b53ba4e3d4a03320b5fefa865c52e1883 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Fri, 5 Feb 2021 15:56:54 +0530 Subject: [PATCH 3/5] test: fix checksums for test template (#4655) macchinina-vmware.ova has changed at http://dl.openvm.eu/cloudstack/macchinina/x86_64/ sha1, sha256 and m5 checksum have been updated for template file in test_template.py Signed-off-by: Abhishek Kumar --- test/integration/smoke/test_templates.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/integration/smoke/test_templates.py b/test/integration/smoke/test_templates.py index 9e9dd9fd3d6..73ac6375754 100644 --- a/test/integration/smoke/test_templates.py +++ b/test/integration/smoke/test_templates.py @@ -77,7 +77,7 @@ class TestCreateTemplateWithChecksum(cloudstackTestCase): if "vmware" in self.hypervisor.lower(): self.test_template = registerTemplate.registerTemplateCmd() self.test_template = registerTemplate.registerTemplateCmd() - self.test_template.checksum = "{SHA-1}" + "178639bd5ec089a27f6d39025be28c3de5d9393b" + self.test_template.checksum = "{SHA-1}" + "3c00872599c6e1e46a358aac51080db88266cf5c" self.test_template.hypervisor = self.hypervisor self.test_template.zoneid = self.zone.id self.test_template.name = 'test sha-2333' @@ -85,8 +85,8 @@ class TestCreateTemplateWithChecksum(cloudstackTestCase): self.test_template.url = "http://dl.openvm.eu/cloudstack/macchinina/x86_64/macchinina-vmware.ova" self.test_template.format = "OVA" self.test_template.ostypeid = self.getOsType("Other Linux (64-bit)") - self.md5 = "3c23ac66bac7888dc7c972783646c644" - self.sha256 = "97aaa096d419522158c54f83eb61d9242d9f6bca9166fd4030d73683d647c7e7" + self.md5 = "27f3c56a8c7ec7b2f3ff2199f7078006" + self.sha256 = "a7b04c1eb507f3f5de844bda352df1ea5e20335b465409493ca6ae07dfd0a158" if "xen" in self.hypervisor.lower(): self.test_template = registerTemplate.registerTemplateCmd() From b8e6c08132fa0a854fa1ff11b84ab174b5fab85c Mon Sep 17 00:00:00 2001 From: Andrija Panic <45762285+andrijapanicsb@users.noreply.github.com> Date: Fri, 5 Feb 2021 11:27:21 +0100 Subject: [PATCH 4/5] setup: Update cloud-setup-databases.in (#4653) --- setup/bindir/cloud-setup-databases.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/bindir/cloud-setup-databases.in b/setup/bindir/cloud-setup-databases.in index 15a81764091..53617be2e0f 100755 --- a/setup/bindir/cloud-setup-databases.in +++ b/setup/bindir/cloud-setup-databases.in @@ -179,7 +179,7 @@ Sql parameters: *************************************************************** Please run: - cloud-setup-database -h + cloudstack-setup-databases -h for full help ''' % msg From 29e309839d7e33c8de3e7840b355ac41ead2ca5a Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Fri, 5 Feb 2021 15:58:45 +0530 Subject: [PATCH 5/5] test: hardware required for changeserviceoffering (#4650) Signed-off-by: Abhishek Kumar --- test/integration/component/test_mm_domain_limits.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/component/test_mm_domain_limits.py b/test/integration/component/test_mm_domain_limits.py index 51e92ce67f1..795055eca6f 100644 --- a/test/integration/component/test_mm_domain_limits.py +++ b/test/integration/component/test_mm_domain_limits.py @@ -210,7 +210,7 @@ class TestDomainMemoryLimits(cloudstackTestCase): domainid=self.child_do_admin_2.domainid) return - @attr(tags=["advanced", "advancedns","simulator"], required_hardware="false") + @attr(tags=["advanced", "advancedns","simulator"], required_hardware="true") def test_01_change_service_offering(self): """Test Deploy VM with specified RAM & verify the usage"""