This is an automated email from the ASF dual-hosted git repository.

epugh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/main by this push:
     new 16c1f81f958 Use makePath helper consistently across codebase when 
writing to Zookeeper (#4636)
16c1f81f958 is described below

commit 16c1f81f9588c0d85b15ee60b1355ef59b882874
Author: Eric Pugh <[email protected]>
AuthorDate: Sat Jul 18 07:25:23 2026 -0400

    Use makePath helper consistently across codebase when writing to Zookeeper 
(#4636)
---
 solr/core/src/java/org/apache/solr/cli/AuthTool.java      |  5 +++--
 .../solr/cloud/api/collections/OverseerRoleCmd.java       |  7 +------
 .../handler/designer/SchemaDesignerConfigSetHelper.java   |  2 ++
 .../org/apache/solr/packagemanager/RepositoryManager.java | 15 ++++-----------
 .../java/org/apache/solr/rest/ManagedResourceStorage.java |  9 ++-------
 .../org/apache/solr/schema/ManagedIndexSchemaFactory.java |  4 +---
 .../java/org/apache/solr/common/cloud/SolrZkClient.java   | 13 ++++++++++++-
 .../org/apache/solr/common/cloud/ZkMaintenanceUtils.java  |  6 +-----
 8 files changed, 26 insertions(+), 35 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/cli/AuthTool.java 
b/solr/core/src/java/org/apache/solr/cli/AuthTool.java
index 1e6a2985330..df0133cfead 100644
--- a/solr/core/src/java/org/apache/solr/cli/AuthTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/AuthTool.java
@@ -267,7 +267,8 @@ public class AuthTool extends ToolBase {
           if (!updateIncludeFileOnly) {
             echoIfVerbose("Uploading following security.json: " + 
securityJson);
             try (SolrZkClient zkClient = CLIUtils.getSolrZkClient(cli, 
zkHost)) {
-              zkClient.setData("/security.json", 
securityJson.getBytes(StandardCharsets.UTF_8));
+              zkClient.makePath(
+                  "/security.json", 
securityJson.getBytes(StandardCharsets.UTF_8), false);
             }
           }
 
@@ -368,7 +369,7 @@ public class AuthTool extends ToolBase {
       echoIfVerbose("Uploading following security.json: {}");
 
       try (SolrZkClient zkClient = CLIUtils.getSolrZkClient(cli, zkHost)) {
-        zkClient.setData("/security.json", 
"{}".getBytes(StandardCharsets.UTF_8));
+        zkClient.makePath("/security.json", 
"{}".getBytes(StandardCharsets.UTF_8), false);
       }
     }
   }
diff --git 
a/solr/core/src/java/org/apache/solr/cloud/api/collections/OverseerRoleCmd.java 
b/solr/core/src/java/org/apache/solr/cloud/api/collections/OverseerRoleCmd.java
index f33e317f998..f789455c0d6 100644
--- 
a/solr/core/src/java/org/apache/solr/cloud/api/collections/OverseerRoleCmd.java
+++ 
b/solr/core/src/java/org/apache/solr/cloud/api/collections/OverseerRoleCmd.java
@@ -33,7 +33,6 @@ import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.logging.DeprecationLog;
-import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.data.Stat;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -107,11 +106,7 @@ public class OverseerRoleCmd implements 
CollApiCmds.CollectionApiCommand {
       nodeList.remove(node);
     }
 
-    if (nodeExists) {
-      zkClient.setData(ZkStateReader.ROLES, Utils.toJSON(roles));
-    } else {
-      zkClient.create(ZkStateReader.ROLES, Utils.toJSON(roles), 
CreateMode.PERSISTENT);
-    }
+    zkClient.makePath(ZkStateReader.ROLES, Utils.toJSON(roles), false);
     runPrioritizer();
   }
 
diff --git 
a/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerConfigSetHelper.java
 
b/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerConfigSetHelper.java
index 907e0933acf..1af273cc9d0 100644
--- 
a/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerConfigSetHelper.java
+++ 
b/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerConfigSetHelper.java
@@ -918,6 +918,8 @@ class SchemaDesignerConfigSetHelper implements 
SchemaDesignerConstants {
       for (String path : langFilesToRestore) {
         String copyToPath = path.replace(origPathDir, replacePathDir);
         try {
+          // Only restore files that are missing -- do not overwrite an 
existing file with the
+          // copyFrom version.
           if (!zkClient.exists(copyToPath)) {
             zkClient.makePath(copyToPath, false);
             zkClient.setData(copyToPath, zkClient.getData(path, null, null));
diff --git 
a/solr/core/src/java/org/apache/solr/packagemanager/RepositoryManager.java 
b/solr/core/src/java/org/apache/solr/packagemanager/RepositoryManager.java
index 940bb536f16..29a86c75e0a 100644
--- a/solr/core/src/java/org/apache/solr/packagemanager/RepositoryManager.java
+++ b/solr/core/src/java/org/apache/solr/packagemanager/RepositoryManager.java
@@ -57,7 +57,6 @@ import org.apache.solr.packagemanager.SolrPackage.Artifact;
 import org.apache.solr.packagemanager.SolrPackage.SolrPackageRelease;
 import org.apache.solr.pkg.PackageAPI;
 import org.apache.solr.pkg.SolrPackageLoader;
-import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.KeeperException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -123,16 +122,10 @@ public class RepositoryManager {
     @SuppressWarnings({"unchecked"})
     List<PackageRepository> repos = 
getMapper().readValue(existingRepositoriesJson, List.class);
     repos.add(new DefaultPackageRepository(repoName, uri));
-    if (packageManager.zkClient.exists(PackageUtils.REPOSITORIES_ZK_PATH) == 
false) {
-      packageManager.zkClient.create(
-          PackageUtils.REPOSITORIES_ZK_PATH,
-          
getMapper().writeValueAsString(repos).getBytes(StandardCharsets.UTF_8),
-          CreateMode.PERSISTENT);
-    } else {
-      packageManager.zkClient.setData(
-          PackageUtils.REPOSITORIES_ZK_PATH,
-          
getMapper().writeValueAsString(repos).getBytes(StandardCharsets.UTF_8));
-    }
+    packageManager.zkClient.makePath(
+        PackageUtils.REPOSITORIES_ZK_PATH,
+        getMapper().writeValueAsString(repos).getBytes(StandardCharsets.UTF_8),
+        false);
 
     try (InputStream is = new URI(uri + 
"/publickey.der").toURL().openStream()) {
       addKey(is.readAllBytes(), repoName + ".der");
diff --git 
a/solr/core/src/java/org/apache/solr/rest/ManagedResourceStorage.java 
b/solr/core/src/java/org/apache/solr/rest/ManagedResourceStorage.java
index 54e6838902b..7bcf1af467a 100644
--- a/solr/core/src/java/org/apache/solr/rest/ManagedResourceStorage.java
+++ b/solr/core/src/java/org/apache/solr/rest/ManagedResourceStorage.java
@@ -308,13 +308,8 @@ public abstract class ManagedResourceStorage {
             public void close() {
               byte[] znodeData = toByteArray();
               try {
-                if (zkClient.exists(znodePath)) {
-                  zkClient.setData(znodePath, znodeData);
-                  log.info("Wrote {} bytes to existing znode {}", 
znodeData.length, znodePath);
-                } else {
-                  zkClient.makePath(znodePath, znodeData);
-                  log.info("Wrote {} bytes to new znode {}", znodeData.length, 
znodePath);
-                }
+                zkClient.makePath(znodePath, znodeData, false);
+                log.info("Wrote {} bytes to znode {}", znodeData.length, 
znodePath);
               } catch (Exception e) {
                 // have to throw a runtimer here as we're in close,
                 // which doesn't throw IOException
diff --git 
a/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchemaFactory.java 
b/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchemaFactory.java
index 83797b7c0f8..05f78633718 100644
--- a/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchemaFactory.java
+++ b/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchemaFactory.java
@@ -30,7 +30,6 @@ import org.apache.solr.cloud.ZkSolrResourceLoader;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.cloud.SolrZkClient;
-import org.apache.solr.common.cloud.ZkMaintenanceUtils;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.IOUtils;
 import org.apache.solr.common.util.NamedList;
@@ -487,8 +486,7 @@ public class ManagedIndexSchemaFactory extends 
IndexSchemaFactory implements Sol
           // First, copy the non-managed schema znode content to the upgraded 
schema znode
           byte[] bytes = 
zkController.getZkClient().getData(nonManagedSchemaPath, null, null);
           final String upgradedSchemaPath = nonManagedSchemaPath + 
UPGRADED_SCHEMA_EXTENSION;
-          ZkMaintenanceUtils.ensureExists(upgradedSchemaPath, 
zkController.getZkClient());
-          zkController.getZkClient().setData(upgradedSchemaPath, bytes);
+          zkController.getZkClient().makePath(upgradedSchemaPath, bytes, 
false);
           // Then delete the non-managed schema znode
           if (zkController.getZkClient().exists(nonManagedSchemaPath)) {
             try {
diff --git 
a/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/SolrZkClient.java 
b/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/SolrZkClient.java
index 164af46dc05..729beb65471 100644
--- 
a/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/SolrZkClient.java
+++ 
b/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/SolrZkClient.java
@@ -493,6 +493,13 @@ public class SolrZkClient implements Closeable {
     makePath(path, null, CreateMode.PERSISTENT, null, failOnExists, 0);
   }
 
+  /**
+   * Creates the path in ZooKeeper, creating each node as necessary.
+   *
+   * @param data to set on the last zkNode
+   * @param failOnExists if {@code true}, fail if the last zkNode already 
exists; if {@code false},
+   *     an existing zkNode's data is overwritten instead, making this a safe 
create-or-update
+   */
   public void makePath(String path, byte[] data, boolean failOnExists)
       throws KeeperException, InterruptedException {
     makePath(path, data, CreateMode.PERSISTENT, null, failOnExists, 0);
@@ -711,7 +718,11 @@ public class SolrZkClient implements Closeable {
     }
   }
 
-  /** Write data to ZooKeeper. */
+  /**
+   * Write data to ZooKeeper. The node at {@code path} must already exist; 
throws {@link
+   * NoNodeException} otherwise. Use {@link #makePath(String, byte[], boolean) 
makePath(path, data,
+   * false)} instead if the node may not exist yet.
+   */
   public Stat setData(String path, byte[] data) throws KeeperException, 
InterruptedException {
     return setData(path, data, -1);
   }
diff --git 
a/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/ZkMaintenanceUtils.java
 
b/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/ZkMaintenanceUtils.java
index 4efb0827413..7e3f7f80675 100644
--- 
a/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/ZkMaintenanceUtils.java
+++ 
b/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/ZkMaintenanceUtils.java
@@ -351,11 +351,7 @@ public class ZkMaintenanceUtils {
                 zkClient.setData(zkNode, file);
               } else if (file.equals(rootPath)) {
                 // We are only uploading a single file, preVisitDirectory was 
never called
-                if (zkClient.exists(zkPath)) {
-                  zkClient.setData(zkPath, file);
-                } else {
-                  zkClient.makePath(zkPath, Files.readAllBytes(file), false);
-                }
+                zkClient.makePath(zkPath, Files.readAllBytes(file), false);
               } else {
                 // Skip path parts here because they should have been created 
during
                 // preVisitDirectory

Reply via email to