summaryrefslogtreecommitdiff
path: root/cpp/src/IceGrid/AdapterCache.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2014-04-15 09:41:21 +0200
committerBenoit Foucher <benoit@zeroc.com>2014-04-15 09:41:21 +0200
commit54884a0b4c139118fc49498b6d6715d7d9ab718c (patch)
tree1f00091ad68543b3dc9828f27e32c0d9f7d072fe /cpp/src/IceGrid/AdapterCache.cpp
parentVC11 fixes for PHP 5.5 (diff)
downloadice-54884a0b4c139118fc49498b6d6715d7d9ab718c.tar.bz2
ice-54884a0b4c139118fc49498b6d6715d7d9ab718c.tar.xz
ice-54884a0b4c139118fc49498b6d6715d7d9ab718c.zip
Added support for IceGrid custom load balancing
Diffstat (limited to 'cpp/src/IceGrid/AdapterCache.cpp')
-rw-r--r--cpp/src/IceGrid/AdapterCache.cpp57
1 files changed, 41 insertions, 16 deletions
diff --git a/cpp/src/IceGrid/AdapterCache.cpp b/cpp/src/IceGrid/AdapterCache.cpp
index cb0b68c99b3..235d2f9f30c 100644
--- a/cpp/src/IceGrid/AdapterCache.cpp
+++ b/cpp/src/IceGrid/AdapterCache.cpp
@@ -206,7 +206,7 @@ AdapterCache::addServerAdapter(const AdapterDescriptor& desc, const ServerEntryP
// 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"));
+ repEntry = new ReplicaGroupEntry(*this, desc.replicaGroupId, "", new RandomLoadBalancingPolicy("0"), "");
addImpl(desc.replicaGroupId, repEntry);
}
repEntry->addReplica(desc.id, entry);
@@ -226,7 +226,7 @@ AdapterCache::addReplicaGroup(const ReplicaGroupDescriptor& desc, const string&
//
if(repEntry->getApplication().empty())
{
- repEntry->update(app, desc.loadBalancing);
+ repEntry->update(app, desc.loadBalancing, desc.filter);
}
else
{
@@ -235,7 +235,7 @@ AdapterCache::addReplicaGroup(const ReplicaGroupDescriptor& desc, const string&
}
return;
}
- addImpl(desc.id, new ReplicaGroupEntry(*this, desc.id, app, desc.loadBalancing));
+ addImpl(desc.id, new ReplicaGroupEntry(*this, desc.id, app, desc.loadBalancing, desc.filter));
}
AdapterEntryPtr
@@ -375,15 +375,12 @@ ServerAdapterEntry::addSyncCallback(const SynchronizationCallbackPtr& callback,
void
ServerAdapterEntry::getLocatorAdapterInfo(LocatorAdapterInfoSeq& adapters, int& nReplicas, bool& replicaGroup,
- bool& roundRobin, const set<string>&)
+ bool& roundRobin, string& filter, const set<string>&)
{
nReplicas = 1;
replicaGroup = false;
roundRobin = false;
- LocatorAdapterInfo info;
- info.id = _id;
- info.proxy = _server->getAdapter(info.activationTimeout, info.deactivationTimeout, _id, true);
- adapters.push_back(info);
+ getLocatorAdapterInfo(adapters);
}
float
@@ -450,21 +447,50 @@ ServerAdapterEntry::getProxy(const string& replicaGroupId, bool upToDate) const
}
}
+void
+ServerAdapterEntry::getLocatorAdapterInfo(LocatorAdapterInfoSeq& adapters) const
+{
+ LocatorAdapterInfo info;
+ info.id = _id;
+ info.proxy = _server->getAdapter(info.activationTimeout, info.deactivationTimeout, _id, true);
+ adapters.push_back(info);
+}
+
int
ServerAdapterEntry::getPriority() const
{
return _priority;
}
+string
+ServerAdapterEntry::getServerId() const
+{
+ return _server->getId();
+}
+
+string
+ServerAdapterEntry::getNodeName() const
+{
+ try
+ {
+ return _server->getInfo().node;
+ }
+ catch(const ServerNotExistException&)
+ {
+ return "";
+ }
+}
+
ReplicaGroupEntry::ReplicaGroupEntry(AdapterCache& cache,
const string& id,
const string& application,
- const LoadBalancingPolicyPtr& policy) :
+ const LoadBalancingPolicyPtr& policy,
+ const string& filter) :
AdapterEntry(cache, id, application),
_lastReplica(0),
_requestInProgress(false)
{
- update(application, policy);
+ update(application, policy, filter);
}
bool
@@ -546,13 +572,14 @@ ReplicaGroupEntry::removeReplica(const string& replicaId)
}
void
-ReplicaGroupEntry::update(const string& application, const LoadBalancingPolicyPtr& policy)
+ReplicaGroupEntry::update(const string& application, const LoadBalancingPolicyPtr& policy, const string& filter)
{
Lock sync(*this);
assert(policy);
_application = application;
_loadBalancing = policy;
+ _filter = filter;
istringstream is(_loadBalancing->nReplicas);
int nReplicas = 0;
@@ -582,7 +609,7 @@ ReplicaGroupEntry::update(const string& application, const LoadBalancingPolicyPt
void
ReplicaGroupEntry::getLocatorAdapterInfo(LocatorAdapterInfoSeq& adapters, int& nReplicas, bool& replicaGroup,
- bool& roundRobin, const set<string>& excludes)
+ bool& roundRobin, string& filter, const set<string>& excludes)
{
vector<ServerAdapterEntryPtr> replicas;
bool adaptive = false;
@@ -591,6 +618,7 @@ ReplicaGroupEntry::getLocatorAdapterInfo(LocatorAdapterInfoSeq& adapters, int& n
Lock sync(*this);
replicaGroup = true;
roundRobin = false;
+ filter = _filter;
nReplicas = _loadBalancingNReplicas > 0 ? _loadBalancingNReplicas : static_cast<int>(_replicas.size());
if(_replicas.empty())
@@ -668,10 +696,7 @@ ReplicaGroupEntry::getLocatorAdapterInfo(LocatorAdapterInfoSeq& adapters, int& n
{
try
{
- int dummy;
- bool dummy2;
- bool dummy3;
- (*p)->getLocatorAdapterInfo(adapters, dummy, dummy2, dummy3, emptyExcludes);
+ (*p)->getLocatorAdapterInfo(adapters);
firstUnreachable = false;
}
catch(const SynchronizationException&)