While fixing "4452578: RI hangs when a return object is not
serializable" I noticed that a similar thing can happen on the server
side. If the client sends at least one fragment of a request and then
gets a client-side ORB (e.g., tries to marshal a non-serializable
object) then a server side ORB thread will hang waiting for further
fragments. (The client side does report the error to the client
application, but it does not send further fragments.).
Everytime this happens it causes new threads to hang. If this happens
N times then the server-side ORB will have N threads waiting.
Example stack trace of waiting (i.e, hung) thread:
RequestProcessor[0][1] where
[1] java.lang.Object.wait (native method)
[2] java.lang.Object.wait (Object:420)
[3] com.sun.corba.ee.internal.iiop.BufferManagerReadStream.underflow (BufferManagerReadStream:65)
[4] com.sun.corba.ee.internal.iiop.CDRInputStream_1_1.grow (CDRInputStream_1_1:76)
[5] com.sun.corba.ee.internal.iiop.CDRInputStream_1_0.read_octet_array (CDRInputStream_1_0:570)
[6] com.sun.corba.ee.internal.iiop.CDRInputStream.read_octet_array (CDRInputStream:209)
[7] com.sun.corba.ee.internal.core.UnknownServiceContext.<init> (UnknownServiceContext:31)
[8] com.sun.corba.ee.internal.core.ServiceContexts.<init> (ServiceContexts:103)
[9] com.sun.corba.ee.internal.iiop.messages.RequestMessage_1_2.read (RequestMessage_1_2:127)
[10] com.sun.corba.ee.internal.iiop.IIOPInputStream.unmarshalHeader (IIOPInputStream:126)
[11] com.sun.corba.ee.internal.iiop.RequestProcessor.process (RequestProcessor:78)
[12] com.sun.corba.ee.internal.orbutil.ThreadPool$PooledThread.run (ThreadPool$PooledThread:99)
RequestProcessor[0][1]
This is a waste of scare resources.