From 5e01d6d09841135655b48afbf1c3985bb6c99492 Mon Sep 17 00:00:00 2001 From: James Mills Date: Fri, 27 Nov 2020 16:52:08 +1000 Subject: [PATCH] Add a few more test cases for concurrent operations --- bitcask_test.go | 86 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/bitcask_test.go b/bitcask_test.go index a48fa5e..e0c5f34 100644 --- a/bitcask_test.go +++ b/bitcask_test.go @@ -1406,6 +1406,92 @@ func TestConcurrent(t *testing.T) { wg.Wait() }) + // Test concurrent Put() with concurrent Scan() + t.Run("PutScan", func(t *testing.T) { + doPut := func(wg *sync.WaitGroup, x int) { + defer func() { + wg.Done() + }() + for i := 0; i <= 100; i++ { + if i%x == 0 { + key := []byte(fmt.Sprintf("k%d", i)) + value := []byte(fmt.Sprintf("v%d", i)) + err := db.Put(key, value) + assert.NoError(err) + } + } + } + + doScan := func(wg *sync.WaitGroup, x int) { + defer func() { + wg.Done() + }() + for i := 0; i <= 100; i++ { + if i%x == 0 { + err := db.Scan([]byte("k"), func(key []byte) error { + return nil + }) + assert.NoError(err) + } + } + } + + wg := &sync.WaitGroup{} + wg.Add(6) + + go doPut(wg, 2) + go doPut(wg, 3) + go doPut(wg, 5) + go doScan(wg, 1) + go doScan(wg, 2) + go doScan(wg, 4) + + wg.Wait() + }) + + // XXX: This has data races + /* Test concurrent Scan() with concurrent Merge() + t.Run("ScanMerge", func(t *testing.T) { + doScan := func(wg *sync.WaitGroup, x int) { + defer func() { + wg.Done() + }() + for i := 0; i <= 100; i++ { + if i%x == 0 { + err := db.Scan([]byte("k"), func(key []byte) error { + return nil + }) + assert.NoError(err) + } + } + } + + doMerge := func(wg *sync.WaitGroup, x int) { + defer func() { + wg.Done() + }() + for i := 0; i <= 100; i++ { + if i%x == 0 { + err := db.Merge() + assert.NoError(err) + } + } + } + + wg := &sync.WaitGroup{} + wg.Add(6) + + go doScan(wg, 2) + go doScan(wg, 3) + go doScan(wg, 5) + go doMerge(wg, 1) + go doMerge(wg, 2) + go doMerge(wg, 4) + + wg.Wait() + }) + */ + t.Run("Close", func(t *testing.T) { err = db.Close() assert.NoError(err)