[omniORB] Nested call blocked
Peter Nyquist
peter.nyquist@tankebolaget.se
Wed, 24 Jan 2001 13:33:27 +0100
VisiBroker is smart and only opens one single connection
if possible... So omniORB will block on nested calls.
But I'm doing another type of nested call that works:
A --> call_x() --> B1
A <-- call_y() <-- B1
A --> call_x() --> B2
A <-- call_y() <-- B2
Even though call_y() from B1 to A is on-going, call_y() from B2 to
A works. What is the explanation for this? Is VisiBroker opening
a new connection for B2? Is it possible to use this fact to get
around the earlier problem?
Note: I'm still learning CORBA basics, so most of these issues are
new to me.
/Peter
>
> My problem is kind of similar to the one Peter reported. I
> have already
> posted a msg to the list about it. In short this is my situation:
>
> 1. Client1 -- push(event) --> EventChannel --- push(event) --> Server
>
> 2. Server incarnates an object factory, the server's push handler
> creates a new object and calls some methods on that object. The method
> invocations take some time to complete.
>
> 3. Client2 -- push(event) --> EventChannel --- push(event) --> Server
>
> 4. Now Client2 has to wait for the push handler to return
> (since the ORB
> controlled thread policy in OmniORB is implemented as
> thread-per-object,
> and there's only one server object).
>
> Duncan Grisby corrected my assumptions in step 4 and told me OmniORB's
> thread policy is thread per connection. Duncan also told me that the
> EventChannel should open a new connection, so the server will use a
> different thread. This thread model is exactly what I'm looking for
> since I try to avoid threading as much as possible in my own apps...
>
> _but_, my push server still blocks on the method invocation after
> receiving a push event, other push events are queued untill the server
> returns from the push handler. What am I missing here? Could it be
> possible that all push events for a server are send from the
> EventChannel using the same tcp connection (wild guess)?
>
> Please let me know if you need a small test implementation to
> see how I
> did things.
>
> I'm using OmniORB 3.02 + OmniNotify 1.1b1 on a RH 6 Linux system.
>
> TIA,
> Rob
>
>
> Sai-Lai Lo wrote:
> >
> > It may be the case that Visibroker is using the same tcp
> connection to sent
> > the "display()" and the "push()" request. If that is the
> case, omniORB will
> > not see the push request because there is only 1 thread
> dispatched to serve
> > one connection. The thread is in the process of waiting for
> the reply to
> > "request()".
> >
> > Unless you can tell visibroker to have at most 1
> outstanding request per
> > connection, I'm afraid we have an interoperability problem here.
> >
> > If you can, I suggest you break the long nested call chain.
> Either by
> >
> > 1. in display() spawn another thread to do request() and then return
> > immediately.
> >
> > OR
> >
> > 2. in request(), spawn another thread to do push() and then return
> > immediately.
> >
> > In omniORB4 currently under development, we'll address this issue.
> >
> > Sai-Lai
> >
> > >>>>> Peter Nyquist writes:
> >
> > > We have a system with one client/server using omniORB on Linux (A)
> > > and another client/server using Visibroker on Windows 2000 (B).
> >
> > > In A there are two CORBA objects, Gateway and GatewaySession.
> > > In B there are two CORBA objects, ConnectManager and
> ApplicationSession.
> >
> > > At startup, Gateway receives a reference to
> ConnectManager from the naming
> > > service.
> >
> > > A client connects to the GatewaySession, which using
> Gateway's reference
> > > calls newConnection(GatewaySession-ref) in
> ConnectManager. Connect manager
> > > passes the GatewaySession-ref to ApplicationSession. No
> calls are now
> > > "hanging".
> >
> > > The following nested calls now occur:
> >
> > > Visibroker side
> omniORB
> > > side
> >
> > > ApplicationSession -----> display(ApplicationSession-ref) ----->
> > > GatewaySession
> > > ApplicationSession <----- request() <--------------------------<
> > > GatewaySession
> > > ApplicationSession -----> push()
> ------------------------------> blocked in
> > > omniORB.
> >
> > > The push() call does not reach the GatewaySession code.
> >
> > > It seems that since omniORB is already processing the
> display() call, it
> > > cannot handle the
> > > nested push() call. Is this a correct analysis of the
> problem? Is this a
> > > known problem?
> > > Can we set up omniORB to somehow handle this type of nested call?
> >
> > > When we run VisiBroker on both sides, it works just fine.
> Running JavaORB ->
> > > omniBroker still
> > > shows the same problem.
> >
> > > Thanks
> >
> > --
> > Sai-Lai Lo
> S.Lo@uk.research.att.com
> > AT&T Laboratories Cambridge WWW:
http://www.uk.research.att.com
> 24a Trumpington Street Tel: +44 1223 343000
> Cambridge CB2 1QA Fax: +44 1223 313542
> ENGLAND