Archived

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

object registrations/deregistration and cleanup

Hi,

We are developping an application (in python and C++) using Ice where we dynamically register servants to icegrid using
self._admin.addObjectWithType(hprx, prx.ice_id())

We have some bugs and we sometimes need to clean the iceregistry database.

I find the servants using :
objects = queryPrx.findAllObjectsByType(htype)

But how do I find all registered Adapters ?... I tried to use findAllObjectsByType using the adapter type but I did not find anything

and does Ice has a generic type so I can find all objects like findAllObjectsByType(*) or findAllObjectsByType(::)

A related question:
It looks like when closing a servant , if another servant has a proxy to it, then self._admin.removeObject(iceid) fails ....
How can I avoid that, apart from asking all clients to destroy they proxies to the dying servant ?

Thank you

Olivier

Comments

  • matthew
    matthew NL, Canada
    oroulet wrote: »
    Hi,

    We are developping an application (in python and C++) using Ice where we dynamically register servants to icegrid using
    self._admin.addObjectWithType(hprx, prx.ice_id())

    We have some bugs and we sometimes need to clean the iceregistry database.

    I find the servants using :
    objects = queryPrx.findAllObjectsByType(htype)

    But how do I find all registered Adapters ?... I tried to use findAllObjectsByType using the adapter type but I did not find anything

    To find the registered adapters you have to use the IceGrid Admin interface. You can call IceGrid::Admin::getAllAdapterIds to retrieve all of the registered adapter ids.
    and does Ice has a generic type so I can find all objects like findAllObjectsByType(*) or findAllObjectsByType(::)

    Similarly with the admin interfaces you can use IceGrid::Admin::getAllObjectInfos with a regular expression.
    A related question:
    It looks like when closing a servant , if another servant has a proxy to it, then self._admin.removeObject(iceid) fails ....
    How can I avoid that, apart from asking all clients to destroy they proxies to the dying servant ?

    Thank you

    Olivier

    This cannot be the case. Servers are not, and cannot be, aware of which clients have proxies which refer to objects which are hosted in the server. What exactly is failing?
  • matthew wrote: »

    This cannot be the case. Servers are not, and cannot be, aware of which clients have proxies which refer to objects which are hosted in the server. What exactly is failing?

    Thank you for your very quick answer.
    What we are trying to do is to programmatically de-register from icegrid and sometimes it fails with Ice::ObjectNotExistException and we do not know why.

    Here is the code :
    Ice::ObjectNotExistException

    def _deregisterAgent(self, iceid):
    try:
    self._admin.removeObject(iceid)
    except (Ice.ObjectNotExistException, IceGrid.ObjectNotRegisteredException), why:
    print "Could not de-register agent", "\n", iceid , "\n", why, "\n"

    getting an IceGrid.objectNotregisteredException is fine since it is not database but Ice.ObjectNotExistException is our problem

    self._admin is created when the program starts with

    self._registry = IceGrid.RegistryPrx.uncheckedCast(self._ic.stringToProxy("IceGrid/Registry"))
    self._session = self._registry.createAdminSession(config.AdminUser, config.AdminPasswd)
    self._admin = self._session.getAdmin()

    This mean every process has its own admin session to be able to register
  • oroulet wrote: »
    This mean every process has its own admin session to be able to register

    every process creates its own session but they all use the same password and user
  • matthew
    matthew NL, Canada
    Are you keeping the session alive? If you don't regularly call keepAlive on the session, it will be destroyed and you'll get an ObjectNotExistException when you try and use it. See cpp/src/IceGrid/Client.cpp for an example.
  • that was it !
    Thank you