diff options
Diffstat (limited to 'cpp/src/IceGrid/Database.cpp')
-rw-r--r-- | cpp/src/IceGrid/Database.cpp | 222 |
1 files changed, 146 insertions, 76 deletions
diff --git a/cpp/src/IceGrid/Database.cpp b/cpp/src/IceGrid/Database.cpp index 22fd031b6f9..30d7e7be165 100644 --- a/cpp/src/IceGrid/Database.cpp +++ b/cpp/src/IceGrid/Database.cpp @@ -183,17 +183,16 @@ private: } -Database::Database(const Ice::CommunicatorPtr& communicator, - const Ice::ObjectAdapterPtr& adapter, +Database::Database(const Ice::ObjectAdapterPtr& adapter, const string& envName, int nodeSessionTimeout, const TraceLevelsPtr& traceLevels) : - _communicator(communicator), + _communicator(adapter->getCommunicator()), _internalAdapter(adapter), _envName(envName), _nodeSessionTimeout(nodeSessionTimeout), _traceLevels(traceLevels), - _connection(Freeze::createConnection(communicator, envName)), + _connection(Freeze::createConnection(adapter->getCommunicator(), envName)), _descriptors(_connection, _descriptorDbName), _objects(_connection, _objectDbName), _adapters(_connection, _adapterDbName) @@ -220,6 +219,13 @@ Database::~Database() } void +Database::setRegistryObserver(const RegistryObserverPrx& observer) +{ + Lock sync(*this); + _registryObserver = observer; +} + +void Database::addApplicationDescriptor(const ApplicationDescriptorPtr& descriptor) { ServerEntrySeq entries; @@ -291,6 +297,11 @@ Database::addApplicationDescriptor(const ApplicationDescriptorPtr& descriptor) _descriptors.put(make_pair(descriptor->name, descriptor)); } + // + // Notify the observers. + // + _registryObserver->applicationAdded(0, descriptor); + if(_traceLevels->application > 0) { Ice::Trace out(_traceLevels->logger, _traceLevels->applicationCat); @@ -304,102 +315,72 @@ Database::addApplicationDescriptor(const ApplicationDescriptorPtr& descriptor) } void -Database::updateApplicationDescriptor(const ApplicationDescriptorPtr& newDesc) +Database::updateApplicationDescriptor(const ApplicationUpdateDescriptor& update) { ServerEntrySeq entries; { Lock sync(*this); - - // - // Find the application to update. - // - StringApplicationDescriptorDict::const_iterator p = _descriptors.find(newDesc->name); + + StringApplicationDescriptorDict::const_iterator p = _descriptors.find(update.name); if(p == _descriptors.end()) { ApplicationNotExistException ex; - ex.name = newDesc->name; + ex.name = update.name; throw ex; } - ApplicationDescriptorPtr origDesc = p->second; // - // Ensure that the new application servers aren't already - // registered. + // Update the application descriptor. // - set<string> oldSvrs; - set<string> newSvrs; - for_each(origDesc->servers.begin(), origDesc->servers.end(), AddServerName(oldSvrs)); - for_each(newDesc->servers.begin(), newDesc->servers.end(), AddServerName(newSvrs)); - - set<string> added, removed, updated; - set_intersection(newSvrs.begin(), newSvrs.end(), oldSvrs.begin(), oldSvrs.end(), set_inserter(updated)); - set_difference(oldSvrs.begin(), oldSvrs.end(), newSvrs.begin(), newSvrs.end(), set_inserter(removed)); - set_difference(newSvrs.begin(), newSvrs.end(), oldSvrs.begin(), oldSvrs.end(), set_inserter(added)); - try - { - for_each(added.begin(), added.end(), objFunc(*this, &Database::checkServerForAddition)); - } - catch(const ServerExistsException& e) - { - DeploymentException ex; - ex.reason = "server `" + e.name + "' is already registered"; - throw ex; - } + ApplicationDescriptorHelper helper(_communicator, p->second); + helper.update(update); // - // Ensure that the new application adapters aren't already - // registered. + // Synchronize the application descriptor. // - set<string> oldAdpts; - set<string> newAdpts; - for_each(origDesc->servers.begin(), origDesc->servers.end(), forEachComponent(AddAdapterId(oldAdpts))); - for_each(newDesc->servers.begin(), newDesc->servers.end(), forEachComponent(AddAdapterId(newAdpts))); + syncApplicationDescriptorNoSync(p->second, helper.getDescriptor(), entries); + } - set<string> addedAdpts; - set_difference(newAdpts.begin(), newAdpts.end(), oldAdpts.begin(), oldAdpts.end(), set_inserter(addedAdpts)); - try - { - for_each(addedAdpts.begin(), addedAdpts.end(), objFunc(*this, &Database::checkAdapterForAddition)); - } - catch(const AdapterExistsException& e) - { - DeploymentException ex; - ex.reason = "adapter `" + e.id + "' is already registered"; - throw ex; - } + // + // Notify the observers. + // + _registryObserver->applicationUpdated(0, update); - // - // Ensure that the new application objects aren't already - // registered. - // - set<Ice::Identity> oldObjs; - set<Ice::Identity> newObjs; - for_each(origDesc->servers.begin(), origDesc->servers.end(), forEachComponent(AddObjectId(oldObjs))); - for_each(newDesc->servers.begin(), newDesc->servers.end(), forEachComponent(AddObjectId(newObjs))); + if(_traceLevels->application > 0) + { + Ice::Trace out(_traceLevels->logger, _traceLevels->applicationCat); + out << "updated application `" << update.name << "'"; + } - set<Ice::Identity> addedObjs; - set_difference(newObjs.begin(), newObjs.end(), oldObjs.begin(), oldObjs.end(), set_inserter(addedObjs)); - try - { - for_each(addedObjs.begin(), addedObjs.end(), objFunc(*this, &Database::checkObjectForAddition)); - } - catch(const ObjectExistsException& e) + for_each(entries.begin(), entries.end(), IceUtil::voidMemFun(&Database::ServerEntry::sync)); +} + +void +Database::syncApplicationDescriptor(const ApplicationDescriptorPtr& newDesc) +{ + ServerEntrySeq entries; + { + Lock sync(*this); + + StringApplicationDescriptorDict::const_iterator p = _descriptors.find(newDesc->name); + if(p == _descriptors.end()) { - DeploymentException ex; - ex.reason = "object `" + Ice::identityToString(e.id) + "' is already registered"; + ApplicationNotExistException ex; + ex.name = newDesc->name; throw ex; - } + } + ApplicationDescriptorPtr origDesc = p->second; // - // Register the new servers, unregister the old ones and - // update the updated ones. + // Synchronize the application descriptor. // - addServers(newDesc->servers, added, entries); - updateServers(origDesc, newDesc, updated, entries); - removeServers(origDesc->servers, removed, entries); + syncApplicationDescriptorNoSync(origDesc, newDesc, entries); + } - _descriptors.put(make_pair(newDesc->name, newDesc)); - } + // + // Notify the observers. + // + _registryObserver->applicationSynced(0, newDesc); if(_traceLevels->application > 0) { @@ -411,6 +392,90 @@ Database::updateApplicationDescriptor(const ApplicationDescriptorPtr& newDesc) } void +Database::syncApplicationDescriptorNoSync(const ApplicationDescriptorPtr& origDesc, + const ApplicationDescriptorPtr& newDesc, + ServerEntrySeq& entries) +{ + // + // Ensure that the new application servers aren't already + // registered. + // + set<string> oldSvrs; + set<string> newSvrs; + for_each(origDesc->servers.begin(), origDesc->servers.end(), AddServerName(oldSvrs)); + for_each(newDesc->servers.begin(), newDesc->servers.end(), AddServerName(newSvrs)); + + set<string> added, removed, updated; + set_intersection(newSvrs.begin(), newSvrs.end(), oldSvrs.begin(), oldSvrs.end(), set_inserter(updated)); + set_difference(oldSvrs.begin(), oldSvrs.end(), newSvrs.begin(), newSvrs.end(), set_inserter(removed)); + set_difference(newSvrs.begin(), newSvrs.end(), oldSvrs.begin(), oldSvrs.end(), set_inserter(added)); + try + { + for_each(added.begin(), added.end(), objFunc(*this, &Database::checkServerForAddition)); + } + catch(const ServerExistsException& e) + { + DeploymentException ex; + ex.reason = "server `" + e.name + "' is already registered"; + throw ex; + } + + // + // Ensure that the new application adapters aren't already + // registered. + // + set<string> oldAdpts; + set<string> newAdpts; + for_each(origDesc->servers.begin(), origDesc->servers.end(), forEachComponent(AddAdapterId(oldAdpts))); + for_each(newDesc->servers.begin(), newDesc->servers.end(), forEachComponent(AddAdapterId(newAdpts))); + + set<string> addedAdpts; + set_difference(newAdpts.begin(), newAdpts.end(), oldAdpts.begin(), oldAdpts.end(), set_inserter(addedAdpts)); + try + { + for_each(addedAdpts.begin(), addedAdpts.end(), objFunc(*this, &Database::checkAdapterForAddition)); + } + catch(const AdapterExistsException& e) + { + DeploymentException ex; + ex.reason = "adapter `" + e.id + "' is already registered"; + throw ex; + } + + // + // Ensure that the new application objects aren't already + // registered. + // + set<Ice::Identity> oldObjs; + set<Ice::Identity> newObjs; + for_each(origDesc->servers.begin(), origDesc->servers.end(), forEachComponent(AddObjectId(oldObjs))); + for_each(newDesc->servers.begin(), newDesc->servers.end(), forEachComponent(AddObjectId(newObjs))); + + set<Ice::Identity> addedObjs; + set_difference(newObjs.begin(), newObjs.end(), oldObjs.begin(), oldObjs.end(), set_inserter(addedObjs)); + try + { + for_each(addedObjs.begin(), addedObjs.end(), objFunc(*this, &Database::checkObjectForAddition)); + } + catch(const ObjectExistsException& e) + { + DeploymentException ex; + ex.reason = "object `" + Ice::identityToString(e.id) + "' is already registered"; + throw ex; + } + + // + // Register the new servers, unregister the old ones and + // update the updated ones. + // + addServers(newDesc->servers, added, entries); + updateServers(origDesc, newDesc, updated, entries); + removeServers(origDesc->servers, removed, entries); + + _descriptors.put(make_pair(newDesc->name, newDesc)); +} + +void Database::removeApplicationDescriptor(const std::string& name) { ApplicationDescriptorPtr descriptor; @@ -432,6 +497,11 @@ Database::removeApplicationDescriptor(const std::string& name) removeServers(descriptor->servers, servers, entries); } + // + // Notify the observers + // + _registryObserver->applicationRemoved(0, descriptor->name); + if(_traceLevels->application > 0) { Ice::Trace out(_traceLevels->logger, _traceLevels->applicationCat); |