SOLR-10193: Improve MiniSolrCloudCluster#shutdown.

This commit is contained in:
markrmiller 2017-02-22 15:58:12 -05:00
parent d6337ac3e5
commit 29a5ea44a7

View File

@ -36,7 +36,6 @@ import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import org.apache.solr.client.solrj.embedded.JettyConfig; import org.apache.solr.client.solrj.embedded.JettyConfig;
@ -50,6 +49,7 @@ import org.apache.solr.common.cloud.SolrZkClient;
import org.apache.solr.common.cloud.ZkConfigManager; import org.apache.solr.common.cloud.ZkConfigManager;
import org.apache.solr.common.cloud.ZkStateReader; import org.apache.solr.common.cloud.ZkStateReader;
import org.apache.solr.common.util.ExecutorUtil; import org.apache.solr.common.util.ExecutorUtil;
import org.apache.solr.common.util.IOUtils;
import org.apache.solr.common.util.SolrjNamedThreadFactory; import org.apache.solr.common.util.SolrjNamedThreadFactory;
import org.apache.solr.core.CoreContainer; import org.apache.solr.core.CoreContainer;
import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.KeeperException;
@ -97,7 +97,8 @@ public class MiniSolrCloudCluster {
private final CloudSolrClient solrClient; private final CloudSolrClient solrClient;
private final JettyConfig jettyConfig; private final JettyConfig jettyConfig;
private final ExecutorService executor = ExecutorUtil.newMDCAwareCachedThreadPool(new SolrjNamedThreadFactory("jetty-launcher")); private final ExecutorService executorLauncher = ExecutorUtil.newMDCAwareCachedThreadPool(new SolrjNamedThreadFactory("jetty-launcher"));
private final ExecutorService executorCloser = ExecutorUtil.newMDCAwareCachedThreadPool(new SolrjNamedThreadFactory("jetty-closer"));
private final AtomicInteger nodeIds = new AtomicInteger(); private final AtomicInteger nodeIds = new AtomicInteger();
@ -239,7 +240,7 @@ public class MiniSolrCloudCluster {
startups.add(() -> startJettySolrRunner(newNodeName(), jettyConfig.context, jettyConfig)); startups.add(() -> startJettySolrRunner(newNodeName(), jettyConfig.context, jettyConfig));
} }
Collection<Future<JettySolrRunner>> futures = executor.invokeAll(startups); Collection<Future<JettySolrRunner>> futures = executorLauncher.invokeAll(startups);
Exception startupError = checkForExceptions("Error starting up MiniSolrCloudCluster", futures); Exception startupError = checkForExceptions("Error starting up MiniSolrCloudCluster", futures);
if (startupError != null) { if (startupError != null) {
try { try {
@ -443,21 +444,23 @@ public class MiniSolrCloudCluster {
*/ */
public void shutdown() throws Exception { public void shutdown() throws Exception {
try { try {
if (solrClient != null)
solrClient.close(); IOUtils.closeQuietly(solrClient);
// accept no new tasks
executorLauncher.shutdown();
List<Callable<JettySolrRunner>> shutdowns = new ArrayList<>(jettys.size()); List<Callable<JettySolrRunner>> shutdowns = new ArrayList<>(jettys.size());
for (final JettySolrRunner jetty : jettys) { for (final JettySolrRunner jetty : jettys) {
shutdowns.add(() -> stopJettySolrRunner(jetty)); shutdowns.add(() -> stopJettySolrRunner(jetty));
} }
jettys.clear(); jettys.clear();
Collection<Future<JettySolrRunner>> futures = executor.invokeAll(shutdowns); Collection<Future<JettySolrRunner>> futures = executorCloser.invokeAll(shutdowns);
Exception shutdownError = checkForExceptions("Error shutting down MiniSolrCloudCluster", futures); Exception shutdownError = checkForExceptions("Error shutting down MiniSolrCloudCluster", futures);
if (shutdownError != null) { if (shutdownError != null) {
throw shutdownError; throw shutdownError;
} }
} finally { } finally {
executor.shutdown(); ExecutorUtil.shutdownAndAwaitTermination(executorLauncher);
executor.awaitTermination(15, TimeUnit.SECONDS); ExecutorUtil.shutdownAndAwaitTermination(executorCloser);
try { try {
if (!externalZkServer) { if (!externalZkServer) {
zkServer.shutdown(); zkServer.shutdown();