request-strategy-impls_test.go | 8 +++++--- torrent.go | 6 +++--- diff --git a/request-strategy-impls_test.go b/request-strategy-impls_test.go index 9566ea1a76604a457ba1fb18e6280280f100de49..fc0e64621814e95cd3004ddf1b9df2353763347d 100644 --- a/request-strategy-impls_test.go +++ b/request-strategy-impls_test.go @@ -119,9 +119,11 @@ } for completed := 0; completed <= numPieces; completed += 1 { storageClient.completed = completed if completed > 0 { - tor.cl.lock() - tor.updatePieceCompletion(completed - 1) - tor.cl.unlock() + func() { + tor.cl.lock() + defer tor.cl.unlock() + tor.updatePieceCompletion(completed - 1) + }() } // Starting and stopping timers around this part causes lots of GC overhead. rs := peer.getDesiredRequestState() diff --git a/torrent.go b/torrent.go index 58ea19a08dbcacd41f8e92bc5d004dedd1b250e7..f39ef04209b9aed4e91f694d0725b001eff68160 100644 --- a/torrent.go +++ b/torrent.go @@ -1829,15 +1829,15 @@ p := t.piece(piece) cmpl := p.completion() complete := cmpl.Ok && cmpl.Complete p.t.updatePieceRequestOrderPiece(piece) - if complete { - t.openNewConns() - } t.deferUpdateComplete() if complete && len(p.dirtiers) != 0 { t.logger.Printf("marked piece %v complete but still has dirtiers", piece) } if changed { t.pieceCompletionChanged(piece, "Torrent.updatePieceCompletion") + } + if complete { + t.openNewConns() } }