dielhennr commented on a change in pull request #11281:
URL: https://github.com/apache/kafka/pull/11281#discussion_r697942506



##########
File path: core/src/main/scala/kafka/server/ConfigHelper.scala
##########
@@ -22,20 +22,127 @@ import java.util.{Collections, Properties}
 import kafka.log.LogConfig
 import kafka.server.metadata.ConfigRepository
 import kafka.utils.{Log4jController, Logging}
-import org.apache.kafka.common.config.{AbstractConfig, ConfigDef, 
ConfigResource}
-import org.apache.kafka.common.errors.{ApiException, InvalidRequestException}
+import org.apache.kafka.clients.admin.AlterConfigOp
+import org.apache.kafka.clients.admin.AlterConfigOp.OpType
+import org.apache.kafka.common.config.{AbstractConfig, ConfigDef, 
ConfigException, ConfigResource, LogLevelConfig}
+import org.apache.kafka.common.config.ConfigDef.ConfigKey
+import org.apache.kafka.common.errors.{ApiException, 
InvalidConfigurationException, InvalidRequestException}
 import org.apache.kafka.common.internals.Topic
 import 
org.apache.kafka.common.message.DescribeConfigsRequestData.DescribeConfigsResource
 import org.apache.kafka.common.message.DescribeConfigsResponseData
 import org.apache.kafka.common.protocol.Errors
 import org.apache.kafka.common.requests.{ApiError, DescribeConfigsResponse}
 import org.apache.kafka.common.requests.DescribeConfigsResponse.ConfigSource
 
-import scala.collection.{Map, mutable}
+import scala.collection.{Map, mutable, Seq}
 import scala.jdk.CollectionConverters._
 
 class ConfigHelper(metadataCache: MetadataCache, config: KafkaConfig, 
configRepository: ConfigRepository) extends Logging {
 
+  def getBrokerId(resource: ConfigResource) = {

Review comment:
       `getBrokerId`, `prepareIncrementalConfigs`, `validateLogLevelConfigs`, 
and `toLoggableProps` were all helper methods in `ZkAdminManager`. I've moved 
them to this class (`ConfigHelper`) to help with validating broker configs 
before they are forwarded to be persisted.

##########
File path: core/src/main/scala/kafka/server/ConfigHelper.scala
##########
@@ -22,20 +22,127 @@ import java.util.{Collections, Properties}
 import kafka.log.LogConfig
 import kafka.server.metadata.ConfigRepository
 import kafka.utils.{Log4jController, Logging}
-import org.apache.kafka.common.config.{AbstractConfig, ConfigDef, 
ConfigResource}
-import org.apache.kafka.common.errors.{ApiException, InvalidRequestException}
+import org.apache.kafka.clients.admin.AlterConfigOp
+import org.apache.kafka.clients.admin.AlterConfigOp.OpType
+import org.apache.kafka.common.config.{AbstractConfig, ConfigDef, 
ConfigException, ConfigResource, LogLevelConfig}
+import org.apache.kafka.common.config.ConfigDef.ConfigKey
+import org.apache.kafka.common.errors.{ApiException, 
InvalidConfigurationException, InvalidRequestException}
 import org.apache.kafka.common.internals.Topic
 import 
org.apache.kafka.common.message.DescribeConfigsRequestData.DescribeConfigsResource
 import org.apache.kafka.common.message.DescribeConfigsResponseData
 import org.apache.kafka.common.protocol.Errors
 import org.apache.kafka.common.requests.{ApiError, DescribeConfigsResponse}
 import org.apache.kafka.common.requests.DescribeConfigsResponse.ConfigSource
 
-import scala.collection.{Map, mutable}
+import scala.collection.{Map, mutable, Seq}
 import scala.jdk.CollectionConverters._
 
 class ConfigHelper(metadataCache: MetadataCache, config: KafkaConfig, 
configRepository: ConfigRepository) extends Logging {
 
+  def getBrokerId(resource: ConfigResource) = {
+    if (resource.name == null || resource.name.isEmpty)
+      None
+    else {
+      Some(resourceNameToBrokerId(resource.name))
+    }
+  }
+
+  def getAndValidateBrokerId(resource: ConfigResource) = {
+    val id = getBrokerId(resource)
+    if (id.nonEmpty && (id.get != this.config.brokerId))
+      throw new InvalidRequestException(s"Unexpected broker id, expected 
${this.config.brokerId}, but received ${resource.name}")
+    id
+  }
+
+  def validateBrokerConfigs(resource: ConfigResource, 

Review comment:
       This method does the validation part of `alterBrokerConfig` from 
`ZkAdminManager` without persisting the configs in Zookeeper. This allows 
validation of dynamic configs on brokers before they are forwarded for both ZK 
and KRaft clusters. 
   
   The validation part of `alterBrokerConfig` is removed in this PR and 
`alterBrokerConfig` now only persists the configs. This is done because the 
request will only end up at the controller if the validation on the proxy 
broker succeeded, and all that is left to do at that point is to persist the 
configs.

##########
File path: core/src/main/scala/kafka/server/ZkAdminManager.scala
##########
@@ -531,24 +518,21 @@ class ZkAdminManager(val config: KafkaConfig,
         resource.`type` match {
           case ConfigResource.Type.TOPIC =>
             val configProps = 
adminZkClient.fetchEntityConfig(ConfigType.Topic, resource.name)
-            prepareIncrementalConfigs(alterConfigOps, configProps, 
LogConfig.configKeys)
+            configHelper.prepareIncrementalConfigs(alterConfigOps, 
configProps, LogConfig.configKeys)
             alterTopicConfigs(resource, validateOnly, configProps, 
configEntriesMap)
 
           case ConfigResource.Type.BROKER =>
-            val brokerId = getBrokerId(resource)
+            val brokerId = configHelper.getBrokerId(resource)
             val perBrokerConfig = brokerId.nonEmpty
 
             val persistentProps = if (perBrokerConfig) 
adminZkClient.fetchEntityConfig(ConfigType.Broker, brokerId.get.toString)
             else adminZkClient.fetchEntityConfig(ConfigType.Broker, 
ConfigEntityName.Default)
 
             val configProps = 
this.config.dynamicConfig.fromPersistentProps(persistentProps, perBrokerConfig)
-            prepareIncrementalConfigs(alterConfigOps, configProps, 
KafkaConfig.configKeys)
+            configHelper.prepareIncrementalConfigs(alterConfigOps, 
configProps, KafkaConfig.configKeys)
             alterBrokerConfigs(resource, validateOnly, configProps, 
configEntriesMap)
 
           case ConfigResource.Type.BROKER_LOGGER =>
-            getBrokerId(resource)
-            validateLogLevelConfigs(alterConfigOps)

Review comment:
       The Zk Controller node will be the only one calling the method 
`incrementalAlterConfigs` since this is only called if the request was 
forwarded. This validation step is being removed since it is being done on the 
brokers.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: jira-unsubscr...@kafka.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


Reply via email to