Track piece marking state separately

This commit is contained in:
Matt Joiner 2020-11-21 13:40:09 +11:00
parent 41ef267c1b
commit 99ddad31c9
3 changed files with 26 additions and 5 deletions

View File

@ -50,6 +50,7 @@ type Piece struct {
numVerifies int64
hashing bool
marking bool
storageCompletionOk bool
publicPieceState PieceState

View File

@ -8,8 +8,14 @@ import (
type PieceState struct {
Priority piecePriority
storage.Completion
// The piece is being hashed, or is queued for hash.
// The piece is being hashed, or is queued for hash. Deprecated: Use those fields instead.
Checking bool
Hashing bool
QueuedForHash bool
// The piece state is being marked in the storage.
Marking bool
// Some of the piece has been obtained.
Partial bool
}

View File

@ -500,9 +500,10 @@ func (t *Torrent) pieceState(index pieceIndex) (ret PieceState) {
p := &t.pieces[index]
ret.Priority = t.piecePriority(index)
ret.Completion = p.completion()
if p.queuedForHash() || p.hashing {
ret.Checking = true
}
ret.QueuedForHash = p.queuedForHash()
ret.Hashing = p.hashing
ret.Checking = ret.QueuedForHash || ret.Hashing
ret.Marking = p.marking
if !ret.Complete && t.piecePartiallyDownloaded(index) {
ret.Partial = true
}
@ -562,9 +563,15 @@ func (psr PieceStateRun) String() (ret string) {
return ""
}
}()
if psr.Checking {
if psr.Hashing {
ret += "H"
}
if psr.QueuedForHash {
ret += "Q"
}
if psr.Marking {
ret += "M"
}
if psr.Partial {
ret += "P"
}
@ -1739,6 +1746,13 @@ func (t *Torrent) pieceHashed(piece pieceIndex, passed bool, hashIoErr error) {
}
}
p.marking = true
t.publishPieceChange(piece)
defer func() {
p.marking = false
t.publishPieceChange(piece)
}()
if passed {
if len(p.dirtiers) != 0 {
// Don't increment stats above connection-level for every involved connection.