7121: Add test case to demonstrate deadlock.
authorTom Clegg <tom@curoverse.com>
Thu, 3 Sep 2015 03:19:23 +0000 (23:19 -0400)
committerTom Clegg <tom@curoverse.com>
Mon, 7 Sep 2015 20:42:36 +0000 (16:42 -0400)
services/keepstore/handler_test.go

index 8be471025db5119fb25510d2305fdaaa5cbb7257..a656ecfaff037bacec05e535c31b3518bc4b2079 100644 (file)
@@ -807,6 +807,39 @@ func ExpectBody(
        }
 }
 
+// See #7121
+func TestPutNeedsOnlyOneBuffer(t *testing.T) {
+       defer teardown()
+       KeepVM = MakeTestVolumeManager(1)
+       defer KeepVM.Close()
+
+       defer func(orig *bufferPool) {
+               bufs = orig
+       }(bufs)
+       bufs = newBufferPool(1, BLOCKSIZE)
+
+       ok := make(chan struct{})
+       go func() {
+               for i := 0; i < 2; i++ {
+                       response := IssueRequest(
+                               &RequestTester{
+                                       method:       "PUT",
+                                       uri:          "/" + TEST_HASH,
+                                       request_body: TEST_BLOCK,
+                               })
+                       ExpectStatusCode(t,
+                               "TestPutNeedsOnlyOneBuffer", http.StatusOK, response)
+               }
+               ok <- struct{}{}
+       }()
+
+       select {
+       case <-ok:
+       case <-time.After(time.Second):
+               t.Fatal("PUT deadlocks with maxBuffers==1")
+       }
+}
+
 // Invoke the PutBlockHandler a bunch of times to test for bufferpool resource
 // leak.
 func TestPutHandlerNoBufferleak(t *testing.T) {