From d0c68cd4a797c5e7afac4afa4d1d948aa89ec2ad Mon Sep 17 00:00:00 2001 From: edison Date: Fri, 29 Oct 2010 19:16:59 -0700 Subject: [PATCH] add a timeout (5 minutes) to wait for KVM agent host connecting to mgt svr, during adding host->discover --- .../cloud/agent/resource/DummyResource.java | 9 ---- .../xen/resource/CitrixResourceBase.java | 12 ----- .../com/cloud/resource/ServerResource.java | 4 -- .../cloud/resource/ServerResourceBase.java | 9 ---- .../cloud/agent/manager/AgentManagerImpl.java | 22 +++++--- .../agent/manager/DirectAgentAttache.java | 6 +-- .../kvm/discoverer/KvmServerDiscoverer.java | 54 ++++++++++--------- 7 files changed, 46 insertions(+), 70 deletions(-) diff --git a/agent/src/com/cloud/agent/resource/DummyResource.java b/agent/src/com/cloud/agent/resource/DummyResource.java index 9ff60e1220d..c269c64284d 100755 --- a/agent/src/com/cloud/agent/resource/DummyResource.java +++ b/agent/src/com/cloud/agent/resource/DummyResource.java @@ -32,7 +32,6 @@ import com.cloud.resource.ServerResource; @Local(value={ServerResource.class}) public class DummyResource implements ServerResource { - private boolean _isRemoteAgent = false; String _name; Host.Type _type; boolean _negative; @@ -102,12 +101,4 @@ public class DummyResource implements ServerResource { public void setAgentControl(IAgentControl agentControl) { _agentControl = agentControl; } - - public boolean IsRemoteAgent() { - return _isRemoteAgent; - } - - public void setRemoteAgent(boolean remote) { - _isRemoteAgent = remote; - } } diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index f6c236f707a..7a40bbf7f75 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -232,7 +232,6 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR protected String _guestNetworkName; protected int _wait; protected IAgentControl _agentControl; - protected boolean _isRemoteAgent = false; int _userVMCap = 0; final int _maxWeight = 256; @@ -6044,17 +6043,6 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR public void setAgentControl(IAgentControl agentControl) { _agentControl = agentControl; } - - @Override - public boolean IsRemoteAgent() { - return _isRemoteAgent; - } - - @Override - public void setRemoteAgent(boolean remote) { - _isRemoteAgent = remote; - } - protected Answer execute(PoolEjectCommand cmd) { Connection conn = getConnection(); diff --git a/core/src/com/cloud/resource/ServerResource.java b/core/src/com/cloud/resource/ServerResource.java index 75a37155361..b056a478016 100755 --- a/core/src/com/cloud/resource/ServerResource.java +++ b/core/src/com/cloud/resource/ServerResource.java @@ -71,8 +71,4 @@ public interface ServerResource extends Manager { public IAgentControl getAgentControl(); public void setAgentControl(IAgentControl agentControl); - - public boolean IsRemoteAgent(); - - public void setRemoteAgent(boolean remote); } diff --git a/core/src/com/cloud/resource/ServerResourceBase.java b/core/src/com/cloud/resource/ServerResourceBase.java index a60849c0772..c10da164984 100755 --- a/core/src/com/cloud/resource/ServerResourceBase.java +++ b/core/src/com/cloud/resource/ServerResourceBase.java @@ -48,7 +48,6 @@ public abstract class ServerResourceBase implements ServerResource { protected NetworkInterface _storageNic; protected NetworkInterface _storageNic2; protected IAgentControl _agentControl; - protected boolean _isRemoteAgent = false; @Override public String getName() { @@ -302,12 +301,4 @@ public abstract class ServerResourceBase implements ServerResource { public boolean stop() { return true; } - - public boolean IsRemoteAgent() { - return _isRemoteAgent; - } - - public void setRemoteAgent(boolean remote) { - _isRemoteAgent = remote; - } } diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java b/server/src/com/cloud/agent/manager/AgentManagerImpl.java index 3d6f8aead57..8da2a76f60b 100755 --- a/server/src/com/cloud/agent/manager/AgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/AgentManagerImpl.java @@ -496,11 +496,9 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory { long id = server.getId(); AgentAttache attache = createAttache(id, server, resource); - if (!resource.IsRemoteAgent()) - attache = notifyMonitorsOfConnection(attache, startup); - else { - _hostDao.updateStatus(server, Event.AgentConnected, _nodeId); - } + + attache = notifyMonitorsOfConnection(attache, startup); + return attache; } @@ -609,7 +607,19 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory { if (resources != null) { for (Map.Entry> entry : resources.entrySet()) { ServerResource resource = entry.getKey(); - + /*For KVM, if we go to here, that means kvm agent is already connected to mgt svr.*/ + if (resource instanceof KvmDummyResourceBase) { + Map details = entry.getValue(); + String guid = details.get("guid"); + List kvmHosts = _hostDao.listBy(Host.Type.Routing, clusterId, podId, dcId); + for (HostVO host: kvmHosts) { + if (host.getGuid() == guid) { + hosts.add(host); + return hosts; + } + } + return null; + } AgentAttache attache = simulateStart(resource, entry.getValue(), true); if (attache != null) { hosts.add(_hostDao.findById(attache.getId())); diff --git a/server/src/com/cloud/agent/manager/DirectAgentAttache.java b/server/src/com/cloud/agent/manager/DirectAgentAttache.java index cb7fcfbc147..77852190553 100644 --- a/server/src/com/cloud/agent/manager/DirectAgentAttache.java +++ b/server/src/com/cloud/agent/manager/DirectAgentAttache.java @@ -125,11 +125,7 @@ public class DirectAgentAttache extends AgentAttache { try { ServerResource resource = _resource; - if (resource != null) { - if (resource.IsRemoteAgent()) { - return; - } - + if (resource != null) { PingCommand cmd = resource.getCurrentStatus(_id); if (cmd == null) { s_logger.warn("Unable to get current status on " + _id); diff --git a/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java b/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java index 8fb84b3d3e5..fec0835f65a 100644 --- a/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java +++ b/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java @@ -24,6 +24,7 @@ import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.ClusterVO; import com.cloud.dc.dao.ClusterDao; import com.cloud.exception.DiscoveryException; +import com.cloud.host.Host; import com.cloud.host.HostVO; import com.cloud.host.Status; import com.cloud.host.Status.Event; @@ -47,7 +48,7 @@ public class KvmServerDiscoverer extends DiscovererBase implements Discoverer, private String _setupAgentPath; private ConfigurationDao _configDao; private String _hostIp; - private int _waitTime = 3; /*wait for 3 minutes*/ + private int _waitTime = 5; /*wait for 5 minutes*/ @Inject HostDao _hostDao = null; @Inject ClusterDao _clusterDao; @@ -218,15 +219,20 @@ public class KvmServerDiscoverer extends DiscovererBase implements Discoverer, KvmDummyResourceBase kvmResource = new KvmDummyResourceBase(); Map params = new HashMap(); + guid = guid + "-LibvirtComputingResource";/*tail added by agent.java*/ params.put("zone", Long.toString(dcId)); params.put("pod", Long.toString(podId)); params.put("cluster", Long.toString(clusterId)); - params.put("guid", guid + "-LibvirtComputingResource"); /*tail added by agent.java*/ + params.put("guid", guid); params.put("agentIp", agentIp); kvmResource.configure("kvm agent", params); - kvmResource.setRemoteAgent(true); resources.put(kvmResource, details); + HostVO connectedHost = waitForHostConnect(dcId, podId, clusterId, guid); + if (connectedHost == null) + return null; + + details.put("guid", guid); /*set cluster hypervisor type to xenserver*/ ClusterVO clu = _clusterDao.findById(clusterId); clu.setHypervisorType(HypervisorType.KVM.toString()); @@ -243,31 +249,22 @@ public class KvmServerDiscoverer extends DiscovererBase implements Discoverer, return null; } - @Override - public void postDiscovery(List hosts, long msId) throws DiscoveryException { - /*Wait for agent coming back*/ - if (hosts.isEmpty()) { - return; - } - HostVO host = hosts.get(0); - for (int i = 0 ; i < _waitTime; i++) { - - if (host.getStatus() != Status.Up) { - s_logger.debug("Wait host comes back, try: " + i); - try { - Thread.sleep(60000); - } catch (InterruptedException e) { - s_logger.debug("Failed to sleep: " + e.toString()); + private HostVO waitForHostConnect(long dcId, long podId, long clusterId, String guid) { + for (int i = 0; i < _waitTime; i++) { + List hosts = _hostDao.listBy(Host.Type.Routing, clusterId, podId, dcId); + for (HostVO host : hosts) { + if (host.getGuid() == guid) { + return host; } - } else { - return; + } + try { + Thread.sleep(60000); + } catch (InterruptedException e) { + s_logger.debug("Failed to sleep: " + e.toString()); } } - - - _hostDao.updateStatus(host, Event.AgentDisconnected, msId); - /*Timeout, throw warning msg to user*/ - throw new DiscoveryException("Host " + host.getId() + ":" + host.getPrivateIpAddress() + " does not come back, It may connect to server later, if not, please check the agent log on this host"); + s_logger.debug("Timeout, to wait for the host connecting to mgt svr, assuming it is failed"); + return null; } @Override @@ -289,4 +286,11 @@ public class KvmServerDiscoverer extends DiscovererBase implements Discoverer, protected String getPatchPath() { return "scripts/vm/hypervisor/kvm/"; } + + @Override + public void postDiscovery(List hosts, long msId) + throws DiscoveryException { + // TODO Auto-generated method stub + + } }