You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ma...@apache.org on 2020/07/14 19:28:47 UTC

[lucene-solr] branch reference_impl updated: #153 - Speed buff to ZkTestServer.

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

markrmiller pushed a commit to branch reference_impl
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git


The following commit(s) were added to refs/heads/reference_impl by this push:
     new 296701e  #153 - Speed buff to ZkTestServer.
296701e is described below

commit 296701e92f1ce7587f1713b075ae125a67bae4e6
Author: markrmiller@gmail.com <ma...@gmail.com>
AuthorDate: Tue Jul 14 14:24:10 2020 -0500

    #153 - Speed buff to ZkTestServer.
---
 .../org/apache/solr/core/SolrResourceLoader.java   |  2 +-
 .../apache/solr/servlet/SolrDispatchFilter.java    |  4 +++
 .../client/solrj/impl/ConnectionReuseTest.java     |  2 +-
 .../solr/cloud/NestedShardedAtomicUpdateTest.java  | 33 ++++++----------------
 .../apache/solr/cloud/SolrCloudBridgeTestCase.java |  8 ++++--
 .../src/test/org/apache/solr/cloud/ZkCLITest.java  |  2 +-
 .../org/apache/solr/cloud/ZkControllerTest.java    |  2 +-
 .../org/apache/solr/cloud/ZkSolrClientTest.java    |  2 +-
 .../solr/cloud/api/collections/AssignTest.java     |  4 +--
 .../apache/solr/common/cloud/ZkConfigManager.java  | 32 +++++++++++++--------
 .../apache/solr/common/cloud/ZkStateReader.java    |  3 +-
 .../apache/solr/cloud/MiniSolrCloudCluster.java    | 18 ++++++------
 .../org/apache/solr/cloud/SolrCloudTestCase.java   |  8 +++++-
 .../java/org/apache/solr/cloud/ZkTestServer.java   | 27 +++++++++---------
 14 files changed, 75 insertions(+), 72 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java b/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java
index 2ea0902..ac170ae 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java
@@ -187,7 +187,7 @@ public class SolrResourceLoader implements ResourceLoader, Closeable {
     this.sysIdResolver = new SystemIdResolver(this);
   }
 
-  public DocumentBuilder getDocumentBuilder() {
+  public synchronized DocumentBuilder getDocumentBuilder() {
     DocumentBuilder db = THREAD_LOCAL_DB.get();
     if (db == null) {
       try {
diff --git a/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java b/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
index ab5da16..2b95e28 100644
--- a/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
+++ b/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
@@ -307,6 +307,10 @@ public class SolrDispatchFilter extends BaseSolrFilter {
         log.info("Trying solr.xml in ZooKeeper...");
 
         byte[] data = zkClient.getData("/solr.xml", null, null, true);
+        if (data == null) {
+          log.error("Found solr.xml in ZooKeeper with no data in it");
+          throw new SolrException(ErrorCode.SERVER_ERROR, "Found solr.xml in ZooKeeper with no data in it");
+        }
         return SolrXmlConfig.fromInputStream(solrHome, new ByteArrayInputStream(data), nodeProperties, true);
       } catch (KeeperException.NoNodeException e) {
         // okay
diff --git a/solr/core/src/test/org/apache/solr/client/solrj/impl/ConnectionReuseTest.java b/solr/core/src/test/org/apache/solr/client/solrj/impl/ConnectionReuseTest.java
index 36981bf..4ed04d5 100644
--- a/solr/core/src/test/org/apache/solr/client/solrj/impl/ConnectionReuseTest.java
+++ b/solr/core/src/test/org/apache/solr/client/solrj/impl/ConnectionReuseTest.java
@@ -57,7 +57,7 @@ public class ConnectionReuseTest extends SolrCloudTestCase {
   @BeforeClass
   public static void setupCluster() throws Exception {
     TestInjection.failUpdateRequests = "true:100";
-    configureCluster(1)
+    configureCluster(1).formatZk(true)
         .addConfig("config", TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
         .configure();
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/NestedShardedAtomicUpdateTest.java b/solr/core/src/test/org/apache/solr/cloud/NestedShardedAtomicUpdateTest.java
index a0c4ce8..fa12bf2 100644
--- a/solr/core/src/test/org/apache/solr/cloud/NestedShardedAtomicUpdateTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/NestedShardedAtomicUpdateTest.java
@@ -30,43 +30,26 @@ import org.apache.solr.common.params.SolrParams;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-public class NestedShardedAtomicUpdateTest extends AbstractFullDistribZkTestBase {
+public class NestedShardedAtomicUpdateTest extends SolrCloudBridgeTestCase {
 
   @BeforeClass
   public static void beforeLeaderFailureAfterFreshStartTest() {
-    System.setProperty("solr.suppressDefaultConfigBootstrap", "false");
+
   }
 
   public NestedShardedAtomicUpdateTest() {
-    stress = 0;
+    solrconfigString = "solrconfig-tlog.xml";
     sliceCount = 4;
+    numJettys = 4;
     schemaString = "schema-nest.xml";
   }
 
-  @Override
-  protected String getCloudSolrConfig() {
-    return "solrconfig-tlog.xml";
-  }
-
-  @Override
-  protected String getCloudSchemaFile() {
-    return "schema-nest.xml";
-  }
-
   @Test
-  @ShardsFixed(num = 4)
+
   public void test() throws Exception {
-    boolean testFinished = false;
-    try {
-      sendWrongRouteParam();
-      doNestedInplaceUpdateTest();
-      doRootShardRoutingTest();
-      testFinished = true;
-    } finally {
-      if (!testFinished) {
-        printLayoutOnTearDown = true;
-      }
-    }
+    sendWrongRouteParam();
+    doNestedInplaceUpdateTest();
+    doRootShardRoutingTest();
   }
 
   public void doRootShardRoutingTest() throws Exception {
diff --git a/solr/core/src/test/org/apache/solr/cloud/SolrCloudBridgeTestCase.java b/solr/core/src/test/org/apache/solr/cloud/SolrCloudBridgeTestCase.java
index 0b217a2..8c25912 100644
--- a/solr/core/src/test/org/apache/solr/cloud/SolrCloudBridgeTestCase.java
+++ b/solr/core/src/test/org/apache/solr/cloud/SolrCloudBridgeTestCase.java
@@ -19,6 +19,7 @@ package org.apache.solr.cloud;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -126,6 +127,7 @@ public abstract class SolrCloudBridgeTestCase extends SolrCloudTestCase {
   protected volatile static MiniSolrCloudCluster controlCluster;
   protected volatile static String schemaString;
   protected volatile static String solrconfigString;
+  protected volatile static boolean formatZk = false;
 
   protected volatile static SortedMap<ServletHolder, String> extraServlets = Collections.emptySortedMap();
 
@@ -142,12 +144,12 @@ public abstract class SolrCloudBridgeTestCase extends SolrCloudTestCase {
     
     System.out.println("Make cluster with shard count:" + numJettys);
     
-    cluster = configureCluster(numJettys).withJettyConfig(jettyCfg -> jettyCfg.withServlets(extraServlets).enableProxy(enableProxy)).build();
+    cluster = configureCluster(numJettys).formatZk(formatZk).withJettyConfig(jettyCfg -> jettyCfg.withServlets(extraServlets).enableProxy(enableProxy)).build();
     
     SolrZkClient zkClient = cluster.getZkClient();
 
     if (!zkClient.exists("/configs/_default", true)) {
-      zkClient.uploadToZK(TEST_PATH().resolve("collection1").resolve("conf"), "configs" + "/" + "_default", filenameExclusions);
+      zkClient.uploadToZK(Paths.get(TEST_HOME()).resolve("collection1").resolve("conf"), "configs" + "/" + "_default", filenameExclusions);
     }
     
     zkClient.printLayoutToStream(System.out);
@@ -184,7 +186,7 @@ public abstract class SolrCloudBridgeTestCase extends SolrCloudTestCase {
     }
     
     if (createControl) {
-      controlCluster = configureCluster(1).build();
+      controlCluster = configureCluster(1).formatZk(formatZk).build();
       
       SolrZkClient zkClientControl = controlCluster.getZkClient();
       
diff --git a/solr/core/src/test/org/apache/solr/cloud/ZkCLITest.java b/solr/core/src/test/org/apache/solr/cloud/ZkCLITest.java
index be7a719..c8522ce 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ZkCLITest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ZkCLITest.java
@@ -90,7 +90,7 @@ public class ZkCLITest extends SolrTestCaseJ4 {
     zkDir = tmpDir.resolve("zookeeper/server1/data");
     log.info("ZooKeeper dataDir:{}", zkDir);
     zkServer = new ZkTestServer(zkDir);
-    zkServer.run();
+    zkServer.run(true);
     System.setProperty("zkHost", zkServer.getZkAddress());
     SolrZkClient zkClient = new SolrZkClient(zkServer.getZkHost(), AbstractZkTestCase.TIMEOUT);
     zkClient.makePath("/solr", false, true);
diff --git a/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java b/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java
index 53124e0..ec585ae 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java
@@ -96,7 +96,7 @@ public class ZkControllerTest extends SolrTestCaseJ4 {
 
     ZkTestServer server = new ZkTestServer(zkDir);
     try {
-      server.run();
+      server.run(true);
 
       try (SolrZkClient client = new SolrZkClient(server.getZkAddress(), TIMEOUT)) {
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/ZkSolrClientTest.java b/solr/core/src/test/org/apache/solr/cloud/ZkSolrClientTest.java
index 7987f45..454a7c3 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ZkSolrClientTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ZkSolrClientTest.java
@@ -54,7 +54,7 @@ public class ZkSolrClientTest extends SolrTestCaseJ4 {
     ZkConnection(boolean makeRoot) throws Exception {
       Path zkDir = createTempDir("zkData");
       server = new ZkTestServer(zkDir);
-      server.run();
+      server.run(true);
 
       zkClient = new SolrZkClient(server.getZkAddress(), AbstractZkTestCase.TIMEOUT);
     }
diff --git a/solr/core/src/test/org/apache/solr/cloud/api/collections/AssignTest.java b/solr/core/src/test/org/apache/solr/cloud/api/collections/AssignTest.java
index 8e6c405..02827f0 100644
--- a/solr/core/src/test/org/apache/solr/cloud/api/collections/AssignTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/api/collections/AssignTest.java
@@ -104,7 +104,7 @@ public class AssignTest extends SolrTestCaseJ4 {
     }
 
     try {
-      server.run();
+      server.run(true);
 
       try (SolrZkClient zkClient = new SolrZkClient(server.getZkAddress(), 10000)) {
         assertTrue(zkClient.isConnected());
@@ -141,7 +141,7 @@ public class AssignTest extends SolrTestCaseJ4 {
   public void testBuildCoreName() throws Exception {
     Path zkDir = createTempDir("zkData");
     ZkTestServer server = new ZkTestServer(zkDir);
-    server.run();
+    server.run(true);
     try (SolrZkClient zkClient = new SolrZkClient(server.getZkAddress(), 10000)) {
       // TODO: fix this to be independent of ZK
       ZkDistribStateManager stateManager = new ZkDistribStateManager(zkClient);
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkConfigManager.java b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkConfigManager.java
index bcbc37d..41bd446 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkConfigManager.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkConfigManager.java
@@ -45,12 +45,20 @@ public class ZkConfigManager {
   public static final Pattern UPLOAD_FILENAME_EXCLUDE_PATTERN = Pattern.compile(UPLOAD_FILENAME_EXCLUDE_REGEX);
 
   private final SolrZkClient zkClient;
-  
+  private final String root;
+
+  public ZkConfigManager(SolrZkClient zkClient) {
+    this(zkClient, "");
+  }
+
   /**
    * Creates a new ZkConfigManager
    * @param zkClient the {@link SolrZkClient} to use
    */
-  public ZkConfigManager(SolrZkClient zkClient) { this.zkClient = zkClient; }
+  public ZkConfigManager(SolrZkClient zkClient, String root) {
+    this.zkClient = zkClient;
+    this.root = root;
+  }
 
 
 
@@ -62,7 +70,7 @@ public class ZkConfigManager {
    *                    if an I/O error occurs or the path does not exist
    */
   public void uploadConfigDir(Path dir, String configName) throws IOException, KeeperException {
-    zkClient.uploadToZK(dir, CONFIGS_ZKNODE + "/" + configName, UPLOAD_FILENAME_EXCLUDE_PATTERN);
+    zkClient.uploadToZK(dir, root + CONFIGS_ZKNODE + "/" + configName, UPLOAD_FILENAME_EXCLUDE_PATTERN);
   }
 
   /**
@@ -75,7 +83,7 @@ public class ZkConfigManager {
    */
   public void uploadConfigDir(Path dir, String configName,
       Pattern filenameExclusions) throws IOException, KeeperException {
-    zkClient.uploadToZK(dir, CONFIGS_ZKNODE + "/" + configName, filenameExclusions);
+    zkClient.uploadToZK(dir, root + CONFIGS_ZKNODE + "/" + configName, filenameExclusions);
   }
 
   /**
@@ -86,12 +94,12 @@ public class ZkConfigManager {
    *                    if an I/O error occurs or the config does not exist
    */
   public void downloadConfigDir(String configName, Path dir) throws IOException {
-    zkClient.downloadFromZK(CONFIGS_ZKNODE + "/" + configName, dir);
+    zkClient.downloadFromZK(root + CONFIGS_ZKNODE + "/" + configName, dir);
   }
 
   public List<String> listConfigs() throws IOException {
     try {
-      return zkClient.getChildren(ZkConfigManager.CONFIGS_ZKNODE, null, true);
+      return zkClient.getChildren(root + ZkConfigManager.CONFIGS_ZKNODE, null, true);
     }
     catch (KeeperException.NoNodeException e) {
       return Collections.emptyList();
@@ -110,7 +118,7 @@ public class ZkConfigManager {
    */
   public Boolean configExists(String configName) throws IOException {
     try {
-      return zkClient.exists(ZkConfigManager.CONFIGS_ZKNODE + "/" + configName, true);
+      return zkClient.exists(root + ZkConfigManager.CONFIGS_ZKNODE + "/" + configName, true);
     } catch (KeeperException | InterruptedException e) {
       throw new IOException("Error checking whether config exists",
           SolrZkClient.checkInterrupted(e));
@@ -125,7 +133,7 @@ public class ZkConfigManager {
    */
   public void deleteConfigDir(String configName) throws IOException {
     try {
-      zkClient.clean(ZkConfigManager.CONFIGS_ZKNODE + "/" + configName);
+      zkClient.clean(root + ZkConfigManager.CONFIGS_ZKNODE + "/" + configName);
     } catch (KeeperException | InterruptedException e) {
       throw new IOException("Error checking whether config exists",
           SolrZkClient.checkInterrupted(e));
@@ -134,17 +142,17 @@ public class ZkConfigManager {
 
   private void copyConfigDirFromZk(String fromZkPath, String toZkPath, Set<String> copiedToZkPaths) throws IOException {
     try {
-      List<String> files = zkClient.getChildren(fromZkPath, null, true);
+      List<String> files = zkClient.getChildren(root + fromZkPath, null, true);
       for (String file : files) {
-        List<String> children = zkClient.getChildren(fromZkPath + "/" + file, null, true);
+        List<String> children = zkClient.getChildren(root + fromZkPath + "/" + file, null, true);
         if (children.size() == 0) {
           final String toZkFilePath = toZkPath + "/" + file;
           log.info("Copying zk node {}/{} to {}", fromZkPath, file, toZkFilePath);
-          byte[] data = zkClient.getData(fromZkPath + "/" + file, null, null, true);
+          byte[] data = zkClient.getData(root + fromZkPath + "/" + file, null, null, true);
           zkClient.makePath(toZkFilePath, data, true);
           if (copiedToZkPaths != null) copiedToZkPaths.add(toZkFilePath);
         } else {
-          copyConfigDirFromZk(fromZkPath + "/" + file, toZkPath + "/" + file, copiedToZkPaths);
+          copyConfigDirFromZk(root + fromZkPath + "/" + file, toZkPath + "/" + file, copiedToZkPaths);
         }
       }
     } catch (KeeperException | InterruptedException e) {
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java
index 811d87f..03e8146 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java
@@ -438,7 +438,8 @@ public class ZkStateReader implements SolrCloseable {
         try {
           boolean success = latch.await(10000, TimeUnit.MILLISECONDS);
           if (!success) {
-            log.warn("Timedout waiting to see {} node in zk", ZkStateReader.COLLECTIONS_ZKNODE);
+            zkClient.printLayout();
+            log.warn("Timed waiting to see {} node in zk", ZkStateReader.COLLECTIONS_ZKNODE);
           }
           log.info("Done waiting on latch");
         } catch (InterruptedException e) {
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/MiniSolrCloudCluster.java b/solr/test-framework/src/java/org/apache/solr/cloud/MiniSolrCloudCluster.java
index 260f337..12318f1 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/MiniSolrCloudCluster.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/MiniSolrCloudCluster.java
@@ -257,7 +257,7 @@ public class MiniSolrCloudCluster {
    MiniSolrCloudCluster(int numServers, Path baseDir, String solrXml, JettyConfig jettyConfig,
       ZkTestServer zkTestServer, Optional<String> securityJson) throws Exception {
      this(numServers, baseDir, solrXml, jettyConfig,
-         zkTestServer,securityJson, false);
+         zkTestServer,securityJson, false, false);
    }
   /**
    * Create a MiniSolrCloudCluster.
@@ -276,7 +276,7 @@ public class MiniSolrCloudCluster {
    * @throws Exception if there was an error starting the cluster
    */
    MiniSolrCloudCluster(int numServers, Path baseDir, String solrXml, JettyConfig jettyConfig,
-      ZkTestServer zkTestServer, Optional<String> securityJson, boolean trackJettyMetrics) throws Exception {
+      ZkTestServer zkTestServer, Optional<String> securityJson, boolean trackJettyMetrics, boolean formatZk) throws Exception {
     try {
       Objects.requireNonNull(securityJson);
       this.baseDir = Objects.requireNonNull(baseDir);
@@ -292,21 +292,21 @@ public class MiniSolrCloudCluster {
         Path zkDir = baseDir.resolve(ZOOKEEPER_SERVER1_DATA);
         this.zkServer = new ZkTestServer(zkDir);
 
-        this.zkServer.run();
+        this.zkServer.run(formatZk);
         SolrZkClient zkClient = this.zkServer.getZkClient();
         log.info("Using zkClient host={} to create solr.xml", zkClient.getZkServerAddress());
-        zkClient.mkDirs(SOLR_XML, solrXml.getBytes(Charset.defaultCharset()));
+        zkClient.mkDirs("/solr" + SOLR_XML, solrXml.getBytes(Charset.defaultCharset()));
 
         if (jettyConfig.sslConfig != null && jettyConfig.sslConfig.isSSLMode()) {
-          zkClient.mkDirs(ZkStateReader.CLUSTER_PROPS,
+          zkClient.mkDirs("/solr" + ZkStateReader.CLUSTER_PROPS,
                   URL_SCHEME_HTTPS.getBytes(StandardCharsets.UTF_8));
         }
         if (securityJson.isPresent()) { // configure Solr security
-          zkClient.makePath(SOLR_SECURITY_JSON, securityJson.get().getBytes(Charset.defaultCharset()), true);
+          zkClient.makePath("/solr" + SOLR_SECURITY_JSON, securityJson.get().getBytes(Charset.defaultCharset()), true);
         }
       } else {
         zkServer = zkTestServer;
-        this.zkServer.getZkClient().mkDirs(SOLR_XML, solrXml.getBytes(Charset.defaultCharset()));
+        this.zkServer.getZkClient().mkDirs("/solr" + SOLR_XML, solrXml.getBytes(Charset.defaultCharset()));
       }
 
       // tell solr to look in zookeeper for solr.xml
@@ -593,7 +593,7 @@ public class MiniSolrCloudCluster {
    */
   public void uploadConfigSet(Path configDir, String configName)
       throws IOException, KeeperException, InterruptedException {
-    ZkConfigManager manager = new ZkConfigManager(zkServer.getZkClient());
+    ZkConfigManager manager = new ZkConfigManager(zkServer.getZkClient(), "/solr");
     manager.uploadConfigDir(configDir, configName);
   }
 
@@ -672,7 +672,7 @@ public class MiniSolrCloudCluster {
   }
   
   protected CloudSolrClient buildSolrClient() {
-    return new Builder(zkServer.getZkClient())
+    return new Builder(Collections.singletonList(zkServer.getZkHost()), Optional.of("/solr"))
             .withSocketTimeout(Integer.getInteger("socketTimeout", Integer.getInteger("solr.test.socketTimeout.default", 30000))).withConnectionTimeout(Integer.getInteger("solr.connect_timeout.default", 15000)).build();
   }
 
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/SolrCloudTestCase.java b/solr/test-framework/src/java/org/apache/solr/cloud/SolrCloudTestCase.java
index 56aec7c..67f1fd0 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/SolrCloudTestCase.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/SolrCloudTestCase.java
@@ -123,6 +123,7 @@ public class SolrCloudTestCase extends SolrTestCaseJ4 {
     private Map<String, Object> clusterProperties = new HashMap<>();
 
     private boolean trackJettyMetrics;
+    private boolean formatZk;
 
     /**
      * Create a builder
@@ -216,6 +217,11 @@ public class SolrCloudTestCase extends SolrTestCaseJ4 {
       return this;
     }
 
+    public Builder formatZk(boolean formatZk) {
+      this.formatZk = formatZk;
+      return this;
+    }
+
     /**
      * Configure and run the {@link MiniSolrCloudCluster}
      *
@@ -233,7 +239,7 @@ public class SolrCloudTestCase extends SolrTestCaseJ4 {
     public MiniSolrCloudCluster build() throws Exception {
       JettyConfig jettyConfig = jettyConfigBuilder.withExecutor(qtp).build();
       MiniSolrCloudCluster cluster = new MiniSolrCloudCluster(nodeCount, baseDir, solrxml, jettyConfig,
-          null, securityJson, trackJettyMetrics);
+          null, securityJson, trackJettyMetrics, formatZk);
       CloudSolrClient client = cluster.getSolrClient();
       for (Config config : configs) {
         ((ZkClientClusterStateProvider)client.getClusterStateProvider()).uploadConfig(config.path, config.name);
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/ZkTestServer.java b/solr/test-framework/src/java/org/apache/solr/cloud/ZkTestServer.java
index 7f214e7..6959866 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/ZkTestServer.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/ZkTestServer.java
@@ -463,13 +463,12 @@ public class ZkTestServer implements Closeable {
 
 
 
-
+    chRootClient = new SolrZkClient(getZkHost(), AbstractZkTestCase.TIMEOUT, 30000);
     if (solrFormat) {
-     // tryCleanSolrZkNode();
       makeSolrZkNode();
     }
 
-    chRootClient = new SolrZkClient(getZkAddress(), AbstractZkTestCase.TIMEOUT, 30000);
+
   }
 
   public String getZkHost() {
@@ -544,7 +543,7 @@ public class ZkTestServer implements Closeable {
   }
 
   public void run() throws InterruptedException, IOException {
-    run(true);
+    run(false);
   }
 
   public void run(boolean solrFormat) throws InterruptedException, IOException {
@@ -623,7 +622,6 @@ public class ZkTestServer implements Closeable {
       throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e);
     } catch (InterruptedException e) {
       ParWork.propegateInterrupt(e);
-      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e);
     }
   }
 
@@ -631,20 +629,23 @@ public class ZkTestServer implements Closeable {
     log.info("Shutting down ZkTestServer.");
 
     try {
-      chRootClient.printLayout();
+      if (chRootClient != null) {
+        chRootClient.printLayout();
+      }
     } catch (Exception e) {
       log.warn("Exception trying to print zk layout to log on shutdown", e);
     }
-
-    writeZkMonitorFile();
+    if (chRootClient != null && zkServer != null) {
+      writeZkMonitorFile();
+    }
 
 
     try (ParWork worker = new ParWork(this, true)) {
       worker.add("zkClients", timer, chRootClient, () -> {
-        zkServer.shutdown();
+        if (zkServer != null) zkServer.shutdown();
         return zkServer;
       }, () -> {
-        zkServer.shutdown();
+        if (zkServer != null) zkServer.shutdown();
         return zkServer;
       });
     }
@@ -853,14 +854,12 @@ public class ZkTestServer implements Closeable {
   public void buildZooKeeper(File solrhome, String config, String schema) throws Exception {
     // this workaround is acceptable until we remove legacyCloud because we just init a single core here
     String defaultClusterProps = "{\"" + ZkStateReader.LEGACY_CLOUD + "\":\"false\"}";
-    chRootClient.makePath(ZkStateReader.CLUSTER_PROPS, defaultClusterProps.getBytes(StandardCharsets.UTF_8),
+    chRootClient.makePath("/solr" + ZkStateReader.CLUSTER_PROPS, defaultClusterProps.getBytes(StandardCharsets.UTF_8),
             CreateMode.PERSISTENT, true);
   }
 
   public void makeSolrZkNode() throws Exception {
-   try (SolrZkClient rootClient = new SolrZkClient(getZkHost(), TIMEOUT, 30000)) {
-     rootClient.mkDirs("/solr");
-   }
+     chRootClient.mkDirs("/solr");
   }
 
   public void tryCleanSolrZkNode(SolrZkClient zkClient) throws Exception {