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:46:02 UTC
[lucene] 21/21: WIP commit
This is an automated email from the ASF dual-hosted git repository.
dweiss pushed a commit to branch jira/solr14155
in repository https://gitbox.apache.org/repos/asf/lucene.git
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());
}
}
}