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