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/07/13 14:58:58 UTC

[lucene-solr] 02/02: #112 - Tighten SolrCore leak prevention.

This is an automated email from the ASF dual-hosted git repository.

markrmiller pushed a commit to branch reference_impl
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git

commit ea6476de3ca91b6929bf1b85a41b355507ee6931
Author: markrmiller@gmail.com <ma...@gmail.com>
AuthorDate: Mon Jul 13 09:58:30 2020 -0500

    #112 - Tighten SolrCore leak prevention.
---
 solr/core/src/java/org/apache/solr/core/CoreContainer.java |  4 ++--
 solr/core/src/java/org/apache/solr/core/SolrCores.java     | 11 +++++++++--
 2 files changed, 11 insertions(+), 4 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 cf125f3..029bdff 100644
--- a/solr/core/src/java/org/apache/solr/core/CoreContainer.java
+++ b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
@@ -1651,8 +1651,8 @@ public class CoreContainer implements Closeable {
         coreInitFailures.put(cd.getName(), new CoreLoadFailure(cd, e));
         throw new SolrException(ErrorCode.SERVER_ERROR, "Unable to reload core [" + cd.getName() + "]", e);
       } finally {
-        if (!success && newCore != null && newCore.getOpenCount() > 0) {
-          IOUtils.closeQuietly(newCore);
+        if (!success && newCore != null) {
+          ParWork.close(newCore);
         }
         solrCores.removeFromPendingOps(cd.getName());
       }
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 e9e1ddf..89067ae 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrCores.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrCores.java
@@ -127,7 +127,7 @@ class SolrCores implements Closeable {
     if (transientSolrCoreCache != null) {
       coreList.addAll(transientSolrCoreCache.prepareForShutdown());
     }
-
+    cores.clear();
     coreList.addAll(pendingCloses);
     pendingCloses.forEach((c) -> coreList.add(c));
 
@@ -159,6 +159,9 @@ class SolrCores implements Closeable {
   // Returns the old core if there was a core of the same name.
   //WARNING! This should be the _only_ place you put anything into the list of transient cores!
   protected SolrCore putCore(CoreDescriptor cd, SolrCore core) {
+    if (isClosed()) {
+      throw new AlreadyClosedException();
+    }
     if (cd.isTransient()) {
       if (getTransientCacheHandler() != null) {
         return getTransientCacheHandler().addCore(cd.getName(), core);
@@ -246,7 +249,7 @@ class SolrCores implements Closeable {
   }
 
   protected void swap(String n0, String n1) {
-    if (closed) {
+    if (isClosed()) {
       throw new AlreadyClosedException();
     }
     synchronized (cores) {
@@ -281,6 +284,10 @@ class SolrCores implements Closeable {
 
   }
 
+  private boolean isClosed() {
+    return closed || container.isShutDown();
+  }
+
   protected SolrCore remove(String name) {
     SolrCore ret = cores.remove(name);
     // It could have been a newly-created core. It could have been a transient core. The newly-created cores