summaryrefslogtreecommitdiff
path: root/cpp/src/IceGrid/DescriptorHelper.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2005-09-14 15:40:21 +0000
committerBenoit Foucher <benoit@zeroc.com>2005-09-14 15:40:21 +0000
commit017a84873ab0dee1e47217476d72f4cc055e247e (patch)
tree61ac9ed564cff94205680e85ca2d564a0fb74ae3 /cpp/src/IceGrid/DescriptorHelper.cpp
parentAdded loadFactor parameter in NodeDescriptor constructor (diff)
downloadice-017a84873ab0dee1e47217476d72f4cc055e247e.tar.bz2
ice-017a84873ab0dee1e47217476d72f4cc055e247e.tar.xz
ice-017a84873ab0dee1e47217476d72f4cc055e247e.zip
slice/IceGrid
Diffstat (limited to 'cpp/src/IceGrid/DescriptorHelper.cpp')
-rw-r--r--cpp/src/IceGrid/DescriptorHelper.cpp251
1 files changed, 193 insertions, 58 deletions
diff --git a/cpp/src/IceGrid/DescriptorHelper.cpp b/cpp/src/IceGrid/DescriptorHelper.cpp
index 8eeba49895e..1cdf3ae6818 100644
--- a/cpp/src/IceGrid/DescriptorHelper.cpp
+++ b/cpp/src/IceGrid/DescriptorHelper.cpp
@@ -63,10 +63,44 @@ struct TemplateDescriptorEqual : std::binary_function<TemplateDescriptor&, Templ
return ServiceHelper(slhs) == ServiceHelper(srhs);
}
}
+
return false;
}
};
+struct ReplicatedAdapterEq : std::binary_function<ReplicatedAdapterDescriptor&, ReplicatedAdapterDescriptor&, bool>
+{
+ bool
+ operator()(const ReplicatedAdapterDescriptor& lhs, const ReplicatedAdapterDescriptor& rhs)
+ {
+ if(lhs.id != rhs.id)
+ {
+ return false;
+ }
+ if(set<ObjectDescriptor>(lhs.objects.begin(), lhs.objects.end()) !=
+ set<ObjectDescriptor>(rhs.objects.begin(), rhs.objects.end()))
+ {
+ return false;
+ }
+ if(lhs.loadBalancing->ice_id() != rhs.loadBalancing->ice_id())
+ {
+ return false;
+ }
+ if(lhs.loadBalancing->nReplicas != rhs.loadBalancing->nReplicas)
+ {
+ return false;
+ }
+ AdaptiveLoadBalancingPolicyPtr alhs = AdaptiveLoadBalancingPolicyPtr::dynamicCast(lhs.loadBalancing);
+ AdaptiveLoadBalancingPolicyPtr arhs = AdaptiveLoadBalancingPolicyPtr::dynamicCast(rhs.loadBalancing);
+ if(alhs && arhs && alhs->loadSample != arhs->loadSample)
+ {
+ return false;
+ }
+
+ return true;
+ }
+};
+
template <typename GetKeyFunc, typename Seq> Seq
getSeqUpdatedElts(const Seq& lseq, const Seq& rseq, GetKeyFunc func)
{
@@ -1002,7 +1036,7 @@ IceBoxHelper::print(Output& out, const string& application, const string& node)
{
out << "icebox `" + _desc->id + "'";
out << sb;
- out << "service manager endpoints = '" << getProperty("IceBox.ServiceManager.Endpoints") << "'";
+ out << nl << "service manager endpoints = '" << getProperty("IceBox.ServiceManager.Endpoints") << "'";
printImpl(out, application, node);
for(vector<ServiceInstanceHelper>::const_iterator p = _services.begin(); p != _services.end(); ++p)
{
@@ -1395,7 +1429,7 @@ NodeHelper::NodeHelper(const string& name, const NodeDescriptor& descriptor, con
bool
NodeHelper::operator==(const NodeHelper& helper) const
{
- if(_definition.variables != helper._definition.variables)
+ if(_instance.variables != helper._instance.variables)
{
return false;
}
@@ -1410,6 +1444,11 @@ NodeHelper::operator==(const NodeHelper& helper) const
return false;
}
+ if(_instance.loadFactor != helper._instance.loadFactor)
+ {
+ return false;
+ }
+
return true;
}
@@ -1505,11 +1544,10 @@ NodeHelper::update(const NodeUpdateDescriptor& update, const Resolver& appResolv
// isn't changing the id: this is not allowed, instead the old
// server should be removed first.
//
- ServerInstanceHelperDict::const_iterator r;
ServerInstanceHelperDict serverInstances;
serverInstances.swap(_serverInstances);
- for(ServerInstanceDescriptorSeq::const_iterator q = update.serverInstances.begin();
- q != update.serverInstances.end(); ++q)
+ ServerInstanceDescriptorSeq::const_iterator q;
+ for(q = update.serverInstances.begin(); q != update.serverInstances.end(); ++q)
{
ServerInstanceHelper helper(*q, resolve);
if(!_serverInstances.insert(make_pair(helper.getId(), helper)).second)
@@ -1518,6 +1556,7 @@ NodeHelper::update(const NodeUpdateDescriptor& update, const Resolver& appResolv
}
serverInstances.erase(helper.getId());
}
+ ServerInstanceHelperDict::const_iterator r;
for(r = serverInstances.begin(); r != serverInstances.end(); ++r)
{
ServerInstanceHelper helper(r->second.getDescriptor(), resolve); // Re-instantiate the server.
@@ -1661,11 +1700,12 @@ NodeHelper::print(Output& out) const
{
out << nl << "node '" << _name << "'";
out << sb;
- if(!_definition.variables.empty())
+ out << nl << "load factor = '" << _instance.loadFactor << "'";
+ if(!_instance.variables.empty())
{
out << nl << "variables";
out << sb;
- for(StringStringDict::const_iterator q = _definition.variables.begin(); q != _definition.variables.end(); ++q)
+ for(StringStringDict::const_iterator q = _instance.variables.begin(); q != _instance.variables.end(); ++q)
{
out << nl << q->first << " = '" << q->second << "'";
}
@@ -1707,7 +1747,12 @@ NodeHelper::printDiff(Output& out, const NodeHelper& helper) const
updated.insert(updated2.begin(), updated2.end());
removed.insert(removed.end(), removed2.begin(), removed2.end());
- if(updated.empty() && removed.empty())
+ map<string, string> variables = getDictUpdatedElts(helper._instance.variables, _instance.variables);
+ Ice::StringSeq removeVariables = getDictRemovedElts(helper._instance.variables, _instance.variables);
+
+ if(updated.empty() && removed.empty() &&
+ variables.empty() && removeVariables.empty() &&
+ _instance.loadFactor == helper._instance.loadFactor)
{
return;
}
@@ -1719,31 +1764,41 @@ NodeHelper::printDiff(Output& out, const NodeHelper& helper) const
out << nl << "node `" + _name + "' updated";
out << sb;
- out << nl << "servers";
- out << sb;
- ServerInstanceHelperDict::const_iterator p;
- for(p = updated.begin(); p != updated.end(); ++p)
+ if(_instance.loadFactor != helper._instance.loadFactor)
{
- if(helper._serverInstances.find(p->first) == helper._serverInstances.end() &&
- helper._servers.find(p->first) == helper._servers.end())
- {
- out << nl << "server `" << p->first << "' added";
- }
+ out << nl << "load factor udpated";
}
- for(p = updated.begin(); p != updated.end(); ++p)
+ if(!variables.empty() || !removeVariables.empty())
{
- if(helper._serverInstances.find(p->first) != helper._serverInstances.end() ||
- helper._servers.find(p->first) != helper._servers.end())
+ out << nl << "variables udpated";
+ }
+ if(!updated.empty() || !removed.empty())
+ {
+ out << nl << "servers";
+ out << sb;
+ ServerInstanceHelperDict::const_iterator p;
+ for(p = updated.begin(); p != updated.end(); ++p)
{
- out << nl << "server `" << p->first << "' updated";
+ if(helper._serverInstances.find(p->first) == helper._serverInstances.end() &&
+ helper._servers.find(p->first) == helper._servers.end())
+ {
+ out << nl << "server `" << p->first << "' added";
+ }
}
+ for(p = updated.begin(); p != updated.end(); ++p)
+ {
+ if(helper._serverInstances.find(p->first) != helper._serverInstances.end() ||
+ helper._servers.find(p->first) != helper._servers.end())
+ {
+ out << nl << "server `" << p->first << "' updated";
+ }
+ }
+ for(Ice::StringSeq::const_iterator q = removed.begin(); q != removed.end(); ++q)
+ {
+ out << nl << "server `" << *q << "' removed";
+ }
+ out << eb;
}
- for(Ice::StringSeq::const_iterator q = removed.begin(); q != removed.end(); ++q)
- {
- out << nl << "server `" << *q << "' removed";
- }
- out << eb;
-
out << eb;
}
@@ -1790,11 +1845,16 @@ ApplicationHelper::instantiate(const Resolver& resolve) const
ReplicatedAdapterDescriptorSeq::iterator r;
for(r = desc.replicatedAdapters.begin(); r != desc.replicatedAdapters.end(); ++r)
{
+ r->loadBalancing = LoadBalancingPolicyPtr::dynamicCast(r->loadBalancing->ice_clone());
r->loadBalancing->nReplicas = resolve(r->loadBalancing->nReplicas, "number of replicas");
AdaptiveLoadBalancingPolicyPtr alb = AdaptiveLoadBalancingPolicyPtr::dynamicCast(r->loadBalancing);
if(alb)
{
alb->loadSample = resolve(alb->loadSample, "load sample");
+ if(alb->loadSample != "" && alb->loadSample != "1" && alb->loadSample != "5" && alb->loadSample != "15")
+ {
+ resolve.exception("invalid load sample value (allowed values are 1, 5 or 15)");
+ }
}
for(ObjectDescriptorSeq::iterator q = r->objects.begin(); q != r->objects.end(); ++q)
@@ -1831,12 +1891,10 @@ ApplicationHelper::diff(const ApplicationHelper& helper)
update.patchs = getDictUpdatedElts(helper._definition.patchs, _definition.patchs);
update.removePatchs = getDictRemovedElts(helper._definition.patchs, _definition.patchs);
- //
- // TODO: I don't think that's correct since the load balancing policy is a class.
- //
GetReplicatedAdapterId rk;
+ ReplicatedAdapterEq req;
update.replicatedAdapters =
- getSeqUpdatedElts(helper._definition.replicatedAdapters, _definition.replicatedAdapters, rk);
+ getSeqUpdatedElts(helper._definition.replicatedAdapters, _definition.replicatedAdapters, rk, req);
update.removeReplicatedAdapters =
getSeqRemovedElts(helper._definition.replicatedAdapters, _definition.replicatedAdapters, rk);
@@ -1861,6 +1919,7 @@ ApplicationHelper::diff(const ApplicationHelper& helper)
nodeUpdate.variables = node.variables;
nodeUpdate.servers = node.servers;
nodeUpdate.serverInstances = node.serverInstances;
+ nodeUpdate.loadFactor = new BoxedLoadFactor(node.loadFactor);
update.nodes.push_back(nodeUpdate);
}
else
@@ -1922,6 +1981,7 @@ ApplicationHelper::update(const ApplicationUpdateDescriptor& update)
desc.variables = p->variables;
desc.servers = p->servers;
desc.serverInstances = p->serverInstances;
+ desc.loadFactor = p->loadFactor;
_nodes.insert(make_pair(p->name, NodeHelper(p->name, desc, resolve)));
}
else
@@ -2054,41 +2114,41 @@ ApplicationHelper::getNodesPatchDirs(const string& patch) const
void
ApplicationHelper::print(Output& out) const
{
- out << "application '" << _definition.name << "'";
+ out << "application '" << _instance.name << "'";
out << sb;
- if(!_definition.description.empty())
+ if(!_instance.description.empty())
{
- out << nl << "description = " << _definition.description;
+ out << nl << "description = " << _instance.description;
}
- if(!_definition.variables.empty())
+ if(!_instance.variables.empty())
{
out << nl << "variables";
out << sb;
- for(StringStringDict::const_iterator p = _definition.variables.begin(); p != _definition.variables.end();
+ for(StringStringDict::const_iterator p = _instance.variables.begin(); p != _instance.variables.end();
++p)
{
out << nl << p->first << " = '" << p->second << "'";
}
out << eb;
}
- if(!_definition.patchs.empty())
+ if(!_instance.patchs.empty())
{
out << nl << "patchs";
out << sb;
- for(PatchDescriptorDict::const_iterator p = _definition.patchs.begin(); p != _definition.patchs.end(); ++p)
+ for(PatchDescriptorDict::const_iterator p = _instance.patchs.begin(); p != _instance.patchs.end(); ++p)
{
out << nl << p->first;
}
out << eb;
}
- if(!_definition.replicatedAdapters.empty())
+ if(!_instance.replicatedAdapters.empty())
{
out << nl << "replicated adapters";
out << sb;
ReplicatedAdapterDescriptorSeq::const_iterator p;
- for(p = _definition.replicatedAdapters.begin(); p != _definition.replicatedAdapters.end(); ++p)
+ for(p = _instance.replicatedAdapters.begin(); p != _instance.replicatedAdapters.end(); ++p)
{
- out << nl << "id = `" << p->id << "' load balancing = '";
+ out << nl << "id = `" << p->id << "' load balancing = `";
if(RandomLoadBalancingPolicyPtr::dynamicCast(p->loadBalancing))
{
out << "random";
@@ -2099,7 +2159,7 @@ ApplicationHelper::print(Output& out) const
}
else if(AdaptiveLoadBalancingPolicyPtr::dynamicCast(p->loadBalancing))
{
- out << "adaptive";
+ out << "adaptive" ;
}
else
{
@@ -2109,23 +2169,23 @@ ApplicationHelper::print(Output& out) const
}
out << eb;
}
- if(!_definition.serverTemplates.empty())
+ if(!_instance.serverTemplates.empty())
{
out << nl << "server templates";
out << sb;
TemplateDescriptorDict::const_iterator p;
- for(p = _definition.serverTemplates.begin(); p != _definition.serverTemplates.end(); ++p)
+ for(p = _instance.serverTemplates.begin(); p != _instance.serverTemplates.end(); ++p)
{
out << nl << p->first;
}
out << eb;
}
- if(!_definition.serviceTemplates.empty())
+ if(!_instance.serviceTemplates.empty())
{
out << nl << "service templates";
out << sb;
TemplateDescriptorDict::const_iterator p;
- for(p = _definition.serviceTemplates.begin(); p != _definition.serviceTemplates.end(); ++p)
+ for(p = _instance.serviceTemplates.begin(); p != _instance.serviceTemplates.end(); ++p)
{
out << nl << p->first;
}
@@ -2144,32 +2204,107 @@ ApplicationHelper::print(Output& out) const
void
ApplicationHelper::printDiff(Output& out, const ApplicationHelper& helper) const
{
- out << "application `" << _definition.name << "'";
+ out << "application `" << _instance.name << "'";
out << sb;
- //
- // TODO: Show updated variables, patchs?
- //
+ {
+ map<string, string> variables = getDictUpdatedElts(helper._instance.variables, _instance.variables);
+ Ice::StringSeq removeVariables = getDictRemovedElts(helper._instance.variables, _instance.variables);
+ if(!variables.empty() || !removeVariables.empty())
+ {
+ out << nl << "variables udpated";
+ }
+ }
+ {
+ PatchDescriptorDict updated = getDictUpdatedElts(helper._definition.patchs, _definition.patchs);
+ Ice::StringSeq removed = getDictRemovedElts(helper._definition.patchs, _definition.patchs);
+ if(!updated.empty() || !removed.empty())
+ {
+ out << nl << "patchs";
+ out << sb;
+ for(PatchDescriptorDict::const_iterator p = updated.begin(); p != updated.end(); ++p)
+ {
+ if(helper._instance.patchs.find(p->first) == helper._instance.patchs.end())
+ {
+ out << nl << "patch `" << p->first << "' added";
+ }
+ }
+ for(PatchDescriptorDict::const_iterator q = updated.begin(); q != updated.end(); ++q)
+ {
+ if(helper._instance.patchs.find(q->first) != helper._instance.patchs.end())
+ {
+ out << nl << "patch `" << q->first << "' updated";
+ }
+ }
+ for(Ice::StringSeq::const_iterator q = removed.begin(); q != removed.end(); ++q)
+ {
+ out << nl << "patch `" << *q << "' removed";
+ }
+ out << eb;
+ }
+ }
+ {
+ GetReplicatedAdapterId rk;
+ ReplicatedAdapterEq req;
+ ReplicatedAdapterDescriptorSeq updated =
+ getSeqUpdatedElts(helper._definition.replicatedAdapters, _definition.replicatedAdapters, rk, req);
+ Ice::StringSeq removed =
+ getSeqRemovedElts(helper._definition.replicatedAdapters, _definition.replicatedAdapters, rk);
+ if(!updated.empty() || !removed.empty())
+ {
+ out << nl << "replicated adapters";
+ out << sb;
+ ReplicatedAdapterDescriptorSeq::iterator p = updated.begin();
+ while(p != updated.end())
+ {
+ ReplicatedAdapterDescriptorSeq::const_iterator r;
+ for(r = helper._instance.replicatedAdapters.begin(); r != helper._instance.replicatedAdapters.end();
+ ++r)
+ {
+ if(p->id == r->id)
+ {
+ out << nl << "replicated adapter `" << r->id << "' updated";
+ p = updated.erase(p);
+ break;
+ }
+ }
+ if(r == helper._instance.replicatedAdapters.end())
+ {
+ ++p;
+ }
+ }
+ p = updated.begin();
+ while(p != updated.end())
+ {
+ out << nl << "replicated adapter `" << p->id << "' added";
+ }
+ for(Ice::StringSeq::const_iterator q = removed.begin(); q != removed.end(); ++q)
+ {
+ out << nl << "replicated adapter `" << *q << "' removed";
+ }
+ out << eb;
+ }
+ }
{
TemplateDescriptorEqual eq;
TemplateDescriptorDict updated;
- updated = getDictUpdatedElts(helper._definition.serverTemplates, _definition.serverTemplates, eq);
- Ice::StringSeq removed = getDictRemovedElts(helper._definition.serverTemplates, _definition.serverTemplates);
+ updated = getDictUpdatedElts(helper._instance.serverTemplates, _instance.serverTemplates, eq);
+ Ice::StringSeq removed = getDictRemovedElts(helper._instance.serverTemplates, _instance.serverTemplates);
if(!updated.empty() || !removed.empty())
{
out << nl << "server templates";
out << sb;
for(TemplateDescriptorDict::const_iterator p = updated.begin(); p != updated.end(); ++p)
{
- if(helper._definition.serverTemplates.find(p->first) == helper._definition.serverTemplates.end())
+ if(helper._instance.serverTemplates.find(p->first) == helper._instance.serverTemplates.end())
{
out << nl << "server template `" << p->first << "' added";
}
}
for(TemplateDescriptorDict::const_iterator q = updated.begin(); q != updated.end(); ++q)
{
- if(helper._definition.serverTemplates.find(q->first) != helper._definition.serverTemplates.end())
+ if(helper._instance.serverTemplates.find(q->first) != helper._instance.serverTemplates.end())
{
out << nl << "server template `" << q->first << "' updated";
}
@@ -2184,22 +2319,22 @@ ApplicationHelper::printDiff(Output& out, const ApplicationHelper& helper) const
{
TemplateDescriptorEqual eq;
TemplateDescriptorDict updated;
- updated = getDictUpdatedElts(helper._definition.serviceTemplates, _definition.serviceTemplates, eq);
- Ice::StringSeq removed = getDictRemovedElts(helper._definition.serviceTemplates, _definition.serviceTemplates);
+ updated = getDictUpdatedElts(helper._instance.serviceTemplates, _instance.serviceTemplates, eq);
+ Ice::StringSeq removed = getDictRemovedElts(helper._instance.serviceTemplates, _instance.serviceTemplates);
if(!updated.empty() || !removed.empty())
{
out << nl << "service templates";
out << sb;
for(TemplateDescriptorDict::const_iterator p = updated.begin(); p != updated.end(); ++p)
{
- if(helper._definition.serviceTemplates.find(p->first) == helper._definition.serviceTemplates.end())
+ if(helper._instance.serviceTemplates.find(p->first) == helper._instance.serviceTemplates.end())
{
out << nl << "service template `" << p->first << "' added";
}
}
for(TemplateDescriptorDict::const_iterator q = updated.begin(); q != updated.end(); ++q)
{
- if(helper._definition.serviceTemplates.find(q->first) != helper._definition.serviceTemplates.end())
+ if(helper._instance.serviceTemplates.find(q->first) != helper._instance.serviceTemplates.end())
{
out << nl << "service template `" << q->first << "' updated";
}