}
p.relativeAvailability = t.selectivePieceAvailabilityFromPeers(i)
t.addRequestOrderPiece(i)
+ t.setPieceCompletionFromStorage(i)
+ t.afterSetPieceCompletion(i, true)
t.updatePieceCompletion(i)
t.queueInitialPieceCheck(i)
}
return
}
-// Pulls piece completion state from storage and performs any state updates if it changes.
-func (t *Torrent) updatePieceCompletion(piece pieceIndex) bool {
+// Sets the cached piece completion directly from storage.
+func (t *Torrent) setPieceCompletionFromStorage(piece pieceIndex) bool {
p := t.piece(piece)
uncached := t.pieceCompleteUncached(piece)
if uncached.Err != nil {
// errors.
cached := p.completion()
changed := cached != uncached
- complete := uncached.Ok && uncached.Complete
p.storageCompletionOk = uncached.Ok
x := uint32(piece)
- if complete {
+ if uncached.Complete {
t._completedPieces.Add(x)
- t.openNewConns()
} else {
t._completedPieces.Remove(x)
}
+ return changed
+}
+
+// Pulls piece completion state from storage and performs any state updates if it changes.
+func (t *Torrent) updatePieceCompletion(piece pieceIndex) bool {
+ changed := t.setPieceCompletionFromStorage(piece)
+ t.afterSetPieceCompletion(piece, changed)
+ return changed
+}
+
+// Pulls piece completion state from storage and performs any state updates if it changes.
+func (t *Torrent) afterSetPieceCompletion(piece pieceIndex, changed bool) {
+ p := t.piece(piece)
+ cmpl := p.completion()
+ complete := cmpl.Ok && cmpl.Complete
+ if complete {
+ t.openNewConns()
+ }
p.t.updatePieceRequestOrderPiece(piece)
t.updateComplete()
if complete && len(p.dirtiers) != 0 {
t.logger.Printf("marked piece %v complete but still has dirtiers", piece)
}
if changed {
- //slog.Debug(
- // "piece completion changed",
- // slog.Int("piece", piece),
- // slog.Any("from", cached),
- // slog.Any("to", uncached))
t.pieceCompletionChanged(piece, "Torrent.updatePieceCompletion")
}
- return changed
}
// Non-blocking read. Client lock is not required.