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

dsmiley 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 aed1c3ef79a SOLR-18126 Benchmark, refactor: MiniClusterState -> 
SolrBenchState (#4196)
aed1c3ef79a is described below

commit aed1c3ef79add890c8be8e1652582ef494dc7045
Author: David Smiley <[email protected]>
AuthorDate: Tue Mar 17 20:21:12 2026 -0400

    SOLR-18126 Benchmark, refactor: MiniClusterState -> SolrBenchState (#4196)
    
    Renames bench/MiniClusterState.java to bench/SolrBenchState.java, and 
flattens its structure, which had an inner class. Two lifecycle methods 
containing "miniCluster" in the name were replaced with "solr" to be generic, 
and I improved javadocs slightly.
    
    This is a preparatory refactoring step on a short journey to solr/benchmark 
supporting multiple backends (not just MiniSolrCloudCluster).
    
    Co-authored-by: Claude Opus 4.6 <[email protected]>
---
 .../org/apache/solr/bench/MiniClusterState.java    | 587 ---------------------
 .../java/org/apache/solr/bench/SolrBenchState.java | 580 ++++++++++++++++++++
 .../org/apache/solr/bench/index/CloudIndexing.java |  16 +-
 .../search/ExitableDirectoryReaderSearch.java      |  33 +-
 .../org/apache/solr/bench/search/FilterCache.java  |  34 +-
 .../org/apache/solr/bench/search/JsonFaceting.java |  25 +-
 .../apache/solr/bench/search/NumericSearch.java    |  76 +--
 .../solr/bench/search/QueryResponseWriters.java    |  20 +-
 .../org/apache/solr/bench/search/SimpleSearch.java |  22 +-
 .../apache/solr/bench/search/StreamingSearch.java  |  20 +-
 ...BenchStateTest.java => SolrBenchStateTest.java} |  26 +-
 11 files changed, 696 insertions(+), 743 deletions(-)

diff --git 
a/solr/benchmark/src/java/org/apache/solr/bench/MiniClusterState.java 
b/solr/benchmark/src/java/org/apache/solr/bench/MiniClusterState.java
deleted file mode 100755
index 4c4946a3ae8..00000000000
--- a/solr/benchmark/src/java/org/apache/solr/bench/MiniClusterState.java
+++ /dev/null
@@ -1,587 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.solr.bench;
-
-import static org.apache.commons.io.file.PathUtils.deleteDirectory;
-import static org.apache.solr.bench.BaseBenchState.log;
-
-import com.codahale.metrics.Meter;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.PrintStream;
-import java.lang.management.ManagementFactory;
-import java.net.URL;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.FileSystems;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.SplittableRandom;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.jetty.HttpJettySolrClient;
-import org.apache.solr.client.solrj.request.CollectionAdminRequest;
-import org.apache.solr.client.solrj.request.QueryRequest;
-import org.apache.solr.client.solrj.request.SolrQuery;
-import org.apache.solr.client.solrj.request.UpdateRequest;
-import org.apache.solr.cloud.MiniSolrCloudCluster;
-import org.apache.solr.common.SolrInputDocument;
-import org.apache.solr.common.params.ModifiableSolrParams;
-import org.apache.solr.common.util.IOUtils;
-import org.apache.solr.common.util.NamedList;
-import org.apache.solr.common.util.SolrNamedThreadFactory;
-import org.apache.solr.common.util.SuppressForbidden;
-import org.apache.solr.embedded.JettySolrRunner;
-import org.apache.solr.util.SolrTestNonSecureRandomProvider;
-import org.openjdk.jmh.annotations.Level;
-import org.openjdk.jmh.annotations.Scope;
-import org.openjdk.jmh.annotations.Setup;
-import org.openjdk.jmh.annotations.State;
-import org.openjdk.jmh.annotations.TearDown;
-import org.openjdk.jmh.infra.BenchmarkParams;
-import org.openjdk.jmh.infra.Control;
-
-/** The base class for Solr JMH benchmarks that operate against a {@code 
MiniSolrCloudCluster}. */
-public class MiniClusterState {
-
-  /** The constant PROC_COUNT. */
-  public static final int PROC_COUNT =
-      ManagementFactory.getOperatingSystemMXBean().getAvailableProcessors();
-
-  /** The type Mini cluster bench state. */
-  @State(Scope.Benchmark)
-  public static class MiniClusterBenchState {
-
-    /** The Metrics enabled. */
-    boolean metricsEnabled = true;
-
-    /** The Nodes. */
-    public List<String> nodes;
-
-    public String zkHost;
-
-    /** The Cluster. */
-    MiniSolrCloudCluster cluster;
-
-    /** The Client. */
-    public HttpJettySolrClient client;
-
-    /** The Run cnt. */
-    int runCnt = 0;
-
-    /** The Create collection and index. */
-    boolean createCollectionAndIndex = true;
-
-    /** The Delete mini cluster. */
-    boolean deleteMiniCluster = true;
-
-    /** Unless overridden we ensure SecureRandoms do not block. */
-    boolean doNotWeakenSecureRandom = 
Boolean.getBoolean("doNotWeakenSecureRandom");
-
-    /** The Mini cluster base dir. */
-    Path miniClusterBaseDir;
-
-    /** To Allow cluster reuse. */
-    boolean allowClusterReuse = false;
-
-    /** The Is warmup. */
-    boolean isWarmup;
-
-    private SplittableRandom random;
-    private String workDir;
-
-    private boolean useHttp1 = Boolean.getBoolean("solr.http1");
-
-    /**
-     * Tear down.
-     *
-     * @param benchmarkParams the benchmark params
-     * @throws Exception the exception
-     */
-    @TearDown(Level.Iteration)
-    public void tearDown(BenchmarkParams benchmarkParams) throws Exception {
-
-      // dump Solr metrics
-      Path metricsResults =
-          Path.of(
-              workDir,
-              "metrics-results",
-              benchmarkParams.id(),
-              String.valueOf(runCnt++),
-              benchmarkParams.getBenchmark() + ".txt");
-      Files.createDirectories(metricsResults.getParent());
-
-      cluster.dumpMetrics(metricsResults.getParent(), 
metricsResults.getFileName().toString());
-    }
-
-    /**
-     * Check warm up.
-     *
-     * @param control the control
-     * @throws Exception the exception
-     */
-    @Setup(Level.Iteration)
-    public void checkWarmUp(Control control) throws Exception {
-      isWarmup = control.stopMeasurement;
-    }
-
-    /**
-     * Shutdown mini cluster.
-     *
-     * @param benchmarkParams the benchmark params
-     * @throws Exception the exception
-     */
-    @TearDown(Level.Trial)
-    public void shutdownMiniCluster(BenchmarkParams benchmarkParams, 
BaseBenchState baseBenchState)
-        throws Exception {
-      BaseBenchState.dumpHeap(benchmarkParams);
-
-      IOUtils.closeQuietly(client);
-      cluster.shutdown();
-      logClusterDirectorySize();
-    }
-
-    private void logClusterDirectorySize() throws IOException {
-      log("");
-      Files.list(miniClusterBaseDir.toAbsolutePath())
-          .forEach(
-              (node) -> {
-                try {
-                  long clusterSize =
-                      Files.walk(node)
-                          .filter(Files::isRegularFile)
-                          .mapToLong(
-                              file -> {
-                                try {
-                                  return Files.size(file);
-                                } catch (IOException e) {
-                                  throw new RuntimeException(e);
-                                }
-                              })
-                          .sum();
-                  log("mini cluster node size (bytes) " + node + " " + 
clusterSize);
-                } catch (IOException e) {
-                  throw new RuntimeException(e);
-                }
-              });
-    }
-
-    /**
-     * Do setup.
-     *
-     * @param benchmarkParams the benchmark params
-     * @param baseBenchState the base bench state
-     * @throws Exception the exception
-     */
-    @Setup(Level.Trial)
-    public void doSetup(BenchmarkParams benchmarkParams, BaseBenchState 
baseBenchState)
-        throws Exception {
-
-      if (!doNotWeakenSecureRandom) {
-        // remove all blocking from all secure randoms
-        SolrTestNonSecureRandomProvider.injectProvider();
-      }
-
-      workDir = System.getProperty("workBaseDir", "build/work");
-
-      Path currentRelativePath = Path.of("");
-      String s = currentRelativePath.toAbsolutePath().toString();
-      log("current relative path is: " + s);
-      log("work path is: " + workDir);
-
-      System.setProperty("doNotWaitForMergesOnIWClose", "true");
-
-      System.setProperty("pkiHandlerPrivateKeyPath", "");
-      System.setProperty("pkiHandlerPublicKeyPath", "");
-
-      System.setProperty("solr.configset.default.confdir", 
"../server/solr/configsets/_default");
-
-      this.random = new SplittableRandom(BaseBenchState.getRandomSeed());
-
-      // not currently usable, but would enable JettySolrRunner's 
ill-conceived jetty.testMode and
-      // allow using SSL
-
-      // System.getProperty("jetty.testMode", "true");
-      // SolrCloudTestCase.sslConfig = SolrTestCaseJ4.buildSSLConfig();
-
-      String baseDirSysProp = System.getProperty("miniClusterBaseDir");
-      if (baseDirSysProp != null) {
-        deleteMiniCluster = false;
-        miniClusterBaseDir = Path.of(baseDirSysProp);
-        if (Files.exists(miniClusterBaseDir)) {
-          createCollectionAndIndex = false;
-          allowClusterReuse = true;
-        }
-      } else {
-        miniClusterBaseDir = Path.of(workDir, "mini-cluster");
-      }
-
-      System.setProperty("metricsEnabled", String.valueOf(metricsEnabled));
-    }
-
-    /**
-     * Metrics enabled.
-     *
-     * @param metricsEnabled the metrics enabled
-     */
-    public void metricsEnabled(boolean metricsEnabled) {
-      this.metricsEnabled = metricsEnabled;
-    }
-
-    /**
-     * Start mini cluster.
-     *
-     * @param nodeCount the node count
-     */
-    public void startMiniCluster(int nodeCount) {
-      log("starting mini cluster at base directory: " + 
miniClusterBaseDir.toAbsolutePath());
-
-      if (!allowClusterReuse && Files.exists(miniClusterBaseDir)) {
-        log("mini cluster base directory exists, removing ...");
-        try {
-          deleteDirectory(miniClusterBaseDir);
-        } catch (IOException e) {
-          throw new RuntimeException(e);
-        }
-        createCollectionAndIndex = true;
-      } else if (Files.exists(miniClusterBaseDir)) {
-        createCollectionAndIndex = false;
-        deleteMiniCluster = false;
-      }
-
-      try {
-        cluster =
-            new MiniSolrCloudCluster.Builder(nodeCount, miniClusterBaseDir)
-                .formatZkServer(false)
-                .addConfig("conf", 
getFile("src/resources/configs/cloud-minimal/conf"))
-                .configure();
-      } catch (Exception e) {
-        if (Files.exists(miniClusterBaseDir)) {
-          try {
-            deleteDirectory(miniClusterBaseDir);
-          } catch (IOException ex) {
-            e.addSuppressed(ex);
-          }
-        }
-        throw new RuntimeException(e);
-      }
-
-      nodes = new ArrayList<>(nodeCount);
-      List<JettySolrRunner> jetties = cluster.getJettySolrRunners();
-      for (JettySolrRunner runner : jetties) {
-        nodes.add(runner.getBaseUrl().toString());
-      }
-      zkHost = cluster.getZkServer().getZkAddress();
-
-      client = new 
HttpJettySolrClient.Builder(nodes.get(0)).useHttp1_1(useHttp1).build();
-
-      log("done starting mini cluster");
-      log("");
-    }
-
-    /**
-     * Gets random.
-     *
-     * @return the random
-     */
-    public SplittableRandom getRandom() {
-      return random;
-    }
-
-    /**
-     * Create collection.
-     *
-     * @param collection the collection
-     * @param numShards the num shards
-     * @param numReplicas the num replicas
-     * @throws Exception the exception
-     */
-    public void createCollection(String collection, int numShards, int 
numReplicas)
-        throws Exception {
-      if (createCollectionAndIndex) {
-        try {
-
-          CollectionAdminRequest.Create request =
-              CollectionAdminRequest.createCollection(collection, "conf", 
numShards, numReplicas);
-          client.requestWithBaseUrl(
-              nodes.get(random.nextInt(cluster.getJettySolrRunners().size())), 
request, null);
-
-          cluster.waitForActiveCollection(
-              collection, 15, TimeUnit.SECONDS, numShards, numShards * 
numReplicas);
-        } catch (Exception e) {
-          if (Files.exists(miniClusterBaseDir)) {
-            deleteDirectory(miniClusterBaseDir);
-          }
-          throw e;
-        }
-      }
-    }
-
-    /** Setting useHttp1 to true will make the {@link #client} use http1 */
-    public void setUseHttp1(boolean useHttp1) {
-      if (client != null) {
-        throw new IllegalStateException(
-            "You can only change this setting before starting the Mini 
Cluster");
-      }
-      this.useHttp1 = useHttp1;
-    }
-
-    @SuppressForbidden(reason = "This module does not need to deal with 
logging context")
-    public void index(String collection, Docs docs, int docCount) throws 
Exception {
-      index(collection, docs, docCount, true);
-    }
-
-    /**
-     * Index.
-     *
-     * @param collection the collection
-     * @param docs the docs
-     * @param docCount the doc count
-     * @throws Exception the exception
-     */
-    public void index(String collection, Docs docs, int docCount, boolean 
parallel)
-        throws Exception {
-      if (createCollectionAndIndex) {
-        log("indexing data for benchmark...");
-        if (parallel) {
-          indexParallel(collection, docs, docCount);
-        } else {
-          indexBatch(collection, docs, docCount, 10000);
-        }
-        log("done indexing data for benchmark");
-
-        log("committing data ...");
-        UpdateRequest commitRequest = new UpdateRequest();
-        final var url = 
nodes.get(random.nextInt(cluster.getJettySolrRunners().size()));
-        commitRequest.setAction(UpdateRequest.ACTION.COMMIT, false, true);
-        client.requestWithBaseUrl(url, commitRequest, collection);
-        log("done committing data");
-      } else {
-        cluster.waitForActiveCollection(collection, 15, TimeUnit.SECONDS);
-      }
-
-      QueryRequest queryRequest = new QueryRequest(new SolrQuery("q", "*:*", 
"rows", "1"));
-      final var url = 
nodes.get(random.nextInt(cluster.getJettySolrRunners().size()));
-      NamedList<Object> result = client.requestWithBaseUrl(url, queryRequest, 
collection);
-
-      log("sanity check of single row query result: " + result);
-      log("");
-
-      log("Dump Core Info");
-      dumpCoreInfo();
-    }
-
-    @SuppressForbidden(reason = "This module does not need to deal with 
logging context")
-    private void indexParallel(String collection, Docs docs, int docCount)
-        throws InterruptedException {
-      Meter meter = new Meter();
-      ExecutorService executorService =
-          Executors.newFixedThreadPool(
-              Runtime.getRuntime().availableProcessors(),
-              new SolrNamedThreadFactory("SolrJMH Indexer"));
-      ScheduledExecutorService scheduledExecutor =
-          Executors.newSingleThreadScheduledExecutor(
-              new SolrNamedThreadFactory("SolrJMH Indexer Progress"));
-      scheduledExecutor.scheduleAtFixedRate(
-          () -> {
-            if (meter.getCount() == docCount) {
-              scheduledExecutor.shutdown();
-            } else {
-              log(meter.getCount() + " docs at " + meter.getMeanRate() + " 
doc/s");
-            }
-          },
-          10,
-          10,
-          TimeUnit.SECONDS);
-      for (int i = 0; i < docCount; i++) {
-        executorService.execute(
-            new Runnable() {
-              final SplittableRandom threadRandom = random.split();
-
-              @Override
-              public void run() {
-                UpdateRequest updateRequest = new UpdateRequest();
-                final var url =
-                    
nodes.get(threadRandom.nextInt(cluster.getJettySolrRunners().size()));
-                SolrInputDocument doc = docs.inputDocument();
-                // log("add doc " + doc);
-                updateRequest.add(doc);
-                meter.mark();
-
-                try {
-                  client.requestWithBaseUrl(url, updateRequest, collection);
-                } catch (Exception e) {
-                  throw new RuntimeException(e);
-                }
-              }
-            });
-      }
-
-      log("done adding docs, waiting for executor to terminate...");
-
-      executorService.shutdown();
-      boolean result = false;
-      while (!result) {
-        result = executorService.awaitTermination(600, TimeUnit.MINUTES);
-      }
-
-      scheduledExecutor.shutdown();
-    }
-
-    private void indexBatch(String collection, Docs docs, int docCount, int 
batchSize)
-        throws SolrServerException, IOException {
-      Meter meter = new Meter();
-      List<SolrInputDocument> batch = new ArrayList<>(batchSize);
-      for (int i = 1; i <= docCount; i++) {
-        batch.add(docs.inputDocument());
-        if (i % batchSize == 0) {
-          UpdateRequest updateRequest = new UpdateRequest();
-          updateRequest.add(batch);
-          client.requestWithBaseUrl(nodes.get(0), updateRequest, collection);
-          meter.mark(batch.size());
-          batch.clear();
-          log(meter.getCount() + " docs at " + (long) meter.getMeanRate() + " 
doc/s");
-        }
-      }
-      if (!batch.isEmpty()) {
-        UpdateRequest updateRequest = new UpdateRequest();
-        updateRequest.add(batch);
-        client.requestWithBaseUrl(nodes.get(0), updateRequest, collection);
-        meter.mark(batch.size());
-        batch = null;
-      }
-      log(meter.getCount() + " docs at " + (long) meter.getMeanRate() + " 
doc/s");
-    }
-
-    /**
-     * Wait for merges.
-     *
-     * @param collection the collection
-     * @throws Exception the exception
-     */
-    public void waitForMerges(String collection) throws Exception {
-      forceMerge(collection, Integer.MAX_VALUE);
-    }
-
-    /**
-     * Force merge.
-     *
-     * @param collection the collection
-     * @param maxMergeSegments the max merge segments
-     * @throws Exception the exception
-     */
-    public void forceMerge(String collection, int maxMergeSegments) throws 
Exception {
-      if (createCollectionAndIndex) {
-        // we control segment count for a more informative benchmark *and* 
because background
-        // merging would continue after
-        // indexing and overlap with the benchmark
-        if (maxMergeSegments == Integer.MAX_VALUE) {
-          log("waiting for merges to finish...\n");
-        } else {
-          log("merging segments to " + maxMergeSegments + " segments ...\n");
-        }
-
-        UpdateRequest optimizeRequest = new UpdateRequest();
-        final var url = 
nodes.get(random.nextInt(cluster.getJettySolrRunners().size()));
-        optimizeRequest.setAction(UpdateRequest.ACTION.OPTIMIZE, false, true, 
maxMergeSegments);
-        client.requestWithBaseUrl(url, optimizeRequest, collection);
-      }
-    }
-
-    /**
-     * Dump core info.
-     *
-     * @throws IOException the io exception
-     */
-    @SuppressForbidden(reason = "JMH uses std out for user output")
-    public void dumpCoreInfo() throws IOException {
-      cluster.dumpCoreInfo(
-          !BaseBenchState.QUIET_LOG
-              ? System.out
-              : new PrintStream(OutputStream.nullOutputStream(), false, 
StandardCharsets.UTF_8));
-    }
-  }
-
-  /**
-   * Params modifiable solr params.
-   *
-   * @param moreParams the more params
-   * @return the modifiable solr params
-   */
-  public static ModifiableSolrParams params(String... moreParams) {
-    ModifiableSolrParams params = new ModifiableSolrParams();
-    for (int i = 0; i < moreParams.length; i += 2) {
-      params.add(moreParams[i], moreParams[i + 1]);
-    }
-    return params;
-  }
-
-  /**
-   * Params modifiable solr params.
-   *
-   * @param params the params
-   * @param moreParams the more params
-   * @return the modifiable solr params
-   */
-  public static ModifiableSolrParams params(ModifiableSolrParams params, 
String... moreParams) {
-    for (int i = 0; i < moreParams.length; i += 2) {
-      params.add(moreParams[i], moreParams[i + 1]);
-    }
-    return params;
-  }
-
-  /**
-   * Gets file.
-   *
-   * @param name the name
-   * @return the file
-   */
-  public static Path getFile(String name) {
-    final URL url =
-        MiniClusterState.class
-            .getClassLoader()
-            .getResource(name.replace(FileSystems.getDefault().getSeparator(), 
"/"));
-    if (url != null) {
-      try {
-        return Path.of(url.toURI());
-      } catch (Exception e) {
-        throw new RuntimeException(
-            "Resource was found on classpath, but cannot be resolved to a "
-                + "normal file (maybe it is part of a JAR file): "
-                + name);
-      }
-    }
-    Path file = Path.of(name);
-    if (Files.exists(file)) {
-      return file;
-    } else {
-      file = Path.of("../../../", name);
-      if (Files.exists(file)) {
-        return file;
-      }
-    }
-    throw new RuntimeException(
-        "Cannot find resource in classpath or in file-system (relative to 
CWD): "
-            + name
-            + " CWD="
-            + Path.of("").toAbsolutePath());
-  }
-}
diff --git a/solr/benchmark/src/java/org/apache/solr/bench/SolrBenchState.java 
b/solr/benchmark/src/java/org/apache/solr/bench/SolrBenchState.java
new file mode 100755
index 00000000000..1aade6389dd
--- /dev/null
+++ b/solr/benchmark/src/java/org/apache/solr/bench/SolrBenchState.java
@@ -0,0 +1,580 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.solr.bench;
+
+import static org.apache.commons.io.file.PathUtils.deleteDirectory;
+import static org.apache.solr.bench.BaseBenchState.log;
+
+import com.codahale.metrics.Meter;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.lang.management.ManagementFactory;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.SplittableRandom;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.client.solrj.jetty.HttpJettySolrClient;
+import org.apache.solr.client.solrj.request.CollectionAdminRequest;
+import org.apache.solr.client.solrj.request.QueryRequest;
+import org.apache.solr.client.solrj.request.SolrQuery;
+import org.apache.solr.client.solrj.request.UpdateRequest;
+import org.apache.solr.cloud.MiniSolrCloudCluster;
+import org.apache.solr.common.SolrInputDocument;
+import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.solr.common.util.IOUtils;
+import org.apache.solr.common.util.NamedList;
+import org.apache.solr.common.util.SolrNamedThreadFactory;
+import org.apache.solr.common.util.SuppressForbidden;
+import org.apache.solr.embedded.JettySolrRunner;
+import org.apache.solr.util.SolrTestNonSecureRandomProvider;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.TearDown;
+import org.openjdk.jmh.infra.BenchmarkParams;
+import org.openjdk.jmh.infra.Control;
+
+/** JMH {@link State} class for Solr benchmarks. This is the benchmark's 
facade to Solr. */
+@State(Scope.Benchmark)
+public class SolrBenchState {
+
+  /** The constant PROC_COUNT. */
+  public static final int PROC_COUNT =
+      ManagementFactory.getOperatingSystemMXBean().getAvailableProcessors();
+
+  /** The Metrics enabled. */
+  boolean metricsEnabled = true;
+
+  /** The Nodes. */
+  public List<String> nodes;
+
+  public String zkHost;
+
+  /** The Cluster. */
+  MiniSolrCloudCluster cluster;
+
+  /** The Client. */
+  public HttpJettySolrClient client;
+
+  /** The Run cnt. */
+  int runCnt = 0;
+
+  /** The Create collection and index. */
+  boolean createCollectionAndIndex = true;
+
+  /** The Delete mini cluster. */
+  boolean deleteMiniCluster = true;
+
+  /** Unless overridden we ensure SecureRandoms do not block. */
+  boolean doNotWeakenSecureRandom = 
Boolean.getBoolean("doNotWeakenSecureRandom");
+
+  /** The Mini cluster base dir. */
+  Path miniClusterBaseDir;
+
+  /** To Allow cluster reuse. */
+  boolean allowClusterReuse = false;
+
+  /** The Is warmup. */
+  boolean isWarmup;
+
+  private SplittableRandom random;
+  private String workDir;
+
+  private boolean useHttp1 = Boolean.getBoolean("solr.http1");
+
+  /**
+   * Tear down.
+   *
+   * @param benchmarkParams the benchmark params
+   * @throws Exception the exception
+   */
+  @TearDown(Level.Iteration)
+  public void tearDown(BenchmarkParams benchmarkParams) throws Exception {
+
+    // dump Solr metrics
+    Path metricsResults =
+        Path.of(
+            workDir,
+            "metrics-results",
+            benchmarkParams.id(),
+            String.valueOf(runCnt++),
+            benchmarkParams.getBenchmark() + ".txt");
+    Files.createDirectories(metricsResults.getParent());
+
+    cluster.dumpMetrics(metricsResults.getParent(), 
metricsResults.getFileName().toString());
+  }
+
+  /**
+   * Check warm up.
+   *
+   * @param control the control
+   * @throws Exception the exception
+   */
+  @Setup(Level.Iteration)
+  public void checkWarmUp(Control control) throws Exception {
+    isWarmup = control.stopMeasurement;
+  }
+
+  /**
+   * Shutdown Solr.
+   *
+   * @param benchmarkParams the benchmark params
+   * @throws Exception the exception
+   */
+  @TearDown(Level.Trial)
+  public void shutdownSolr(BenchmarkParams benchmarkParams, BaseBenchState 
baseBenchState)
+      throws Exception {
+    BaseBenchState.dumpHeap(benchmarkParams);
+
+    IOUtils.closeQuietly(client);
+    cluster.shutdown();
+    logClusterDirectorySize();
+  }
+
+  private void logClusterDirectorySize() throws IOException {
+    log("");
+    Files.list(miniClusterBaseDir.toAbsolutePath())
+        .forEach(
+            (node) -> {
+              try {
+                long clusterSize =
+                    Files.walk(node)
+                        .filter(Files::isRegularFile)
+                        .mapToLong(
+                            file -> {
+                              try {
+                                return Files.size(file);
+                              } catch (IOException e) {
+                                throw new RuntimeException(e);
+                              }
+                            })
+                        .sum();
+                log("mini cluster node size (bytes) " + node + " " + 
clusterSize);
+              } catch (IOException e) {
+                throw new RuntimeException(e);
+              }
+            });
+  }
+
+  /**
+   * Do setup.
+   *
+   * @param benchmarkParams the benchmark params
+   * @param baseBenchState the base bench state
+   * @throws Exception the exception
+   */
+  @Setup(Level.Trial)
+  public void doSetup(BenchmarkParams benchmarkParams, BaseBenchState 
baseBenchState)
+      throws Exception {
+
+    if (!doNotWeakenSecureRandom) {
+      // remove all blocking from all secure randoms
+      SolrTestNonSecureRandomProvider.injectProvider();
+    }
+
+    workDir = System.getProperty("workBaseDir", "build/work");
+
+    Path currentRelativePath = Path.of("");
+    String s = currentRelativePath.toAbsolutePath().toString();
+    log("current relative path is: " + s);
+    log("work path is: " + workDir);
+
+    System.setProperty("doNotWaitForMergesOnIWClose", "true");
+
+    System.setProperty("pkiHandlerPrivateKeyPath", "");
+    System.setProperty("pkiHandlerPublicKeyPath", "");
+
+    System.setProperty("solr.configset.default.confdir", 
"../server/solr/configsets/_default");
+
+    this.random = new SplittableRandom(BaseBenchState.getRandomSeed());
+
+    // not currently usable, but would enable JettySolrRunner's ill-conceived 
jetty.testMode and
+    // allow using SSL
+
+    // System.getProperty("jetty.testMode", "true");
+    // SolrCloudTestCase.sslConfig = SolrTestCaseJ4.buildSSLConfig();
+
+    String baseDirSysProp = System.getProperty("miniClusterBaseDir");
+    if (baseDirSysProp != null) {
+      deleteMiniCluster = false;
+      miniClusterBaseDir = Path.of(baseDirSysProp);
+      if (Files.exists(miniClusterBaseDir)) {
+        createCollectionAndIndex = false;
+        allowClusterReuse = true;
+      }
+    } else {
+      miniClusterBaseDir = Path.of(workDir, "mini-cluster");
+    }
+
+    System.setProperty("metricsEnabled", String.valueOf(metricsEnabled));
+  }
+
+  /**
+   * Metrics enabled.
+   *
+   * @param metricsEnabled the metrics enabled
+   */
+  public void metricsEnabled(boolean metricsEnabled) {
+    this.metricsEnabled = metricsEnabled;
+  }
+
+  /**
+   * Start Solr.
+   *
+   * @param nodeCount the node count
+   */
+  public void startSolr(int nodeCount) {
+    log("starting mini cluster at base directory: " + 
miniClusterBaseDir.toAbsolutePath());
+
+    if (!allowClusterReuse && Files.exists(miniClusterBaseDir)) {
+      log("mini cluster base directory exists, removing ...");
+      try {
+        deleteDirectory(miniClusterBaseDir);
+      } catch (IOException e) {
+        throw new RuntimeException(e);
+      }
+      createCollectionAndIndex = true;
+    } else if (Files.exists(miniClusterBaseDir)) {
+      createCollectionAndIndex = false;
+      deleteMiniCluster = false;
+    }
+
+    try {
+      cluster =
+          new MiniSolrCloudCluster.Builder(nodeCount, miniClusterBaseDir)
+              .formatZkServer(false)
+              .addConfig("conf", 
getFile("src/resources/configs/cloud-minimal/conf"))
+              .configure();
+    } catch (Exception e) {
+      if (Files.exists(miniClusterBaseDir)) {
+        try {
+          deleteDirectory(miniClusterBaseDir);
+        } catch (IOException ex) {
+          e.addSuppressed(ex);
+        }
+      }
+      throw new RuntimeException(e);
+    }
+
+    nodes = new ArrayList<>(nodeCount);
+    List<JettySolrRunner> jetties = cluster.getJettySolrRunners();
+    for (JettySolrRunner runner : jetties) {
+      nodes.add(runner.getBaseUrl().toString());
+    }
+    zkHost = cluster.getZkServer().getZkAddress();
+
+    client = new 
HttpJettySolrClient.Builder(nodes.get(0)).useHttp1_1(useHttp1).build();
+
+    log("done starting mini cluster");
+    log("");
+  }
+
+  /**
+   * Gets random.
+   *
+   * @return the random
+   */
+  public SplittableRandom getRandom() {
+    return random;
+  }
+
+  /**
+   * Create collection.
+   *
+   * @param collection the collection
+   * @param numShards the num shards
+   * @param numReplicas the num replicas
+   * @throws Exception the exception
+   */
+  public void createCollection(String collection, int numShards, int 
numReplicas) throws Exception {
+    if (createCollectionAndIndex) {
+      try {
+
+        CollectionAdminRequest.Create request =
+            CollectionAdminRequest.createCollection(collection, "conf", 
numShards, numReplicas);
+        client.requestWithBaseUrl(
+            nodes.get(random.nextInt(cluster.getJettySolrRunners().size())), 
request, null);
+
+        cluster.waitForActiveCollection(
+            collection, 15, TimeUnit.SECONDS, numShards, numShards * 
numReplicas);
+      } catch (Exception e) {
+        if (Files.exists(miniClusterBaseDir)) {
+          deleteDirectory(miniClusterBaseDir);
+        }
+        throw e;
+      }
+    }
+  }
+
+  /** Setting useHttp1 to true will make the {@link #client} use http1 */
+  public void setUseHttp1(boolean useHttp1) {
+    if (client != null) {
+      throw new IllegalStateException(
+          "You can only change this setting before starting the Mini Cluster");
+    }
+    this.useHttp1 = useHttp1;
+  }
+
+  @SuppressForbidden(reason = "This module does not need to deal with logging 
context")
+  public void index(String collection, Docs docs, int docCount) throws 
Exception {
+    index(collection, docs, docCount, true);
+  }
+
+  /**
+   * Index.
+   *
+   * @param collection the collection
+   * @param docs the docs
+   * @param docCount the doc count
+   * @throws Exception the exception
+   */
+  public void index(String collection, Docs docs, int docCount, boolean 
parallel) throws Exception {
+    if (createCollectionAndIndex) {
+      log("indexing data for benchmark...");
+      if (parallel) {
+        indexParallel(collection, docs, docCount);
+      } else {
+        indexBatch(collection, docs, docCount, 10000);
+      }
+      log("done indexing data for benchmark");
+
+      log("committing data ...");
+      UpdateRequest commitRequest = new UpdateRequest();
+      final var url = 
nodes.get(random.nextInt(cluster.getJettySolrRunners().size()));
+      commitRequest.setAction(UpdateRequest.ACTION.COMMIT, false, true);
+      client.requestWithBaseUrl(url, commitRequest, collection);
+      log("done committing data");
+    } else {
+      cluster.waitForActiveCollection(collection, 15, TimeUnit.SECONDS);
+    }
+
+    QueryRequest queryRequest = new QueryRequest(new SolrQuery("q", "*:*", 
"rows", "1"));
+    final var url = 
nodes.get(random.nextInt(cluster.getJettySolrRunners().size()));
+    NamedList<Object> result = client.requestWithBaseUrl(url, queryRequest, 
collection);
+
+    log("sanity check of single row query result: " + result);
+    log("");
+
+    log("Dump Core Info");
+    dumpCoreInfo();
+  }
+
+  @SuppressForbidden(reason = "This module does not need to deal with logging 
context")
+  private void indexParallel(String collection, Docs docs, int docCount)
+      throws InterruptedException {
+    Meter meter = new Meter();
+    ExecutorService executorService =
+        Executors.newFixedThreadPool(
+            Runtime.getRuntime().availableProcessors(),
+            new SolrNamedThreadFactory("SolrJMH Indexer"));
+    ScheduledExecutorService scheduledExecutor =
+        Executors.newSingleThreadScheduledExecutor(
+            new SolrNamedThreadFactory("SolrJMH Indexer Progress"));
+    scheduledExecutor.scheduleAtFixedRate(
+        () -> {
+          if (meter.getCount() == docCount) {
+            scheduledExecutor.shutdown();
+          } else {
+            log(meter.getCount() + " docs at " + meter.getMeanRate() + " 
doc/s");
+          }
+        },
+        10,
+        10,
+        TimeUnit.SECONDS);
+    for (int i = 0; i < docCount; i++) {
+      executorService.execute(
+          new Runnable() {
+            final SplittableRandom threadRandom = random.split();
+
+            @Override
+            public void run() {
+              UpdateRequest updateRequest = new UpdateRequest();
+              final var url = 
nodes.get(threadRandom.nextInt(cluster.getJettySolrRunners().size()));
+              SolrInputDocument doc = docs.inputDocument();
+              // log("add doc " + doc);
+              updateRequest.add(doc);
+              meter.mark();
+
+              try {
+                client.requestWithBaseUrl(url, updateRequest, collection);
+              } catch (Exception e) {
+                throw new RuntimeException(e);
+              }
+            }
+          });
+    }
+
+    log("done adding docs, waiting for executor to terminate...");
+
+    executorService.shutdown();
+    boolean result = false;
+    while (!result) {
+      result = executorService.awaitTermination(600, TimeUnit.MINUTES);
+    }
+
+    scheduledExecutor.shutdown();
+  }
+
+  private void indexBatch(String collection, Docs docs, int docCount, int 
batchSize)
+      throws SolrServerException, IOException {
+    Meter meter = new Meter();
+    List<SolrInputDocument> batch = new ArrayList<>(batchSize);
+    for (int i = 1; i <= docCount; i++) {
+      batch.add(docs.inputDocument());
+      if (i % batchSize == 0) {
+        UpdateRequest updateRequest = new UpdateRequest();
+        updateRequest.add(batch);
+        client.requestWithBaseUrl(nodes.get(0), updateRequest, collection);
+        meter.mark(batch.size());
+        batch.clear();
+        log(meter.getCount() + " docs at " + (long) meter.getMeanRate() + " 
doc/s");
+      }
+    }
+    if (!batch.isEmpty()) {
+      UpdateRequest updateRequest = new UpdateRequest();
+      updateRequest.add(batch);
+      client.requestWithBaseUrl(nodes.get(0), updateRequest, collection);
+      meter.mark(batch.size());
+      batch = null;
+    }
+    log(meter.getCount() + " docs at " + (long) meter.getMeanRate() + " 
doc/s");
+  }
+
+  /**
+   * Wait for merges.
+   *
+   * @param collection the collection
+   * @throws Exception the exception
+   */
+  public void waitForMerges(String collection) throws Exception {
+    forceMerge(collection, Integer.MAX_VALUE);
+  }
+
+  /**
+   * Force merge.
+   *
+   * @param collection the collection
+   * @param maxMergeSegments the max merge segments
+   * @throws Exception the exception
+   */
+  public void forceMerge(String collection, int maxMergeSegments) throws 
Exception {
+    if (createCollectionAndIndex) {
+      // we control segment count for a more informative benchmark *and* 
because background
+      // merging would continue after
+      // indexing and overlap with the benchmark
+      if (maxMergeSegments == Integer.MAX_VALUE) {
+        log("waiting for merges to finish...\n");
+      } else {
+        log("merging segments to " + maxMergeSegments + " segments ...\n");
+      }
+
+      UpdateRequest optimizeRequest = new UpdateRequest();
+      final var url = 
nodes.get(random.nextInt(cluster.getJettySolrRunners().size()));
+      optimizeRequest.setAction(UpdateRequest.ACTION.OPTIMIZE, false, true, 
maxMergeSegments);
+      client.requestWithBaseUrl(url, optimizeRequest, collection);
+    }
+  }
+
+  /**
+   * Dump core info.
+   *
+   * @throws IOException the io exception
+   */
+  @SuppressForbidden(reason = "JMH uses std out for user output")
+  public void dumpCoreInfo() throws IOException {
+    cluster.dumpCoreInfo(
+        !BaseBenchState.QUIET_LOG
+            ? System.out
+            : new PrintStream(OutputStream.nullOutputStream(), false, 
StandardCharsets.UTF_8));
+  }
+
+  /**
+   * Params modifiable solr params.
+   *
+   * @param moreParams the more params
+   * @return the modifiable solr params
+   */
+  public static ModifiableSolrParams params(String... moreParams) {
+    ModifiableSolrParams params = new ModifiableSolrParams();
+    for (int i = 0; i < moreParams.length; i += 2) {
+      params.add(moreParams[i], moreParams[i + 1]);
+    }
+    return params;
+  }
+
+  /**
+   * Params modifiable solr params.
+   *
+   * @param params the params
+   * @param moreParams the more params
+   * @return the modifiable solr params
+   */
+  public static ModifiableSolrParams params(ModifiableSolrParams params, 
String... moreParams) {
+    for (int i = 0; i < moreParams.length; i += 2) {
+      params.add(moreParams[i], moreParams[i + 1]);
+    }
+    return params;
+  }
+
+  /**
+   * Gets file.
+   *
+   * @param name the name
+   * @return the file
+   */
+  public static Path getFile(String name) {
+    final URL url =
+        SolrBenchState.class
+            .getClassLoader()
+            .getResource(name.replace(FileSystems.getDefault().getSeparator(), 
"/"));
+    if (url != null) {
+      try {
+        return Path.of(url.toURI());
+      } catch (Exception e) {
+        throw new RuntimeException(
+            "Resource was found on classpath, but cannot be resolved to a "
+                + "normal file (maybe it is part of a JAR file): "
+                + name);
+      }
+    }
+    Path file = Path.of(name);
+    if (Files.exists(file)) {
+      return file;
+    } else {
+      file = Path.of("../../../", name);
+      if (Files.exists(file)) {
+        return file;
+      }
+    }
+    throw new RuntimeException(
+        "Cannot find resource in classpath or in file-system (relative to 
CWD): "
+            + name
+            + " CWD="
+            + Path.of("").toAbsolutePath());
+  }
+}
diff --git 
a/solr/benchmark/src/java/org/apache/solr/bench/index/CloudIndexing.java 
b/solr/benchmark/src/java/org/apache/solr/bench/index/CloudIndexing.java
index 5f6c6526690..770699d2a54 100755
--- a/solr/benchmark/src/java/org/apache/solr/bench/index/CloudIndexing.java
+++ b/solr/benchmark/src/java/org/apache/solr/bench/index/CloudIndexing.java
@@ -24,7 +24,7 @@ import static 
org.apache.solr.bench.generators.SourceDSL.strings;
 import java.util.Iterator;
 import java.util.concurrent.TimeUnit;
 import org.apache.solr.bench.Docs;
-import org.apache.solr.bench.MiniClusterState;
+import org.apache.solr.bench.SolrBenchState;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.common.SolrInputDocument;
 import org.openjdk.jmh.annotations.Benchmark;
@@ -114,22 +114,20 @@ public class CloudIndexing {
     }
 
     @Setup(Level.Trial)
-    public void doSetup(MiniClusterState.MiniClusterBenchState 
miniClusterState) throws Exception {
+    public void doSetup(SolrBenchState solrBenchState) throws Exception {
       preGenerate();
 
       System.setProperty("mergePolicyFactory", 
"org.apache.solr.index.NoMergePolicyFactory");
-      miniClusterState.startMiniCluster(nodeCount);
-      miniClusterState.createCollection(COLLECTION, numShards, numReplicas);
+      solrBenchState.startSolr(nodeCount);
+      solrBenchState.createCollection(COLLECTION, numShards, numReplicas);
     }
   }
 
   @Benchmark
-  public Object indexDoc(MiniClusterState.MiniClusterBenchState 
miniClusterState, BenchState state)
-      throws Exception {
+  public Object indexDoc(SolrBenchState solrBenchState, BenchState state) 
throws Exception {
     UpdateRequest updateRequest = new UpdateRequest();
     updateRequest.add(state.getNextDoc());
-    final var url =
-        
miniClusterState.nodes.get(miniClusterState.getRandom().nextInt(state.nodeCount));
-    return miniClusterState.client.requestWithBaseUrl(url, updateRequest, 
BenchState.COLLECTION);
+    final var url = 
solrBenchState.nodes.get(solrBenchState.getRandom().nextInt(state.nodeCount));
+    return solrBenchState.client.requestWithBaseUrl(url, updateRequest, 
BenchState.COLLECTION);
   }
 }
diff --git 
a/solr/benchmark/src/java/org/apache/solr/bench/search/ExitableDirectoryReaderSearch.java
 
b/solr/benchmark/src/java/org/apache/solr/bench/search/ExitableDirectoryReaderSearch.java
index 0b7b4a5ff5a..0365fe00410 100644
--- 
a/solr/benchmark/src/java/org/apache/solr/bench/search/ExitableDirectoryReaderSearch.java
+++ 
b/solr/benchmark/src/java/org/apache/solr/bench/search/ExitableDirectoryReaderSearch.java
@@ -24,7 +24,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import org.apache.solr.bench.Docs;
-import org.apache.solr.bench.MiniClusterState;
+import org.apache.solr.bench.SolrBenchState;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.response.QueryResponse;
@@ -67,9 +67,8 @@ public class ExitableDirectoryReaderSearch {
     int WORDS = NUM_DOCS / 100;
 
     @Setup(Level.Trial)
-    public void setupTrial(MiniClusterState.MiniClusterBenchState 
miniClusterState)
-        throws Exception {
-      miniClusterState.setUseHttp1(true);
+    public void setupTrial(SolrBenchState solrBenchState) throws Exception {
+      solrBenchState.setUseHttp1(true);
       System.setProperty("documentCache.enabled", "false");
       System.setProperty("queryResultCache.enabled", "false");
       System.setProperty("filterCache.enabled", "false");
@@ -78,9 +77,9 @@ public class ExitableDirectoryReaderSearch {
       System.setProperty("segmentsPerTier", "200");
       System.setProperty("maxBufferedDocs", "100");
 
-      miniClusterState.startMiniCluster(1);
+      solrBenchState.startSolr(1);
       log("######### Creating index ...");
-      miniClusterState.createCollection(COLLECTION, 1, 1);
+      solrBenchState.createCollection(COLLECTION, 1, 1);
       // create a lot of large-ish fields to scan positions
       Docs docs =
           Docs.docs(1234567890L)
@@ -103,9 +102,9 @@ public class ExitableDirectoryReaderSearch {
               .field(
                   "f9_ts",
                   
strings().alpha().maxCardinality(WORDS).multi(50).ofLengthBetween(3, 10));
-      miniClusterState.index(COLLECTION, docs, NUM_DOCS, true);
-      miniClusterState.forceMerge(COLLECTION, 200);
-      miniClusterState.dumpCoreInfo();
+      solrBenchState.index(COLLECTION, docs, NUM_DOCS, true);
+      solrBenchState.forceMerge(COLLECTION, 200);
+      solrBenchState.dumpCoreInfo();
     }
 
     // this adds significant processing time to the checking of query limits
@@ -116,13 +115,13 @@ public class ExitableDirectoryReaderSearch {
     private static final String matchExpression = "ExitableTermsEnum:-1";
 
     @Setup(Level.Iteration)
-    public void setupQueries(MiniClusterState.MiniClusterBenchState state) 
throws Exception {
+    public void setupQueries(SolrBenchState solrBenchState) throws Exception {
       if (verifyEDRInUse) {
         TestInjection.queryTimeout = new 
CallerSpecificQueryLimit(Set.of(matchExpression));
       }
       // reload collection to force searcher / reader refresh
       CollectionAdminRequest.Reload reload = 
CollectionAdminRequest.reloadCollection(COLLECTION);
-      state.client.request(reload);
+      solrBenchState.client.request(reload);
 
       queryFields =
           Docs.docs(1234567890L)
@@ -154,25 +153,23 @@ public class ExitableDirectoryReaderSearch {
 
   private static ModifiableSolrParams createInitialParams() {
     ModifiableSolrParams params =
-        MiniClusterState.params("rows", "100", "timeAllowed", "1000", "fl", 
"*");
+        SolrBenchState.params("rows", "100", "timeAllowed", "1000", "fl", "*");
     return params;
   }
 
   @Benchmark
-  public void testShortQuery(
-      MiniClusterState.MiniClusterBenchState miniClusterState, Blackhole bh, 
BenchState state)
+  public void testShortQuery(SolrBenchState solrBenchState, Blackhole bh, 
BenchState state)
       throws Exception {
     SolrInputDocument queryDoc = state.queryFields.inputDocument();
     ModifiableSolrParams params = createInitialParams();
     params.set("q", "f1_ts:" + queryDoc.getFieldValue("f1_ts").toString());
     QueryRequest queryRequest = new QueryRequest(params);
-    QueryResponse rsp = queryRequest.process(miniClusterState.client, 
COLLECTION);
+    QueryResponse rsp = queryRequest.process(solrBenchState.client, 
COLLECTION);
     bh.consume(rsp);
   }
 
   @Benchmark
-  public void testLongQuery(
-      MiniClusterState.MiniClusterBenchState miniClusterState, Blackhole bh, 
BenchState state)
+  public void testLongQuery(SolrBenchState solrBenchState, Blackhole bh, 
BenchState state)
       throws Exception {
     SolrInputDocument queryDoc = state.queryFields.inputDocument();
     ModifiableSolrParams params = createInitialParams();
@@ -186,7 +183,7 @@ public class ExitableDirectoryReaderSearch {
     }
     params.set("q", query.toString());
     QueryRequest queryRequest = new QueryRequest(params);
-    QueryResponse rsp = queryRequest.process(miniClusterState.client, 
COLLECTION);
+    QueryResponse rsp = queryRequest.process(solrBenchState.client, 
COLLECTION);
     bh.consume(rsp);
   }
 }
diff --git 
a/solr/benchmark/src/java/org/apache/solr/bench/search/FilterCache.java 
b/solr/benchmark/src/java/org/apache/solr/bench/search/FilterCache.java
index 197a346bb3d..f736aa4bf80 100644
--- a/solr/benchmark/src/java/org/apache/solr/bench/search/FilterCache.java
+++ b/solr/benchmark/src/java/org/apache/solr/bench/search/FilterCache.java
@@ -24,7 +24,7 @@ import java.net.URI;
 import java.nio.charset.StandardCharsets;
 import org.apache.solr.bench.BaseBenchState;
 import org.apache.solr.bench.Docs;
-import org.apache.solr.bench.MiniClusterState;
+import org.apache.solr.bench.SolrBenchState;
 import org.apache.solr.bench.SolrRandomnessSource;
 import org.apache.solr.bench.generators.SolrGen;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -71,8 +71,7 @@ public class FilterCache {
     String baseUrl;
 
     @Setup(Level.Trial)
-    public void setupTrial(MiniClusterState.MiniClusterBenchState 
miniClusterState)
-        throws Exception {
+    public void setupTrial(SolrBenchState solrBenchState) throws Exception {
       String cacheEnabled = cacheEnabledAsyncSize.split(":")[0];
       String asyncCache = cacheEnabledAsyncSize.split(":")[1];
       String cacheSize = cacheEnabledAsyncSize.split(":")[2];
@@ -81,8 +80,8 @@ public class FilterCache {
       System.setProperty("filterCache.initialSize", cacheSize);
       System.setProperty("filterCache.async", asyncCache);
 
-      miniClusterState.startMiniCluster(1);
-      miniClusterState.createCollection(COLLECTION, 1, 1);
+      solrBenchState.startSolr(1);
+      solrBenchState.createCollection(COLLECTION, 1, 1);
 
       Docs docs = Docs.docs().field("id", integers().incrementing());
 
@@ -100,24 +99,24 @@ public class FilterCache {
       docs.field("Ea_b", booleans);
       docs.field("FB_b", booleans);
 
-      miniClusterState.index(COLLECTION, docs, 30 * 1000);
-      baseUrl = miniClusterState.nodes.get(0);
+      solrBenchState.index(COLLECTION, docs, 30 * 1000);
+      baseUrl = solrBenchState.nodes.get(0);
     }
 
     @Setup(Level.Iteration)
-    public void setupIteration(MiniClusterState.MiniClusterBenchState 
miniClusterState)
+    public void setupIteration(SolrBenchState solrBenchState)
         throws SolrServerException, IOException {
       // Reload the collection/core to drop existing caches
       CollectionAdminRequest.Reload reload = 
CollectionAdminRequest.reloadCollection(COLLECTION);
-      
miniClusterState.client.requestWithBaseUrl(miniClusterState.nodes.get(0), 
reload, null);
+      solrBenchState.client.requestWithBaseUrl(solrBenchState.nodes.get(0), 
reload, null);
     }
 
     @TearDown(Level.Iteration)
-    public void dumpMetrics(MiniClusterState.MiniClusterBenchState 
miniClusterState) {
+    public void dumpMetrics(SolrBenchState solrBenchState) {
       // TODO add a verbose flag
 
       String url =
-          miniClusterState.nodes.get(0)
+          solrBenchState.nodes.get(0)
               + 
"/admin/metrics?prefix=CACHE.searcher.filterCache&omitHeader=true";
       HttpURLConnection conn = null;
       try {
@@ -134,20 +133,17 @@ public class FilterCache {
   }
 
   @Benchmark
-  public Object filterCacheMultipleQueries(
-      BenchState benchState, MiniClusterState.MiniClusterBenchState 
miniClusterState)
+  public Object filterCacheMultipleQueries(BenchState benchState, 
SolrBenchState solrBenchState)
       throws SolrServerException, IOException {
-    return miniClusterState.client.requestWithBaseUrl(
+    return solrBenchState.client.requestWithBaseUrl(
         benchState.baseUrl,
-        miniClusterState.getRandom().nextBoolean() ? benchState.q1 : 
benchState.q2,
+        solrBenchState.getRandom().nextBoolean() ? benchState.q1 : 
benchState.q2,
         COLLECTION);
   }
 
   @Benchmark
-  public Object filterCacheSingleQuery(
-      BenchState benchState, MiniClusterState.MiniClusterBenchState 
miniClusterState)
+  public Object filterCacheSingleQuery(BenchState benchState, SolrBenchState 
solrBenchState)
       throws SolrServerException, IOException {
-    return miniClusterState.client.requestWithBaseUrl(
-        benchState.baseUrl, benchState.q1, COLLECTION);
+    return solrBenchState.client.requestWithBaseUrl(benchState.baseUrl, 
benchState.q1, COLLECTION);
   }
 }
diff --git 
a/solr/benchmark/src/java/org/apache/solr/bench/search/JsonFaceting.java 
b/solr/benchmark/src/java/org/apache/solr/bench/search/JsonFaceting.java
index 9482f8a588b..7c1216b41b5 100755
--- a/solr/benchmark/src/java/org/apache/solr/bench/search/JsonFaceting.java
+++ b/solr/benchmark/src/java/org/apache/solr/bench/search/JsonFaceting.java
@@ -24,7 +24,7 @@ import java.util.SplittableRandom;
 import java.util.concurrent.TimeUnit;
 import org.apache.solr.bench.BaseBenchState;
 import org.apache.solr.bench.Docs;
-import org.apache.solr.bench.MiniClusterState;
+import org.apache.solr.bench.SolrBenchState;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.util.NamedList;
@@ -99,16 +99,15 @@ public class JsonFaceting {
     private ModifiableSolrParams params;
 
     @Setup(Level.Trial)
-    public void setup(
-        BenchmarkParams benchmarkParams, 
MiniClusterState.MiniClusterBenchState miniClusterState)
+    public void setup(BenchmarkParams benchmarkParams, SolrBenchState 
solrBenchState)
         throws Exception {
 
       System.setProperty("maxMergeAtOnce", "50");
       System.setProperty("segmentsPerTier", "50");
 
-      miniClusterState.startMiniCluster(nodeCount);
+      solrBenchState.startSolr(nodeCount);
 
-      miniClusterState.createCollection(collection, numShards, numReplicas);
+      solrBenchState.createCollection(collection, numShards, numReplicas);
 
       // Define random documents
       Docs docs =
@@ -132,12 +131,12 @@ public class JsonFaceting {
               .field(integers().allWithMaxCardinality(facetCard2))
               .field(integers().allWithMaxCardinality(facetCard2));
 
-      miniClusterState.index(collection, docs, docCount);
-      miniClusterState.forceMerge(collection, 25);
+      solrBenchState.index(collection, docs, docCount);
+      solrBenchState.forceMerge(collection, 25);
 
       params = new ModifiableSolrParams();
 
-      MiniClusterState.params(
+      SolrBenchState.params(
           params,
           "q",
           "*:*",
@@ -167,7 +166,7 @@ public class JsonFaceting {
         params.set("timeAllowed", "5000");
       }
 
-      // MiniClusterState.log("params: " + params + "\n");
+      // SolrBenchState.log("params: " + params + "\n");
     }
 
     @State(Scope.Thread)
@@ -185,17 +184,17 @@ public class JsonFaceting {
   @Benchmark
   @Timeout(time = 500, timeUnit = TimeUnit.SECONDS)
   public void jsonFacet(
-      MiniClusterState.MiniClusterBenchState miniClusterState,
+      SolrBenchState solrBenchState,
       BenchState state,
       BenchState.ThreadState threadState,
       Blackhole bh)
       throws Exception {
-    final var url = 
miniClusterState.nodes.get(threadState.random.nextInt(state.nodeCount));
+    final var url = 
solrBenchState.nodes.get(threadState.random.nextInt(state.nodeCount));
     QueryRequest queryRequest = new QueryRequest(state.params);
     NamedList<Object> result =
-        miniClusterState.client.requestWithBaseUrl(url, queryRequest, 
state.collection);
+        solrBenchState.client.requestWithBaseUrl(url, queryRequest, 
state.collection);
 
-    // MiniClusterState.log("result: " + result);
+    // SolrBenchState.log("result: " + result);
 
     bh.consume(result);
   }
diff --git 
a/solr/benchmark/src/java/org/apache/solr/bench/search/NumericSearch.java 
b/solr/benchmark/src/java/org/apache/solr/bench/search/NumericSearch.java
index e7f574cd341..70d307963a6 100644
--- a/solr/benchmark/src/java/org/apache/solr/bench/search/NumericSearch.java
+++ b/solr/benchmark/src/java/org/apache/solr/bench/search/NumericSearch.java
@@ -27,7 +27,7 @@ import java.util.Set;
 import java.util.stream.Collectors;
 import org.apache.solr.bench.CircularIterator;
 import org.apache.solr.bench.Docs;
-import org.apache.solr.bench.MiniClusterState;
+import org.apache.solr.bench.SolrBenchState;
 import org.apache.solr.bench.generators.SolrGen;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
@@ -68,11 +68,10 @@ public class NumericSearch {
     Iterator<String> queries;
 
     @Setup(Level.Trial)
-    public void setupTrial(MiniClusterState.MiniClusterBenchState 
miniClusterState)
-        throws Exception {
-      miniClusterState.setUseHttp1(true);
-      miniClusterState.startMiniCluster(1);
-      miniClusterState.createCollection(COLLECTION, 1, 1);
+    public void setupTrial(SolrBenchState solrBenchState) throws Exception {
+      solrBenchState.setUseHttp1(true);
+      solrBenchState.startSolr(1);
+      solrBenchState.createCollection(COLLECTION, 1, 1);
       int maxCardinality = 10000;
       int numDocs = 2000000;
       setValues = integers().allWithMaxCardinality(maxCardinality);
@@ -93,16 +92,15 @@ public class NumericSearch {
               .field("term_high_s", highCardinalityTerms);
       // .field("numbers_dt", setValues);
 
-      miniClusterState.index(COLLECTION, docs, numDocs, false);
-      basePath = miniClusterState.nodes.get(0);
+      solrBenchState.index(COLLECTION, docs, numDocs, false);
+      basePath = solrBenchState.nodes.get(0);
       SolrQuery q = new SolrQuery("*:*");
       q.setParam("facet", "true");
       q.setParam("rows", "0");
       q.setParam("facet.field", "numbers_i_dv", "term_low_s", "term_high_s");
       q.setParam("facet.limit", String.valueOf(maxCardinality));
       QueryRequest req = new QueryRequest(q);
-      QueryResponse response =
-          req.processWithBaseUrl(miniClusterState.client, basePath, 
COLLECTION);
+      QueryResponse response = req.processWithBaseUrl(solrBenchState.client, 
basePath, COLLECTION);
       Set<String> numbers =
           response.getFacetField("numbers_i_dv").getValues().stream()
               .map(FacetField.Count::getName)
@@ -140,11 +138,11 @@ public class NumericSearch {
     }
 
     @Setup(Level.Iteration)
-    public void setupIteration(MiniClusterState.MiniClusterBenchState 
miniClusterState)
+    public void setupIteration(SolrBenchState solrBenchState)
         throws SolrServerException, IOException {
       // Reload the collection/core to drop existing caches
       CollectionAdminRequest.Reload reload = 
CollectionAdminRequest.reloadCollection(COLLECTION);
-      
miniClusterState.client.requestWithBaseUrl(miniClusterState.nodes.get(0), 
reload, null);
+      solrBenchState.client.requestWithBaseUrl(solrBenchState.nodes.get(0), 
reload, null);
     }
 
     public QueryRequest intSetQuery(boolean dvs) {
@@ -176,97 +174,75 @@ public class NumericSearch {
   }
 
   @Benchmark
-  public Object intSet(
-      Blackhole blackhole,
-      BenchState benchState,
-      MiniClusterState.MiniClusterBenchState miniClusterState)
+  public Object intSet(Blackhole blackhole, BenchState benchState, 
SolrBenchState solrBenchState)
       throws SolrServerException, IOException {
     QueryResponse response =
-        benchState.intSetQuery(false).process(miniClusterState.client, 
COLLECTION);
+        benchState.intSetQuery(false).process(solrBenchState.client, 
COLLECTION);
     blackhole.consume(response);
     return response;
   }
 
   @Benchmark
-  public Object longSet(
-      Blackhole blackhole,
-      BenchState benchState,
-      MiniClusterState.MiniClusterBenchState miniClusterState)
+  public Object longSet(Blackhole blackhole, BenchState benchState, 
SolrBenchState solrBenchState)
       throws SolrServerException, IOException {
     QueryResponse response =
-        benchState.longSetQuery(false).process(miniClusterState.client, 
COLLECTION);
+        benchState.longSetQuery(false).process(solrBenchState.client, 
COLLECTION);
     blackhole.consume(response);
     return response;
   }
 
   @Benchmark
-  public Object floatSet(
-      Blackhole blackhole,
-      BenchState benchState,
-      MiniClusterState.MiniClusterBenchState miniClusterState)
+  public Object floatSet(Blackhole blackhole, BenchState benchState, 
SolrBenchState solrBenchState)
       throws SolrServerException, IOException {
     QueryResponse response =
-        benchState.floatSetQuery(false).process(miniClusterState.client, 
COLLECTION);
+        benchState.floatSetQuery(false).process(solrBenchState.client, 
COLLECTION);
     blackhole.consume(response);
     return response;
   }
 
   @Benchmark
-  public Object doubleSet(
-      Blackhole blackhole,
-      BenchState benchState,
-      MiniClusterState.MiniClusterBenchState miniClusterState)
+  public Object doubleSet(Blackhole blackhole, BenchState benchState, 
SolrBenchState solrBenchState)
       throws SolrServerException, IOException {
     QueryResponse response =
-        benchState.doubleSetQuery(false).process(miniClusterState.client, 
COLLECTION);
+        benchState.doubleSetQuery(false).process(solrBenchState.client, 
COLLECTION);
     blackhole.consume(response);
     return response;
   }
 
   @Benchmark
-  public Object intDvSet(
-      Blackhole blackhole,
-      BenchState benchState,
-      MiniClusterState.MiniClusterBenchState miniClusterState)
+  public Object intDvSet(Blackhole blackhole, BenchState benchState, 
SolrBenchState solrBenchState)
       throws SolrServerException, IOException {
     QueryResponse response =
-        benchState.intSetQuery(true).process(miniClusterState.client, 
COLLECTION);
+        benchState.intSetQuery(true).process(solrBenchState.client, 
COLLECTION);
     blackhole.consume(response);
     return response;
   }
 
   @Benchmark
-  public Object longDvSet(
-      Blackhole blackhole,
-      BenchState benchState,
-      MiniClusterState.MiniClusterBenchState miniClusterState)
+  public Object longDvSet(Blackhole blackhole, BenchState benchState, 
SolrBenchState solrBenchState)
       throws SolrServerException, IOException {
     QueryResponse response =
-        benchState.longSetQuery(true).process(miniClusterState.client, 
COLLECTION);
+        benchState.longSetQuery(true).process(solrBenchState.client, 
COLLECTION);
     blackhole.consume(response);
     return response;
   }
 
   @Benchmark
   public Object floatDvSet(
-      Blackhole blackhole,
-      BenchState benchState,
-      MiniClusterState.MiniClusterBenchState miniClusterState)
+      Blackhole blackhole, BenchState benchState, SolrBenchState 
solrBenchState)
       throws SolrServerException, IOException {
     QueryResponse response =
-        benchState.floatSetQuery(true).process(miniClusterState.client, 
COLLECTION);
+        benchState.floatSetQuery(true).process(solrBenchState.client, 
COLLECTION);
     blackhole.consume(response);
     return response;
   }
 
   @Benchmark
   public Object doubleDvSet(
-      Blackhole blackhole,
-      BenchState benchState,
-      MiniClusterState.MiniClusterBenchState miniClusterState)
+      Blackhole blackhole, BenchState benchState, SolrBenchState 
solrBenchState)
       throws SolrServerException, IOException {
     QueryResponse response =
-        benchState.doubleSetQuery(true).process(miniClusterState.client, 
COLLECTION);
+        benchState.doubleSetQuery(true).process(solrBenchState.client, 
COLLECTION);
     blackhole.consume(response);
     return response;
   }
diff --git 
a/solr/benchmark/src/java/org/apache/solr/bench/search/QueryResponseWriters.java
 
b/solr/benchmark/src/java/org/apache/solr/bench/search/QueryResponseWriters.java
index 4b6118fed27..6929d2810a5 100644
--- 
a/solr/benchmark/src/java/org/apache/solr/bench/search/QueryResponseWriters.java
+++ 
b/solr/benchmark/src/java/org/apache/solr/bench/search/QueryResponseWriters.java
@@ -23,8 +23,7 @@ import static 
org.apache.solr.bench.generators.SourceDSL.strings;
 
 import java.io.IOException;
 import org.apache.solr.bench.Docs;
-import org.apache.solr.bench.MiniClusterState;
-import org.apache.solr.bench.MiniClusterState.MiniClusterBenchState;
+import org.apache.solr.bench.SolrBenchState;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.response.InputStreamResponseParser;
@@ -64,10 +63,10 @@ public class QueryResponseWriters {
     private QueryRequest q;
 
     @Setup(Level.Trial)
-    public void setup(MiniClusterBenchState miniClusterState) throws Exception 
{
+    public void setup(SolrBenchState solrBenchState) throws Exception {
 
-      miniClusterState.startMiniCluster(1);
-      miniClusterState.createCollection(collection, 1, 1);
+      solrBenchState.startSolr(1);
+      solrBenchState.createCollection(collection, 1, 1);
 
       // only stored fields are needed to cover the response writers perf
       Docs docGen =
@@ -76,8 +75,8 @@ public class QueryResponseWriters {
               .field("text2_ts", 
strings().basicLatinAlphabet().multi(25).ofLengthBetween(30, 64))
               .field("bools_b", booleans().all())
               .field("int1_is", integers().all());
-      miniClusterState.index(collection, docGen, docs);
-      miniClusterState.forceMerge(collection, 5);
+      solrBenchState.index(collection, docGen, docs);
+      solrBenchState.forceMerge(collection, 5);
 
       ModifiableSolrParams params = new ModifiableSolrParams();
       params.set(CommonParams.Q, "*:*");
@@ -85,14 +84,13 @@ public class QueryResponseWriters {
       params.set(CommonParams.ROWS, docs);
       q = new QueryRequest(params);
       q.setResponseParser(new InputStreamResponseParser(wt));
-      String base = miniClusterState.nodes.get(0);
+      String base = solrBenchState.nodes.get(0);
     }
   }
 
   @Benchmark
-  public Object query(
-      BenchState benchState, MiniClusterState.MiniClusterBenchState 
miniClusterState)
+  public Object query(BenchState benchState, SolrBenchState solrBenchState)
       throws SolrServerException, IOException {
-    return miniClusterState.client.request(benchState.q, collection);
+    return solrBenchState.client.request(benchState.q, collection);
   }
 }
diff --git 
a/solr/benchmark/src/java/org/apache/solr/bench/search/SimpleSearch.java 
b/solr/benchmark/src/java/org/apache/solr/bench/search/SimpleSearch.java
index 2e888b8d878..9159b322197 100644
--- a/solr/benchmark/src/java/org/apache/solr/bench/search/SimpleSearch.java
+++ b/solr/benchmark/src/java/org/apache/solr/bench/search/SimpleSearch.java
@@ -19,7 +19,7 @@ package org.apache.solr.bench.search;
 import java.io.IOException;
 import java.util.concurrent.atomic.AtomicLong;
 import org.apache.solr.bench.BaseBenchState;
-import org.apache.solr.bench.MiniClusterState;
+import org.apache.solr.bench.SolrBenchState;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.QueryRequest;
@@ -60,19 +60,18 @@ public class SimpleSearch {
     QueryRequest q = new QueryRequest(new SolrQuery("q", "id:0")); // no match 
is OK
 
     @Setup(Level.Trial)
-    public void setupTrial(MiniClusterState.MiniClusterBenchState 
miniClusterState)
-        throws Exception {
-      miniClusterState.setUseHttp1(useHttp1);
-      miniClusterState.startMiniCluster(1);
-      miniClusterState.createCollection(COLLECTION, 1, 1);
+    public void setupTrial(SolrBenchState solrBenchState) throws Exception {
+      solrBenchState.setUseHttp1(useHttp1);
+      solrBenchState.startSolr(1);
+      solrBenchState.createCollection(COLLECTION, 1, 1);
     }
 
     @Setup(Level.Iteration)
-    public void setupIteration(MiniClusterState.MiniClusterBenchState 
miniClusterState)
+    public void setupIteration(SolrBenchState solrBenchState)
         throws SolrServerException, IOException {
       // Reload the collection/core to drop existing caches
       CollectionAdminRequest.Reload reload = 
CollectionAdminRequest.reloadCollection(COLLECTION);
-      miniClusterState.client.request(reload);
+      solrBenchState.client.request(reload);
 
       total = new AtomicLong();
       err = new AtomicLong();
@@ -140,16 +139,15 @@ public class SimpleSearch {
    * }</pre>
    */
   @Benchmark
-  public Object query(
-      BenchState benchState, MiniClusterState.MiniClusterBenchState 
miniClusterState, Blackhole bh)
+  public Object query(BenchState benchState, SolrBenchState solrBenchState, 
Blackhole bh)
       throws SolrServerException, IOException {
     if (benchState.strict) {
-      return miniClusterState.client.request(benchState.q, COLLECTION);
+      return solrBenchState.client.request(benchState.q, COLLECTION);
     }
 
     // non strict run ignores exceptions
     try {
-      return miniClusterState.client.request(benchState.q, COLLECTION);
+      return solrBenchState.client.request(benchState.q, COLLECTION);
     } catch (SolrServerException e) {
       bh.consume(e);
       benchState.err.getAndIncrement();
diff --git 
a/solr/benchmark/src/java/org/apache/solr/bench/search/StreamingSearch.java 
b/solr/benchmark/src/java/org/apache/solr/bench/search/StreamingSearch.java
index a9860763dbe..c354377eaf2 100644
--- a/solr/benchmark/src/java/org/apache/solr/bench/search/StreamingSearch.java
+++ b/solr/benchmark/src/java/org/apache/solr/bench/search/StreamingSearch.java
@@ -24,8 +24,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import org.apache.solr.bench.Docs;
-import org.apache.solr.bench.MiniClusterState;
-import org.apache.solr.bench.MiniClusterState.MiniClusterBenchState;
+import org.apache.solr.bench.SolrBenchState;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.io.SolrClientCache;
 import org.apache.solr.client.solrj.io.Tuple;
@@ -71,20 +70,20 @@ public class StreamingSearch {
     private HttpJettySolrClient httpJettySolrClient;
 
     @Setup(Level.Trial)
-    public void setup(MiniClusterBenchState miniClusterState) throws Exception 
{
+    public void setup(SolrBenchState solrBenchState) throws Exception {
 
-      miniClusterState.startMiniCluster(3);
-      miniClusterState.createCollection(collection, 3, 1);
+      solrBenchState.startSolr(3);
+      solrBenchState.createCollection(collection, 3, 1);
       Docs docGen =
           docs()
               .field("id", integers().incrementing())
               .field("text2_ts", 
strings().basicLatinAlphabet().multi(312).ofLengthBetween(30, 64))
               .field("text3_ts", 
strings().basicLatinAlphabet().multi(312).ofLengthBetween(30, 64))
               .field("int1_i_dv", integers().all());
-      miniClusterState.index(collection, docGen, docs);
-      miniClusterState.waitForMerges(collection);
+      solrBenchState.index(collection, docGen, docs);
+      solrBenchState.waitForMerges(collection);
 
-      zkHost = miniClusterState.zkHost;
+      zkHost = solrBenchState.zkHost;
 
       params = new ModifiableSolrParams();
       params.set(CommonParams.Q, "*:*");
@@ -94,7 +93,7 @@ public class StreamingSearch {
     }
 
     @Setup(Level.Iteration)
-    public void setupIteration(MiniClusterState.MiniClusterBenchState 
miniClusterState)
+    public void setupIteration(SolrBenchState solrBenchState)
         throws SolrServerException, IOException {
       SolrClientCache solrClientCache;
       // TODO tune params?
@@ -115,8 +114,7 @@ public class StreamingSearch {
   }
 
   @Benchmark
-  public Object stream(
-      BenchState benchState, MiniClusterState.MiniClusterBenchState 
miniClusterState)
+  public Object stream(BenchState benchState, SolrBenchState solrBenchState)
       throws SolrServerException, IOException {
     CloudSolrStream stream = new CloudSolrStream(benchState.zkHost, 
collection, benchState.params);
     stream.setStreamContext(benchState.streamContext);
diff --git 
a/solr/benchmark/src/test/org/apache/solr/bench/MiniClusterBenchStateTest.java 
b/solr/benchmark/src/test/org/apache/solr/bench/SolrBenchStateTest.java
similarity index 84%
rename from 
solr/benchmark/src/test/org/apache/solr/bench/MiniClusterBenchStateTest.java
rename to solr/benchmark/src/test/org/apache/solr/bench/SolrBenchStateTest.java
index 82708f6a34e..6aabc965720 100644
--- 
a/solr/benchmark/src/test/org/apache/solr/bench/MiniClusterBenchStateTest.java
+++ b/solr/benchmark/src/test/org/apache/solr/bench/SolrBenchStateTest.java
@@ -42,18 +42,18 @@ import org.openjdk.jmh.runner.WorkloadParams;
 import org.openjdk.jmh.runner.options.TimeValue;
 
 @ThreadLeakLingering(linger = 10)
-public class MiniClusterBenchStateTest extends SolrTestCaseJ4 {
-  private MiniClusterState.MiniClusterBenchState miniBenchState;
+public class SolrBenchStateTest extends SolrTestCaseJ4 {
+  private SolrBenchState solrBenchState;
   private BaseBenchState baseBenchState;
   private BenchmarkParams benchParams;
 
   @Test
-  public void testMiniClusterState() throws Exception {
+  public void test() throws Exception {
 
     System.setProperty("workBaseDir", createTempDir("work").toString());
     System.setProperty("random.counts", "true");
 
-    miniBenchState = new MiniClusterState.MiniClusterBenchState();
+    solrBenchState = new SolrBenchState();
     benchParams =
         new BenchmarkParams(
             "benchmark",
@@ -79,14 +79,14 @@ public class MiniClusterBenchStateTest extends 
SolrTestCaseJ4 {
             TimeValue.seconds(10));
     baseBenchState = new BaseBenchState();
     baseBenchState.doSetup(benchParams);
-    miniBenchState.doSetup(benchParams, baseBenchState);
+    solrBenchState.doSetup(benchParams, baseBenchState);
 
     int nodeCount = 3;
-    miniBenchState.startMiniCluster(nodeCount);
+    solrBenchState.startSolr(nodeCount);
     String collection = "collection1";
     int numShards = 1;
     int numReplicas = 1;
-    miniBenchState.createCollection(collection, numShards, numReplicas);
+    solrBenchState.createCollection(collection, numShards, numReplicas);
 
     Docs docs =
         docs()
@@ -110,13 +110,13 @@ public class MiniClusterBenchStateTest extends 
SolrTestCaseJ4 {
     int numDocs = 50;
     docs.preGenerate(numDocs);
 
-    miniBenchState.index(collection, docs, numDocs);
+    solrBenchState.index(collection, docs, numDocs);
 
-    miniBenchState.forceMerge(collection, 15);
+    solrBenchState.forceMerge(collection, 15);
 
-    ModifiableSolrParams params = MiniClusterState.params("q", "*:*");
+    ModifiableSolrParams params = SolrBenchState.params("q", "*:*");
     QueryRequest queryRequest = new QueryRequest(params);
-    QueryResponse result = queryRequest.process(miniBenchState.client, 
collection);
+    QueryResponse result = queryRequest.process(solrBenchState.client, 
collection);
 
     BaseBenchState.log("match all query result=" + result);
 
@@ -127,7 +127,7 @@ public class MiniClusterBenchStateTest extends 
SolrTestCaseJ4 {
   public void after() throws Exception {
     BaseBenchState.doTearDown(benchParams);
 
-    miniBenchState.tearDown(benchParams);
-    miniBenchState.shutdownMiniCluster(benchParams, baseBenchState);
+    solrBenchState.tearDown(benchParams);
+    solrBenchState.shutdownSolr(benchParams, baseBenchState);
   }
 }

Reply via email to