reader.go | 39 ++++++++++++++++++++++----------------- diff --git a/reader.go b/reader.go index 34e0f48927b7b466382598897a1537e03bced6d5..c2f3de89bcdef01765b4a201ca0c984abaf536fd 100644 --- a/reader.go +++ b/reader.go @@ -246,23 +246,28 @@ err = nil return } r.t.cl.lock() - // TODO: Just reset pieces in the readahead window. This might help - // prevent thrashing with small caches and file and piece priorities. - r.log(log.Fstr("error reading torrent %s piece %d offset %d, %d bytes: %v", - r.t.infoHash.HexString(), firstPieceIndex, firstPieceOffset, len(b1), err)) - if !r.t.updatePieceCompletion(firstPieceIndex) { - r.log(log.Fstr("piece %d completion unchanged", firstPieceIndex)) - } - // Update the rest of the piece completions in the readahead window, without alerting to - // changes (since only the first piece, the one above, could have generated the read error - // we're currently handling). - if r.pieces.begin != firstPieceIndex { - panic(fmt.Sprint(r.pieces.begin, firstPieceIndex)) - } - for index := r.pieces.begin + 1; index < r.pieces.end; index++ { - r.t.updatePieceCompletion(index) - } - r.t.cl.unlock() + // I think there's a panic here caused by the Client being closed before obtaining this + // lock. TestDropTorrentWithMmapStorageWhileHashing seems to tickle occasionally in CI. + func() { + // Just add exceptions already. + defer r.t.cl.unlock() + // TODO: Just reset pieces in the readahead window. This might help + // prevent thrashing with small caches and file and piece priorities. + r.log(log.Fstr("error reading torrent %s piece %d offset %d, %d bytes: %v", + r.t.infoHash.HexString(), firstPieceIndex, firstPieceOffset, len(b1), err)) + if !r.t.updatePieceCompletion(firstPieceIndex) { + r.log(log.Fstr("piece %d completion unchanged", firstPieceIndex)) + } + // Update the rest of the piece completions in the readahead window, without alerting to + // changes (since only the first piece, the one above, could have generated the read error + // we're currently handling). + if r.pieces.begin != firstPieceIndex { + panic(fmt.Sprint(r.pieces.begin, firstPieceIndex)) + } + for index := r.pieces.begin + 1; index < r.pieces.end; index++ { + r.t.updatePieceCompletion(index) + } + }() } }