pending-requests_test.go | 19 +++++++++++++++++++ requesting.go | 1 + torrent.go | 22 +++++++++++++++++----- diff --git a/pending-requests_test.go b/pending-requests_test.go new file mode 100644 index 0000000000000000000000000000000000000000..5f0debdca0408fe42926f1328627f286ca75e3bd --- /dev/null +++ b/pending-requests_test.go @@ -0,0 +1,19 @@ +package torrent + +import ( + "testing" + + qt "github.com/frankban/quicktest" + "github.com/google/go-cmp/cmp" +) + +// Ensure that cmp.Diff will detect errors as required. +func TestPendingRequestsDiff(t *testing.T) { + var a, b pendingRequests + c := qt.New(t) + diff := func() string { return cmp.Diff(a.m, b.m) } + c.Check(diff(), qt.ContentEquals, "") + a.m = []int{1, 3} + b.m = []int{1, 2, 3} + c.Check(diff(), qt.Not(qt.Equals), "") +} diff --git a/requesting.go b/requesting.go index 1d2d5e19a455a8f7f893ae58171765829a35ea24..c1ae8adac57ede1aaecabc4f426584a44d6edcbb 100644 --- a/requesting.go +++ b/requesting.go @@ -233,6 +233,7 @@ p.t.pieceRequestIndexOffset(pieceIndex)+ci) }) }, ) + p.t.assertPendingRequests() heap.Init(&requestHeap) for requestHeap.Len() != 0 && desired.Requests.GetCardinality() < uint64(p.nominalMaxRequests()) { requestIndex := heap.Pop(&requestHeap).(RequestIndex) diff --git a/torrent.go b/torrent.go index 222df40b641d5e5ff9d45701ae0fbeefacc3d71e..d606971dffca4d08b80c8c6738dfb66979db3b40 100644 --- a/torrent.go +++ b/torrent.go @@ -30,6 +30,7 @@ "github.com/anacrolix/missinggo/v2/bitmap" "github.com/anacrolix/multiless" "github.com/anacrolix/sync" "github.com/davecgh/go-spew/spew" + "github.com/google/go-cmp/cmp" "github.com/pion/datachannel" "github.com/anacrolix/torrent/bencode" @@ -1385,9 +1386,7 @@ } } torrent.Add("deleted connections", 1) c.deleteAllRequests() - if t.numActivePeers() == 0 && t.haveInfo() { - t.assertNoPendingRequests() - } + t.assertPendingRequests() return } @@ -1408,8 +1407,21 @@ }) return } -func (t *Torrent) assertNoPendingRequests() { - t.pendingRequests.AssertEmpty() +func (t *Torrent) assertPendingRequests() { + var actual pendingRequests + if t.haveInfo() { + actual.m = make([]int, t.numRequests()) + } + t.iterPeers(func(p *Peer) { + p.actualRequestState.Requests.Iterate(func(x uint32) bool { + actual.Inc(x) + return true + }) + }) + diff := cmp.Diff(actual.m, t.pendingRequests.m) + if diff != "" { + panic(diff) + } } func (t *Torrent) dropConnection(c *PeerConn) {