aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2019-04-16 19:48:07 -0700
committerChris Lu <chris.lu@gmail.com>2019-04-16 19:48:07 -0700
commit07091c44cdd4b5cfe8ebbbb7354c9bd3668e5e5d (patch)
treec9838f3dec13ecc791595ef11118fbd1854c29bd
parent4393b99332a5da26a63f298bbb0ea61ab25fb44b (diff)
downloadseaweedfs-07091c44cdd4b5cfe8ebbbb7354c9bd3668e5e5d.tar.xz
seaweedfs-07091c44cdd4b5cfe8ebbbb7354c9bd3668e5e5d.zip
lock btree writes
fix https://github.com/chrislusf/seaweedfs/issues/930
-rw-r--r--weed/filer2/memdb/memdb_store.go10
1 files changed, 9 insertions, 1 deletions
diff --git a/weed/filer2/memdb/memdb_store.go b/weed/filer2/memdb/memdb_store.go
index 855a13faa..9c10a5472 100644
--- a/weed/filer2/memdb/memdb_store.go
+++ b/weed/filer2/memdb/memdb_store.go
@@ -7,6 +7,7 @@ import (
"github.com/chrislusf/seaweedfs/weed/util"
"github.com/google/btree"
"strings"
+ "sync"
)
func init() {
@@ -14,7 +15,8 @@ func init() {
}
type MemDbStore struct {
- tree *btree.BTree
+ tree *btree.BTree
+ treeLock sync.Mutex
}
type entryItem struct {
@@ -46,7 +48,9 @@ func (store *MemDbStore) RollbackTransaction(ctx context.Context) error {
func (store *MemDbStore) InsertEntry(ctx context.Context, entry *filer2.Entry) (err error) {
// println("inserting", entry.FullPath)
+ store.treeLock.Lock()
store.tree.ReplaceOrInsert(entryItem{entry})
+ store.treeLock.Unlock()
return nil
}
@@ -54,7 +58,9 @@ func (store *MemDbStore) UpdateEntry(ctx context.Context, entry *filer2.Entry) (
if _, err = store.FindEntry(ctx, entry.FullPath); err != nil {
return fmt.Errorf("no such file %s : %v", entry.FullPath, err)
}
+ store.treeLock.Lock()
store.tree.ReplaceOrInsert(entryItem{entry})
+ store.treeLock.Unlock()
return nil
}
@@ -68,7 +74,9 @@ func (store *MemDbStore) FindEntry(ctx context.Context, fullpath filer2.FullPath
}
func (store *MemDbStore) DeleteEntry(ctx context.Context, fullpath filer2.FullPath) (err error) {
+ store.treeLock.Lock()
store.tree.Delete(entryItem{&filer2.Entry{FullPath: fullpath}})
+ store.treeLock.Unlock()
return nil
}