You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by tf...@apache.org on 2014/12/19 00:37:40 UTC
svn commit: r1646581 - in /lucene/dev/branches/branch_5x: ./ solr/
solr/core/ solr/core/src/java/org/apache/solr/core/
solr/core/src/test-files/solr/collection1/conf/
solr/core/src/test/org/apache/solr/search/
Author: tflobbe
Date: Thu Dec 18 23:37:40 2014
New Revision: 1646581
URL: http://svn.apache.org/r1646581
Log:
SOLR-6864: Support registering searcher listeners in SolrCoreAware.inform(SolrCore) method
Added:
lucene/dev/branches/branch_5x/solr/core/src/test-files/solr/collection1/conf/solrconfig-searcher-listeners1.xml
- copied unchanged from r1646577, lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-searcher-listeners1.xml
Modified:
lucene/dev/branches/branch_5x/ (props changed)
lucene/dev/branches/branch_5x/solr/ (props changed)
lucene/dev/branches/branch_5x/solr/CHANGES.txt (contents, props changed)
lucene/dev/branches/branch_5x/solr/core/ (props changed)
lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrCore.java
lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/search/TestIndexSearcher.java
Modified: lucene/dev/branches/branch_5x/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/CHANGES.txt?rev=1646581&r1=1646580&r2=1646581&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/CHANGES.txt (original)
+++ lucene/dev/branches/branch_5x/solr/CHANGES.txt Thu Dec 18 23:37:40 2014
@@ -296,6 +296,9 @@ Bug Fixes
component. Increased test coverage of expand component with docValues.
(Christine Poerschke, Per Steffensen, shalin)
+* SOLR-6864: Support registering searcher listeners in SolrCoreAware.inform(SolrCore)
+ method. Existing components rely on this. (Tomás Fernández Löbbe)
+
Optimizations
----------------------
Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrCore.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrCore.java?rev=1646581&r1=1646580&r2=1646581&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrCore.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrCore.java Thu Dec 18 23:37:40 2014
@@ -1755,7 +1755,7 @@ public final class SolrCore implements S
});
}
- if (currSearcher == null && firstSearcherListeners.size() > 0) {
+ if (currSearcher == null) {
future = searcherExecutor.submit(new Callable() {
@Override
public Object call() throws Exception {
@@ -1774,7 +1774,7 @@ public final class SolrCore implements S
});
}
- if (currSearcher != null && newSearcherListeners.size() > 0) {
+ if (currSearcher != null) {
future = searcherExecutor.submit(new Callable() {
@Override
public Object call() throws Exception {
Modified: lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/search/TestIndexSearcher.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/search/TestIndexSearcher.java?rev=1646581&r1=1646580&r2=1646581&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/search/TestIndexSearcher.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/search/TestIndexSearcher.java Thu Dec 18 23:37:40 2014
@@ -16,22 +16,34 @@
*/
package org.apache.solr.search;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Future;
+import java.util.concurrent.atomic.AtomicInteger;
+
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexReaderContext;
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.LogDocMergePolicy;
-import org.apache.lucene.index.IndexReaderContext;
import org.apache.lucene.index.ReaderUtil;
import org.apache.lucene.queries.function.FunctionValues;
import org.apache.lucene.queries.function.ValueSource;
import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.common.util.NamedList;
+import org.apache.solr.core.CoreContainer;
+import org.apache.solr.core.CoreDescriptor;
+import org.apache.solr.core.SolrCore;
+import org.apache.solr.core.SolrEventListener;
+import org.apache.solr.handler.component.ResponseBuilder;
+import org.apache.solr.handler.component.SearchComponent;
import org.apache.solr.request.SolrQueryRequest;
+import org.apache.solr.request.SolrRequestHandler;
import org.apache.solr.schema.SchemaField;
+import org.apache.solr.servlet.DirectSolrConnection;
+import org.apache.solr.util.plugin.SolrCoreAware;
import org.junit.BeforeClass;
-import java.util.List;
-import java.util.Map;
-import java.io.IOException;
-
public class TestIndexSearcher extends SolrTestCaseJ4 {
@BeforeClass
@@ -171,4 +183,115 @@ public class TestIndexSearcher extends S
}
}
+
+ public void testSearcherListeners() throws Exception {
+ MockSearchComponent.registerFirstSearcherListener = false;
+ MockSearchComponent.registerNewSearcherListener = false;
+ createCoreAndValidateListeners(0, 0, 0, 0);
+
+ MockSearchComponent.registerFirstSearcherListener = true;
+ MockSearchComponent.registerNewSearcherListener = false;
+ createCoreAndValidateListeners(1, 1, 1, 1);
+
+ MockSearchComponent.registerFirstSearcherListener = true;
+ MockSearchComponent.registerNewSearcherListener = true;
+ createCoreAndValidateListeners(1, 1, 2, 1);
+ }
+
+ private void createCoreAndValidateListeners(int numTimesCalled, int numTimesCalledFirstSearcher,
+ int numTimesCalledAfterGetSearcher, int numTimesCalledFirstSearcherAfterGetSearcher) throws Exception {
+ CoreContainer cores = h.getCoreContainer();
+ CoreDescriptor cd = h.getCore().getCoreDescriptor();
+ SolrCore newCore = null;
+ // reset counters
+ MockSearcherListener.numberOfTimesCalled = new AtomicInteger();
+ MockSearcherListener.numberOfTimesCalledFirstSearcher = new AtomicInteger();
+
+ try {
+ CoreDescriptor newCd = new CoreDescriptor(cores, "core1", cd.getInstanceDir(), "config", "solrconfig-searcher-listeners1.xml");
+ // Create a new core, this should call all the firstSearcherListeners
+ newCore = cores.create(newCd);
+
+ //validate that the new core was created with the correct solrconfig
+ assertNotNull(newCore.getSearchComponent("mock"));
+ assertEquals(MockSearchComponent.class, newCore.getSearchComponent("mock").getClass());
+
+ assertEquals(numTimesCalled, MockSearcherListener.numberOfTimesCalled.get());
+ assertEquals(numTimesCalledFirstSearcher, MockSearcherListener.numberOfTimesCalledFirstSearcher.get());
+
+ addDummyDoc(newCore);
+
+ // Open a new searcher, this should call the newSearcherListeners
+ Future<?>[] future = new Future[1];
+ newCore.getSearcher(true, false, future);
+ future[0].get();
+
+ assertEquals(numTimesCalledAfterGetSearcher, MockSearcherListener.numberOfTimesCalled.get());
+ assertEquals(numTimesCalledFirstSearcherAfterGetSearcher, MockSearcherListener.numberOfTimesCalledFirstSearcher.get());
+
+ } finally {
+ if (newCore != null) {
+ cores.unload("core1");
+ }
+ }
+ }
+
+ private void addDummyDoc(SolrCore core) throws Exception {
+ DirectSolrConnection connection = new DirectSolrConnection(core);
+ SolrRequestHandler handler = core.getRequestHandler("/update");
+ connection.request(handler, null, adoc("id", "1"));
+ }
+
+ public static class MockSearchComponent extends SearchComponent implements SolrCoreAware {
+
+ static boolean registerFirstSearcherListener = false;
+ static boolean registerNewSearcherListener = false;
+
+ @Override
+ public void prepare(ResponseBuilder rb) throws IOException {}
+
+ @Override
+ public void process(ResponseBuilder rb) throws IOException {}
+
+ @Override
+ public String getDescription() {
+ return "MockSearchComponent";
+ }
+
+ @Override
+ public void inform(SolrCore core) {
+ if (registerFirstSearcherListener) {
+ core.registerFirstSearcherListener(new MockSearcherListener());
+ }
+ if (registerNewSearcherListener) {
+ core.registerNewSearcherListener(new MockSearcherListener());
+ }
+ }
+
+ }
+
+ static class MockSearcherListener implements SolrEventListener {
+
+ static AtomicInteger numberOfTimesCalled;
+ static AtomicInteger numberOfTimesCalledFirstSearcher;
+
+ @Override
+ public void init(NamedList args) {}
+
+ @Override
+ public void postCommit() {}
+
+ @Override
+ public void postSoftCommit() {}
+
+ @Override
+ public void newSearcher(SolrIndexSearcher newSearcher,
+ SolrIndexSearcher currentSearcher) {
+ numberOfTimesCalled.incrementAndGet();
+ if (currentSearcher == null) {
+ numberOfTimesCalledFirstSearcher.incrementAndGet();
+ }
+ }
+
+ }
}