From 75388caeedd196e77b75d0c427e4a3156a46e0f7 Mon Sep 17 00:00:00 2001 From: Audrius Butkevicius Date: Mon, 28 Jul 2014 00:15:16 +0100 Subject: [PATCH] Prevent duplicate nodes in repos --- config/config.go | 24 ++++++++++++++++++++++++ config/config_test.go | 9 +++++++++ 2 files changed, 33 insertions(+) diff --git a/config/config.go b/config/config.go index 44bb4528..2d17604f 100644 --- a/config/config.go +++ b/config/config.go @@ -313,10 +313,12 @@ func Load(rd io.Reader, myID protocol.NodeID) (Configuration, error) { // Ensure this node is present in all relevant places // Ensure that any loose nodes are not present in the wrong places + // Ensure that there are no duplicate nodes 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) + cfg.Repositories[i].Nodes = ensureNoDuplicates(cfg.Repositories[i].Nodes) } // An empty address list is equivalent to a single "dynamic" entry @@ -420,3 +422,25 @@ loop: return nodes } + +func ensureNoDuplicates(nodes []NodeConfiguration) []NodeConfiguration { + count := len(nodes) + i := 0 + seenNodes := make(map[protocol.NodeID]bool) +loop: + for i < count { + id := nodes[i].NodeID + if _, ok := seenNodes[id]; ok { + nodes[i] = nodes[count-1] + count-- + continue loop + } + seenNodes[id] = true + i++ + } + nodes = nodes[0:count] + + sort.Sort(NodeConfigurationList(nodes)) + + return nodes +} diff --git a/config/config_test.go b/config/config_test.go index aceb2fc1..2caa823d 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -59,6 +59,12 @@ func TestNodeConfig(t *testing.T) {
b
+ +
a
+
+ +
b
+
true @@ -69,9 +75,12 @@ func TestNodeConfig(t *testing.T) { v2data := []byte(` + + +
a