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.
This commit is contained in:
Matt Joiner 2021-02-01 15:25:34 +11:00
parent 270a2ba1ae
commit d48c6ae6dc
2 changed files with 6 additions and 2 deletions

View File

@ -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).

View File

@ -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
}