summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2005-10-18 17:38:50 +0000
committerBenoit Foucher <benoit@zeroc.com>2005-10-18 17:38:50 +0000
commit1485e01f77f42c13fb6bd17d6289f7277cdac9cf (patch)
treed0bb149ea54644e9161eedd008c35ead1c9faeb5 /cpp/src
parentFixed compile error (diff)
downloadice-1485e01f77f42c13fb6bd17d6289f7277cdac9cf.tar.bz2
ice-1485e01f77f42c13fb6bd17d6289f7277cdac9cf.tar.xz
ice-1485e01f77f42c13fb6bd17d6289f7277cdac9cf.zip
Fixed bug 518
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/IceGrid/AdminI.cpp6
-rw-r--r--cpp/src/IceGrid/AdminI.h2
-rw-r--r--cpp/src/IceGrid/Database.cpp44
-rw-r--r--cpp/src/IceGrid/Database.h1
-rw-r--r--cpp/src/IceGrid/DescriptorHelper.cpp56
-rw-r--r--cpp/src/IceGrid/DescriptorHelper.h4
-rw-r--r--cpp/src/IceGrid/Parser.cpp9
7 files changed, 113 insertions, 9 deletions
diff --git a/cpp/src/IceGrid/AdminI.cpp b/cpp/src/IceGrid/AdminI.cpp
index 84bc868b21b..c5692a61a2f 100644
--- a/cpp/src/IceGrid/AdminI.cpp
+++ b/cpp/src/IceGrid/AdminI.cpp
@@ -113,6 +113,12 @@ AdminI::removeApplication(const string& name, const Current&)
}
void
+AdminI::instantiateServer(const string& app, const string& node, const ServerInstanceDescriptor& desc, const Current&)
+{
+ _database->instantiateServer(app, node, desc);
+}
+
+void
AdminI::patchApplication(const string& name, bool shutdown, const Current&)
{
ApplicationHelper helper(_database->getApplicationDescriptor(name));
diff --git a/cpp/src/IceGrid/AdminI.h b/cpp/src/IceGrid/AdminI.h
index b72ba6a4208..d2364a1293f 100644
--- a/cpp/src/IceGrid/AdminI.h
+++ b/cpp/src/IceGrid/AdminI.h
@@ -32,6 +32,8 @@ public:
virtual void syncApplication(const ApplicationDescriptor&, const Ice::Current&);
virtual void updateApplication(const ApplicationUpdateDescriptor&, const Ice::Current&);
virtual void removeApplication(const std::string&, const Ice::Current&);
+ virtual void instantiateServer(const std::string&, const std::string&, const ServerInstanceDescriptor&,
+ const Ice::Current&);
virtual void patchApplication(const std::string&, bool, const Ice::Current&);
virtual ApplicationDescriptor getApplicationDescriptor(const ::std::string&, const Ice::Current&) const;
virtual ApplicationDescriptor getDefaultApplicationDescriptor(const Ice::Current&) const;
diff --git a/cpp/src/IceGrid/Database.cpp b/cpp/src/IceGrid/Database.cpp
index 2ee26fcbc31..1d696680561 100644
--- a/cpp/src/IceGrid/Database.cpp
+++ b/cpp/src/IceGrid/Database.cpp
@@ -409,6 +409,50 @@ Database::removeApplicationDescriptor(ObserverSessionI* session, const std::stri
for_each(entries.begin(), entries.end(), IceUtil::voidMemFun(&ServerEntry::sync));
}
+void
+Database::instantiateServer(const string& application, const string& node, const ServerInstanceDescriptor& instance)
+{
+ ServerEntrySeq entries;
+ int serial;
+ ApplicationUpdateDescriptor update;
+ {
+ Lock sync(*this);
+ checkSessionLock(0);
+
+ StringApplicationDescriptorDict::const_iterator p = _descriptors.find(application);
+ if(p == _descriptors.end())
+ {
+ throw ApplicationNotExistException(application);
+ }
+
+ ApplicationHelper previous(p->second);
+ ApplicationHelper helper(p->second);
+ helper.instantiateServer(node, instance);
+ update = helper.diff(previous);
+
+ checkForUpdate(previous, helper);
+
+ reload(previous, helper, entries);
+
+ _descriptors.put(StringApplicationDescriptorDict::value_type(application, helper.getDescriptor()));
+
+ serial = ++_serial;
+ }
+
+ //
+ // Notify the observers.
+ //
+ _registryObserver->applicationUpdated(serial, update);
+
+ if(_traceLevels->application > 0)
+ {
+ Ice::Trace out(_traceLevels->logger, _traceLevels->applicationCat);
+ out << "updated application `" << update.name << "'";
+ }
+
+ for_each(entries.begin(), entries.end(), IceUtil::voidMemFun(&ServerEntry::sync));
+}
+
ApplicationDescriptor
Database::getApplicationDescriptor(const std::string& name)
{
diff --git a/cpp/src/IceGrid/Database.h b/cpp/src/IceGrid/Database.h
index c19c9c12b7e..cc9e8cd0ae2 100644
--- a/cpp/src/IceGrid/Database.h
+++ b/cpp/src/IceGrid/Database.h
@@ -57,6 +57,7 @@ public:
void updateApplicationDescriptor(ObserverSessionI*, const ApplicationUpdateDescriptor&);
void syncApplicationDescriptor(ObserverSessionI*, const ApplicationDescriptor&);
void removeApplicationDescriptor(ObserverSessionI*, const std::string&);
+ void instantiateServer(const std::string&, const std::string&, const ServerInstanceDescriptor&);
ApplicationDescriptor getApplicationDescriptor(const std::string&);
Ice::StringSeq getAllApplications(const std::string& = std::string());
diff --git a/cpp/src/IceGrid/DescriptorHelper.cpp b/cpp/src/IceGrid/DescriptorHelper.cpp
index 6a2259dd2eb..b9b247a1f5e 100644
--- a/cpp/src/IceGrid/DescriptorHelper.cpp
+++ b/cpp/src/IceGrid/DescriptorHelper.cpp
@@ -1609,6 +1609,31 @@ NodeHelper::update(const NodeUpdateDescriptor& update, const Resolver& appResolv
}
void
+NodeHelper::instantiateServer(const ServerInstanceDescriptor& instance, const Resolver& appResolve)
+{
+ Resolver resolve(appResolve, _definition.variables, false);
+ resolve.setReserved("node", _name);
+ resolve.setContext("node `" + _name + "'");
+
+ ServerInstanceHelper helper(instance, resolve);
+ if(!_serverInstances.insert(make_pair(helper.getId(), helper)).second)
+ {
+ resolve.exception("duplicate server `" + helper.getId() + "' in node `" + _name + "'");
+ }
+
+ //
+ // Update the node descriptor with the new server instances and servers.
+ //
+ _definition.serverInstances.clear();
+ for(ServerInstanceHelperDict::const_iterator r = _serverInstances.begin(); r != _serverInstances.end(); ++r)
+ {
+ _definition.serverInstances.push_back(r->second.getDefinition());
+ }
+
+ _instance = instantiate(resolve);
+}
+
+void
NodeHelper::getIds(multiset<string>& serverIds, multiset<string>& adapterIds, multiset<Ice::Identity>& objectIds) const
{
ServerInstanceHelperDict::const_iterator p;
@@ -2060,6 +2085,37 @@ ApplicationHelper::update(const ApplicationUpdateDescriptor& update)
}
void
+ApplicationHelper::instantiateServer(const string& node, const ServerInstanceDescriptor& instance)
+{
+ Resolver resolve(*this, _definition.name, _definition.variables);
+
+ //
+ // Get the node helper (add it if it doesn't exist.)
+ //
+ NodeHelperDict::iterator q = _nodes.find(node);
+ if(q == _nodes.end())
+ {
+ q = _nodes.insert(q, NodeHelperDict::value_type(node, NodeHelper(node, NodeDescriptor(), resolve)));
+ }
+ q->second.instantiateServer(instance, resolve);
+
+ //
+ // Update the application definition.
+ //
+ _definition.nodes[node] = q->second.getDescriptor();
+
+ //
+ // Update the application descriptor instance.
+ //
+ _instance = instantiate(resolve);
+
+ //
+ // Validate the new application descriptor.
+ //
+ validate(resolve);
+}
+
+void
ApplicationHelper::getIds(set<string>& serverIds, set<string>& adapterIds, set<Ice::Identity>& objectIds) const
{
multiset<string> sIds;
diff --git a/cpp/src/IceGrid/DescriptorHelper.h b/cpp/src/IceGrid/DescriptorHelper.h
index abb55f1f1ba..0572748ff3c 100644
--- a/cpp/src/IceGrid/DescriptorHelper.h
+++ b/cpp/src/IceGrid/DescriptorHelper.h
@@ -240,6 +240,7 @@ public:
NodeUpdateDescriptor diff(const NodeHelper&) const;
void update(const NodeUpdateDescriptor&, const Resolver&);
+ void instantiateServer(const ServerInstanceDescriptor&, const Resolver&);
void getIds(std::multiset<std::string>&, std::multiset<std::string>&, std::multiset<Ice::Identity>&) const;
const NodeDescriptor& getDescriptor() const;
@@ -272,7 +273,8 @@ public:
ApplicationHelper(const ApplicationDescriptor&);
ApplicationUpdateDescriptor diff(const ApplicationHelper&);
- void update(const ApplicationUpdateDescriptor&);
+ void update(const ApplicationUpdateDescriptor&);
+ void instantiateServer(const std::string&, const ServerInstanceDescriptor&);
void getIds(std::set<std::string>&, std::set<std::string>&, std::set<Ice::Identity>&) const;
const ApplicationDescriptor& getDescriptor() const;
diff --git a/cpp/src/IceGrid/Parser.cpp b/cpp/src/IceGrid/Parser.cpp
index b94bd1fcfbc..098c15c07f1 100644
--- a/cpp/src/IceGrid/Parser.cpp
+++ b/cpp/src/IceGrid/Parser.cpp
@@ -426,7 +426,6 @@ Parser::instantiateServerTemplate(const list<string>& args)
string application = *p++;
string node = *p++;
string templ = *p++;
-
for(; p != args.end(); ++p)
{
string::size_type pos = p->find('=');
@@ -439,13 +438,7 @@ Parser::instantiateServerTemplate(const list<string>& args)
ServerInstanceDescriptor desc;
desc._cpp_template = templ;
desc.parameterValues = vars;
- NodeUpdateDescriptor nodeUpdate;
- nodeUpdate.name = node;
- nodeUpdate.serverInstances.push_back(desc);
- ApplicationUpdateDescriptor update;
- update.name = application;
- update.nodes.push_back(nodeUpdate);
- _admin->updateApplication(update);
+ _admin->instantiateServer(application, node, desc);
}
catch(const Ice::Exception& ex)
{