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/09/08 05:00:15 UTC

[lucene-solr] branch reference_impl_dev updated (662ed37 -> f2369e1)

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 662ed37  @805 Test hardening.
     new ba6395d  @806 Give some of the managed schema stuff a close.
     new 95af499  @807 Fix jetty solr scheduler.
     new f2369e1  @808 Couple test fixes.

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:
 .../test/org/apache/solr/ltr/TestRerankBase.java   |  6 +++--
 .../scraper/SolrStandaloneScraperTest.java         | 14 ++++-------
 .../client/solrj/embedded/JettySolrRunner.java     | 15 +++++------
 .../org/apache/solr/handler/SchemaHandler.java     | 14 ++++++++++-
 .../org/apache/solr/schema/ManagedIndexSchema.java | 29 ++++++++++++++--------
 .../java/org/apache/solr/schema/SchemaManager.java | 21 ++++++++++++++--
 .../util/SolrScheduledExecutorScheduler.java       |  2 +-
 .../solr/client/solrj/request/SchemaTest.java      | 23 +++--------------
 .../java/org/apache/solr/util/RestTestBase.java    |  5 +---
 9 files changed, 72 insertions(+), 57 deletions(-)


[lucene-solr] 03/03: @808 Couple test fixes.

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 f2369e1cb34ba93bf68bbb7341b83ebb7f77c61f
Author: markrmiller@gmail.com <ma...@gmail.com>
AuthorDate: Mon Sep 7 23:58:00 2020 -0500

    @808 Couple test fixes.
---
 .../scraper/SolrStandaloneScraperTest.java         | 14 +++++--------
 .../solr/client/solrj/request/SchemaTest.java      | 23 ++++------------------
 2 files changed, 9 insertions(+), 28 deletions(-)

diff --git a/solr/contrib/prometheus-exporter/src/test/org/apache/solr/prometheus/scraper/SolrStandaloneScraperTest.java b/solr/contrib/prometheus-exporter/src/test/org/apache/solr/prometheus/scraper/SolrStandaloneScraperTest.java
index 788c4e6..39a23fa 100644
--- a/solr/contrib/prometheus-exporter/src/test/org/apache/solr/prometheus/scraper/SolrStandaloneScraperTest.java
+++ b/solr/contrib/prometheus-exporter/src/test/org/apache/solr/prometheus/scraper/SolrStandaloneScraperTest.java
@@ -29,6 +29,7 @@ import org.apache.commons.io.FileUtils;
 import org.apache.solr.client.solrj.impl.Http2SolrClient;
 import org.apache.solr.client.solrj.impl.HttpSolrClient;
 import org.apache.solr.client.solrj.impl.NoOpResponseParser;
+import org.apache.solr.common.ParWork;
 import org.apache.solr.common.util.ExecutorUtil;
 import org.apache.solr.common.util.IOUtils;
 import org.apache.solr.prometheus.PrometheusExporterTestBase;
@@ -42,7 +43,6 @@ import org.junit.BeforeClass;
 import org.junit.Ignore;
 import org.junit.Test;
 
-@Ignore // nocommit debug
 public class SolrStandaloneScraperTest extends RestTestBase {
 
   private static MetricsConfiguration configuration;
@@ -67,8 +67,8 @@ public class SolrStandaloneScraperTest extends RestTestBase {
         true,
         null);
 
-    executor = ExecutorUtil.newMDCAwareFixedThreadPool(25, new SolrNamedThreadFactory("solr-cloud-scraper-tests"));
-    configuration = Helpers.loadConfiguration("conf/prometheus-solr-exporter-scraper-test-config.xml");
+    executor = ParWork.getMyPerThreadExecutor();
+    configuration = Helpers.loadConfiguration(TEST_PATH().resolve("..").resolve("conf").resolve("prometheus-solr-exporter-scraper-test-config.xml").toString());
 
     solrClient = getHttpSolrClient(restTestHarness.getAdminURL());
     solrScraper = new SolrStandaloneScraper(solrClient, executor);
@@ -85,15 +85,9 @@ public class SolrStandaloneScraperTest extends RestTestBase {
   public static void cleanUp() throws Exception {
     IOUtils.closeQuietly(solrScraper);
     IOUtils.closeQuietly(solrClient);
-    cleanUpHarness();
     if (null != executor) {
-      executor.shutdownNow();
       executor = null;
     }
-    if (null != jetty) {
-      jetty.stop();
-      jetty = null;
-    }
     solrScraper = null;
     solrClient = null;
   }
@@ -107,6 +101,7 @@ public class SolrStandaloneScraperTest extends RestTestBase {
   }
 
   @Test
+  @Ignore // nocommit debug
   public void pingCores() throws Exception {
     Map<String, MetricSamples> allCoreMetrics = solrScraper.pingAllCores(
         configuration.getPingConfiguration().get(0));
@@ -132,6 +127,7 @@ public class SolrStandaloneScraperTest extends RestTestBase {
   }
 
   @Test
+  @Ignore // nocommit debug - probably just that metrics are not instant
   public void metricsForHost() throws Exception {
     Map<String, MetricSamples> metricsByHost = solrScraper.metricsForAllHosts(configuration.getMetricsConfiguration().get(0));
 
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/request/SchemaTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/request/SchemaTest.java
index 3fd1341..277cca0 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/request/SchemaTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/request/SchemaTest.java
@@ -29,6 +29,7 @@ import java.util.TreeMap;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.solr.client.solrj.SolrClient;
+import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.impl.BaseHttpSolrClient;
 import org.apache.solr.client.solrj.request.schema.AnalyzerDefinition;
 import org.apache.solr.client.solrj.request.schema.FieldTypeDefinition;
@@ -59,6 +60,8 @@ import static org.hamcrest.CoreMatchers.is;
  * {@link SchemaRequest} and {@link SchemaResponse}.
  */
 public class SchemaTest extends RestTestBase {
+  private static JettySolrRunner jetty;
+
   private static void assertValidSchemaResponse(SolrResponseBase schemaResponse) {
     assertEquals("Response contained errors: " + schemaResponse.toString(), 0, schemaResponse.getStatus());
     assertNull("Response contained errors: " + schemaResponse.toString(), schemaResponse.getResponse().get("errors"));
@@ -115,34 +118,16 @@ public class SchemaTest extends RestTestBase {
     System.setProperty("managed.schema.mutable", "true");
     System.setProperty("enable.update.log", "false");
 
-    createJettyAndHarness(tmpSolrHome.getAbsolutePath(), "solrconfig-managed-schema.xml", "schema.xml",
+    jetty = createJettyAndHarness(tmpSolrHome.getAbsolutePath(), "solrconfig-managed-schema.xml", "schema.xml",
         "/solr", true, extraServlets);
   }
 
-  @After
-  public void cleanup() throws Exception  {
-//    if (jetty != null) {
-//      jetty.stop();
-//      jetty = null;
-//    }
-//    if (restTestHarness != null) {
-//      restTestHarness.close();
-//    }
-//    restTestHarness = null;
-
-  }
-
   @AfterClass
   public static void afterSchemaTest() throws Exception  {
     if (jetty != null) {
       jetty.stop();
       jetty = null;
     }
-    if (restTestHarness != null) {
-      restTestHarness.close();
-    }
-    restTestHarness = null;
-
   }
 
   @Test


[lucene-solr] 01/03: @806 Give some of the managed schema stuff a close.

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 ba6395d2575fa5d276af3e4d182dad60903f1379
Author: markrmiller@gmail.com <ma...@gmail.com>
AuthorDate: Mon Sep 7 23:38:16 2020 -0500

    @806 Give some of the managed schema stuff a close.
---
 .../org/apache/solr/handler/SchemaHandler.java     | 14 ++++++++++-
 .../org/apache/solr/schema/ManagedIndexSchema.java | 29 ++++++++++++++--------
 .../java/org/apache/solr/schema/SchemaManager.java | 21 ++++++++++++++--
 3 files changed, 51 insertions(+), 13 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/handler/SchemaHandler.java b/solr/core/src/java/org/apache/solr/handler/SchemaHandler.java
index ef8ef58..6709d78 100644
--- a/solr/core/src/java/org/apache/solr/handler/SchemaHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/SchemaHandler.java
@@ -31,6 +31,7 @@ import org.apache.solr.api.ApiBag;
 import org.apache.solr.cloud.ZkSolrResourceLoader;
 import org.apache.solr.common.ParWork;
 import org.apache.solr.common.SolrException;
+import org.apache.solr.common.cloud.ConnectionManager;
 import org.apache.solr.common.params.MapSolrParams;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.SimpleOrderedMap;
@@ -76,8 +77,14 @@ public class SchemaHandler extends RequestHandlerBase implements SolrCoreAware,
     level2 = Collections.unmodifiableMap(s);
   }
 
+  private volatile boolean isClosed;
 
   @Override
+  public void close() {
+    this.isClosed = true;
+  }
+  
+  @Override
   public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
     RequestHandlerUtils.setWt(req, JSON);
     String httpMethod = (String) req.getContext().get("httpMethod");
@@ -91,7 +98,12 @@ public class SchemaHandler extends RequestHandlerBase implements SolrCoreAware,
 
       try {
         @SuppressWarnings({"rawtypes"})
-        List errs = new SchemaManager(req).performOperations();
+        List errs = new SchemaManager(req, new ConnectionManager.IsClosed() {
+          @Override
+          public boolean isClosed() {
+            return isClosed;
+          }
+        }).performOperations();
         if (!errs.isEmpty())
           throw new ApiBag.ExceptionWithErrObject(SolrException.ErrorCode.BAD_REQUEST,"error processing commands", errs);
       } catch (IOException e) {
diff --git a/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchema.java b/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchema.java
index 74c1343..c9dc786 100644
--- a/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchema.java
+++ b/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchema.java
@@ -58,6 +58,7 @@ import org.apache.solr.common.ParWork;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.cloud.ClusterState;
+import org.apache.solr.common.cloud.ConnectionManager;
 import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.Slice;
@@ -221,15 +222,14 @@ public final class ManagedIndexSchema extends IndexSchema {
    * Block up to a specified maximum time until we see agreement on the schema
    * version in ZooKeeper across all replicas for a collection.
    */
-  public static void waitForSchemaZkVersionAgreement(String collection, String localCoreNodeName,
-                                                     int schemaZkVersion, ZkController zkController, int maxWaitSecs)
+  public static void waitForSchemaZkVersionAgreement(String collection, String localCoreNodeName, int schemaZkVersion, ZkController zkController, int maxWaitSecs, ConnectionManager.IsClosed isClosed)
   {
     RTimer timer = new RTimer();
 
     // get a list of active replica cores to query for the schema zk version (skipping this core of course)
     List<GetZkSchemaVersionCallable> concurrentTasks = new ArrayList<>();
     for (String coreUrl : getActiveReplicaCoreUrls(zkController, collection, localCoreNodeName))
-      concurrentTasks.add(new GetZkSchemaVersionCallable(coreUrl, schemaZkVersion));
+      concurrentTasks.add(new GetZkSchemaVersionCallable(coreUrl, schemaZkVersion, zkController.getCoreContainer().getUpdateShardHandler().getTheSharedHttpClient(), isClosed));
     if (concurrentTasks.isEmpty())
       return; // nothing to wait for ...
 
@@ -242,7 +242,7 @@ public final class ManagedIndexSchema extends IndexSchema {
     // use an executor service to invoke schema zk version requests in parallel with a max wait time
     try {
       List<Future<Integer>> results =
-          ParWork.getMyPerThreadExecutor().invokeAll(concurrentTasks, maxWaitSecs, TimeUnit.SECONDS);
+          ParWork.getRootSharedExecutor().invokeAll(concurrentTasks, maxWaitSecs, TimeUnit.SECONDS);
 
       // determine whether all replicas have the update
       List<String> failedList = null; // lazily init'd
@@ -312,14 +312,18 @@ public final class ManagedIndexSchema extends IndexSchema {
 
   private static class GetZkSchemaVersionCallable extends SolrRequest implements Callable<Integer> {
 
+    private final ConnectionManager.IsClosed isClosed;
+    private final Http2SolrClient solrClient;
     private String coreUrl;
     private int expectedZkVersion;
 
-    GetZkSchemaVersionCallable(String coreUrl, int expectedZkVersion) {
+    GetZkSchemaVersionCallable(String coreUrl, int expectedZkVersion, Http2SolrClient solrClient, ConnectionManager.IsClosed isClosed) {
       super(METHOD.GET, "/schema/zkversion");
-
+      setBasePath(coreUrl);
+      this.isClosed = isClosed;
       this.coreUrl = coreUrl;
       this.expectedZkVersion = expectedZkVersion;
+      this.solrClient = solrClient;
     }
 
     @Override
@@ -332,15 +336,21 @@ public final class ManagedIndexSchema extends IndexSchema {
     @Override
     public Integer call() throws Exception {
       int remoteVersion = -1;
-      try (Http2SolrClient solr = new Http2SolrClient.Builder(coreUrl).markInternalRequest().build()) {
+
         // eventually, this loop will get killed by the ExecutorService's timeout
         while (remoteVersion == -1 || remoteVersion < expectedZkVersion) {
           try {
-            NamedList<Object> zkversionResp = solr.request(this);
+            if (isClosed.isClosed()) {
+              return -1;
+            }
+            NamedList<Object> zkversionResp = solrClient.request(this);
             if (zkversionResp != null)
               remoteVersion = (Integer)zkversionResp.get("zkversion");
 
             if (remoteVersion < expectedZkVersion) {
+              if (isClosed.isClosed()) {
+                return -1;
+              }
               // rather than waiting and re-polling, let's be proactive and tell the replica
               // to refresh its schema from ZooKeeper, if that fails, then the
               Thread.sleep(500); // slight delay before requesting version again
@@ -350,7 +360,6 @@ public final class ManagedIndexSchema extends IndexSchema {
 
           } catch (Exception e) {
             if (e instanceof InterruptedException) {
-              ParWork.propegateInterrupt(e);
               break; // stop looping
             } else if (e instanceof  KeeperException.SessionExpiredException) {
               break; // stop looping
@@ -359,7 +368,7 @@ public final class ManagedIndexSchema extends IndexSchema {
             }
           }
         }
-      }
+
       return remoteVersion;
     }
 
diff --git a/solr/core/src/java/org/apache/solr/schema/SchemaManager.java b/solr/core/src/java/org/apache/solr/schema/SchemaManager.java
index a85620e..855b2cc 100644
--- a/solr/core/src/java/org/apache/solr/schema/SchemaManager.java
+++ b/solr/core/src/java/org/apache/solr/schema/SchemaManager.java
@@ -19,6 +19,7 @@ package org.apache.solr.schema;
 import org.apache.solr.cloud.ZkController;
 import org.apache.solr.cloud.ZkSolrResourceLoader;
 import org.apache.solr.common.SolrException;
+import org.apache.solr.common.cloud.ConnectionManager;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.util.CommandOperation;
 import org.apache.solr.common.util.TimeSource;
@@ -62,11 +63,13 @@ public class SchemaManager {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   final SolrQueryRequest req;
+  private final ConnectionManager.IsClosed isClosed;
   ManagedIndexSchema managedIndexSchema;
   int timeout;
 
-  public SchemaManager(SolrQueryRequest req){
+  public SchemaManager(SolrQueryRequest req, ConnectionManager.IsClosed isClosed){
     this.req = req;
+    this.isClosed = isClosed;
     //The default timeout is 10 minutes when no BaseSolrResource.UPDATE_TIMEOUT_SECS is specified
     timeout = req.getParams().getInt(BaseSolrResource.UPDATE_TIMEOUT_SECS, 600);
 
@@ -82,6 +85,10 @@ public class SchemaManager {
    * @return List of errors. If the List is empty then the operation was successful.
    */
   public List performOperations() throws Exception {
+    if (isClosed.isClosed()) {
+      return Collections.singletonList("Already Closed");
+    }
+
     List<CommandOperation> ops = req.getCommands(false);
     List errs = CommandOperation.captureErrors(ops);
     if (!errs.isEmpty()) return errs;
@@ -129,6 +136,11 @@ public class SchemaManager {
             latestVersion = ZkController.persistConfigResourceToZooKeeper
                 (zkLoader, managedIndexSchema.getSchemaZkVersion(), managedIndexSchema.getResourceName(),
                  sw.toString().getBytes(StandardCharsets.UTF_8), true);
+
+            if (isClosed.isClosed()) {
+              return Collections.singletonList("Already Closed");
+            }
+
             req.getCore().getCoreContainer().reload(req.getCore().getName());
             break;
           } catch (ZkController.ResourceModifiedInZkException e) {
@@ -139,6 +151,11 @@ public class SchemaManager {
             //only for non cloud stuff
             managedIndexSchema.persistManagedSchema(false);
             core.setLatestSchema(managedIndexSchema);
+
+            if (isClosed.isClosed()) {
+              return Collections.singletonList("Already Closed");
+            }
+
             core.getCoreContainer().reload(core.getName());
           } catch (SolrException e) {
             log.warn(errorMsg);
@@ -170,7 +187,7 @@ public class SchemaManager {
             "Not enough time left to update replicas. However, the schema is updated already.");
       }
       ManagedIndexSchema.waitForSchemaZkVersionAgreement(collection, cd.getCloudDescriptor().getCoreNodeName(),
-          latestVersion, core.getCoreContainer().getZkController(), (int) timeOut.timeLeft(TimeUnit.SECONDS));
+          latestVersion, core.getCoreContainer().getZkController(), (int) timeOut.timeLeft(TimeUnit.SECONDS), isClosed);
     }
   }
 


[lucene-solr] 02/03: @807 Fix jetty solr scheduler.

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 95af4990496958b31c0173eef1e7012bfce23a09
Author: markrmiller@gmail.com <ma...@gmail.com>
AuthorDate: Mon Sep 7 23:45:16 2020 -0500

    @807 Fix jetty solr scheduler.
---
 .../ltr/src/test/org/apache/solr/ltr/TestRerankBase.java  |  6 ++++--
 .../solr/client/solrj/embedded/JettySolrRunner.java       | 15 ++++++---------
 .../solr/common/util/SolrScheduledExecutorScheduler.java  |  2 +-
 .../src/java/org/apache/solr/util/RestTestBase.java       |  5 +----
 4 files changed, 12 insertions(+), 16 deletions(-)

diff --git a/solr/contrib/ltr/src/test/org/apache/solr/ltr/TestRerankBase.java b/solr/contrib/ltr/src/test/org/apache/solr/ltr/TestRerankBase.java
index 8b26bce..5f4c309 100644
--- a/solr/contrib/ltr/src/test/org/apache/solr/ltr/TestRerankBase.java
+++ b/solr/contrib/ltr/src/test/org/apache/solr/ltr/TestRerankBase.java
@@ -32,6 +32,7 @@ import java.util.SortedMap;
 import java.util.TreeMap;
 
 import org.apache.commons.io.FileUtils;
+import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.util.ContentStream;
 import org.apache.solr.common.util.ContentStreamBase;
@@ -78,6 +79,7 @@ public class TestRerankBase extends RestTestBase {
 
   final private static String SYSTEM_PROPERTY_SOLR_LTR_TRANSFORMER_FV_DEFAULTFORMAT = "solr.ltr.transformer.fv.defaultFormat";
   private static String defaultFeatureFormat;
+  protected static JettySolrRunner jetty;
 
   protected String chooseDefaultFeatureVector(String dense, String sparse) {
     if (defaultFeatureFormat == null) {
@@ -204,7 +206,7 @@ public class TestRerankBase extends RestTestBase {
         setupTestInit(solrconfig,schema,false);
     System.setProperty("enable.update.log", "false");
 
-    createJettyAndHarness(tmpSolrHome.getAbsolutePath(), solrconfig, schema,
+    jetty = createJettyAndHarness(tmpSolrHome.getAbsolutePath(), solrconfig, schema,
         "/solr", true, extraServlets);
   }
 
@@ -214,7 +216,7 @@ public class TestRerankBase extends RestTestBase {
     SortedMap<ServletHolder,String> extraServlets =
         setupTestInit(solrconfig,schema,true);
 
-    createJettyAndHarness(tmpSolrHome.getAbsolutePath(), solrconfig, schema,
+    jetty = createJettyAndHarness(tmpSolrHome.getAbsolutePath(), solrconfig, schema,
         "/solr", true, extraServlets);
   }
 
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 ee50dce..d0e5eab 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
@@ -144,7 +144,7 @@ public class JettySolrRunner implements Closeable {
   private volatile boolean isClosed;
 
 
-  private static final Scheduler scheduler = new SolrScheduledExecutorScheduler("JettySolrRunnerScheduler");
+  private final Scheduler scheduler;
   private volatile SolrQueuedThreadPool qtp;
   private volatile boolean closed;
 
@@ -270,6 +270,11 @@ public class JettySolrRunner implements Closeable {
    */
   public JettySolrRunner(String solrHome, Properties nodeProperties, JettyConfig config, boolean enableProxy) {
     assert ObjectReleaseTracker.track(this);
+
+    SecurityManager s = System.getSecurityManager();
+    ThreadGroup group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup();
+    scheduler = new SolrScheduledExecutorScheduler("jetty-scheduler", null, group);
+
     this.enableProxy = enableProxy;
     this.solrHome = solrHome;
     this.config = config;
@@ -696,14 +701,6 @@ public class JettySolrRunner implements Closeable {
         throw new RuntimeException(e);
       }
 
-      try {
-        if (config.qtp == null) {
-          qtp.close();
-        }
-      } catch (Exception e) {
-        ParWork.propegateInterrupt(e);
-      }
-
       if (wait && coreContainer != null && coreContainer
           .isZooKeeperAware()) {
         log.info("waitForJettyToStop: {}", getLocalPort());
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/SolrScheduledExecutorScheduler.java b/solr/solrj/src/java/org/apache/solr/common/util/SolrScheduledExecutorScheduler.java
index 3d0fb0e..8341090 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/SolrScheduledExecutorScheduler.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/SolrScheduledExecutorScheduler.java
@@ -100,11 +100,11 @@ public class SolrScheduledExecutorScheduler extends AbstractLifeCycle implements
   protected void doStop() throws Exception {
     ScheduledThreadPoolExecutor fscheduler = scheduler;
     if (fscheduler != null) {
-      super.doStop();
       fscheduler.shutdown();
       fscheduler.awaitTermination(3, TimeUnit.SECONDS); // nocommit - trying something
       fscheduler.shutdownNow();
       ExecutorUtil.awaitTermination(fscheduler);
+      super.doStop();
     }
     scheduler = null;
   }
diff --git a/solr/test-framework/src/java/org/apache/solr/util/RestTestBase.java b/solr/test-framework/src/java/org/apache/solr/util/RestTestBase.java
index fca3a6b..0a383ef 100644
--- a/solr/test-framework/src/java/org/apache/solr/util/RestTestBase.java
+++ b/solr/test-framework/src/java/org/apache/solr/util/RestTestBase.java
@@ -39,7 +39,6 @@ import java.util.SortedMap;
 abstract public class RestTestBase extends SolrJettyTestBase {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   protected static volatile RestTestHarness restTestHarness;
-  protected static JettySolrRunner jetty;
 
   @AfterClass
   public synchronized static void cleanUpHarness() throws IOException {
@@ -51,9 +50,7 @@ abstract public class RestTestBase extends SolrJettyTestBase {
       (String solrHome, String configFile, String schemaFile, String context,
        boolean stopAtShutdown, SortedMap<ServletHolder,String> extraServlets) throws Exception {
 
-    jetty = createAndStartJetty(
-        solrHome, configFile, schemaFile, context, stopAtShutdown,
-        extraServlets);
+    JettySolrRunner jetty = createAndStartJetty(solrHome, configFile, schemaFile, context, stopAtShutdown, extraServlets);
     if (restTestHarness != null) {
       restTestHarness.close();
     }