reader.go | 5 +++-- torrent.go | 3 ++- diff --git a/reader.go b/reader.go index 648228be423fa2417e81bb9e36db4b02f0aca52e..24403dc17f75f06a0b588c403c0337323820fb4c 100644 --- a/reader.go +++ b/reader.go @@ -226,8 +226,9 @@ // TODO: Just reset pieces in the readahead window. This might help // 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() } } diff --git a/torrent.go b/torrent.go index c9ccaa9f042531d300f3aacf2234905caa134a83..4a519d346d408a29b5d842cabee9886f88bcfd16 100644 --- a/torrent.go +++ b/torrent.go @@ -1054,7 +1054,7 @@ t.connPieceInclinationPool.Put(&pi) 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 @@ // t.logger.Printf("piece %d changed: %v", piece, changed) if changed { t.pieceCompletionChanged(piece) } + return changed } // Non-blocking read. Client lock is not required.