From 0ede657a34fecce377d126decc71252c582003ca Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 9 Dec 2025 13:17:18 -0800 Subject: [PATCH] fix: return error on size mismatch in ReadNeedleMeta for consistency (#7687) * fix: return error on size mismatch in ReadNeedleMeta for consistency When ReadNeedleMeta encounters a size mismatch at offset >= MaxPossibleVolumeSize, it previously just continued without returning an error, potentially using wrong data. This fix makes ReadNeedleMeta consistent with ReadBytes (needle_read.go), which properly returns an error in both cases: - ErrorSizeMismatch when offset < MaxPossibleVolumeSize (to trigger retry at offset+32GB) - A descriptive error when offset >= MaxPossibleVolumeSize (after retry failed) Fixes #7673 * refactor: use more accurate error message for size mismatch --- weed/storage/needle/needle_read_page.go | 1 + 1 file changed, 1 insertion(+) diff --git a/weed/storage/needle/needle_read_page.go b/weed/storage/needle/needle_read_page.go index ab0a69739..3bdcb7368 100644 --- a/weed/storage/needle/needle_read_page.go +++ b/weed/storage/needle/needle_read_page.go @@ -55,6 +55,7 @@ func (n *Needle) ReadNeedleMeta(r backend.BackendStorageFile, offset int64, size if OffsetSize == 4 && offset < int64(MaxPossibleVolumeSize) { return ErrorSizeMismatch } + return fmt.Errorf("size mismatch for entry at offset %d: found id %x size %d, expected size %d", offset, n.Id, n.Size, size) } n.DataSize = util.BytesToUint32(bytes[NeedleHeaderSize : NeedleHeaderSize+DataSizeSize]) startOffset := offset + NeedleHeaderSize