[ https://issues.apache.org/jira/browse/KAFKA-12791?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lucas Bradstreet resolved KAFKA-12791. -------------------------------------- Resolution: Fixed > ConcurrentModificationException in KafkaProducer constructor > ------------------------------------------------------------ > > Key: KAFKA-12791 > URL: https://issues.apache.org/jira/browse/KAFKA-12791 > Project: Kafka > Issue Type: Bug > Reporter: Lucas Bradstreet > Priority: Minor > Fix For: 3.0.0 > > > Recently we have noticed multiple instances where KafkaProducers have failed > to constructe due to the following exception: > {noformat} > org.apache.kafka.common.KafkaException: Failed to construct kafka producer at > org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:440) > at > org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:291) > at > org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:318) > java.base/java.lang.Thread.run(Thread.java:832) Caused by: > java.util.ConcurrentModificationException at > java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1584) at > java.base/java.util.HashMap$KeyIterator.next(HashMap.java:1607) at > java.base/java.util.AbstractSet.removeAll(AbstractSet.java:171) at > org.apache.kafka.common.config.AbstractConfig.unused(AbstractConfig.java:221) > at > org.apache.kafka.common.config.AbstractConfig.logUnused(AbstractConfig.java:379) > at > org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:433) > ... 9 more exception.class:org.apache.kafka.common.KafkaException > exception.message:Failed to construct kafka producer > {noformat} > It appears that this is due to the fact that `used` below is a synchronized > set: > > {code:java} > public Set<String> unused() { > Set<String> keys = new HashSet<>(originals.keySet()); > keys.removeAll(used); > return keys; > }{code} > It appears that `used` is being modified while removeAll is being called. > This may be due to the way that keys are added to it when used: > {code:java} > protected Object get(String key) { > if (!values.containsKey(key)) > throw new ConfigException(String.format("Unknown configuration '%s'", key)); > used.add(key); > return values.get(key); > }{code} > -- This message was sent by Atlassian Jira (v8.20.1#820001)