]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Use new anacrolix/multiless, and incorporate Peer.Trusted into peer prioritization
authorMatt Joiner <anacrolix@gmail.com>
Mon, 23 Dec 2019 03:04:07 +0000 (14:04 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Mon, 23 Dec 2019 03:04:07 +0000 (14:04 +1100)
config.go
connection.go
go.mod
go.sum
prioritized_peers.go
prioritized_peers_test.go
worst_conns.go

index e40ce30cc017af4df0010ef1d3cad3e0613bb54a..e328170c5aadb6837a62331bd387f2ca3ba0ab47 100644 (file)
--- a/config.go
+++ b/config.go
@@ -32,7 +32,7 @@ type ClientConfig struct {
        ListenHost              func(network string) string
        ListenPort              int
        NoDefaultPortForwarding bool
-       UpnpID                  string
+       UpnpID                  string
        // Don't announce to trackers. This only leaves DHT to discover peers.
        DisableTrackers bool `long:"disable-trackers"`
        DisablePEX      bool `long:"disable-pex"`
@@ -152,7 +152,7 @@ func NewDefaultClientConfig() *ClientConfig {
                HTTPUserAgent:                  DefaultHTTPUserAgent,
                ExtendedHandshakeClientVersion: "go.torrent dev 20181121",
                Bep20:                          "-GT0002-",
-               UpnpID:                         "anacrolix/torrent",
+               UpnpID:                         "anacrolix/torrent",
                NominalDialTimeout:             20 * time.Second,
                MinDialTimeout:                 3 * time.Second,
                EstablishedConnsPerTorrent:     50,
index 3c2adea2d916a464ef2448060b4e9479fd7b3d3f..61cbadf8e419675cfa7240ae386929184e0fb981 100644 (file)
@@ -19,6 +19,7 @@ import (
        "github.com/anacrolix/missinggo/bitmap"
        "github.com/anacrolix/missinggo/iter"
        "github.com/anacrolix/missinggo/prioritybitmap"
+       "github.com/anacrolix/multiless"
        "github.com/pkg/errors"
 
        "github.com/anacrolix/torrent/bencode"
@@ -1580,8 +1581,5 @@ type connectionTrust struct {
 }
 
 func (l connectionTrust) Less(r connectionTrust) bool {
-       var ml missinggo.MultiLess
-       ml.NextBool(!l.Implicit, !r.Implicit)
-       ml.StrictNext(l.NetGoodPiecesDirted == r.NetGoodPiecesDirted, l.NetGoodPiecesDirted < r.NetGoodPiecesDirted)
-       return ml.Less()
+       return multiless.New().Bool(l.Implicit, r.Implicit).Int64(l.NetGoodPiecesDirted, r.NetGoodPiecesDirted).Less()
 }
diff --git a/go.mod b/go.mod
index 3253ee1f45c325fd96d3e01f9829a40f94be7024..d91c6c4218361df4bf4f561141a3e5b047a9dad1 100644 (file)
--- a/go.mod
+++ b/go.mod
@@ -11,6 +11,7 @@ require (
        github.com/anacrolix/missinggo v1.2.1
        github.com/anacrolix/missinggo/perf v1.0.0
        github.com/anacrolix/missinggo/v2 v2.3.1
+       github.com/anacrolix/multiless v0.0.0-20191223025854-070b7994e841
        github.com/anacrolix/sync v0.2.0
        github.com/anacrolix/tagflag v1.0.1
        github.com/anacrolix/upnp v0.1.1
diff --git a/go.sum b/go.sum
index 4371eaf726a84d7b48f9e4d36f39e66e816a1378..73c018c8f0a2af98a3c3e086380871e45e8114b0 100644 (file)
--- a/go.sum
+++ b/go.sum
@@ -69,6 +69,8 @@ github.com/anacrolix/mmsg v0.0.0-20180515031531-a4a3ba1fc8bb h1:2Or5ccMoY4Kfao+W
 github.com/anacrolix/mmsg v0.0.0-20180515031531-a4a3ba1fc8bb/go.mod h1:x2/ErsYUmT77kezS63+wzZp8E3byYB0gzirM/WMBLfw=
 github.com/anacrolix/mmsg v1.0.0 h1:btC7YLjOn29aTUAExJiVUhQOuf/8rhm+/nWCMAnL3Hg=
 github.com/anacrolix/mmsg v1.0.0/go.mod h1:x8kRaJY/dCrY9Al0PEcj1mb/uFHwP6GCJ9fLl4thEPc=
+github.com/anacrolix/multiless v0.0.0-20191223025854-070b7994e841 h1:AIQdjlpS6GLF/OrfLjWXTEneg7ZnXnlblcbAP83PJTk=
+github.com/anacrolix/multiless v0.0.0-20191223025854-070b7994e841/go.mod h1:TrCLEZfIDbMVfLoQt5tOoiBS/uq4y8+ojuEVVvTNPX4=
 github.com/anacrolix/stm v0.1.0 h1:B/Kt3e4+0uqJoLcNZFW69cCBASok6WxX9CEhz9PqIPM=
 github.com/anacrolix/stm v0.1.0/go.mod h1:ZKz7e7ERWvP0KgL7WXfRjBXHNRhlVRlbBQecqFtPq+A=
 github.com/anacrolix/stm v0.1.1-0.20191106051447-e749ba3531cf/go.mod h1:zoVQRvSiGjGoTmbM0vSLIiaKjWtNPeTvXUSdJQA4hsg=
index ca8b8736a626e007988ab650b105958dafec1dbc..faafe00fe23f8a1d32114479f8ff054137b30766 100644 (file)
@@ -1,6 +1,9 @@
 package torrent
 
-import "github.com/google/btree"
+import (
+       "github.com/anacrolix/multiless"
+       "github.com/google/btree"
+)
 
 // Peers are stored with their priority at insertion. Their priority may
 // change if our apparent IP changes, we don't currently handle that.
@@ -10,7 +13,11 @@ type prioritizedPeersItem struct {
 }
 
 func (me prioritizedPeersItem) Less(than btree.Item) bool {
-       return me.prio < than.(prioritizedPeersItem).prio
+       other := than.(prioritizedPeersItem)
+       return multiless.New().Bool(
+               me.p.Trusted, other.p.Trusted).Uint32(
+               me.prio, other.prio,
+       ).Less()
 }
 
 type prioritizedPeers struct {
index e7c5265104c564472006ef5b907ea6146b4c11aa..364178c177e64cee735322b88791f6e2f23bfa9c 100644 (file)
@@ -2,7 +2,6 @@ package torrent
 
 import (
        "net"
-       "sort"
        "testing"
 
        "github.com/google/btree"
@@ -23,16 +22,14 @@ func TestPrioritizedPeers(t *testing.T) {
                {IP: net.ParseIP("1.2.3.4")},
                {IP: net.ParseIP("1::2")},
                {IP: net.ParseIP("")},
+               {IP: net.ParseIP(""), Trusted: true},
        }
        for i, p := range ps {
-               t.Logf("peer %d priority: %08x\n", i, pp.getPrio(p))
+               t.Logf("peer %d priority: %08x trusted: %t\n", i, pp.getPrio(p), p.Trusted)
                assert.False(t, pp.Add(p))
                assert.True(t, pp.Add(p))
                assert.Equal(t, i+1, pp.Len())
        }
-       sort.Slice(ps, func(i, j int) bool {
-               return pp.getPrio(ps[i]) < pp.getPrio(ps[j])
-       })
        pop := func(expected *Peer) {
                if expected == nil {
                        assert.Panics(t, func() { pp.PopMax() })
@@ -49,9 +46,10 @@ func TestPrioritizedPeers(t *testing.T) {
                        assert.Equal(t, *expected, i.p)
                }
        }
-       pop(&ps[2])
-       min(&ps[0])
+       pop(&ps[3])
        pop(&ps[1])
+       min(&ps[2])
+       pop(&ps[0])
        min(nil)
        pop(nil)
 }
index d67a52f1f4aedbcd3d84e270c5d92e0574ed6be9..c43652bdc3941dca8b36644115f426c40899c8b3 100644 (file)
@@ -4,22 +4,17 @@ import (
        "container/heap"
        "fmt"
        "unsafe"
+
+       "github.com/anacrolix/multiless"
 )
 
 func worseConn(l, r *connection) bool {
-       var ml multiLess
-       ml.NextBool(!l.useful(), !r.useful())
-       ml.StrictNext(
-               l.lastHelpful().Equal(r.lastHelpful()),
-               l.lastHelpful().Before(r.lastHelpful()))
-       ml.StrictNext(
-               l.completedHandshake.Equal(r.completedHandshake),
-               l.completedHandshake.Before(r.completedHandshake))
-       ml.Next(func() (bool, bool) {
-               return l.peerPriority() == r.peerPriority(), l.peerPriority() < r.peerPriority()
-       })
-       ml.StrictNext(l == r, uintptr(unsafe.Pointer(l)) < uintptr(unsafe.Pointer(r)))
-       less, ok := ml.FinalOk()
+       less, ok := multiless.New().Bool(
+               l.useful(), r.useful()).CmpInt64(
+               l.lastHelpful().Sub(r.lastHelpful()).Nanoseconds()).CmpInt64(
+               l.completedHandshake.Sub(r.completedHandshake).Nanoseconds()).Uint32(
+               l.peerPriority(), r.peerPriority()).Uintptr(
+               uintptr(unsafe.Pointer(l)), uintptr(unsafe.Pointer(r))).LessOk()
        if !ok {
                panic(fmt.Sprintf("cannot differentiate %#v and %#v", l, r))
        }