diff options
author | Ben Johnson <benbjohnson@yahoo.com> | 2015-12-30 08:33:30 -0700 |
---|---|---|
committer | Ben Johnson <benbjohnson@yahoo.com> | 2015-12-30 08:33:30 -0700 |
commit | 343cdc2b4e5e6e15d6076f7144e26eab454cfe3b (patch) | |
tree | a88f0fb9f747a01a256e9dc33b8f7a99bd78a789 /db_test.go | |
parent | Merge pull request #470 from ReadmeCritic/master (diff) | |
parent | Introduce InitialMmapSize to prevent deadlock (diff) | |
download | dedo-343cdc2b4e5e6e15d6076f7144e26eab454cfe3b.tar.gz dedo-343cdc2b4e5e6e15d6076f7144e26eab454cfe3b.tar.xz |
Merge pull request #472 from gyuho/initial_mmap
Introduce InitialMmapSize to prevent deadlock
Diffstat (limited to 'db_test.go')
-rw-r--r-- | db_test.go | 45 |
1 files changed, 45 insertions, 0 deletions
@@ -368,6 +368,51 @@ func TestOpen_ReadOnly(t *testing.T) { } } +// TestDB_Open_InitialMmapSize tests if having InitialMmapSize large enough +// to hold data from concurrent write transaction resolves the issue that +// read transaction blocks the write transaction and causes deadlock. +// This is a very hacky test since the mmap size is not exposed. +func TestDB_Open_InitialMmapSize(t *testing.T) { + path := tempfile() + defer os.Remove(path) + + initMmapSize := 1 << 31 // 2GB + testWriteSize := 1 << 27 // 134MB + + db, err := bolt.Open(path, 0666, &bolt.Options{InitialMmapSize: initMmapSize}) + assert(t, err == nil, "") + + // create a long-running read transaction + // that never gets closed while writing + rtx, err := db.Begin(false) + assert(t, err == nil, "") + defer rtx.Rollback() + + // create a write transaction + wtx, err := db.Begin(true) + assert(t, err == nil, "") + + b, err := wtx.CreateBucket([]byte("test")) + assert(t, err == nil, "") + + // and commit a large write + err = b.Put([]byte("foo"), make([]byte, testWriteSize)) + assert(t, err == nil, "") + + done := make(chan struct{}) + + go func() { + wtx.Commit() + done <- struct{}{} + }() + + select { + case <-time.After(5 * time.Second): + t.Errorf("unexpected that the reader blocks writer") + case <-done: + } +} + // TODO(benbjohnson): Test corruption at every byte of the first two pages. // Ensure that a database cannot open a transaction when it's not open. |