[ https://issues.apache.org/jira/browse/KAFKA-5098?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16500755#comment-16500755 ]
Joel Koshy commented on KAFKA-5098: ----------------------------------- [~huxi_2b] are you still working on this? If not, someone on our team at LinkedIn can help with picking this up. Here is an alternate approach that avoids the performance concerns with the earlier one: * The producer's metadata cache could save the set of invalid topics (since the broker already indicates this in the metadata response). * On metadata response, update the metatadata cache's set of invalid topics if the metadata response carries errors due to invalid topics. In any subsequent send to invalid topics, the {{waitOnMetadata}} call would throw back the {{InvalidTopicException}} * This is pretty much similar to how we currently handle authorization exceptions. > KafkaProducer.send() blocks and generates TimeoutException if topic name has > illegal char > ----------------------------------------------------------------------------------------- > > Key: KAFKA-5098 > URL: https://issues.apache.org/jira/browse/KAFKA-5098 > Project: Kafka > Issue Type: Bug > Components: producer > Affects Versions: 0.10.2.0 > Environment: Java client running against server using > wurstmeister/kafka Docker image. > Reporter: Jeff Larsen > Assignee: huxihx > Priority: Major > Fix For: 2.0.0 > > > The server is running with auto create enabled. If we try to publish to a > topic with a forward slash in the name, the call blocks and we get a > TimeoutException in the Callback. I would expect it to return immediately > with an InvalidTopicException. > There are other blocking issues that have been reported which may be related > to some degree, but this particular cause seems unrelated. > Sample code: > {code} > import org.apache.kafka.clients.producer.*; > import java.util.*; > public class KafkaProducerUnexpectedBlockingAndTimeoutException { > public static void main(String[] args) { > Properties props = new Properties(); > props.put("bootstrap.servers", "kafka.example.com:9092"); > props.put("key.serializer", > "org.apache.kafka.common.serialization.StringSerializer"); > props.put("value.serializer", > "org.apache.kafka.common.serialization.StringSerializer"); > props.put("max.block.ms", 10000); // 10 seconds should illustrate our > point > String separator = "/"; > //String separator = "_"; > try (Producer<String, String> producer = new KafkaProducer<>(props)) { > System.out.println("Calling KafkaProducer.send() at " + new Date()); > producer.send( > new ProducerRecord<String, String>("abc" + separator + > "someStreamName", > "Not expecting a TimeoutException here"), > new Callback() { > @Override > public void onCompletion(RecordMetadata metadata, Exception e) { > if (e != null) { > System.out.println(e.toString()); > } > } > }); > System.out.println("KafkaProducer.send() completed at " + new Date()); > } > } > } > {code} > Switching to the underscore separator in the above example works as expected. > Mea culpa: We neglected to research allowed chars in a topic name, but the > TimeoutException we encountered did not help point us in the right direction. -- This message was sent by Atlassian JIRA (v7.6.3#76005)