[
https://issues.apache.org/jira/browse/KAFKA-20650?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Vismay reassigned KAFKA-20650:
------------------------------
Assignee: Vismay
> In combined mode, BrokerServer and ControllerServer each independently called
> QuotaFactory.instantiate(), which created a separate ClientQuotaCallback
> instance via reflection for each role.
> ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: KAFKA-20650
> URL: https://issues.apache.org/jira/browse/KAFKA-20650
> Project: Kafka
> Issue Type: Bug
> Components: core
> Affects Versions: 2.8.0, 2.8.1, 2.8.2, 2.8.3, 3.0.0, 3.0.1, 3.0.2, 3.1.0,
> 3.1.1, 3.1.2, 3.2.0, 3.2.1, 3.2.2, 3.2.3, 3.3.0, 3.3.1, 3.3.2, 3.4.0, 3.4.1,
> 3.5.0, 3.5.1, 3.5.2, 3.5.3, 3.6.0, 3.6.1, 3.6.2, 3.7.0, 3.7.1, 3.7.2, 3.8.0,
> 3.8.1, 3.9.0, 3.9.1, 3.9.2, 4.0.0, 4.0.1, 4.1.0, 4.2.0, 4.3.0, 4.0.2, 4.1.1,
> 4.1.2
> Reporter: Patrick Allen
> Assignee: Vismay
> Priority: Major
> Original Estimate: 24h
> Remaining Estimate: 24h
>
> In combined mode,
> [BrokerServer|https://github.com/apache/kafka/blob/trunk/core/src/main/scala/kafka/server/BrokerServer.scala]
> and
> [ControllerServer|https://github.com/apache/kafka/blob/trunk/core/src/main/scala/kafka/server/ControllerServer.scala]
> each independently called
> [QuotaFactory.instantiate()|https://github.com/apache/kafka/blob/trunk/core/src/main/java/kafka/server/QuotaFactory.java],
> which created a separate ClientQuotaCallback instance via reflection for
> each role.
> {code:java}
> // ControllerServer.scala
> quotaManagers = QuotaFactory.instantiate(config,
> metrics,
> time,
> s"controller-${config.nodeId}-",
> ProcessRole.ControllerRole.toString){code}
> {code:java}
> // BrokerServer.scala
> quotaManagers = QuotaFactory.instantiate(config, metrics, time,
> s"broker-${config.nodeId}-", ProcessRole.BrokerRole.toString) {code}
> {code:java}
> // QuotaFactory.java
> Optional<Plugin<ClientQuotaCallback>> clientQuotaCallbackPlugin =
> createClientQuotaCallback(cfg, metrics, role);{code}
>
> This means that two independent callback objects are created with divergent
> state in the same JVM — a regression from the pre-KRaft single-server
> architecture where only one instance existed.
> This only affects combined instances, which in theory should only be used in
> development environments as suggested by Kafka. However, at my company we use
> a custom quota plugin for our Kafka instances, which are often run on
> resource constrained environments where we unfortunately have to run in
> combined mode. We only noticed this issue when migrating to KRaft for version
> 4.0 but I believe it has been present since KRaft's inception (I checked 2.8
> which did indeed have this).
> I have written a simple fix where the quota callback is instead created in
> the shared server, and then passed into the QuotaFactory instantiate as a
> variable so that only a single instance is used across both servers. This is
> in my opinion the quickest fix which I am happy to contribute (waiting on
> developer perms before I can assign this to myself).
> But I do have a wider question of whether Kafka wants to enable custom quota
> management on the controller, and if perhaps we should allow for it also to
> be set in config such as to prevent this issue when in combined:
> {code:java}
> controller.client.quota.callback.class: <package>{code}
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)