Browse Source
Phase 10: CRITICAL FIX - Read from Previous Buffers During Flush
Problem:
Consumer stopped at offset 1550, missing last 48 messages (1551-1598)
that were flushed but still in previous buffers.
Root Cause:
ReadMessagesAtOffset only checked prevBuffers if:
startOffset >= bufferStartOffset && startOffset < currentBufferEnd
But after flush:
- bufferStartOffset advanced to 1599
- startOffset = 1551 < 1599 (condition FAILS!)
- Code skipped prevBuffer check, went straight to disk
- Disk had stale cache (1000-1550)
- Returned empty, consumer stalled
The Timeline:
1. Producer flushes offsets 1551-1598 to disk
2. Buffer advances: bufferStart = 1599, pos = 0
3. Data STILL in prevBuffers (not yet released)
4. Consumer requests offset 1551
5. Code sees 1551 < 1599, skips prevBuffer check
6. Goes to disk, finds stale cache (1000-1550)
7. Returns empty!
Fix:
Added else branch to ALWAYS check prevBuffers when offset
is not in current buffer, BEFORE attempting disk read.
This ensures we read from memory when data is still available
in prevBuffers, even after bufferStart has advanced.
Expected Result:
- 100% message delivery (no loss!)
- Consumer reads 1551-1598 from prevBuffers
- No more premature stops
pull/7329/head
1 changed files with 40 additions and 6 deletions
Loading…
Reference in new issue