[
https://issues.apache.org/jira/browse/KAFKA-20804?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Fahid Abdullah reassigned KAFKA-20804:
--------------------------------------
Assignee: Fahid Abdullah
> Reduce lock contention in ProducerMetadata#add
> ----------------------------------------------
>
> Key: KAFKA-20804
> URL: https://issues.apache.org/jira/browse/KAFKA-20804
> Project: Kafka
> Issue Type: Improvement
> Components: clients
> Reporter: Xi Wang
> Assignee: Fahid Abdullah
> Priority: Critical
>
> add() is called on every send() via KafkaProducer.waitOnMetadata, and the
> synchronized method acquiring the instance lock causing synchronized
> contention which impacts the performance.
> Switch the topics map to a ConcurrentHashMap and refresh known topics via a
> lock-free replace(), which only writes if the topic is still present. For a
> topic seen for the first time (or one concurrently evicted by retainTopic()),
> fall back to a synchronized block so the map insert and newTopics bookkeeping
> happen atomically with retainTopic() - otherwise retainTopic() could
> expire-and-remove the topic in the gap between the two, leaving it recorded
> in newTopics without the corresponding map entry, or silently re-inserting an
> evicted topic without the newTopics bookkeeping needed to trigger an
> immediate refresh.
> retainTopic() switches to a conditional remove(topic, expireMs) so a
> concurrent refresh of an existing topic in add() can't be undone by an
> eviction decision based on the expiry value read just before the refresh
> landed.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)