summaryrefslogtreecommitdiff
path: root/internal/fusefrontend_reverse/rpath_cache.go
diff options
context:
space:
mode:
authorJakob Unterwurzacher2017-01-03 18:14:01 +0100
committerJakob Unterwurzacher2017-01-03 18:14:01 +0100
commitfe1705c55b5091d2d789b235fd02363b70cecc38 (patch)
tree30ed167873ce301f527e5619d62b9fafbb302dde /internal/fusefrontend_reverse/rpath_cache.go
parentef089c9f804556c8b7208991a482360637aa63bd (diff)
reverse: add single-entry path cache
Speeds up the "ls -lR" benchmark from 2.6 seconds to 2.0.
Diffstat (limited to 'internal/fusefrontend_reverse/rpath_cache.go')
-rw-r--r--internal/fusefrontend_reverse/rpath_cache.go41
1 files changed, 41 insertions, 0 deletions
diff --git a/internal/fusefrontend_reverse/rpath_cache.go b/internal/fusefrontend_reverse/rpath_cache.go
new file mode 100644
index 0000000..81e945b
--- /dev/null
+++ b/internal/fusefrontend_reverse/rpath_cache.go
@@ -0,0 +1,41 @@
+package fusefrontend_reverse
+
+import (
+ "sync"
+)
+
+// rPathCacheContainer is a simple one entry path cache. Because the dirIV
+// is generated deterministically from the directory path, there is no need
+// to ever invalidate entries.
+type rPathCacheContainer struct {
+ sync.Mutex
+ // Relative ciphertext path to the directory
+ cPath string
+ // Relative plaintext path
+ pPath string
+ // Directory IV of the directory
+ dirIV []byte
+}
+
+func (c *rPathCacheContainer) lookup(cPath string) ([]byte, string) {
+ c.Lock()
+ defer c.Unlock()
+ if cPath == c.cPath {
+ //fmt.Printf("HIT %q\n", cPath)
+ return c.dirIV, c.pPath
+ }
+ //fmt.Printf("MISS %q\n", cPath)
+ return nil, ""
+}
+
+// store - write entry for "cPath" into the cache
+func (c *rPathCacheContainer) store(cPath string, dirIV []byte, pPath string) {
+ //fmt.Printf("STORE %q\n", cPath)
+ c.Lock()
+ defer c.Unlock()
+ c.cPath = cPath
+ c.dirIV = dirIV
+ c.pPath = pPath
+}
+
+var rPathCache rPathCacheContainer