OSDN Git Service

Fix node discovery table delete entry bug (#1139)
authoryahtoo <yahtoo.ma@gmail.com>
Thu, 19 Jul 2018 12:16:39 +0000 (20:16 +0800)
committerPaladz <yzhu101@uottawa.ca>
Thu, 19 Jul 2018 12:16:39 +0000 (20:16 +0800)
p2p/discover/net.go
p2p/discover/table.go

index 7039d05..a6319d8 100644 (file)
@@ -979,6 +979,7 @@ func init() {
                name:     "contested",
                canQuery: true,
                enter: func(net *Network, n *Node) {
+                       n.pingEcho = nil
                        net.ping(n, n.addr())
                },
                handle: func(net *Network, n *Node, ev nodeEvent, pkt *ingressPacket) (*nodeState, error) {
index 48c4236..a3df820 100644 (file)
@@ -211,7 +211,7 @@ func (tab *Table) add(n *Node) (contested *Node) {
        default:
                // b has no space left, add to replacement cache
                // and revalidate the last entry.
-               // TODO: drop previous node
+               tab.deleteFromReplacement(b, n)
                b.replacements = append(b.replacements, n)
                if len(b.replacements) > bucketSize {
                        copy(b.replacements, b.replacements[1:])
@@ -245,6 +245,16 @@ outer:
        }
 }
 
+func (tab *Table) deleteFromReplacement(bucket *bucket, node *Node) {
+       for i := 0; i < len(bucket.replacements); {
+               if bucket.replacements[i].ID == node.ID {
+                       bucket.replacements = append(bucket.replacements[:i], bucket.replacements[i+1:]...)
+               } else {
+                       i++
+               }
+       }
+}
+
 // delete removes an entry from the node table (used to evacuate
 // failed/non-bonded discovery peers).
 func (tab *Table) delete(node *Node) {
@@ -257,6 +267,8 @@ func (tab *Table) delete(node *Node) {
                        return
                }
        }
+
+       tab.deleteFromReplacement(bucket, node)
 }
 
 func (tab *Table) deleteReplace(node *Node) {
@@ -270,6 +282,8 @@ func (tab *Table) deleteReplace(node *Node) {
                        i++
                }
        }
+
+       tab.deleteFromReplacement(b, node)
        // refill from replacement cache
        // TODO: maybe use random index
        if len(b.entries) < bucketSize && len(b.replacements) > 0 {