diff options
| author | 2026-02-22 11:30:17 +0800 | |
|---|---|---|
| committer | 2026-02-22 11:30:17 +0800 | |
| commit | e0ce3837ee2ea643a4cd7eb5e7b068aae0b3910d (patch) | |
| tree | 4713f90a513790654e601b4a2140f46ab2a3bc57 | |
| parent | objectstore/chain: MRU especially to reduce loose object syscall cost (diff) | |
| signature | No signature | |
objectstore/chain: Fix lints v0.1.32
| -rw-r--r-- | objectstore/chain/chain.go | 118 |
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 + } +} |
