diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index c4dec38158b..d01bfe37764 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -566,6 +566,9 @@ Bug Fixes * SOLR-2252: When a child entity in nested entities is rootEntity="true", delta-import doesn't work. (koji) +* SOLR-2219: The init() method of every SolrRequestHandler was being + called twice. (ambikeshwar singh and hossman) + Other Changes ---------------------- diff --git a/solr/src/java/org/apache/solr/core/RequestHandlers.java b/solr/src/java/org/apache/solr/core/RequestHandlers.java index 58b8d8056ce..ddd6b3aa8f4 100644 --- a/solr/src/java/org/apache/solr/core/RequestHandlers.java +++ b/solr/src/java/org/apache/solr/core/RequestHandlers.java @@ -32,6 +32,7 @@ import org.slf4j.LoggerFactory; import java.net.URL; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -137,7 +138,8 @@ final class RequestHandlers { */ void initHandlersFromConfig(SolrConfig config ){ - Map handlers = new HashMap(); + // use link map so we iterate in the same order + Map handlers = new LinkedHashMap(); for (PluginInfo info : config.getPluginInfos(SolrRequestHandler.class.getName())) { try { SolrRequestHandler requestHandler; @@ -153,11 +155,6 @@ final class RequestHandlers { requestHandler = core.createRequestHandler(info.className); } handlers.put(info,requestHandler); - if (requestHandler instanceof PluginInfoInitialized) { - ((PluginInfoInitialized) requestHandler).init(info); - } else{ - requestHandler.init(info.initArgs); - } SolrRequestHandler old = register(info.name, requestHandler); if(old != null) { log.warn("Multiple requestHandler registered to the same name: " + info.name + " ignoring: " + old.getClass().getName()); @@ -176,8 +173,16 @@ final class RequestHandlers { throw e; } } + + // we've now registered all handlers, time ot init them in the same order for (Map.Entry entry : handlers.entrySet()) { - entry.getValue().init(entry.getKey().initArgs); + PluginInfo info = entry.getKey(); + SolrRequestHandler requestHandler = entry.getValue(); + if (requestHandler instanceof PluginInfoInitialized) { + ((PluginInfoInitialized) requestHandler).init(info); + } else{ + requestHandler.init(info.initArgs); + } } if(get("") == null) register("", get(DEFAULT_HANDLER_NAME)); diff --git a/solr/src/test/org/apache/solr/core/MockQuerySenderListenerReqHandler.java b/solr/src/test/org/apache/solr/core/MockQuerySenderListenerReqHandler.java index 6d4dc755d35..d4a27c0ded8 100644 --- a/solr/src/test/org/apache/solr/core/MockQuerySenderListenerReqHandler.java +++ b/solr/src/test/org/apache/solr/core/MockQuerySenderListenerReqHandler.java @@ -19,6 +19,9 @@ package org.apache.solr.core; import org.apache.solr.handler.RequestHandlerBase; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.response.SolrQueryResponse; +import org.apache.solr.common.util.NamedList; + +import java.util.concurrent.atomic.AtomicInteger; /** @@ -29,6 +32,13 @@ public class MockQuerySenderListenerReqHandler extends RequestHandlerBase { public SolrQueryRequest req; public SolrQueryResponse rsp; + AtomicInteger initCounter = new AtomicInteger(0); + + public void init(NamedList args) { + initCounter.incrementAndGet(); + super.init(args); + } + public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception { this.req = req; this.rsp = rsp; @@ -53,4 +63,11 @@ public class MockQuerySenderListenerReqHandler extends RequestHandlerBase { String result = null; return result; } + + public NamedList getStatistics() { + NamedList lst = super.getStatistics(); + lst.add("initCount", initCounter.intValue()); + return lst; + } + } diff --git a/solr/src/test/org/apache/solr/core/RequestHandlersTest.java b/solr/src/test/org/apache/solr/core/RequestHandlersTest.java index 043d5d5954c..213251931dd 100755 --- a/solr/src/test/org/apache/solr/core/RequestHandlersTest.java +++ b/solr/src/test/org/apache/solr/core/RequestHandlersTest.java @@ -29,6 +29,14 @@ public class RequestHandlersTest extends SolrTestCaseJ4 { initCore("solrconfig.xml", "schema.xml"); } + @Test + public void testInitCount() { + SolrCore core = h.getCore(); + SolrRequestHandler handler = core.getRequestHandler( "mock" ); + assertEquals("Incorrect init count", + 1, handler.getStatistics().get("initCount")); + } + @Test public void testLazyLoading() { SolrCore core = h.getCore(); diff --git a/solr/src/test/test-files/solr/conf/solrconfig.xml b/solr/src/test/test-files/solr/conf/solrconfig.xml index 4c5aa77b88d..088872d7877 100644 --- a/solr/src/test/test-files/solr/conf/solrconfig.xml +++ b/solr/src/test/test-files/solr/conf/solrconfig.xml @@ -304,6 +304,7 @@ sqrt 2 log 10 +