[jacorb-developer] Client-to-ImR Connection Thrashing

McKnerney, Michael D (US SSA) michael.mcknerney at baesystems.com
Wed Jul 25 02:13:13 CEST 2012


Hi Nick (and anybody else who might comment)

Here's what I am seeing when I talk about connection thrashing for ImR references:

1:            String iorString = // ImR reference

2:            org.omg.CORBA.Object obj =  orb.string_to_object(iorString);
3:            SomeIf demo = SomeIfHelper.narrow( obj );
4:            demo.op();

5:            org.omg.CORBA.Object obj2 =  orb.string_to_object(iorString);
6:            SomeIf demo2 = SomeIfHelper.narrow( obj2 );
7:            demo2.op();

8:            demo2._release ();


Line (4) 
   - opens a new connection with the ImR
   - closes connection with the ImR
   - opens a new connection with the [newly started] impl server 
   - connection to impl server stays open

Line (7)  
   - opens a new connection with the ImR
   - closes connection with the ImR
   - reuses existing connection with the impl server
   - connection to impl server stays open   

Line (8) -- I think this line is optional, i.e., just let the object go out-of-scope ?
   - cannot release ClientGIOPConnection to 10.35.225.150:59149 (13adc56) (still has 1 client(s)))  

So the connection thrashing I'm talking about is the fact that EVERY Imr reference (even if its logically the same) ALWAYS opens and closes a connection with the ImR.

Just want to confirm what I'm seeing is true.

Thanks again for the help !
-mike

-----Original Message-----
From: Nick Cross [mailto:jacorb at goots.org] 
Sent: Tuesday, July 24, 2012 6:05 AM
To: McKnerney, Michael D (US SSA)
Subject: Re: Client-to-ImR Connection Thrashing


Hi Mike,

I have had a quick look at this -


diff -b -B -w ~/Downloads/imrThrashing/src/demo/imr/Client.java 
src/demo/imr/Client.java                           13:56
63,68c63
< while (true) {
< System.out.println("press a key");
< try { System.in.read(); } catch (Exception e2) {}
<
<             org.omg.CORBA.Object obj2 =
<                 orb.string_to_object(iorString);
---
 >             org.omg.CORBA.Object obj2 = orb.string_to_object(iorString);
72a68,72
 >             while (true)
 >             {
 >                 System.out.println("press a key");
 >                 try { System.in.read(); } catch (Exception e2) {}
 >

I tried changing the code as per above so the client delegate object 
(which will open up the connection) is created outside of the loop.

As a further test I tried manually releasing the resources (and therebye 
the connection):

             System.out.println("Client: successfully called server");

             org.omg.CORBA.Object obj2 = orb.string_to_object(iorString);

             //narrow to correct interface
             SomeIf demo2 = SomeIfHelper.narrow( obj2 );

             while (i++<10)
             {
                 System.out.println("press a key");
                 try { System.in.read(); } catch (Exception e2) {}

                 //call remote op
                 System.out.println("Client: will call server");
                 demo2.op();
                 System.out.println("Client: successfully called server");
             }
             System.out.println("Client: releasing...");
             demo2._release ();
             obj2._release ();

             obj2 = orb.string_to_object(iorString);
             demo2 = SomeIfHelper.narrow( obj2 );
             demo2.op();
and this creates another connection.

Could you try this?

Cheers

Nick



On 24/07/12 00:54, McKnerney, Michael D (US SSA) wrote:
> Hi Nick,
>
> Hope you had a nice vacation with your family !
>
> I've attached imrThrashing.jar and jacorb.properties if you have time to have a look.
>
> Basically, the same as the original demo/imr with slight modification to Client.java.
>
> All I changed in Client.java was a loop that uses obj2 for a very short period.  It's like our real application except that we don't read ior from file but rather from NameService and the lifetime of the reference is very short.
>
> Build:
>> cd ${JACORB_HOME}
>> mkdir imrThrashing
>> cp ~/imrThrashing.jar .
>> jar xvf imrThrashing.jar
>> ant compile
>
> Register:
>> imr_mg add imr_demo -h mcknerney2-lnx5-dev -c "xterm -title IMR_DemoServer -ls -sb -sl 5000 -e jaco -cp ${JACORB_HOME}/demo/imrThrashing/build/classes:${JACORB_HOME} demo.imr.Server ${JACORB_HOME}/demo/imrThrashing/IOR 60"
>
> Run Server 1st time to create IOR
>> cd ${JACORB_HOME}/demo/imrThrashing
>> jaco -cp ${JACORB_HOME}/demo/imrThrashing/build/classes:${JACORB_HOME} demo.imr.Server ${JACORB_HOME}/demo/imrThrashing/IOR 60
>
> Run client
>> cd ${JACORB_HOME}/demo/imrThrashing
>> jaco -cp ${JACORB_HOME}/demo/imrThrashing/build/classes:$JACORB_CLASSPATH demo.imr.Client ${JACORB_HOME}/demo/imrThrashing/IOR
>
> You'll see that a new connection is created on each cycle through the loop.
>
> Client log:
> ----------------
> DEBUG | ConnectionBase.java      :149  | 2012-07-23 23:40:32,825 | ConnectionBase           | to_COMM_FAILURE          | tid:ClientMessageReceptor0 | to_COMM_FAILURE: Caught exception
> java.net.SocketException: Socket closed
>          at java.net.SocketInputStream.socketRead0(Native Method)
>          at java.net.SocketInputStream.read(SocketInputStream.java:129)
>          at org.jacorb.orb.etf.StreamConnectionBase.read(StreamConnectionBase.java:111)
>          at org.jacorb.orb.giop.GIOPConnection.getMessage(GIOPConnection.java:381)
>          at org.jacorb.orb.giop.GIOPConnection.receiveMessagesLoop(GIOPConnection.java:539)
>          at org.jacorb.orb.giop.GIOPConnection.receiveMessages(GIOPConnection.java:528)
>          at org.jacorb.orb.giop.MessageReceptor.doWork(MessageReceptor.java:70)
>          at org.jacorb.util.threadpool.ConsumerTie.run(ConsumerTie.java:61)
>          at java.lang.Thread.run(Thread.java:662)
> DEBUG | GIOPConnection.java      :395  | 2012-07-23 23:40:32,826 | GIOPConnection           | getMessage               | tid:ClientMessageReceptor0 | ClientGIOPConnection to 10.35.225.150:59676 (1ebd75b): getMessage() -- COMM_FAILURE
>
>
> ImR log:
> -------------
> DEBUG | StreamConnectionBase.java:146  | 2012-07-23 23:40:32,825 | StreamConnectionBase     | read                     | tid:ImplementationRepository0 | Transport to 10.35.225.150:51491: stream closed on read  < 0
> DEBUG | GIOPConnection.java      :395  | 2012-07-23 23:40:32,825 | GIOPConnection           | getMessage               | tid:ImplementationRepository0 | ServerGIOPConnection to 10.35.225.150:51491 from [10.35.225.150:43347] (16c9867): getMessage() -- COMM_FAILURE
>
>
>> netstat -ap |grep 59676    // jacorb.imr.endpoint_port_number=59676
>
> tcp        0      0 mcknerney2-lnx5-dev.i:59676 *:*                         LISTEN      13158/java
> tcp        0      0 mcknerney2-lnx5-dev.i:50417 mcknerney2-lnx5-dev.i:59676 TIME_WAIT   -
> tcp        0      0 mcknerney2-lnx5-dev.i:50416 mcknerney2-lnx5-dev.i:59676 TIME_WAIT   -
> tcp        0      0 mcknerney2-lnx5-dev.i:50419 mcknerney2-lnx5-dev.i:59676 TIME_WAIT   -
> tcp        0      0 mcknerney2-lnx5-dev.i:50418 mcknerney2-lnx5-dev.i:59676 TIME_WAIT   -
> tcp        0      0 mcknerney2-lnx5-dev.i:50420 mcknerney2-lnx5-dev.i:59676 TIME_WAIT   -
> tcp        0      0 mcknerney2-lnx5-dev.i:50410 mcknerney2-lnx5-dev.i:59676 TIME_WAIT   -
> tcp        0      0 mcknerney2-lnx5-dev.i:50415 mcknerney2-lnx5-dev.i:59676 TIME_WAIT   -
>
>
> Btw- I tried setting this property to "on" but it had no affect
>
> jacorb.reference_caching=on
>
> And I could not find any documentation on this property.
>
> Is it used to avoid unnecessary binding and, if so, why not 'on' by default ?
>
> Thanks for having a look if you have time
> Take care,
> Mike
> P.S  I still need to get that test case for PortableInterceptor to you but I'm on the hook to finish this porting task first :-)
> I don't see any existing junit test cases for jacorb to model mine after, are there some ?
>
>
> -----Original Message-----
> From: McKnerney, Michael D (US SSA)
> Sent: Monday, July 23, 2012 3:47 PM
> To: Discussions concerning CORBA development with JacORB
> Subject: Client-to-ImR Connection Thrashing
>
> Hi,
>
> Our usage of ImR reference is causing a new connection to be established between client and ImR on EVERY invocation on the reference.  May be related to the lifetime of the reference scope, not sure ?
>
> Obviously, we want the connection from the client-to-ImR to happen only once and then stay open indefinitely.
>
> I'll send an ImR demo that shows the issue.
>
> Thanks for helping me figure out what's going on
> -mike
>




More information about the jacorb-developer mailing list