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