Archived

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

Ice hangs when glacier is restarted

Hello.

I use glacier2 router and icegrid.
When icegrid with router is restarted the client can not reconnect to icegrid's servers objects - it hangs. Wireshark shows that Ice is calling ice_isA method indefinitely without a pause.
To reproduce it three files are sufficient:
config:
Ice.Default.Host=localhost
Ice.Default.Locator=IceGrid/Locator:tcp -p 4061

IceGrid.Registry.Client.Endpoints=tcp -p 4061
IceGrid.Registry.Server.Endpoints=tcp
IceGrid.Registry.Internal.Endpoints=default
IceGrid.Registry.Data=db/registry
IceGrid.Registry.PermissionsVerifier=IceGrid/NullPermissionsVerifier
IceGrid.Registry.AdminPermissionsVerifier=IceGrid/NullPermissionsVerifier
IceGrid.Node.Name=localhost
IceGrid.Node.Endpoints=default
IceGrid.Node.Data=db/node
IceGrid.Node.CollocateRegistry=1
IceGridAdmin.Username=foo
IceGridAdmin.Password=bar
app.xml:
<icegrid>
  <application name="Simple">
    <node name="localhost">
       <server id="glacier" exe="glacier2router" activation="always">
        <property name="Glacier2.Client.Endpoints" value="tcp -h localhost -p 4063"/>
        <property name="Glacier2.Server.Endpoints" value="tcp -h localhost"/>
        <property name="Glacier2.SessionTimeout" value="60"/>
        <property name="Glacier2.PermissionsVerifier" value="Glacier2/NullPermissionsVerifier"/>
        <property name="Glacier2.Trace.Session" value="1"/>
      </server>
    </node>
  </application>
</icegrid>

client.py:
#!/usr/bin/env python

import time, sys, Ice, Glacier2, IceGrid



class Client(Ice.Application):

  def run(self, args):
    obj = None
    while True:
      if obj:
        if not self.ping(obj):
          obj = None
      else:
        obj = self.connect()
      time.sleep(2)

  def connect( self ):
    ic = self.communicator()
    try:
      router = ic.stringToProxy('Glacier2/router:tcp -h localhost -p 4063')
      router = Glacier2.RouterPrx.checkedCast(router)
      session = router.createSession('', '')
      query = ic.stringToProxy('IceGrid/Query')
      query = query.ice_router(router)
      print 'casting...'
      obj = IceGrid.QueryPrx.checkedCast(query)  # hangs here after reconnect
      print 'casting... done.'
      return obj
    except Ice.Exception, x:
      return None

  def ping( self, obj ):
    try:
      obj.ice_ping()
      return True
    except Ice.Exception, x:
      return False


app = Client()
sys.exit(app.main(sys.argv))

First start icegrid:
$ icegridnode --Ice.Config=config --deploy app.xml
Then start client.py in another window. After that kill icegridnode and start it again.
$ ./client.py
casting...
casting... done.
casting...

Tested on Ice 3.3.1 under linux

Comments

  • benoit
    benoit Rennes, France
    Hi,

    This is a known problem where the Ice communicator is caching some information which prevent a new session from being created.

    You need to destroy the communicator after the session is destroyed and create a new communicator before establishing a new session. Another option is to create an object adapter associated with the router after the session is created and destroy it once the session is destroyed.

    Cheers,
    Benoit.
  • Thanks

    Hello.

    Thank you, Benoit. Workaround with adapter works fine.

    Vsevolod