[ 
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)

Reply via email to