summaryrefslogtreecommitdiff
path: root/cpp/src/Glacier2/RoutingTable.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/Glacier2/RoutingTable.cpp')
-rw-r--r--cpp/src/Glacier2/RoutingTable.cpp31
1 files changed, 22 insertions, 9 deletions
diff --git a/cpp/src/Glacier2/RoutingTable.cpp b/cpp/src/Glacier2/RoutingTable.cpp
index 22d5b4d4d1b..485e03cc17f 100644
--- a/cpp/src/Glacier2/RoutingTable.cpp
+++ b/cpp/src/Glacier2/RoutingTable.cpp
@@ -22,28 +22,41 @@ Glacier2::RoutingTable::RoutingTable(const CommunicatorPtr& communicator) :
}
ObjectProxySeq
-Glacier2::RoutingTable::add(const ObjectProxySeq& proxies)
+Glacier2::RoutingTable::add(const ObjectProxySeq& proxies, const Ice::Current& current)
{
IceUtil::Mutex::Lock sync(*this);
-
- ObjectProxySeq evictedProxies;
+
+ ObjectProxySeq::const_iterator prx;
- for(ObjectProxySeq::const_iterator prx = proxies.begin(); prx != proxies.end(); ++prx)
+ //
+ // We 'pre-scan' the list, applying our validation rules. The
+ // ensures that our state is not modified if this operation results
+ // in a rejection.
+ //
+ for(prx = proxies.begin(); prx != proxies.end(); ++prx)
{
if(!*prx) // We ignore null proxies.
{
continue;
}
- ObjectPrx proxy = (*prx)->ice_twoway()->ice_secure(false); // We add proxies in default form.
+ if(!_verifier.verify(*prx))
+ {
+ current.con->close(true);
+ throw ObjectNotExistException(__FILE__, __LINE__);
+ }
+ }
- if(!_verifier.verify(proxy))
+ ObjectProxySeq evictedProxies;
+ for(prx = proxies.begin(); prx != proxies.end(); ++prx)
+ {
+ if(!*prx) // We ignore null proxies.
{
- //
- // XXX - handle rejection here!
- //
+ continue;
}
+ ObjectPrx proxy = (*prx)->ice_twoway()->ice_secure(false); // We add proxies in default form.
+
EvictorMap::iterator p = _map.find(proxy->ice_getIdentity());
if(p == _map.end())