client_test.go | 2 +- torrent.go | 24 +++++++++++++----------- diff --git a/client_test.go b/client_test.go index b84b9f3b9f41e38c0c529d86f87347de2d33017c..18288e4eb678ca2939c71d0ba48a4613b284976c 100644 --- a/client_test.go +++ b/client_test.go @@ -106,7 +106,7 @@ func TestTorrentInitialState(t *testing.T) { dir, mi := testutil.GreetingTestTorrent() defer os.RemoveAll(dir) cl := &Client{ - config: &ClientConfig{}, + config: TestingConfig(), } cl.initLogger() tor := cl.newTorrent( diff --git a/torrent.go b/torrent.go index 5fd2bbff3df2ef6a365459333bc188814e777a13..02ee63af9d4b21ae1f12ca4124162a70b1b88d81 100644 --- a/torrent.go +++ b/torrent.go @@ -735,7 +735,7 @@ } func (t *Torrent) hashPiece(piece pieceIndex) (ret metainfo.Hash) { hash := pieceHash.New() - p := &t.pieces[piece] + p := t.piece(piece) p.waitNoPendingWrites() ip := t.info.Piece(int(piece)) pl := ip.Length() @@ -997,7 +997,7 @@ t.pieces[req.Index].pendChunkIndex(ci) } func (t *Torrent) pieceCompletionChanged(piece pieceIndex) { - log.Call().Add("piece", piece).AddValue(debugLogValue).Log(t.logger) + t.tickleReaders() t.cl.event.Broadcast() if t.pieceComplete(piece) { t.onPieceCompleted(piece) @@ -1056,16 +1056,14 @@ pieceInclinationsPut.Add(1) } func (t *Torrent) updatePieceCompletion(piece pieceIndex) bool { - pcu := t.pieceCompleteUncached(piece) - p := &t.pieces[piece] - changed := t.completedPieces.Get(bitmap.BitIndex(piece)) != pcu.Complete || p.storageCompletionOk != pcu.Ok - log.Fmsg("piece %d completion: %v", piece, pcu.Ok).AddValue(debugLogValue).Log(t.logger) - p.storageCompletionOk = pcu.Ok - t.completedPieces.Set(bitmap.BitIndex(piece), pcu.Complete) - t.tickleReaders() - // t.logger.Printf("piece %d uncached completion: %v", piece, pcu.Complete) - // t.logger.Printf("piece %d changed: %v", piece, changed) + p := t.piece(piece) + uncached := t.pieceCompleteUncached(piece) + cached := p.completion() + changed := cached != uncached + p.storageCompletionOk = uncached.Ok + t.completedPieces.Set(bitmap.BitIndex(piece), uncached.Complete) if changed { + t.logger.Log(log.Fstr("piece %d completion changed: %+v -> %+v", piece, cached, uncached)) t.pieceCompletionChanged(piece) } return changed @@ -1721,3 +1719,7 @@ func (t *Torrent) dialTimeout() time.Duration { return reducedDialTimeout(t.cl.config.MinDialTimeout, t.cl.config.NominalDialTimeout, t.cl.config.HalfOpenConnsPerTorrent, t.peers.Len()) } + +func (t *Torrent) piece(i int) *Piece { + return &t.pieces[i] +}