Author: ron.sigal(a)jboss.com
Date: 2010-12-15 18:06:50 -0500 (Wed, 15 Dec 2010)
New Revision: 6162
Modified:
remoting2/branches/2.x/src/main/org/jboss/remoting/ConnectionValidator.java
Log:
JBREM-1144: Declares connection broken when it sees a new serverId, if
useServerConnectionIdentity is set to true.
Modified: remoting2/branches/2.x/src/main/org/jboss/remoting/ConnectionValidator.java
===================================================================
--- remoting2/branches/2.x/src/main/org/jboss/remoting/ConnectionValidator.java 2010-12-15
23:05:31 UTC (rev 6161)
+++ remoting2/branches/2.x/src/main/org/jboss/remoting/ConnectionValidator.java 2010-12-15
23:06:50 UTC (rev 6162)
@@ -268,6 +268,8 @@
private MicroRemoteClientInvoker sharedInvoker;
private LeasePinger leasePinger;
private boolean useClientConnectionIdentity;
+ private boolean useServerConnectionIdentity;
+ private String serverId;
// Constructors
---------------------------------------------------------------------------------
@@ -748,6 +750,27 @@
" to a boolean: must be a String");
}
}
+ o = config.get(Remoting.USE_SERVER_CONNECTION_IDENTITY);
+ if (o != null)
+ {
+ if (o instanceof String)
+ {
+ try
+ {
+ useServerConnectionIdentity = Boolean.valueOf(((String)
o)).booleanValue();
+ }
+ catch (Exception e)
+ {
+ log.warn(this + " could not convert " +
Remoting.USE_SERVER_CONNECTION_IDENTITY + " value" +
+ " to a boolean: " + o);
+ }
+ }
+ else
+ {
+ log.warn(this + " could not convert " +
Remoting.USE_SERVER_CONNECTION_IDENTITY + " value" +
+ " to a boolean: must be a String");
+ }
+ }
}
}
@@ -813,6 +836,12 @@
{
Map metadata = new HashMap();
metadata.put(ServerInvoker.INVOKER_SESSION_ID, invokerSessionId);
+
+ if (useServerConnectionIdentity)
+ {
+ metadata.put(Remoting.USE_SERVER_CONNECTION_IDENTITY, "true");
+ }
+
InvocationRequest ir =
new InvocationRequest(null, Subsystem.SELF, "$PING$", metadata,
null, null);
@@ -824,10 +853,61 @@
// Server indicates lease has stopped.
throw new Exception();
}
+ if (o instanceof InvocationResponse)
+ {
+ Object result = ((InvocationResponse) o).getResult();
+ if (result instanceof Boolean && !((Boolean) result).booleanValue())
+ {
+ // Server indicates lease has stopped.
+ throw new Exception();
+ }
+ if (useServerConnectionIdentity)
+ {
+ Map map = ((InvocationResponse) o).getPayload();
+ if (map != null)
+ {
+ String s = (String) map.get(Remoting.SERVER_ID);
+ if (s != null)
+ {
+ if (serverId == null)
+ {
+ serverId = s;
+ pingWorked = true;
+ if (trace) log.trace(this + " set serverId to " +
serverId);
+ }
+ else
+ {
+ pingWorked = s.equals(serverId);
+ if (!pingWorked)
+ {
+ if (trace) log.trace(this + " detected new serverId:
" + s + " != " + serverId);
+ }
+ }
+ }
+ else
+ {
+ pingWorked = true;
+ }
+ }
+ else
+ {
+ pingWorked = true;
+ }
+ }
+ }
+ else
+ {
+ pingWorked = true;
+ }
- if (trace) { log.trace("ConnectionValidator got successful ping using
" + clientInvoker);}
-
- pingWorked = true;
+ if (pingWorked)
+ {
+ if (trace) { log.trace("ConnectionValidator got successful ping using
" + clientInvoker);}
+ }
+ else
+ {
+ if (trace) { log.trace("ConnectionValidator did not get successful ping
response " + clientInvoker);}
+ }
}
catch (Throwable t)
{
@@ -845,17 +925,69 @@
{
// Sending null client id as don't want to trigger lease on server side.
This also means
// that client connection validator will NOT impact client lease, so can not
depend on it
- // to maintain client lease with the server.
- InvocationRequest ir =
- new InvocationRequest(null, Subsystem.SELF, "$PING$", null, null,
null);
+ // to maintain client lease with the server
+
+ InvocationRequest ir = null;
+ if (useServerConnectionIdentity)
+ {
+ Map metadata = new HashMap();
+ metadata.put(Remoting.USE_SERVER_CONNECTION_IDENTITY, "true");
+ ir = new InvocationRequest(null, Subsystem.SELF, "$PING$",
metadata, null, null);
+ }
+ else
+ {
+ ir = new InvocationRequest(null, Subsystem.SELF, "$PING$", null,
null, null);
+ }
if (trace) { log.trace("pinging, sending " + ir + " over " +
clientInvoker); }
- clientInvoker.invoke(ir);
+ Object o = clientInvoker.invoke(ir);
+ if (useServerConnectionIdentity && o instanceof InvocationResponse)
+ {
+ Map map = ((InvocationResponse) o).getPayload();
+ if (map != null)
+ {
+ String s = (String) map.get(Remoting.SERVER_ID);
+ if (s != null)
+ {
+ if (serverId == null)
+ {
+ serverId = s;
+ pingWorked = true;
+ if (trace) log.trace(this + " set serverId to " +
serverId);
+ }
+ else
+ {
+ pingWorked = s.equals(serverId);
+ if (!pingWorked)
+ {
+ if (trace) log.trace(this + " detected new serverId: "
+ s + " != " + serverId);
+ }
+ }
+ }
+ else
+ {
+ pingWorked = true;
+ }
+ }
+ else
+ {
+ pingWorked = true;
+ }
+ }
+ else
+ {
+ pingWorked = true;
+ }
- if (trace) { log.trace("ConnectionValidator got successful ping using
" + clientInvoker);}
-
- pingWorked = true;
+ if (pingWorked)
+ {
+ if (trace) { log.trace("ConnectionValidator got successful ping using
" + clientInvoker);}
+ }
+ else
+ {
+ if (trace) { log.trace("ConnectionValidator did not get successful ping
response " + clientInvoker);}
+ }
}
catch (Throwable t)
{
Show replies by date