diff options
author | Benoit Foucher <benoit@zeroc.com> | 2019-09-06 15:43:45 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2019-09-06 15:44:35 +0200 |
commit | 550ae394d7e3f69f89684284859aa905f99789f1 (patch) | |
tree | d51935b04bb57cd4076450876be608f2b8c8b46a /cpp/src/IceGrid/AdapterCache.cpp | |
parent | NetworkProxy warnings running with python_d - Close #443 (diff) | |
download | ice-550ae394d7e3f69f89684284859aa905f99789f1.tar.bz2 ice-550ae394d7e3f69f89684284859aa905f99789f1.tar.xz ice-550ae394d7e3f69f89684284859aa905f99789f1.zip |
Fixed IceGrid locking issue, fixes #503
Diffstat (limited to 'cpp/src/IceGrid/AdapterCache.cpp')
-rw-r--r-- | cpp/src/IceGrid/AdapterCache.cpp | 81 |
1 files changed, 68 insertions, 13 deletions
diff --git a/cpp/src/IceGrid/AdapterCache.cpp b/cpp/src/IceGrid/AdapterCache.cpp index de67ae58543..941a653b5f3 100644 --- a/cpp/src/IceGrid/AdapterCache.cpp +++ b/cpp/src/IceGrid/AdapterCache.cpp @@ -170,6 +170,47 @@ typedef IceUtil::Handle<ReplicaGroupSyncCallback> ReplicaGroupSyncCallbackPtr; } +void +GetAdapterInfoResult::add(const ServerAdapterEntryPtr& adapter) +{ + AdapterInfo info; + info.id = adapter->getId(); + info.replicaGroupId = adapter->getReplicaGroupId(); + _adapters.push_back(info); + try + { + _results.push_back(adapter->getProxy("", true)->begin_getDirectProxy()); + } + catch(const SynchronizationException&) + { + _results.push_back(0); + } + catch(const Ice::Exception&) + { + _results.push_back(0); + } +} + +AdapterInfoSeq +GetAdapterInfoResult::get() +{ + vector<AdapterInfo>::iterator q = _adapters.begin(); + for(vector<Ice::AsyncResultPtr>::const_iterator p = _results.begin(); p != _results.end(); ++p, ++q) + { + try + { + if(*p) + { + q->proxy = AdapterPrx::uncheckedCast((*p)->getProxy())->end_getDirectProxy(*p); + } + } + catch(const Ice::Exception&) + { + } + } + return _adapters; +} + AdapterCache::AdapterCache(const Ice::CommunicatorPtr& communicator) : _communicator(communicator) { } @@ -405,26 +446,24 @@ ServerAdapterEntry::getLeastLoadedNodeLoad(LoadSample loadSample) const } AdapterInfoSeq -ServerAdapterEntry::getAdapterInfo() const +ServerAdapterEntry::getAdapterInfoNoEndpoints() const { AdapterInfo info; info.id = _id; info.replicaGroupId = _replicaGroupId; - try - { - info.proxy = _server->getAdapter(_id, true)->getDirectProxy(); - } - catch(const SynchronizationException&) - { - } - catch(const Ice::Exception&) - { - } AdapterInfoSeq infos; infos.push_back(info); return infos; } +GetAdapterInfoResultPtr +ServerAdapterEntry::getAdapterInfoAsync() const +{ + GetAdapterInfoResultPtr result = new GetAdapterInfoResult(); + result->add(const_cast<ServerAdapterEntry*>(this)); + return result; +} + AdapterPrx ServerAdapterEntry::getProxy(const string& replicaGroupId, bool upToDate) const { @@ -763,7 +802,7 @@ ReplicaGroupEntry::getLeastLoadedNodeLoad(LoadSample loadSample) const } AdapterInfoSeq -ReplicaGroupEntry::getAdapterInfo() const +ReplicaGroupEntry::getAdapterInfoNoEndpoints() const { // // This method is called with the database locked so we're sure @@ -778,13 +817,29 @@ ReplicaGroupEntry::getAdapterInfo() const AdapterInfoSeq infos; for(vector<ServerAdapterEntryPtr>::const_iterator p = replicas.begin(); p != replicas.end(); ++p) { - AdapterInfoSeq infs = (*p)->getAdapterInfo(); + AdapterInfoSeq infs = (*p)->getAdapterInfoNoEndpoints(); assert(infs.size() == 1); infos.push_back(infs[0]); } return infos; } +GetAdapterInfoResultPtr +ReplicaGroupEntry::getAdapterInfoAsync() const +{ + GetAdapterInfoResultPtr result = new GetAdapterInfoResult(); + vector<ServerAdapterEntryPtr> replicas; + { + Lock sync(*this); + replicas = _replicas; + } + for(vector<ServerAdapterEntryPtr>::const_iterator p = replicas.begin(); p != replicas.end(); ++p) + { + result->add(*p); + } + return result; +} + bool ReplicaGroupEntry::hasAdaptersFromOtherApplications() const { |