This is an automated email from the ASF dual-hosted git repository.
chia7712 pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/kafka.git
The following commit(s) were added to refs/heads/trunk by this push:
new 86328c25ee9 KAFKA-19566 Deprecate
ClientQuotaCallback#updateClusterMetadata (#21958)
86328c25ee9 is described below
commit 86328c25ee99cc202e5dac7ad1a012bded67a364
Author: Kuan-Po Tseng <[email protected]>
AuthorDate: Mon Apr 6 10:12:28 2026 +0800
KAFKA-19566 Deprecate ClientQuotaCallback#updateClusterMetadata (#21958)
This method was unsupported in KRaft mode until Kafka 4.0, but the
implementation has known issues: memory pressure from immutable Cluster
objects on every update, confusing/irrelevant fields in KRaft context,
and inconsistent partition info due to listener parsing differences.
KIP-1162 proposed a redesign, but given the method went years without
user complaints, we're deprecating it now and removing it in Kafka 5.0.
Reviewers: Chia-Ping Tsai <[email protected]>, Ken Huang
<[email protected]>
---
.../org/apache/kafka/server/quota/CustomQuotaCallbackTest.java | 1 +
.../java/org/apache/kafka/server/quota/ClientQuotaCallback.java | 8 ++++++--
.../scala/integration/kafka/api/CustomQuotaCallbackTest.scala | 1 +
.../src/test/scala/unit/kafka/server/ClientQuotaManagerTest.scala | 2 --
docs/getting-started/upgrade.md | 8 ++++++++
.../metadata/publisher/DynamicTopicClusterQuotaPublisher.java | 1 +
.../java/org/apache/kafka/server/quota/ClientQuotaManager.java | 7 -------
.../src/test/java/org/apache/kafka/server/KRaftClusterTest.java | 6 ------
8 files changed, 17 insertions(+), 17 deletions(-)
diff --git
a/clients/clients-integration-tests/src/test/java/org/apache/kafka/server/quota/CustomQuotaCallbackTest.java
b/clients/clients-integration-tests/src/test/java/org/apache/kafka/server/quota/CustomQuotaCallbackTest.java
index de0948981b0..95169356a59 100644
---
a/clients/clients-integration-tests/src/test/java/org/apache/kafka/server/quota/CustomQuotaCallbackTest.java
+++
b/clients/clients-integration-tests/src/test/java/org/apache/kafka/server/quota/CustomQuotaCallbackTest.java
@@ -149,6 +149,7 @@ public class CustomQuotaCallbackTest {
return true;
}
+ @SuppressWarnings("removal")
@Override
public boolean updateClusterMetadata(Cluster cluster) {
COUNTERS.computeIfAbsent(nodeId, k -> new
AtomicInteger()).incrementAndGet();
diff --git
a/clients/src/main/java/org/apache/kafka/server/quota/ClientQuotaCallback.java
b/clients/src/main/java/org/apache/kafka/server/quota/ClientQuotaCallback.java
index 01a8181d861..dbb4641f03f 100644
---
a/clients/src/main/java/org/apache/kafka/server/quota/ClientQuotaCallback.java
+++
b/clients/src/main/java/org/apache/kafka/server/quota/ClientQuotaCallback.java
@@ -96,15 +96,19 @@ public interface ClientQuotaCallback extends Configurable {
boolean quotaResetRequired(ClientQuotaType quotaType);
/**
- * This callback is invoked whenever there are changes in the cluster
metadata, such as
+ * This callback is invoked whenever there are changes in the cluster
metadata, such as
* brokers being added or removed, topics being created or deleted, or
partition leadership updates.
* This is useful if quota computation takes partitions into account.
* Topics that are being deleted will not be included in `cluster`.
*
+ * @deprecated since 4.4 and should not be used any longer.
* @param cluster Cluster metadata including partitions and their leaders
if known
* @return true if quotas have changed and metric configs may need to be
updated
*/
- boolean updateClusterMetadata(Cluster cluster);
+ @Deprecated(since = "4.4", forRemoval = true)
+ default boolean updateClusterMetadata(Cluster cluster) {
+ return false;
+ }
/**
* Closes this instance.
diff --git
a/core/src/test/scala/integration/kafka/api/CustomQuotaCallbackTest.scala
b/core/src/test/scala/integration/kafka/api/CustomQuotaCallbackTest.scala
index e1bd97c93b0..9f2b7457a8c 100644
--- a/core/src/test/scala/integration/kafka/api/CustomQuotaCallbackTest.scala
+++ b/core/src/test/scala/integration/kafka/api/CustomQuotaCallbackTest.scala
@@ -452,6 +452,7 @@ class GroupedUserQuotaCallback extends ClientQuotaCallback
with Reconfigurable w
if (group != null) quotaOrDefault(group, quotaType) else null
}
+ @SuppressWarnings(Array("removal"))
override def updateClusterMetadata(cluster: Cluster): Boolean = {
val topicsByGroup = cluster.topics.asScala.groupBy(group)
diff --git a/core/src/test/scala/unit/kafka/server/ClientQuotaManagerTest.scala
b/core/src/test/scala/unit/kafka/server/ClientQuotaManagerTest.scala
index 142c00441eb..f0d86ba9fdf 100644
--- a/core/src/test/scala/unit/kafka/server/ClientQuotaManagerTest.scala
+++ b/core/src/test/scala/unit/kafka/server/ClientQuotaManagerTest.scala
@@ -16,7 +16,6 @@
*/
package kafka.server
-import org.apache.kafka.common.Cluster
import java.net.InetAddress
import org.apache.kafka.common.internals.Plugin
import org.apache.kafka.common.metrics.Quota
@@ -571,7 +570,6 @@ class ClientQuotaManagerTest extends
BaseClientQuotaManagerTest {
override def quotaMetricTags(quotaType: ClientQuotaType, principal:
KafkaPrincipal, clientId: String): Map[String, String] = Collections.emptyMap()
override def quotaLimit(quotaType: ClientQuotaType, metricTags:
Map[String, String]): java.lang.Double = 1
- override def updateClusterMetadata(cluster: Cluster): Boolean = false
override def updateQuota(quotaType: ClientQuotaType, entity:
ClientQuotaEntity, newValue: Double): Unit = {
quotas.put(entity.asInstanceOf[ClientQuotaManager.KafkaQuotaEntity],
new Quota(newValue.toLong, true))
diff --git a/docs/getting-started/upgrade.md b/docs/getting-started/upgrade.md
index 05721adc356..f4b5a634e02 100644
--- a/docs/getting-started/upgrade.md
+++ b/docs/getting-started/upgrade.md
@@ -26,6 +26,14 @@ type: docs
-->
+## Upgrading to 4.4.0
+
+### Upgrading Servers to 4.4.0 from any version 3.3.x through 4.3.0
+
+### Notable changes in 4.4.0
+
+ * The `ClientQuotaCallback#updateClusterMetadata` method is deprecated and
will be removed in Kafka 5.0. Custom implementations of `ClientQuotaCallback`
no longer need to override this method, as a default no-op implementation is
now provided. For further details, please refer to
[KIP-1200](https://cwiki.apache.org/confluence/x/axBJFg).
+
## Upgrading to 4.3.0
### Upgrading Servers to 4.3.0 from any version 3.3.x through 4.2.0
diff --git
a/metadata/src/main/java/org/apache/kafka/metadata/publisher/DynamicTopicClusterQuotaPublisher.java
b/metadata/src/main/java/org/apache/kafka/metadata/publisher/DynamicTopicClusterQuotaPublisher.java
index 1ffc8f60783..2f5f7b32d6a 100644
---
a/metadata/src/main/java/org/apache/kafka/metadata/publisher/DynamicTopicClusterQuotaPublisher.java
+++
b/metadata/src/main/java/org/apache/kafka/metadata/publisher/DynamicTopicClusterQuotaPublisher.java
@@ -57,6 +57,7 @@ public class DynamicTopicClusterQuotaPublisher implements
MetadataPublisher {
return "DynamicTopicClusterQuotaPublisher " + nodeType + " id=" +
nodeId;
}
+ @SuppressWarnings("removal")
@Override
public void onMetadataUpdate(MetadataDelta delta, MetadataImage newImage,
LoaderManifest manifest) {
try {
diff --git
a/server/src/main/java/org/apache/kafka/server/quota/ClientQuotaManager.java
b/server/src/main/java/org/apache/kafka/server/quota/ClientQuotaManager.java
index ca61593e485..a755003f26f 100644
--- a/server/src/main/java/org/apache/kafka/server/quota/ClientQuotaManager.java
+++ b/server/src/main/java/org/apache/kafka/server/quota/ClientQuotaManager.java
@@ -16,7 +16,6 @@
*/
package org.apache.kafka.server.quota;
-import org.apache.kafka.common.Cluster;
import org.apache.kafka.common.MetricName;
import org.apache.kafka.common.internals.Plugin;
import org.apache.kafka.common.metrics.MetricConfig;
@@ -796,12 +795,6 @@ public class ClientQuotaManager {
return overriddenQuotas.get(DEFAULT_CLIENT_ID_QUOTA_ENTITY);
}
- @Override
- public boolean updateClusterMetadata(Cluster cluster) {
- // The default quota callback does not use any cluster metadata
- return false;
- }
-
@Override
public void updateQuota(ClientQuotaType quotaType, ClientQuotaEntity
entity, double newValue) {
KafkaQuotaEntity quotaEntity = (KafkaQuotaEntity) entity;
diff --git a/server/src/test/java/org/apache/kafka/server/KRaftClusterTest.java
b/server/src/test/java/org/apache/kafka/server/KRaftClusterTest.java
index 02bf5d13655..cca9562d8cc 100644
--- a/server/src/test/java/org/apache/kafka/server/KRaftClusterTest.java
+++ b/server/src/test/java/org/apache/kafka/server/KRaftClusterTest.java
@@ -34,7 +34,6 @@ import org.apache.kafka.clients.admin.NewTopic;
import org.apache.kafka.clients.admin.QuorumInfo;
import org.apache.kafka.clients.admin.SupportedVersionRange;
import org.apache.kafka.clients.admin.TopicDescription;
-import org.apache.kafka.common.Cluster;
import org.apache.kafka.common.Endpoint;
import org.apache.kafka.common.KafkaFuture;
import org.apache.kafka.common.Node;
@@ -1779,11 +1778,6 @@ public class KRaftClusterTest {
return true;
}
- @Override
- public boolean updateClusterMetadata(Cluster cluster) {
- return false;
- }
-
@Override
public void close() {
}