[ https://issues.apache.org/jira/browse/KAFKA-7045?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16509067#comment-16509067 ]
Dhruvil Shah commented on KAFKA-7045: ------------------------------------- Relevant code from 1.x release that sends {{FileRecords}} when down-conversion does not yield any records: {code:java} public ConvertedRecords<? extends Records> downConvert(byte toMagic, long firstOffset, Time time) { ConvertedRecords<MemoryRecords> convertedRecords = downConvert(batches, toMagic, firstOffset, time); if (convertedRecords.recordsProcessingStats().numRecordsConverted() == 0) { // This indicates that the message is too large, which means that the buffer is not large // enough to hold a full record batch. We just return all the bytes in this instance. // Even though the record batch does not have the right format version, we expect old clients // to raise an error to the user after reading the record batch size and seeing that there // are not enough available bytes in the response to read it fully. Note that this is // only possible prior to KIP-74, after which the broker was changed to always return at least // one full record batch, even if it requires exceeding the max fetch size requested by the client. return new ConvertedRecords<>(this, RecordsProcessingStats.EMPTY); } else { return convertedRecords; } } {code} > Consumer may not be able to consume all messages when down-conversion is > required > --------------------------------------------------------------------------------- > > Key: KAFKA-7045 > URL: https://issues.apache.org/jira/browse/KAFKA-7045 > Project: Kafka > Issue Type: Bug > Components: consumer, core > Affects Versions: 0.11.0.0, 0.11.0.1, 1.0.0, 0.11.0.2, 1.1.0, 2.0.0, 1.0.1 > Reporter: Dhruvil Shah > Priority: Major > Fix For: 2.1.0 > > > When down-conversion is required, the consumer might fail consuming messages > under certain conditions. Couple such cases are outlined below: > # When consuming from a compacted topic, it is possible that the consumer > wants to fetch messages that fall in the middle of a batch but the messages > have been compacted by the cleaner. For example, let's say we have the > following two segments. The brackets indicate a single batch of messages and > the numbers within are the message offsets. > Segment #1: [0, 1, 2], [3, 4, 5], [6, 7, 8] > Segment #2: [9, 10, 11], [12, 13, 14] > If the cleaner were to come in now and clean up messages with offsets 7 and > 8, the segments would look like the following: > Segment #1: [0, 1, 2], [3, 4, 5], [6] > Segment #2: [9, 10, 11], [12, 13, 14] > A consumer attempting to fetch messages at offset 7 will start reading the > batch starting at offset 6. During down-conversion, we will drop the record > starting at 6 it is less than the current fetch start offset. However, there > are no messages in the log following offset 6. In such cases, we return the > `FileRecords` itself which would cause the consumer to throw an exception > because it does not understand the stored message format. > (1) When consuming from a topic with transactional messages, down-conversion > usually drops control batches because these did not exist in V0 and V1 > message formats. If there are no message batches following the control batch > in the particular segment (or if we are at the end of the log), we would > again get no records after down-conversion and will return the `FileRecords`. > Because the consumer is not able to interpret control batches, it will again > throw an exception. > (2) When consuming from a topic with transactional messages, down-conversion > usually drops control batches because these did not exist in V0 and V1 > message formats. If there are no message batches following the control batch > in the particular segment (or if we are at the end of the log), we would > again get no records after down-conversion and will return the `FileRecords`. > Because the consumer is not able to interpret control batches, it will again > throw an exception. -- This message was sent by Atlassian JIRA (v7.6.3#76005)