From 2422e85e851b6e70c432c0609f4cb1bb2a21ac73 Mon Sep 17 00:00:00 2001 From: see-quick Date: Mon, 2 Feb 2026 12:53:01 +0100 Subject: [PATCH 1/7] [KAFKA-20110] Fix DynamicQuotaConfig Signed-off-by: see-quick # Conflicts: # server/src/main/java/org/apache/kafka/server/config/DynamicBrokerConfig.java --- .../kafka/server/config/QuotaConfig.java | 24 ++++++++++--------- .../server/config/AbstractKafkaConfig.java | 1 + .../server/config/DynamicBrokerConfig.java | 11 ++++++--- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/server-common/src/main/java/org/apache/kafka/server/config/QuotaConfig.java b/server-common/src/main/java/org/apache/kafka/server/config/QuotaConfig.java index 27a1c46bdad7a..01c0e4178a48e 100644 --- a/server-common/src/main/java/org/apache/kafka/server/config/QuotaConfig.java +++ b/server-common/src/main/java/org/apache/kafka/server/config/QuotaConfig.java @@ -112,6 +112,18 @@ public class QuotaConfig { .define(QuotaConfig.ALTER_LOG_DIRS_REPLICATION_QUOTA_WINDOW_SIZE_SECONDS_CONFIG, INT, QuotaConfig.QUOTA_WINDOW_SIZE_SECONDS_DEFAULT, atLeast(1), LOW, QuotaConfig.ALTER_LOG_DIRS_REPLICATION_QUOTA_WINDOW_SIZE_SECONDS_DOC) .define(QuotaConfig.CONTROLLER_QUOTA_WINDOW_SIZE_SECONDS_CONFIG, INT, QuotaConfig.QUOTA_WINDOW_SIZE_SECONDS_DEFAULT, atLeast(1), LOW, QuotaConfig.CONTROLLER_QUOTA_WINDOW_SIZE_SECONDS_DOC) .define(QuotaConfig.CLIENT_QUOTA_CALLBACK_CLASS_CONFIG, CLASS, null, LOW, QuotaConfig.CLIENT_QUOTA_CALLBACK_CLASS_DOC); + + public static final ConfigDef BROKER_QUOTA_CONFIG_DEF = new ConfigDef() + .define(QuotaConfig.LEADER_REPLICATION_THROTTLED_RATE_CONFIG, ConfigDef.Type.LONG, + QuotaConfig.QUOTA_BYTES_PER_SECOND_DEFAULT, ConfigDef.Range.atLeast(0), + ConfigDef.Importance.MEDIUM, QuotaConfig.LEADER_REPLICATION_THROTTLED_RATE_DOC) + .define(QuotaConfig.FOLLOWER_REPLICATION_THROTTLED_RATE_CONFIG, ConfigDef.Type.LONG, + QuotaConfig.QUOTA_BYTES_PER_SECOND_DEFAULT, ConfigDef.Range.atLeast(0), + ConfigDef.Importance.MEDIUM, QuotaConfig.FOLLOWER_REPLICATION_THROTTLED_RATE_DOC) + .define(QuotaConfig.REPLICA_ALTER_LOG_DIRS_IO_MAX_BYTES_PER_SECOND_CONFIG, ConfigDef.Type.LONG, + QuotaConfig.QUOTA_BYTES_PER_SECOND_DEFAULT, ConfigDef.Range.atLeast(0), + ConfigDef.Importance.MEDIUM, QuotaConfig.REPLICA_ALTER_LOG_DIRS_IO_MAX_BYTES_PER_SECOND_DOC); + private static final Set USER_AND_CLIENT_QUOTA_NAMES = Set.of( PRODUCER_BYTE_RATE_OVERRIDE_CONFIG, CONSUMER_BYTE_RATE_OVERRIDE_CONFIG, @@ -212,17 +224,7 @@ public int controllerQuotaWindowSizeSeconds() { } public static ConfigDef brokerQuotaConfigs() { - return new ConfigDef() - // Round minimum value down, to make it easier for users. - .define(QuotaConfig.LEADER_REPLICATION_THROTTLED_RATE_CONFIG, ConfigDef.Type.LONG, - QuotaConfig.QUOTA_BYTES_PER_SECOND_DEFAULT, ConfigDef.Range.atLeast(0), - ConfigDef.Importance.MEDIUM, QuotaConfig.LEADER_REPLICATION_THROTTLED_RATE_DOC) - .define(QuotaConfig.FOLLOWER_REPLICATION_THROTTLED_RATE_CONFIG, ConfigDef.Type.LONG, - QuotaConfig.QUOTA_BYTES_PER_SECOND_DEFAULT, ConfigDef.Range.atLeast(0), - ConfigDef.Importance.MEDIUM, QuotaConfig.FOLLOWER_REPLICATION_THROTTLED_RATE_DOC) - .define(QuotaConfig.REPLICA_ALTER_LOG_DIRS_IO_MAX_BYTES_PER_SECOND_CONFIG, ConfigDef.Type.LONG, - QuotaConfig.QUOTA_BYTES_PER_SECOND_DEFAULT, ConfigDef.Range.atLeast(0), - ConfigDef.Importance.MEDIUM, QuotaConfig.REPLICA_ALTER_LOG_DIRS_IO_MAX_BYTES_PER_SECOND_DOC); + return BROKER_QUOTA_CONFIG_DEF; } public static final Set BROKER_QUOTA_CONFIGS = Set.copyOf(brokerQuotaConfigs().names()); diff --git a/server/src/main/java/org/apache/kafka/server/config/AbstractKafkaConfig.java b/server/src/main/java/org/apache/kafka/server/config/AbstractKafkaConfig.java index bfec3337ca375..58244e263fd9a 100644 --- a/server/src/main/java/org/apache/kafka/server/config/AbstractKafkaConfig.java +++ b/server/src/main/java/org/apache/kafka/server/config/AbstractKafkaConfig.java @@ -79,6 +79,7 @@ public abstract class AbstractKafkaConfig extends AbstractConfig { QuorumConfig.CONFIG_DEF, MetricConfigs.CONFIG_DEF, QuotaConfig.CONFIG_DEF, + QuotaConfig.BROKER_QUOTA_CONFIG_DEF, BrokerSecurityConfigs.CONFIG_DEF, DelegationTokenManagerConfigs.CONFIG_DEF, AddPartitionsToTxnConfig.CONFIG_DEF diff --git a/server/src/main/java/org/apache/kafka/server/config/DynamicBrokerConfig.java b/server/src/main/java/org/apache/kafka/server/config/DynamicBrokerConfig.java index 7d26793b9c2f2..7382a795075f5 100644 --- a/server/src/main/java/org/apache/kafka/server/config/DynamicBrokerConfig.java +++ b/server/src/main/java/org/apache/kafka/server/config/DynamicBrokerConfig.java @@ -61,7 +61,8 @@ public class DynamicBrokerConfig { private static final Set PER_BROKER_CONFIGS = Stream.of( DYNAMIC_SECURITY_CONFIGS, - DynamicListenerConfig.RECONFIGURABLE_CONFIGS) + DynamicListenerConfig.RECONFIGURABLE_CONFIGS, + DynamicQuotaConfig.RECONFIGURABLE_CONFIGS) .flatMap(Collection::stream) .filter(c -> !CLUSTER_LEVEL_LISTENER_CONFIGS.contains(c)) .collect(Collectors.toUnmodifiableSet()); @@ -79,8 +80,8 @@ public class DynamicBrokerConfig { DynamicReplicationConfig.RECONFIGURABLE_CONFIGS, List.of(AbstractConfig.CONFIG_PROVIDERS_CONFIG), GroupCoordinatorConfig.RECONFIGURABLE_CONFIGS, - ShareCoordinatorConfig.RECONFIGURABLE_CONFIGS, - QuotaConfig.BROKER_QUOTA_CONFIGS) + ShareCoordinatorConfig.RECONFIGURABLE_CONFIGS, + DynamicQuotaConfig.RECONFIGURABLE_CONFIGS) .flatMap(Collection::stream) .collect(Collectors.toUnmodifiableSet()); @@ -279,4 +280,8 @@ public static class DynamicReplicationConfig { public static final Set RECONFIGURABLE_CONFIGS = Set.of( ReplicationConfigs.FOLLOWER_FETCH_LAST_TIERED_OFFSET_ENABLE_CONFIG); } + + public static class DynamicQuotaConfig { + public static final Set RECONFIGURABLE_CONFIGS = QuotaConfig.BROKER_QUOTA_CONFIG_DEF.names(); + } } From 19e320e257ac1b92526f132388e4a46e7d3bae93 Mon Sep 17 00:00:00 2001 From: see-quick Date: Thu, 5 Feb 2026 13:37:36 +0100 Subject: [PATCH 2/7] fix the stuff Signed-off-by: see-quick --- .../main/java/org/apache/kafka/server/config/QuotaConfig.java | 2 +- .../main/java/org/apache/kafka/server/config/DynamicConfig.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server-common/src/main/java/org/apache/kafka/server/config/QuotaConfig.java b/server-common/src/main/java/org/apache/kafka/server/config/QuotaConfig.java index 01c0e4178a48e..072108a71474c 100644 --- a/server-common/src/main/java/org/apache/kafka/server/config/QuotaConfig.java +++ b/server-common/src/main/java/org/apache/kafka/server/config/QuotaConfig.java @@ -227,7 +227,7 @@ public static ConfigDef brokerQuotaConfigs() { return BROKER_QUOTA_CONFIG_DEF; } - public static final Set BROKER_QUOTA_CONFIGS = Set.copyOf(brokerQuotaConfigs().names()); + public static final Set BROKER_QUOTA_CONFIGS = Set.copyOf(brokerQuotaConfigs().names()); public static ConfigDef userAndClientQuotaConfigs() { ConfigDef configDef = new ConfigDef(); diff --git a/server/src/main/java/org/apache/kafka/server/config/DynamicConfig.java b/server/src/main/java/org/apache/kafka/server/config/DynamicConfig.java index e1e7ccfd24556..dc4821b975cba 100644 --- a/server/src/main/java/org/apache/kafka/server/config/DynamicConfig.java +++ b/server/src/main/java/org/apache/kafka/server/config/DynamicConfig.java @@ -33,7 +33,7 @@ public static class Broker { private static final ConfigDef BROKER_CONFIGS; static { - ConfigDef configs = QuotaConfig.brokerQuotaConfigs(); + ConfigDef configs = new ConfigDef(); // Filter and define all dynamic configurations AbstractKafkaConfig.CONFIG_DEF.configKeys().forEach((name, value) -> { if (DynamicBrokerConfig.ALL_DYNAMIC_CONFIGS.contains(name)) { From f3e0032d9284b1be826e30b8fb36b19a7c685a92 Mon Sep 17 00:00:00 2001 From: see-quick Date: Tue, 10 Feb 2026 10:37:49 +0100 Subject: [PATCH 3/7] update KafkaConfig to also generate dynamic-only configs into website + refine Signed-off-by: see-quick --- core/src/main/scala/kafka/server/KafkaConfig.scala | 4 +++- .../apache/kafka/server/config/AbstractKafkaConfig.java | 1 - .../java/org/apache/kafka/server/config/DynamicConfig.java | 7 ++++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/core/src/main/scala/kafka/server/KafkaConfig.scala b/core/src/main/scala/kafka/server/KafkaConfig.scala index 4df9c6fe960c0..b063ba1950e0e 100755 --- a/core/src/main/scala/kafka/server/KafkaConfig.scala +++ b/core/src/main/scala/kafka/server/KafkaConfig.scala @@ -56,7 +56,9 @@ import scala.jdk.OptionConverters.RichOptional object KafkaConfig { def main(args: Array[String]): Unit = { - System.out.println(configDef.toHtml(4, (config: String) => "brokerconfigs_" + config, + val combined = new ConfigDef(configDef) + QuotaConfig.brokerQuotaConfigs().configKeys().forEach((_, v) => combined.define(v)) + System.out.println(combined.toHtml(4, (config: String) => "brokerconfigs_" + config, JDynamicBrokerConfig.dynamicConfigUpdateModes)) } diff --git a/server/src/main/java/org/apache/kafka/server/config/AbstractKafkaConfig.java b/server/src/main/java/org/apache/kafka/server/config/AbstractKafkaConfig.java index 58244e263fd9a..bfec3337ca375 100644 --- a/server/src/main/java/org/apache/kafka/server/config/AbstractKafkaConfig.java +++ b/server/src/main/java/org/apache/kafka/server/config/AbstractKafkaConfig.java @@ -79,7 +79,6 @@ public abstract class AbstractKafkaConfig extends AbstractConfig { QuorumConfig.CONFIG_DEF, MetricConfigs.CONFIG_DEF, QuotaConfig.CONFIG_DEF, - QuotaConfig.BROKER_QUOTA_CONFIG_DEF, BrokerSecurityConfigs.CONFIG_DEF, DelegationTokenManagerConfigs.CONFIG_DEF, AddPartitionsToTxnConfig.CONFIG_DEF diff --git a/server/src/main/java/org/apache/kafka/server/config/DynamicConfig.java b/server/src/main/java/org/apache/kafka/server/config/DynamicConfig.java index dc4821b975cba..db9c7cf4fd44f 100644 --- a/server/src/main/java/org/apache/kafka/server/config/DynamicConfig.java +++ b/server/src/main/java/org/apache/kafka/server/config/DynamicConfig.java @@ -24,8 +24,9 @@ import java.util.Set; /** - * Class used to hold dynamic configs. These are configs which have no physical manifestation in the server.properties - * and can only be set dynamically. + * Holds dynamic configs, including both dynamic-only configs which have no physical manifestation in server.properties and + * can only be set dynamically (i.e., {@link QuotaConfig#brokerQuotaConfigs()}), and dual-mode configs that can be set + * statically or dynamically. */ public class DynamicConfig { @@ -33,7 +34,7 @@ public static class Broker { private static final ConfigDef BROKER_CONFIGS; static { - ConfigDef configs = new ConfigDef(); + ConfigDef configs = QuotaConfig.brokerQuotaConfigs(); // Filter and define all dynamic configurations AbstractKafkaConfig.CONFIG_DEF.configKeys().forEach((name, value) -> { if (DynamicBrokerConfig.ALL_DYNAMIC_CONFIGS.contains(name)) { From 36830ea51b4278c31145cb94428942b208b873a0 Mon Sep 17 00:00:00 2001 From: see-quick Date: Tue, 10 Feb 2026 10:47:30 +0100 Subject: [PATCH 4/7] rebase Signed-off-by: see-quick --- .../kafka/server/config/QuotaConfig.java | 23 +++++++++---------- .../server/config/DynamicBrokerConfig.java | 2 +- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/server-common/src/main/java/org/apache/kafka/server/config/QuotaConfig.java b/server-common/src/main/java/org/apache/kafka/server/config/QuotaConfig.java index 072108a71474c..89fd30af3db53 100644 --- a/server-common/src/main/java/org/apache/kafka/server/config/QuotaConfig.java +++ b/server-common/src/main/java/org/apache/kafka/server/config/QuotaConfig.java @@ -113,17 +113,6 @@ public class QuotaConfig { .define(QuotaConfig.CONTROLLER_QUOTA_WINDOW_SIZE_SECONDS_CONFIG, INT, QuotaConfig.QUOTA_WINDOW_SIZE_SECONDS_DEFAULT, atLeast(1), LOW, QuotaConfig.CONTROLLER_QUOTA_WINDOW_SIZE_SECONDS_DOC) .define(QuotaConfig.CLIENT_QUOTA_CALLBACK_CLASS_CONFIG, CLASS, null, LOW, QuotaConfig.CLIENT_QUOTA_CALLBACK_CLASS_DOC); - public static final ConfigDef BROKER_QUOTA_CONFIG_DEF = new ConfigDef() - .define(QuotaConfig.LEADER_REPLICATION_THROTTLED_RATE_CONFIG, ConfigDef.Type.LONG, - QuotaConfig.QUOTA_BYTES_PER_SECOND_DEFAULT, ConfigDef.Range.atLeast(0), - ConfigDef.Importance.MEDIUM, QuotaConfig.LEADER_REPLICATION_THROTTLED_RATE_DOC) - .define(QuotaConfig.FOLLOWER_REPLICATION_THROTTLED_RATE_CONFIG, ConfigDef.Type.LONG, - QuotaConfig.QUOTA_BYTES_PER_SECOND_DEFAULT, ConfigDef.Range.atLeast(0), - ConfigDef.Importance.MEDIUM, QuotaConfig.FOLLOWER_REPLICATION_THROTTLED_RATE_DOC) - .define(QuotaConfig.REPLICA_ALTER_LOG_DIRS_IO_MAX_BYTES_PER_SECOND_CONFIG, ConfigDef.Type.LONG, - QuotaConfig.QUOTA_BYTES_PER_SECOND_DEFAULT, ConfigDef.Range.atLeast(0), - ConfigDef.Importance.MEDIUM, QuotaConfig.REPLICA_ALTER_LOG_DIRS_IO_MAX_BYTES_PER_SECOND_DOC); - private static final Set USER_AND_CLIENT_QUOTA_NAMES = Set.of( PRODUCER_BYTE_RATE_OVERRIDE_CONFIG, CONSUMER_BYTE_RATE_OVERRIDE_CONFIG, @@ -224,7 +213,17 @@ public int controllerQuotaWindowSizeSeconds() { } public static ConfigDef brokerQuotaConfigs() { - return BROKER_QUOTA_CONFIG_DEF; + return new ConfigDef() + // Round minimum value down, to make it easier for users. + .define(QuotaConfig.LEADER_REPLICATION_THROTTLED_RATE_CONFIG, ConfigDef.Type.LONG, + QuotaConfig.QUOTA_BYTES_PER_SECOND_DEFAULT, ConfigDef.Range.atLeast(0), + ConfigDef.Importance.MEDIUM, QuotaConfig.LEADER_REPLICATION_THROTTLED_RATE_DOC) + .define(QuotaConfig.FOLLOWER_REPLICATION_THROTTLED_RATE_CONFIG, ConfigDef.Type.LONG, + QuotaConfig.QUOTA_BYTES_PER_SECOND_DEFAULT, ConfigDef.Range.atLeast(0), + ConfigDef.Importance.MEDIUM, QuotaConfig.FOLLOWER_REPLICATION_THROTTLED_RATE_DOC) + .define(QuotaConfig.REPLICA_ALTER_LOG_DIRS_IO_MAX_BYTES_PER_SECOND_CONFIG, ConfigDef.Type.LONG, + QuotaConfig.QUOTA_BYTES_PER_SECOND_DEFAULT, ConfigDef.Range.atLeast(0), + ConfigDef.Importance.MEDIUM, QuotaConfig.REPLICA_ALTER_LOG_DIRS_IO_MAX_BYTES_PER_SECOND_DOC); } public static final Set BROKER_QUOTA_CONFIGS = Set.copyOf(brokerQuotaConfigs().names()); diff --git a/server/src/main/java/org/apache/kafka/server/config/DynamicBrokerConfig.java b/server/src/main/java/org/apache/kafka/server/config/DynamicBrokerConfig.java index 7382a795075f5..a0959d624d7b0 100644 --- a/server/src/main/java/org/apache/kafka/server/config/DynamicBrokerConfig.java +++ b/server/src/main/java/org/apache/kafka/server/config/DynamicBrokerConfig.java @@ -282,6 +282,6 @@ public static class DynamicReplicationConfig { } public static class DynamicQuotaConfig { - public static final Set RECONFIGURABLE_CONFIGS = QuotaConfig.BROKER_QUOTA_CONFIG_DEF.names(); + public static final Set RECONFIGURABLE_CONFIGS = QuotaConfig.BROKER_QUOTA_CONFIGS; } } From 57e12f65d964665b798a979282641a34f08585a3 Mon Sep 17 00:00:00 2001 From: see-quick Date: Tue, 10 Feb 2026 10:49:19 +0100 Subject: [PATCH 5/7] lining tweak Signed-off-by: see-quick --- .../main/java/org/apache/kafka/server/config/QuotaConfig.java | 1 - 1 file changed, 1 deletion(-) diff --git a/server-common/src/main/java/org/apache/kafka/server/config/QuotaConfig.java b/server-common/src/main/java/org/apache/kafka/server/config/QuotaConfig.java index 89fd30af3db53..ede737cb390ec 100644 --- a/server-common/src/main/java/org/apache/kafka/server/config/QuotaConfig.java +++ b/server-common/src/main/java/org/apache/kafka/server/config/QuotaConfig.java @@ -112,7 +112,6 @@ public class QuotaConfig { .define(QuotaConfig.ALTER_LOG_DIRS_REPLICATION_QUOTA_WINDOW_SIZE_SECONDS_CONFIG, INT, QuotaConfig.QUOTA_WINDOW_SIZE_SECONDS_DEFAULT, atLeast(1), LOW, QuotaConfig.ALTER_LOG_DIRS_REPLICATION_QUOTA_WINDOW_SIZE_SECONDS_DOC) .define(QuotaConfig.CONTROLLER_QUOTA_WINDOW_SIZE_SECONDS_CONFIG, INT, QuotaConfig.QUOTA_WINDOW_SIZE_SECONDS_DEFAULT, atLeast(1), LOW, QuotaConfig.CONTROLLER_QUOTA_WINDOW_SIZE_SECONDS_DOC) .define(QuotaConfig.CLIENT_QUOTA_CALLBACK_CLASS_CONFIG, CLASS, null, LOW, QuotaConfig.CLIENT_QUOTA_CALLBACK_CLASS_DOC); - private static final Set USER_AND_CLIENT_QUOTA_NAMES = Set.of( PRODUCER_BYTE_RATE_OVERRIDE_CONFIG, CONSUMER_BYTE_RATE_OVERRIDE_CONFIG, From 01480f4e3a8cbe6a108e87d1f72b82286f051633 Mon Sep 17 00:00:00 2001 From: see-quick Date: Tue, 10 Feb 2026 14:17:42 +0100 Subject: [PATCH 6/7] make it cluster-level not per-broker Signed-off-by: see-quick --- .../apache/kafka/server/config/DynamicBrokerConfig.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/server/src/main/java/org/apache/kafka/server/config/DynamicBrokerConfig.java b/server/src/main/java/org/apache/kafka/server/config/DynamicBrokerConfig.java index a0959d624d7b0..4ccd3005b7d43 100644 --- a/server/src/main/java/org/apache/kafka/server/config/DynamicBrokerConfig.java +++ b/server/src/main/java/org/apache/kafka/server/config/DynamicBrokerConfig.java @@ -61,8 +61,7 @@ public class DynamicBrokerConfig { private static final Set PER_BROKER_CONFIGS = Stream.of( DYNAMIC_SECURITY_CONFIGS, - DynamicListenerConfig.RECONFIGURABLE_CONFIGS, - DynamicQuotaConfig.RECONFIGURABLE_CONFIGS) + DynamicListenerConfig.RECONFIGURABLE_CONFIGS) .flatMap(Collection::stream) .filter(c -> !CLUSTER_LEVEL_LISTENER_CONFIGS.contains(c)) .collect(Collectors.toUnmodifiableSet()); @@ -80,8 +79,8 @@ public class DynamicBrokerConfig { DynamicReplicationConfig.RECONFIGURABLE_CONFIGS, List.of(AbstractConfig.CONFIG_PROVIDERS_CONFIG), GroupCoordinatorConfig.RECONFIGURABLE_CONFIGS, - ShareCoordinatorConfig.RECONFIGURABLE_CONFIGS, - DynamicQuotaConfig.RECONFIGURABLE_CONFIGS) + DynamicQuotaConfig.RECONFIGURABLE_CONFIGS, + ShareCoordinatorConfig.RECONFIGURABLE_CONFIGS) .flatMap(Collection::stream) .collect(Collectors.toUnmodifiableSet()); From f69c1d5d52f69be46212d43f1a7ca4ec5987ae43 Mon Sep 17 00:00:00 2001 From: see-quick Date: Wed, 11 Feb 2026 12:20:52 +0100 Subject: [PATCH 7/7] update to comment Signed-off-by: see-quick --- core/src/main/scala/kafka/server/KafkaConfig.scala | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/main/scala/kafka/server/KafkaConfig.scala b/core/src/main/scala/kafka/server/KafkaConfig.scala index b063ba1950e0e..d05ef90e6fba6 100755 --- a/core/src/main/scala/kafka/server/KafkaConfig.scala +++ b/core/src/main/scala/kafka/server/KafkaConfig.scala @@ -57,6 +57,8 @@ object KafkaConfig { def main(args: Array[String]): Unit = { val combined = new ConfigDef(configDef) + // Broker quota configs are dynamic-only and not defined in AbstractKafkaConfig.CONFIG_DEF, + // so we need to add them explicitly here for the generated HTML documentation. QuotaConfig.brokerQuotaConfigs().configKeys().forEach((_, v) => combined.define(v)) System.out.println(combined.toHtml(4, (config: String) => "brokerconfigs_" + config, JDynamicBrokerConfig.dynamicConfigUpdateModes))