diff options
author | Benoit Foucher <benoit@zeroc.com> | 2005-10-25 20:45:35 +0000 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2005-10-25 20:45:35 +0000 |
commit | d89f4f58ea4ab21661540c33f5e3481c67a758b1 (patch) | |
tree | 4f9a09fb53e573863c29b62d6e7777eb83ee8873 /cpp/src/IceGrid/Database.cpp | |
parent | Fix some SRPM generation bugs, some copy commands and removed buildrequires (diff) | |
download | ice-d89f4f58ea4ab21661540c33f5e3481c67a758b1.tar.bz2 ice-d89f4f58ea4ab21661540c33f5e3481c67a758b1.tar.xz ice-d89f4f58ea4ab21661540c33f5e3481c67a758b1.zip |
Fixed a bug where IcePatch2 couldn't be deployed and used in a new
application.
Fixed deadlock.
Added automatic patching after adding an application.
Diffstat (limited to 'cpp/src/IceGrid/Database.cpp')
-rw-r--r-- | cpp/src/IceGrid/Database.cpp | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/cpp/src/IceGrid/Database.cpp b/cpp/src/IceGrid/Database.cpp index 6af3f3dc253..6819e1c7b12 100644 --- a/cpp/src/IceGrid/Database.cpp +++ b/cpp/src/IceGrid/Database.cpp @@ -111,6 +111,47 @@ struct ObjectLoadCI : binary_function<pair<Ice::ObjectPrx, float>&, pair<Ice::Ob } }; +class PatchCB : public AMI_Node_patch +{ +public: + + PatchCB(const DatabasePtr& database, const string& name, const string& node) : + _database(database), _application(name), _node(node) + { + } + + void + ice_response() + { + _database->finishedPatchApplication(_application, _node); + } + + void + ice_exception(const Ice::Exception& ex) + { + try + { + ex.ice_throw(); + } + catch(const PatchException& ex) + { + _database->finishedPatchApplication(_application, _node, ex.reason); + } + catch(const Ice::Exception& ex) + { + ostringstream os; + os << ex; + _database->finishedPatchApplication(_application, _node, os.str()); + } + } + +private: + + const DatabasePtr _database; + const string _application; + const string _node; +}; + } Database::Database(const Ice::ObjectAdapterPtr& adapter, @@ -232,6 +273,9 @@ Database::addApplicationDescriptor(ObserverSessionI* session, const ApplicationD { ServerEntrySeq entries; int serial; + DistributionDescriptor appDistrib; + map<string, DistributionDescriptorDict> nodeDistrib; + { Lock sync(*this); @@ -461,6 +505,42 @@ Database::instantiateServer(const string& application, const string& node, const for_each(entries.begin(), entries.end(), IceUtil::voidMemFun(&ServerEntry::sync)); } +void +Database::patchApplication(const string& name, + const DistributionDescriptor& appDistrib, + const map<string, DistributionDescriptorDict>& nodeDistrib, + bool shutdown) +{ + for(map<string, DistributionDescriptorDict>::const_iterator p = nodeDistrib.begin(); p != nodeDistrib.end(); ++p) + { + if(_traceLevels->patch > 0) + { + Ice::Trace out(_traceLevels->logger, _traceLevels->applicationCat); + out << "started patching of application `" << name << "' on node `" << p->first << "'"; + } + AMI_Node_patchPtr cb = new PatchCB(this, name, p->first); + _nodeCache.get(p->first)->getProxy()->patch_async(cb, name, appDistrib, p->second, shutdown); + } +} + +void +Database::finishedPatchApplication(const string& name, const string& node, const string& failure) +{ + if(_traceLevels->patch > 0) + { + if(failure.empty()) + { + Ice::Trace out(_traceLevels->logger, _traceLevels->applicationCat); + out << "finished patching of application `" << name << "' on node `" << node << "'"; + } + else + { + Ice::Trace out(_traceLevels->logger, _traceLevels->applicationCat); + out << "patching of application `" << name << "' on node `" << node << "' failed:\n" << failure; + } + } +} + ApplicationDescriptor Database::getApplicationDescriptor(const std::string& name) { |