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);
     }
-
   }
 
   /**