aboutsummaryrefslogtreecommitdiff
path: root/object/store/mix/mru.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-28 04:19:44 +0000
committerGravatar Runxi Yu2026-03-28 04:20:29 +0000
commit402ef2733813d128631ca4aea18c2908c74340d5 (patch)
treee03a90b6f41411bd62e7339390802c5c50082850 /object/store/mix/mru.go
parentobject/store: Rename from object/storer (diff)
signatureNo signature
object/store: Rename back from storer; rename Store to ReadingStore v0.1.118
Diffstat (limited to 'object/store/mix/mru.go')
-rw-r--r--object/store/mix/mru.go74
1 files changed, 74 insertions, 0 deletions
diff --git a/object/store/mix/mru.go b/object/store/mix/mru.go
new file mode 100644
index 00000000..c8a58d2d
--- /dev/null
+++ b/object/store/mix/mru.go
@@ -0,0 +1,74 @@
+package mix
+
+import objectstore "codeberg.org/lindenii/furgit/object/store"
+
+type backendNode struct {
+ backend objectstore.ReadingStore
+ prev *backendNode
+ next *backendNode
+}
+
+//nolint:ireturn
+func (mix *Mix) firstBackend() objectstore.ReadingStore {
+ mix.mu.RLock()
+ defer mix.mu.RUnlock()
+
+ if mix.backendHead == nil {
+ return nil
+ }
+
+ return mix.backendHead.backend
+}
+
+//nolint:ireturn
+func (mix *Mix) nextBackend(current objectstore.ReadingStore) objectstore.ReadingStore {
+ mix.mu.RLock()
+ defer mix.mu.RUnlock()
+
+ node := mix.backendNodeByStore[current]
+ if node == nil || node.next == nil {
+ return nil
+ }
+
+ return node.next.backend
+}
+
+func (mix *Mix) touchBackend(backend objectstore.ReadingStore) {
+ if backend == nil {
+ return
+ }
+
+ if !mix.mu.TryLock() {
+ return
+ }
+ defer mix.mu.Unlock()
+
+ node := mix.backendNodeByStore[backend]
+ if node == nil || node == mix.backendHead {
+ return
+ }
+
+ if node.prev != nil {
+ node.prev.next = node.next
+ }
+
+ if node.next != nil {
+ node.next.prev = node.prev
+ }
+
+ if mix.backendTail == node {
+ mix.backendTail = node.prev
+ }
+
+ node.prev = nil
+
+ node.next = mix.backendHead
+ if mix.backendHead != nil {
+ mix.backendHead.prev = node
+ }
+
+ mix.backendHead = node
+ if mix.backendTail == nil {
+ mix.backendTail = node
+ }
+}