exclusive lock before closing db in merge (#196)

Co-authored-by: yash <yash.chandra@grabpay.com>
This commit is contained in:
Yash Suresh Chandra 2020-12-13 16:58:54 +05:30 committed by GitHub
parent 4e7414e920
commit 3a6235ea03
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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.