]> Sergey Matveev's repositories - btrtrc.git/commitdiff
When failing to read stored data, try updating only the completion state for the...
authorMatt Joiner <anacrolix@gmail.com>
Tue, 9 Apr 2019 02:57:54 +0000 (12:57 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Tue, 9 Apr 2019 02:57:54 +0000 (12:57 +1000)
On rare occasions, reads are failing in a loop, exhausting all the available file descriptors. It's not clear why, it could be an error in the filecache storage backend I'm using, or some logic error regarding when it's okay to try to read.

reader.go
torrent.go

index 648228be423fa2417e81bb9e36db4b02f0aca52e..24403dc17f75f06a0b588c403c0337323820fb4c 100644 (file)
--- a/reader.go
+++ b/reader.go
@@ -226,8 +226,9 @@ func (r *reader) readOnceAt(b []byte, pos int64, ctxErr *error) (n int, err erro
                // prevent thrashing with small caches and file and piece priorities.
                log.Printf("error reading torrent %s piece %d offset %d, %d bytes: %v",
                        r.t.infoHash.HexString(), pi, po, len(b1), err)
-               r.t.updateAllPieceCompletions()
-               r.t.updateAllPiecePriorities()
+               if !r.t.updatePieceCompletion(pi) {
+                       log.Printf("piece %d completion unchanged", pi)
+               }
                r.t.cl.unlock()
        }
 }
index c9ccaa9f042531d300f3aacf2234905caa134a83..4a519d346d408a29b5d842cabee9886f88bcfd16 100644 (file)
@@ -1054,7 +1054,7 @@ func (t *Torrent) putPieceInclination(pi []int) {
        pieceInclinationsPut.Add(1)
 }
 
-func (t *Torrent) updatePieceCompletion(piece pieceIndex) {
+func (t *Torrent) updatePieceCompletion(piece pieceIndex) bool {
        pcu := t.pieceCompleteUncached(piece)
        p := &t.pieces[piece]
        changed := t.completedPieces.Get(bitmap.BitIndex(piece)) != pcu.Complete || p.storageCompletionOk != pcu.Ok
@@ -1067,6 +1067,7 @@ func (t *Torrent) updatePieceCompletion(piece pieceIndex) {
        if changed {
                t.pieceCompletionChanged(piece)
        }
+       return changed
 }
 
 // Non-blocking read. Client lock is not required.