diff options
Diffstat (limited to 'cpp/src/IceGrid/Database.cpp')
-rw-r--r-- | cpp/src/IceGrid/Database.cpp | 82 |
1 files changed, 46 insertions, 36 deletions
diff --git a/cpp/src/IceGrid/Database.cpp b/cpp/src/IceGrid/Database.cpp index 2088162008c..e85da36de40 100644 --- a/cpp/src/IceGrid/Database.cpp +++ b/cpp/src/IceGrid/Database.cpp @@ -1017,6 +1017,43 @@ Database::unload(const ApplicationHelper& app, ServerEntrySeq& entries) void Database::reload(const ApplicationHelper& oldApp, const ApplicationHelper& newApp, ServerEntrySeq& entries) { + // + // Figure out which servers need to removed/updated and added. + // + map<string, ServerInfo> oldServers = oldApp.getServerInfos(); + map<string, ServerInfo> newServers = newApp.getServerInfos(); + vector<ServerInfo> load; + map<string, ServerInfo>::const_iterator p; + for(p = newServers.begin(); p != newServers.end(); ++p) + { + map<string, ServerInfo>::const_iterator q = oldServers.find(p->first); + if(q == oldServers.end()) + { + load.push_back(p->second); + } + else if(p->second.node != q->second.node || + ServerHelper(p->second.descriptor) != ServerHelper(q->second.descriptor)) + { + entries.push_back(_serverCache.remove(p->first, false)); // Don't destroy the server if it was updated. + load.push_back(p->second); + } + } + + // + // Remove destroyed servers. + // + for(p = oldServers.begin(); p != oldServers.end(); ++p) + { + map<string, ServerInfo>::const_iterator q = newServers.find(p->first); + if(q == newServers.end()) + { + entries.push_back(_serverCache.remove(p->first)); + } + } + + // + // Remove all the node descriptors. + // const NodeDescriptorDict& oldNodes = oldApp.getInstance().nodes; const string application = oldApp.getInstance().name; NodeDescriptorDict::const_iterator n; @@ -1024,14 +1061,9 @@ Database::reload(const ApplicationHelper& oldApp, const ApplicationHelper& newAp { _nodeCache.get(n->first)->removeDescriptor(application); } - const NodeDescriptorDict& newNodes = newApp.getInstance().nodes; - for(n = newNodes.begin(); n != newNodes.end(); ++n) - { - _nodeCache.get(n->first, true)->addDescriptor(application, n->second); - } // - // Unload/load replicated adapters. + // Remove all the replicated adapters. // const ReplicatedAdapterDescriptorSeq& oldAdpts = oldApp.getInstance().replicatedAdapters; ReplicatedAdapterDescriptorSeq::const_iterator r; @@ -1043,6 +1075,10 @@ Database::reload(const ApplicationHelper& oldApp, const ApplicationHelper& newAp } _adapterCache.get(r->id, false)->disableReplication(); } + + // + // Add back replicated adapters. + // const ReplicatedAdapterDescriptorSeq& newAdpts = newApp.getInstance().replicatedAdapters; for(r = newAdpts.begin(); r != newAdpts.end(); ++r) { @@ -1053,41 +1089,15 @@ Database::reload(const ApplicationHelper& oldApp, const ApplicationHelper& newAp } } - map<string, ServerInfo> oldServers = oldApp.getServerInfos(); - map<string, ServerInfo> newServers = newApp.getServerInfos(); - // - // Unload updated and removed servers and keep track of added and - // updated servers to reload them after. + // Add back node descriptors. // - vector<ServerInfo> load; - map<string, ServerInfo>::const_iterator p; - for(p = newServers.begin(); p != newServers.end(); ++p) - { - map<string, ServerInfo>::const_iterator q = oldServers.find(p->first); - if(q == oldServers.end()) - { - load.push_back(p->second); - } - else if(p->second.node != q->second.node || - ServerHelper(p->second.descriptor) != ServerHelper(q->second.descriptor)) - { - entries.push_back(_serverCache.remove(p->first, false)); // Don't destroy the server if it was updated. - load.push_back(p->second); - } - } - for(p = oldServers.begin(); p != oldServers.end(); ++p) + const NodeDescriptorDict& newNodes = newApp.getInstance().nodes; + for(n = newNodes.begin(); n != newNodes.end(); ++n) { - map<string, ServerInfo>::const_iterator q = newServers.find(p->first); - if(q == newServers.end()) - { - entries.push_back(_serverCache.remove(p->first)); - } + _nodeCache.get(n->first, true)->addDescriptor(application, n->second); } - // - // Load added servers and reload updated ones. - // for(vector<ServerInfo>::const_iterator q = load.begin(); q != load.end(); ++q) { entries.push_back(_serverCache.add(*q)); |