From d5cb403de22088aded5648f4df044efafe1419dc Mon Sep 17 00:00:00 2001 From: Sachin R <32716246+sachindoddaguni@users.noreply.github.com> Date: Mon, 8 Jun 2026 13:21:55 -0700 Subject: [PATCH 1/3] Make AgentConnectTaskPool core and max pool sizes configurable via global config (#839) Replaces hardcoded values of 100/500 in initConnectExecutor() with ConfigKeys agent.connect.executor.core.pool.size (default 100) and agent.connect.executor.max.pool.size (default 500). --- .../java/com/cloud/agent/manager/AgentManagerImpl.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java b/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java index 8c69dcdc4828..b3617b65ac00 100644 --- a/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java +++ b/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java @@ -248,6 +248,10 @@ public class AgentManagerImpl extends ManagerBase implements AgentManager, Handl "Percentage (as a value between 0 and 1) of direct.agent.pool.size to be used as upper thread cap for a single direct agent to process requests", false); protected final ConfigKey CheckTxnBeforeSending = new ConfigKey<>("Developer", Boolean.class, "check.txn.before.sending.agent.commands", "false", "This parameter allows developers to enable a check to see if a transaction wraps commands that are sent to the resource. This is not to be enabled on production systems.", true); + protected final ConfigKey AgentConnectExecutorCorePoolSize = new ConfigKey<>("Advanced", Integer.class, "agent.connect.executor.core.pool.size", "100", + "Core pool size for the thread pool that handles agent connect tasks.", false); + protected final ConfigKey AgentConnectExecutorMaxPoolSize = new ConfigKey<>("Advanced", Integer.class, "agent.connect.executor.max.pool.size", "500", + "Maximum pool size for the thread pool that handles agent connect tasks.", false); public static final List HOST_DOWN_ALERT_UNSUPPORTED_HOST_TYPES = Arrays.asList( Host.Type.SecondaryStorage, @@ -423,7 +427,7 @@ public void onManagementServerCancelMaintenance() { } private void initConnectExecutor() { - _connectExecutor = new ThreadPoolExecutor(100, 500, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new NamedThreadFactory("AgentConnectTaskPool")); + _connectExecutor = new ThreadPoolExecutor(AgentConnectExecutorCorePoolSize.value(), AgentConnectExecutorMaxPoolSize.value(), 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new NamedThreadFactory("AgentConnectTaskPool")); // allow core threads to time out even when there are no items in the queue _connectExecutor.allowCoreThreadTimeOut(true); } @@ -2136,7 +2140,7 @@ public ConfigKey[] getConfigKeys() { return new ConfigKey[] { CheckTxnBeforeSending, Workers, Port, Wait, AlertWait, DirectAgentLoadSize, DirectAgentPoolSize, DirectAgentThreadCap, EnableKVMAutoEnableDisable, ReadyCommandWait, GranularWaitTimeForCommands, RemoteAgentSslHandshakeTimeout, RemoteAgentMaxConcurrentNewConnections, - RemoteAgentNewConnectionsMonitorInterval, KVMHostDiscoverySshPort }; + RemoteAgentNewConnectionsMonitorInterval, KVMHostDiscoverySshPort, AgentConnectExecutorCorePoolSize, AgentConnectExecutorMaxPoolSize }; } protected class SetHostParamsListener implements Listener { From 0b31ca04e94d497aaef0ea4ee72bc24d9e8fd1f3 Mon Sep 17 00:00:00 2001 From: nvazquez Date: Tue, 14 Jul 2026 21:11:18 -0300 Subject: [PATCH 2/3] Add validation for the setting values --- .../cloud/agent/manager/AgentManagerImpl.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java b/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java index b3617b65ac00..1636cb6b681b 100644 --- a/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java +++ b/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java @@ -220,6 +220,9 @@ public class AgentManagerImpl extends ManagerBase implements AgentManager, Handl private boolean _reconcileCommandsEnabled = false; private Integer _reconcileCommandInterval; + private static final int AGENT_CONNECT_CORE_POOL_SIZE = 100; + private static final int AGENT_CONNECT_MAX_POOL_SIZE = 500; + @Inject ResourceManager _resourceMgr; @Inject @@ -427,11 +430,28 @@ public void onManagementServerCancelMaintenance() { } private void initConnectExecutor() { - _connectExecutor = new ThreadPoolExecutor(AgentConnectExecutorCorePoolSize.value(), AgentConnectExecutorMaxPoolSize.value(), 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new NamedThreadFactory("AgentConnectTaskPool")); + Pair poolSizeValues = retrieveAgentConnectPoolCoreSizeAndMaxSize(); + _connectExecutor = new ThreadPoolExecutor(poolSizeValues.first(), poolSizeValues.second(), 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new NamedThreadFactory("AgentConnectTaskPool")); // allow core threads to time out even when there are no items in the queue _connectExecutor.allowCoreThreadTimeOut(true); } + private Pair retrieveAgentConnectPoolCoreSizeAndMaxSize() { + Integer agentConnectCorePoolSize = AgentConnectExecutorCorePoolSize.value(); + Integer agentConnectMaxSize = AgentConnectExecutorMaxPoolSize.value(); + if (agentConnectCorePoolSize == null || agentConnectCorePoolSize < 0 || agentConnectMaxSize == null || agentConnectMaxSize < 0) { + logger.warn("Invalid agent connect pool size values. Defaulting to core pool size {} and max pool size {}", AGENT_CONNECT_CORE_POOL_SIZE, AGENT_CONNECT_MAX_POOL_SIZE); + return new Pair<>(AGENT_CONNECT_CORE_POOL_SIZE, AGENT_CONNECT_MAX_POOL_SIZE); + + } + if (agentConnectMaxSize > agentConnectCorePoolSize) { + logger.warn("Max agent connect pool size {} is greater than core pool size {}. " + + "Defaulting to core pool size {} and max pool size {}", agentConnectMaxSize, agentConnectCorePoolSize, AGENT_CONNECT_CORE_POOL_SIZE, AGENT_CONNECT_MAX_POOL_SIZE); + return new Pair<>(AGENT_CONNECT_CORE_POOL_SIZE, AGENT_CONNECT_MAX_POOL_SIZE); + } + return new Pair<>(agentConnectCorePoolSize, agentConnectMaxSize); + } + private void initAndScheduleMonitorExecutor() { _monitorExecutor = new ScheduledThreadPoolExecutor(1, new NamedThreadFactory("AgentMonitor")); _monitorExecutor.scheduleWithFixedDelay(new MonitorTask(), mgmtServiceConf.getPingInterval(), mgmtServiceConf.getPingInterval(), TimeUnit.SECONDS); From f4ec900646f6abbdac68280af29ff49936a5205e Mon Sep 17 00:00:00 2001 From: nvazquez Date: Tue, 14 Jul 2026 21:14:36 -0300 Subject: [PATCH 3/3] Fix --- .../main/java/com/cloud/agent/manager/AgentManagerImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java b/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java index 1636cb6b681b..64664dd7eb7b 100644 --- a/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java +++ b/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java @@ -444,8 +444,8 @@ private Pair retrieveAgentConnectPoolCoreSizeAndMaxSize() { return new Pair<>(AGENT_CONNECT_CORE_POOL_SIZE, AGENT_CONNECT_MAX_POOL_SIZE); } - if (agentConnectMaxSize > agentConnectCorePoolSize) { - logger.warn("Max agent connect pool size {} is greater than core pool size {}. " + + if (agentConnectMaxSize < agentConnectCorePoolSize) { + logger.warn("Max agent connect pool size {} is lower than core pool size {}. " + "Defaulting to core pool size {} and max pool size {}", agentConnectMaxSize, agentConnectCorePoolSize, AGENT_CONNECT_CORE_POOL_SIZE, AGENT_CONNECT_MAX_POOL_SIZE); return new Pair<>(AGENT_CONNECT_CORE_POOL_SIZE, AGENT_CONNECT_MAX_POOL_SIZE); }