summaryrefslogtreecommitdiff
path: root/cpp/src/IceGrid/Database.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/IceGrid/Database.cpp')
-rw-r--r--cpp/src/IceGrid/Database.cpp82
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));