From 1b47ebd347533d017235cacd9fe7ae7e215c6ee6 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Sat, 21 Feb 2026 03:46:33 +0800 Subject: objectstore: ReadReaderContent should have an advisory declared length --- objectstore/chain/chain.go | 12 ++++++------ objectstore/objectstore.go | 5 +++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/objectstore/chain/chain.go b/objectstore/chain/chain.go index 337e2a2e..2f90d822 100644 --- a/objectstore/chain/chain.go +++ b/objectstore/chain/chain.go @@ -77,22 +77,22 @@ func (chain *Chain) ReadReaderFull(id objectid.ObjectID) (io.ReadCloser, error) 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. diff --git a/objectstore/objectstore.go b/objectstore/objectstore.go index 3d58adf5..22ddffab 100644 --- a/objectstore/objectstore.go +++ b/objectstore/objectstore.go @@ -23,9 +23,10 @@ type Store interface { // 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. -- cgit v1.3.1-10-gc9f91