[
https://issues.apache.org/jira/browse/KAFKA-16651?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Mike Pedersen resolved KAFKA-16651.
-----------------------------------
Resolution: Duplicate
> KafkaProducer.send does not throw TimeoutException as documented
> ----------------------------------------------------------------
>
> Key: KAFKA-16651
> URL: https://issues.apache.org/jira/browse/KAFKA-16651
> Project: Kafka
> Issue Type: Bug
> Components: producer
> Affects Versions: 3.6.2
> Reporter: Mike Pedersen
> Priority: Major
>
> In the JavaDoc for {{{}KafkaProducer#send(ProducerRecord, Callback){}}}, it
> claims that it will throw a {{TimeoutException}} if blocking on fetching
> metadata or allocating memory and surpassing {{{}max.block.ms{}}}.
> {quote}Throws:
> {{TimeoutException}} - If the time taken for fetching metadata or allocating
> memory for the record has surpassed max.block.ms.
> {quote}
> ([link|https://kafka.apache.org/36/javadoc/org/apache/kafka/clients/producer/KafkaProducer.html#send(org.apache.kafka.clients.producer.ProducerRecord,org.apache.kafka.clients.producer.Callback)])
> But this is not the case. As {{TimeoutException}} is an {{ApiException}} it
> will hit [this
> catch|https://github.com/a0x8o/kafka/blob/54eff6af115ee647f60129f2ce6a044cb17215d0/clients/src/main/java/org/apache/kafka/clients/producer/KafkaProducer.java#L1073-L1084]
> which will result in a failed future being returned instead of the exception
> being thrown.
> The "allocating memory" part likely changed as part of
> [KAFKA-3720|https://github.com/apache/kafka/pull/8399/files#diff-43491ffa1e0f8d28db071d8c23f1a76b54f1f20ea98cf6921bfd1c77a90446abR29]
> which changed the base exception for buffer exhaustion exceptions to
> {{{}TimeoutException{}}}. Timing out waiting on metadata suffers the same
> issue, but it is not clear whether this has always been the case.
> This is basically a discrepancy between documentation and behavior, so it's a
> question of which one should be adjusted.
> And on that, being able to differentiate between synchronous timeouts (as
> caused by waiting on metadata or allocating memory) and asynchronous timeouts
> (eg. timing out waiting for acks) is useful. In the former case we _know_
> that the broker has not received the event but in the latter it _may_ be that
> the broker has received it but the ack could not be delivered, and our
> actions might vary because of this. The current behavior makes this hard to
> differentiate since both result in a {{TimeoutException}} being delivered via
> the callback. Currently, I am relying on the exception message string to
> differentiate these two, but this is basically just relying on implementation
> detail that may change at any time. Therefore I would suggest to either:
> * Revert to the documented behavior of throwing in case of synchronous
> timeouts
> * Correct the javadoc and introduce an exception base class/interface for
> synchronous timeouts
--
This message was sent by Atlassian Jira
(v8.20.10#820010)