aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-02-22 11:30:17 +0800
committerGravatar Runxi Yu2026-02-22 11:30:17 +0800
commite0ce3837ee2ea643a4cd7eb5e7b068aae0b3910d (patch)
tree4713f90a513790654e601b4a2140f46ab2a3bc57
parentobjectstore/chain: MRU especially to reduce loose object syscall cost (diff)
signatureNo signature
objectstore/chain: Fix lints v0.1.32
-rw-r--r--objectstore/chain/chain.go118
1 files changed, 59 insertions, 59 deletions
diff --git a/objectstore/chain/chain.go b/objectstore/chain/chain.go
index a6e9da4d..f2992b34 100644
--- a/objectstore/chain/chain.go
+++ b/objectstore/chain/chain.go
@@ -22,12 +22,6 @@ type Chain struct {
backendNodeByStore map[objectstore.Store]*backendNode
}
-type backendNode struct {
- backend objectstore.Store
- prev *backendNode
- next *backendNode
-}
-
// New creates a Chain from backends.
func New(backends ...objectstore.Store) *Chain {
nodeByStore := make(map[objectstore.Store]*backendNode, len(backends))
@@ -59,59 +53,6 @@ func New(backends ...objectstore.Store) *Chain {
}
}
-func (chain *Chain) firstBackend() objectstore.Store {
- chain.mu.RLock()
- defer chain.mu.RUnlock()
- if chain.backendHead == nil {
- return nil
- }
- return chain.backendHead.backend
-}
-
-func (chain *Chain) nextBackend(current objectstore.Store) objectstore.Store {
- chain.mu.RLock()
- defer chain.mu.RUnlock()
- node := chain.backendNodeByStore[current]
- if node == nil || node.next == nil {
- return nil
- }
- return node.next.backend
-}
-
-func (chain *Chain) touchBackend(backend objectstore.Store) {
- if backend == nil {
- return
- }
- if !chain.mu.TryLock() {
- return
- }
- defer chain.mu.Unlock()
-
- node := chain.backendNodeByStore[backend]
- if node == nil || node == chain.backendHead {
- return
- }
- if node.prev != nil {
- node.prev.next = node.next
- }
- if node.next != nil {
- node.next.prev = node.prev
- }
- if chain.backendTail == node {
- chain.backendTail = node.prev
- }
-
- node.prev = nil
- node.next = chain.backendHead
- if chain.backendHead != nil {
- chain.backendHead.prev = node
- }
- chain.backendHead = node
- if chain.backendTail == nil {
- chain.backendTail = node
- }
-}
-
// ReadBytesFull reads a full serialized object from one backend that has it.
func (chain *Chain) ReadBytesFull(id objectid.ObjectID) ([]byte, error) {
for i, backend := 0, chain.firstBackend(); backend != nil; i, backend = i+1, chain.nextBackend(backend) {
@@ -228,3 +169,62 @@ func (chain *Chain) Close() error {
}
return errors.Join(errs...)
}
+
+type backendNode struct {
+ backend objectstore.Store
+ prev *backendNode
+ next *backendNode
+}
+
+func (chain *Chain) firstBackend() objectstore.Store {
+ chain.mu.RLock()
+ defer chain.mu.RUnlock()
+ if chain.backendHead == nil {
+ return nil
+ }
+ return chain.backendHead.backend
+}
+
+func (chain *Chain) nextBackend(current objectstore.Store) objectstore.Store {
+ chain.mu.RLock()
+ defer chain.mu.RUnlock()
+ node := chain.backendNodeByStore[current]
+ if node == nil || node.next == nil {
+ return nil
+ }
+ return node.next.backend
+}
+
+func (chain *Chain) touchBackend(backend objectstore.Store) {
+ if backend == nil {
+ return
+ }
+ if !chain.mu.TryLock() {
+ return
+ }
+ defer chain.mu.Unlock()
+
+ node := chain.backendNodeByStore[backend]
+ if node == nil || node == chain.backendHead {
+ return
+ }
+ if node.prev != nil {
+ node.prev.next = node.next
+ }
+ if node.next != nil {
+ node.next.prev = node.prev
+ }
+ if chain.backendTail == node {
+ chain.backendTail = node.prev
+ }
+
+ node.prev = nil
+ node.next = chain.backendHead
+ if chain.backendHead != nil {
+ chain.backendHead.prev = node
+ }
+ chain.backendHead = node
+ if chain.backendTail == nil {
+ chain.backendTail = node
+ }
+}