shithub: furgit

Download patch

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.
--