]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Fix benign race on webseed cancellation flag
authorMatt Joiner <anacrolix@gmail.com>
Thu, 10 Jul 2025 06:32:02 +0000 (16:32 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Thu, 10 Jul 2025 06:32:02 +0000 (16:32 +1000)
webseed-peer.go
webseed-request.go

index 45b8c9be8a90a45fa778ad1b9895e0b9d5aadb09..80479e3b5166b7895a46746eb17ac0dbbd49c856 100644 (file)
@@ -135,7 +135,7 @@ func (ws *webseedPeer) runRequest(webseedRequest *webseedRequest) {
        webseedRequest.Close()
        if err != nil {
                level := slog.LevelInfo
-               if webseedRequest.cancelled {
+               if webseedRequest.cancelled.Load() {
                        level = slog.LevelDebug
                }
                ws.slogger().Log(context.TODO(), level, "webseed request error", "err", err)
index 51f76199b46997a03279980e8f570180c10dcfc5..7e79f12727145b96cc467fa421eef8a79dd70166 100644 (file)
@@ -2,6 +2,7 @@ package torrent
 
 import (
        "fmt"
+       "sync/atomic"
 
        "github.com/anacrolix/torrent/webseed"
 )
@@ -16,7 +17,7 @@ type webseedRequest struct {
        next RequestIndex
        // One greater than the end of the range.
        end       RequestIndex
-       cancelled bool
+       cancelled atomic.Bool
 }
 
 func (me *webseedRequest) Close() {
@@ -26,8 +27,7 @@ func (me *webseedRequest) Close() {
 // Record that it was exceptionally cancelled.
 func (me *webseedRequest) Cancel() {
        me.request.Cancel()
-       if !me.cancelled {
-               me.cancelled = true
+       if !me.cancelled.Swap(true) {
                if webseed.PrintDebug {
                        fmt.Printf("cancelled webseed request\n")
                }