You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by dw...@apache.org on 2021/03/10 09:56:12 UTC

[lucene] 16/42: merging w/ master

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

dweiss pushed a commit to branch jira/solr14155-1
in repository https://gitbox.apache.org/repos/asf/lucene.git

commit 871acb6f791bf78f1772a020bd41e015775f8489
Author: noblepaul <no...@gmail.com>
AuthorDate: Thu Jul 16 16:27:02 2020 +1000

    merging w/ master
---
 .../src/java/org/apache/solr/core/ConfigSet.java   | 26 ++++++++++++++++---
 .../java/org/apache/solr/core/CoreContainer.java   |  3 ++-
 .../src/java/org/apache/solr/core/PluginInfo.java  |  6 +++++
 .../java/org/apache/solr/core/SolrClassLoader.java |  4 +--
 .../src/java/org/apache/solr/core/SolrCore.java    | 30 ++++++++++++----------
 .../org/apache/solr/core/SolrResourceLoader.java   |  5 ++--
 .../java/org/apache/solr/pkg/PackageListeners.java | 17 +++++-------
 .../solr/pkg/PackageListeningClassLoader.java      |  8 +++---
 .../org/apache/solr/pkg/PackagePluginHolder.java   |  2 +-
 9 files changed, 62 insertions(+), 39 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/core/ConfigSet.java b/solr/core/src/java/org/apache/solr/core/ConfigSet.java
index d6cb31d..8112477 100644
--- a/solr/core/src/java/org/apache/solr/core/ConfigSet.java
+++ b/solr/core/src/java/org/apache/solr/core/ConfigSet.java
@@ -19,6 +19,7 @@ package org.apache.solr.core;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.schema.IndexSchema;
 
+
 /**
  * Stores a core's configuration in the form of a SolrConfig and IndexSchema.
  * Immutable.
@@ -30,7 +31,7 @@ public class ConfigSet {
 
   private final SolrConfig solrconfig;
 
-  private final IndexSchema indexSchema;
+  private final SchemaSupplier schemaSupplier;
 
   @SuppressWarnings({"rawtypes"})
   private final NamedList properties;
@@ -38,11 +39,11 @@ public class ConfigSet {
   private final boolean trusted;
 
   @SuppressWarnings({"rawtypes"})
-  public ConfigSet(String name, SolrConfig solrConfig, IndexSchema indexSchema,
+  public ConfigSet(String name, SolrConfig solrConfig, SchemaSupplier indexSchemaSupplier,
       NamedList properties, boolean trusted) {
     this.name = name;
     this.solrconfig = solrConfig;
-    this.indexSchema = indexSchema;
+    this.schemaSupplier = indexSchemaSupplier;
     this.properties = properties;
     this.trusted = trusted;
   }
@@ -55,8 +56,15 @@ public class ConfigSet {
     return solrconfig;
   }
 
+  /**
+   *
+   * @param forceFetch get a fresh value and not cached value
+   */
+  public IndexSchema getIndexSchema(boolean forceFetch) {
+    return schemaSupplier.get(forceFetch);
+  }
   public IndexSchema getIndexSchema() {
-    return indexSchema;
+    return schemaSupplier.get(false);
   }
 
   @SuppressWarnings({"rawtypes"})
@@ -67,4 +75,14 @@ public class ConfigSet {
   public boolean isTrusted() {
     return trusted;
   }
+
+  /**Provide a Schema object on demand
+   * We want IndexSchema Objects to be lazily instantiated because when a configset is
+   * created the {@link SolrResourceLoader} associated with it is not associated with a core
+   * So, we may not be able to update the core if we the schema classes are updated
+   * */
+  interface SchemaSupplier {
+     IndexSchema get(boolean forceFetch);
+
+  }
 }
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 c01e021..4e9078d 100644
--- a/solr/core/src/java/org/apache/solr/core/CoreContainer.java
+++ b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
@@ -1603,7 +1603,8 @@ public class CoreContainer {
    * and processed by the old core
    *
    * @param name the name of the SolrCore to reload
-   * @param coreId The unique Id of the core
+   * @param coreId The unique Id of the core {@link SolrCore#uniqueId}. If this is null, it's reloaded anyway. If the current
+   *               core has a different id, this is a no-op
    */
   public void reload(String name, UUID coreId) {
     if (isShutDown) {
diff --git a/solr/core/src/java/org/apache/solr/core/PluginInfo.java b/solr/core/src/java/org/apache/solr/core/PluginInfo.java
index 3a0de71..ae13fca 100644
--- a/solr/core/src/java/org/apache/solr/core/PluginInfo.java
+++ b/solr/core/src/java/org/apache/solr/core/PluginInfo.java
@@ -73,8 +73,10 @@ public class PluginInfo implements MapSerializable {
   public static class ClassName {
     public final String pkg;
     public final String className;
+    public final String original;
 
     public ClassName(String name) {
+      this.original = name;
       if (name == null) {
         pkg = null;
         className = null;
@@ -90,6 +92,10 @@ public class PluginInfo implements MapSerializable {
       }
     }
 
+    @Override
+    public String toString() {
+      return original;
+    }
   }
 
 
diff --git a/solr/core/src/java/org/apache/solr/core/SolrClassLoader.java b/solr/core/src/java/org/apache/solr/core/SolrClassLoader.java
index 2e04027..7973b63 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrClassLoader.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrClassLoader.java
@@ -17,9 +17,7 @@
 package org.apache.solr.core;
 
 
-/**
- * A generic interface to load plugin classes
- */
+/** A generic interface to load plugin classes */
 public interface SolrClassLoader {
 
     <T> T newInstance(String cname, Class<T> expectedType, String... subpackages);
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 77cb091..714af89 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrCore.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrCore.java
@@ -112,10 +112,7 @@ import org.apache.solr.logging.MDCLoggingContext;
 import org.apache.solr.metrics.SolrCoreMetricManager;
 import org.apache.solr.metrics.SolrMetricProducer;
 import org.apache.solr.metrics.SolrMetricsContext;
-import org.apache.solr.pkg.PackageListeningClassLoader;
-import org.apache.solr.pkg.PackageListeners;
-import org.apache.solr.pkg.PackageLoader;
-import org.apache.solr.pkg.PackagePluginHolder;
+import org.apache.solr.pkg.*;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.request.SolrRequestHandler;
 import org.apache.solr.response.BinaryResponseWriter;
@@ -229,9 +226,11 @@ public final class SolrCore implements SolrInfoBean, Closeable {
   private final Codec codec;
   private final MemClassLoader memClassLoader;
 
-  private final CircuitBreakerManager circuitBreakerManager;
   //a single package listener for all cores that require core reloading
-  private final PackageListeningClassLoader coreReloadingPackageListener;
+  private final PackageListeningClassLoader coreReloadingClassLoader;
+  //singleton listener for all packages used in schema
+  private final PackageListeningClassLoader schemaPluginsLoader;
+  private final CircuitBreakerManager circuitBreakerManager;
   private final List<Runnable> confListeners = new CopyOnWriteArrayList<>();
 
   private final ReentrantLock ruleExpiryLock;
@@ -278,9 +277,6 @@ public final class SolrCore implements SolrInfoBean, Closeable {
     return restManager;
   }
 
-  public PackageListeningClassLoader getCoreReloadingPackageListener(){
-    return coreReloadingPackageListener;
-  }
   public PackageListeners getPackageListeners() {
     return packageListeners;
   }
@@ -738,7 +734,7 @@ public final class SolrCore implements SolrInfoBean, Closeable {
     final RecoveryStrategy.Builder rsBuilder;
     if (info != null && info.className != null) {
       log.info(info.className);
-      rsBuilder = getResourceLoader().newInstance( info, RecoveryStrategy.Builder.class, true);
+      rsBuilder = getResourceLoader().newInstance(info, RecoveryStrategy.Builder.class, true);
     } else {
       log.debug("solr.RecoveryStrategy.Builder");
       rsBuilder = new RecoveryStrategy.Builder();
@@ -948,20 +944,24 @@ public final class SolrCore implements SolrInfoBean, Closeable {
     final CountDownLatch latch = new CountDownLatch(1);
 
     try {
-      IndexSchema schema = configSet.getIndexSchema();
 
       CoreDescriptor cd = Objects.requireNonNull(coreDescriptor, "coreDescriptor cannot be null");
       coreContainer.solrCores.addCoreDescriptor(cd);
 
       setName(name);
-
       this.solrConfig = configSet.getSolrConfig();
       this.resourceLoader = configSet.getSolrConfig().getResourceLoader();
       this.resourceLoader.core = this;
-      this.coreReloadingPackageListener = new PackageListeningClassLoader(coreContainer,
+      schemaPluginsLoader = new PackageListeningClassLoader(coreContainer, resourceLoader,
+              solrConfig::maxPackageVersion,
+              () -> setLatestSchema(configSet.getIndexSchema(true)));
+      this.packageListeners.addListener(schemaPluginsLoader);
+      IndexSchema schema = configSet.getIndexSchema();
+      this.coreReloadingClassLoader = new PackageListeningClassLoader(coreContainer,
               resourceLoader,
               solrConfig::maxPackageVersion,
               () -> coreContainer.reload(name, uniqueId));
+      this.packageListeners.addListener(coreReloadingClassLoader);
       this.configSetProperties = configSet.getProperties();
       // Initialize the metrics manager
       this.coreMetricManager = initCoreMetricManager(solrConfig);
@@ -3255,6 +3255,9 @@ public final class SolrCore implements SolrInfoBean, Closeable {
     return blobRef;
   }
 
+  public PackageListeningClassLoader getCoreReloadingClassLoader(){
+    return coreReloadingClassLoader;
+  }
   /**
    * Run an arbitrary task in it's own thread. This is an expert option and is
    * a method you should use with great care. It would be bad to run something that never stopped
@@ -3276,5 +3279,4 @@ public final class SolrCore implements SolrInfoBean, Closeable {
   public void runAsync(Runnable r) {
     coreAsyncTaskExecutor.submit(r);
   }
-
 }
diff --git a/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java b/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java
index 83b905f..082fe2a 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java
@@ -84,7 +84,6 @@ public class SolrResourceLoader implements ResourceLoader, Closeable, SolrClassL
    * This could be null if the core is not yet initialized
    */
   SolrCore core;
-  CoreContainer coreContainer;
 
   private final List<SolrCoreAware> waitingForCore = Collections.synchronizedList(new ArrayList<SolrCoreAware>());
   private final List<SolrInfoBean> infoMBeans = Collections.synchronizedList(new ArrayList<SolrInfoBean>());
@@ -784,9 +783,9 @@ public class SolrResourceLoader implements ResourceLoader, Closeable, SolrClassL
       if (getCore() == null) {
         throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "SolrCore not set");
       }
-      return fun.apply(getCore().getCoreReloadingPackageListener().findPackageVersion(cName, true));
+      return fun.apply(getCore().getCoreReloadingClassLoader().findPackageVersion(cName, true));
     } else {
-      return fun.apply(getCore().getCoreReloadingPackageListener().findPackageVersion(cName, false));
+      return fun.apply(getCore().getCoreReloadingClassLoader().findPackageVersion(cName, false));
     }
   }
 
diff --git a/solr/core/src/java/org/apache/solr/pkg/PackageListeners.java b/solr/core/src/java/org/apache/solr/pkg/PackageListeners.java
index 2d3a5be..1895b6d 100644
--- a/solr/core/src/java/org/apache/solr/pkg/PackageListeners.java
+++ b/solr/core/src/java/org/apache/solr/pkg/PackageListeners.java
@@ -22,6 +22,7 @@ import java.lang.ref.Reference;
 import java.lang.ref.SoftReference;
 import java.util.*;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.function.Consumer;
 
 import org.apache.solr.common.MapWriter;
 import org.apache.solr.core.PluginInfo;
@@ -34,7 +35,7 @@ public class PackageListeners {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   public static final String PACKAGE_VERSIONS = "PKG_VERSIONS";
-  private SolrCore core;
+  private final SolrCore core;
 
   public PackageListeners(SolrCore core) {
     this.core = core;
@@ -70,7 +71,7 @@ public class PackageListeners {
         invokeListeners(pkgInfo, ctx);
       }
     } finally {
-      ctx.runLaterTasks();
+      ctx.runLaterTasks(core::runAsync);
       MDCLoggingContext.clear();
     }
   }
@@ -126,15 +127,11 @@ public class PackageListeners {
         runLater.put(name, runnable);
       }
 
-      private void runLaterTasks() {
+      private void runLaterTasks(Consumer<Runnable> runnableExecutor) {
         if (runLater == null) return;
-        new Thread(() -> runLater.forEach((s, runnable) -> {
-          try {
-            runnable.run();
-          } catch (Exception e) {
-            log.error("Unknown error", e);
-          }
-        })).start();
+        for (Runnable r : runLater.values()) {
+          runnableExecutor.accept(r);
+        }
       }
     }
 
diff --git a/solr/core/src/java/org/apache/solr/pkg/PackageListeningClassLoader.java b/solr/core/src/java/org/apache/solr/pkg/PackageListeningClassLoader.java
index 66b4c6f..6b66d84 100644
--- a/solr/core/src/java/org/apache/solr/pkg/PackageListeningClassLoader.java
+++ b/solr/core/src/java/org/apache/solr/pkg/PackageListeningClassLoader.java
@@ -32,8 +32,8 @@ import java.util.Objects;
 import java.util.function.Function;
 /**
  * A {@link SolrClassLoader} that is designed to listen to a set of packages.
- * This class would register a listener each package that is loaded through this
- * if any of those packages are updated , the onReload runnable is executed
+ * This class registers a listener for each package that is loaded through this.
+ * If any of those packages are updated, the onReload runnable is run
  * */
 public class PackageListeningClassLoader implements SolrClassLoader , PackageListeners.Listener {
     private final CoreContainer coreContainer;
@@ -72,6 +72,7 @@ public class PackageListeningClassLoader implements SolrClassLoader , PackageLis
         } else {
             PackageLoader.Package.Version version = findPackageVersion(cName, true);
             return applyResourceLoaderAware(version, version.getLoader().newInstance(cName.className, expectedType, subpackages));
+
         }
     }
 
@@ -127,6 +128,7 @@ public class PackageListeningClassLoader implements SolrClassLoader , PackageLis
         } else {
             PackageLoader.Package.Version version = findPackageVersion(cName, true);
             return version.getLoader().findClass(cName.className, expectedType);
+
         }
     }
 
@@ -158,4 +160,4 @@ public class PackageListeningClassLoader implements SolrClassLoader , PackageLis
         }
         ctx.runLater(null, onReload);
     }
-}
\ No newline at end of file
+}
diff --git a/solr/core/src/java/org/apache/solr/pkg/PackagePluginHolder.java b/solr/core/src/java/org/apache/solr/pkg/PackagePluginHolder.java
index d64ef58..0c6fd80 100644
--- a/solr/core/src/java/org/apache/solr/pkg/PackagePluginHolder.java
+++ b/solr/core/src/java/org/apache/solr/pkg/PackagePluginHolder.java
@@ -69,7 +69,7 @@ public class PackagePluginHolder<T> extends PluginBag.PluginHolder<T> {
 
       @Override
       public MapWriter getPackageVersion(PluginInfo.ClassName cName) {
-        return pkgVersion;
+        return pkgVersion == null ? null : ew -> pkgVersion.writeMap(ew);
       }
 
     });