[jboss-dev] Remoting behavior on error (Re: Possible blocker with jboss-cl 2.2.0.Alpha1)
Jaikiran Pai
jpai at redhat.com
Fri Feb 19 07:12:59 EST 2010
The testcase has been hung since more than 3 days, now :) So looks like
that default client timeout of 30 minutes isn't being honoured. By the
way, EJB3 uses its own config file for remoting JBOSS_HOME/server/<
servername>/deploy/ejb3-connectors-jboss-beans.xml. But that's
irrelevant since the defaults should apply to any remoting config
irrespective of which file it's configured in.
So I looked at this in a bit more detail and it now appears to be a bug
in JBoss Remoting. Here's what's happening:
- A EJB3 client interceptor
(org.jboss.aspects.remoting.InvokeRemoteInterceptor) responsible for
invoking the remote EJB container does a remoting call:
InvokerLocator locator =
(InvokerLocator)invocation.getMetaData(REMOTING, INVOKER_LOCATOR);
...
Client client = new Client(locator, subsystem);
try
{
client.connect();
...
client.invoke(invocation, null);
- Remoting internally creates a
org.jboss.remoting.transport.socket.MicroSocketClientInvoker which
creates a ServerAddress:
protected ServerAddress createServerAddress(InetAddress addr, int port)
{
return new ServerAddress(addr.getHostAddress(), port,
enableTcpNoDelay, -1, maxPoolSize);
}
Notice the hardcoded -1 being passed to the ServerAddress. That's the
"timeout". The ServerAddress internally ignores negative timeout values
and sets the timeout to 0 (resulting in infinite timeout).
- The MicroSocketClientInvoker then ultimately ends up creating a client
socket with timeout = 0.
- So when the server side remoting thread crashes (for any unrelated
reason - like the classloading issue), the client ends up with this
infinite block.
The issues i see here:
1) I don't see a way, how i can pass a timeout for the client socket.
Contrary to the comments in remoting-jboss-beans.xml, based on what i
see in the code, it's only the server side timeout which has a
corresponding param. Did i miss something?
2) Even if there was some way of passing the client socket timeout,
currently the ServerAddress creation through MicroSocketClientInvoker
hardcodes the timeout to -1.
regards,
-Jaikiran
Adrian Brock wrote:
> On Tue, 2010-02-16 at 18:14 +0530, Jaikiran Pai wrote:
>> Ron Sigal wrote:
>>> Yeah, Carlo also pointed out that NCDFE is a java.lang.Error, which,
>>> as you note, is not caught. I agree that if ServerThread is going to
>>> terminate due to an error, then it should certainly close its socket,
>>> so that's a bug (JBREM-1183 "ServerThread should catch
>>> java.lang.Error"). But I have mixed feelings about terminating
>>> ServerThread in this case. Unlike, IOException, SocketException,
>>> etc., the NoClassDefFoundError doesn't suggest that the socket is no
>>> longer usable. Maybe a better solution (along with fixing the
>>> classloader problem, of course) is to use a positive timeout on the
>>> client side.
>> I think some (sensible) default timeout needs to be added so that the
>> client does not end up hung. Is this something that can be added to some
>> *-jboss-beans.xml in the AS?
>>
>
> It already exists, but whether 30 minutes is a "sensible" default
> is a different issue. ;-)
>
> See remoting-jboss-beans.xml
>
>
> <!-- Socket read timeout. Defaults to 60000 ms (1 minute)
> -->
> <!-- on the server, 1800000 ms (30 minutes) on the client.
> -->
> <!--entry><key>timeout</key> <value>120000</value></entry-->
>
>
More information about the jboss-development
mailing list