From ea21b8fae838da3c8cfe3f03f31cf7892369ad5e Mon Sep 17 00:00:00 2001 From: markrmiller Date: Mon, 8 Feb 2016 20:41:04 -0500 Subject: [PATCH] SOLR-8615: Just like creating cores, we should use multiple threads when closing cores. --- solr/CHANGES.txt | 3 ++ .../java/org/apache/solr/core/SolrCores.java | 36 ++++++++++++++----- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index ab2f02a4a99..f973822c357 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -483,6 +483,9 @@ Optimizations * SOLR-8501: Specify the entity request size when known in HttpSolrClient. (Mark Miller) +* SOLR-8615: Just like creating cores, we should use multiple threads when closing cores. + (Mark Miller) + Other Changes ---------------------- diff --git a/solr/core/src/java/org/apache/solr/core/SolrCores.java b/solr/core/src/java/org/apache/solr/core/SolrCores.java index 3d01d63198b..5980ca194ee 100644 --- a/solr/core/src/java/org/apache/solr/core/SolrCores.java +++ b/solr/core/src/java/org/apache/solr/core/SolrCores.java @@ -18,7 +18,9 @@ package org.apache.solr.core; import com.google.common.collect.Lists; import org.apache.solr.common.SolrException; +import org.apache.solr.common.util.ExecutorUtil; import org.apache.solr.logging.MDCLoggingContext; +import org.apache.solr.util.DefaultSolrThreadFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,7 +34,10 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; +import java.util.concurrent.Callable; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; @@ -117,19 +122,32 @@ class SolrCores { coreList.addAll(pendingCloses); pendingCloses.clear(); } - + for (SolrCore core : coreList) { - MDCLoggingContext.setCore(core); + ExecutorService coreCloseExecutor = ExecutorUtil.newMDCAwareFixedThreadPool(Integer.MAX_VALUE, + new DefaultSolrThreadFactory("coreCloseExecutor")); try { - core.close(); - } catch (Throwable e) { - SolrException.log(log, "Error shutting down core", e); - if (e instanceof Error) { - throw (Error) e; - } + coreCloseExecutor.submit(new Callable() { + @Override + public SolrCore call() throws Exception { + MDCLoggingContext.setCore(core); + try { + core.close(); + } catch (Throwable e) { + SolrException.log(log, "Error shutting down core", e); + if (e instanceof Error) { + throw (Error) e; + } + } finally { + MDCLoggingContext.clear(); + } + return core; + } + }); } finally { - MDCLoggingContext.clear(); + ExecutorUtil.shutdownAndAwaitTermination(coreCloseExecutor); } + } } while (coreList.size() > 0); }