aboutsummaryrefslogtreecommitdiff
path: root/objectstore/chain
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-02-21 22:55:15 +0800
committerGravatar Runxi Yu2026-02-21 22:55:15 +0800
commit777db8470909b16411cb54a6c0bbf927be778952 (patch)
tree8b8fa0d845d8bc5f1966ce736923ad181a45f642 /objectstore/chain
parentrepository: traverseTreeIter should use ReadHeader for blob size (diff)
signatureNo signature
objectstore/*, repository: Add ReadSize v0.1.28
For cases where knowing the type is unnecessary and incurs extra overhead.
Diffstat (limited to 'objectstore/chain')
-rw-r--r--objectstore/chain/chain.go18
1 files changed, 18 insertions, 0 deletions
diff --git a/objectstore/chain/chain.go b/objectstore/chain/chain.go
index 3d683c0d..53b9ac89 100644
--- a/objectstore/chain/chain.go
+++ b/objectstore/chain/chain.go
@@ -96,6 +96,24 @@ func (chain *Chain) ReadReaderContent(id objectid.ObjectID) (objecttype.Type, in
return objecttype.TypeInvalid, 0, nil, objectstore.ErrObjectNotFound
}
+// ReadSize reads object content length from the first backend that has it.
+func (chain *Chain) ReadSize(id objectid.ObjectID) (int64, error) {
+ for i, backend := range chain.backends {
+ if backend == nil {
+ continue
+ }
+ size, err := backend.ReadSize(id)
+ if err == nil {
+ return size, nil
+ }
+ if errors.Is(err, objectstore.ErrObjectNotFound) {
+ continue
+ }
+ return 0, fmt.Errorf("objectstore: backend %d read size: %w", i, err)
+ }
+ return 0, objectstore.ErrObjectNotFound
+}
+
// ReadHeader reads object header data from the first backend that has it.
func (chain *Chain) ReadHeader(id objectid.ObjectID) (objecttype.Type, int64, error) {
for i, backend := range chain.backends {