You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by no...@apache.org on 2019/12/31 02:15:52 UTC

[lucene-solr] branch jira/solr14155 updated: WIP commit

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

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


The following commit(s) were added to refs/heads/jira/solr14155 by this push:
     new f3e3d9c  WIP commit
f3e3d9c is described below

commit f3e3d9c18f6a568063f6aa7fcacdc637b960b1a8
Author: noble <no...@apache.org>
AuthorDate: Tue Dec 31 13:14:20 2019 +1100

    WIP commit
---
 .../java/org/apache/solr/core/CoreContainer.java   |  4 +-
 .../org/apache/solr/core/DirectoryFactory.java     |  6 +--
 .../java/org/apache/solr/core/SolrClassLoader.java |  8 ++++
 .../src/java/org/apache/solr/core/SolrCore.java    | 33 ++++++++++++-----
 .../solr/pkg/PackageAwareSolrClassLoader.java      | 43 +++++++++++-----------
 5 files changed, 58 insertions(+), 36 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 b084751..c5f9f66 100644
--- a/solr/core/src/java/org/apache/solr/core/CoreContainer.java
+++ b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
@@ -1319,7 +1319,7 @@ public class CoreContainer {
         return core.getDirectoryFactory().isSharedStorage();
       } else {
         ConfigSet configSet = getConfigSet(cd);
-        return DirectoryFactory.loadDirectoryFactory(configSet.getSolrConfig(), this, null).isSharedStorage();
+        return DirectoryFactory.loadDirectoryFactory(configSet.getSolrConfig(), this, null, configSet.getSolrConfig().getResourceLoader()).isSharedStorage();
       }
     }
   }
@@ -1393,7 +1393,7 @@ public class CoreContainer {
     SolrConfig config = coreConfig.getSolrConfig();
 
     String registryName = SolrMetricManager.getRegistryName(SolrInfoBean.Group.core, dcore.getName());
-    DirectoryFactory df = DirectoryFactory.loadDirectoryFactory(config, this, registryName);
+    DirectoryFactory df = DirectoryFactory.loadDirectoryFactory(config, this, registryName, config.getResourceLoader());
     String dataDir = SolrCore.findDataDir(df, null, config, dcore);
 
     String tmpIdxDirName = "index." + new SimpleDateFormat(SnapShooter.DATE_FMT, Locale.ROOT).format(new Date());
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 fab3300..37bda19 100644
--- a/solr/core/src/java/org/apache/solr/core/DirectoryFactory.java
+++ b/solr/core/src/java/org/apache/solr/core/DirectoryFactory.java
@@ -23,9 +23,9 @@ import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.nio.file.NoSuchFileException;
-import java.util.Arrays;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
@@ -415,12 +415,12 @@ public abstract class DirectoryFactory implements NamedListInitializedPlugin,
   /**
    * Create a new DirectoryFactory instance from the given SolrConfig and tied to the specified core container.
    */
-  static DirectoryFactory loadDirectoryFactory(SolrConfig config, CoreContainer cc, String registryName) {
+  static DirectoryFactory loadDirectoryFactory(SolrConfig config, CoreContainer cc, String registryName , SolrClassLoader loader) {
     final PluginInfo info = config.getPluginInfo(DirectoryFactory.class.getName());
     final DirectoryFactory dirFactory;
     if (info != null) {
       log.debug(info.className);
-      dirFactory = config.getResourceLoader().newInstance(info.className, DirectoryFactory.class);
+      dirFactory = loader.newInstance(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/SolrClassLoader.java b/solr/core/src/java/org/apache/solr/core/SolrClassLoader.java
index 8995c80..0bb8f47 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrClassLoader.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrClassLoader.java
@@ -29,7 +29,15 @@ public interface SolrClassLoader extends Closeable, ResourceLoader {
 
   <T> T newInstance(String cname, Class<T> expectedType, String... subpackages);
 
+  default <T> T newInstance(PluginInfo info, Class<T> expectedType) {
+   return newInstance(info.className, expectedType);
+  }
+
   <T> T newInstance(String cName, Class<T> expectedType, String[] subPackages, Class[] params, Object[] args);
 
   <T> Class<? extends T> findClass(String cname, Class<T> expectedType);
+
+  default  <T> Class<? extends T> findClass(PluginInfo info, Class<T> expectedType){
+    return findClass(info.className, expectedType);
+  }
 }
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 2af1421..e520646 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrCore.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrCore.java
@@ -109,6 +109,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.PackageAwareSolrClassLoader;
 import org.apache.solr.pkg.PackageListeners;
 import org.apache.solr.pkg.PackageLoader;
 import org.apache.solr.request.SolrQueryRequest;
@@ -197,6 +198,7 @@ public final class SolrCore implements SolrInfoBean, Closeable {
 
   private final SolrConfig solrConfig;
   private final SolrResourceLoader resourceLoader;
+  private final SolrClassLoader packageClassLoader;
   private volatile IndexSchema schema;
   private final NamedList configSetProperties;
   private final String dataDir;
@@ -284,6 +286,10 @@ public final class SolrCore implements SolrInfoBean, Closeable {
     return resourceLoader;
   }
 
+  public SolrClassLoader getPackageClassLoader(){
+    return packageClassLoader;
+  }
+
   /** Gets the SolrResourceLoader for a given package
    * @param pkg The package name
    */
@@ -520,7 +526,7 @@ public final class SolrCore implements SolrInfoBean, Closeable {
     final PluginInfo info = solrConfig.getPluginInfo(IndexDeletionPolicy.class.getName());
     final IndexDeletionPolicy delPolicy;
     if (info != null) {
-      delPolicy = createInstance(info.className, IndexDeletionPolicy.class, "Deletion Policy for SOLR", this, getResourceLoader());
+      delPolicy = createInstance(info, IndexDeletionPolicy.class, "Deletion Policy for SOLR", this, getPackageClassLoader());
       if (delPolicy instanceof NamedListInitializedPlugin) {
         ((NamedListInitializedPlugin) delPolicy).init(info.initArgs);
       }
@@ -709,7 +715,7 @@ public final class SolrCore implements SolrInfoBean, Closeable {
   }
 
   private DirectoryFactory initDirectoryFactory() {
-    return DirectoryFactory.loadDirectoryFactory(solrConfig, coreContainer, coreMetricManager.getRegistryName());
+    return DirectoryFactory.loadDirectoryFactory(solrConfig, coreContainer, coreMetricManager.getRegistryName(), packageClassLoader);
   }
 
   private RecoveryStrategy.Builder initRecoveryStrategyBuilder() {
@@ -717,7 +723,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.className, RecoveryStrategy.Builder.class);
+      rsBuilder = getPackageClassLoader ().newInstance(info, RecoveryStrategy.Builder.class);
     } else {
       log.debug("solr.RecoveryStrategy.Builder");
       rsBuilder = new RecoveryStrategy.Builder();
@@ -732,7 +738,7 @@ public final class SolrCore implements SolrInfoBean, Closeable {
     IndexReaderFactory indexReaderFactory;
     PluginInfo info = solrConfig.getPluginInfo(IndexReaderFactory.class.getName());
     if (info != null) {
-      indexReaderFactory = resourceLoader.newInstance(info.className, IndexReaderFactory.class);
+      indexReaderFactory =  packageClassLoader.newInstance(info, IndexReaderFactory.class);
       indexReaderFactory.init(info.initArgs);
     } else {
       indexReaderFactory = new StandardIndexReaderFactory();
@@ -806,23 +812,27 @@ public final class SolrCore implements SolrInfoBean, Closeable {
     cleanupOldIndexDirectories(reload);
   }
 
+  public static <T> T createInstance(String className, Class<T> cast, String msg, SolrCore core, SolrClassLoader resourceLoader) {
+    return createInstance(new PluginInfo(cast.getSimpleName(), Collections.singletonMap("class", className)) , cast, msg, core,  resourceLoader);
+
+  }
 
   /**
    * Creates an instance by trying a constructor that accepts a SolrCore before
    * trying the default (no arg) constructor.
    *
-   * @param className the instance class to create
+   * @param info the instance class to create
    * @param cast      the class or interface that the instance should extend or implement
    * @param msg       a message helping compose the exception error if any occurs.
    * @param core      The SolrCore instance for which this object needs to be loaded
    * @return the desired instance
    * @throws SolrException if the object could not be instantiated
    */
-  public static <T> T createInstance(String className, Class<T> cast, String msg, SolrCore core, SolrClassLoader resourceLoader) {
+  public static <T> T createInstance(PluginInfo info, Class<T> cast, String msg, SolrCore core, SolrClassLoader resourceLoader) {
     Class<? extends T> clazz = null;
     if (msg == null) msg = "SolrCore Object";
     try {
-      clazz = resourceLoader.findClass(className, cast);
+      clazz = resourceLoader.findClass(info, cast);
       //most of the classes do not have constructors which takes SolrCore argument. It is recommended to obtain SolrCore by implementing SolrCoreAware.
       // So invariably always it will cause a  NoSuchMethodException. So iterate though the list of available constructors
       Constructor<?>[] cons = clazz.getConstructors();
@@ -832,7 +842,7 @@ public final class SolrCore implements SolrInfoBean, Closeable {
           return cast.cast(con.newInstance(core));
         }
       }
-      return resourceLoader.newInstance(className, cast);//use the empty constructor
+      return resourceLoader.newInstance(info, cast);//use the empty constructor
     } catch (SolrException e) {
       throw e;
     } catch (Exception e) {
@@ -843,7 +853,7 @@ public final class SolrCore implements SolrInfoBean, Closeable {
         throw inner;
       }
 
-      throw new SolrException(ErrorCode.SERVER_ERROR, "Error Instantiating " + msg + ", " + className + " failed to instantiate " + cast.getName(), e);
+      throw new SolrException(ErrorCode.SERVER_ERROR, "Error Instantiating " + msg + ", " + info.className + " failed to instantiate " + cast.getName(), e);
     }
   }
 
@@ -945,6 +955,9 @@ public final class SolrCore implements SolrInfoBean, Closeable {
 
       resourceLoader = config.getResourceLoader();
       resourceLoader.core = this;
+      packageClassLoader = coreContainer.isZooKeeperAware()?
+          new PackageAwareSolrClassLoader(this, () -> new Thread(() -> getCoreContainer().reload(name)).start()) :
+          resourceLoader;
       this.solrConfig = config;
       this.configSetProperties = configSetProperties;
       // Initialize the metrics manager
@@ -1423,7 +1436,7 @@ public final class SolrCore implements SolrInfoBean, Closeable {
     final PluginInfo info = solrConfig.getPluginInfo(CodecFactory.class.getName());
     final CodecFactory factory;
     if (info != null) {
-      factory = resourceLoader.newInstance(info.className, CodecFactory.class);
+      factory = packageClassLoader.newInstance(info, CodecFactory.class);
       factory.init(info.initArgs);
     } else {
       factory = new CodecFactory() {
diff --git a/solr/core/src/java/org/apache/solr/pkg/PackageAwareSolrClassLoader.java b/solr/core/src/java/org/apache/solr/pkg/PackageAwareSolrClassLoader.java
index 90052e7..f9ef156 100644
--- a/solr/core/src/java/org/apache/solr/pkg/PackageAwareSolrClassLoader.java
+++ b/solr/core/src/java/org/apache/solr/pkg/PackageAwareSolrClassLoader.java
@@ -20,6 +20,7 @@ package org.apache.solr.pkg;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -32,8 +33,6 @@ import org.apache.solr.core.SolrCore;
 import org.apache.solr.core.SolrResourceLoader;
 import org.apache.solr.util.plugin.SolrCoreAware;
 
-import static java.util.Collections.singletonMap;
-
 /**
  * This class implements a {@link SolrClassLoader} that can  identify the correct packages
  * and load classes from that. This also listens to any changes to the relevant packages and
@@ -64,6 +63,11 @@ public class PackageAwareSolrClassLoader implements SolrClassLoader {
   }
 
   @Override
+  public <T> T newInstance(PluginInfo info, Class<T> expectedType) {
+    return null;
+  }
+
+  @Override
   public InputStream openResource(String resource) throws IOException {
     return loader.openResource(resource);
   }
@@ -79,26 +83,28 @@ public class PackageAwareSolrClassLoader implements SolrClassLoader {
     return loadWithRightPackageLoader(cname, expectedType,
         (pkgloader, name) -> pkgloader.newInstance(name, expectedType, subpackages));
   }
-
-  private <T> T loadWithRightPackageLoader(String cname, Class expectedType, BiFunction<SolrClassLoader, String, T> fun) {
-    PluginInfo.ParsedClassName parsedClassName = new PluginInfo.ParsedClassName(cname);
-    if (parsedClassName.pkg == null) {
-      return  fun.apply(loader, parsedClassName.klas);
+  private <T> T loadWithRightPackageLoader(PluginInfo info, BiFunction<SolrClassLoader, String, T> fun) {
+    if (info.pkgName == null) {
+      return  fun.apply(loader, info.className);
     } else {
-      PackageLoader.Package pkg = core.getCoreContainer().getPackageLoader().getPackage(parsedClassName.pkg);
+      PackageLoader.Package pkg = core.getCoreContainer().getPackageLoader().getPackage(info.pkgName);
       PackageLoader.Package.Version ver = PackagePluginHolder.getRightVersion(pkg, core);
-      T result = fun.apply(ver.getLoader(), parsedClassName.klas);
+      T result = fun.apply(ver.getLoader(), info.className);
       if (result instanceof SolrCoreAware) {
         loader.registerSolrCoreAware((SolrCoreAware) result);
       }
-      classNameVsPkg.put(cname, ver.getVersionInfo());
-      PackageListeners.Listener listener = new PackageListener(expectedType, cname, parsedClassName);
+      classNameVsPkg.put(info.cName.toString(), ver.getVersionInfo());
+      PackageListeners.Listener listener = new PackageListener(info);
       listeners.add(listener);
       core.getPackageListeners().addListener(listener);
       return result;
     }
   }
 
+  private <T> T loadWithRightPackageLoader(String cname, Class expectedType, BiFunction<SolrClassLoader, String, T> fun) {
+    return loadWithRightPackageLoader(new PluginInfo(expectedType.getSimpleName(), Collections.singletonMap("class", cname)), fun);
+  }
+
   @Override
   public <T> Class<? extends T> findClass(String cname, Class<T> expectedType) {
     return loadWithRightPackageLoader(cname, expectedType, (BiFunction<SolrClassLoader, String ,Class<? extends T>>) (loader, name) -> loader.findClass(name, expectedType));
@@ -119,20 +125,15 @@ public class PackageAwareSolrClassLoader implements SolrClassLoader {
   }
 
   private class PackageListener implements PackageListeners.Listener {
-
-    private final String cname;
-    private final PluginInfo.ParsedClassName parsedClassName;
     PluginInfo info;
 
-    public PackageListener(Class expectedType, String cname, PluginInfo.ParsedClassName parsedClassName) {
-      this.cname = cname;
-      this.parsedClassName = parsedClassName;
-      info = new PluginInfo(expectedType.getSimpleName(), singletonMap("class", cname));
+    public PackageListener(PluginInfo pluginInfo) {
+      this.info = pluginInfo;
     }
 
     @Override
     public String packageName() {
-      return parsedClassName.pkg;
+      return info.pkgName;
     }
 
     @Override
@@ -144,7 +145,7 @@ public class PackageAwareSolrClassLoader implements SolrClassLoader {
     public void changed(PackageLoader.Package pkg, PackageListeners.Ctx ctx) {
       PackageLoader.Package.Version rightVersion = PackagePluginHolder.getRightVersion(pkg, core);
       if (rightVersion == null ) return;
-      PackageAPI.PkgVersion v = classNameVsPkg.get(parsedClassName.toString());
+      PackageAPI.PkgVersion v = classNameVsPkg.get(info.cName.toString());
       if(Objects.equals(v.version ,rightVersion.getVersionInfo().version)) return; //nothing has changed no need to reload
       Runnable old = ctx.getPostProcessor(PackageAwareSolrClassLoader.class.getName());// just want to do one refresh for every package laod
       if (old == null) ctx.addPostProcessor(PackageAwareSolrClassLoader.class.getName(), reloadRunnable);
@@ -152,7 +153,7 @@ public class PackageAwareSolrClassLoader implements SolrClassLoader {
 
     @Override
     public PackageAPI.PkgVersion getPackageVersion() {
-      return classNameVsPkg.get(cname);
+      return classNameVsPkg.get(info.cName.toString());
     }
   }
 }