mirror of
https://github.com/taigrr/bitcask
synced 2025-01-18 04:03:17 -08:00
retain lock file after merge (#201)
* Add test case for Locking after Merge * retain lock file after merge * remove replacing lock file (not needed) Co-authored-by: James Mills <prologic@shortcircuit.net.au> Co-authored-by: yash <yash.chandra@grabpay.com>
This commit is contained in:
parent
6e423ae179
commit
f397bec88f
16
bitcask.go
16
bitcask.go
@ -22,6 +22,10 @@ import (
|
|||||||
"github.com/prologic/bitcask/internal/metadata"
|
"github.com/prologic/bitcask/internal/metadata"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
lockfile = "lock"
|
||||||
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// ErrKeyNotFound is the error returned when a key is not found
|
// ErrKeyNotFound is the error returned when a key is not found
|
||||||
ErrKeyNotFound = errors.New("error: key not found")
|
ErrKeyNotFound = errors.New("error: key not found")
|
||||||
@ -96,13 +100,15 @@ func (b *Bitcask) Stats() (stats Stats, err error) {
|
|||||||
// database.
|
// database.
|
||||||
func (b *Bitcask) Close() error {
|
func (b *Bitcask) Close() error {
|
||||||
b.mu.RLock()
|
b.mu.RLock()
|
||||||
defer b.mu.RUnlock()
|
defer func() {
|
||||||
|
b.mu.RUnlock()
|
||||||
|
b.Flock.Unlock()
|
||||||
|
}()
|
||||||
|
|
||||||
return b.close()
|
return b.close()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Bitcask) close() error {
|
func (b *Bitcask) close() error {
|
||||||
defer b.Flock.Unlock()
|
|
||||||
if err := b.saveIndex(); err != nil {
|
if err := b.saveIndex(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -490,7 +496,7 @@ func (b *Bitcask) Merge() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
for _, file := range files {
|
for _, file := range files {
|
||||||
if file.IsDir() {
|
if file.IsDir() || file.Name() == lockfile {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
ids, err := internal.ParseIds([]string{file.Name()})
|
ids, err := internal.ParseIds([]string{file.Name()})
|
||||||
@ -563,7 +569,7 @@ func Open(path string, options ...Option) (*Bitcask, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bitcask := &Bitcask{
|
bitcask := &Bitcask{
|
||||||
Flock: flock.New(filepath.Join(path, "lock")),
|
Flock: flock.New(filepath.Join(path, lockfile)),
|
||||||
config: cfg,
|
config: cfg,
|
||||||
options: options,
|
options: options,
|
||||||
path: path,
|
path: path,
|
||||||
@ -604,7 +610,7 @@ func (b *Bitcask) Backup(path string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return internal.Copy(b.path, path, []string{"lock"})
|
return internal.Copy(b.path, path, []string{lockfile})
|
||||||
}
|
}
|
||||||
|
|
||||||
// saveIndex saves index currently in RAM to disk
|
// saveIndex saves index currently in RAM to disk
|
||||||
|
@ -1627,6 +1627,27 @@ func TestLocking(t *testing.T) {
|
|||||||
assert.Error(err)
|
assert.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestLockingAfterMerge(t *testing.T) {
|
||||||
|
assert := assert.New(t)
|
||||||
|
|
||||||
|
testdir, err := ioutil.TempDir("", "bitcask")
|
||||||
|
assert.NoError(err)
|
||||||
|
|
||||||
|
db, err := Open(testdir)
|
||||||
|
assert.NoError(err)
|
||||||
|
defer db.Close()
|
||||||
|
|
||||||
|
_, err = Open(testdir)
|
||||||
|
assert.Error(err)
|
||||||
|
|
||||||
|
err = db.Merge()
|
||||||
|
assert.NoError(err)
|
||||||
|
|
||||||
|
// This should still error.
|
||||||
|
_, err = Open(testdir)
|
||||||
|
assert.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
type benchmarkTestCase struct {
|
type benchmarkTestCase struct {
|
||||||
name string
|
name string
|
||||||
size int
|
size int
|
||||||
|
Loading…
x
Reference in New Issue
Block a user