summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernard Normier <bernard@zeroc.com>2005-11-08 19:51:53 +0000
committerBernard Normier <bernard@zeroc.com>2005-11-08 19:51:53 +0000
commit01a5e905cb352901a9aeef1e6328f581fe77a267 (patch)
treee1fd65505a37ba34db97cb6bd5d85df607f06d7a
parentminor fixes to comments (diff)
downloadice-01a5e905cb352901a9aeef1e6328f581fe77a267.tar.bz2
ice-01a5e905cb352901a9aeef1e6328f581fe77a267.tar.xz
ice-01a5e905cb352901a9aeef1e6328f581fe77a267.zip
Fixed bug #586
-rwxr-xr-xjava/src/IceGrid/TreeNode/Application.java10
-rwxr-xr-xjava/src/IceGrid/TreeNode/Node.java290
-rwxr-xr-xjava/src/IceGrid/TreeNode/Nodes.java20
-rwxr-xr-xjava/src/IceGrid/TreeNode/Server.java1
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServerTemplate.java9
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServerTemplates.java27
6 files changed, 248 insertions, 109 deletions
diff --git a/java/src/IceGrid/TreeNode/Application.java b/java/src/IceGrid/TreeNode/Application.java
index 01f6ebf6e68..4c384cca369 100755
--- a/java/src/IceGrid/TreeNode/Application.java
+++ b/java/src/IceGrid/TreeNode/Application.java
@@ -540,7 +540,7 @@ public class Application extends EditableParent
}
//
- // Replicated adapters
+ // Replica groups
//
for(int i = 0; i < desc.removeReplicaGroups.length; ++i)
{
@@ -573,7 +573,8 @@ public class Application extends EditableParent
}
_descriptor.serverTemplates.putAll(desc.serverTemplates);
_serverTemplates.update(desc.serverTemplates,
- desc.removeServerTemplates);
+ desc.removeServerTemplates,
+ desc.serviceTemplates.keySet());
//
// Nodes
@@ -585,7 +586,10 @@ public class Application extends EditableParent
//
// Updates also _descriptor.nodes
//
- _nodes.update(desc.nodes, desc.removeNodes);
+ _nodes.update(desc.nodes, desc.removeNodes,
+ desc.serverTemplates.keySet(),
+ desc.serviceTemplates.keySet());
+
}
ServerTemplate findServerTemplate(String id)
diff --git a/java/src/IceGrid/TreeNode/Node.java b/java/src/IceGrid/TreeNode/Node.java
index fc70ca311be..0047f3b5128 100755
--- a/java/src/IceGrid/TreeNode/Node.java
+++ b/java/src/IceGrid/TreeNode/Node.java
@@ -789,139 +789,227 @@ class Node extends EditableParent
}
- void update(NodeUpdateDescriptor update, Application application)
+ void update(NodeUpdateDescriptor update,
+ java.util.Set serverTemplates, java.util.Set serviceTemplates)
throws UpdateFailedException
{
- //
- // Description
- //
- if(update.description != null)
- {
- _descriptor.description = update.description.value;
- _origDescription = _descriptor.description;
- }
-
- //
- // Load factor
- //
- if(update.loadFactor != null)
- {
- _descriptor.loadFactor = update.loadFactor.value;
- _origLoadFactor = _descriptor.loadFactor;
- }
-
- //
- // Variables
- //
- for(int i = 0; i < update.removeVariables.length; ++i)
- {
- _descriptor.variables.remove(update.removeVariables[i]);
- }
- _descriptor.variables.putAll(update.variables);
-
- //
- // One big set of removes
- //
- removeChildren(update.removeServers);
-
- //
- // Update _descriptor
- //
- for(int i = 0; i < update.removeServers.length; ++i)
- {
- _descriptor.serverInstances.remove(update.removeServers[i]);
- _descriptor.servers.remove(update.removeServers[i]);
- }
+ Application application = getApplication();
- //
- // One big set of updates, followed by inserts
- //
java.util.Vector newChildren = new java.util.Vector();
java.util.Vector updatedChildren = new java.util.Vector();
-
- java.util.Iterator p = update.serverInstances.iterator();
- while(p.hasNext())
+
+ if(update != null)
{
- ServerInstanceDescriptor instanceDescriptor =
- (ServerInstanceDescriptor)p.next();
-
//
- // Find template
+ // Description
//
- TemplateDescriptor templateDescriptor =
- application.findServerTemplateDescriptor(instanceDescriptor.template);
-
- assert templateDescriptor != null;
+ if(update.description != null)
+ {
+ _descriptor.description = update.description.value;
+ _origDescription = _descriptor.description;
+ }
- ServerDescriptor serverDescriptor =
- (ServerDescriptor)templateDescriptor.descriptor;
+ //
+ // Load factor
+ //
+ if(update.loadFactor != null)
+ {
+ _descriptor.loadFactor = update.loadFactor.value;
+ _origLoadFactor = _descriptor.loadFactor;
+ }
- assert serverDescriptor != null;
+ //
+ // Variables
+ //
+ for(int i = 0; i < update.removeVariables.length; ++i)
+ {
+ _descriptor.variables.remove(update.removeVariables[i]);
+ }
+ _descriptor.variables.putAll(update.variables);
//
- // Build resolver
+ // One big set of removes
//
- Utils.Resolver instanceResolver =
- new Utils.Resolver(_resolver,
- instanceDescriptor.parameterValues,
- templateDescriptor.parameterDefaults);
+ removeChildren(update.removeServers);
- String serverId = instanceResolver.substitute(serverDescriptor.id);
- instanceResolver.put("server", serverId);
+ //
+ // Update _descriptor
+ //
+ for(int i = 0; i < update.removeServers.length; ++i)
+ {
+ _descriptor.serverInstances.remove(update.removeServers[i]);
+ _descriptor.servers.remove(update.removeServers[i]);
+ }
//
- // Lookup server
+ // One big set of updates, followed by inserts
//
- Server server = (Server)findChild(serverId);
- if(server != null)
+
+ java.util.Iterator p = update.serverInstances.iterator();
+ while(p.hasNext())
{
- server.rebuild(instanceResolver, instanceDescriptor, serverDescriptor,
- application);
- updatedChildren.add(server);
+ ServerInstanceDescriptor instanceDescriptor =
+ (ServerInstanceDescriptor)p.next();
+
+ //
+ // Find template
+ //
+ TemplateDescriptor templateDescriptor =
+ application.findServerTemplateDescriptor(instanceDescriptor.template);
+
+ assert templateDescriptor != null;
+
+ ServerDescriptor serverDescriptor =
+ (ServerDescriptor)templateDescriptor.descriptor;
+
+ assert serverDescriptor != null;
+
+ //
+ // Build resolver
+ //
+ Utils.Resolver instanceResolver =
+ new Utils.Resolver(_resolver,
+ instanceDescriptor.parameterValues,
+ templateDescriptor.parameterDefaults);
+
+ String serverId = instanceResolver.substitute(serverDescriptor.id);
+ instanceResolver.put("server", serverId);
+
+ //
+ // Lookup server
+ //
+ Server server = (Server)findChild(serverId);
+ if(server != null)
+ {
+ server.rebuild(instanceResolver, instanceDescriptor, serverDescriptor,
+ application);
+ updatedChildren.add(server);
+ }
+ else
+ {
+ server = new Server(false, serverId, instanceResolver, instanceDescriptor,
+ serverDescriptor, application);
+ newChildren.add(server);
+ _descriptor.serverInstances.add(instanceDescriptor);
+ }
+
}
- else
+
+ //
+ // Plain servers
+ //
+ p = update.servers.iterator();
+ while(p.hasNext())
{
- server = new Server(false, serverId, instanceResolver, instanceDescriptor,
- serverDescriptor, application);
- newChildren.add(server);
- _descriptor.serverInstances.add(instanceDescriptor);
+ ServerDescriptor serverDescriptor = (ServerDescriptor)p.next();
+
+ //
+ // Build resolver
+ //
+ Utils.Resolver instanceResolver = new Utils.Resolver(_resolver);
+ String serverId = instanceResolver.substitute(serverDescriptor.id);
+ instanceResolver.put("server", serverId);
+
+ //
+ // Lookup server
+ //
+ Server server = (Server)findChild(serverId);
+
+ if(server != null)
+ {
+ server.rebuild(instanceResolver, null, serverDescriptor,
+ application);
+ updatedChildren.add(server);
+ }
+ else
+ {
+ server = new Server(false, serverId, instanceResolver, null,
+ serverDescriptor, application);
+ newChildren.add(server);
+ _descriptor.servers.add(serverDescriptor);
+ }
}
-
}
+ //
+ // Find servers affected by template updates
//
- // Plain servers
+ java.util.Set serverSet = new java.util.HashSet();
+
+ java.util.Iterator p = serverTemplates.iterator();
+ while(p.hasNext())
+ {
+ String template = (String)p.next();
+ java.util.List serverInstances = findServerInstances(template);
+ java.util.Iterator q = serverInstances.iterator();
+ while(q.hasNext())
+ {
+ Server server = (Server)q.next();
+ if(!updatedChildren.contains(server) && !newChildren.contains(server))
+ {
+ serverSet.add(server);
+ }
+ }
+ }
+
+ p = serviceTemplates.iterator();
+ while(p.hasNext())
+ {
+ java.util.List serviceInstances =
+ findServiceInstances((String)p.next());
+ java.util.Iterator q = serviceInstances.iterator();
+ while(q.hasNext())
+ {
+ Service service = (Service)q.next();
+ Server server = (Server)service.getParent().getParent();
+ if(!updatedChildren.contains(server) && !newChildren.contains(server))
+ {
+ serverSet.add(server);
+ }
+ }
+ }
+
+ //
+ // Rebuild these servers
//
- p = update.servers.iterator();
+ p = serverSet.iterator();
while(p.hasNext())
{
- ServerDescriptor serverDescriptor = (ServerDescriptor)p.next();
+ Server server = (Server)p.next();
- //
- // Build resolver
- //
- Utils.Resolver instanceResolver = new Utils.Resolver(_resolver);
- String serverId = instanceResolver.substitute(serverDescriptor.id);
- instanceResolver.put("server", serverId);
-
- //
- // Lookup server
- //
- Server server = (Server)findChild(serverId);
-
- if(server != null)
+ ServerInstanceDescriptor instanceDescriptor =
+ server.getInstanceDescriptor();
+
+ ServerDescriptor serverDescriptor;
+ Utils.Resolver instanceResolver;
+
+ if(instanceDescriptor == null)
{
- server.rebuild(instanceResolver, null, serverDescriptor,
- application);
- updatedChildren.add(server);
+ serverDescriptor = server.getServerDescriptor();
+ assert serverDescriptor != null;
+ instanceResolver = new Utils.Resolver(_resolver);
}
else
{
- server = new Server(false, serverId, instanceResolver, null,
- serverDescriptor, application);
- newChildren.add(server);
- _descriptor.servers.add(serverDescriptor);
+ TemplateDescriptor templateDescriptor =
+ application.findServerTemplateDescriptor(instanceDescriptor.template);
+ assert templateDescriptor != null;
+
+ serverDescriptor = (ServerDescriptor)templateDescriptor.descriptor;
+ assert serverDescriptor != null;
+
+ instanceResolver =
+ new Utils.Resolver(_resolver,
+ instanceDescriptor.parameterValues,
+ templateDescriptor.parameterDefaults);
}
+
+ String serverId = instanceResolver.substitute(serverDescriptor.id);
+ assert serverId.equals(server.getId());
+
+ server.rebuild(instanceResolver, instanceDescriptor, serverDescriptor,
+ application);
+ updatedChildren.add(server);
}
updateChildren((CommonBaseI[])updatedChildren.toArray(new CommonBaseI[0]));
@@ -929,7 +1017,7 @@ class Node extends EditableParent
if(!_inRegistry)
{
- ((Nodes)_parent).addDescriptor(update.name, _descriptor);
+ ((Nodes)_parent).addDescriptor(_id, _descriptor);
_inRegistry = true;
}
}
diff --git a/java/src/IceGrid/TreeNode/Nodes.java b/java/src/IceGrid/TreeNode/Nodes.java
index 4317afd988a..13b6aa7cec3 100755
--- a/java/src/IceGrid/TreeNode/Nodes.java
+++ b/java/src/IceGrid/TreeNode/Nodes.java
@@ -203,7 +203,8 @@ public class Nodes extends EditableParent
}
}
- void update(java.util.List updates, String[] removeNodes)
+ void update(java.util.List updates, String[] removeNodes,
+ java.util.Set serverTemplates, java.util.Set serviceTemplates)
throws UpdateFailedException
{
Application application = (Application)getParent();
@@ -222,6 +223,7 @@ public class Nodes extends EditableParent
// One big set of updates, followed by inserts
//
java.util.Vector newChildren = new java.util.Vector();
+ java.util.Set updatedNodes = new java.util.HashSet();
java.util.Iterator p = updates.iterator();
while(p.hasNext())
@@ -242,7 +244,21 @@ public class Nodes extends EditableParent
}
else
{
- node.update(update, application);
+ node.update(update, serverTemplates, serviceTemplates);
+ updatedNodes.add(node);
+ }
+ }
+
+ //
+ // Some nodes are only affected by template updates
+ //
+ p = _children.iterator();
+ while(p.hasNext())
+ {
+ Node node = (Node)p.next();
+ if(!updatedNodes.contains(node))
+ {
+ node.update(null, serverTemplates, serviceTemplates);
}
}
diff --git a/java/src/IceGrid/TreeNode/Server.java b/java/src/IceGrid/TreeNode/Server.java
index 8313d6f3a81..79186dd9432 100755
--- a/java/src/IceGrid/TreeNode/Server.java
+++ b/java/src/IceGrid/TreeNode/Server.java
@@ -785,7 +785,6 @@ class Server extends EditableParent
}
}
}
-
public void setParent(CommonBase parent)
{
diff --git a/java/src/IceGrid/TreeNode/ServerTemplate.java b/java/src/IceGrid/TreeNode/ServerTemplate.java
index 87c5a1ba6a0..029e41223e6 100755
--- a/java/src/IceGrid/TreeNode/ServerTemplate.java
+++ b/java/src/IceGrid/TreeNode/ServerTemplate.java
@@ -275,7 +275,8 @@ class ServerTemplate extends EditableParent
{
if(_templateDescriptor.descriptor instanceof IceBoxDescriptor)
{
- IceBoxDescriptor iceBoxDescriptor = (IceBoxDescriptor)_templateDescriptor.descriptor;
+ IceBoxDescriptor iceBoxDescriptor =
+ (IceBoxDescriptor)_templateDescriptor.descriptor;
_services = new Services(iceBoxDescriptor.services, true, null,
application);
@@ -299,6 +300,12 @@ class ServerTemplate extends EditableParent
}
}
+ void rebuild()
+ throws UpdateFailedException
+ {
+ rebuild(_templateDescriptor, getApplication());
+ }
+
void removeServiceInstances(String template)
{
if(_services != null)
diff --git a/java/src/IceGrid/TreeNode/ServerTemplates.java b/java/src/IceGrid/TreeNode/ServerTemplates.java
index c99f024082d..8366439b631 100755
--- a/java/src/IceGrid/TreeNode/ServerTemplates.java
+++ b/java/src/IceGrid/TreeNode/ServerTemplates.java
@@ -189,7 +189,8 @@ class ServerTemplates extends Templates
return getApplication().findServerInstances(templateId);
}
- void update(java.util.Map updates, String[] removeTemplates)
+ void update(java.util.Map updates, String[] removeTemplates,
+ java.util.Set serviceTemplates)
throws UpdateFailedException
{
//
@@ -229,6 +230,30 @@ class ServerTemplates extends Templates
}
}
+ //
+ // Rebuild template affected by service template updates
+ //
+ p = serviceTemplates.iterator();
+ while(p.hasNext())
+ {
+ java.util.List serviceInstances =
+ findServiceInstances((String)p.next());
+ java.util.Iterator q = serviceInstances.iterator();
+ while(q.hasNext())
+ {
+ Service service = (Service)q.next();
+ ServerTemplate serverTemplate =
+ (ServerTemplate)service.getParent().getParent();
+
+ if(!updatedChildren.contains(serverTemplate) &&
+ !newChildren.contains(serverTemplate))
+ {
+ serverTemplate.rebuild();
+ updatedChildren.add(serverTemplate);
+ }
+ }
+ }
+
updateChildren((CommonBaseI[])updatedChildren.toArray
(new CommonBaseI[0]));
addChildren((CommonBaseI[])newChildren.toArray(new CommonBaseI[0]));