1
0
mirror of https://github.com/taigrr/bitcask synced 2025-01-18 04:03:17 -08:00

bitcask: fix data races & use Encode() to serialize config (#94)

This commit is contained in:
Ignacio Hagopian 2019-09-06 20:09:08 -03:00 committed by James Mills
parent 0d3a9213ed
commit 13e35b7acc

View File

@ -1,7 +1,6 @@
package bitcask package bitcask
import ( import (
"encoding/json"
"errors" "errors"
"hash/crc32" "hash/crc32"
"io" "io"
@ -125,8 +124,8 @@ func (b *Bitcask) Get(key []byte) ([]byte, error) {
b.mu.RLock() b.mu.RLock()
value, found := b.trie.Search(key) value, found := b.trie.Search(key)
b.mu.RUnlock()
if !found { if !found {
b.mu.RUnlock()
return nil, ErrKeyNotFound return nil, ErrKeyNotFound
} }
@ -139,6 +138,7 @@ func (b *Bitcask) Get(key []byte) ([]byte, error) {
} }
e, err := df.ReadAt(item.Offset, item.Size) e, err := df.ReadAt(item.Offset, item.Size)
b.mu.RUnlock()
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -168,19 +168,21 @@ func (b *Bitcask) Put(key, value []byte) error {
return ErrValueTooLarge return ErrValueTooLarge
} }
b.mu.Lock()
offset, n, err := b.put(key, value) offset, n, err := b.put(key, value)
if err != nil { if err != nil {
b.mu.Unlock()
return err return err
} }
if b.config.Sync { if b.config.Sync {
if err := b.curr.Sync(); err != nil { if err := b.curr.Sync(); err != nil {
b.mu.Unlock()
return err return err
} }
} }
item := internal.Item{FileID: b.curr.FileID(), Offset: offset, Size: n} item := internal.Item{FileID: b.curr.FileID(), Offset: offset, Size: n}
b.mu.Lock()
b.trie.Insert(key, item) b.trie.Insert(key, item)
b.mu.Unlock() b.mu.Unlock()
@ -190,12 +192,12 @@ func (b *Bitcask) Put(key, value []byte) error {
// Delete deletes the named key. If the key doesn't exist or an I/O error // Delete deletes the named key. If the key doesn't exist or an I/O error
// occurs the error is returned. // occurs the error is returned.
func (b *Bitcask) Delete(key []byte) error { func (b *Bitcask) Delete(key []byte) error {
b.mu.Lock()
_, _, err := b.put(key, []byte{}) _, _, err := b.put(key, []byte{})
if err != nil { if err != nil {
b.mu.Unlock()
return err return err
} }
b.mu.Lock()
b.trie.Delete(key) b.trie.Delete(key)
b.mu.Unlock() b.mu.Unlock()
@ -268,9 +270,6 @@ func (b *Bitcask) Fold(f func(key []byte) error) error {
} }
func (b *Bitcask) put(key, value []byte) (int64, int64, error) { func (b *Bitcask) put(key, value []byte) (int64, int64, error) {
b.mu.Lock()
defer b.mu.Unlock()
size := b.curr.Size() size := b.curr.Size()
if size >= int64(b.config.MaxDatafileSize) { if size >= int64(b.config.MaxDatafileSize) {
err := b.curr.Close() err := b.curr.Close()
@ -300,7 +299,7 @@ func (b *Bitcask) put(key, value []byte) (int64, int64, error) {
} }
func (b *Bitcask) writeConfig() error { func (b *Bitcask) writeConfig() error {
data, err := json.Marshal(b.config) data, err := b.config.Encode()
if err != nil { if err != nil {
return err return err
} }