From: Matt Joiner Date: Thu, 31 Mar 2022 06:04:36 +0000 (+1100) Subject: Ensure unlock occurs on panic in reader X-Git-Tag: v1.42.0~5 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=a22150ab611ed2ee9218e4aca829375a616d3994;p=btrtrc.git Ensure unlock occurs on panic in reader --- diff --git a/reader.go b/reader.go index 34e0f489..c2f3de89 100644 --- a/reader.go +++ b/reader.go @@ -246,23 +246,28 @@ func (r *reader) readOnceAt(ctx context.Context, b []byte, pos int64) (n int, er 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) + } + }() } }