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:24:30 UTC

svn commit: r1646577 - in /lucene/dev/trunk/solr: CHANGES.txt core/src/java/org/apache/solr/core/SolrCore.java core/src/test-files/solr/collection1/conf/solrconfig-searcher-listeners1.xml core/src/test/org/apache/solr/search/TestIndexSearcher.java

Author: tflobbe
Date: Thu Dec 18 23:24:30 2014
New Revision: 1646577

URL: http://svn.apache.org/r1646577
Log:
SOLR-6864: Support registering searcher listeners in SolrCoreAware.inform(SolrCore) method

Added:
    lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-searcher-listeners1.xml   (with props)
Modified:
    lucene/dev/trunk/solr/CHANGES.txt
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestIndexSearcher.java

Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1646577&r1=1646576&r2=1646577&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Thu Dec 18 23:24:30 2014
@@ -330,6 +330,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/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java?rev=1646577&r1=1646576&r2=1646577&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java Thu Dec 18 23:24:30 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 {

Added: lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-searcher-listeners1.xml
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-searcher-listeners1.xml?rev=1646577&view=auto
==============================================================================
--- lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-searcher-listeners1.xml (added)
+++ lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-searcher-listeners1.xml Thu Dec 18 23:24:30 2014
@@ -0,0 +1,47 @@
+<?xml version="1.0" ?>
+
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- This is a "kitchen sink" config file that tests can use.
+     When writting a new test, feel free to add *new* items (plugins,
+     config options, etc...) as long as they don't break any existing
+     tests.  if you need to test something esoteric please add a new
+     "solrconfig-your-esoteric-purpose.xml" config file.
+
+     Note in particular that this test is used by MinimalSchemaTest so
+     Anything added to this file needs to work correctly even if there
+     is now uniqueKey or defaultSearch Field.
+  -->
+
+<config>
+
+  <directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.RAMDirectoryFactory}"/>
+
+  <luceneMatchVersion>${tests.luceneMatchVersion:LATEST}</luceneMatchVersion>
+
+  <xi:include href="solrconfig.snippet.randomindexconfig.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
+  
+  <queryResponseWriter name="xml" default="true"
+                       class="solr.XMLResponseWriter" />
+
+  <requestHandler name="standard" class="solr.StandardRequestHandler"/>
+  
+  <searchComponent name="mock" class="org.apache.solr.search.TestIndexSearcher$MockSearchComponent"/>
+
+</config>
+

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestIndexSearcher.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestIndexSearcher.java?rev=1646577&r1=1646576&r2=1646577&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestIndexSearcher.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestIndexSearcher.java Thu Dec 18 23:24:30 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();
+      }
+    }
+    
+  }
 }