aboutsummaryrefslogtreecommitdiff
path: root/weed/filesys/fscache.go
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2020-04-08 12:50:34 -0700
committerChris Lu <chris.lu@gmail.com>2020-04-08 12:50:34 -0700
commitb524a40375d322900e65ba60cc924efe761c660b (patch)
treee78100e2b07230e9702fe465ab1f9bed3729a3c5 /weed/filesys/fscache.go
parentbd56172b829d447d320cd6933b6d72363dae7dac (diff)
downloadseaweedfs-b524a40375d322900e65ba60cc924efe761c660b.tar.xz
seaweedfs-b524a40375d322900e65ba60cc924efe761c660b.zip
add locking to fs cache
Diffstat (limited to 'weed/filesys/fscache.go')
-rw-r--r--weed/filesys/fscache.go33
1 files changed, 31 insertions, 2 deletions
diff --git a/weed/filesys/fscache.go b/weed/filesys/fscache.go
index ca8c7de5b..831f3808c 100644
--- a/weed/filesys/fscache.go
+++ b/weed/filesys/fscache.go
@@ -9,6 +9,7 @@ import (
type FsCache struct {
root *FsNode
+ sync.RWMutex
}
type FsNode struct {
parent *FsNode
@@ -27,6 +28,14 @@ func newFsCache(root fs.Node) *FsCache {
}
func (c *FsCache) GetFsNode(path util.FullPath) fs.Node {
+
+ c.RLock()
+ defer c.RUnlock()
+
+ return c.doGetFsNode(path)
+}
+
+func (c *FsCache) doGetFsNode(path util.FullPath) fs.Node {
t := c.root
for _, p := range path.Split() {
t = t.findChild(p)
@@ -38,6 +47,14 @@ func (c *FsCache) GetFsNode(path util.FullPath) fs.Node {
}
func (c *FsCache) SetFsNode(path util.FullPath, node fs.Node) {
+
+ c.Lock()
+ defer c.Unlock()
+
+ c.doSetFsNode(path, node)
+}
+
+func (c *FsCache) doSetFsNode(path util.FullPath, node fs.Node) {
t := c.root
for _, p := range path.Split() {
t = t.ensureChild(p)
@@ -45,17 +62,26 @@ func (c *FsCache) SetFsNode(path util.FullPath, node fs.Node) {
t.node = node
}
+
func (c *FsCache) EnsureFsNode(path util.FullPath, genNodeFn func() fs.Node) fs.Node {
- t := c.GetFsNode(path)
+
+ c.Lock()
+ defer c.Unlock()
+
+ t := c.doGetFsNode(path)
if t != nil {
return t
}
t = genNodeFn()
- c.SetFsNode(path, t)
+ c.doSetFsNode(path, t)
return t
}
func (c *FsCache) DeleteFsNode(path util.FullPath) {
+
+ c.Lock()
+ defer c.Unlock()
+
t := c.root
for _, p := range path.Split() {
t = t.findChild(p)
@@ -72,6 +98,9 @@ func (c *FsCache) DeleteFsNode(path util.FullPath) {
// oldPath and newPath are full path including the new name
func (c *FsCache) Move(oldPath util.FullPath, newPath util.FullPath) *FsNode {
+ c.Lock()
+ defer c.Unlock()
+
// find old node
src := c.root
for _, p := range oldPath.Split() {