Archived

This forum has been archived. Please start a new discussion on GitHub.

Problem with routed callbacks

I am trying to use callbacks through Glacier2 using Ice 3.4.1.

My setup is the following:
I have a network divided into two sites. Between the two sites there is a firewall.

The registry has access to the two networks and carries an IceStorm.

What I want to do:
1) Using IceStorm broadcast a query from side A of the network to side B. This is straightforward since the host running IceStorm has access to the two sides of the network.
2) Servers on the side B are subscribers and receive queries. Subscribers that can handle the request send an answer to the query issuer through a proxy that has been sent as part of the request.
3) Since servers on side B are unable to open connections on host on side A, I decided to use the Glacier2 callback mechanism.

The solution I tried to implement:
- on host A, open a session with a glacier2 router located on the registry node
- on host A, I created a routed adapter obtained using createObjectAdapterWithRouter. It is used to plug the callback servant that should be invoked through Glacier2.

What I get:
1) The query sent by A goes through IceStorm and is received by B. I does not flow through Glacier
2) B then calls A's routed proxy. Sniffing the network confirmed that the answer sent by B is actually sent to Glacier2 server endpoints
3) So far so good. From what I have understood the Glacier2 session opened by A is used to carry back the answer to A. Sniffing the network I could not see this answer.
4) The answer is not received by the client.

I am stuck in this situation: the Glacier2 router does not actually forwards the callback.

My questions:
- Could you confirm that what I am trying to implement is a viable scenario ?
- How to debug the whole stuff? Glacier2 logs don't output messages when I add Glacier2.Trace.Client=1 and Glacier2.Trace.Server=1 to the glacier configuration file.

Furthermore, I noticed a *very* strange behaviour that is related. Another part of my process is to publish data from hosts of side B to hosts of side A. Sniffing the network, I noticed that the data published by B is sent through Glacier2 (using the server endpoints) once the routed callback has been received by B. Could it be that on a routed proxy invocation, B stores the router endpoints and use them as the default router ?

Comments

  • I used to bind the port of the glacier2 server endpoints. Unbounding it seems to fix the strange behavior problem.
    Activating the Ice.Trace.Protocol value resulted in the log below. 'report' is the callback method.
    Why do I get a 'object does not exist' error.

    -- 08/27/10 18:57:24.933 FrankfortRouter: Protocol: received request
    message type = 0 (request)
    compression status = 0 (not compressed; do not compress response, if any)
    message size = 15391
    request id = 1
    identity = NewAdapter
    facet =
    operation = report
    mode = 0 (normal)
    context =
    -- 08/27/10 18:57:24.935 FrankfortRouter: Protocol: sending reply
    message type = 2 (reply)
    compression status = 0 (not compressed; do not compress response, if any)
    message size = 39
    request id = 1
    reply status = 2 (object not exist)
    identity = NewAdapter
    facet =
    operation = report
  • Reading the example was helpful.

    Creating an Ice::Identity and using the category from the session fixed the thing.