diff --git a/config/config.go b/config/config.go index f910e4834..f061ff8fc 100644 --- a/config/config.go +++ b/config/config.go @@ -304,10 +304,19 @@ func Load(rd io.Reader, myID protocol.NodeID) (Configuration, error) { } } + // Build a list of available nodes + existingNodes := make(map[protocol.NodeID]bool) + existingNodes[myID] = true + for _, node := range cfg.Nodes { + existingNodes[node.NodeID] = true + } + // Ensure this node is present in all relevant places + // Ensure that any loose nodes are not present in the wrong places cfg.Nodes = ensureNodePresent(cfg.Nodes, myID) for i := range cfg.Repositories { cfg.Repositories[i].Nodes = ensureNodePresent(cfg.Repositories[i].Nodes, myID) + cfg.Repositories[i].Nodes = ensureExistingNodes(cfg.Repositories[i].Nodes, existingNodes) } // An empty address list is equivalent to a single "dynamic" entry @@ -392,3 +401,20 @@ func ensureNodePresent(nodes []NodeConfiguration, myID protocol.NodeID) []NodeCo return nodes } + +func ensureExistingNodes(nodes []NodeConfiguration, existingNodes map[protocol.NodeID]bool) []NodeConfiguration { + i := 0 + for _, node := range nodes { + if _, ok := existingNodes[node.NodeID]; !ok { + last := len(nodes) - 1 + nodes[i] = nodes[last] + nodes = nodes[:last] + } else { + i++ + } + } + + sort.Sort(NodeConfigurationList(nodes)) + + return nodes +} diff --git a/config/config_test.go b/config/config_test.go index 349cb2568..50dcaa79f 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -70,6 +70,7 @@ func TestNodeConfig(t *testing.T) { +