From d0f3fad133919cd7ee8c6656ea6858546fb81793 Mon Sep 17 00:00:00 2001 From: morteza Date: Tue, 13 Oct 2026 01:20:09 +0330 Subject: [PATCH] ec: avoid redundant needle.GetActualSize call in LocateEcShardNeedle (#11629) LocateEcShardNeedle passed needle.GetActualSize(size, version) to LocateEcShardNeedleInterval, which calls needle.GetActualSize internally. This caused header and padding to be added twice to needle size. Fixes #3864 Co-authored-by: Morteza --- weed/storage/erasure_coding/ec_volume.go | 2 +- weed/storage/erasure_coding/ec_volume_test.go | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/weed/storage/erasure_coding/ec_volume.go b/weed/storage/erasure_coding/ec_volume.go index fb65f9732..d3607c6f2 100644 --- a/weed/storage/erasure_coding/ec_volume.go +++ b/weed/storage/erasure_coding/ec_volume.go @@ -982,7 +982,7 @@ func (ev *EcVolume) LocateEcShardNeedle(needleId types.NeedleId, version needle. return types.Offset{}, 0, nil, fmt.Errorf("FindNeedleFromEcx: %w", err) } - intervals = ev.LocateEcShardNeedleInterval(version, offset.ToActualOffset(), types.Size(needle.GetActualSize(size, version))) + intervals = ev.LocateEcShardNeedleInterval(version, offset.ToActualOffset(), size) return } diff --git a/weed/storage/erasure_coding/ec_volume_test.go b/weed/storage/erasure_coding/ec_volume_test.go index b87a662cf..556fc1aba 100644 --- a/weed/storage/erasure_coding/ec_volume_test.go +++ b/weed/storage/erasure_coding/ec_volume_test.go @@ -256,3 +256,30 @@ func TestEcVolumeDestroySweepsBothDirs(t *testing.T) { } } } + +func TestLocateEcShardNeedleMatchesInterval(t *testing.T) { + ecxFile, err := os.OpenFile("./test_files/389.ecx", os.O_RDONLY, 0) + assert.NoError(t, err) + defer ecxFile.Close() + + stat, err := ecxFile.Stat() + assert.NoError(t, err) + fileSize := stat.Size() + + ev := &EcVolume{ + VolumeId: needle.VolumeId(389), + ecxFile: ecxFile, + ecxFileSize: fileSize, + Shards: []*EcVolumeShard{ + {ecdFileSize: 1118830592}, + }, + ECContext: NewDefaultECContext("", 389), + } + + needleId, _ := types.ParseNeedleId("0f0edb92") + offset, size, intervals, err := ev.LocateEcShardNeedle(needleId, needle.GetCurrentVersion()) + assert.NoError(t, err) + + expectedIntervals := ev.LocateEcShardNeedleInterval(needle.GetCurrentVersion(), offset.ToActualOffset(), size) + assert.Equal(t, expectedIntervals, intervals) +}