aboutsummaryrefslogtreecommitdiff
path: root/devel/ice/files/patch-cpp-src-IceGrid-AdapterCache.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'devel/ice/files/patch-cpp-src-IceGrid-AdapterCache.cpp')
-rw-r--r--devel/ice/files/patch-cpp-src-IceGrid-AdapterCache.cpp102
1 files changed, 102 insertions, 0 deletions
diff --git a/devel/ice/files/patch-cpp-src-IceGrid-AdapterCache.cpp b/devel/ice/files/patch-cpp-src-IceGrid-AdapterCache.cpp
new file mode 100644
index 000000000000..a0d8aba5a8b3
--- /dev/null
+++ b/devel/ice/files/patch-cpp-src-IceGrid-AdapterCache.cpp
@@ -0,0 +1,102 @@
+--- cpp/src/IceGrid/AdapterCache.cpp.orig 2013-03-11 15:19:47.000000000 +0000
++++ cpp/src/IceGrid/AdapterCache.cpp 2014-09-08 14:21:13.335195726 +0000
+@@ -202,8 +202,12 @@ AdapterCache::addServerAdapter(const AdapterDescriptor& desc, const ServerEntryP
+ ReplicaGroupEntryPtr repEntry = ReplicaGroupEntryPtr::dynamicCast(getImpl(desc.replicaGroupId));
+ if(!repEntry)
+ {
+- Ice::Error out(_communicator->getLogger());
+- out << "can't add adapter `" << desc.id << "' to unknown replica group `" << desc.replicaGroupId << "'";
++ //
++ // Add an un-assigned replica group, the replica group will in theory be added
++ // shortly after when its application is loaded.
++ //
++ repEntry = new ReplicaGroupEntry(*this, desc.replicaGroupId, "", new RandomLoadBalancingPolicy("0"));
++ addImpl(desc.replicaGroupId, repEntry);
+ }
+ repEntry->addReplica(desc.id, entry);
+ }
+@@ -213,13 +217,24 @@ void
+ AdapterCache::addReplicaGroup(const ReplicaGroupDescriptor& desc, const string& app)
+ {
+ Lock sync(*this);
+- if(getImpl(desc.id))
++ ReplicaGroupEntryPtr repEntry = ReplicaGroupEntryPtr::dynamicCast(getImpl(desc.id));
++ if(repEntry)
+ {
+- Ice::Error out(_communicator->getLogger());
+- out << "can't add duplicate replica group `" << desc.id << "'";
++ //
++ // If the replica group isn't assigned to an application,
++ // assign it. Otherwise, it's a duplicate so we log an error.
++ //
++ if(repEntry->getApplication().empty())
++ {
++ repEntry->update(app, desc.loadBalancing);
++ }
++ else
++ {
++ Ice::Error out(_communicator->getLogger());
++ out << "can't add duplicate replica group `" << desc.id << "'";
++ }
+ return;
+ }
+-
+ addImpl(desc.id, new ReplicaGroupEntry(*this, desc.id, app, desc.loadBalancing));
+ }
+
+@@ -258,7 +273,16 @@ AdapterCache::removeServerAdapter(const string& id)
+ Ice::Error out(_communicator->getLogger());
+ out << "can't remove adapter `" << id << "' from unknown replica group `" << replicaGroupId << "'";
+ }
+- repEntry->removeReplica(id);
++ else
++ {
++ //
++ // If the replica group is empty and it's not assigned, remove it.
++ //
++ if(repEntry->removeReplica(id))
++ {
++ removeImpl(replicaGroupId);
++ }
++ }
+ }
+ }
+
+@@ -440,7 +464,7 @@ ReplicaGroupEntry::ReplicaGroupEntry(AdapterCache& cache,
+ _lastReplica(0),
+ _requestInProgress(false)
+ {
+- update(policy);
++ update(application, policy);
+ }
+
+ bool
+@@ -502,7 +526,7 @@ ReplicaGroupEntry::addReplica(const string& /*replicaId*/, const ServerAdapterEn
+ _replicas.push_back(adapter);
+ }
+
+-void
++bool
+ ReplicaGroupEntry::removeReplica(const string& replicaId)
+ {
+ Lock sync(*this);
+@@ -516,14 +540,18 @@ ReplicaGroupEntry::removeReplica(const string& replicaId)
+ break;
+ }
+ }
++
++ // Replica group can be removed if not assigned to an application and there's no more replicas
++ return _replicas.empty() && _application.empty();
+ }
+
+ void
+-ReplicaGroupEntry::update(const LoadBalancingPolicyPtr& policy)
++ReplicaGroupEntry::update(const string& application, const LoadBalancingPolicyPtr& policy)
+ {
+ Lock sync(*this);
+ assert(policy);
+
++ _application = application;
+ _loadBalancing = policy;
+
+ istringstream is(_loadBalancing->nReplicas);