mumrah commented on code in PR #15744:
URL: https://github.com/apache/kafka/pull/15744#discussion_r1572780325


##########
core/src/main/scala/kafka/zk/KafkaZkClient.scala:
##########
@@ -467,13 +470,33 @@ class KafkaZkClient private[zk] (zooKeeperClient: 
ZooKeeperClient, isSecure: Boo
    * @param rootEntityType entity type
    * @param sanitizedEntityName entity name
    * @throws KeeperException if there is an error while setting or creating 
the znode
+   * @throws ControllerMovedException if no controller is defined, or a KRaft 
controller is defined
    */
   def setOrCreateEntityConfigs(rootEntityType: String, sanitizedEntityName: 
String, config: Properties): Unit = {
+    val controllerRegistration = getControllerRegistration match {
+      case Some(registration) => registration
+      case None =>
+        // This case is mainly here to make tests less flaky. In practice, 
there will always be a /controller ZNode
+        throw new ControllerMovedException(s"Cannot set entity configs when 
there is no controller.")
+    }
+
+    // If there is a KRaft controller defined, don't even attempt this write. 
The broker will soon get a UMR
+    // from the new KRaft controller that lets it know about the new 
controller. It will then forward
+    // IncrementalAlterConfig requests instead of processing directly.
+    if (controllerRegistration.kraftEpoch.exists(epoch => epoch > 0)) {
+      throw new ControllerMovedException(s"Cannot set entity configs directly 
when there is a KRaft controller.")
+    }
 
     def set(configData: Array[Byte]): SetDataResponse = {
       val setDataRequest = 
SetDataRequest(ConfigEntityZNode.path(rootEntityType, sanitizedEntityName),
         configData, ZkVersion.MatchAnyVersion)
-      retryRequestUntilConnected(setDataRequest)
+      if (controllerRegistration.zkVersion > 0) {
+        // Pass the zkVersion previously captured to ensure the controller 
hasn't changed to KRaft while
+        // this method was processing.
+        retryRequestUntilConnected(setDataRequest, 
controllerRegistration.zkVersion)
+      } else {
+        retryRequestUntilConnected(setDataRequest)

Review Comment:
   This is essentially the same as the match None case above. In our 
integration tests, we can (and apparently do) set configs in ZK before the 
controller gets elected for the first time. This was kept to avoid breaking a 
bunch of tests.
   
   Historically, setting configs will never fail (last writer wins) so neither 
the client nor broker implement any retries.



-- 
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