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..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 @@ -56,5 +56,7 @@ public interface ManagementServerHostDao extends GenericDao sc = StateSearch.create(); sc.setParameters("state", ManagementServerHost.State.Up); sc.setParameters("runid", 0); @@ -282,4 +282,16 @@ public ManagementServerHostVO findOneByLongestRuntime() { return CollectionUtils.isNotEmpty(msHosts) ? msHosts.get(0) : null; } + @Override + public ManagementServerHostVO findOneInUpStateByClassName(String className) { + SearchCriteria sc = StateSearch.create(); + sc.setParameters("state", ManagementServerHost.State.Up); + Filter filter = new Filter(ManagementServerHostVO.class, "id", true, null, null); + List mshosts = listBy(sc, filter); + if (CollectionUtils.isEmpty(mshosts)) { + return null; + } + int offset = (className == null) ? 0 : (className.length() % mshosts.size()); + return mshosts.get(offset); + } } 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 7410fb1c2655..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 @@ -19,6 +19,8 @@ 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; @@ -40,6 +42,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 +71,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 +196,11 @@ public boolean start() { final TimerTask schedulerPollTask = new ManagedContextTimerTask() { @Override protected void runInContext() { + 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; + } try { poll(new Date()); } catch (final Throwable t) {