From 5b8f5d7db4222ff1fb3f535f8f14ece132251a0b Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Wed, 6 Aug 2025 20:36:29 +1000 Subject: [PATCH] Fix proposed and existing cancelled webseed requests colliding in priority heap --- webseed-requesting.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/webseed-requesting.go b/webseed-requesting.go index abb297ad..821e55b6 100644 --- a/webseed-requesting.go +++ b/webseed-requesting.go @@ -18,6 +18,7 @@ import ( g "github.com/anacrolix/generics" "github.com/anacrolix/generics/heap" "github.com/anacrolix/missinggo/v2/panicif" + "github.com/davecgh/go-spew/spew" "github.com/anacrolix/torrent/internal/request-strategy" "github.com/anacrolix/torrent/metainfo" @@ -139,7 +140,12 @@ func (cl *Client) updateWebseedRequests() { // Doing earlier chunks first means more compact files for partial file hashing. cmp.Compare(l.sliceIndex, r.sliceIndex), ) - panicif.Zero(ret) + if ret == 0 { + cfg := spew.NewDefaultConfig() + cfg.Dump(l) + cfg.Dump(r) + panic("webseed request heap ordering is not stable") + } return ret < 0 }, ) @@ -417,6 +423,12 @@ func (cl *Client) iterCurrentWebseedRequests() iter.Seq2[webseedUniqueRequestKey // This request is done, so don't yield it. continue } + if ar.cancelled.Load() { + cl.slogger.Debug("iter current webseed requests: skipped cancelled webseed request") + // This should prevent overlapping webseed requests that are just filling + // slots waiting to cancel from conflicting. + continue + } p := t.piece(t.pieceIndexOfRequestIndex(ar.next)) if !yield( webseedUniqueRequestKey{ -- 2.51.0