ref: 1b47ebd347533d017235cacd9fe7ae7e215c6ee6
parent: 677887b7aa3d673bd92a7876f3987cd2f86cb43d
author: Runxi Yu <me@runxiyu.org>
date: Fri Feb 20 22:46:33 EST 2026
objectstore: ReadReaderContent should have an advisory declared length
--- a/objectstore/chain/chain.go
+++ b/objectstore/chain/chain.go
@@ -77,22 +77,22 @@
return nil, objectstore.ErrObjectNotFound
}
-// ReadReaderContent reads an object's type and content stream from the first backend that has it.
-func (chain *Chain) ReadReaderContent(id objectid.ObjectID) (objecttype.Type, io.ReadCloser, error) {+// ReadReaderContent reads an object's type, declared content length, and content stream from the first backend that has it.
+func (chain *Chain) ReadReaderContent(id objectid.ObjectID) (objecttype.Type, int64, io.ReadCloser, error) { for i, backend := range chain.backends { if backend == nil {continue
}
- ty, reader, err := backend.ReadReaderContent(id)
+ ty, size, reader, err := backend.ReadReaderContent(id)
if err == nil {- return ty, reader, nil
+ return ty, size, reader, nil
}
if errors.Is(err, objectstore.ErrObjectNotFound) {continue
}
- return objecttype.TypeInvalid, nil, fmt.Errorf("objectstore: backend %d read reader content: %w", i, err)+ return objecttype.TypeInvalid, 0, nil, fmt.Errorf("objectstore: backend %d read reader content: %w", i, err)}
- return objecttype.TypeInvalid, nil, objectstore.ErrObjectNotFound
+ return objecttype.TypeInvalid, 0, nil, objectstore.ErrObjectNotFound
}
// ReadHeader reads object header data from the first backend that has it.
--- a/objectstore/objectstore.go
+++ b/objectstore/objectstore.go
@@ -23,9 +23,10 @@
// ReadReaderFull reads a full serialized object stream as "type size\\x00content".
// Caller must close the returned reader.
ReadReaderFull(id objectid.ObjectID) (io.ReadCloser, error)
- // ReadReaderContent reads an object's type and content stream.
+ // ReadReaderContent reads an object's type, declared content length,
+ // and content stream.
// Caller must close the returned reader.
- ReadReaderContent(id objectid.ObjectID) (objecttype.Type, io.ReadCloser, error)
+ ReadReaderContent(id objectid.ObjectID) (objecttype.Type, int64, io.ReadCloser, error)
// ReadHeader reads an object's type and declared content length.
ReadHeader(id objectid.ObjectID) (objecttype.Type, int64, error)
// Close releases resources associated with the backend.
--
⑨