[
https://issues.apache.org/jira/browse/KAFKA-7104?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Ismael Juma resolved KAFKA-7104.
--------------------------------
Resolution: Fixed
> ReplicaFetcher thread may die because of inconsistent log start offset in
> fetch response
> ----------------------------------------------------------------------------------------
>
> Key: KAFKA-7104
> URL: https://issues.apache.org/jira/browse/KAFKA-7104
> Project: Kafka
> Issue Type: Bug
> Affects Versions: 1.0.0, 1.1.0
> Reporter: Anna Povzner
> Assignee: Anna Povzner
> Priority: Major
> Fix For: 2.0.0, 1.0.3, 1.1.2
>
>
> What we saw:
> The follower fetches offset 116617, which it was able successfully append.
> However, leader's log start offset in fetch request was 116753, which was
> higher than fetched offset 116617. When replica fetcher thread tried to
> increment log start offset to leader's log start offset, it failed with
> OffsetOutOfRangeException:
> [2018-06-23 00:45:37,409] ERROR Error due to
> (kafka.server.ReplicaFetcherThread)
> kafka.common.KafkaException: Error processing data for partition X-N offset
> 116617
> Caused by: org.apache.kafka.common.errors.OffsetOutOfRangeException: Cannot
> increment the log start offset to 116753 of partition X-N since it is larger
> than the high watermark 116619
>
> In leader's log, we see that log start offset was incremented almost at the
> same time (within one 100 ms or so).
> [2018-06-23 00:45:37,339] INFO Incrementing log start offset of partition X-N
> to 116753
>
> In leader's logic: ReplicaManager#ReplicaManager first calls
> readFromLocalLog() that reads from local log and returns LogReadResult that
> contains fetched data and leader's log start offset and HW. However, it then
> calls ReplicaManager#updateFollowerLogReadResults() which may move leader's
> log start offset and update leader's log start offset and HW in fetch
> response. If deleteRecords() happens in between, it is possible that log
> start offset may move beyond fetched offset. Or possibly, the leader moves
> log start offset because of deleting old log segments. Basically, the issue
> is that log start offset can move between records are read from the log and
> LogReadResult is updated with new log start offset. As a result, fetch
> response may contain fetched data but leader's log start offset in the
> response could be set beyond fetched offset (and indicate the state on leader
> that fetched data does not actually exist anymore on leader).
> When a follower receives such fetch response, it will first append, then move
> it's HW no further than its LEO, which maybe less than leader's log start
> offset in fetch response, and then call
> `replica.maybeIncrementLogStartOffset(leaderLogStartOffset)` which will throw
> OffsetOutOfRangeException exception causing the fetcher thread to stop.
> Note that this can happen if the follower is not in ISR, otherwise the leader
> will not move its log start offsets beyond follower's HW.
>
> *Suggested fix:*
> 1) Since ReplicaFetcher bounds follower's HW to follower's LEO, we should
> also bound follower's log start offset to its LEO. In this situation, the
> follower's log start offset will be updated to LEO.
> 2) In addition to #1, we could try to make sure that leader builds fetch
> response based on the state of the log as of time of reading data from
> replica (but including moving leader's HW based on the follower's fetch).
> That could be another JIRA potentially, since the fix could be more involved.
>
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)