You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by yo...@apache.org on 2015/03/19 17:14:23 UTC
svn commit: r1667803 - in /lucene/dev/branches/branch_5x: ./ solr/
solr/core/ solr/core/src/java/org/apache/solr/core/PluginBag.java
solr/core/src/java/org/apache/solr/core/RequestHandlers.java
Author: yonik
Date: Thu Mar 19 16:14:23 2015
New Revision: 1667803
URL: http://svn.apache.org/r1667803
Log:
SOLR-7262: fix broken thread safety for request handler registry introduced by SOLR-7073
Modified:
lucene/dev/branches/branch_5x/ (props changed)
lucene/dev/branches/branch_5x/solr/ (props changed)
lucene/dev/branches/branch_5x/solr/core/ (props changed)
lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/PluginBag.java
lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/RequestHandlers.java
Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/PluginBag.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/PluginBag.java?rev=1667803&r1=1667802&r2=1667803&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/PluginBag.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/PluginBag.java Thu Mar 19 16:14:23 2015
@@ -27,6 +27,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
import org.apache.lucene.analysis.util.ResourceLoader;
import org.apache.lucene.analysis.util.ResourceLoaderAware;
@@ -49,22 +50,33 @@ import org.slf4j.LoggerFactory;
public class PluginBag<T> implements AutoCloseable {
public static Logger log = LoggerFactory.getLogger(PluginBag.class);
- private Map<String, PluginHolder<T>> registry = new HashMap<>();
- private Map<String, PluginHolder<T>> immutableRegistry = Collections.unmodifiableMap(registry);
+ private final Map<String, PluginHolder<T>> registry;
+ private final Map<String, PluginHolder<T>> immutableRegistry;
private String def;
- private Class klass;
+ private final Class klass;
private SolrCore core;
- private SolrConfig.SolrPluginInfo meta;
+ private final SolrConfig.SolrPluginInfo meta;
- public PluginBag(Class<T> klass, SolrCore core) {
+ /** Pass needThreadSafety=true if plugins can be added and removed concurrently with lookups. */
+ public PluginBag(Class<T> klass, SolrCore core, boolean needThreadSafety) {
this.core = core;
this.klass = klass;
+ // TODO: since reads will dominate writes, we could also think about creating a new instance of a map each time it changes.
+ // Not sure how much benefit this would have over ConcurrentHashMap though
+ // We could also perhaps make this constructor into a factory method to return different implementations depending on thread safety needs.
+ this.registry = needThreadSafety ? new ConcurrentHashMap<String, PluginHolder<T>>() : new HashMap<String, PluginHolder<T>>();
+ this.immutableRegistry = Collections.unmodifiableMap(registry);
meta = SolrConfig.classVsSolrPluginInfo.get(klass.getName());
if (meta == null) {
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unknown Plugin : " + klass.getName());
}
}
+ /** Constructs a non-threadsafe plugin registry */
+ public PluginBag(Class<T> klass, SolrCore core) {
+ this(klass, core, false);
+ }
+
static void initInstance(Object inst, PluginInfo info, SolrCore core) {
if (inst instanceof PluginInfoInitialized) {
((PluginInfoInitialized) inst).init(info);
@@ -97,6 +109,7 @@ public class PluginBag<T> implements Aut
}
boolean alias(String src, String target) {
+ if (src == null) return false;
PluginHolder<T> a = registry.get(src);
if (a == null) return false;
PluginHolder<T> b = registry.get(target);
Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/RequestHandlers.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/RequestHandlers.java?rev=1667803&r1=1667802&r2=1667803&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/RequestHandlers.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/RequestHandlers.java Thu Mar 19 16:14:23 2015
@@ -57,7 +57,8 @@ public final class RequestHandlers {
public RequestHandlers(SolrCore core) {
this.core = core;
- handlers = new PluginBag<>(SolrRequestHandler.class, core);
+ // we need a thread safe registry since methods like register are currently documented to be thread safe.
+ handlers = new PluginBag<>(SolrRequestHandler.class, core, true);
}
/**