From d48c6ae6dc69b7ce23a109cc9ba401e6ab44d831 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Mon, 1 Feb 2021 15:25:34 +1100 Subject: [PATCH] Fix stalls for responsive transfer tests Looks like there's a timing issue between marking things complete, and already having decided to read the data from incomplete chunks. --- reader.go | 5 ++++- torrent.go | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/reader.go b/reader.go index 42910a86..35d3b32c 100644 --- a/reader.go +++ b/reader.go @@ -224,8 +224,11 @@ func (r *reader) readOnceAt(b []byte, pos int64, ctxErr *error) (n int, err erro 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)) + r.log(log.Fstr("piece %d completion unchanged (%+v)", firstPieceIndex, r.t.piece(firstPieceIndex).completion())) } + r.t.iterPeers(func(c *Peer) { + c.updateRequests() + }) // 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). diff --git a/torrent.go b/torrent.go index 26f49b82..66c83454 100644 --- a/torrent.go +++ b/torrent.go @@ -1760,13 +1760,14 @@ func (t *Torrent) pieceHashed(piece pieceIndex, passed bool, hashIoErr error) { c._stats.incrementPiecesDirtiedGood() } t.clearPieceTouchers(piece) + p.incrementPendingWrites() t.cl.unlock() err := p.Storage().MarkComplete() if err != nil { t.logger.Printf("%T: error marking piece complete %d: %s", t.storage, piece, err) } t.cl.lock() - + p.decrementPendingWrites() if t.closed.IsSet() { return }