diff options
author | Benoit Foucher <benoit@zeroc.com> | 2005-10-18 17:38:50 +0000 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2005-10-18 17:38:50 +0000 |
commit | 1485e01f77f42c13fb6bd17d6289f7277cdac9cf (patch) | |
tree | d0bb149ea54644e9161eedd008c35ead1c9faeb5 /cpp/src | |
parent | Fixed compile error (diff) | |
download | ice-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.cpp | 6 | ||||
-rw-r--r-- | cpp/src/IceGrid/AdminI.h | 2 | ||||
-rw-r--r-- | cpp/src/IceGrid/Database.cpp | 44 | ||||
-rw-r--r-- | cpp/src/IceGrid/Database.h | 1 | ||||
-rw-r--r-- | cpp/src/IceGrid/DescriptorHelper.cpp | 56 | ||||
-rw-r--r-- | cpp/src/IceGrid/DescriptorHelper.h | 4 | ||||
-rw-r--r-- | cpp/src/IceGrid/Parser.cpp | 9 |
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) { |