Skip to content

Fix segment file deletion for limited (range-truncated) segrefs#597

Merged
kjnilsson merged 1 commit intomainfrom
segments-bug-fix
Mar 20, 2026
Merged

Fix segment file deletion for limited (range-truncated) segrefs#597
kjnilsson merged 1 commit intomainfrom
segments-bug-fix

Conversation

@kjnilsson
Copy link
Copy Markdown
Contributor

update_segments/2 used the -- operator to compute which new segment files should be deleted as overwritten. -- performs exact tuple matching, so when compact_segrefs/2 limited (truncated the end index of) a segment rather than removing it entirely, the limited tuple {Fn, {Start, NewEnd}} no longer matched the original {Fn, {Start, OrigEnd}}. The original was then incorrectly included in OverwrittenSegments, causing the segment file to be deleted while a reference to it remained in the segment_refs structure.

This manifested when the segment writer sent a batch containing both normal (4096-entry) segments and compacted (wide-range) segments whose index ranges overlapped. compact_segrefs would limit the compacted segments, and the -- operator would flag them as overwritten. The files were deleted, leaving dangling references that caused subsequent reads to fail with "did not found all requested indexes".

Replace the -- approach with a map-based filename lookup: build a set of filenames surviving in the compacted result and only flag segments whose filename is completely absent — i.e. truly removed, not merely limited.

update_segments/2 used the `--` operator to compute which new segment
files should be deleted as overwritten.  `--` performs exact tuple
matching, so when compact_segrefs/2 *limited* (truncated the end index
of) a segment rather than removing it entirely, the limited tuple
{Fn, {Start, NewEnd}} no longer matched the original
{Fn, {Start, OrigEnd}}.  The original was then incorrectly included
in OverwrittenSegments, causing the segment file to be deleted while
a reference to it remained in the segment_refs structure.

This manifested when the segment writer sent a batch containing both
normal (4096-entry) segments and compacted (wide-range) segments whose
index ranges overlapped.  compact_segrefs would limit the compacted
segments, and the `--` operator would flag them as overwritten.  The
files were deleted, leaving dangling references that caused subsequent
reads to fail with "did not found all requested indexes".

Replace the `--` approach with a map-based filename lookup: build a
set of filenames surviving in the compacted result and only flag
segments whose filename is completely absent — i.e. truly removed,
not merely limited.
@kjnilsson kjnilsson merged commit ab12d5c into main Mar 20, 2026
7 checks passed
@dumbbell-rabbitmq dumbbell-rabbitmq deleted the segments-bug-fix branch March 23, 2026 14:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant