summaryrefslogtreecommitdiff
path: root/cpp/src/IceGrid/Database.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2005-10-25 20:45:35 +0000
committerBenoit Foucher <benoit@zeroc.com>2005-10-25 20:45:35 +0000
commitd89f4f58ea4ab21661540c33f5e3481c67a758b1 (patch)
tree4f9a09fb53e573863c29b62d6e7777eb83ee8873 /cpp/src/IceGrid/Database.cpp
parentFix some SRPM generation bugs, some copy commands and removed buildrequires (diff)
downloadice-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.cpp80
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)
{