[ https://issues.apache.org/jira/browse/KAFKA-7412?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Michal Turek updated KAFKA-7412: -------------------------------- Description: Hi there, I have probably found a bug in Java Kafka producer client. Scenario & current behavior: - Start Kafka broker, single instance. - Start application that produces messages to Kafka. - Let the application to load partitions for a topic to warm up the producer, e.g. send a message to Kafka. I'm not sure if this is necessary step, but our code does it. - Gracefully stop the Kafka broker. - Application logs now contains "org.apache.kafka.clients.NetworkClient: [Producer clientId=...] Connection to node 0 could not be established. Broker may not be available." so the client is aware about the Kafka unavailability. - Trigger the producer to send a message using KafkaProducer.send(ProducerRecord, Callback) method. - The callback that notifies business code receives non-null RecordMetadata and null Exception after request.timeout.ms. The metadata contains offset -1 which is value of ProduceResponse.INVALID_OFFSET. Expected behavior: - If the Kafka is not running and the message is not appended to the log, the callback should contain null RecordMetadata and non-null Exception. At least I subjectively understand the Javadoc this way, "exception on production error" in simple words. - Developer that is not aware of this behavior and that doesn't test for offset -1, may consider the message as successfully send and properly acked by the broker. Known workaround - Together with checking for non-null exception in the callback, add another condition for ProduceResponse.INVALID_OFFSET. {noformat} try { producer.send(record, (metadata, exception) -> { if (metadata != null) { if (metadata.offset() != ProduceResponse.INVALID_OFFSET) { // Success } else { // Failure } } else { // Failure } }); } catch (Exception e) { // Failure } {noformat} Used setup - Latest Kafka 2.0.0 for both broker and Java client. - Originally found with broker 0.11.0.1 and client 2.0.0. - Code is analogy of the one in Javadoc of KafkaProducer.send(). - Used producer configuration (others use defaults). {noformat} bootstrap.servers = "localhost:9092" client.id = "..." acks = "all" retries = 1 linger.ms = "20" compression.type = "lz4" request.timeout.ms = 5000 # The same behavior is with default, this is to speed up the tests {noformat} was: Hi there, I have probably found a bug in Java Kafka producer client. Scenario & current behavior: - Start Kafka broker, single instance. - Start application that produces messages to Kafka. - Let the application to load partitions for a topic to warm up the producer, e.g. send a message to Kafka. I'm not sure if this is necessary step, but our code does it. - Gracefully stop the Kafka broker. - Application logs now contains "org.apache.kafka.clients.NetworkClient: [Producer clientId=...] Connection to node 0 could not be established. Broker may not be available." so the client is aware about the Kafka unavailability. - Trigger the producer to send a message using KafkaProducer.send(ProducerRecord, Callback) method. - The callback that notifies business code receives non-null RecordMetadata and null Exception after request.timeout.ms. The metadata contains offset -1 which is value of ProduceResponse.INVALID_OFFSET. Expected behavior: - If the Kafka is not running and the message is not appended to the log, the callback should contain null RecordMetadata and non-null Exception. At least I subjectively understand the Javadoc this way, "exception on production error" in simple words. - Developer that is not aware of this behavior and that doesn't test for offset -1, may consider the message as successfully send and properly acked by the broker. Known workaround - Together with checking for non-null exception in the callback, add another condition for ProduceResponse.INVALID_OFFSET. Used setup - Latest Kafka 2.0.0 for both broker and Java client. - Originally found with broker 0.11.0.1 and client 2.0.0. - Code is analogy of the one in Javadoc of KafkaProducer.send(). - Used producer configuration (others use defaults). {noformat} bootstrap.servers = "localhost:9092" client.id = "..." acks = "all" retries = 1 linger.ms = "20" compression.type = "lz4" request.timeout.ms = 5000 # The same behavior is with default, this is to speed up the tests {noformat} > Bug prone response from producer.send(ProducerRecord, Callback) if Kafka > broker is not running > ---------------------------------------------------------------------------------------------- > > Key: KAFKA-7412 > URL: https://issues.apache.org/jira/browse/KAFKA-7412 > Project: Kafka > Issue Type: Bug > Components: producer > Affects Versions: 2.0.0 > Reporter: Michal Turek > Priority: Major > Attachments: metadata_when_kafka_is_stopped.png > > > Hi there, I have probably found a bug in Java Kafka producer client. > Scenario & current behavior: > - Start Kafka broker, single instance. > - Start application that produces messages to Kafka. > - Let the application to load partitions for a topic to warm up the producer, > e.g. send a message to Kafka. I'm not sure if this is necessary step, but our > code does it. > - Gracefully stop the Kafka broker. > - Application logs now contains "org.apache.kafka.clients.NetworkClient: > [Producer clientId=...] Connection to node 0 could not be established. Broker > may not be available." so the client is aware about the Kafka unavailability. > - Trigger the producer to send a message using > KafkaProducer.send(ProducerRecord, Callback) method. > - The callback that notifies business code receives non-null RecordMetadata > and null Exception after request.timeout.ms. The metadata contains offset -1 > which is value of ProduceResponse.INVALID_OFFSET. > Expected behavior: > - If the Kafka is not running and the message is not appended to the log, the > callback should contain null RecordMetadata and non-null Exception. At least > I subjectively understand the Javadoc this way, "exception on production > error" in simple words. > - Developer that is not aware of this behavior and that doesn't test for > offset -1, may consider the message as successfully send and properly acked > by the broker. > Known workaround > - Together with checking for non-null exception in the callback, add another > condition for ProduceResponse.INVALID_OFFSET. > {noformat} > try { > producer.send(record, (metadata, exception) -> { > if (metadata != null) { > if (metadata.offset() != > ProduceResponse.INVALID_OFFSET) { > // Success > } else { > // Failure > } > } else { > // Failure > } > }); > } catch (Exception e) { > // Failure > } > {noformat} > Used setup > - Latest Kafka 2.0.0 for both broker and Java client. > - Originally found with broker 0.11.0.1 and client 2.0.0. > - Code is analogy of the one in Javadoc of KafkaProducer.send(). > - Used producer configuration (others use defaults). > {noformat} > bootstrap.servers = "localhost:9092" > client.id = "..." > acks = "all" > retries = 1 > linger.ms = "20" > compression.type = "lz4" > request.timeout.ms = 5000 # The same behavior is with default, this is to > speed up the tests > {noformat} -- This message was sent by Atlassian JIRA (v7.6.3#76005)