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/08/20 13:14:46 UTC

[lucene-solr] branch reference_impl_dev updated (3808421 -> d910aad)

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

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


    from 3808421  @575 ShardTerms is off.
     new 59e2225  @576 Reduce logging.
     new 1f36dbc  @577 A little more efficient.
     new d910aad  @578 Optimizations.

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../client/solrj/embedded/JettySolrRunner.java     |  2 +-
 .../java/org/apache/solr/cloud/ZkController.java   |  2 +-
 .../java/org/apache/solr/cloud/ZkShardTerms.java   |  2 +-
 .../apache/solr/cloud/overseer/ZkStateWriter.java  |  6 +++-
 .../java/org/apache/solr/core/CoreContainer.java   |  9 ++---
 .../java/org/apache/solr/core/XmlConfigFile.java   | 11 +++---
 .../org/apache/solr/metrics/SolrMetricManager.java | 25 +++++++++----
 .../apache/solr/metrics/SolrMetricsContext.java    |  8 +++--
 .../apache/solr/response/TextResponseWriter.java   |  4 +--
 .../org/apache/solr/update/SolrCmdDistributor.java |  2 +-
 .../processor/DistributedUpdateProcessor.java      |  4 +--
 .../cloud/TestWaitForStateWithJettyShutdowns.java  |  6 ----
 .../src/java/org/apache/solr/common/ParWork.java   | 41 ++++++----------------
 .../apache/solr/common/cloud/ZkStateReader.java    |  2 +-
 .../org/apache/solr/common/util/FastWriter.java    |  5 +--
 .../apache/solr/common/util/SolrJSONWriter.java    |  4 +--
 .../solr/common/util/SolrQueuedThreadPool.java     | 41 ++++++++++------------
 .../src/java/org/apache/solr/SolrTestCase.java     | 11 +++---
 .../java/org/apache/solr/util/BaseTestHarness.java | 35 +++++++++---------
 .../src/java/org/apache/solr/util/TestHarness.java |  4 +--
 20 files changed, 110 insertions(+), 114 deletions(-)


[lucene-solr] 01/03: @576 Reduce logging.

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 59e222543668c7b3bba3e4422822dd3644a3938d
Author: markrmiller@gmail.com <ma...@gmail.com>
AuthorDate: Thu Aug 20 05:48:58 2020 -0500

    @576 Reduce logging.
---
 solr/core/src/java/org/apache/solr/cloud/ZkShardTerms.java            | 2 +-
 solr/core/src/java/org/apache/solr/update/SolrCmdDistributor.java     | 2 +-
 .../org/apache/solr/update/processor/DistributedUpdateProcessor.java  | 4 ++--
 solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java   | 2 +-
 4 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkShardTerms.java b/solr/core/src/java/org/apache/solr/cloud/ZkShardTerms.java
index 2ca43b2..5f3bfbf 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkShardTerms.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkShardTerms.java
@@ -115,7 +115,7 @@ public class ZkShardTerms implements AutoCloseable{
    * @param replicasNeedingRecovery set of replicas in which their terms should be lower than leader's term
    */
   public void ensureTermsIsHigher(String leader, Set<String> replicasNeedingRecovery) {
-    log.info("ensureTermsIsHigher leader={} replicasNeedingRecvoery={}", leader, replicasNeedingRecovery);
+    if (log.isDebugEnabled()) log.debug("ensureTermsIsHigher leader={} replicasNeedingRecvoery={}", leader, replicasNeedingRecovery);
     if (replicasNeedingRecovery.isEmpty()) return;
 
     ShardTerms newTerms;
diff --git a/solr/core/src/java/org/apache/solr/update/SolrCmdDistributor.java b/solr/core/src/java/org/apache/solr/update/SolrCmdDistributor.java
index 894cda1..287b218 100644
--- a/solr/core/src/java/org/apache/solr/update/SolrCmdDistributor.java
+++ b/solr/core/src/java/org/apache/solr/update/SolrCmdDistributor.java
@@ -258,7 +258,7 @@ public class SolrCmdDistributor implements Closeable {
 
         @Override
         public void onSuccess(NamedList result) {
-          log.info("Success for distrib update {}", result);
+          if (log.isDebugEnabled()) log.debug("Success for distrib update {}", result);
           arrive(req);
         }
 
diff --git a/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java b/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
index 77d6de6..73b5f61 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
@@ -237,7 +237,7 @@ public class DistributedUpdateProcessor extends UpdateRequestProcessor {
 
     if (dropCmd) {
       // TODO: do we need to add anything to the response?
-      log.info("Dropping update {}", cmd.getPrintableId());
+      if (log.isDebugEnabled()) log.debug("Dropping update {}", cmd.getPrintableId());
       return;
     }
 
@@ -537,7 +537,7 @@ public class DistributedUpdateProcessor extends UpdateRequestProcessor {
               Long lastVersion = vinfo.lookupVersion(cmd.getIndexedId());
               if (lastVersion != null && Math.abs(lastVersion) >= versionOnUpdate) {
                 // This update is a repeat, or was reordered. We need to drop this update.
-                log.info("Dropping add update due to version {}", idBytes.utf8ToString());
+                if (log.isDebugEnabled()) log.debug("Dropping add update due to version {}", idBytes.utf8ToString());
                 return true;
               }
             }
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 28d53e9..8002af9 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
@@ -1795,7 +1795,7 @@ public class ZkStateReader implements SolrCloseable {
    * @see #registerDocCollectionWatcher
    */
   public void removeDocCollectionWatcher(String collection, DocCollectionWatcher watcher) {
-    log.info("remove watcher for collection {}", collection);
+    if (log.isDebugEnabled()) log.debug("remove watcher for collection {}", collection);
     AtomicBoolean reconstructState = new AtomicBoolean(false);
     collectionWatches.compute(collection, (k, v) -> {
       if (v == null)


[lucene-solr] 02/03: @577 A little more efficient.

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 1f36dbc8936fb3a175ede70f56b16683836d9ec4
Author: markrmiller@gmail.com <ma...@gmail.com>
AuthorDate: Thu Aug 20 06:10:13 2020 -0500

    @577 A little more efficient.
---
 .../src/java/org/apache/solr/common/ParWork.java   | 37 +++++-----------------
 1 file changed, 8 insertions(+), 29 deletions(-)

diff --git a/solr/solrj/src/java/org/apache/solr/common/ParWork.java b/solr/solrj/src/java/org/apache/solr/common/ParWork.java
index c39596f..b748fb3 100644
--- a/solr/solrj/src/java/org/apache/solr/common/ParWork.java
+++ b/solr/solrj/src/java/org/apache/solr/common/ParWork.java
@@ -330,36 +330,12 @@ public class ParWork implements Closeable {
 
   @SuppressWarnings({ "unchecked", "rawtypes" })
   private void gatherObjects(Object object, List<ParObject> objects) {
-    if (log.isDebugEnabled()) {
-      log.debug("gatherObjects(Object object={}, List<Object> objects={}) - start", object, objects);
-    }
-
     if (object != null) {
-      if (object.getClass().isArray()) {
-        if (log.isDebugEnabled()) {
-          log.debug("Found an array to gather against");
-        }
-
-        for (Object obj : (Object[]) object) {
-          gatherObjects(obj, objects);
-        }
-
-      } else if (object instanceof Collection) {
-        if (log.isDebugEnabled()) {
-          log.debug("Found a Collection to gather against");
-        }
+      if (object instanceof Collection) {
         for (Object obj : (Collection) object) {
           gatherObjects(obj, objects);
         }
-      } else if (object instanceof Map<?, ?>) {
-        if (log.isDebugEnabled()) {
-          log.debug("Found a Map to gather against");
-        }
-        ((Map) object).forEach((k, v) -> gatherObjects(v, objects));
       } else {
-        if (log.isDebugEnabled()) {
-          log.debug("Found a non collection object to add {}", object.getClass().getName());
-        }
         if (object instanceof ParObject) {
           objects.add((ParObject) object);
         } else {
@@ -376,10 +352,13 @@ public class ParWork implements Closeable {
     if (log.isDebugEnabled()) {
       log.debug("add(String label={}, Object object={}, Callable Callables={}) - start", object.label, object);
     }
-
-    List<ParObject> objects = new ArrayList<>();
-
-    gatherObjects(object.object, objects);
+    List<ParObject> objects;
+    if (object.object instanceof  Collection) {
+      objects = new ArrayList<>(((Collection<?>) object.object).size());
+      gatherObjects(object.object, objects);
+    } else {
+      objects = Collections.singletonList(object);
+    }
 
     WorkUnit workUnit = new WorkUnit(objects, tracker);
     workUnits.add(workUnit);


[lucene-solr] 03/03: @578 Optimizations.

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit d910aadb7d71a79aa410cae5113e8c952d72f639
Author: markrmiller@gmail.com <ma...@gmail.com>
AuthorDate: Thu Aug 20 08:11:46 2020 -0500

    @578 Optimizations.
---
 .../client/solrj/embedded/JettySolrRunner.java     |  2 +-
 .../java/org/apache/solr/cloud/ZkController.java   |  2 +-
 .../apache/solr/cloud/overseer/ZkStateWriter.java  |  6 +++-
 .../java/org/apache/solr/core/CoreContainer.java   |  9 ++---
 .../java/org/apache/solr/core/XmlConfigFile.java   | 11 +++---
 .../org/apache/solr/metrics/SolrMetricManager.java | 25 +++++++++----
 .../apache/solr/metrics/SolrMetricsContext.java    |  8 +++--
 .../apache/solr/response/TextResponseWriter.java   |  4 +--
 .../cloud/TestWaitForStateWithJettyShutdowns.java  |  6 ----
 .../src/java/org/apache/solr/common/ParWork.java   |  4 +--
 .../org/apache/solr/common/util/FastWriter.java    |  5 +--
 .../apache/solr/common/util/SolrJSONWriter.java    |  4 +--
 .../solr/common/util/SolrQueuedThreadPool.java     | 41 ++++++++++------------
 .../src/java/org/apache/solr/SolrTestCase.java     | 11 +++---
 .../java/org/apache/solr/util/BaseTestHarness.java | 35 +++++++++---------
 .../src/java/org/apache/solr/util/TestHarness.java |  4 +--
 16 files changed, 97 insertions(+), 80 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettySolrRunner.java b/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettySolrRunner.java
index 426d0c1..da5cc7b 100644
--- a/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettySolrRunner.java
+++ b/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettySolrRunner.java
@@ -301,7 +301,7 @@ public class JettySolrRunner implements Closeable {
       qtp.setLowThreadsThreshold(Integer.getInteger("solr.lowContainerThreadsThreshold", -1)); // we don't use this or connections will get cut
       qtp.setMinThreads(Integer.getInteger("solr.minContainerThreads", 2));
       qtp.setIdleTimeout(Integer.getInteger("solr.containerThreadsIdle", THREAD_POOL_MAX_IDLE_TIME_MS));
-      qtp.setStopTimeout(1);
+      qtp.setStopTimeout(0);
       qtp.setReservedThreads(-1); // -1 auto sizes, important to keep
     }
 
diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkController.java b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
index 3d25de4..be84376 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
@@ -856,7 +856,7 @@ public class ZkController implements Closeable {
 //
     paths.put(ZkStateReader.CLUSTER_STATE, emptyJson);
     //   operations.add(zkClient.createPathOp(ZkStateReader.CLUSTER_PROPS, emptyJson));
-    paths.put(ZkStateReader.SOLR_PKGS_PATH, emptyJson);
+    paths.put(ZkStateReader.SOLR_PKGS_PATH, null);
     paths.put(ZkStateReader.ROLES, emptyJson);
 
 
diff --git a/solr/core/src/java/org/apache/solr/cloud/overseer/ZkStateWriter.java b/solr/core/src/java/org/apache/solr/cloud/overseer/ZkStateWriter.java
index 6ca23f1..ac60169 100644
--- a/solr/core/src/java/org/apache/solr/cloud/overseer/ZkStateWriter.java
+++ b/solr/core/src/java/org/apache/solr/cloud/overseer/ZkStateWriter.java
@@ -419,7 +419,11 @@ public class ZkStateWriter {
 
       updatesToWrite.clear();
       if (log.isDebugEnabled()) log.debug("Failed updates {}", failedUpdates.values());
-      updatesToWrite.putAll(failedUpdates);
+   //   updatesToWrite.putAll(failedUpdates);
+      if (failedUpdates.size() > 0) {
+        throw new AlreadyClosedException();
+      }
+
       success = true;
     } finally {
       timerContext.stop();
diff --git a/solr/core/src/java/org/apache/solr/core/CoreContainer.java b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
index eaac591..f8660c7 100644
--- a/solr/core/src/java/org/apache/solr/core/CoreContainer.java
+++ b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
@@ -788,7 +788,6 @@ public class CoreContainer implements Closeable {
         infoHandler = createHandler(INFO_HANDLER_PATH, cfg.getInfoHandlerClass(), InfoHandler.class);
       });
 
-
       work.collect("",() -> {
         // metricsHistoryHandler uses metricsHandler, so create it first
         metricsHandler = new MetricsHandler(this);
@@ -824,10 +823,12 @@ public class CoreContainer implements Closeable {
         });
       }
 
-      work.addCollect();
+    //  work.addCollect();
+      work.collect("",() -> {
+        coreAdminHandler = createHandler(CORES_HANDLER_PATH, cfg.getCoreAdminHandlerClass(), CoreAdminHandler.class);
+        configSetsHandler = createHandler(CONFIGSETS_HANDLER_PATH, cfg.getConfigSetsHandlerClass(), ConfigSetsHandler.class);
+      });
 
-      coreAdminHandler = createHandler(CORES_HANDLER_PATH, cfg.getCoreAdminHandlerClass(), CoreAdminHandler.class);
-      configSetsHandler = createHandler(CONFIGSETS_HANDLER_PATH, cfg.getConfigSetsHandlerClass(), ConfigSetsHandler.class);
     }
 
       // initialize gauges for reporting the number of cores and disk total/free
diff --git a/solr/core/src/java/org/apache/solr/core/XmlConfigFile.java b/solr/core/src/java/org/apache/solr/core/XmlConfigFile.java
index b311291..acbaf22 100644
--- a/solr/core/src/java/org/apache/solr/core/XmlConfigFile.java
+++ b/solr/core/src/java/org/apache/solr/core/XmlConfigFile.java
@@ -79,6 +79,7 @@ public class XmlConfigFile { // formerly simply "Config"
 
       xpathFactory.getConfiguration().setValidation(false);
       xpathFactory.getConfiguration().setExpandAttributeDefaults(false);
+      xpathFactory.getConfiguration().setXIncludeAware(true);
 
     // tfactory.getConfiguration().setBooleanProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.TRUE);
   }
@@ -161,14 +162,14 @@ public class XmlConfigFile { // formerly simply "Config"
 
     try {
       DocumentBuilderImpl b = new DocumentBuilderImpl();
-
+      b.setErrorHandler(xmllog);
       if (is.getSystemId() != null) {
         b.setEntityResolver(loader.getSysIdResolver());
-        b.setXIncludeAware(true);
-        b.setValidating(false);
-        b.setErrorHandler(xmllog);
-        b.getConfiguration().setExpandAttributeDefaults(true);
       }
+      b.setXIncludeAware(true);
+      b.setValidating(false);
+      b.getConfiguration().setExpandAttributeDefaults(false);
+
       try {
         doc = copyDoc(b.parse(is));
       } catch (TransformerException e) {
diff --git a/solr/core/src/java/org/apache/solr/metrics/SolrMetricManager.java b/solr/core/src/java/org/apache/solr/metrics/SolrMetricManager.java
index ae7bbe9..231f472 100644
--- a/solr/core/src/java/org/apache/solr/metrics/SolrMetricManager.java
+++ b/solr/core/src/java/org/apache/solr/metrics/SolrMetricManager.java
@@ -716,21 +716,26 @@ public class SolrMetricManager {
    *                   using dotted notation
    * @param metricPath (optional) additional top-most metric name path elements
    */
-  public void registerMetric(SolrMetricsContext context, String registry, Metric metric, boolean force, String metricName, String... metricPath) {
+  public String registerMetric(SolrMetricsContext context, String registry, Metric metric, boolean force, String metricName, String... metricPath) {
     MetricRegistry metricRegistry = registry(registry);
     String fullName = mkName(metricName, metricPath);
     if (context != null) {
       context.registerMetricName(fullName);
     }
 
-    metricRegistry.remove(fullName);
     try {
       metricRegistry.register(fullName, metric);
     } catch (IllegalArgumentException e) {
-      if (!force) {
-        throw e;
+      metricRegistry.remove(fullName);
+      try {
+        metricRegistry.register(fullName, metric);
+      } catch (IllegalArgumentException e2) {
+        if (!force) {
+          throw e2;
+        }
       }
     }
+    return fullName;
   }
 
   /**
@@ -763,8 +768,8 @@ public class SolrMetricManager {
     }
   }
 
-  public void registerGauge(SolrMetricsContext context, String registry, Gauge<?> gauge, String tag, boolean force, String metricName, String... metricPath) {
-    registerMetric(context, registry, new GaugeWrapper(gauge, tag), force, metricName, metricPath);
+  public String registerGauge(SolrMetricsContext context, String registry, Gauge<?> gauge, String tag, boolean force, String metricName, String... metricPath) {
+    return registerMetric(context, registry, new GaugeWrapper(gauge, tag), force, metricName, metricPath);
   }
 
   public int unregisterGauges(String registryName, String tagSegment) {
@@ -789,6 +794,14 @@ public class SolrMetricManager {
     return removed.get();
   }
 
+  public int unregisterGauges(Set<String> names, String registryName) {
+    MetricRegistry registry = registry(registryName);
+    for (String name : names) {
+      registry.remove(name);
+    }
+    return names.size();
+  }
+
   /**
    * This method creates a hierarchical name with arbitrary levels of hierarchy
    *
diff --git a/solr/core/src/java/org/apache/solr/metrics/SolrMetricsContext.java b/solr/core/src/java/org/apache/solr/metrics/SolrMetricsContext.java
index 6297014..a927d68 100644
--- a/solr/core/src/java/org/apache/solr/metrics/SolrMetricsContext.java
+++ b/solr/core/src/java/org/apache/solr/metrics/SolrMetricsContext.java
@@ -41,6 +41,8 @@ public class SolrMetricsContext {
   final String tag;
   private final Set<String> metricNames = ConcurrentHashMap.newKeySet(128);
 
+  private final Set<String> gaugeNames = ConcurrentHashMap.newKeySet(128);
+
   public SolrMetricsContext(SolrMetricManager metricManager, String registryName, String tag) {
     this.registryName = registryName;
     this.metricManager = metricManager;
@@ -83,7 +85,9 @@ public class SolrMetricsContext {
    * do so may result in hard-to-debug memory leaks.</b></p>
    */
   public void unregister() {
-    metricManager.unregisterGauges(registryName, tag);
+    for (String gauge : gaugeNames) {
+      metricManager.unregisterGauges(registryName, tag);
+    }
   }
 
   /**
@@ -132,7 +136,7 @@ public class SolrMetricsContext {
    * Convenience method for {@link SolrMetricManager#registerGauge(SolrMetricsContext, String, Gauge, String, boolean, String, String...)}.
    */
   public void gauge(Gauge<?> gauge, boolean force, String metricName, String... metricPath) {
-    metricManager.registerGauge(this, registryName, gauge, tag, force, metricName, metricPath);
+    gaugeNames.add(metricManager.registerGauge(this, registryName, gauge, tag, force, metricName, metricPath));
   }
 
   /**
diff --git a/solr/core/src/java/org/apache/solr/response/TextResponseWriter.java b/solr/core/src/java/org/apache/solr/response/TextResponseWriter.java
index 803c340..64b796c 100644
--- a/solr/core/src/java/org/apache/solr/response/TextResponseWriter.java
+++ b/solr/core/src/java/org/apache/solr/response/TextResponseWriter.java
@@ -42,7 +42,7 @@ import org.apache.solr.search.ReturnFields;
  */
 public abstract class TextResponseWriter implements TextWriter {
 
-  protected final FastWriter writer;
+  protected final Writer writer;
   protected final IndexSchema schema;
   protected final SolrQueryRequest req;
   protected final SolrQueryResponse rsp;
@@ -80,7 +80,7 @@ public abstract class TextResponseWriter implements TextWriter {
 
   /** done with this ResponseWriter... make sure any buffers are flushed to writer */
   public void close() throws IOException {
-    if(writer != null) writer.flushBuffer();
+    if(writer != null && writer instanceof FastWriter) ((FastWriter) writer).flushBuffer();
   }
 
   @Override
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestWaitForStateWithJettyShutdowns.java b/solr/core/src/test/org/apache/solr/cloud/TestWaitForStateWithJettyShutdowns.java
index 677cf0b..f4afb8a 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestWaitForStateWithJettyShutdowns.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestWaitForStateWithJettyShutdowns.java
@@ -77,10 +77,6 @@ public class TestWaitForStateWithJettyShutdowns extends SolrTestCaseJ4 {
     try {
       log.info("Create our collection");
       CollectionAdminRequest.createCollection(col_name, "_default", 1, 1).process(cluster.getSolrClient());
-      
-      log.info("Sanity check that our collection has come online");
-      cluster.getSolrClient().waitForState(col_name, 30, TimeUnit.SECONDS,
-                                           SolrCloudTestCase.clusterShape(1, 1));
 
 
       // HACK implementation detail...
@@ -114,8 +110,6 @@ public class TestWaitForStateWithJettyShutdowns extends SolrTestCaseJ4 {
       log.info("Shutdown 1 node");
       final JettySolrRunner nodeToStop = cluster.getJettySolrRunner(0);
       nodeToStop.stop();
-      log.info("Wait to confirm our node is fully shutdown");
-      cluster.waitForJettyToStop(nodeToStop);
 
       // now that we're confident that node has stoped, check if a waitForState
       // call will detect the missing replica -- shouldn't need long wait times...
diff --git a/solr/solrj/src/java/org/apache/solr/common/ParWork.java b/solr/solrj/src/java/org/apache/solr/common/ParWork.java
index b748fb3..ad37262 100644
--- a/solr/solrj/src/java/org/apache/solr/common/ParWork.java
+++ b/solr/solrj/src/java/org/apache/solr/common/ParWork.java
@@ -69,7 +69,7 @@ public class ParWork implements Closeable {
   private final boolean requireAnotherThread;
   private final String rootLabel;
 
-  private volatile Set<ParObject> collectSet = ConcurrentHashMap.newKeySet(32);
+  private volatile Set<ParObject> collectSet = ConcurrentHashMap.newKeySet(16);
 
   private static volatile ThreadPoolExecutor EXEC;
 
@@ -278,7 +278,7 @@ public class ParWork implements Closeable {
     }
     ParObject ob = new ParObject();
     ob.object = object;
-    ob.label = object.getClass().getSimpleName();
+    ob.label = object.toString();
     collectSet.add(ob);
   }
 
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/FastWriter.java b/solr/solrj/src/java/org/apache/solr/common/util/FastWriter.java
index 2575624..fff6bc3 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/FastWriter.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/FastWriter.java
@@ -17,6 +17,7 @@
 package org.apache.solr.common.util;
 
 import java.io.IOException;
+import java.io.StringWriter;
 import java.io.Writer;
 
 /** Single threaded BufferedWriter
@@ -40,8 +41,8 @@ public class FastWriter extends Writer {
     this.pos = start;
   }
 
-  public static FastWriter wrap(Writer sink) {
-    return (sink instanceof FastWriter) ? (FastWriter)sink : new FastWriter(sink);
+  public static Writer wrap(Writer sink) {
+    return (sink instanceof FastWriter || sink instanceof StringWriter) ? sink : new FastWriter(sink);
   }
 
   @Override
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/SolrJSONWriter.java b/solr/solrj/src/java/org/apache/solr/common/util/SolrJSONWriter.java
index 5eeefd4..c7ab114 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/SolrJSONWriter.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/SolrJSONWriter.java
@@ -35,7 +35,7 @@ public class SolrJSONWriter implements JsonTextWriter {
   }
 
   final protected String namedListStyle;
-  final FastWriter writer;
+  final Writer writer;
   protected int level;
   protected boolean doIndent;
 
@@ -57,7 +57,7 @@ public class SolrJSONWriter implements JsonTextWriter {
    * done with all writing
    */
   public void close() throws IOException {
-    if (writer != null) writer.flushBuffer();
+    if (writer != null && writer instanceof FastWriter) ((FastWriter) writer).flushBuffer();
   }
 
 
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/SolrQueuedThreadPool.java b/solr/solrj/src/java/org/apache/solr/common/util/SolrQueuedThreadPool.java
index ae452d4..446fef5 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/SolrQueuedThreadPool.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/SolrQueuedThreadPool.java
@@ -16,21 +16,6 @@
  */
 package org.apache.solr.common.util;
 
-import java.io.Closeable;
-import java.io.IOException;
-import java.lang.invoke.MethodHandles;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.RejectedExecutionException;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
-
 import org.apache.solr.common.ParWork;
 import org.eclipse.jetty.util.AtomicBiInteger;
 import org.eclipse.jetty.util.BlockingArrayQueue;
@@ -41,8 +26,6 @@ import org.eclipse.jetty.util.annotation.Name;
 import org.eclipse.jetty.util.component.ContainerLifeCycle;
 import org.eclipse.jetty.util.component.Dumpable;
 import org.eclipse.jetty.util.component.DumpableCollection;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.thread.QueuedThreadPool;
 import org.eclipse.jetty.util.thread.ReservedThreadExecutor;
 import org.eclipse.jetty.util.thread.ThreadPool;
 import org.eclipse.jetty.util.thread.ThreadPoolBudget;
@@ -50,8 +33,23 @@ import org.eclipse.jetty.util.thread.TryExecutor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.Closeable;
+import java.io.IOException;
+import java.lang.invoke.MethodHandles;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+
 public class SolrQueuedThreadPool extends ContainerLifeCycle implements ThreadFactory, ThreadPool.SizedThreadPool, Dumpable, TryExecutor, Closeable {
-    private static final org.eclipse.jetty.util.log.Logger LOG = Log.getLogger(QueuedThreadPool.class);
+    private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
     private static Runnable NOOP = () ->
     {
     };
@@ -206,7 +204,7 @@ public class SolrQueuedThreadPool extends ContainerLifeCycle implements ThreadFa
         if (LOG.isDebugEnabled())
             LOG.debug("Stopping {}", this);
         this.closed = true;
-
+        this.setStopTimeout(0);
         super.doStop();
 
         removeBean(_tryExecutor);
@@ -276,7 +274,7 @@ public class SolrQueuedThreadPool extends ContainerLifeCycle implements ThreadFa
                 }
                 catch (Throwable t)
                 {
-                    LOG.warn(t);
+                    LOG.warn("", t);
                 }
             }
             else if (job != NOOP)
@@ -1007,11 +1005,10 @@ public class SolrQueuedThreadPool extends ContainerLifeCycle implements ThreadFa
                     {
                         if (LOG.isDebugEnabled())
                             LOG.debug("interrupted {} in {}", job, SolrQueuedThreadPool.this);
-                        LOG.ignore(e);
                     }
                     catch (Throwable e)
                     {
-                        LOG.warn(e);
+                        LOG.warn("", e);
                     }
                     finally
                     {
diff --git a/solr/test-framework/src/java/org/apache/solr/SolrTestCase.java b/solr/test-framework/src/java/org/apache/solr/SolrTestCase.java
index 2a4ae0f..5565bce 100644
--- a/solr/test-framework/src/java/org/apache/solr/SolrTestCase.java
+++ b/solr/test-framework/src/java/org/apache/solr/SolrTestCase.java
@@ -202,6 +202,11 @@ public class SolrTestCase extends LuceneTestCase {
     log.info("*******************************************************************");
     log.info("@BeforeClass ------------------------------------------------------");
 
+    System.setProperty("org.eclipse.jetty.util.log.class", "org.apache.logging.log4j.appserver.jetty.Log4j2Logger");
+
+    // we do this because threads can be finished, but waiting
+    // for an idle timeout or in a TERMINATED state, and we don't
+    // want to wait for them - in prod these threads are daemon
     interruptThreadsOnTearDown("ParWork", false);
 
     if (!SysStats.getSysStats().isAlive()) {
@@ -616,10 +621,6 @@ public class SolrTestCase extends LuceneTestCase {
         System.out.println("state:" + thread.getState());
       }
     }
-
-//    if (nameContains != null && nameContains.startsWith("ParWork")) {
-//      ParWork.closeExecutor();
-//    }
   }
 
   public static SolrQueuedThreadPool getQtp() {
@@ -634,7 +635,7 @@ public class SolrTestCase extends LuceneTestCase {
     qtp.setStopTimeout((int) TimeUnit.SECONDS.toMillis(60));
     qtp.setDaemon(true);
     qtp.setReservedThreads(-1); // -1 auto sizes, important to keep
-    qtp.setStopTimeout(1);
+    qtp.setStopTimeout(0);
     return qtp;
   }
 
diff --git a/solr/test-framework/src/java/org/apache/solr/util/BaseTestHarness.java b/solr/test-framework/src/java/org/apache/solr/util/BaseTestHarness.java
index 1ffb0c5..c8a4631 100644
--- a/solr/test-framework/src/java/org/apache/solr/util/BaseTestHarness.java
+++ b/solr/test-framework/src/java/org/apache/solr/util/BaseTestHarness.java
@@ -16,8 +16,10 @@
  */
 package org.apache.solr.util;
 
+import net.sf.saxon.dom.DocumentBuilderImpl;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.util.XML;
+import org.apache.solr.core.SolrXmlConfig;
 import org.apache.solr.core.XmlConfigFile;
 import org.apache.solr.rest.schema.FieldTypeXmlAdapter;
 import org.apache.solr.schema.IndexSchema;
@@ -27,6 +29,7 @@ import org.xml.sax.SAXException;
 import javax.xml.namespace.QName;
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathExpressionException;
@@ -73,16 +76,16 @@ abstract public class BaseTestHarness {
 
     if (tests==null || tests.length == 0) return null;
 
-    Document document = null;
+    DocumentBuilderImpl b = new DocumentBuilderImpl();
+    b.setConfiguration(XmlConfigFile.xpathFactory.getConfiguration());
+
+    Document document;
     try {
-      document = getXmlDocumentBuilder().parse(new ByteArrayInputStream
+      document = b.parse(new ByteArrayInputStream
           (xml.getBytes(StandardCharsets.UTF_8)));
-    } catch (UnsupportedEncodingException e1) {
-      throw new RuntimeException("Totally weird UTF-8 exception", e1);
-    } catch (IOException | ParserConfigurationException e2) {
-      throw new RuntimeException("Parse or IO Exception", e2);
+    } catch (IOException e) {
+     throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e);
     }
-
     for (String xp : tests) {
       xp=xp.trim();
       Boolean bool = (Boolean) getXpath().evaluate(xp, document, XPathConstants.BOOLEAN);
@@ -98,16 +101,14 @@ abstract public class BaseTestHarness {
     throws XPathExpressionException, SAXException {
     if (null == xpath) return null;
 
-    Document document = null;
+    DocumentBuilderImpl b = new DocumentBuilderImpl();
+    b.setConfiguration(XmlConfigFile.xpathFactory.getConfiguration());
+    Document document;
     try {
-      document = getXmlDocumentBuilder().parse(new ByteArrayInputStream
+      document = b.parse(new ByteArrayInputStream
           (xml.getBytes(StandardCharsets.UTF_8)));
-    } catch (UnsupportedEncodingException e1) {
-      throw new RuntimeException("Totally weird UTF-8 exception", e1);
-    } catch (IOException e2) {
-      throw new RuntimeException("Totally weird io exception", e2);
-    } catch (ParserConfigurationException e) {
-      throw new RuntimeException("Parse exception", e);
+    } catch (IOException e) {
+      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e);
     }
 
     xpath = xpath.trim();
@@ -123,7 +124,7 @@ abstract public class BaseTestHarness {
   public static String makeSimpleDoc(String... fieldsAndValues) {
 
     try {
-      StringWriter w = new StringWriter();
+      StringWriter w = new StringWriter(32);
       w.append("<doc>");
       for (int i = 0; i < fieldsAndValues.length; i+=2) {
         XML.writeXML(w, "field", fieldsAndValues[i + 1], "name",
@@ -144,7 +145,7 @@ abstract public class BaseTestHarness {
    */
   public static String deleteByQuery(String q, String... args) {
     try {
-      StringWriter r = new StringWriter();
+      StringWriter r = new StringWriter(64);
       XML.writeXML(r, "query", q);
       return delete(r.getBuffer().toString(), args);
     } catch(IOException e) {
diff --git a/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java b/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java
index 1db9cd2..e50e33c 100644
--- a/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java
+++ b/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java
@@ -338,12 +338,12 @@ public class TestHarness extends BaseTestHarness {
       }
       QueryResponseWriter responseWriter = core.getQueryResponseWriter(req);
       if (responseWriter instanceof BinaryQueryResponseWriter) {
-        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(32000);
+        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(256);
         BinaryQueryResponseWriter writer = (BinaryQueryResponseWriter) responseWriter;
         writer.write(byteArrayOutputStream, req, rsp);
         return new String(byteArrayOutputStream.toByteArray(), StandardCharsets.UTF_8);
       } else {
-        StringWriter sw = new StringWriter(32000);
+        StringWriter sw = new StringWriter(256);
         responseWriter.write(sw,req,rsp);
         return sw.toString();
       }