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()) {