summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/LocatorInfo.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2009-01-22 10:20:46 +0100
committerBenoit Foucher <benoit@zeroc.com>2009-01-22 10:20:46 +0100
commit835547130d5644346a3303deee7ed52511ce2a6f (patch)
treed731c827129cdfbaa11b129d0dc7494ac7ad1377 /cpp/src/Ice/LocatorInfo.cpp
parentbug 3659 - updating applet demo README (diff)
downloadice-835547130d5644346a3303deee7ed52511ce2a6f.tar.bz2
ice-835547130d5644346a3303deee7ed52511ce2a6f.tar.xz
ice-835547130d5644346a3303deee7ed52511ce2a6f.zip
More fixes for bug3504 and fixed bug3506
Diffstat (limited to 'cpp/src/Ice/LocatorInfo.cpp')
-rw-r--r--cpp/src/Ice/LocatorInfo.cpp766
1 files changed, 330 insertions, 436 deletions
diff --git a/cpp/src/Ice/LocatorInfo.cpp b/cpp/src/Ice/LocatorInfo.cpp
index 0113f80a868..a2cc09ff1af 100644
--- a/cpp/src/Ice/LocatorInfo.cpp
+++ b/cpp/src/Ice/LocatorInfo.cpp
@@ -16,6 +16,7 @@
#include <Ice/EndpointI.h>
#include <Ice/Reference.h>
#include <Ice/Functional.h>
+#include <Ice/Properties.h>
#include <iterator>
using namespace std;
@@ -33,168 +34,84 @@ class ObjectRequest : public LocatorInfo::Request, public Ice::AMI_Locator_findO
{
public:
- ObjectRequest(const LocatorInfoPtr& locatorInfo, const Ice::Identity& id) : Request(locatorInfo), _id(id)
+ ObjectRequest(const LocatorInfoPtr& locatorInfo, const ReferencePtr& ref) : Request(locatorInfo, ref)
{
+ assert(ref->isWellKnown());
}
virtual void ice_response(const Ice::ObjectPrx& proxy)
{
- _locatorInfo->removeObjectRequest(_id);
response(proxy);
}
virtual void ice_exception(const Ice::Exception& ex)
{
- _locatorInfo->removeObjectRequest(_id);
exception(ex);
}
- virtual void send()
+ virtual void send(bool async)
{
- _locatorInfo->getLocator()->findObjectById_async(this, _id);
+ try
+ {
+ if(async)
+ {
+ _locatorInfo->getLocator()->findObjectById_async(this, _ref->getIdentity());
+ }
+ else
+ {
+ ice_response(_locatorInfo->getLocator()->findObjectById(_ref->getIdentity()));
+ }
+ }
+ catch(const Ice::Exception& ex)
+ {
+ ice_exception(ex);
+ }
}
-
-private:
-
- const Ice::Identity _id;
};
class AdapterRequest : public LocatorInfo::Request, public Ice::AMI_Locator_findAdapterById
{
public:
- AdapterRequest(const LocatorInfoPtr& locatorInfo, const string& id) : Request(locatorInfo), _id(id)
+ AdapterRequest(const LocatorInfoPtr& locatorInfo, const ReferencePtr& ref) : Request(locatorInfo, ref)
{
+ assert(ref->isIndirect() && !ref->isWellKnown());
}
virtual void ice_response(const Ice::ObjectPrx& proxy)
{
- _locatorInfo->removeAdapterRequest(_id);
response(proxy);
}
virtual void ice_exception(const Ice::Exception& ex)
{
- _locatorInfo->removeAdapterRequest(_id);
exception(ex);
}
- virtual void send()
- {
- _locatorInfo->getLocator()->findAdapterById_async(this, _id);
- }
-
-private:
-
- const string _id;
-};
-
-class ObjectRequestCallback : public LocatorInfo::RequestCallback
-{
-public:
-
- virtual void
- response(const LocatorInfoPtr& locatorInfo, const Ice::ObjectPrx& object)
+ virtual void send(bool async)
{
- locatorInfo->getWellKnownObjectEndpoints(_reference, object, _ttl, false, _callback);
- }
-
- virtual void
- exception(const LocatorInfoPtr& locatorInfo, const Ice::Exception& ex)
- {
- if(dynamic_cast<const Ice::CollocationOptimizationException*>(&ex))
- {
- try
- {
- bool cached;
- vector<EndpointIPtr> endpoints = locatorInfo->getEndpoints(_reference, _ttl, cached);
- _callback->setEndpoints(endpoints, cached);
- }
- catch(const Ice::LocalException& e)
- {
- _callback->setException(e);
- }
- }
- else
- {
- locatorInfo->getEndpointsException(_reference, ex, _callback);
- }
- }
-
- ObjectRequestCallback(const ReferencePtr& ref, int ttl, const LocatorInfo::GetEndpointsCallbackPtr& cb) :
- _reference(ref), _ttl(ttl), _callback(cb)
- {
- }
-
-private:
-
- const ReferencePtr _reference;
- int _ttl;
- const LocatorInfo::GetEndpointsCallbackPtr _callback;
-};
-
-class AdapterRequestCallback : public LocatorInfo::RequestCallback
-{
-public:
-
- virtual void
- response(const LocatorInfoPtr& locatorInfo, const Ice::ObjectPrx& object)
- {
- vector<EndpointIPtr> endpoints;
- if(object)
- {
- endpoints = object->__reference()->getEndpoints();
- if(!endpoints.empty())
- {
- locatorInfo->getTable()->addAdapterEndpoints(_reference->getAdapterId(), endpoints);
- }
- }
-
- if(_reference->getInstance()->traceLevels()->location >= 1)
- {
- locatorInfo->getEndpointsTrace(_reference, endpoints, false);
- }
-
- _callback->setEndpoints(endpoints, false);
- }
-
- virtual void
- exception(const LocatorInfoPtr& locatorInfo, const Ice::Exception& ex)
- {
- if(dynamic_cast<const Ice::CollocationOptimizationException*>(&ex))
+ try
{
- try
+ if(async)
{
- bool cached;
- vector<EndpointIPtr> endpoints = locatorInfo->getEndpoints(_reference, _ttl, cached);
- _callback->setEndpoints(endpoints, cached);
+ _locatorInfo->getLocator()->findAdapterById_async(this, _ref->getAdapterId());
}
- catch(const Ice::LocalException& e)
+ else
{
- _callback->setException(e);
+ ice_response(_locatorInfo->getLocator()->findAdapterById(_ref->getAdapterId()));
}
}
- else
+ catch(const Ice::Exception& ex)
{
- locatorInfo->getEndpointsException(_reference, ex, _callback);
+ ice_exception(ex);
}
}
-
- AdapterRequestCallback(const ReferencePtr& ref, int ttl, const LocatorInfo::GetEndpointsCallbackPtr& callback) :
- _reference(ref), _ttl(ttl), _callback(callback)
- {
- }
-
-private:
-
- const ReferencePtr _reference;
- const int _ttl;
- const LocatorInfo::GetEndpointsCallbackPtr _callback;
};
}
-IceInternal::LocatorManager::LocatorManager() :
+IceInternal::LocatorManager::LocatorManager(const Ice::PropertiesPtr& properties) :
+ _background(properties->getPropertyAsInt("Ice.BackgroundLocatorCacheUpdates") > 0),
_tableHint(_table.end())
{
}
@@ -260,7 +177,8 @@ IceInternal::LocatorManager::get(const LocatorPrx& loc)
_tableHint = _table.insert(_tableHint,
pair<const LocatorPrx, LocatorInfoPtr>(locator,
- new LocatorInfo(locator, t->second)));
+ new LocatorInfo(locator, t->second,
+ _background)));
}
else
{
@@ -295,10 +213,10 @@ IceInternal::LocatorTable::getAdapterEndpoints(const string& adapter, int ttl, v
map<string, pair<IceUtil::Time, vector<EndpointIPtr> > >::iterator p = _adapterEndpointsMap.find(adapter);
- if(p != _adapterEndpointsMap.end() && checkTTL(p->second.first, ttl))
+ if(p != _adapterEndpointsMap.end())
{
endpoints = p->second.second;
- return true;
+ return checkTTL(p->second.first, ttl);
}
return false;
}
@@ -340,7 +258,7 @@ IceInternal::LocatorTable::removeAdapterEndpoints(const string& adapter)
}
bool
-IceInternal::LocatorTable::getProxy(const Identity& id, int ttl, ObjectPrx& proxy)
+IceInternal::LocatorTable::getObjectReference(const Identity& id, int ttl, ReferencePtr& ref)
{
if(ttl == 0) // No locator cache
{
@@ -349,47 +267,47 @@ IceInternal::LocatorTable::getProxy(const Identity& id, int ttl, ObjectPrx& prox
IceUtil::Mutex::Lock sync(*this);
- map<Identity, pair<IceUtil::Time, ObjectPrx> >::iterator p = _objectMap.find(id);
+ map<Identity, pair<IceUtil::Time, ReferencePtr> >::iterator p = _objectMap.find(id);
- if(p != _objectMap.end() && checkTTL(p->second.first, ttl))
+ if(p != _objectMap.end())
{
- proxy = p->second.second;
- return true;
+ ref = p->second.second;
+ return checkTTL(p->second.first, ttl);
}
return false;
}
void
-IceInternal::LocatorTable::addProxy(const Identity& id, const ObjectPrx& proxy)
+IceInternal::LocatorTable::addObjectReference(const Identity& id, const ReferencePtr& ref)
{
IceUtil::Mutex::Lock sync(*this);
- map<Identity, pair<IceUtil::Time, ObjectPrx> >::iterator p = _objectMap.find(id);
+ map<Identity, pair<IceUtil::Time, ReferencePtr> >::iterator p = _objectMap.find(id);
if(p != _objectMap.end())
{
- p->second = make_pair(IceUtil::Time::now(IceUtil::Time::Monotonic), proxy);
+ p->second = make_pair(IceUtil::Time::now(IceUtil::Time::Monotonic), ref);
}
else
{
- _objectMap.insert(make_pair(id, make_pair(IceUtil::Time::now(IceUtil::Time::Monotonic), proxy)));
+ _objectMap.insert(make_pair(id, make_pair(IceUtil::Time::now(IceUtil::Time::Monotonic), ref)));
}
}
-ObjectPrx
-IceInternal::LocatorTable::removeProxy(const Identity& id)
+ReferencePtr
+IceInternal::LocatorTable::removeObjectReference(const Identity& id)
{
IceUtil::Mutex::Lock sync(*this);
- map<Identity, pair<IceUtil::Time, ObjectPrx> >::iterator p = _objectMap.find(id);
+ map<Identity, pair<IceUtil::Time, ReferencePtr> >::iterator p = _objectMap.find(id);
if(p == _objectMap.end())
{
return 0;
}
- ObjectPrx proxy = p->second.second;
+ ReferencePtr ref = p->second.second;
_objectMap.erase(p);
- return proxy;
+ return ref;
}
bool
@@ -406,83 +324,157 @@ IceInternal::LocatorTable::checkTTL(const IceUtil::Time& time, int ttl) const
}
}
+void
+IceInternal::LocatorInfo::RequestCallback::response(const LocatorInfoPtr& locatorInfo, const Ice::ObjectPrx& proxy)
+{
+ vector<EndpointIPtr> endpoints;
+ if(proxy)
+ {
+ ReferencePtr r = proxy->__reference();
+ if(!r->isIndirect())
+ {
+ endpoints = r->getEndpoints();
+ }
+ else if(_ref->isWellKnown() && !r->isWellKnown())
+ {
+ //
+ // We're resolving the endpoints of a well-known object and the proxy returned
+ // by the locator is an indirect proxy. We now need to resolve the endpoints
+ // of this indirect proxy.
+ //
+ locatorInfo->getEndpoints(r, _ref, _ttl, _callback);
+ return;
+ }
+ }
+
+ if(_ref->getInstance()->traceLevels()->location >= 1)
+ {
+ locatorInfo->getEndpointsTrace(_ref, endpoints, false);
+ }
+ if(_callback)
+ {
+ _callback->setEndpoints(endpoints, false);
+ }
+}
+
+void
+IceInternal::LocatorInfo::RequestCallback::exception(const LocatorInfoPtr& locatorInfo, const Ice::Exception& exc)
+{
+ try
+ {
+ locatorInfo->getEndpointsException(_ref, exc); // This throws.
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ if(_callback)
+ {
+ _callback->setException(ex);
+ }
+ }
+}
+
+IceInternal::LocatorInfo::RequestCallback::RequestCallback(const ReferencePtr& ref,
+ int ttl,
+ const GetEndpointsCallbackPtr& cb) :
+ _ref(ref), _ttl(ttl), _callback(cb)
+{
+}
+
void
-IceInternal::LocatorInfo::Request::addCallback(const RequestCallbackPtr& callback)
+IceInternal::LocatorInfo::Request::addCallback(const ReferencePtr& ref,
+ const ReferencePtr& wellKnownRef,
+ int ttl,
+ const GetEndpointsCallbackPtr& cb)
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_monitor);
+
+ RequestCallbackPtr callback = new RequestCallback(ref, ttl, cb);
if(_response)
{
callback->response(_locatorInfo, _proxy);
- return;
}
else if(_exception.get())
{
callback->exception(_locatorInfo, *_exception.get());
- return;
}
-
- _callbacks.push_back(callback);
-
- if(!_sent)
+ else
{
- _sent = true;
- try
+ _callbacks.push_back(callback);
+ if(wellKnownRef) // This request is to resolve the endpoints of a cached well-known object reference
{
- send();
+ _wellKnownRefs.push_back(wellKnownRef);
}
- catch(const Ice::Exception& ex)
+ if(!_sent)
{
+ _sent = true;
sync.release();
- exception(ex);
- sync.acquire();
+ send(true); // send() might call exception() from this thread so we need to release the mutex.
}
}
}
-Ice::ObjectPrx
-IceInternal::LocatorInfo::Request::getProxy()
+vector<EndpointIPtr>
+IceInternal::LocatorInfo::Request::getEndpoints(const ReferencePtr& ref,
+ const ReferencePtr& wellKnownRef,
+ int ttl,
+ bool& cached)
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_monitor);
- if(_response)
- {
- return _proxy;
- }
- else if(_exception.get())
- {
- _exception->ice_throw();
- return 0; // Keep the compiler happy.
- }
-
- if(!_sent)
+ if(!_response || _exception.get())
{
- _sent = true;
- try
+ if(wellKnownRef) // This request is to resolve the endpoints of a cached well-known object reference
{
- send();
+ _wellKnownRefs.push_back(wellKnownRef);
}
- catch(const Ice::Exception& ex)
+ if(!_sent)
{
+ _sent = true;
sync.release();
- exception(ex);
+ send(true); // send() might call exception() from this thread so we need to release the mutex.
sync.acquire();
}
- }
-
- while(!_response && !_exception.get())
- {
- _monitor.wait();
+
+ while(!_response && !_exception.get())
+ {
+ _monitor.wait();
+ }
}
if(_exception.get())
{
- _exception->ice_throw();
+ _locatorInfo->getEndpointsException(ref, *_exception.get()); // This throws.
}
+
assert(_response);
- return _proxy;
+ vector<EndpointIPtr> endpoints;
+ if(_proxy)
+ {
+ ReferencePtr r = _proxy->__reference();
+ if(!r->isIndirect())
+ {
+ endpoints = r->getEndpoints();
+ }
+ else if(ref->isWellKnown() && !r->isWellKnown())
+ {
+ //
+ // We're resolving the endpoints of a well-known object and the proxy returned
+ // by the locator is an indirect proxy. We now need to resolve the endpoints
+ // of this indirect proxy.
+ //
+ return _locatorInfo->getEndpoints(r, ref, ttl, cached);
+ }
+ }
+
+ cached = false;
+ if(_ref->getInstance()->traceLevels()->location >= 1)
+ {
+ _locatorInfo->getEndpointsTrace(ref, endpoints, false);
+ }
+ return endpoints;
}
-IceInternal::LocatorInfo::Request::Request(const LocatorInfoPtr& locatorInfo) :
- _locatorInfo(locatorInfo), _sent(false), _response(false)
+IceInternal::LocatorInfo::Request::Request(const LocatorInfoPtr& locatorInfo, const ReferencePtr& ref) :
+ _locatorInfo(locatorInfo), _ref(ref), _sent(false), _response(false)
{
}
@@ -490,6 +482,7 @@ void
IceInternal::LocatorInfo::Request::response(const Ice::ObjectPrx& proxy)
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_monitor);
+ _locatorInfo->finishRequest(_ref, _wellKnownRefs, proxy, false);
_response = true;
_proxy = proxy;
for(vector<RequestCallbackPtr>::const_iterator p = _callbacks.begin(); p != _callbacks.end(); ++p)
@@ -502,7 +495,14 @@ IceInternal::LocatorInfo::Request::response(const Ice::ObjectPrx& proxy)
void
IceInternal::LocatorInfo::Request::exception(const Ice::Exception& ex)
{
+ if(dynamic_cast<const Ice::CollocationOptimizationException*>(&ex))
+ {
+ send(false); // Use synchronous collocation optimized locator request instead.
+ return;
+ }
+
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_monitor);
+ _locatorInfo->finishRequest(_ref, _wellKnownRefs, 0, dynamic_cast<const Ice::UserException*>(&ex));
_exception.reset(ex.ice_clone());
for(vector<RequestCallbackPtr>::const_iterator p = _callbacks.begin(); p != _callbacks.end(); ++p)
{
@@ -511,9 +511,10 @@ IceInternal::LocatorInfo::Request::exception(const Ice::Exception& ex)
_monitor.notifyAll();
}
-IceInternal::LocatorInfo::LocatorInfo(const LocatorPrx& locator, const LocatorTablePtr& table) :
+IceInternal::LocatorInfo::LocatorInfo(const LocatorPrx& locator, const LocatorTablePtr& table, bool background) :
_locator(locator),
- _table(table)
+ _table(table),
+ _background(background)
{
assert(_locator);
assert(_table);
@@ -574,174 +575,116 @@ IceInternal::LocatorInfo::getLocatorRegistry()
}
vector<EndpointIPtr>
-IceInternal::LocatorInfo::getEndpoints(const ReferencePtr& ref, int ttl, bool& cached)
+IceInternal::LocatorInfo::getEndpoints(const ReferencePtr& ref, const ReferencePtr& wellKnownRef, int ttl, bool& cached)
{
assert(ref->isIndirect());
vector<EndpointIPtr> endpoints;
- ObjectPrx object;
- cached = true;
- try
+ if(!ref->isWellKnown())
{
- if(!ref->isWellKnown())
+ if(!_table->getAdapterEndpoints(ref->getAdapterId(), ttl, endpoints))
{
- if(!_table->getAdapterEndpoints(ref->getAdapterId(), ttl, endpoints))
+ if(_background && !endpoints.empty())
{
- cached = false;
-
- if(ref->getInstance()->traceLevels()->location >= 1)
- {
- Trace out(ref->getInstance()->initializationData().logger,
- ref->getInstance()->traceLevels()->locationCat);
- out << "searching for adapter by id" << "\n";
- out << "adapter = " << ref->getAdapterId();
- }
-
- RequestPtr request = getAdapterRequest(ref->getAdapterId());
- object = request->getProxy();
- if(object)
- {
- endpoints = object->__reference()->getEndpoints();
- _table->addAdapterEndpoints(ref->getAdapterId(), endpoints);
- }
+ getAdapterRequest(ref)->addCallback(ref, wellKnownRef, ttl, 0);
}
- }
- else
- {
- bool objectCached = true;
- if(!_table->getProxy(ref->getIdentity(), ttl, object))
+ else
{
- if(ref->getInstance()->traceLevels()->location >= 1)
- {
- Trace out(ref->getInstance()->initializationData().logger,
- ref->getInstance()->traceLevels()->locationCat);
- out << "searching for object by id" << "\n";
- out << "object = " << ref->getInstance()->identityToString(ref->getIdentity());
- }
-
- objectCached = false;
- RequestPtr request = getObjectRequest(ref->getIdentity());
- object = request->getProxy();
+ return getAdapterRequest(ref)->getEndpoints(ref, wellKnownRef, ttl, cached);
}
-
- bool endpointsCached = true;
- if(object)
+ }
+ }
+ else
+ {
+ ReferencePtr r;
+ if(!_table->getObjectReference(ref->getIdentity(), ttl, r))
+ {
+ if(_background && r)
{
- ReferencePtr r = object->__reference();
- if(!r->isIndirect())
- {
- endpointsCached = false;
- endpoints = r->getEndpoints();
- }
- else if(!r->isWellKnown())
- {
- endpoints = getEndpoints(r, ttl, endpointsCached);
- }
+ getObjectRequest(ref)->addCallback(ref, 0, ttl, 0);
}
-
- if(!objectCached && !endpoints.empty())
+ else
{
- _table->addProxy(ref->getIdentity(), object);
+ return getObjectRequest(ref)->getEndpoints(ref, 0, ttl, cached);
}
+ }
- cached = objectCached || endpointsCached;
+ if(!r->isIndirect())
+ {
+ endpoints = r->getEndpoints();
+ }
+ else if(!r->isWellKnown())
+ {
+ return getEndpoints(r, ref, ttl, cached);
}
- }
- catch(const Ice::Exception& ex)
- {
- getEndpointsException(ref, ex);
}
+ assert(!endpoints.empty());
+ cached = true;
if(ref->getInstance()->traceLevels()->location >= 1)
{
- getEndpointsTrace(ref, endpoints, cached);
+ getEndpointsTrace(ref, endpoints, true);
}
-
return endpoints;
}
void
-IceInternal::LocatorInfo::getEndpoints(const ReferencePtr& ref, int ttl, const GetEndpointsCallbackPtr& callback)
+IceInternal::LocatorInfo::getEndpoints(const ReferencePtr& ref,
+ const ReferencePtr& wellKnownRef,
+ int ttl,
+ const GetEndpointsCallbackPtr& callback)
{
assert(ref->isIndirect());
-
- string adapterId = ref->getAdapterId();
- Ice::Identity identity = ref->getIdentity();
- InstancePtr instance = ref->getInstance();
- if(!adapterId.empty())
+ vector<EndpointIPtr> endpoints;
+ if(!ref->isWellKnown())
{
- vector<EndpointIPtr> endpoints;
- if(!_table->getAdapterEndpoints(adapterId, ttl, endpoints))
+ if(!_table->getAdapterEndpoints(ref->getAdapterId(), ttl, endpoints))
{
- if(instance->traceLevels()->location >= 1)
+ if(_background && !endpoints.empty())
{
- Trace out(instance->initializationData().logger, instance->traceLevels()->locationCat);
- out << "searching for adapter by id" << "\nadapter = " << adapterId;
+ getAdapterRequest(ref)->addCallback(ref, wellKnownRef, ttl, 0);
}
-
- //
- // Search the adapter in the location service if we didn't
- // find it in the cache.
- //
- RequestPtr request = getAdapterRequest(adapterId);
- request->addCallback(new AdapterRequestCallback(ref, ttl, callback));
- return;
- }
- else
- {
- if(instance->traceLevels()->location >= 1)
+ else
{
- getEndpointsTrace(ref, endpoints, true);
+ getAdapterRequest(ref)->addCallback(ref, wellKnownRef, ttl, callback);
+ return;
}
- callback->setEndpoints(endpoints, true);
- return;
}
}
else
{
- Ice::ObjectPrx object;
- if(!_table->getProxy(identity, ttl, object))
+ ReferencePtr r;
+ if(!_table->getObjectReference(ref->getIdentity(), ttl, r))
{
- if(instance->traceLevels()->location >= 1)
+ if(_background && r)
+ {
+ getObjectRequest(ref)->addCallback(ref, 0, ttl, 0);
+ }
+ else
{
- Trace out(instance->initializationData().logger, instance->traceLevels()->locationCat);
- out << "searching for object by id" << "\nobject = " << instance->identityToString(ref->getIdentity());
+ getObjectRequest(ref)->addCallback(ref, 0, ttl, callback);
+ return;
}
+ }
- RequestPtr request = getObjectRequest(identity);
- request->addCallback(new ObjectRequestCallback(ref, ttl, callback));
- return;
+ if(!r->isIndirect())
+ {
+ endpoints = r->getEndpoints();
}
- else
+ else if(!r->isWellKnown())
{
- getWellKnownObjectEndpoints(ref, object, ttl, true, callback);
+ getEndpoints(r, ref, ttl, callback);
return;
}
}
-}
-void
-IceInternal::LocatorInfo::clearObjectCache(const ReferencePtr& ref)
-{
- assert(ref->isIndirect());
-
- if(ref->isWellKnown())
+ assert(!endpoints.empty());
+ if(ref->getInstance()->traceLevels()->location >= 1)
{
- ObjectPrx object = _table->removeProxy(ref->getIdentity());
- if(object)
- {
- ReferencePtr r = object->__reference();
- if(!r->isIndirect())
- {
- if(ref->getInstance()->traceLevels()->location >= 2)
- {
- trace("removed endpoints from locator table", ref, r->getEndpoints());
- }
- }
- else if(!r->isWellKnown())
- {
- clearCache(r);
- }
- }
+ getEndpointsTrace(ref, endpoints, true);
+ }
+ if(callback)
+ {
+ callback->setEndpoints(endpoints, true);
}
}
@@ -761,10 +704,9 @@ IceInternal::LocatorInfo::clearCache(const ReferencePtr& ref)
}
else
{
- ObjectPrx object = _table->removeProxy(ref->getIdentity());
- if(object)
+ ReferencePtr r = _table->removeObjectReference(ref->getIdentity());
+ if(r)
{
- ReferencePtr r = object->__reference();
if(!r->isIndirect())
{
if(ref->getInstance()->traceLevels()->location >= 2)
@@ -780,29 +722,6 @@ IceInternal::LocatorInfo::clearCache(const ReferencePtr& ref)
}
}
-void
-IceInternal::LocatorInfo::trace(const string& msg, const ReferencePtr& ref, const vector<EndpointIPtr>& endpoints)
-{
- assert(ref->isIndirect());
-
- Trace out(ref->getInstance()->initializationData().logger, ref->getInstance()->traceLevels()->locationCat);
- out << msg << '\n';
- if(!ref->isWellKnown())
- {
- out << "adapter = " << ref->getAdapterId() << '\n';
- }
- else
- {
- out << "object = " << ref->getInstance()->identityToString(ref->getIdentity()) << '\n';
- }
-
- const char* sep = endpoints.size() > 1 ? ":" : "";
- ostringstream o;
- transform(endpoints.begin(), endpoints.end(), ostream_iterator<string>(o, sep),
- Ice::constMemFun(&Endpoint::toString));
- out << "endpoints = " << o.str();
-}
-
void
IceInternal::LocatorInfo::getEndpointsException(const ReferencePtr& ref, const Ice::Exception& exc)
{
@@ -867,101 +786,9 @@ IceInternal::LocatorInfo::getEndpointsException(const ReferencePtr& ref, const I
}
}
-void
-IceInternal::LocatorInfo::getEndpointsException(const ReferencePtr& ref, const Ice::Exception& exc,
- const GetEndpointsCallbackPtr& callback)
-{
- try
- {
- getEndpointsException(ref, exc);
- }
- catch(const Ice::LocalException& ex)
- {
- callback->setException(ex);
- }
-}
-
void
-IceInternal::LocatorInfo::getWellKnownObjectEndpoints(const ReferencePtr& ref,
- const Ice::ObjectPrx& object,
- int ttl,
- bool objectCached,
- const GetEndpointsCallbackPtr& callback)
-{
- class Callback : public GetEndpointsCallback
- {
- public:
-
- virtual void
- setEndpoints(const vector<EndpointIPtr>& endpoints, bool endpointsCached)
- {
- if(!_objectCached && !endpoints.empty())
- {
- _table->addProxy(_reference->getIdentity(), _object);
- }
-
- if(_reference->getInstance()->traceLevels()->location >= 1)
- {
- _locatorInfo->getEndpointsTrace(_reference, endpoints, _objectCached || endpointsCached);
- }
-
- _callback->setEndpoints(endpoints, _objectCached || endpointsCached);
- }
-
- virtual void
- setException(const Ice::LocalException& ex)
- {
- _callback->setException(ex);
- }
-
- Callback(const LocatorInfoPtr& locatorInfo, const LocatorTablePtr& table,
- const ReferencePtr& reference, const Ice::ObjectPrx& object,
- bool objectCached, const GetEndpointsCallbackPtr& callback) :
- _locatorInfo(locatorInfo), _table(table), _reference(reference), _object(object),
- _objectCached(objectCached), _callback(callback)
- {
- }
-
- private:
-
- const LocatorInfoPtr _locatorInfo;
- const LocatorTablePtr _table;
- const ReferencePtr _reference;
- const Ice::ObjectPrx _object;
- const bool _objectCached;
- const GetEndpointsCallbackPtr _callback;
- };
-
- vector<EndpointIPtr> endpoints;
- if(object)
- {
- ReferencePtr r = object->__reference();
- if(!r->isIndirect())
- {
- endpoints = r->getEndpoints();
- }
- else if(!r->isWellKnown())
- {
- getEndpoints(r, ttl, new Callback(this, _table, ref, object, objectCached, callback));
- return;
- }
- }
-
- if(!objectCached && !endpoints.empty())
- {
- _table->addProxy(ref->getIdentity(), object);
- }
-
- if(ref->getInstance()->traceLevels()->location >= 1)
- {
- getEndpointsTrace(ref, endpoints, objectCached);
- }
-
- callback->setEndpoints(endpoints, objectCached);
-}
-
-void
-IceInternal::LocatorInfo::getEndpointsTrace(const ReferencePtr& ref, const vector<EndpointIPtr>& endpoints,
+IceInternal::LocatorInfo::getEndpointsTrace(const ReferencePtr& ref,
+ const vector<EndpointIPtr>& endpoints,
bool cached)
{
if(!endpoints.empty())
@@ -992,49 +819,116 @@ IceInternal::LocatorInfo::getEndpointsTrace(const ReferencePtr& ref, const vecto
}
}
+void
+IceInternal::LocatorInfo::trace(const string& msg, const ReferencePtr& ref, const vector<EndpointIPtr>& endpoints)
+{
+ assert(ref->isIndirect());
+
+ Trace out(ref->getInstance()->initializationData().logger, ref->getInstance()->traceLevels()->locationCat);
+ out << msg << '\n';
+ if(!ref->isWellKnown())
+ {
+ out << "adapter = " << ref->getAdapterId() << '\n';
+ }
+ else
+ {
+ out << "object = " << ref->getInstance()->identityToString(ref->getIdentity()) << '\n';
+ }
+
+ const char* sep = endpoints.size() > 1 ? ":" : "";
+ ostringstream o;
+ transform(endpoints.begin(), endpoints.end(), ostream_iterator<string>(o, sep),
+ Ice::constMemFun(&Endpoint::toString));
+ out << "endpoints = " << o.str();
+}
+
IceInternal::LocatorInfo::RequestPtr
-IceInternal::LocatorInfo::getAdapterRequest(const string& id)
+IceInternal::LocatorInfo::getAdapterRequest(const ReferencePtr& ref)
{
IceUtil::Mutex::Lock sync(*this);
- map<string, RequestPtr>::const_iterator p = _adapterRequests.find(id);
+ if(ref->getInstance()->traceLevels()->location >= 1)
+ {
+ Trace out(ref->getInstance()->initializationData().logger, ref->getInstance()->traceLevels()->locationCat);
+ out << "searching for adapter by id\nadapter = " << ref->getAdapterId();
+ }
+
+ map<string, RequestPtr>::const_iterator p = _adapterRequests.find(ref->getAdapterId());
if(p != _adapterRequests.end())
{
return p->second;
}
- RequestPtr request = new AdapterRequest(this, id);
- _adapterRequests.insert(make_pair(id, request));
+ RequestPtr request = new AdapterRequest(this, ref);
+ _adapterRequests.insert(make_pair(ref->getAdapterId(), request));
return request;
}
-void
-IceInternal::LocatorInfo::removeAdapterRequest(const string& id)
-{
- IceUtil::Mutex::Lock sync(*this);
- assert(_adapterRequests.find(id) != _adapterRequests.end());
- _adapterRequests.erase(id);
-}
-
IceInternal::LocatorInfo::RequestPtr
-IceInternal::LocatorInfo::getObjectRequest(const Ice::Identity& id)
+IceInternal::LocatorInfo::getObjectRequest(const ReferencePtr& ref)
{
IceUtil::Mutex::Lock sync(*this);
- map<Ice::Identity, RequestPtr>::const_iterator p = _objectRequests.find(id);
+ if(ref->getInstance()->traceLevels()->location >= 1)
+ {
+ Trace out(ref->getInstance()->initializationData().logger, ref->getInstance()->traceLevels()->locationCat);
+ out << "searching for object by id\nobject = " << ref->getInstance()->identityToString(ref->getIdentity());
+ }
+
+ map<Ice::Identity, RequestPtr>::const_iterator p = _objectRequests.find(ref->getIdentity());
if(p != _objectRequests.end())
{
return p->second;
}
-
- RequestPtr request = new ObjectRequest(this, id);
- _objectRequests.insert(make_pair(id, request));
+ RequestPtr request = new ObjectRequest(this, ref);
+ _objectRequests.insert(make_pair(ref->getIdentity(), request));
return request;
}
void
-IceInternal::LocatorInfo::removeObjectRequest(const Ice::Identity& id)
+IceInternal::LocatorInfo::finishRequest(const ReferencePtr& ref,
+ const vector<ReferencePtr>& wellKnownRefs,
+ const Ice::ObjectPrx& proxy,
+ bool notRegistered)
{
- IceUtil::Mutex::Lock sync(*this);
- assert(_objectRequests.find(id) != _objectRequests.end());
- _objectRequests.erase(id);
-}
+ if(!proxy || proxy->__reference()->isIndirect())
+ {
+ //
+ // Remove the cached references of well-known objects for which we tried
+ // to resolved the endpoints if these endpoints are empty.
+ //
+ for(vector<ReferencePtr>::const_iterator q = wellKnownRefs.begin(); q != wellKnownRefs.end(); ++q)
+ {
+ _table->removeObjectReference((*q)->getIdentity());
+ }
+ }
+
+ if(!ref->isWellKnown())
+ {
+ if(proxy && !proxy->__reference()->isIndirect()) // Cache the adapter endpoints.
+ {
+ _table->addAdapterEndpoints(ref->getAdapterId(), proxy->__reference()->getEndpoints());
+ }
+ else if(notRegistered) // If the adapter isn't registered anymore, remove it from the cache.
+ {
+ _table->removeAdapterEndpoints(ref->getAdapterId());
+ }
+ IceUtil::Mutex::Lock sync(*this);
+ assert(_adapterRequests.find(ref->getAdapterId()) != _adapterRequests.end());
+ _adapterRequests.erase(ref->getAdapterId());
+ }
+ else
+ {
+ if(proxy && !proxy->__reference()->isWellKnown()) // Cache the well-known object reference.
+ {
+ _table->addObjectReference(ref->getIdentity(), proxy->__reference());
+ }
+ else if(notRegistered) // If the well-known object isn't registered anymore, remove it from the cache.
+ {
+ _table->removeObjectReference(ref->getIdentity());
+ }
+
+ IceUtil::Mutex::Lock sync(*this);
+ assert(_objectRequests.find(ref->getIdentity()) != _objectRequests.end());
+ _objectRequests.erase(ref->getIdentity());
+ }
+}