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

Reply via email to