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/09/08 04:14:18 UTC

[lucene-solr] 01/05: @801 Add a close to the RestManager.

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 09379b7202bf893ad15908f713d89fea99b0d6bd
Author: markrmiller@gmail.com <ma...@gmail.com>
AuthorDate: Mon Sep 7 22:32:44 2020 -0500

    @801 Add a close to the RestManager.
---
 .../src/java/org/apache/solr/core/SolrCore.java    |  4 +++
 .../src/java/org/apache/solr/rest/RestManager.java | 29 +++++++++++++++++-----
 2 files changed, 27 insertions(+), 6 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 1cadb10..b2af1d2 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrCore.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrCore.java
@@ -1620,6 +1620,10 @@ public final class SolrCore implements SolrInfoBean, Closeable {
         });
       }
       closeCalls.add(() -> {
+        IOUtils.closeQuietly(restManager);
+        return "restManager";
+      });
+      closeCalls.add(() -> {
         IOUtils.closeQuietly(reqHandlers);
         return "reqHandlers";
       });
diff --git a/solr/core/src/java/org/apache/solr/rest/RestManager.java b/solr/core/src/java/org/apache/solr/rest/RestManager.java
index 8f5aa1b..c37ae35 100644
--- a/solr/core/src/java/org/apache/solr/rest/RestManager.java
+++ b/solr/core/src/java/org/apache/solr/rest/RestManager.java
@@ -16,6 +16,7 @@
  */
 package org.apache.solr.rest;
 
+import java.io.Closeable;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
@@ -34,6 +35,7 @@ import java.util.TreeMap;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.apache.solr.common.AlreadyClosedException;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.util.NamedList;
@@ -59,7 +61,7 @@ import static org.apache.solr.common.util.Utils.fromJSONString;
  * or /config base paths, depending on which base path is more appropriate
  * for the type of managed resource.
  */
-public class RestManager {
+public class RestManager implements Closeable {
   
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   
@@ -70,14 +72,15 @@ public class RestManager {
   private static final Pattern resourceIdRegex = Pattern.compile("(/config|/schema)(/.*)");
 
   private static final boolean DECODE = true;
+  private volatile boolean isClosed;
 
   /**
    * Used internally to keep track of registrations during core initialization
    */
   private static class ManagedResourceRegistration {
-    String resourceId;
-    Class<? extends ManagedResource> implClass;
-    Set<ManagedResourceObserver> observers = new LinkedHashSet<>();
+    final String resourceId;
+    final Class<? extends ManagedResource> implClass;
+    Set<ManagedResourceObserver> observers = Collections.synchronizedSet(new LinkedHashSet<>());
 
     private ManagedResourceRegistration(String resourceId,
                                         Class<? extends ManagedResource> implClass, 
@@ -464,6 +467,9 @@ public class RestManager {
      */
     @Override
     protected synchronized void reloadFromStorage() throws SolrException {
+      if (restManager.isClosed) {
+        throw new AlreadyClosedException();
+      }
       String resourceId = getResourceId();
       Object data = null;
       try {
@@ -492,7 +498,9 @@ public class RestManager {
     @Override
     protected void onManagedDataLoadedFromStorage(NamedList<?> managedInitArgs, Object managedData)
         throws SolrException {
-
+      if (restManager.isClosed) {
+        return;
+      }
       if (managedData == null) {
         // this is ok - just means no managed components have been added yet
         return;
@@ -647,12 +655,19 @@ public class RestManager {
     registry.initializedRestManager = this;
   }
 
+  public void close() {
+    this.isClosed = true;
+  }
+
   /**
    * If not already registered, registers the given {@link ManagedResource} subclass
    * at the given resourceId, creates an instance, and attaches it to the appropriate
    * Restlet router.  Returns the corresponding instance.
    */
   public synchronized ManagedResource addManagedResource(String resourceId, Class<? extends ManagedResource> clazz) {
+    if (isClosed) {
+      throw new AlreadyClosedException();
+    }
     final ManagedResource res;
     final ManagedResourceRegistration existingReg = registry.registered.get(resourceId);
     if (existingReg == null) {
@@ -687,11 +702,13 @@ public class RestManager {
     return res;
   }
 
-
   /**
    * Creates a ManagedResource using registration information. 
    */
   protected ManagedResource createManagedResource(ManagedResourceRegistration reg) throws SolrException {
+    if (isClosed) {
+      throw new AlreadyClosedException();
+    }
     ManagedResource res = null;
     try {
       Constructor<? extends ManagedResource> ctor =