diff --git a/server/src/com/cloud/agent/AgentManager.java b/server/src/com/cloud/agent/AgentManager.java index 4211bd566a3..49ed2bb408b 100755 --- a/server/src/com/cloud/agent/AgentManager.java +++ b/server/src/com/cloud/agent/AgentManager.java @@ -230,4 +230,6 @@ public interface AgentManager extends Manager { boolean isHostNativeHAEnabled(long hostId); Answer sendTo(Long dcId, HypervisorType type, Command cmd); + + void notifyAnswersFromAttache(long agentId, long seq, Answer[] answers); } diff --git a/server/src/com/cloud/agent/manager/AgentAttache.java b/server/src/com/cloud/agent/manager/AgentAttache.java index 929b846dfae..28edab4e9c3 100644 --- a/server/src/com/cloud/agent/manager/AgentAttache.java +++ b/server/src/com/cloud/agent/manager/AgentAttache.java @@ -31,6 +31,7 @@ import java.util.concurrent.TimeUnit; import org.apache.log4j.Logger; +import com.cloud.agent.AgentManager; import com.cloud.agent.Listener; import com.cloud.agent.api.Answer; import com.cloud.agent.api.CheckHealthCommand; @@ -98,6 +99,8 @@ public abstract class AgentAttache { protected Status _status = Status.Connecting; protected boolean _maintenance; + protected AgentManager _agentMgr; + public final static String[] s_commandsAllowedInMaintenanceMode = new String[] { MaintainCommand.class.toString(), MigrateCommand.class.toString(), StopCommand.class.toString(), CheckVirtualMachineCommand.class.toString(), PingTestCommand.class.toString(), CheckHealthCommand.class.toString(), ReadyCommand.class.toString(), ShutdownCommand.class.toString() }; protected final static String[] s_commandsNotAllowedInConnectingMode = @@ -108,12 +111,13 @@ public abstract class AgentAttache { } - protected AgentAttache(final long id, boolean maintenance) { + protected AgentAttache(AgentManager agentMgr, final long id, boolean maintenance) { _id = id; _waitForList = new ConcurrentHashMap(); _currentSequence = null; _maintenance = maintenance; _requests = new LinkedList(); + _agentMgr = agentMgr; } public synchronized void setMaintenanceMode(final boolean value) { @@ -263,6 +267,8 @@ public abstract class AgentAttache { if (resp.executeInSequence()) { sendNext(seq); } + + _agentMgr.notifyAnswersFromAttache(_id, seq, answers); return processed; } @@ -384,6 +390,8 @@ public abstract class AgentAttache { new Response(req, answers).log(_id, "Received after timeout: "); // s_logger.debug(log(seq, "Received after timeout: " + new Response(req, answers).toString())); } + + _agentMgr.notifyAnswersFromAttache(_id, seq, answers); return answers; } diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java b/server/src/com/cloud/agent/manager/AgentManagerImpl.java index da4df79991d..a3df90bd532 100755 --- a/server/src/com/cloud/agent/manager/AgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/AgentManagerImpl.java @@ -484,6 +484,12 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, } } } + + public void notifyAnswersFromAttache(long agentId, long seq, Answer[] answers) { + for (Pair listener : _cmdMonitors) { + listener.second().processCommands(agentId, seq, answers); + } + } public AgentAttache findAttache(long hostId) { return _agents.get(hostId); @@ -2656,7 +2662,7 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, protected AgentAttache createAttache(long id, HostVO server, Link link) { s_logger.debug("create ConnectedAgentAttache for " + id); - final AgentAttache attache = new ConnectedAgentAttache(id, link, + final AgentAttache attache = new ConnectedAgentAttache(this, id, link, server.getStatus() == Status.Maintenance || server.getStatus() == Status.ErrorInMaintenance || server.getStatus() == Status.PrepareForMaintenance); @@ -2676,10 +2682,10 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ServerResource resource) { if (resource instanceof DummySecondaryStorageResource || resource instanceof KvmDummyResourceBase) { - return new DummyAttache(id, false); + return new DummyAttache(this, id, false); } s_logger.debug("create DirectAgentAttache for " + id); - final DirectAgentAttache attache = new DirectAgentAttache(id, resource, + final DirectAgentAttache attache = new DirectAgentAttache(this, id, resource, server.getStatus() == Status.Maintenance || server.getStatus() == Status.ErrorInMaintenance || server.getStatus() == Status.PrepareForMaintenance, diff --git a/server/src/com/cloud/agent/manager/ClusteredAgentAttache.java b/server/src/com/cloud/agent/manager/ClusteredAgentAttache.java index 789ea2815d0..57b0eb353d8 100644 --- a/server/src/com/cloud/agent/manager/ClusteredAgentAttache.java +++ b/server/src/com/cloud/agent/manager/ClusteredAgentAttache.java @@ -12,6 +12,7 @@ import java.nio.channels.SocketChannel; import org.apache.log4j.Logger; +import com.cloud.agent.AgentManager; import com.cloud.agent.Listener; import com.cloud.agent.transport.Request; import com.cloud.exception.AgentUnavailableException; @@ -28,13 +29,13 @@ public class ClusteredAgentAttache extends ConnectedAgentAttache implements Rout s_clusteredAgentMgr = agentMgr; } - public ClusteredAgentAttache(long id) { - super(id, null, false); + public ClusteredAgentAttache(AgentManager agentMgr, long id) { + super(agentMgr, id, null, false); _forward = true; } - public ClusteredAgentAttache(long id, Link link, boolean maintenance) { - super(id, link, maintenance); + public ClusteredAgentAttache(AgentManager agentMgr, long id, Link link, boolean maintenance) { + super(agentMgr, id, link, maintenance); _forward = link == null; } diff --git a/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java b/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java index 1187e7559c2..37835112bdb 100644 --- a/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java @@ -186,7 +186,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust protected AgentAttache createAttache(long id) { s_logger.debug("create forwarding ClusteredAgentAttache for " + id); - final AgentAttache attache = new ClusteredAgentAttache(id); + final AgentAttache attache = new ClusteredAgentAttache(this, id); AgentAttache old = null; synchronized(_agents) { old = _agents.get(id); @@ -201,7 +201,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust @Override protected AgentAttache createAttache(long id, HostVO server, Link link) { s_logger.debug("create ClusteredAgentAttache for " + id); - final AgentAttache attache = new ClusteredAgentAttache(id, link, server.getStatus() == Status.Maintenance || server.getStatus() == Status.ErrorInMaintenance || server.getStatus() == Status.PrepareForMaintenance); + final AgentAttache attache = new ClusteredAgentAttache(this, id, link, server.getStatus() == Status.Maintenance || server.getStatus() == Status.ErrorInMaintenance || server.getStatus() == Status.PrepareForMaintenance); link.attach(attache); AgentAttache old = null; synchronized(_agents) { @@ -217,10 +217,10 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust @Override protected AgentAttache createAttache(long id, HostVO server, ServerResource resource) { if (resource instanceof DummySecondaryStorageResource) { - return new DummyAttache(id, false); + return new DummyAttache(this, id, false); } s_logger.debug("create ClusteredDirectAgentAttache for " + id); - final DirectAgentAttache attache = new ClusteredDirectAgentAttache(id, _nodeId, resource, server.getStatus() == Status.Maintenance + final DirectAgentAttache attache = new ClusteredDirectAgentAttache(this, id, _nodeId, resource, server.getStatus() == Status.Maintenance || server.getStatus() == Status.ErrorInMaintenance || server.getStatus() == Status.PrepareForMaintenance, this); AgentAttache old = null; synchronized (_agents) { diff --git a/server/src/com/cloud/agent/manager/ClusteredDirectAgentAttache.java b/server/src/com/cloud/agent/manager/ClusteredDirectAgentAttache.java index 7eb605ef46a..6b8c38f0328 100644 --- a/server/src/com/cloud/agent/manager/ClusteredDirectAgentAttache.java +++ b/server/src/com/cloud/agent/manager/ClusteredDirectAgentAttache.java @@ -17,7 +17,7 @@ */ package com.cloud.agent.manager; -import com.cloud.agent.manager.DirectAgentAttache; +import com.cloud.agent.AgentManager; import com.cloud.agent.transport.Request; import com.cloud.agent.transport.Response; import com.cloud.exception.AgentUnavailableException; @@ -29,8 +29,8 @@ public class ClusteredDirectAgentAttache extends DirectAgentAttache implements R private final ClusteredAgentManagerImpl _mgr; private final long _nodeId; - public ClusteredDirectAgentAttache(long id, long mgmtId, ServerResource resource, boolean maintenance, ClusteredAgentManagerImpl mgr) { - super(id, resource, maintenance, mgr); + public ClusteredDirectAgentAttache(AgentManager agentMgr, long id, long mgmtId, ServerResource resource, boolean maintenance, ClusteredAgentManagerImpl mgr) { + super(agentMgr, id, resource, maintenance, mgr); _mgr = mgr; _nodeId = mgmtId; } diff --git a/server/src/com/cloud/agent/manager/ConnectedAgentAttache.java b/server/src/com/cloud/agent/manager/ConnectedAgentAttache.java index 2c73cbc08e3..2f0716026cf 100644 --- a/server/src/com/cloud/agent/manager/ConnectedAgentAttache.java +++ b/server/src/com/cloud/agent/manager/ConnectedAgentAttache.java @@ -22,6 +22,7 @@ import java.nio.channels.ClosedChannelException; import org.apache.log4j.Logger; +import com.cloud.agent.AgentManager; import com.cloud.agent.transport.Request; import com.cloud.exception.AgentUnavailableException; import com.cloud.host.Status; @@ -35,8 +36,8 @@ public class ConnectedAgentAttache extends AgentAttache { protected Link _link; - public ConnectedAgentAttache(final long id, final Link link, boolean maintenance) { - super(id, maintenance); + public ConnectedAgentAttache(AgentManager agentMgr, final long id, final Link link, boolean maintenance) { + super(agentMgr, id, maintenance); _link = link; } diff --git a/server/src/com/cloud/agent/manager/DirectAgentAttache.java b/server/src/com/cloud/agent/manager/DirectAgentAttache.java index c3c88caa998..2c0e7a9c6c8 100644 --- a/server/src/com/cloud/agent/manager/DirectAgentAttache.java +++ b/server/src/com/cloud/agent/manager/DirectAgentAttache.java @@ -26,6 +26,7 @@ import java.util.concurrent.TimeUnit; import org.apache.log4j.Logger; +import com.cloud.agent.AgentManager; import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; import com.cloud.agent.api.CronCommand; @@ -48,8 +49,8 @@ public class DirectAgentAttache extends AgentAttache { AgentManagerImpl _mgr; long _seq = 0; - public DirectAgentAttache(long id, ServerResource resource, boolean maintenance, AgentManagerImpl mgr) { - super(id, maintenance); + public DirectAgentAttache(AgentManager agentMgr, long id, ServerResource resource, boolean maintenance, AgentManagerImpl mgr) { + super(agentMgr, id, maintenance); _resource = resource; _mgr = mgr; } diff --git a/server/src/com/cloud/agent/manager/DummyAttache.java b/server/src/com/cloud/agent/manager/DummyAttache.java index 0f1dbf1775b..ca4635dc003 100644 --- a/server/src/com/cloud/agent/manager/DummyAttache.java +++ b/server/src/com/cloud/agent/manager/DummyAttache.java @@ -17,6 +17,7 @@ */ package com.cloud.agent.manager; +import com.cloud.agent.AgentManager; import com.cloud.agent.transport.Request; import com.cloud.exception.AgentUnavailableException; import com.cloud.host.Status; @@ -24,8 +25,8 @@ import com.cloud.host.Status; public class DummyAttache extends AgentAttache { - public DummyAttache(long id, boolean maintenance) { - super(id, maintenance); + public DummyAttache(AgentManager agentMgr, long id, boolean maintenance) { + super(agentMgr, id, maintenance); } diff --git a/server/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java b/server/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java index 6414bedd508..dfb5432e53d 100644 --- a/server/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java +++ b/server/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java @@ -216,11 +216,9 @@ public class SecondaryStorageVmDaoImpl extends GenericDaoBase