diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java b/server/src/com/cloud/agent/manager/AgentManagerImpl.java index 572f78b86b6..a7073f47c0d 100755 --- a/server/src/com/cloud/agent/manager/AgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/AgentManagerImpl.java @@ -1376,7 +1376,10 @@ public class AgentManagerImpl extends ManagerBase implements AgentManager, Handl public boolean tapLoadingAgents(Long hostId, TapAgentsAction action) { synchronized (_loadingAgents) { if (action == TapAgentsAction.Add) { - _loadingAgents.add(hostId); + if (_loadingAgents.contains(hostId)) + return false; + else + _loadingAgents.add(hostId); } else if (action == TapAgentsAction.Del) { _loadingAgents.remove(hostId); } else if (action == TapAgentsAction.Contains) { diff --git a/server/src/com/cloud/resource/ResourceManagerImpl.java b/server/src/com/cloud/resource/ResourceManagerImpl.java index 9da8c28f26e..b8f6a5acd3a 100755 --- a/server/src/com/cloud/resource/ResourceManagerImpl.java +++ b/server/src/com/cloud/resource/ResourceManagerImpl.java @@ -1920,9 +1920,23 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, @Override public Host createHostAndAgent(Long hostId, ServerResource resource, Map details, boolean old, List hostTags, boolean forRebalance) { - _agentMgr.tapLoadingAgents(hostId, TapAgentsAction.Add); - Host host = createHostAndAgent(resource, details, old, hostTags, forRebalance); - _agentMgr.tapLoadingAgents(hostId, TapAgentsAction.Del); + Host host = null; + if (_agentMgr.tapLoadingAgents(hostId, TapAgentsAction.Add)) { + try { + AgentAttache agentattache = _agentMgr.findAttache(hostId); + if (agentattache == null) { + s_logger.debug("Creating agent for host " + hostId); + host = createHostAndAgent(resource, details, old, hostTags, forRebalance); + s_logger.debug("Completed creating agent for host " + hostId); + } else { + s_logger.debug("Agent already created in another thread for host " + hostId + ", ignore this"); + } + } finally { + _agentMgr.tapLoadingAgents(hostId, TapAgentsAction.Del); + } + } else { + s_logger.debug("Agent creation already getting processed in another thread for host " + hostId + ", ignore this"); + } return host; }