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:
app.xml:Code: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
client.py:Code:<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>
First start icegrid:Code:#!/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))
Then start client.py in another window. After that kill icegridnode and start it again.Code:$ icegridnode --Ice.Config=config --deploy app.xml
Tested on Ice 3.3.1 under linuxCode:$ ./client.py casting... casting... done. casting...

Reply With Quote