[
https://issues.apache.org/jira/browse/KAFKA-21229?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
sanghyeok An updated KAFKA-21229:
---------------------------------
Component/s: consumer
> AsyncKafkaConsumer passes null offsets to OffsetCommitCallback when an
> asynchronous commit fails
> ------------------------------------------------------------------------------------------------
>
> Key: KAFKA-21229
> URL: https://issues.apache.org/jira/browse/KAFKA-21229
> Project: Kafka
> Issue Type: Bug
> Components: clients, consumer
> Reporter: sanghyeok An
> Assignee: sanghyeok An
> Priority: Major
> Labels: clients
> Fix For: 4.5.0
>
>
> When an asynchronous commit fails in AsyncKafkaConsumer with
> group.protocol=consumer, the user-provided OffsetCommitCallback receives null
> instead of the offsets associated with the request.
> Both overloads are affected:
> {code:java}
> consumer.commitAsync(offsets, callback);
> consumer.commitAsync(callback);
> {code}
> Successful commits pass the request offsets correctly.
> *Expected behavior*
> The callback should receive the offsets and metadata associated with the
> request, regardless of whether the commit succeeds or fails. The exception
> argument should indicate the failure and its cause.
> This is consistent with the documentation for the offsets parameter of
> OffsetCommitCallback.onComplete() and the behavior of the Classic Consumer.
>
> *Actual behavior and impact*
> When an asynchronous commit fails, the callback is invoked as follows:
> {code:java}
> callback.onComplete(null, exception); {code}
> Applications cannot identify or log the offsets associated with the failed
> request using the callback argument. Error-handling code that accesses the
> offsets map may throw a NullPointerException.
> {code:java}
> consumer.commitAsync((offsets, exception) -> {
> if (exception != null)
> { offsets.forEach((partition, offset) ->
> recordFailure(partition, offset, exception)); }
> }); {code}
> This issue concerns the information provided when reporting a failed commit.
> It does not imply that the issue itself causes commit failures or data loss.
>
> *Root cause*
> AsyncKafkaConsumer.commitAsync() forwards the committedOffsets value received
> by the commit future’s whenComplete handler directly to the user callback.
> When the future completes exceptionally, committedOffsets` is `null`. The
> implementation does not fall back to the explicitly supplied request offsets.
> When offsets are omitted, the offsets calculated in the background are not
> separately retained for the failure callback either.
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)