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()
 }
 
 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)
 }
 
 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
 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]
+}