SOLR-8615: Just like creating cores, we should use multiple threads when closing cores.

This commit is contained in:
markrmiller 2016-02-08 20:41:04 -05:00
parent 784124e100
commit ea21b8fae8
2 changed files with 30 additions and 9 deletions

View File

@ -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
----------------------

View File

@ -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<SolrCore>() {
@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);
}