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:06 UTC

[lucene] 10/42: moved some methods to SRL

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 0d6d206fcd846859c01be3fe31b552445ab1c71f
Author: noblepaul <no...@gmail.com>
AuthorDate: Wed Jul 15 10:40:30 2020 +1000

    moved some methods to SRL
---
 .../org/apache/solr/core/DirectoryFactory.java     |  4 +--
 .../src/java/org/apache/solr/core/SolrCore.java    |  9 +++--
 .../org/apache/solr/core/SolrResourceLoader.java   | 41 ++++++++++++++++++++++
 ...der.java => CoreRefreshingPackageListener.java} | 40 ++++-----------------
 .../java/org/apache/solr/search/CacheConfig.java   | 23 +++++++++---
 .../java/org/apache/solr/update/UpdateHandler.java |  3 +-
 6 files changed, 73 insertions(+), 47 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/core/DirectoryFactory.java b/solr/core/src/java/org/apache/solr/core/DirectoryFactory.java
index d8e1728..d83f0fa 100644
--- a/solr/core/src/java/org/apache/solr/core/DirectoryFactory.java
+++ b/solr/core/src/java/org/apache/solr/core/DirectoryFactory.java
@@ -36,7 +36,7 @@ import org.apache.lucene.store.IOContext;
 import org.apache.lucene.store.LockFactory;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.core.CachingDirectoryFactory.CloseListener;
-import org.apache.solr.pkg.CoreRefreshingClassLoader;
+import org.apache.solr.pkg.CoreRefreshingPackageListener;
 import org.apache.solr.util.plugin.NamedListInitializedPlugin;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -420,7 +420,7 @@ public abstract class DirectoryFactory implements NamedListInitializedPlugin,
     final DirectoryFactory dirFactory;
     if (info != null) {
       log.debug(info.className);
-      dirFactory = CoreRefreshingClassLoader.createInst(config.getResourceLoader(), info, DirectoryFactory.class);
+      dirFactory = CoreRefreshingPackageListener.createInst(config.getResourceLoader(), info, DirectoryFactory.class);
       // allow DirectoryFactory instances to access the CoreContainer
       dirFactory.initCoreContainer(cc);
       dirFactory.init(info.initArgs);
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 e5f8707..e8c38f1 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrCore.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrCore.java
@@ -112,7 +112,6 @@ 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.CoreRefreshingClassLoader;
 import org.apache.solr.pkg.PackageListeners;
 import org.apache.solr.pkg.PackageLoader;
 import org.apache.solr.pkg.PackagePluginHolder;
@@ -734,7 +733,7 @@ public final class SolrCore implements SolrInfoBean, Closeable {
     final RecoveryStrategy.Builder rsBuilder;
     if (info != null && info.className != null) {
       log.info(info.className);
-      rsBuilder = CoreRefreshingClassLoader.createInst(getResourceLoader(), info, RecoveryStrategy.Builder.class);
+      rsBuilder = getResourceLoader().newInstance( info, RecoveryStrategy.Builder.class, true);
     } else {
       log.debug("solr.RecoveryStrategy.Builder");
       rsBuilder = new RecoveryStrategy.Builder();
@@ -749,7 +748,7 @@ public final class SolrCore implements SolrInfoBean, Closeable {
     IndexReaderFactory indexReaderFactory;
     PluginInfo info = solrConfig.getPluginInfo(IndexReaderFactory.class.getName());
     if (info != null) {
-      indexReaderFactory = CoreRefreshingClassLoader.createInst(resourceLoader, info, IndexReaderFactory.class);
+      indexReaderFactory = resourceLoader.newInstance(info, IndexReaderFactory.class, true);
       indexReaderFactory.init(info.initArgs);
     } else {
       indexReaderFactory = new StandardIndexReaderFactory();
@@ -1416,7 +1415,7 @@ public final class SolrCore implements SolrInfoBean, Closeable {
     final PluginInfo info = solrConfig.getPluginInfo(CodecFactory.class.getName());
     final CodecFactory factory;
     if (info != null) {
-      factory = CoreRefreshingClassLoader.createInst(resourceLoader,  info, CodecFactory.class);
+      factory = resourceLoader.newInstance( info, CodecFactory.class, true);
       factory.init(info.initArgs);
     } else {
       factory = new CodecFactory() {
@@ -1454,7 +1453,7 @@ public final class SolrCore implements SolrInfoBean, Closeable {
     final StatsCache cache;
     PluginInfo pluginInfo = solrConfig.getPluginInfo(StatsCache.class.getName());
     if (pluginInfo != null && pluginInfo.className != null && pluginInfo.className.length() > 0) {
-      cache = CoreRefreshingClassLoader.createInst(resourceLoader, pluginInfo, StatsCache.class);
+      cache = resourceLoader.newInstance( pluginInfo, StatsCache.class, true);
       initPlugin(pluginInfo ,cache);
       if (log.isDebugEnabled()) {
         log.debug("Using statsCache impl: {}", cache.getClass().getName());
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 354a8b0..8535e81 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java
@@ -32,6 +32,7 @@ import java.nio.file.Path;
 import java.nio.file.PathMatcher;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Function;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -45,6 +46,8 @@ import org.apache.lucene.util.IOUtils;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.handler.component.SearchComponent;
 import org.apache.solr.handler.component.ShardHandlerFactory;
+import org.apache.solr.pkg.CoreRefreshingPackageListener;
+import org.apache.solr.pkg.PackageLoader;
 import org.apache.solr.request.SolrRequestHandler;
 import org.apache.solr.response.QueryResponseWriter;
 import org.apache.solr.rest.RestManager;
@@ -763,7 +766,45 @@ public class SolrResourceLoader implements ResourceLoader, Closeable {
   public List<SolrInfoBean> getInfoMBeans() {
     return Collections.unmodifiableList(infoMBeans);
   }
+  /**
+   * Load a class using an appropriate {@link SolrResourceLoader} depending of the package on that class
+   * @param registerCoreReloadListener register a listener for the package and reload the core if the package is changed.
+   *                                   Use this sparingly. This will result in core reloads across all the cores in
+   *                                   all collections using this configset
+   */
+  public  <T> Class<? extends T> findClass( PluginInfo info, Class<T>  type, boolean registerCoreReloadListener) {
+    if(info.cName.pkg == null) return findClass(info.className, type);
+    return _classLookup(info,
+            (Function<PackageLoader.Package.Version, Class<? extends T>>) ver -> ver.getLoader().findClass(info.cName.className, type), registerCoreReloadListener);
+
+  }
 
+  private  <T> T _classLookup(PluginInfo info, Function<PackageLoader.Package.Version, T> fun, boolean registerCoreReloadListener ) {
+    PluginInfo.ClassName cName = info.cName;
+    PackageLoader.Package.Version latest = getCoreContainer().getPackageLoader().getPackage(cName.pkg)
+            .getLatest(core.getSolrConfig().maxPackageVersion(cName.pkg));
+    T result = fun.apply(latest);
+    if (registerCoreReloadListener && getCore() != null) {
+      getCore().getPackageListeners().addListener(new CoreRefreshingPackageListener(core, info, latest));
+    }
+    return result;
+  }
+
+  /**
+   *Create a n instance of a class using an appropriate {@link SolrResourceLoader} depending on the package of that class
+   * @param registerCoreReloadListener register a listener for the package and reload the core if the package is changed.
+   *                                   Use this sparingly. This will result in core reloads across all the cores in
+   *                                   all collections using this configset
+   */
+  public <T> T newInstance(PluginInfo info, Class<T> type, boolean registerCoreReloadListener) {
+    if(info.cName.pkg == null) {
+      return newInstance(info.cName.className == null?
+                      type.getName():
+                      info.cName.className ,
+              type);
+    }
+    return _classLookup( info, version -> version.getLoader().newInstance(info.cName.className, type), registerCoreReloadListener);
+  }
 
   public CoreContainer getCoreContainer(){
     return coreContainer;
diff --git a/solr/core/src/java/org/apache/solr/pkg/CoreRefreshingClassLoader.java b/solr/core/src/java/org/apache/solr/pkg/CoreRefreshingPackageListener.java
similarity index 52%
rename from solr/core/src/java/org/apache/solr/pkg/CoreRefreshingClassLoader.java
rename to solr/core/src/java/org/apache/solr/pkg/CoreRefreshingPackageListener.java
index f28baf7..41e61e4 100644
--- a/solr/core/src/java/org/apache/solr/pkg/CoreRefreshingClassLoader.java
+++ b/solr/core/src/java/org/apache/solr/pkg/CoreRefreshingPackageListener.java
@@ -17,8 +17,6 @@
 
 package org.apache.solr.pkg;
 
-import java.util.function.Function;
-
 import org.apache.solr.core.PluginInfo;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.core.SolrResourceLoader;
@@ -26,12 +24,12 @@ import org.apache.solr.core.SolrResourceLoader;
 /**A utility class that loads classes from packages and reloads core if any of those packages are updated
  *
  */
-public class CoreRefreshingClassLoader implements PackageListeners.Listener {
+public class CoreRefreshingPackageListener implements PackageListeners.Listener {
   private final SolrCore solrCore;
   private final PluginInfo info;
   private final PackageLoader.Package.Version version;
 
-  public CoreRefreshingClassLoader(SolrCore solrCore, PluginInfo info, PackageLoader.Package.Version version) {
+  public CoreRefreshingPackageListener(SolrCore solrCore, PluginInfo info, PackageLoader.Package.Version version) {
     this.solrCore = solrCore;
     this.info = info;
     this.version = version;
@@ -54,7 +52,8 @@ public class CoreRefreshingClassLoader implements PackageListeners.Listener {
   public void changed(PackageLoader.Package pkg, Ctx ctx) {
     PackageLoader.Package.Version version = pkg.getLatest(solrCore.getSolrConfig().maxPackageVersion(info.cName.pkg));
     if(version != this.version) {
-      ctx.runLater(SolrCore.class.getName(), () -> solrCore.getCoreContainer().reload(CoreRefreshingClassLoader.class.getName() , solrCore.uniqueId));
+      ctx.runLater(CoreRefreshingPackageListener.class.getSimpleName()+"/"+ SolrCore.class.getName(),
+              () -> solrCore.getCoreContainer().reload(CoreRefreshingPackageListener.class.getName() , solrCore.uniqueId));
     }
   }
 
@@ -63,36 +62,9 @@ public class CoreRefreshingClassLoader implements PackageListeners.Listener {
     return version;
   }
 
-  /**
-   * Load a class using an appropriate {@link SolrResourceLoader} depending of the package of that class
-   */
-  public static <T> Class<? extends T> findClass(SolrResourceLoader srl, PluginInfo info, Class<T>  type) {
-    if(info.cName.pkg == null) return srl.findClass(info.className, type);
-    return _get(srl, info,
-            (Function<PackageLoader.Package.Version, Class<? extends T>>) ver -> ver.getLoader().findClass(info.cName.className, type));
-
-  }
-
-  private static  <T> T _get(SolrResourceLoader srl, PluginInfo info, Function<PackageLoader.Package.Version, T> fun) {
-    PluginInfo.ClassName cName = info.cName;
-    SolrCore core = srl.getCore();
-    PackageLoader.Package.Version latest = srl.getCoreContainer().getPackageLoader().getPackage(cName.pkg)
-            .getLatest(core.getSolrConfig().maxPackageVersion(cName.pkg));
-    T result = fun.apply(latest);
-    if(srl.getCore() !=null) {
-      srl.getCore().getPackageListeners().addListener(new CoreRefreshingClassLoader(core, info, latest));
-    }
-    return result;
-  }
-
   public static <T> T createInst(SolrResourceLoader srl, PluginInfo info, Class<T> type) {
-    if(info.cName.pkg == null) {
-        return srl.newInstance(info.cName.className == null?
-                type.getName():
-                info.cName.className ,
-                type);
+    return srl.newInstance(info, type,true);
     }
-    return _get(srl, info, version -> version.getLoader().newInstance(info.cName.className, type));
-  }
+
 
 }
diff --git a/solr/core/src/java/org/apache/solr/search/CacheConfig.java b/solr/core/src/java/org/apache/solr/search/CacheConfig.java
index 807f3c0..8d7edd5 100644
--- a/solr/core/src/java/org/apache/solr/search/CacheConfig.java
+++ b/solr/core/src/java/org/apache/solr/search/CacheConfig.java
@@ -31,7 +31,6 @@ import org.apache.solr.common.MapSerializable;
 import org.apache.solr.core.PluginInfo;
 import org.apache.solr.core.SolrConfig;
 import org.apache.solr.core.SolrResourceLoader;
-import org.apache.solr.pkg.CoreRefreshingClassLoader;
 import org.apache.solr.util.DOMUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -52,6 +51,12 @@ public class CacheConfig implements MapSerializable{
   
   private String nodeName;
 
+
+  /**
+   * When this object is created, the core is not yet available . So, if the class is to be
+   * loaded from a package we should have  acorresponding core
+   *
+   */
   @SuppressWarnings({"rawtypes"})
   private Supplier<Class<? extends SolrCache>> clazz;
   private Map<String,String> args;
@@ -137,9 +142,19 @@ public class CacheConfig implements MapSerializable{
     SolrResourceLoader loader = solrConfig.getResourceLoader();
     config.cacheImpl = config.args.get("class");
     if (config.cacheImpl == null) config.cacheImpl = "solr.CaffeineCache";
-    config.clazz = () -> CoreRefreshingClassLoader.findClass(loader,
-            new PluginInfo("cache", Collections.singletonMap("class", config.cacheImpl)),
-            SolrCache.class);
+    config.clazz = new Supplier<>() {
+      @SuppressWarnings("rawtypes")
+      Class<SolrCache> loadedClass;
+
+      @Override
+      @SuppressWarnings("rawtypes")
+      public Class<? extends SolrCache> get() {
+        if (loadedClass != null) return loadedClass;
+        return loadedClass = (Class<SolrCache>) loader.findClass(
+                new PluginInfo("cache", Collections.singletonMap("class", config.cacheImpl)),
+                SolrCache.class, true);
+      }
+    };
     config.regenImpl = config.args.get("regenerator");
     if (config.regenImpl != null) {
       config.regenerator = loader.newInstance(config.regenImpl, CacheRegenerator.class);
diff --git a/solr/core/src/java/org/apache/solr/update/UpdateHandler.java b/solr/core/src/java/org/apache/solr/update/UpdateHandler.java
index f82effc..dd275dc 100644
--- a/solr/core/src/java/org/apache/solr/update/UpdateHandler.java
+++ b/solr/core/src/java/org/apache/solr/update/UpdateHandler.java
@@ -23,7 +23,6 @@ import java.util.Vector;
 import org.apache.solr.core.*;
 import org.apache.solr.core.PluginBag.PluginHolder;
 import org.apache.solr.metrics.SolrMetricsContext;
-import org.apache.solr.pkg.CoreRefreshingClassLoader;
 import org.apache.solr.pkg.PackagePluginHolder;
 import org.apache.solr.schema.FieldType;
 import org.apache.solr.schema.SchemaField;
@@ -127,7 +126,7 @@ public abstract class UpdateHandler implements SolrInfoBean {
         ulog = new HdfsUpdateLog(((HdfsDirectoryFactory)dirFactory).getConfDir());
       } else {
         ulog = ulogPluginInfo.className == null ? new UpdateLog():
-                CoreRefreshingClassLoader.createInst(core.getResourceLoader(), ulogPluginInfo, UpdateLog.class);
+                core.getResourceLoader().newInstance(ulogPluginInfo, UpdateLog.class, true);
       }
 
       if (!core.isReloaded() && !dirFactory.isPersistent()) {