Tidy up bytesLeft calculations

This should fix a bug where completion is shown as negative in WriteStatus
This commit is contained in:
Matt Joiner 2016-03-22 13:11:36 +11:00
parent 01bef851ed
commit bb04cb8843
3 changed files with 51 additions and 31 deletions

View File

@ -121,3 +121,11 @@ func validateInfo(info *metainfo.Info) error {
} }
return nil return nil
} }
func chunkIndexSpec(index int, pieceLength, chunkSize pp.Integer) chunkSpec {
ret := chunkSpec{pp.Integer(index) * chunkSize, chunkSize}
if ret.Begin+ret.Length > pieceLength {
ret.Length = pieceLength - ret.Begin
}
return ret
}

View File

@ -69,14 +69,6 @@ func (p *piece) pendChunkIndex(i int) {
p.DirtyChunks.Remove(i) p.DirtyChunks.Remove(i)
} }
func chunkIndexSpec(index int, pieceLength, chunkSize pp.Integer) chunkSpec {
ret := chunkSpec{pp.Integer(index) * chunkSize, chunkSize}
if ret.Begin+ret.Length > pieceLength {
ret.Length = pieceLength - ret.Begin
}
return ret
}
func (p *piece) numChunks() int { func (p *piece) numChunks() int {
return p.t.pieceNumChunks(p.index) return p.t.pieceNumChunks(p.index)
} }
@ -112,3 +104,45 @@ func (p *piece) waitNoPendingWrites() {
} }
p.pendingWritesMutex.Unlock() p.pendingWritesMutex.Unlock()
} }
func (p *piece) chunkIndexDirty(chunk int) bool {
return p.DirtyChunks.Contains(chunk)
}
func (p *piece) chunkIndexSpec(chunk int) chunkSpec {
return chunkIndexSpec(chunk, p.length(), p.chunkSize())
}
func (p *piece) numDirtyBytes() (ret pp.Integer) {
defer func() {
if ret > p.length() {
panic("too many dirty bytes")
}
}()
numRegularDirtyChunks := p.numDirtyChunks()
if p.chunkIndexDirty(p.numChunks() - 1) {
numRegularDirtyChunks--
ret += p.chunkIndexSpec(p.lastChunkIndex()).Length
}
ret += pp.Integer(numRegularDirtyChunks) * p.chunkSize()
return
}
func (p *piece) length() pp.Integer {
return p.t.pieceLength(p.index)
}
func (p *piece) chunkSize() pp.Integer {
return p.t.chunkSize
}
func (p *piece) lastChunkIndex() int {
return p.numChunks() - 1
}
func (p *piece) bytesLeft() (ret pp.Integer) {
if p.t.pieceComplete(p.index) {
return 0
}
return p.length() - p.numDirtyBytes()
}

View File

@ -29,25 +29,6 @@ func (t *torrent) chunkIndexSpec(chunkIndex, piece int) chunkSpec {
return chunkIndexSpec(chunkIndex, t.pieceLength(piece), t.chunkSize) return chunkIndexSpec(chunkIndex, t.pieceLength(piece), t.chunkSize)
} }
func (t *torrent) pieceNumPendingBytes(index int) (count pp.Integer) {
if t.pieceComplete(index) {
return
}
piece := &t.Pieces[index]
count = t.pieceLength(index)
if !piece.EverHashed {
return
}
regularDirty := piece.numDirtyChunks()
lastChunkIndex := t.pieceNumChunks(index) - 1
if piece.pendingChunkIndex(lastChunkIndex) {
regularDirty--
count -= t.chunkIndexSpec(lastChunkIndex, index).Length
}
count -= pp.Integer(regularDirty) * t.chunkSize
return
}
type peersKey struct { type peersKey struct {
IPBytes string IPBytes string
Port int Port int
@ -511,11 +492,8 @@ func (t *torrent) MetaInfo() *metainfo.MetaInfo {
} }
func (t *torrent) bytesLeft() (left int64) { func (t *torrent) bytesLeft() (left int64) {
if !t.haveInfo() {
return -1
}
for i := 0; i < t.numPieces(); i++ { for i := 0; i < t.numPieces(); i++ {
left += int64(t.pieceNumPendingBytes(i)) left += int64(t.Pieces[i].bytesLeft())
} }
return return
} }