From 714954b7d79b6eb7c7728cf237236203e779f5d7 Mon Sep 17 00:00:00 2001 From: komuW Date: Fri, 20 Apr 2018 14:33:55 +0300 Subject: [PATCH] dedupe Node.nodes --- node.go | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/node.go b/node.go index c572348..ea4e1eb 100644 --- a/node.go +++ b/node.go @@ -116,14 +116,25 @@ func NewNode(ID uint64, store StableStore) *Node { return n } +func removeDuplicatesNodes(a []*Node) []*Node { + result := []*Node{} + seen := map[uint64]*Node{} + for _, val := range a { + if _, ok := seen[val.ID]; !ok { + result = append(result, val) + seen[val.ID] = val + } + } + return result +} + // MingleNodes lets each node know about the other, including itself. func MingleNodes(nodes ...*Node) { for _, n := range nodes { - // guard against adding same node twice - // TODO: fix this since it breaks down if len(nodes) > n.nodes even when some of those nodes already exist in n.nodes - if len(n.nodes) < len(nodes) { - n.nodes = append(n.nodes, nodes...) - } + incomingNodes := nodes + unDedupedNodes := append(incomingNodes, n.nodes...) + dedupedNodes := removeDuplicatesNodes(unDedupedNodes) + n.nodes = dedupedNodes } }