summaryrefslogtreecommitdiff
path: root/cpp/src/IceGrid/AdapterCache.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2019-09-06 15:43:45 +0200
committerBenoit Foucher <benoit@zeroc.com>2019-09-06 15:44:35 +0200
commit550ae394d7e3f69f89684284859aa905f99789f1 (patch)
treed51935b04bb57cd4076450876be608f2b8c8b46a /cpp/src/IceGrid/AdapterCache.cpp
parentNetworkProxy warnings running with python_d - Close #443 (diff)
downloadice-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.cpp81
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
{