]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Include hashed addr when comparing prioritized peers
authorMatt Joiner <anacrolix@gmail.com>
Thu, 16 Apr 2020 01:59:31 +0000 (11:59 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Thu, 16 Apr 2020 01:59:31 +0000 (11:59 +1000)
In particular, fixes the issue where peers where can't calculate a priority and fallback on 0 clobber each other.

prioritized_peers.go
torrent.go

index faafe00fe23f8a1d32114479f8ff054137b30766..0eddf161dd5ac0ea475b0688c3cfe2e081df5705 100644 (file)
@@ -1,6 +1,8 @@
 package torrent
 
 import (
+       "hash/maphash"
+
        "github.com/anacrolix/multiless"
        "github.com/google/btree"
 )
@@ -12,11 +14,21 @@ type prioritizedPeersItem struct {
        p    Peer
 }
 
+var hashSeed = maphash.MakeSeed()
+
+func (me prioritizedPeersItem) addrHash() int64 {
+       var h maphash.Hash
+       h.SetSeed(hashSeed)
+       h.WriteString(me.p.Addr.String())
+       return int64(h.Sum64())
+}
+
 func (me prioritizedPeersItem) Less(than btree.Item) bool {
        other := than.(prioritizedPeersItem)
        return multiless.New().Bool(
                me.p.Trusted, other.p.Trusted).Uint32(
-               me.prio, other.prio,
+               me.prio, other.prio).Int64(
+               me.addrHash(), other.addrHash(),
        ).Less()
 }
 
@@ -41,6 +53,17 @@ func (me *prioritizedPeers) Add(p Peer) bool {
        return me.om.ReplaceOrInsert(prioritizedPeersItem{me.getPrio(p), p}) != nil
 }
 
+// Returns true if a peer is replaced.
+func (me *prioritizedPeers) AddReturningReplacedPeer(p Peer) (ret Peer, ok bool) {
+       item := me.om.ReplaceOrInsert(prioritizedPeersItem{me.getPrio(p), p})
+       if item == nil {
+               return
+       }
+       ret = item.(prioritizedPeersItem).p
+       ok = true
+       return
+}
+
 func (me *prioritizedPeers) DeleteMin() (ret prioritizedPeersItem, ok bool) {
        i := me.om.DeleteMin()
        if i == nil {
index 33ade6dbaff48262d02d3836d9cbe220d6939aad..1cd5e257b668fc208705f9a096c01f8fbc021e00 100644 (file)
@@ -266,8 +266,9 @@ func (t *Torrent) addPeer(p Peer) {
                        return
                }
        }
-       if t.peers.Add(p) {
+       if replaced, ok := t.peers.AddReturningReplacedPeer(p); ok {
                torrent.Add("peers replaced", 1)
+               t.logger.Printf("added %v replacing %v", p, replaced)
        }
        t.openNewConns()
        for t.peers.Len() > cl.config.TorrentPeersHighWater {