summaryrefslogtreecommitdiff
path: root/cpp/src/IceGrid/SessionServantManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/IceGrid/SessionServantManager.cpp')
-rw-r--r--cpp/src/IceGrid/SessionServantManager.cpp45
1 files changed, 35 insertions, 10 deletions
diff --git a/cpp/src/IceGrid/SessionServantManager.cpp b/cpp/src/IceGrid/SessionServantManager.cpp
index 6f85ff9ccff..a0a54302fe6 100644
--- a/cpp/src/IceGrid/SessionServantManager.cpp
+++ b/cpp/src/IceGrid/SessionServantManager.cpp
@@ -21,12 +21,20 @@ SessionServantManager::SessionServantManager(const Ice::ObjectAdapterPtr& adapte
bool checkConnection,
const string& serverAdminCategory,
const Ice::ObjectPtr& serverAdminRouter,
+ const string& nodeAdminCategory,
+ const Ice::ObjectPtr& nodeAdminRouter,
+ const string& replicaAdminCategory,
+ const Ice::ObjectPtr& replicaAdminRouter,
const AdminCallbackRouterPtr& adminCallbackRouter) :
_adapter(adapter),
_instanceName(instanceName),
_checkConnection(checkConnection),
_serverAdminCategory(serverAdminCategory),
_serverAdminRouter(serverAdminRouter),
+ _nodeAdminCategory(nodeAdminCategory),
+ _nodeAdminRouter(nodeAdminRouter),
+ _replicaAdminCategory(replicaAdminCategory),
+ _replicaAdminRouter(replicaAdminRouter),
_adminCallbackRouter(adminCallbackRouter)
{
}
@@ -35,26 +43,43 @@ Ice::ObjectPtr
SessionServantManager::locate(const Ice::Current& current, Ice::LocalObjectPtr&)
{
Lock sync(*this);
+ Ice::ObjectPtr servant;
+ bool plainServant = false;
+
if(_serverAdminRouter && current.id.category == _serverAdminCategory)
{
- if(_checkConnection && _adminConnections.find(current.con) == _adminConnections.end())
- {
- return 0;
- }
- else
- {
- return _serverAdminRouter;
- }
+ servant = _serverAdminRouter;
+ }
+ else if(_nodeAdminRouter && current.id.category == _nodeAdminCategory)
+ {
+ servant = _nodeAdminRouter;
+ }
+ else if(_replicaAdminRouter && current.id.category == _replicaAdminCategory)
+ {
+ servant = _replicaAdminRouter;
}
else
{
+ plainServant = true;
+
map<Ice::Identity, ServantInfo>::const_iterator p = _servants.find(current.id);
if(p == _servants.end() || (_checkConnection && p->second.connection != current.con))
{
- return 0;
+ servant = 0;
+ }
+ else
+ {
+ servant = p->second.servant;
}
- return p->second.servant;
}
+
+ if(!plainServant && servant && _checkConnection &&
+ _adminConnections.find(current.con) == _adminConnections.end())
+ {
+ servant = 0;
+ }
+
+ return servant;
}
void