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);
}
});