diff options
Diffstat (limited to 'cpp/src/IceGrid/RegistryAdminRouter.cpp')
-rw-r--r-- | cpp/src/IceGrid/RegistryAdminRouter.cpp | 86 |
1 files changed, 72 insertions, 14 deletions
diff --git a/cpp/src/IceGrid/RegistryAdminRouter.cpp b/cpp/src/IceGrid/RegistryAdminRouter.cpp index b17dc9b0ef7..e69dc2a1baa 100644 --- a/cpp/src/IceGrid/RegistryAdminRouter.cpp +++ b/cpp/src/IceGrid/RegistryAdminRouter.cpp @@ -14,20 +14,68 @@ using namespace IceGrid; using namespace Ice; using namespace std; +namespace +{ + +class SynchronizationCallbackI : public SynchronizationCallback +{ +public: + + SynchronizationCallbackI(const IceUtil::Handle<RegistryServerAdminRouter>& adminRouter, + const AMD_Object_ice_invokePtr& cb, + const pair<const Byte*, const Byte*>& inParams, + const Current& current) : + _callback(cb), _inParams(inParams.first, inParams.second), _current(current) + { + } + + void synchronized() + { + // + // Retry to forward the call. + // + _adminRouter->ice_invoke_async(_callback, make_pair(&_inParams[0], &_inParams[0] + _inParams.size()), _current); + } + + void synchronized(const Ice::Exception& ex) + { + _callback->ice_exception(Ice::ObjectNotExistException(__FILE__, __LINE__)); + } + +private: + + const IceUtil::Handle<RegistryServerAdminRouter> _adminRouter; + const AMD_Object_ice_invokePtr _callback; + const vector<Byte> _inParams; + const Current _current; +}; + +} IceGrid::RegistryServerAdminRouter::RegistryServerAdminRouter(const DatabasePtr& database) : _database(database) { } -ObjectPrx -IceGrid::RegistryServerAdminRouter::getTarget(const Current& current) +void +IceGrid::RegistryServerAdminRouter::ice_invoke_async(const AMD_Object_ice_invokePtr& cb, + const std::pair<const Ice::Byte*, const Ice::Byte*>& inParams, + const Current& current) { ObjectPrx target = 0; try { - target = _database->getServer(current.id.name)->getAdminProxy(); + ServerEntryPtr server = _database->getServer(current.id.name); + try + { + target = server->getAdminProxy(); + } + catch(const SynchronizationException&) + { + server->addSyncCallback(new SynchronizationCallbackI(this, cb, inParams, current)); + return; // Wait for the server synchronization to complete and retry. + } } catch(const ServerNotExistException&) { @@ -43,8 +91,10 @@ IceGrid::RegistryServerAdminRouter::getTarget(const Current& current) { throw ObjectNotExistException(__FILE__, __LINE__); } - - return target->ice_facet(current.facet); + + target = target->ice_facet(current.facet); + + invokeOnTarget(target, cb, inParams, current); } @@ -54,8 +104,10 @@ IceGrid::RegistryNodeAdminRouter::RegistryNodeAdminRouter(const string& collocNo { } -ObjectPrx -IceGrid::RegistryNodeAdminRouter::getTarget(const Current& current) +void +IceGrid::RegistryNodeAdminRouter::ice_invoke_async(const AMD_Object_ice_invokePtr& cb, + const std::pair<const Ice::Byte*, const Ice::Byte*>& inParams, + const Current& current) { ObjectPrx target; @@ -76,27 +128,31 @@ IceGrid::RegistryNodeAdminRouter::getTarget(const Current& current) catch(const NodeNotExistException&) { } - + if(target == 0) { throw ObjectNotExistException(__FILE__, __LINE__); } } - return target->ice_facet(current.facet); + target = target->ice_facet(current.facet); + + invokeOnTarget(target, cb, inParams, current); } -IceGrid::RegistryReplicaAdminRouter::RegistryReplicaAdminRouter(const string& name, +IceGrid::RegistryReplicaAdminRouter::RegistryReplicaAdminRouter(const string& name, const DatabasePtr& database) : _name(name), _database(database) { } -ObjectPrx -IceGrid::RegistryReplicaAdminRouter::getTarget(const Current& current) +void +IceGrid::RegistryReplicaAdminRouter::ice_invoke_async(const AMD_Object_ice_invokePtr& cb, + const std::pair<const Ice::Byte*, const Ice::Byte*>& inParams, + const Current& current) { ObjectPrx target; @@ -121,6 +177,8 @@ IceGrid::RegistryReplicaAdminRouter::getTarget(const Current& current) { throw ObjectNotExistException(__FILE__, __LINE__); } - - return target->ice_facet(current.facet); + + target = target->ice_facet(current.facet); + + invokeOnTarget(target, cb, inParams, current); } |