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/08/21 15:29:15 UTC

[lucene-solr] 01/02: @595 Tweak SolrCore close.

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 351566041ef265afa11a26065a4b4b024efd9e27
Author: markrmiller@gmail.com <ma...@gmail.com>
AuthorDate: Fri Aug 21 10:25:42 2020 -0500

    @595 Tweak SolrCore close.
---
 .../src/java/org/apache/solr/core/SolrCore.java    | 71 +++++++++-------------
 .../java/org/apache/solr/core/SolrTinyBuilder.java |  2 +
 2 files changed, 30 insertions(+), 43 deletions(-)

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 f988a7c..baf4985 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrCore.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrCore.java
@@ -195,8 +195,6 @@ public final class SolrCore implements SolrInfoBean, Closeable {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   private static final Logger requestLog = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass().getName() + ".Request");
   private static final Logger slowLog = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass().getName() + ".SlowRequest");
-  private final boolean failedCreation;
-
   private volatile String name;
   private String logid; // used to show what name is set
 
@@ -215,8 +213,8 @@ public final class SolrCore implements SolrInfoBean, Closeable {
   private final Date startTime = new Date();
   private final long startNanoTime = System.nanoTime();
   private final RequestHandlers reqHandlers;
-  private final PluginBag<SearchComponent> searchComponents = new PluginBag<>(SearchComponent.class, this, true);
-  private final PluginBag<UpdateRequestProcessorFactory> updateProcessors = new PluginBag<>(UpdateRequestProcessorFactory.class, this, true);
+  private final PluginBag<SearchComponent> searchComponents = new PluginBag<>(SearchComponent.class, this);
+  private final PluginBag<UpdateRequestProcessorFactory> updateProcessors = new PluginBag<>(UpdateRequestProcessorFactory.class, this);
   private final Map<String, UpdateRequestProcessorChain> updateProcessorChains;
   private final SolrCoreMetricManager coreMetricManager;
   private final Map<String, SolrInfoBean> infoRegistry = new ConcurrentHashMap<>(64, 0.75f, 6);
@@ -1108,7 +1106,6 @@ public final class SolrCore implements SolrInfoBean, Closeable {
       // should be fine, since counting down on a latch of 0 is still fine
       latch.countDown();
       ParWork.propegateInterrupt(e);
-      failedCreation1 = true;
       try {
         // close down the searcher and any other resources, if it exists, as this
         // is not recoverable
@@ -1126,12 +1123,8 @@ public final class SolrCore implements SolrInfoBean, Closeable {
       }
 
       throw new SolrException(ErrorCode.SERVER_ERROR, msg, e);
-    } finally {
-      // allow firstSearcher events to fire and make sure it is released
-      //latch.countDown();
     }
 
-    this.failedCreation = failedCreation1;
     assert ObjectReleaseTracker.track(this);
   }
 
@@ -1616,6 +1609,30 @@ public final class SolrCore implements SolrInfoBean, Closeable {
       });
 
 
+      closer.collect(searcherExecutor);
+      closer.collect("shutdown", () -> {
+
+        synchronized (searcherLock) {
+              for (RefCounted<SolrIndexSearcher> searcher : _searchers) {
+                try {
+                  searcher.get().close();
+                } catch (IOException e) {
+                  log.error("", e);
+                }          _realtimeSearchers.clear();
+              }
+              _searchers.clear();
+              for (RefCounted<SolrIndexSearcher> searcher : _realtimeSearchers) {
+                try {
+                  searcher.get().close();
+                } catch (IOException e) {
+                  log.error("", e);
+                }
+              }
+               _realtimeSearchers.clear();
+              closeSearcher();
+            }
+      });
+
       List<Callable<Object>> closeCalls = new ArrayList<Callable<Object>>();
       closeCalls.addAll(closeHookCalls);
       if (unregisterMetrics) {
@@ -1656,32 +1673,6 @@ public final class SolrCore implements SolrInfoBean, Closeable {
       closer.collect("SolrCoreInternals", closeCalls);
       closer.addCollect();
 
-      closer.collect("shutdown", () -> {
-
-        synchronized (searcherLock) {
-          while (onDeckSearchers.get() > 0) {
-            if (failedCreation) {
-              synchronized (searcherLock) {
-                for (RefCounted<SolrIndexSearcher> searcher : _searchers) {
-                  searcher.get().close();
-                }
-                for (RefCounted<SolrIndexSearcher> searcher : _realtimeSearchers) {
-                  searcher.get().close();
-                }
-              }
-            } else {
-              try {
-                searcherLock.wait(250); // nocommit
-              } catch (InterruptedException e) {
-                ParWork.propegateInterrupt(e);
-              } // nocommit
-            }
-          }
-        }
-        return "wait for on deck searchers";
-
-      });
-
       AtomicBoolean coreStateClosed = new AtomicBoolean(false);
 
       closer.collect("SolrCoreState", () -> {
@@ -1694,15 +1685,9 @@ public final class SolrCore implements SolrInfoBean, Closeable {
         coreStateClosed.set(closed);
         return solrCoreState;
       });
-      closer.addCollect();
 
       closer.collect(updateHandler);
-      closer.collect("closeSearcher", () -> {
-        closeSearcher();
-        //searcherExecutor.shutdownNow();
-      });
-    //  closer.addCollect();
-      closer.collect(searcherExecutor);
+
       closer.addCollect();
 
       closer.collect("CleanupOldIndexDirs", () -> {
@@ -1885,7 +1870,7 @@ public final class SolrCore implements SolrInfoBean, Closeable {
   private final LinkedList<RefCounted<SolrIndexSearcher>> _searchers = new LinkedList<>();
   private final LinkedList<RefCounted<SolrIndexSearcher>> _realtimeSearchers = new LinkedList<>();
 
-  final ExecutorService searcherExecutor = new ParWorkExecutor("searcherExecutor", 1, 1, 0, new BlockingArrayQueue());
+  final ExecutorService searcherExecutor = new ParWorkExecutor("searcherExecutor", 1, 1, 0, new ArrayBlockingQueue(4, true));
   private AtomicInteger onDeckSearchers = new AtomicInteger();  // number of searchers preparing
   // Lock ordering: one can acquire the openSearcherLock and then the searcherLock, but not vice-versa.
   private final Object searcherLock = new Object();  // the sync object for the searcher
diff --git a/solr/core/src/java/org/apache/solr/core/SolrTinyBuilder.java b/solr/core/src/java/org/apache/solr/core/SolrTinyBuilder.java
new file mode 100644
index 0000000..a41a02b
--- /dev/null
+++ b/solr/core/src/java/org/apache/solr/core/SolrTinyBuilder.java
@@ -0,0 +1,2 @@
+package org.apache.solr.core;public class SolrTinyBuilder {
+}