]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Extract webseed end request calculation and avoid bug for now
authorMatt Joiner <anacrolix@gmail.com>
Tue, 5 Aug 2025 10:02:18 +0000 (20:02 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Tue, 5 Aug 2025 10:02:18 +0000 (20:02 +1000)
webseed-requesting.go

index 37567270a80a7688db22522d4a5d26f60d27575e..d41d909c9ec3ed2c9737e90dca34995086f47407 100644 (file)
@@ -187,43 +187,52 @@ func (cl *Client) updateWebseedRequests() {
                        peer := t.webSeeds[requestKey.url]
                        panicif.NotEq(peer.hostKey, costKey)
                        printPlan()
-                       begin := requestKey.startRequest
-                       chunkEnd := t.endRequestForAlignedWebseedResponse(requestKey.startRequest)
-                       last := begin
-                       for {
-                               if !t.wantReceiveChunk(last) {
-                                       break
-                               }
-                               if last >= chunkEnd-1 {
-                                       break
-                               }
-                               last++
-                       }
+
                        debugLogger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
                                Level:     slog.LevelDebug,
                                AddSource: true,
                        })).With(
                                "webseedUrl", requestKey.url,
                                "webseedChunkIndex", requestKey.sliceIndex)
-                       // Request shouldn't exist if this occurs.
-                       panicif.LessThan(last, begin)
-                       // Hello darkness (C++) my old friend...
-                       end := last + 1
-                       end = min(end, t.endRequestForAlignedWebseedResponse(begin))
+
+                       begin := requestKey.startRequest
+                       end := t.getWebseedRequestEnd(begin, debugLogger)
                        panicif.LessThanOrEqual(end, begin)
-                       if webseed.PrintDebug && end != chunkEnd {
-                               debugLogger.Debug(
-                                       "shortened webseed request",
-                                       "request key", requestKey,
-                                       "from", endExclusiveString(begin, chunkEnd),
-                                       "to", endExclusiveString(begin, end))
-                       }
-                       panicif.GreaterThan(end, chunkEnd)
+
                        peer.spawnRequest(begin, end, debugLogger)
                }
        }
 }
 
+func (t *Torrent) getWebseedRequestEnd(begin RequestIndex, debugLogger *slog.Logger) RequestIndex {
+       chunkEnd := t.endRequestForAlignedWebseedResponse(begin)
+       panicif.False(t.wantReceiveChunk(begin))
+       if true {
+               // Pending fix to pendingPieces matching piece request order due to missing initial pieces
+               // checks?
+               return chunkEnd
+       }
+       last := begin
+       for {
+               if !t.wantReceiveChunk(last) {
+                       break
+               }
+               if last >= chunkEnd-1 {
+                       break
+               }
+               last++
+       }
+       end := last + 1
+       panicif.GreaterThan(end, chunkEnd)
+       if webseed.PrintDebug && end != chunkEnd {
+               debugLogger.Debug(
+                       "shortened webseed request",
+                       "from", endExclusiveString(begin, chunkEnd),
+                       "to", endExclusiveString(begin, end))
+       }
+       return end
+}
+
 // Cloudflare caches up to 512 MB responses by default. This is also an alignment.
 var webseedRequestChunkSize uint64 = 256 << 20