[
https://issues.apache.org/jira/browse/KAFKA-21285?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18128265#comment-18128265
]
Gergely Harmadás commented on KAFKA-21285:
------------------------------------------
After more investigation it looks like a very similar problem already came up
in KAFKA-17431. As a solution brokers now use the latest metadata snapshot for
bootstrap instead of the static config. However changes committed after that
snapshot still go through the first publish and are susceptible to this bug. As
a solution I opted for skipping the validation at the first publish. Idea is
that metadata log is the source of truth so a redundant second validation at
startup does not really make sense
> Dynamic configs less than half the value in server.properties will not take
> effect after restart in kraft mode
> --------------------------------------------------------------------------------------------------------------
>
> Key: KAFKA-21285
> URL: https://issues.apache.org/jira/browse/KAFKA-21285
> Project: Kafka
> Issue Type: Bug
> Components: config
> Affects Versions: 4.3.1
> Reporter: yuzhou
> Assignee: Gergely Harmadás
> Priority: Major
>
> Dynamic configs less than half the value in server.properties will not take
> effect after restart in kraft mode
> * first, start kafka kraft mode, in server.properties, add
> "num.io.threads=16"
> * then, modify config from 16 to 8 then to 6
> bin/kafka-configs.sh --bootstrap-server localhost:9092 --entity-type brokers
> --entity-default --alter --add-config num.io.threads=8
> bin/kafka-configs.sh --bootstrap-server localhost:9092 --entity-type brokers
> --entity-default --alter --add-config num.io.threads=6
> * finally, restart broker.
> after restart, log show:
> [2026-10-15 15:45:10,838] INFO [DynamicConfigPublisher controller id=1]
> Updating cluster configuration : num.io.threads -> 6,min.insync.replicas -> 1
> (kafka.server.metadata.DynamicConfigPublisher)
> ...
> [2026-10-15 15:45:11,274] ERROR Failed to update broker configuration with
> configs :
> {advertised.listeners=PLAINTEXT://localhost:9092,CONTROLLER://localhost:9093,
> broker.id=1, controller.listener.names=CONTROLLER,
> controller.quorum.bootstrap.servers=localhost:9093,
> inter.broker.listener.name="PLAINTEXT",
> listener.security.protocol.map="CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL",
> listeners=PLAINTEXT://:9092,CONTROLLER://:9093,
> log.dirs=/tmp/kraft-combined-logs, log.retention.check.interval.ms=300000,
> log.retention.hours=168, log.segment.bytes=1073741824, min.insync.replicas=1,
> node.id=1, num.io.threads=6, num.network.threads=3, num.partitions=1,
> num.recovery.threads.per.data.dir=2, offsets.topic.replication.factor=1,
> process.roles=broker,controller, share.coordinator.state.topic.min.isr=1,
> share.coordinator.state.topic.replication.factor=1,
> socket.receive.buffer.bytes=102400, socket.request.max.bytes=104857600,
> socket.send.buffer.bytes=102400, transaction.state.log.min.isr=1,
> transaction.state.log.replication.factor=1}
> (kafka.server.DynamicBrokerConfig)
> org.apache.kafka.common.config.ConfigException: Dynamic thread count update
> validation failed for num.io.threads=6, value should be at least half the
> current value 16
> at
> org.apache.kafka.server.DynamicThreadPool.validateReconfiguration(DynamicThreadPool.java:51)
> at
> kafka.server.BrokerDynamicThreadPool.validateReconfiguration(DynamicBrokerConfig.scala:647)
> at
> kafka.server.DynamicBrokerConfig.$anonfun$processReconfiguration$3(DynamicBrokerConfig.scala:466)
> at
> java.base/java.util.concurrent.CopyOnWriteArrayList.forEach(CopyOnWriteArrayList.java:807)
> at
> kafka.server.DynamicBrokerConfig.processReconfiguration(DynamicBrokerConfig.scala:464)
> at
> kafka.server.DynamicBrokerConfig.updateCurrentConfig(DynamicBrokerConfig.scala:437)
> at
> kafka.server.DynamicBrokerConfig.$anonfun$updateDefaultConfig$1(DynamicBrokerConfig.scala:293)
> at org.apache.kafka.server.util.LockUtils.inLock(LockUtils.java:96)
> at org.apache.kafka.server.util.LockUtils.inWriteLock(LockUtils.java:115)
> at
> kafka.server.DynamicBrokerConfig.updateDefaultConfig(DynamicBrokerConfig.scala:288)
> at
> kafka.server.BrokerConfigHandler.processConfigChanges(ConfigHandler.scala:150)
> at
> kafka.server.metadata.DynamicConfigPublisher.$anonfun$onMetadataUpdate$5(DynamicConfigPublisher.scala:81)
> at scala.Option.foreach(Option.scala:437)
> at
> kafka.server.metadata.DynamicConfigPublisher.$anonfun$onMetadataUpdate$2(DynamicConfigPublisher.scala:74)
> at java.base/java.util.HashMap$KeySet.forEach(HashMap.java:1008)
> at
> kafka.server.metadata.DynamicConfigPublisher.$anonfun$onMetadataUpdate$1(DynamicConfigPublisher.scala:57)
> at
> kafka.server.metadata.DynamicConfigPublisher.$anonfun$onMetadataUpdate$1$adapted(DynamicConfigPublisher.scala:56)
> at scala.Option.foreach(Option.scala:437)
> at
> kafka.server.metadata.DynamicConfigPublisher.onMetadataUpdate(DynamicConfigPublisher.scala:56)
> at
> kafka.server.metadata.BrokerMetadataPublisher.onMetadataUpdate(BrokerMetadataPublisher.scala:190)
> at
> org.apache.kafka.image.loader.MetadataLoader.initializeNewPublishers(MetadataLoader.java:332)
> at
> org.apache.kafka.image.loader.MetadataLoader.lambda$scheduleInitializeNewPublishers$0(MetadataLoader.java:288)
> at
> org.apache.kafka.queue.KafkaEventQueue$EventContext.run(KafkaEventQueue.java:134)
> at
> org.apache.kafka.queue.KafkaEventQueue$EventHandler.handleEvents(KafkaEventQueue.java:217)
> at
> org.apache.kafka.queue.KafkaEventQueue$EventHandler.run(KafkaEventQueue.java:188)
> at java.base/java.lang.Thread.run(Thread.java:840)
>
> the actcual num.io.threads is 16 , expected 6
--
This message was sent by Atlassian Jira
(v8.20.10#820010)