aboutsummaryrefslogtreecommitdiff
path: root/internal/fusefrontend_reverse_v1api/rpath_cache.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/fusefrontend_reverse_v1api/rpath_cache.go')
-rw-r--r--internal/fusefrontend_reverse_v1api/rpath_cache.go45
1 files changed, 45 insertions, 0 deletions
diff --git a/internal/fusefrontend_reverse_v1api/rpath_cache.go b/internal/fusefrontend_reverse_v1api/rpath_cache.go
new file mode 100644
index 0000000..221f578
--- /dev/null
+++ b/internal/fusefrontend_reverse_v1api/rpath_cache.go
@@ -0,0 +1,45 @@
+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
+}
+
+// lookup relative ciphertext path "cPath". Returns dirIV, relative
+// plaintext path.
+func (c *rPathCacheContainer) lookup(cPath string) ([]byte, string) {
+ c.Lock()
+ defer c.Unlock()
+ if cPath == c.cPath {
+ // hit
+ return c.dirIV, c.pPath
+ }
+ // miss
+ return nil, ""
+}
+
+// store - write entry for the directory at relative ciphertext path "cPath"
+// into the cache.
+// "dirIV" = directory IV of the directory, "pPath" = relative plaintext path
+func (c *rPathCacheContainer) store(cPath string, dirIV []byte, pPath string) {
+ c.Lock()
+ defer c.Unlock()
+ c.cPath = cPath
+ c.dirIV = dirIV
+ c.pPath = pPath
+}
+
+// rPathCache: see rPathCacheContainer above for a detailed description
+var rPathCache rPathCacheContainer