From 3a6235ea037e63dd522478997b2df064ff871e0d Mon Sep 17 00:00:00 2001 From: Yash Suresh Chandra Date: Sun, 13 Dec 2020 16:58:54 +0530 Subject: [PATCH] exclusive lock before closing db in merge (#196) Co-authored-by: yash --- bitcask.go | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/bitcask.go b/bitcask.go index 5199201..037ff8a 100644 --- a/bitcask.go +++ b/bitcask.go @@ -96,12 +96,13 @@ func (b *Bitcask) Stats() (stats Stats, err error) { // database. func (b *Bitcask) Close() error { b.mu.RLock() + defer b.mu.RUnlock() - defer func() { - b.mu.RUnlock() - b.Flock.Unlock() - }() + return b.close() +} +func (b *Bitcask) close() error { + defer b.Flock.Unlock() if err := b.saveIndex(); err != nil { return err } @@ -378,6 +379,12 @@ func (b *Bitcask) Reopen() error { b.mu.Lock() defer b.mu.Unlock() + return b.reopen() +} + +// reopen reloads a bitcask object with index and datafiles +// caller of this method should take care of locking +func (b *Bitcask) reopen() error { datafiles, lastID, err := loadDatafiles(b.path, b.config.MaxKeySize, b.config.MaxValueSize, b.config.FileFileModeBeforeUmask) if err != nil { return err @@ -470,7 +477,10 @@ func (b *Bitcask) Merge() error { if err = mdb.Close(); err != nil { return err } - if err = b.Close(); err != nil { + // no reads and writes till we reopen + b.mu.Lock() + defer b.mu.Unlock() + if err = b.close(); err != nil { return err } @@ -514,7 +524,7 @@ func (b *Bitcask) Merge() error { b.metadata.ReclaimableSpace = 0 // And finally reopen the database - return b.Reopen() + return b.reopen() } // Open opens the database at the given path with optional options.