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/11/09 15:14:13 UTC
[lucene-solr] 02/02: @1117 Make core close get the reload lock.
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 0535e62ed65125a01483f9fef03c8a15d58bf1c8
Author: markrmiller@gmail.com <ma...@gmail.com>
AuthorDate: Mon Nov 9 09:13:40 2020 -0600
@1117 Make core close get the reload lock.
---
.../java/org/apache/solr/core/CoreContainer.java | 27 ++++++++++++---------
.../src/java/org/apache/solr/core/SolrCore.java | 28 +++++++++++++++-------
2 files changed, 36 insertions(+), 19 deletions(-)
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 408d601..b857a7d 100644
--- a/solr/core/src/java/org/apache/solr/core/CoreContainer.java
+++ b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
@@ -1626,18 +1626,23 @@ public class CoreContainer implements Closeable {
solrCores.waitForLoadingCoreToFinish(name, 15000);
ConfigSet coreConfig = coreConfigService.loadConfigSet(cd);
log.info("Reloading SolrCore '{}' using configuration from {}", name, coreConfig.getName());
- newCore = core.reload(coreConfig);
-
DocCollection docCollection = null;
- if (getZkController() != null) {
- docCollection = getZkController().getClusterState().getCollection(cd.getCollectionName());
- // turn off indexing now, before the new core is registered
- if (docCollection.getBool(ZkStateReader.READ_ONLY, false)) {
- newCore.readOnly = true;
- }
- }
-
- registerCore(cd, newCore, false, false);
+ newCore = core.reload(coreConfig);
+ try {
+ if (getZkController() != null) {
+ docCollection = getZkController().getClusterState().getCollection(cd.getCollectionName());
+ // turn off indexing now, before the new core is registered
+ if (docCollection.getBool(ZkStateReader.READ_ONLY, false)) {
+ newCore.readOnly = true;
+ }
+ }
+
+ registerCore(cd, newCore, false, false);
+ } catch (Exception e) {
+ log.error("Exception registering reloaded core", e);
+ newCore.close();
+ throw new SolrException(ErrorCode.SERVER_ERROR, e);
+ }
// force commit on old core if the new one is readOnly and prevent any new updates
if (newCore.readOnly) {
diff --git a/solr/core/src/java/org/apache/solr/core/SolrCore.java b/solr/core/src/java/org/apache/solr/core/SolrCore.java
index bded8f3..bbc1837 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrCore.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrCore.java
@@ -710,6 +710,10 @@ public final class SolrCore implements SolrInfoBean, Closeable {
public SolrCore reload(ConfigSet coreConfig) throws IOException {
log.info("Reload SolrCore");
+
+ if (isClosed || isClosing()) {
+ throw new AlreadyClosedException();
+ }
// only one reload at a time
synchronized (getUpdateHandler().getSolrCoreState().getReloadLock()) {
final SolrCore currentCore;
@@ -992,7 +996,7 @@ public final class SolrCore implements SolrInfoBean, Closeable {
// Initialize the RestManager
restManager = initRestManager(cd);
-
+
// Initialize the metrics manager
this.coreMetricManager = initCoreMetricManager(solrConfig);
solrMetricsContext = coreMetricManager.getSolrMetricsContext();
@@ -1586,9 +1590,19 @@ public final class SolrCore implements SolrInfoBean, Closeable {
*/
@Override
public void close() {
+ if (getUpdateHandler() != null && getUpdateHandler().getSolrCoreState() != null) {
+ synchronized (getUpdateHandler().getSolrCoreState().getReloadLock()) {
+ doClose();
+ }
+ } else {
+ doClose();
+ }
+ }
+
+ private void doClose() {
int count = refCount.decrementAndGet();
if (log.isTraceEnabled()) log.trace("close refcount {} {}", this, count);
- if (count > 0) return; // close is called often, and only actually closes if nothing is using it.
+ if (count > 0) return;
if (count < 0) {
log.warn("Too many close [count:{}] on {}", count, this);
throw new SolrException(ErrorCode.SERVER_ERROR, "Too many closes on SolrCore");
@@ -1624,7 +1638,7 @@ public final class SolrCore implements SolrInfoBean, Closeable {
closeCalls.addAll(closeHookCalls);
if (unregisterMetrics) {
closeCalls.add(() -> {
- // IOUtils.closeQuietly(coreMetricManager);
+ // IOUtils.closeQuietly(coreMetricManager);
return "SolrCoreMetricManager";
});
}
@@ -1676,7 +1690,8 @@ public final class SolrCore implements SolrInfoBean, Closeable {
searcher.get().close();
} catch (IOException e) {
log.error("", e);
- } _realtimeSearchers.clear();
+ }
+ _realtimeSearchers.clear();
}
_searchers.clear();
for (RefCounted<SolrIndexSearcher> searcher : _realtimeSearchers) {
@@ -1706,7 +1721,7 @@ public final class SolrCore implements SolrInfoBean, Closeable {
closer.collect();
assert ObjectReleaseTracker.release(searcherExecutor);
- closer.collect("", ()->{
+ closer.collect("", () -> {
if (!searcherExecutor.isTerminated()) {
searcherExecutor.shutdownNow();
}
@@ -1742,8 +1757,6 @@ public final class SolrCore implements SolrInfoBean, Closeable {
closer.collect("PostCloseHooks", closeHookCalls);
-
-
} finally {
infoRegistry.clear();
@@ -1755,7 +1768,6 @@ public final class SolrCore implements SolrInfoBean, Closeable {
}
assert ObjectReleaseTracker.release(this);
}
-
}
/**