modules/enterprise/server/plugins/cloud/src/main/java/org/rhq/enterprise/server/plugins/cloud/CloudServerPluginComponent.java | 77 +++++++++- 1 file changed, 74 insertions(+), 3 deletions(-)
New commits: commit 0f4f8c7dd916f688c5018c9deea961bbb85638f8 Author: John Sanda jsanda@redhat.com Date: Sun Sep 26 13:46:39 2010 -0400
Adding logic to purge stale servers from the sync list
If a server has been taken down and removed from the system, then we need to remove it from the list of servers we look at to see if their addresses need to be synced.
Adding a bunch of debug logging.
diff --git a/modules/enterprise/server/plugins/cloud/src/main/java/org/rhq/enterprise/server/plugins/cloud/CloudServerPluginComponent.java b/modules/enterprise/server/plugins/cloud/src/main/java/org/rhq/enterprise/server/plugins/cloud/CloudServerPluginComponent.java index 796f035..88eb3ba 100644 --- a/modules/enterprise/server/plugins/cloud/src/main/java/org/rhq/enterprise/server/plugins/cloud/CloudServerPluginComponent.java +++ b/modules/enterprise/server/plugins/cloud/src/main/java/org/rhq/enterprise/server/plugins/cloud/CloudServerPluginComponent.java @@ -1,12 +1,18 @@ package org.rhq.enterprise.server.plugins.cloud;
import java.io.Serializable; +import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set;
import javax.persistence.EntityManager;
+import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import org.rhq.core.domain.cloud.Server; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.configuration.PropertySimple; @@ -16,6 +22,7 @@ import org.rhq.core.domain.resource.Resource; import org.rhq.enterprise.server.auth.SubjectManagerLocal; import org.rhq.enterprise.server.cloud.CloudManagerLocal; import org.rhq.enterprise.server.operation.OperationManagerLocal; +import org.rhq.enterprise.server.operation.ResourceOperationSchedule; import org.rhq.enterprise.server.plugin.pc.ControlFacet; import org.rhq.enterprise.server.plugin.pc.ControlResults; import org.rhq.enterprise.server.plugin.pc.ScheduledJobInvocationContext; @@ -25,6 +32,8 @@ import org.rhq.enterprise.server.util.LookupUtil;
public class CloudServerPluginComponent implements ServerPluginComponent, ControlFacet {
+ private static Log log = LogFactory.getLog(CloudServerPluginComponent.class); + public void initialize(ServerPluginContext context) throws Exception { }
@@ -42,9 +51,21 @@ public class CloudServerPluginComponent implements ServerPluginComponent, Contro String serverName = parameters.getSimpleValue("name", null); String serverAddr = parameters.getSimpleValue("address", null);
+ if (log.isDebugEnabled()) { + log.debug("Invoked syncServerEndpoint with [name: " + serverName + ", address: " + serverAddr + "]"); + } + + ControlResults results = new ControlResults(); + CloudManagerLocal cloudMgr = LookupUtil.getCloudManager(); Server server = cloudMgr.getServerByName(serverName);
+ if (server == null) { + log.warn("Failed to locate server. No address sync will be performed."); + results.setError("No update performed. Failed to find server " + server.getName()); + return results; + } + if (serverAddr != null) { SubjectManagerLocal subjectMgr = LookupUtil.getSubjectManager();
@@ -54,10 +75,13 @@ public class CloudServerPluginComponent implements ServerPluginComponent, Contro
int updateCount = notifyAgents(server);
- ControlResults results = new ControlResults(); Configuration complexResults = results.getComplexResults(); complexResults.put(new PropertySimple("results", updateCount + " agents have been updated."));
+ if (log.isDebugEnabled()) { + log.debug("Notified " + updateCount + " agents of the address change."); + } + return results; }
@@ -65,19 +89,57 @@ public class CloudServerPluginComponent implements ServerPluginComponent, Contro }
public void syncServerEndpoints(ScheduledJobInvocationContext context) { + log.debug("Preparing to sync server endpoints."); + CloudManagerLocal cloudMgr = LookupUtil.getCloudManager(); List<Server> servers = cloudMgr.getAllServers();
+ purgeStaleServers(context, servers); + for (Server server : servers) { if (!context.containsKey("server:" + server.getName())) { + log.debug("Adding server [" + server.getName() + "] to sync list."); context.put("server:" + server.getName(), server.getAddress()); } else if (addressChanged(context, server)) { + if (log.isDebugEnabled()) { + log.debug("Detected address change for " + server); + log.debug("Old address was " + context.get("server:" + server.getName() + ", new address is " + + server.getAddress())); + } context.put("server:" + server.getName(), server.getAddress()); notifyAgents(server); } } }
+ private void purgeStaleServers(ScheduledJobInvocationContext context, List<Server> servers) { + List<String> purgeList = new ArrayList<String>(); + + Set<String> serverNames = new HashSet<String>(); + for (Server server : servers) { + serverNames.add(server.getName()); + } + + for (String key : context.getJobData().keySet()) { + if (key.startsWith("server:")) { + String serverName = parseServerName(key); + if (!serverNames.contains(serverName)) { + log.debug("Detected a stale server: " + serverName); + log.debug(serverName + " will be removed from the sync list."); + purgeList.add(key); + } + } + } + + for (String staleServer : purgeList) { + context.remove(staleServer); + } + } + + private String parseServerName(String key) { + return key.substring("server:".length()); + } + private boolean addressChanged(ScheduledJobInvocationContext context, Server server) { String lastKnownAddr = context.get("server:" + server.getName()); return !server.getAddress().endsWith(lastKnownAddr); @@ -100,6 +162,10 @@ public class CloudServerPluginComponent implements ServerPluginComponent, Contro .setParameter("server", server) .getResultList();
+ if (log.isDebugEnabled()) { + log.debug("Found " + agents.size() + " to be updated with new server endpoint for " + server); + } + int numUpdated = 0; for (Resource agent : agents) { updateAgent(agent, server); @@ -116,7 +182,12 @@ public class CloudServerPluginComponent implements ServerPluginComponent, Contro Configuration params = new Configuration(); params.put(new PropertySimple("server", server.getAddress()));
- operationMgr.scheduleResourceOperation(subjectMgr.getOverlord(), agent.getId(), "switchToServer", 0, 0, 0, 0, - params, "Server endpoint has changed. Sending new address to agent."); + ResourceOperationSchedule schedule = operationMgr.scheduleResourceOperation(subjectMgr.getOverlord(), + agent.getId(), "switchToServer", 0, 0, 0, 0, params, "Cloud Plugin: syncing server endpoint address"); + + if (log.isDebugEnabled()) { + log.debug("Schedule address sync for agent [name: " + agent.getName() + "]."); + log.debug("Operation schedule is " + schedule); + } } }
rhq-commits@lists.fedorahosted.org