Author: pferraro
Date: 2008-10-22 00:35:12 -0400 (Wed, 22 Oct 2008)
New Revision: 1977
Modified:
trunk/mod_cluster/src/main/java/org/jboss/modcluster/ClusterListener.java
trunk/mod_cluster/src/main/java/org/jboss/modcluster/ModClusterService.java
trunk/mod_cluster/src/main/java/org/jboss/modcluster/Utils.java
trunk/mod_cluster/src/main/java/org/jboss/modcluster/ha/HASingletonAwareResetRequestSource.java
trunk/mod_cluster/src/main/java/org/jboss/modcluster/ha/HASingletonAwareResetRequestSourceImpl.java
trunk/mod_cluster/src/main/java/org/jboss/modcluster/ha/rpc/ResetRequestSourceRpcHandler.java
trunk/mod_cluster/src/main/java/org/jboss/modcluster/mcmp/MCMPUtils.java
trunk/mod_cluster/src/main/java/org/jboss/modcluster/mcmp/ResetRequestSource.java
trunk/mod_cluster/src/main/java/org/jboss/modcluster/mcmp/impl/DefaultMCMPHandler.java
trunk/mod_cluster/src/test/java/org/jboss/modcluster/ClusterListenerTestCase.java
trunk/mod_cluster/src/test/java/org/jboss/modcluster/ha/HASingletonAwareResetRequestSourceTestCase.java
Log:
Refactor ResetRequestSource again to include Aliases parsed from INFO-RSP.
Modified: trunk/mod_cluster/src/main/java/org/jboss/modcluster/ClusterListener.java
===================================================================
--- trunk/mod_cluster/src/main/java/org/jboss/modcluster/ClusterListener.java 2008-10-22
02:21:19 UTC (rev 1976)
+++ trunk/mod_cluster/src/main/java/org/jboss/modcluster/ClusterListener.java 2008-10-22
04:35:12 UTC (rev 1977)
@@ -93,7 +93,7 @@
/**
* Reset configuration for a particular proxy following an error.
*/
- public List<MCMPRequest> getResetRequests(Map<String, Map<String,
Status>> response)
+ public List<MCMPRequest> getResetRequests(Map<String,
ResetRequestSource.EngineStatus> response)
{
return MCMPUtils.getResetRequests(response, ServerFactory.getServer(), this,
this);
}
Modified: trunk/mod_cluster/src/main/java/org/jboss/modcluster/ModClusterService.java
===================================================================
--- trunk/mod_cluster/src/main/java/org/jboss/modcluster/ModClusterService.java 2008-10-22
02:21:19 UTC (rev 1976)
+++ trunk/mod_cluster/src/main/java/org/jboss/modcluster/ModClusterService.java 2008-10-22
04:35:12 UTC (rev 1977)
@@ -74,7 +74,7 @@
import org.jboss.modcluster.mcmp.MCMPServer;
import org.jboss.modcluster.mcmp.MCMPServerState;
import org.jboss.modcluster.mcmp.MCMPUtils;
-import org.jboss.modcluster.mcmp.ResetRequestSource.Status;
+import org.jboss.modcluster.mcmp.ResetRequestSource;
import org.jboss.modcluster.mcmp.impl.DefaultMCMPHandler;
/**
@@ -523,7 +523,7 @@
boolean needReset = this.coord.clusteredHandler.getNeedsResetTransmission();
- Map<String, Map<String, Status>> map = Collections.emptyMap();
+ Map<String, ResetRequestSource.EngineStatus> map =
Collections.emptyMap();
List<MCMPRequest> resetRequests = needReset ?
this.coord.resetRequestSource.getLocalResetRequests(map) : null;
ClusterNode node = ModClusterService.this.getHAPartition().getClusterNode();
@@ -662,7 +662,7 @@
/**
* @see
org.jboss.modcluster.ha.rpc.ResetRequestSourceRpcHandler#getResetRequests()
*/
- public GroupRpcResponse getResetRequests(Map<String, Map<String,
Status>> response)
+ public GroupRpcResponse getResetRequests(Map<String,
ResetRequestSource.EngineStatus> response)
{
ClusterNode node = ModClusterService.this.getHAPartition().getClusterNode();
List<MCMPRequest> requests =
this.coord.resetRequestSource.getLocalResetRequests(response);
Modified: trunk/mod_cluster/src/main/java/org/jboss/modcluster/Utils.java
===================================================================
--- trunk/mod_cluster/src/main/java/org/jboss/modcluster/Utils.java 2008-10-22 02:21:19
UTC (rev 1976)
+++ trunk/mod_cluster/src/main/java/org/jboss/modcluster/Utils.java 2008-10-22 04:35:12
UTC (rev 1977)
@@ -3,6 +3,10 @@
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.InetAddress;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.Set;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
@@ -112,18 +116,21 @@
* @param context
* @return
*/
- public static String getHost(Context context)
+ public static Set<String> getHosts(Context context)
{
- StringBuilder result = new StringBuilder();
Host host = (Host) context.getParent();
- result.append(host.getName());
+ String name = host.getName();
String[] aliases = host.findAliases();
- for (String alias: aliases)
+
+ if (aliases.length == 0)
{
- result.append(',');
- result.append(alias);
+ return Collections.singleton(name);
}
- return result.toString();
+
+ Set<String> hosts = new LinkedHashSet<String>();
+ hosts.add(name);
+ hosts.addAll(Arrays.asList(aliases));
+ return hosts;
}
/**
Modified:
trunk/mod_cluster/src/main/java/org/jboss/modcluster/ha/HASingletonAwareResetRequestSource.java
===================================================================
---
trunk/mod_cluster/src/main/java/org/jboss/modcluster/ha/HASingletonAwareResetRequestSource.java 2008-10-22
02:21:19 UTC (rev 1976)
+++
trunk/mod_cluster/src/main/java/org/jboss/modcluster/ha/HASingletonAwareResetRequestSource.java 2008-10-22
04:35:12 UTC (rev 1977)
@@ -34,7 +34,7 @@
*/
public interface HASingletonAwareResetRequestSource extends ResetRequestSource
{
- List<MCMPRequest> getLocalResetRequests(Map<String, Map<String,
Status>> response);
+ List<MCMPRequest> getLocalResetRequests(Map<String,
ResetRequestSource.EngineStatus> response);
void setJbossWebServer(Server jbossWebServer);
}
\ No newline at end of file
Modified:
trunk/mod_cluster/src/main/java/org/jboss/modcluster/ha/HASingletonAwareResetRequestSourceImpl.java
===================================================================
---
trunk/mod_cluster/src/main/java/org/jboss/modcluster/ha/HASingletonAwareResetRequestSourceImpl.java 2008-10-22
02:21:19 UTC (rev 1976)
+++
trunk/mod_cluster/src/main/java/org/jboss/modcluster/ha/HASingletonAwareResetRequestSourceImpl.java 2008-10-22
04:35:12 UTC (rev 1977)
@@ -77,7 +77,7 @@
this.rpcStub = new RpcStub(serviceKeyProvider);
}
- public List<MCMPRequest> getResetRequests(Map<String, Map<String,
Status>> response)
+ public List<MCMPRequest> getResetRequests(Map<String,
ResetRequestSource.EngineStatus> response)
{
if (this.singleton.isMasterNode())
{
@@ -93,7 +93,7 @@
* @{inheritDoc}
* @see
org.jboss.modcluster.ha.HASingletonAwareResetRequestSource#getLocalResetRequests()
*/
- public List<MCMPRequest> getLocalResetRequests(Map<String, Map<String,
Status>> response)
+ public List<MCMPRequest> getLocalResetRequests(Map<String,
ResetRequestSource.EngineStatus> response)
{
if (this.jbossWebServer == null)
{
@@ -112,7 +112,7 @@
this.jbossWebServer = jbossWebServer;
}
- private void addRemoteRequests(List<MCMPRequest> resets, Map<String,
Map<String, Status>> resp)
+ private void addRemoteRequests(List<MCMPRequest> resets, Map<String,
ResetRequestSource.EngineStatus> resp)
{
List<?> responses = this.rpcStub.getResetRequests(resp);
@@ -152,7 +152,7 @@
/**
* @see
org.jboss.modcluster.ha.rpc.ResetRequestSourceRpcHandler#getResetRequests()
*/
- public List<?> getResetRequests(Map<String, Map<String, Status>>
response)
+ public List<?> getResetRequests(Map<String,
ResetRequestSource.EngineStatus> response)
{
try
{
Modified:
trunk/mod_cluster/src/main/java/org/jboss/modcluster/ha/rpc/ResetRequestSourceRpcHandler.java
===================================================================
---
trunk/mod_cluster/src/main/java/org/jboss/modcluster/ha/rpc/ResetRequestSourceRpcHandler.java 2008-10-22
02:21:19 UTC (rev 1976)
+++
trunk/mod_cluster/src/main/java/org/jboss/modcluster/ha/rpc/ResetRequestSourceRpcHandler.java 2008-10-22
04:35:12 UTC (rev 1977)
@@ -23,7 +23,7 @@
import java.util.Map;
-import org.jboss.modcluster.mcmp.ResetRequestSource.Status;
+import org.jboss.modcluster.mcmp.ResetRequestSource;
/**
@@ -32,5 +32,5 @@
*/
public interface ResetRequestSourceRpcHandler<T>
{
- T getResetRequests(Map<String, Map<String, Status>> response);
+ T getResetRequests(Map<String, ResetRequestSource.EngineStatus> response);
}
Modified: trunk/mod_cluster/src/main/java/org/jboss/modcluster/mcmp/MCMPUtils.java
===================================================================
--- trunk/mod_cluster/src/main/java/org/jboss/modcluster/mcmp/MCMPUtils.java 2008-10-22
02:21:19 UTC (rev 1976)
+++ trunk/mod_cluster/src/main/java/org/jboss/modcluster/mcmp/MCMPUtils.java 2008-10-22
04:35:12 UTC (rev 1977)
@@ -28,6 +28,7 @@
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -199,16 +200,27 @@
private static MCMPRequest createRequest(MCMPRequestType type, Context context)
{
- return createContextRequest(type, Utils.getJvmRoute(context),
Utils.getHost(context), context.getPath());
+ return createContextRequest(type, Utils.getJvmRoute(context),
Utils.getHosts(context), context.getPath());
}
- private static MCMPRequest createContextRequest(MCMPRequestType type, String jvmRoute,
String host, String path)
+ private static MCMPRequest createContextRequest(MCMPRequestType type, String jvmRoute,
Set<String> hosts, String path)
{
Map<String, String> parameters = new HashMap<String, String>();
parameters.put("Context", "".equals(path) ? "/" :
path);
- parameters.put("Alias", host);
+ StringBuilder builder = new StringBuilder();
+ Iterator<String> iter = hosts.iterator();
+ while (iter.hasNext())
+ {
+ builder.append(iter.next());
+ if (iter.hasNext())
+ {
+ builder.append(',');
+ }
+ }
+ parameters.put("Alias", builder.toString());
+
return new MCMPRequest(type, false, jvmRoute, parameters);
}
@@ -250,7 +262,7 @@
/**
* Reset configuration for a particular proxy following an error.
*/
- public static List<MCMPRequest> getResetRequests(Map<String, Map<String,
ResetRequestSource.Status>> response, Server server, NodeConfiguration nodeConfig,
BalancerConfiguration balancerConfig)
+ public static List<MCMPRequest> getResetRequests(Map<String,
ResetRequestSource.EngineStatus> response, Server server, NodeConfiguration nodeConfig,
BalancerConfiguration balancerConfig)
{
List<MCMPRequest> requests = new ArrayList<MCMPRequest>();
Set<String> jvmRoutes = new HashSet<String>(response.keySet());
@@ -258,20 +270,18 @@
for (Service service: server.findServices())
{
Engine engine = (Engine) service.getContainer();
-
String jvmRoute = engine.getJvmRoute();
jvmRoutes.remove(jvmRoute);
requests.add(createConfigRequest(jvmRoute, service.findConnectors(), nodeConfig,
balancerConfig));
- Map<String, ResetRequestSource.Status> contextStatusMap =
response.get(jvmRoute);
-
+ ResetRequestSource.EngineStatus engineStatus = response.get(jvmRoute);
Set<String> contexts = new HashSet<String>();
- if (contextStatusMap != null)
+ if (engineStatus != null)
{
- contexts.addAll(contextStatusMap.keySet());
+ contexts.addAll(engineStatus.getContexts().keySet());
}
for (Container child: engine.findChildren())
@@ -279,34 +289,38 @@
for (Container container: child.findChildren())
{
Context context = (Context) container;
-
String path = context.getPath();
contexts.remove(path);
- ResetRequestSource.Status status = (contextStatusMap != null) ?
contextStatusMap.get(path) : null;
+ ResetRequestSource.Status status = (engineStatus != null) ?
engineStatus.getContexts().get(path) : null;
if (Utils.isContextStarted(context))
{
if (status != ResetRequestSource.Status.ENABLED)
{
- requests.add(createEnableAppRequest(context));
+ requests.add(createContextRequest(MCMPRequestType.ENABLE_APP,
jvmRoute, Utils.getHosts(context), path));
}
}
else
{
if (status == ResetRequestSource.Status.ENABLED)
{
- requests.add(createStopAppRequest(context));
+ requests.add(createContextRequest(MCMPRequestType.STOP_APP,
jvmRoute, Utils.getHosts(context), path));
}
}
}
}
// Send REMOVE-APP requests for contexts that don't exist
- for (String context: contexts)
+ if (engineStatus != null)
{
- requests.add(createContextRequest(MCMPRequestType.REMOVE_APP, jvmRoute,
"", context));
+ Set<String> aliases = engineStatus.getAliases();
+
+ for (String context: contexts)
+ {
+ requests.add(createContextRequest(MCMPRequestType.REMOVE_APP, jvmRoute,
aliases, context));
+ }
}
}
Modified:
trunk/mod_cluster/src/main/java/org/jboss/modcluster/mcmp/ResetRequestSource.java
===================================================================
---
trunk/mod_cluster/src/main/java/org/jboss/modcluster/mcmp/ResetRequestSource.java 2008-10-22
02:21:19 UTC (rev 1976)
+++
trunk/mod_cluster/src/main/java/org/jboss/modcluster/mcmp/ResetRequestSource.java 2008-10-22
04:35:12 UTC (rev 1977)
@@ -24,6 +24,7 @@
import java.util.List;
import java.util.Map;
+import java.util.Set;
/**
* Source for a list of requests that should be sent to an httpd-side
@@ -40,6 +41,12 @@
ENABLED, DISABLED, STOPPED
}
+ interface EngineStatus
+ {
+ Set<String> getAliases();
+ Map<String, Status> getContexts();
+ }
+
/**
* Gets a list of requests that should be sent to an httpd-side
* mod_cluster instance when an {@link MCMPHandler} determines that
@@ -48,5 +55,5 @@
* @param response a parsed INFO-RSP, expressed as the context status per context
path, per jvmRoute
* @return a list of requests. Will not return <code>null</code>.
*/
- List<MCMPRequest> getResetRequests(Map<String, Map<String, Status>>
response);
+ List<MCMPRequest> getResetRequests(Map<String, EngineStatus> response);
}
Modified:
trunk/mod_cluster/src/main/java/org/jboss/modcluster/mcmp/impl/DefaultMCMPHandler.java
===================================================================
---
trunk/mod_cluster/src/main/java/org/jboss/modcluster/mcmp/impl/DefaultMCMPHandler.java 2008-10-22
02:21:19 UTC (rev 1976)
+++
trunk/mod_cluster/src/main/java/org/jboss/modcluster/mcmp/impl/DefaultMCMPHandler.java 2008-10-22
04:35:12 UTC (rev 1977)
@@ -63,7 +63,6 @@
import org.jboss.modcluster.mcmp.MCMPURLEncoder;
import org.jboss.modcluster.mcmp.MCMPUtils;
import org.jboss.modcluster.mcmp.ResetRequestSource;
-import org.jboss.modcluster.mcmp.MCMPServerState.State;
/**
* Default implementation of {@link MCMPHandler}.
@@ -289,7 +288,7 @@
{
for (Proxy proxy: this.proxies)
{
- if (proxy.getState() == State.OK)
+ if (proxy.getState() == MCMPServerState.State.OK)
{
proxy.setState(Proxy.State.ERROR);
}
@@ -458,9 +457,9 @@
if (sendResetRequests)
{
- Map<String, Map<String, ResetRequestSource.Status>>
responseMap = this.parseInfoResponse(response);
+ Map<String, ResetRequestSource.EngineStatus> parsedResponse =
this.parseInfoResponse(response);
-
this.sendRequests(this.resetRequestSource.getResetRequests(responseMap));
+
this.sendRequests(this.resetRequestSource.getResetRequests(parsedResponse));
}
}
}
@@ -472,12 +471,12 @@
}
}
- private Map<String, Map<String, ResetRequestSource.Status>>
parseInfoResponse(String response)
+ private Map<String, ResetRequestSource.EngineStatus> parseInfoResponse(String
response)
{
if (response == null) return Collections.emptyMap();
- Map<String, Map<String, ResetRequestSource.Status>> result = new
HashMap<String, Map<String, ResetRequestSource.Status>>();
- Map<String, ResetRequestSource.Status> contextMap = null;
+ Map<String, ResetRequestSource.EngineStatus> result = new HashMap<String,
ResetRequestSource.EngineStatus>();
+ ResetRequestSource.EngineStatus engineStatus = null;
for (String line: response.split("\r\n|\r|\n"))
{
@@ -496,16 +495,39 @@
if ("Name".equals(key))
{
- contextMap = new HashMap<String,
ResetRequestSource.Status>();
- result.put(entry.substring(index + 1).trim(), contextMap);
+ engineStatus = new EngineStatusImpl();
+ result.put(entry.substring(index + 1).trim(), engineStatus);
break;
}
}
}
}
+ else if (line.startsWith("Vhost:"))
+ {
+ if (engineStatus == null) throw new IllegalStateException();
+
+ String[] entries = line.split(",");
+
+ for (int i = 1; i < entries.length; ++i)
+ {
+ String entry = entries[i];
+ int index = entry.indexOf(':');
+
+ if (index >= 0)
+ {
+ String key = entry.substring(0, index).trim();
+
+ if ("Alias".equals(key))
+ {
+ engineStatus.getAliases().add(entry.substring(index + 1).trim());
+ break;
+ }
+ }
+ }
+ }
else if (line.startsWith("Context:"))
{
- if (contextMap == null) throw new IllegalStateException();
+ if (engineStatus == null) throw new IllegalStateException();
String[] entries = line.split(",");
String context = null;
@@ -532,7 +554,7 @@
}
}
- contextMap.put(context, status);
+ engineStatus.getContexts().put(context, status);
}
}
@@ -1134,4 +1156,28 @@
return sb.toString();
}
}
+
+ class EngineStatusImpl implements ResetRequestSource.EngineStatus
+ {
+ private Set<String> aliases = new LinkedHashSet<String>();
+ private Map<String, ResetRequestSource.Status> contexts = new
HashMap<String, ResetRequestSource.Status>();
+
+ /**
+ * @{inheritDoc}
+ * @see org.jboss.modcluster.mcmp.ResetRequestSource.EngineStatus#getAliases()
+ */
+ public Set<String> getAliases()
+ {
+ return this.aliases;
+ }
+
+ /**
+ * @{inheritDoc}
+ * @see org.jboss.modcluster.mcmp.ResetRequestSource.EngineStatus#getContexts()
+ */
+ public Map<String, ResetRequestSource.Status> getContexts()
+ {
+ return this.contexts;
+ }
+ }
}
Modified:
trunk/mod_cluster/src/test/java/org/jboss/modcluster/ClusterListenerTestCase.java
===================================================================
---
trunk/mod_cluster/src/test/java/org/jboss/modcluster/ClusterListenerTestCase.java 2008-10-22
02:21:19 UTC (rev 1976)
+++
trunk/mod_cluster/src/test/java/org/jboss/modcluster/ClusterListenerTestCase.java 2008-10-22
04:35:12 UTC (rev 1977)
@@ -95,43 +95,30 @@
EasyMock.expect(server.findServices()).andReturn(new Service[] { service });
EasyMock.expect(service.getContainer()).andReturn(engine);
-
- // create remove-all request
EasyMock.expect(engine.getJvmRoute()).andReturn("host1");
-
- // create config request
- EasyMock.expect(engine.getService()).andReturn(service);
EasyMock.expect(service.findConnectors()).andReturn(new Connector[] { connector
});
- EasyMock.expect(engine.getJvmRoute()).andReturn("host1");
EasyMock.expect(engine.findChildren()).andReturn(new Container[] { container });
EasyMock.expect(container.findChildren()).andReturn(new Container[] { context });
- EasyMock.expect(context.isStarted()).andReturn(true);
-
- // create enable-app request
EasyMock.expect(context.getPath()).andReturn("/context");
+ EasyMock.expect(context.isStarted()).andReturn(true);
EasyMock.expect(context.getParent()).andReturn(host);
EasyMock.expect(host.getName()).andReturn("host");
EasyMock.expect(host.findAliases()).andReturn(new String[] { "alias1",
"alias2" });
- EasyMock.expect(context.getParent()).andReturn(container);
- EasyMock.expect(container.getParent()).andReturn(engine);
- EasyMock.expect(engine.getJvmRoute()).andReturn("host1");
EasyMock.replay(server, service, engine, container, context, host);
- Map<String, Map<String, ResetRequestSource.Status>> emptyResponseMap =
Collections.emptyMap();
+ Map<String, ResetRequestSource.EngineStatus> emptyResponseMap =
Collections.emptyMap();
List<MCMPRequest> requests =
this.listener.getResetRequests(emptyResponseMap);
EasyMock.verify(server, service, engine, container, context, host);
+
+ Assert.assertEquals(2, requests.size());
MCMPRequest request = requests.get(0);
Map<String, String> parameters = request.getParameters();
- Assert.assertSame(MCMPRequestType.REMOVE_APP, request.getRequestType());
- Assert.assertTrue(request.isWildcard());
- Assert.assertEquals("host1", request.getJvmRoute());
-
- request = requests.get(1);
+ request = requests.get(0);
parameters = request.getParameters();
Assert.assertSame(MCMPRequestType.CONFIG, request.getRequestType());
@@ -155,7 +142,7 @@
Assert.assertEquals("6", parameters.get("WaitWorker"));
Assert.assertEquals("7", parameters.get("Maxattempts"));
- request = requests.get(2);
+ request = requests.get(1);
parameters = request.getParameters();
Assert.assertSame(MCMPRequestType.ENABLE_APP, request.getRequestType());
Modified:
trunk/mod_cluster/src/test/java/org/jboss/modcluster/ha/HASingletonAwareResetRequestSourceTestCase.java
===================================================================
---
trunk/mod_cluster/src/test/java/org/jboss/modcluster/ha/HASingletonAwareResetRequestSourceTestCase.java 2008-10-22
02:21:19 UTC (rev 1976)
+++
trunk/mod_cluster/src/test/java/org/jboss/modcluster/ha/HASingletonAwareResetRequestSourceTestCase.java 2008-10-22
04:35:12 UTC (rev 1977)
@@ -82,7 +82,7 @@
EasyMock.replay(this.singleton, this.key, this.partition);
- Map<String, Map<String, ResetRequestSource.Status>> emptyResponseMap =
Collections.emptyMap();
+ Map<String, ResetRequestSource.EngineStatus> emptyResponseMap =
Collections.emptyMap();
List<MCMPRequest> results = this.source.getResetRequests(emptyResponseMap);
EasyMock.verify(this.singleton, this.key, this.partition);
@@ -211,7 +211,7 @@
@Test
public void getLocalResetRequests() throws Exception
{
- Map<String, Map<String, ResetRequestSource.Status>> emptyResponseMap =
Collections.emptyMap();
+ Map<String, ResetRequestSource.EngineStatus> emptyResponseMap =
Collections.emptyMap();
// Test w/out server
List<MCMPRequest> results =
this.source.getLocalResetRequests(emptyResponseMap);