diff options
author | Benoit Foucher <benoit@zeroc.com> | 2006-08-01 13:59:13 +0000 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2006-08-01 13:59:13 +0000 |
commit | 1c2200d731e5d42e57476a11303e7b39eb6de3b6 (patch) | |
tree | c125f1d2b654bfbc30198cbfa3904c3a82b56517 /cpp/src | |
parent | Fixed bug where variables weren't substituted in distribution descriptors. (diff) | |
download | ice-1c2200d731e5d42e57476a11303e7b39eb6de3b6.tar.bz2 ice-1c2200d731e5d42e57476a11303e7b39eb6de3b6.tar.xz ice-1c2200d731e5d42e57476a11303e7b39eb6de3b6.zip |
Added application info.
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/IceGrid/Database.cpp | 151 | ||||
-rw-r--r-- | cpp/src/IceGrid/Database.h | 16 | ||||
-rw-r--r-- | cpp/src/IceGrid/Makefile | 12 | ||||
-rw-r--r-- | cpp/src/IceGrid/NodeCache.cpp | 2 | ||||
-rw-r--r-- | cpp/src/IceGrid/NodeCache.h | 2 | ||||
-rw-r--r-- | cpp/src/IceGrid/ReplicaSessionManager.cpp | 10 | ||||
-rw-r--r-- | cpp/src/IceGrid/ServerCache.cpp | 26 | ||||
-rw-r--r-- | cpp/src/IceGrid/ServerCache.h | 5 | ||||
-rw-r--r-- | cpp/src/IceGrid/SessionManager.h | 5 | ||||
-rw-r--r-- | cpp/src/IceGrid/Topics.cpp | 29 | ||||
-rw-r--r-- | cpp/src/IceGrid/Topics.h | 8 |
11 files changed, 151 insertions, 115 deletions
diff --git a/cpp/src/IceGrid/Database.cpp b/cpp/src/IceGrid/Database.cpp index aa683e5344b..3154b07f74b 100644 --- a/cpp/src/IceGrid/Database.cpp +++ b/cpp/src/IceGrid/Database.cpp @@ -26,7 +26,7 @@ using namespace std; using namespace IceGrid; -const string Database::_descriptorDbName = "applications"; +const string Database::_applicationDbName = "applications"; const string Database::_adapterDbName = "adapters"; const string Database::_objectDbName = "objects"; @@ -135,18 +135,18 @@ Database::Database(const Ice::ObjectAdapterPtr& registryAdapter, _clientProxy(_communicator->stringToProxy("dummy")), _serverProxy(_communicator->stringToProxy("dummy")), _connection(Freeze::createConnection(registryAdapter->getCommunicator(), _envName)), - _descriptors(_connection, _descriptorDbName), + _applications(_connection, _applicationDbName), _objects(_connection, _objectDbName), _adapters(_connection, _adapterDbName), _lock(0), _serial(-1) { ServerEntrySeq entries; - for(StringApplicationDescriptorDict::const_iterator p = _descriptors.begin(); p != _descriptors.end(); ++p) + for(StringApplicationInfoDict::const_iterator p = _applications.begin(); p != _applications.end(); ++p) { try { - load(ApplicationHelper(_communicator, p->second), entries); + load(ApplicationHelper(_communicator, p->second.descriptor), entries, p->second.revision); } catch(const DeploymentException& ex) { @@ -269,8 +269,8 @@ Database::initMaster() _registryObserverTopic = new RegistryObserverTopic(_internalAdapter, _topicManager); _serial = 0; - ApplicationDescriptorSeq applications; - for(StringApplicationDescriptorDict::const_iterator p = _descriptors.begin(); p != _descriptors.end(); ++p) + ApplicationInfoSeq applications; + for(StringApplicationInfoDict::const_iterator p = _applications.begin(); p != _applications.end(); ++p) { applications.push_back(p->second); } @@ -289,7 +289,7 @@ Database::initMaster() void Database::initReplica(int masterSerial, - const ApplicationDescriptorSeq& applications, + const ApplicationInfoSeq& applications, const AdapterInfoSeq& adapters, const ObjectInfoSeq& objects) { @@ -299,35 +299,37 @@ Database::initReplica(int masterSerial, ServerEntrySeq entries; set<string> names; - for(ApplicationDescriptorSeq::const_iterator p = applications.begin(); p != applications.end(); ++p) + for(ApplicationInfoSeq::const_iterator p = applications.begin(); p != applications.end(); ++p) { try { - StringApplicationDescriptorDict::const_iterator s = _descriptors.find(p->name); - if(s != _descriptors.end()) + StringApplicationInfoDict::const_iterator s = _applications.find(p->descriptor.name); + if(s != _applications.end()) { - reload(ApplicationHelper(_communicator, s->second), ApplicationHelper(_communicator, *p), entries); + ApplicationHelper previous(_communicator, s->second.descriptor); + ApplicationHelper helper(_communicator, p->descriptor); + reload(previous, helper, entries, p->revision); } else { - load(ApplicationHelper(_communicator, *p), entries); + load(ApplicationHelper(_communicator, p->descriptor), entries, p->revision); } } catch(const DeploymentException& ex) { Ice::Warning warn(_traceLevels->logger); - warn << "invalid application `" << p->name << "':\n" << ex.reason; + warn << "invalid application `" << p->descriptor.name << "':\n" << ex.reason; } - _descriptors.put(StringApplicationDescriptorDict::value_type(p->name, *p)); - names.insert(p->name); + _applications.put(StringApplicationInfoDict::value_type(p->descriptor.name, *p)); + names.insert(p->descriptor.name); } - StringApplicationDescriptorDict::iterator s = _descriptors.begin(); - while(s != _descriptors.end()) + StringApplicationInfoDict::iterator s = _applications.begin(); + while(s != _applications.end()) { if(names.find(s->first) == names.end()) { - unload(ApplicationHelper(_communicator, s->second), entries); - _descriptors.erase(s++); + unload(ApplicationHelper(_communicator, s->second.descriptor), entries); + _applications.erase(s++); } else { @@ -402,14 +404,14 @@ Database::addApplicationDescriptor(AdminSessionI* session, const ApplicationDesc wait(); } - if(_descriptors.find(desc.name) != _descriptors.end()) + if(_applications.find(desc.name) != _applications.end()) { throw DeploymentException("application `" + desc.name + "' already exists"); } ApplicationHelper helper(_communicator, desc); checkForAddition(helper); - load(helper, entries); + load(helper, entries, 1); _updating.insert(desc.name); } @@ -445,9 +447,17 @@ Database::addApplicationDescriptor(AdminSessionI* session, const ApplicationDesc // Save the application descriptor. // int serial; + ApplicationInfo info; { Lock sync(*this); - _descriptors.put(StringApplicationDescriptorDict::value_type(desc.name, desc)); + + info.createTime = info.updateTime = IceUtil::Time::now().toMilliSeconds(); + info.createUser = info.updateUser = _lockUserId; + info.descriptor = desc; + info.revision = 1; + + _applications.put(StringApplicationInfoDict::value_type(desc.name, info)); + serial = ++_serial; _updating.erase(desc.name); notifyAll(); @@ -458,7 +468,7 @@ Database::addApplicationDescriptor(AdminSessionI* session, const ApplicationDesc // if(_registryObserverTopic) { - _registryObserverTopic->getPublisher()->applicationAdded(serial, desc); + _registryObserverTopic->getPublisher()->applicationAdded(serial, info); } if(_traceLevels->application > 0) @@ -469,11 +479,12 @@ Database::addApplicationDescriptor(AdminSessionI* session, const ApplicationDesc } void -Database::updateApplicationDescriptor(AdminSessionI* session, const ApplicationUpdateDescriptor& update, +Database::updateApplicationDescriptor(AdminSessionI* session, + const ApplicationUpdateDescriptor& update, int masterSerial) { ServerEntrySeq entries; - ApplicationDescriptor oldDesc; + ApplicationInfo oldApp; ApplicationDescriptor newDesc; { Lock sync(*this); @@ -484,25 +495,25 @@ Database::updateApplicationDescriptor(AdminSessionI* session, const ApplicationU wait(); } - StringApplicationDescriptorDict::const_iterator p = _descriptors.find(update.name); - if(p == _descriptors.end()) + StringApplicationInfoDict::const_iterator p = _applications.find(update.name); + if(p == _applications.end()) { throw ApplicationNotExistException(update.name); } + oldApp = p->second; - ApplicationHelper previous(_communicator, p->second); + ApplicationHelper previous(_communicator, oldApp.descriptor); ApplicationHelper helper(_communicator, previous.update(update)); checkForUpdate(previous, helper); - reload(previous, helper, entries); + reload(previous, helper, entries, oldApp.revision + 1); - oldDesc = previous.getDefinition(); newDesc = helper.getDefinition(); _updating.insert(update.name); } - finishUpdate(entries, update, oldDesc, newDesc); + finishUpdate(entries, update, oldApp, newDesc); } void @@ -510,7 +521,7 @@ Database::syncApplicationDescriptor(AdminSessionI* session, const ApplicationDes { ServerEntrySeq entries; ApplicationUpdateDescriptor update; - ApplicationDescriptor oldDesc; + ApplicationInfo oldApp; { Lock sync(*this); checkSessionLock(session); @@ -520,25 +531,24 @@ Database::syncApplicationDescriptor(AdminSessionI* session, const ApplicationDes wait(); } - StringApplicationDescriptorDict::const_iterator p = _descriptors.find(newDesc.name); - if(p == _descriptors.end()) + StringApplicationInfoDict::const_iterator p = _applications.find(newDesc.name); + if(p == _applications.end()) { throw ApplicationNotExistException(newDesc.name); } + oldApp = p->second; - ApplicationHelper previous(_communicator, p->second); + ApplicationHelper previous(_communicator, oldApp.descriptor); ApplicationHelper helper(_communicator, newDesc); update = helper.diff(previous); checkForUpdate(previous, helper); - reload(previous, helper, entries); - - oldDesc = previous.getDefinition(); + reload(previous, helper, entries, oldApp.revision + 1); _updating.insert(update.name); } - finishUpdate(entries, update, oldDesc, newDesc); + finishUpdate(entries, update, oldApp, newDesc); } void @@ -549,7 +559,7 @@ Database::instantiateServer(AdminSessionI* session, { ServerEntrySeq entries; ApplicationUpdateDescriptor update; - ApplicationDescriptor oldDesc; + ApplicationInfo oldApp; ApplicationDescriptor newDesc; { Lock sync(*this); @@ -560,26 +570,26 @@ Database::instantiateServer(AdminSessionI* session, wait(); } - StringApplicationDescriptorDict::const_iterator p = _descriptors.find(application); - if(p == _descriptors.end()) + StringApplicationInfoDict::const_iterator p = _applications.find(application); + if(p == _applications.end()) { throw ApplicationNotExistException(application); } + oldApp = p->second; - ApplicationHelper previous(_communicator, p->second); + ApplicationHelper previous(_communicator, oldApp.descriptor); ApplicationHelper helper(_communicator, previous.instantiateServer(node, instance)); update = helper.diff(previous); checkForUpdate(previous, helper); - reload(previous, helper, entries); + reload(previous, helper, entries, oldApp.revision + 1); - oldDesc = previous.getDefinition(); newDesc = helper.getDefinition(); _updating.insert(update.name); } - finishUpdate(entries, update, oldDesc, newDesc); + finishUpdate(entries, update, oldApp, newDesc); } void @@ -596,15 +606,15 @@ Database::removeApplicationDescriptor(AdminSessionI* session, const std::string& wait(); } - StringApplicationDescriptorDict::iterator p = _descriptors.find(name); - if(p == _descriptors.end()) + StringApplicationInfoDict::iterator p = _applications.find(name); + if(p == _applications.end()) { throw ApplicationNotExistException(name); } try { - ApplicationHelper helper(_communicator, p->second); + ApplicationHelper helper(_communicator, p->second.descriptor); unload(helper, entries); } catch(const DeploymentException&) @@ -616,7 +626,7 @@ Database::removeApplicationDescriptor(AdminSessionI* session, const std::string& // } - _descriptors.erase(p); + _applications.erase(p); serial = ++_serial; } @@ -642,23 +652,23 @@ ApplicationDescriptor Database::getApplicationDescriptor(const std::string& name) { Freeze::ConnectionPtr connection = Freeze::createConnection(_communicator, _envName); - StringApplicationDescriptorDict descriptors(connection, _descriptorDbName); + StringApplicationInfoDict descriptors(connection, _applicationDbName); - StringApplicationDescriptorDict::const_iterator p = descriptors.find(name); + StringApplicationInfoDict::const_iterator p = descriptors.find(name); if(p == descriptors.end()) { throw ApplicationNotExistException(name); } - return p->second; + return p->second.descriptor; } Ice::StringSeq Database::getAllApplications(const string& expression) { Freeze::ConnectionPtr connection = Freeze::createConnection(_communicator, _envName); - StringApplicationDescriptorDict descriptors(connection, _descriptorDbName); - return getMatchingKeys<StringApplicationDescriptorDict>(descriptors, expression); + StringApplicationInfoDict descriptors(connection, _applicationDbName); + return getMatchingKeys<StringApplicationInfoDict>(descriptors, expression); } void @@ -883,7 +893,7 @@ Database::removeAdapter(const string& adapterId) throw ex; } - Freeze::TransactionHolder txHolder(_connection); + Freeze::TransactionHolder txHolder(_connection); // Required because of the iterator StringAdapterInfoDict::iterator p = _adapters.find(adapterId); if(p != _adapters.end()) @@ -1466,7 +1476,7 @@ Database::checkObjectForAddition(const Ice::Identity& objectId) } void -Database::load(const ApplicationHelper& app, ServerEntrySeq& entries) +Database::load(const ApplicationHelper& app, ServerEntrySeq& entries, int rev) { const NodeDescriptorDict& nodes = app.getInstance().nodes; const string application = app.getInstance().name; @@ -1492,7 +1502,7 @@ Database::load(const ApplicationHelper& app, ServerEntrySeq& entries) map<string, ServerInfo> servers = app.getServerInfos(); for(map<string, ServerInfo>::const_iterator p = servers.begin(); p != servers.end(); ++p) { - entries.push_back(_serverCache.add(p->second)); + entries.push_back(_serverCache.add(p->second, rev)); } } @@ -1524,7 +1534,7 @@ Database::unload(const ApplicationHelper& app, ServerEntrySeq& entries) } void -Database::reload(const ApplicationHelper& oldApp, const ApplicationHelper& newApp, ServerEntrySeq& entries) +Database::reload(const ApplicationHelper& oldApp, const ApplicationHelper& newApp, ServerEntrySeq& entries, int rev) { const string application = oldApp.getInstance().name; @@ -1632,14 +1642,14 @@ Database::reload(const ApplicationHelper& oldApp, const ApplicationHelper& newAp // for(vector<ServerInfo>::const_iterator q = load.begin(); q != load.end(); ++q) { - entries.push_back(_serverCache.add(*q)); + entries.push_back(_serverCache.add(*q, rev)); } } void Database::finishUpdate(ServerEntrySeq& entries, const ApplicationUpdateDescriptor& update, - const ApplicationDescriptor& oldDesc, + const ApplicationInfo& oldApp, const ApplicationDescriptor& newDesc) { @@ -1657,8 +1667,8 @@ Database::finishUpdate(ServerEntrySeq& entries, Lock sync(*this); entries.clear(); ApplicationHelper previous(_communicator, newDesc); - ApplicationHelper helper(_communicator, oldDesc); - reload(previous, helper, entries); + ApplicationHelper helper(_communicator, oldApp.descriptor); + reload(previous, helper, entries, oldApp.revision); _updating.erase(newDesc.name); notifyAll(); } @@ -1677,20 +1687,29 @@ Database::finishUpdate(ServerEntrySeq& entries, // Save the application descriptor. // int serial; + ApplicationUpdateInfo updateInfo; { Lock sync(*this); - _descriptors.put(StringApplicationDescriptorDict::value_type(update.name, newDesc)); + + ApplicationInfo info = oldApp; + info.updateTime = updateInfo.updateTime = IceUtil::Time::now().toMilliSeconds(); + info.updateUser = updateInfo.updateUser = _lockUserId; + info.revision = updateInfo.revision = oldApp.revision + 1; + info.descriptor = newDesc; + updateInfo.descriptor = update; + + _applications.put(StringApplicationInfoDict::value_type(update.name, info)); serial = ++_serial; _updating.erase(update.name); notifyAll(); - } + } // // Notify the observers. // if(_registryObserverTopic) { - _registryObserverTopic->getPublisher()->applicationUpdated(serial, update); + _registryObserverTopic->getPublisher()->applicationUpdated(serial, updateInfo); } if(_traceLevels->application > 0) diff --git a/cpp/src/IceGrid/Database.h b/cpp/src/IceGrid/Database.h index 7a2c1b3c775..054d54ce99f 100644 --- a/cpp/src/IceGrid/Database.h +++ b/cpp/src/IceGrid/Database.h @@ -16,7 +16,7 @@ #include <Ice/CommunicatorF.h> #include <IceGrid/Admin.h> #include <IceGrid/Internal.h> -#include <IceGrid/StringApplicationDescriptorDict.h> +#include <IceGrid/StringApplicationInfoDict.h> #include <IceGrid/IdentityObjectInfoDict.h> #include <IceGrid/StringAdapterInfoDict.h> #include <IceGrid/ServerCache.h> @@ -76,7 +76,7 @@ public: void init(int serial); void initMaster(); - void initReplica(int, const ApplicationDescriptorSeq&, const AdapterInfoSeq&, const ObjectInfoSeq&); + void initReplica(int, const ApplicationInfoSeq&, const AdapterInfoSeq&, const ObjectInfoSeq&); void setClientProxy(const Ice::ObjectPrx&); void setServerProxy(const Ice::ObjectPrx&); @@ -141,17 +141,17 @@ private: void checkAdapterForAddition(const std::string&); void checkObjectForAddition(const Ice::Identity&); - void load(const ApplicationHelper&, ServerEntrySeq&); + void load(const ApplicationHelper&, ServerEntrySeq&, int); void unload(const ApplicationHelper&, ServerEntrySeq&); - void reload(const ApplicationHelper&, const ApplicationHelper&, ServerEntrySeq&); - void finishUpdate(ServerEntrySeq&, const ApplicationUpdateDescriptor&, const ApplicationDescriptor&, + void reload(const ApplicationHelper&, const ApplicationHelper&, ServerEntrySeq&, int); + void finishUpdate(ServerEntrySeq&, const ApplicationUpdateDescriptor&, const ApplicationInfo&, const ApplicationDescriptor&); void checkSessionLock(AdminSessionI*); friend struct AddComponent; - static const std::string _descriptorDbName; + static const std::string _applicationDbName; static const std::string _objectDbName; static const std::string _adapterDbName; static const std::string _replicaGroupDbName; @@ -177,10 +177,8 @@ private: Ice::ObjectPrx _clientProxy; Ice::ObjectPrx _serverProxy; - std::map<std::string, std::string> _applicationsByServerName; - Freeze::ConnectionPtr _connection; - StringApplicationDescriptorDict _descriptors; + StringApplicationInfoDict _applications; IdentityObjectInfoDict _objects; StringAdapterInfoDict _adapters; diff --git a/cpp/src/IceGrid/Makefile b/cpp/src/IceGrid/Makefile index c9685258785..669ede90dc7 100644 --- a/cpp/src/IceGrid/Makefile +++ b/cpp/src/IceGrid/Makefile @@ -55,7 +55,7 @@ NODE_OBJS = NodeI.o \ REGISTRY_OBJS = RegistryI.o \ InternalRegistryI.o \ - StringApplicationDescriptorDict.o \ + StringApplicationInfoDict.o \ IdentityObjectInfoDict.o \ StringAdapterInfoDict.o \ Database.o \ @@ -156,13 +156,13 @@ $(LOCAL_HDIR)/%.h %.cpp: $(SDIR)/%.ice $(SLICE2CPP) rm -f $(HDIR)/$(*F).h $(*F).cpp $(SLICE2CPP) $(SLICE2CPPFLAGS) $(SDIR)/$(*F).ice -$(LOCAL_HDIR)/StringApplicationDescriptorDict.h StringApplicationDescriptorDict.cpp: $(SLICE2FREEZE) - rm -f StringApplicationDescriptorDict.h StringApplicationDescriptorDict.cpp - $(SLICE2FREEZECMD) --dict IceGrid::StringApplicationDescriptorDict,string,IceGrid::ApplicationDescriptor \ - StringApplicationDescriptorDict ../../slice/IceGrid/Admin.ice +$(LOCAL_HDIR)/StringApplicationInfoDict.h StringApplicationInfoDict.cpp: $(SLICE2FREEZE) + rm -f StringApplicationInfoDict.h StringApplicationInfoDict.cpp + $(SLICE2FREEZECMD) --dict IceGrid::StringApplicationInfoDict,string,IceGrid::ApplicationInfo \ + StringApplicationInfoDict $(LOCAL_SDIR)/Internal.ice clean:: - rm -f StringApplicationDescriptorDict.h StringApplicationDescriptorDict.cpp + rm -f StringApplicationInfoDict.h StringApplicationInfoDict.cpp $(LOCAL_HDIR)/IdentityObjectInfoDict.h IdentityObjectInfoDict.cpp: $(SLICE2FREEZE) rm -f IdentityObjectInfoDict.h IdentityObjectInfoDict.cpp diff --git a/cpp/src/IceGrid/NodeCache.cpp b/cpp/src/IceGrid/NodeCache.cpp index f7ba2115a3f..9b8ede8039c 100644 --- a/cpp/src/IceGrid/NodeCache.cpp +++ b/cpp/src/IceGrid/NodeCache.cpp @@ -399,7 +399,7 @@ NodeEntry::canRemove() } void -NodeEntry::loadServer(const ServerEntryPtr& entry, const ServerInfo& server, const SessionIPtr& session) +NodeEntry::loadServer(const ServerEntryPtr& entry, const ServerInfo& server, const SessionIPtr& session, int revision) { try { diff --git a/cpp/src/IceGrid/NodeCache.h b/cpp/src/IceGrid/NodeCache.h index e6ab55a8827..86989d237c9 100644 --- a/cpp/src/IceGrid/NodeCache.h +++ b/cpp/src/IceGrid/NodeCache.h @@ -51,7 +51,7 @@ public: bool canRemove(); - void loadServer(const ServerEntryPtr&, const ServerInfo&, const SessionIPtr&); + void loadServer(const ServerEntryPtr&, const ServerInfo&, const SessionIPtr&, int); void destroyServer(const ServerEntryPtr&, const std::string&); ServerInfo getServerInfo(const ServerInfo&, const SessionIPtr&); diff --git a/cpp/src/IceGrid/ReplicaSessionManager.cpp b/cpp/src/IceGrid/ReplicaSessionManager.cpp index 4311ac3c531..9b02f2f35df 100644 --- a/cpp/src/IceGrid/ReplicaSessionManager.cpp +++ b/cpp/src/IceGrid/ReplicaSessionManager.cpp @@ -28,7 +28,7 @@ public: virtual void init(int serial, - const ApplicationDescriptorSeq& applications, + const ApplicationInfoSeq& applications, const AdapterInfoSeq& adapters, const ObjectInfoSeq& objects, const Ice::Current&) @@ -37,9 +37,9 @@ public: } virtual void - applicationAdded(int serial, const ApplicationDescriptor& application, const Ice::Current&) + applicationAdded(int serial, const ApplicationInfo& application, const Ice::Current&) { - _database->addApplicationDescriptor(0, application, serial); + _database->addApplicationDescriptor(0, application.descriptor, serial); } virtual void @@ -49,9 +49,9 @@ public: } virtual void - applicationUpdated(int serial, const ApplicationUpdateDescriptor& update, const Ice::Current&) + applicationUpdated(int serial, const ApplicationUpdateInfo& update, const Ice::Current&) { - _database->updateApplicationDescriptor(0, update, serial); + _database->updateApplicationDescriptor(0, update.descriptor, serial); } virtual void diff --git a/cpp/src/IceGrid/ServerCache.cpp b/cpp/src/IceGrid/ServerCache.cpp index bc09d395656..fc92a16e8c5 100644 --- a/cpp/src/IceGrid/ServerCache.cpp +++ b/cpp/src/IceGrid/ServerCache.cpp @@ -75,7 +75,7 @@ ServerCache::ServerCache(const Ice::CommunicatorPtr& communicator, } ServerEntryPtr -ServerCache::add(const ServerInfo& info) +ServerCache::add(const ServerInfo& info, int rev) { Lock sync(*this); @@ -85,7 +85,7 @@ ServerCache::add(const ServerInfo& info) entry = new ServerEntry(*this, info.descriptor->id); addImpl(info.descriptor->id, entry); } - entry->update(info); + entry->update(info, rev); _nodeCache.get(info.node, true)->addServer(entry); forEachCommunicator(AddCommunicator(*this, entry))(info.descriptor); @@ -222,7 +222,7 @@ ServerEntry::sync() } void -ServerEntry::update(const ServerInfo& info) +ServerEntry::update(const ServerInfo& info, int revision) { Lock sync(*this); @@ -252,6 +252,7 @@ ServerEntry::update(const ServerInfo& info) // Update the allocatable flag. // const_cast<bool&>(_allocatable) = info.descriptor->allocatable || info.descriptor->activation == "session"; + _revision = revision; } void @@ -505,6 +506,7 @@ void ServerEntry::syncImpl(bool waitForUpdate) { ServerInfo load; + int revision; SessionIPtr session; ServerInfo destroy; @@ -543,6 +545,7 @@ ServerEntry::syncImpl(bool waitForUpdate) { load = *_load; session = _session; + revision = _revision; } else { @@ -567,7 +570,7 @@ ServerEntry::syncImpl(bool waitForUpdate) { try { - _cache.getNodeCache().get(load.node)->loadServer(this, load, session); + _cache.getNodeCache().get(load.node)->loadServer(this, load, session, revision); } catch(NodeNotExistException&) { @@ -611,7 +614,9 @@ ServerEntry::loadCallback(const ServerPrx& proxy, const AdapterPrxDict& adpts, i { ServerInfo load; SessionIPtr session; + int revision; ServerInfo destroy; + { Lock sync(*this); if(!_updated) @@ -652,6 +657,7 @@ ServerEntry::loadCallback(const ServerPrx& proxy, const AdapterPrxDict& adpts, i { load = *_load; session = _session; + revision = _revision; } } } @@ -672,7 +678,7 @@ ServerEntry::loadCallback(const ServerPrx& proxy, const AdapterPrxDict& adpts, i { try { - _cache.getNodeCache().get(load.node)->loadServer(this, load, session); + _cache.getNodeCache().get(load.node)->loadServer(this, load, session, revision); } catch(NodeNotExistException&) { @@ -686,6 +692,8 @@ ServerEntry::destroyCallback() { ServerInfo load; SessionIPtr session; + int revision; + { Lock sync(*this); _destroy.reset(0); @@ -701,6 +709,7 @@ ServerEntry::destroyCallback() _updated = false; load = *_load; session = _session; + revision = _revision; } } @@ -708,7 +717,7 @@ ServerEntry::destroyCallback() { try { - _cache.getNodeCache().get(load.node)->loadServer(this, load, session); + _cache.getNodeCache().get(load.node)->loadServer(this, load, session, revision); } catch(NodeNotExistException&) { @@ -726,7 +735,9 @@ ServerEntry::exception(const Ice::Exception& ex) { ServerInfo load; SessionIPtr session; + int revision; bool remove = false; + { Lock sync(*this); if((_destroy.get() && !_load.get()) || (!_destroy.get() && !_updated)) @@ -743,6 +754,7 @@ ServerEntry::exception(const Ice::Exception& ex) _updated = false; load = *_load.get(); session = _session; + revision = _revision; } } @@ -750,7 +762,7 @@ ServerEntry::exception(const Ice::Exception& ex) { try { - _cache.getNodeCache().get(load.node)->loadServer(this, load, session); + _cache.getNodeCache().get(load.node)->loadServer(this, load, session, revision); } catch(NodeNotExistException&) { diff --git a/cpp/src/IceGrid/ServerCache.h b/cpp/src/IceGrid/ServerCache.h index 288579a5020..2348326614a 100644 --- a/cpp/src/IceGrid/ServerCache.h +++ b/cpp/src/IceGrid/ServerCache.h @@ -37,7 +37,7 @@ public: ServerEntry(ServerCache&, const std::string&); void sync(); - void update(const ServerInfo&); + void update(const ServerInfo&, int); void destroy(); ServerInfo getServerInfo(bool = false) const; @@ -80,6 +80,7 @@ private: std::auto_ptr<Ice::Exception> _exception; SessionIPtr _session; + int _revision; }; typedef IceUtil::Handle<ServerEntry> ServerEntryPtr; typedef std::vector<ServerEntryPtr> ServerEntrySeq; @@ -90,7 +91,7 @@ public: ServerCache(const Ice::CommunicatorPtr&, NodeCache&, AdapterCache&, ObjectCache&, AllocatableObjectCache&, int); - ServerEntryPtr add(const ServerInfo&); + ServerEntryPtr add(const ServerInfo&, int); ServerEntryPtr get(const std::string&) const; bool has(const std::string&) const; ServerEntryPtr remove(const std::string&, bool = true); diff --git a/cpp/src/IceGrid/SessionManager.h b/cpp/src/IceGrid/SessionManager.h index 576e4aabe38..d29df322354 100644 --- a/cpp/src/IceGrid/SessionManager.h +++ b/cpp/src/IceGrid/SessionManager.h @@ -72,7 +72,10 @@ public: if(updateState) { Lock sync(*this); - _state = session ? Connected : Disconnected; + if(_state != Destroyed) + { + _state = session ? Connected : Disconnected; + } _session = session; notifyAll(); } diff --git a/cpp/src/IceGrid/Topics.cpp b/cpp/src/IceGrid/Topics.cpp index 8ebedee368c..df673f08813 100644 --- a/cpp/src/IceGrid/Topics.cpp +++ b/cpp/src/IceGrid/Topics.cpp @@ -295,7 +295,7 @@ RegistryObserverTopic::RegistryObserverTopic(const Ice::ObjectAdapterPtr& adapte void RegistryObserverTopic::init(int serial, - const ApplicationDescriptorSeq& apps, + const ApplicationInfoSeq& apps, const AdapterInfoSeq& adpts, const ObjectInfoSeq& objects, const Ice::Current&) @@ -304,9 +304,9 @@ RegistryObserverTopic::init(int serial, _serial = serial; - for(ApplicationDescriptorSeq::const_iterator p = apps.begin(); p != apps.end(); ++p) + for(ApplicationInfoSeq::const_iterator p = apps.begin(); p != apps.end(); ++p) { - _applications.insert(make_pair(p->name, *p)); + _applications.insert(make_pair(p->descriptor.name, *p)); } for(AdapterInfoSeq::const_iterator q = adpts.begin(); q != adpts.end(); ++q) { @@ -321,15 +321,15 @@ RegistryObserverTopic::init(int serial, } void -RegistryObserverTopic::applicationAdded(int serial, const ApplicationDescriptor& desc, const Ice::Current&) +RegistryObserverTopic::applicationAdded(int serial, const ApplicationInfo& info, const Ice::Current&) { Lock sync(*this); updateSerial(serial); - _applications.insert(make_pair(desc.name, desc)); + _applications.insert(make_pair(info.descriptor.name, info)); - _internalPublisher->applicationAdded(serial, desc); + _internalPublisher->applicationAdded(serial, info); } void @@ -345,18 +345,21 @@ RegistryObserverTopic::applicationRemoved(int serial, const string& name, const } void -RegistryObserverTopic::applicationUpdated(int serial, const ApplicationUpdateDescriptor& desc, const Ice::Current& c) +RegistryObserverTopic::applicationUpdated(int serial, const ApplicationUpdateInfo& info, const Ice::Current& c) { Lock sync(*this); updateSerial(serial); try { - map<string, ApplicationDescriptor>::iterator p = _applications.find(desc.name); + map<string, ApplicationInfo>::iterator p = _applications.find(info.descriptor.name); if(p != _applications.end()) { - ApplicationHelper helper(c.adapter->getCommunicator(), p->second); - p->second = helper.update(desc); + ApplicationHelper helper(c.adapter->getCommunicator(), p->second.descriptor); + p->second.descriptor = helper.update(info.descriptor); + p->second.updateTime = info.updateTime; + p->second.updateUser = info.updateUser; + p->second.revision = info.revision; } } catch(const DeploymentException& ex) @@ -379,7 +382,7 @@ RegistryObserverTopic::applicationUpdated(int serial, const ApplicationUpdateDes assert(false); } - _internalPublisher->applicationUpdated(serial, desc); + _internalPublisher->applicationUpdated(serial, info); } void @@ -461,7 +464,7 @@ RegistryObserverTopic::subscribe(const RegistryObserverPrx& observer, int serial { if(serial == -1) { - ApplicationDescriptorSeq applications; + ApplicationInfoSeq applications; AdapterInfoSeq adapters; ObjectInfoSeq objects; { @@ -469,7 +472,7 @@ RegistryObserverTopic::subscribe(const RegistryObserverPrx& observer, int serial assert(_serial != -1); serial = _serial; - map<string, ApplicationDescriptor>::const_iterator p; + map<string, ApplicationInfo>::const_iterator p; for(p = _applications.begin(); p != _applications.end(); ++p) { applications.push_back(p->second); diff --git a/cpp/src/IceGrid/Topics.h b/cpp/src/IceGrid/Topics.h index 2101fa41c4a..90924b4fea7 100644 --- a/cpp/src/IceGrid/Topics.h +++ b/cpp/src/IceGrid/Topics.h @@ -53,12 +53,12 @@ class RegistryObserverTopic : public RegistryObserver, public IceUtil::Monitor<I public: RegistryObserverTopic(const Ice::ObjectAdapterPtr&, const IceStorm::TopicManagerPrx&); - virtual void init(int, const ApplicationDescriptorSeq&, const AdapterInfoSeq&, const ObjectInfoSeq&, + virtual void init(int, const ApplicationInfoSeq&, const AdapterInfoSeq&, const ObjectInfoSeq&, const Ice::Current&); - virtual void applicationAdded(int, const ApplicationDescriptor&, const Ice::Current&); + virtual void applicationAdded(int, const ApplicationInfo&, const Ice::Current&); virtual void applicationRemoved(int, const std::string&, const Ice::Current&); - virtual void applicationUpdated(int, const ApplicationUpdateDescriptor&, const Ice::Current&); + virtual void applicationUpdated(int, const ApplicationUpdateInfo&, const Ice::Current&); virtual void adapterAdded(int, const AdapterInfo&, const Ice::Current&); virtual void adapterUpdated(int, const AdapterInfo&, const Ice::Current&); @@ -81,7 +81,7 @@ private: const RegistryObserverPrx _publisher; int _serial; - std::map<std::string, ApplicationDescriptor> _applications; + std::map<std::string, ApplicationInfo> _applications; std::map<std::string, AdapterInfo> _adapters; std::map<Ice::Identity, ObjectInfo> _objects; }; |