diff options
| author | Chris Lu <chris.lu@gmail.com> | 2020-04-08 12:50:34 -0700 |
|---|---|---|
| committer | Chris Lu <chris.lu@gmail.com> | 2020-04-08 12:50:34 -0700 |
| commit | b524a40375d322900e65ba60cc924efe761c660b (patch) | |
| tree | e78100e2b07230e9702fe465ab1f9bed3729a3c5 /weed/filesys/fscache.go | |
| parent | bd56172b829d447d320cd6933b6d72363dae7dac (diff) | |
| download | seaweedfs-b524a40375d322900e65ba60cc924efe761c660b.tar.xz seaweedfs-b524a40375d322900e65ba60cc924efe761c660b.zip | |
add locking to fs cache
Diffstat (limited to 'weed/filesys/fscache.go')
| -rw-r--r-- | weed/filesys/fscache.go | 33 |
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() { |
