From 7ecfb412f12433210ac6808821e2d69ae0e42e13 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Thu, 4 Sep 2025 08:48:03 +0200 Subject: [PATCH 1/5] server: run the vm scheduler poll task on only one management server --- .../cloudstack/vm/schedule/VMSchedulerImpl.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/server/src/main/java/org/apache/cloudstack/vm/schedule/VMSchedulerImpl.java b/server/src/main/java/org/apache/cloudstack/vm/schedule/VMSchedulerImpl.java index 7410fb1c2655..33d1a8d30a3d 100644 --- a/server/src/main/java/org/apache/cloudstack/vm/schedule/VMSchedulerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/vm/schedule/VMSchedulerImpl.java @@ -19,12 +19,15 @@ package org.apache.cloudstack.vm.schedule; import com.cloud.api.ApiGsonHelper; +import com.cloud.cluster.ManagementServerHostVO; +import com.cloud.cluster.dao.ManagementServerHostDao; import com.cloud.event.ActionEventUtils; import com.cloud.event.EventTypes; import com.cloud.user.User; import com.cloud.utils.DateUtil; import com.cloud.utils.component.ComponentContext; import com.cloud.utils.component.ManagerBase; +import com.cloud.utils.db.Filter; import com.cloud.utils.db.GlobalLock; import com.cloud.vm.UserVmManager; import com.cloud.vm.VirtualMachine; @@ -40,6 +43,7 @@ import org.apache.cloudstack.framework.jobs.AsyncJobManager; import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO; import org.apache.cloudstack.managed.context.ManagedContextTimerTask; +import org.apache.cloudstack.utils.identity.ManagementServerNode; import org.apache.cloudstack.vm.schedule.dao.VMScheduleDao; import org.apache.cloudstack.vm.schedule.dao.VMScheduledJobDao; import org.apache.commons.lang.time.DateUtils; @@ -68,6 +72,9 @@ public class VMSchedulerImpl extends ManagerBase implements VMScheduler, Configu private UserVmManager userVmManager; @Inject private AsyncJobManager asyncJobManager; + @Inject + private ManagementServerHostDao managementServerHostDao; + private AsyncJobDispatcher asyncJobDispatcher; private Timer vmSchedulerTimer; private Date currentTimestamp; @@ -190,6 +197,11 @@ public boolean start() { final TimerTask schedulerPollTask = new ManagedContextTimerTask() { @Override protected void runInContext() { + ManagementServerHostVO msHost = managementServerHostDao.findOneInUpState(new Filter(ManagementServerHostVO.class, "id", false, 0L, 1L)); + if (msHost == null || (msHost.getMsid() != ManagementServerNode.getManagementServerId())) { + logger.debug("Skipping the vm scheduler poll task on this management server"); + return; + } try { poll(new Date()); } catch (final Throwable t) { From f1e91c4e75bb2fb25067d356d616d9647177a7d7 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Thu, 4 Sep 2025 09:47:26 +0200 Subject: [PATCH 2/5] Update 11573 --- .../org/apache/cloudstack/vm/schedule/VMSchedulerImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/server/src/main/java/org/apache/cloudstack/vm/schedule/VMSchedulerImpl.java b/server/src/main/java/org/apache/cloudstack/vm/schedule/VMSchedulerImpl.java index 33d1a8d30a3d..0a0c87a24b0c 100644 --- a/server/src/main/java/org/apache/cloudstack/vm/schedule/VMSchedulerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/vm/schedule/VMSchedulerImpl.java @@ -27,7 +27,6 @@ import com.cloud.utils.DateUtil; import com.cloud.utils.component.ComponentContext; import com.cloud.utils.component.ManagerBase; -import com.cloud.utils.db.Filter; import com.cloud.utils.db.GlobalLock; import com.cloud.vm.UserVmManager; import com.cloud.vm.VirtualMachine; @@ -197,7 +196,7 @@ public boolean start() { final TimerTask schedulerPollTask = new ManagedContextTimerTask() { @Override protected void runInContext() { - ManagementServerHostVO msHost = managementServerHostDao.findOneInUpState(new Filter(ManagementServerHostVO.class, "id", false, 0L, 1L)); + ManagementServerHostVO msHost = managementServerHostDao.findOneByLongestRuntime(); if (msHost == null || (msHost.getMsid() != ManagementServerNode.getManagementServerId())) { logger.debug("Skipping the vm scheduler poll task on this management server"); return; From 06b0504d7b5ed1b311646ec2e741fcfa0d2e6889 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Thu, 4 Sep 2025 13:59:33 +0200 Subject: [PATCH 3/5] Update method to findOneInUpStateByLongestRuntime --- .../java/com/cloud/cluster/dao/ManagementServerHostDao.java | 2 +- .../java/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java | 2 +- .../org/apache/cloudstack/mom/webhook/WebhookServiceImpl.java | 2 +- .../java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java | 2 +- .../apache/cloudstack/resource/ResourceCleanupServiceImpl.java | 2 +- .../java/org/apache/cloudstack/vm/schedule/VMSchedulerImpl.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostDao.java b/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostDao.java index 96d57ee04258..12d3b85b31d7 100644 --- a/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostDao.java +++ b/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostDao.java @@ -56,5 +56,5 @@ public interface ManagementServerHostDao extends GenericDao sc = StateSearch.create(); sc.setParameters("state", ManagementServerHost.State.Up); sc.setParameters("runid", 0); diff --git a/plugins/event-bus/webhook/src/main/java/org/apache/cloudstack/mom/webhook/WebhookServiceImpl.java b/plugins/event-bus/webhook/src/main/java/org/apache/cloudstack/mom/webhook/WebhookServiceImpl.java index 97d00c45e4d4..0bef17cfb95e 100644 --- a/plugins/event-bus/webhook/src/main/java/org/apache/cloudstack/mom/webhook/WebhookServiceImpl.java +++ b/plugins/event-bus/webhook/src/main/java/org/apache/cloudstack/mom/webhook/WebhookServiceImpl.java @@ -319,7 +319,7 @@ public class WebhookDeliveryCleanupWorker extends ManagedContextRunnable { protected void runCleanupForLongestRunningManagementServer() { try { - ManagementServerHostVO msHost = managementServerHostDao.findOneByLongestRuntime(); + ManagementServerHostVO msHost = managementServerHostDao.findOneInUpStateByLongestRuntime(); if (msHost == null || (msHost.getMsid() != ManagementServerNode.getManagementServerId())) { logger.debug("Skipping the webhook delivery cleanup task on this management server"); return; diff --git a/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java b/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java index 85cca63546c4..80f44ad43d92 100644 --- a/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java +++ b/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java @@ -2152,7 +2152,7 @@ protected void runInContext() { try { if (lock.lock(30)) { try { - ManagementServerHostVO msHost = managementServerHostDao.findOneByLongestRuntime(); + ManagementServerHostVO msHost = managementServerHostDao.findOneInUpStateByLongestRuntime(); if (msHost == null || (msHost.getMsid() != ManagementServerNode.getManagementServerId())) { logger.trace("Skipping the resource counters recalculation task on this management server"); return; diff --git a/server/src/main/java/org/apache/cloudstack/resource/ResourceCleanupServiceImpl.java b/server/src/main/java/org/apache/cloudstack/resource/ResourceCleanupServiceImpl.java index 50c4de36b7f7..018556f58de4 100644 --- a/server/src/main/java/org/apache/cloudstack/resource/ResourceCleanupServiceImpl.java +++ b/server/src/main/java/org/apache/cloudstack/resource/ResourceCleanupServiceImpl.java @@ -629,7 +629,7 @@ protected void runInContext() { } protected void runCleanupForLongestRunningManagementServer() { - ManagementServerHostVO msHost = managementServerHostDao.findOneByLongestRuntime(); + ManagementServerHostVO msHost = managementServerHostDao.findOneInUpStateByLongestRuntime(); if (msHost == null || (msHost.getMsid() != ManagementServerNode.getManagementServerId())) { logger.debug("Skipping the expunged resource cleanup task on this management server"); return; diff --git a/server/src/main/java/org/apache/cloudstack/vm/schedule/VMSchedulerImpl.java b/server/src/main/java/org/apache/cloudstack/vm/schedule/VMSchedulerImpl.java index 0a0c87a24b0c..e32fc2ee7e35 100644 --- a/server/src/main/java/org/apache/cloudstack/vm/schedule/VMSchedulerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/vm/schedule/VMSchedulerImpl.java @@ -196,7 +196,7 @@ public boolean start() { final TimerTask schedulerPollTask = new ManagedContextTimerTask() { @Override protected void runInContext() { - ManagementServerHostVO msHost = managementServerHostDao.findOneByLongestRuntime(); + ManagementServerHostVO msHost = managementServerHostDao.findOneInUpStateByLongestRuntime(); if (msHost == null || (msHost.getMsid() != ManagementServerNode.getManagementServerId())) { logger.debug("Skipping the vm scheduler poll task on this management server"); return; From e1ddb416ba79a64f7b966e80ad10bf8727cf5f22 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Wed, 10 Sep 2025 08:44:22 +0200 Subject: [PATCH 4/5] add method findOneInUpState to get mgmt server from class name --- .../cloud/cluster/dao/ManagementServerHostDao.java | 2 ++ .../cluster/dao/ManagementServerHostDaoImpl.java | 11 +++++++++++ .../cloudstack/vm/schedule/VMSchedulerImpl.java | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostDao.java b/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostDao.java index 12d3b85b31d7..2d9e101f2c04 100644 --- a/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostDao.java +++ b/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostDao.java @@ -57,4 +57,6 @@ public interface ManagementServerHostDao extends GenericDao sc = StateSearch.create(); + sc.setParameters("state", ManagementServerHost.State.Up); + List mshosts = listBy(sc, null); + if (CollectionUtils.isEmpty(mshosts)) { + return null; + } + int offset = (className == null) ? 0 : (className.length() % mshosts.size()); + return mshosts.get(offset); + } } diff --git a/server/src/main/java/org/apache/cloudstack/vm/schedule/VMSchedulerImpl.java b/server/src/main/java/org/apache/cloudstack/vm/schedule/VMSchedulerImpl.java index e32fc2ee7e35..c8ceff5e97d2 100644 --- a/server/src/main/java/org/apache/cloudstack/vm/schedule/VMSchedulerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/vm/schedule/VMSchedulerImpl.java @@ -196,7 +196,7 @@ public boolean start() { final TimerTask schedulerPollTask = new ManagedContextTimerTask() { @Override protected void runInContext() { - ManagementServerHostVO msHost = managementServerHostDao.findOneInUpStateByLongestRuntime(); + ManagementServerHostVO msHost = managementServerHostDao.findOneInUpStateByClassName(this.getClass().getSimpleName()); if (msHost == null || (msHost.getMsid() != ManagementServerNode.getManagementServerId())) { logger.debug("Skipping the vm scheduler poll task on this management server"); return; From 4cd164dab0c891c44648b67917ef4070b3755ba8 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Mon, 15 Sep 2025 10:00:42 +0200 Subject: [PATCH 5/5] Update 11573: order mgmt servers by id --- .../com/cloud/cluster/dao/ManagementServerHostDaoImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java b/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java index a670ba7a07a4..296bcd7a2779 100644 --- a/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java +++ b/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java @@ -286,7 +286,8 @@ public ManagementServerHostVO findOneInUpStateByLongestRuntime() { public ManagementServerHostVO findOneInUpStateByClassName(String className) { SearchCriteria sc = StateSearch.create(); sc.setParameters("state", ManagementServerHost.State.Up); - List mshosts = listBy(sc, null); + Filter filter = new Filter(ManagementServerHostVO.class, "id", true, null, null); + List mshosts = listBy(sc, filter); if (CollectionUtils.isEmpty(mshosts)) { return null; }