From 67c0ed8518e8644d74019a7534ca3705f3ecd63c Mon Sep 17 00:00:00 2001
From: Matt Joiner <anacrolix@gmail.com>
Date: Mon, 25 Jun 2018 14:09:08 +1000
Subject: [PATCH] Fix BenchmarkConnectionMainReadLoop

---
 connection_test.go | 38 +++++++++++++++++++++-----------------
 1 file changed, 21 insertions(+), 17 deletions(-)

diff --git a/connection_test.go b/connection_test.go
index f6533818..a6c3f318 100644
--- a/connection_test.go
+++ b/connection_test.go
@@ -109,32 +109,36 @@ func BenchmarkConnectionMainReadLoop(b *testing.B) {
 	cn := cl.newConnection(r, true)
 	cn.setTorrent(t)
 	mrlErr := make(chan error)
-	cl.mu.Lock()
+	msg := pp.Message{
+		Type:  pp.Piece,
+		Piece: make([]byte, defaultChunkSize),
+	}
 	go func() {
+		cl.mu.Lock()
 		err := cn.mainReadLoop()
 		if err != nil {
 			mrlErr <- err
 		}
 		close(mrlErr)
 	}()
-	msg := pp.Message{
-		Type:  pp.Piece,
-		Piece: make([]byte, defaultChunkSize),
-	}
-	wb, err := msg.MarshalBinary()
-	require.NoError(b, err)
+	wb := msg.MustMarshalBinary()
 	b.SetBytes(int64(len(msg.Piece)))
-	ts.writeSem.Lock()
-	for range iter.N(b.N) {
-		cl.mu.Lock()
-		t.pieces[0].dirtyChunks.Clear()
-		cl.mu.Unlock()
-		n, err := w.Write(wb)
-		require.NoError(b, err)
-		require.EqualValues(b, len(wb), n)
+	go func() {
+		defer w.Close()
 		ts.writeSem.Lock()
-	}
-	w.Close()
+		for range iter.N(b.N) {
+			cl.mu.Lock()
+			// The chunk must be written to storage everytime, to ensure the
+			// writeSem is unlocked.
+			t.pieces[0].dirtyChunks.Clear()
+			cn.validReceiveChunks = map[request]struct{}{newRequestFromMessage(&msg): struct{}{}}
+			cl.mu.Unlock()
+			n, err := w.Write(wb)
+			require.NoError(b, err)
+			require.EqualValues(b, len(wb), n)
+			ts.writeSem.Lock()
+		}
+	}()
 	require.NoError(b, <-mrlErr)
 	require.EqualValues(b, b.N, cn.stats.ChunksReadUseful.Int64())
 }
-- 
2.51.0