Jun Rao created KAFKA-21203:
-------------------------------
Summary: recovery could fail when a preallocated segment hits
offset overflow
Key: KAFKA-21203
URL: https://issues.apache.org/jira/browse/KAFKA-21203
Project: Kafka
Issue Type: Bug
Reporter: Jun Rao
During log recovery, we discover offset overflow in a segment. If an overflow
is detected, it stops the recovery and calls splitOverflowedSegment() to split
the segment. However, since the segment hasn't been fully recovered, there
could be untrimmed padding bytes in the segment if preallocation is enabled.
This will cause an exception in splitOverflowedSegment() and fail log loading.
The following call sequence shows how this can happen.
{code:java}
LogLoader.recoverLog() LogLoader.java:456
└─ retryOnOffsetOverflow(this::recoverLog) :210 (outer) / :330
catch
└─ recoverSegment(segment) :400
└─ LogSegment.recover(...) LogSegment.java:482
for (RecordBatch batch : log.batches()) :490
batch.ensureValid() :491
ensureOffsetInRange(batch.lastOffset()) :492 ──► throws
LogSegmentOffsetOverflowException
── caught by retryOnOffsetOverflow ── LogLoader.java:330
└─ LocalLog.splitOverflowedSegment(segment,...) LocalLog.java:909
while (position < sourceRecords.sizeInBytes()) :926 ◄──
sizeInBytes() incl. padding
sourceRecords.batchesFrom(position).iterator().next() :927 ──►
CorruptRecordException
newSegment.appendFromFile(sourceRecords, position) :930
appendChunkFromFile → records.batchesFrom(position).iterator()
LogSegment.java:294
{code}
Note that this issue likely won't happen in practice since the offset overflow
case typically happens on existing rolled segment which has been trimmed.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)