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