You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ho...@apache.org on 2010/12/14 02:10:53 UTC

svn commit: r1048886 - in /lucene/dev/trunk/solr: ./ src/java/org/apache/solr/core/ src/java/org/apache/solr/update/ src/test/org/apache/solr/core/ src/test/test-files/solr/conf/

Author: hossman
Date: Tue Dec 14 01:10:52 2010
New Revision: 1048886

URL: http://svn.apache.org/viewvc?rev=1048886&view=rev
Log:
SOLR-2285: duplicate SolrEventListeners no longer created (hossman)

Added:
    lucene/dev/trunk/solr/src/test/org/apache/solr/core/MockEventListener.java   (with props)
Modified:
    lucene/dev/trunk/solr/CHANGES.txt
    lucene/dev/trunk/solr/src/java/org/apache/solr/core/SolrConfig.java
    lucene/dev/trunk/solr/src/java/org/apache/solr/core/SolrCore.java
    lucene/dev/trunk/solr/src/java/org/apache/solr/update/UpdateHandler.java
    lucene/dev/trunk/solr/src/test/org/apache/solr/core/TestQuerySenderListener.java
    lucene/dev/trunk/solr/src/test/test-files/solr/conf/solrconfig-querysender.xml

Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1048886&r1=1048885&r2=1048886&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Tue Dec 14 01:10:52 2010
@@ -360,7 +360,6 @@ Optimizations
 
 Bug Fixes
 ----------------------
-
 * SOLR-1432: Make the new ValueSource.getValues(context,reader) delegate
   to the original ValueSource.getValues(reader) so custom sources
   will work. (yonik)
@@ -569,6 +568,8 @@ Bug Fixes
 * SOLR-2219: The init() method of every SolrRequestHandler was being
   called twice. (ambikeshwar singh and hossman)
 
+* SOLR-2285: duplicate SolrEventListeners no longer created (hossman)
+
 Other Changes
 ----------------------
 

Modified: lucene/dev/trunk/solr/src/java/org/apache/solr/core/SolrConfig.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/java/org/apache/solr/core/SolrConfig.java?rev=1048886&r1=1048885&r2=1048886&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/java/org/apache/solr/core/SolrConfig.java (original)
+++ lucene/dev/trunk/solr/src/java/org/apache/solr/core/SolrConfig.java Tue Dec 14 01:10:52 2010
@@ -198,7 +198,13 @@ public class SolrConfig extends Config {
      loadPluginInfo(ValueSourceParser.class,"valueSourceParser",true, true);
      loadPluginInfo(SearchComponent.class,"searchComponent",true, true);
      loadPluginInfo(QueryConverter.class,"queryConverter",true, true);
+
+     // this is hackish, since it picks up all SolrEventListeners,
+     // regardless of when/how/why thye are used (or even if they are 
+     // declared outside of the appropriate context) but there's no nice 
+     // way arround that in the PluginInfo framework
      loadPluginInfo(SolrEventListener.class, "//listener",false, true);
+
      loadPluginInfo(DirectoryFactory.class,"directoryFactory",false, true);
      loadPluginInfo(IndexDeletionPolicy.class,"mainIndex/deletionPolicy",false, true);
      loadPluginInfo(IndexReaderFactory.class,"indexReaderFactory",false, true);

Modified: lucene/dev/trunk/solr/src/java/org/apache/solr/core/SolrCore.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/java/org/apache/solr/core/SolrCore.java?rev=1048886&r1=1048885&r2=1048886&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/java/org/apache/solr/core/SolrCore.java (original)
+++ lucene/dev/trunk/solr/src/java/org/apache/solr/core/SolrCore.java Tue Dec 14 01:10:52 2010
@@ -275,15 +275,19 @@ public final class SolrCore implements S
    }
 
   private void initListeners() {
+    final Class<SolrEventListener> clazz = SolrEventListener.class;
+    final String label = "Event Listener";
     for (PluginInfo info : solrConfig.getPluginInfos(SolrEventListener.class.getName())) {
-      SolrEventListener listener = createInitInstance(info, SolrEventListener.class,"Event Listener",null);      
       String event = info.attributes.get("event");
       if("firstSearcher".equals(event) ){
-        firstSearcherListeners.add(listener);
+        SolrEventListener obj = createInitInstance(info,clazz,label,null);
+        firstSearcherListeners.add(obj);
+        log.info(logid + "Added SolrEventListener for firstSearcher: " + obj);
       } else if("newSearcher".equals(event) ){
-        newSearcherListeners.add(listener);
+        SolrEventListener obj = createInitInstance(info,clazz,label,null);
+        newSearcherListeners.add(obj);
+        log.info(logid + "Added SolrEventListener for newSearcher: " + obj);
       }
-      log.info(logid + "Added SolrEventListener: " + listener);
     }
   }
 

Modified: lucene/dev/trunk/solr/src/java/org/apache/solr/update/UpdateHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/java/org/apache/solr/update/UpdateHandler.java?rev=1048886&r1=1048885&r2=1048886&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/java/org/apache/solr/update/UpdateHandler.java (original)
+++ lucene/dev/trunk/solr/src/java/org/apache/solr/update/UpdateHandler.java Tue Dec 14 01:10:52 2010
@@ -61,15 +61,18 @@ public abstract class UpdateHandler impl
   protected Vector<SolrEventListener> optimizeCallbacks = new Vector<SolrEventListener>();
 
   private void parseEventListeners() {
-    for (PluginInfo pluginInfo : core.getSolrConfig().getPluginInfos(SolrEventListener.class.getName())) {
-      String event = pluginInfo.attributes.get("event");
-      SolrEventListener listener = core.createInitInstance(pluginInfo,SolrEventListener.class,"Event Listener",null);
+    final Class<SolrEventListener> clazz = SolrEventListener.class;
+    final String label = "Event Listener";
+    for (PluginInfo info : core.getSolrConfig().getPluginInfos(SolrEventListener.class.getName())) {
+      String event = info.attributes.get("event");
       if ("postCommit".equals(event)) {
-        commitCallbacks.add(core.createInitInstance(pluginInfo,SolrEventListener.class,"Event Listener",null));
-        log.info("added SolrEventListener for postCommit: " + listener);
+        SolrEventListener obj = core.createInitInstance(info,clazz,label,null);
+        commitCallbacks.add(obj);
+        log.info("added SolrEventListener for postCommit: " + obj);
       } else if ("postOptimize".equals(event)) {
-        optimizeCallbacks.add(listener);
-        log.info("added SolrEventListener for postOptimize: " + listener);
+        SolrEventListener obj = core.createInitInstance(info,clazz,label,null);
+        optimizeCallbacks.add(obj);
+        log.info("added SolrEventListener for postOptimize: " + obj);
       }
     }
   }

Added: lucene/dev/trunk/solr/src/test/org/apache/solr/core/MockEventListener.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/test/org/apache/solr/core/MockEventListener.java?rev=1048886&view=auto
==============================================================================
--- lucene/dev/trunk/solr/src/test/org/apache/solr/core/MockEventListener.java (added)
+++ lucene/dev/trunk/solr/src/test/org/apache/solr/core/MockEventListener.java Tue Dec 14 01:10:52 2010
@@ -0,0 +1,49 @@
+/**
+ * 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.
+ */
+package org.apache.solr.core;
+
+import org.apache.solr.search.SolrIndexSearcher;
+import org.apache.solr.common.util.NamedList;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class MockEventListener implements SolrEventListener {
+
+  final static AtomicInteger createCounter = new AtomicInteger(0);
+
+  public static final int getCreateCount() {
+    return createCounter.intValue();
+  }
+
+  public MockEventListener() {
+    createCounter.incrementAndGet();
+  }
+
+  public void init(NamedList args) {
+    /* NOOP */
+  }
+
+  public void postCommit() {
+    /* NOOP */
+  }
+
+  public void newSearcher(SolrIndexSearcher newSearcher, 
+                          SolrIndexSearcher currentSearcher) {
+    /* NOOP */
+  }
+
+}

Modified: lucene/dev/trunk/solr/src/test/org/apache/solr/core/TestQuerySenderListener.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/test/org/apache/solr/core/TestQuerySenderListener.java?rev=1048886&r1=1048885&r2=1048886&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/test/org/apache/solr/core/TestQuerySenderListener.java (original)
+++ lucene/dev/trunk/solr/src/test/org/apache/solr/core/TestQuerySenderListener.java Tue Dec 14 01:10:52 2010
@@ -28,18 +28,37 @@ import static org.junit.Assert.*;
 
 public class TestQuerySenderListener extends SolrTestCaseJ4 {
 
+  // number of instances configured in the solrconfig.xml
+  private static final int EXPECTED_MOCK_LISTENER_INSTANCES = 4;
+
+  private static int preInitMockListenerCount = 0;
+
   @BeforeClass
   public static void beforeClass() throws Exception {
+    // record current value prior to core initialization
+    // so we can verify the correct number of instances later
+    // NOTE: this won't work properly if concurrent tests run
+    // in the same VM
+    preInitMockListenerCount = MockEventListener.getCreateCount();
+
     initCore("solrconfig-querysender.xml","schema.xml");
   }
 
+  public void testListenerCreationCounts() {
+    SolrCore core = h.getCore();
+
+    assertEquals("Unexpected number of listeners created",
+                 EXPECTED_MOCK_LISTENER_INSTANCES, 
+                 MockEventListener.getCreateCount() - preInitMockListenerCount);
+  }
+
   @Test
   public void testRequestHandlerRegistry() {
     // property values defined in build.xml
     SolrCore core = h.getCore();
 
-    assertEquals( 1, core.firstSearcherListeners.size() );
-    assertEquals( 1, core.newSearcherListeners.size() );
+    assertEquals( 2, core.firstSearcherListeners.size() );
+    assertEquals( 2, core.newSearcherListeners.size() );
   }
 
   @Test

Modified: lucene/dev/trunk/solr/src/test/test-files/solr/conf/solrconfig-querysender.xml
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/test/test-files/solr/conf/solrconfig-querysender.xml?rev=1048886&r1=1048885&r2=1048886&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/test/test-files/solr/conf/solrconfig-querysender.xml (original)
+++ lucene/dev/trunk/solr/src/test/test-files/solr/conf/solrconfig-querysender.xml Tue Dec 14 01:10:52 2010
@@ -29,6 +29,12 @@
         solr.RAMDirectoryFactory is memory based and not persistent. -->
   <directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.RAMDirectoryFactory}"/>
   
+  <updateHandler class="solr.DirectUpdateHandler2">
+    <listener event="postCommit" 
+              class="org.apache.solr.core.MockEventListener" />
+    <listener event="postOptimize" 
+              class="org.apache.solr.core.MockEventListener" />
+  </updateHandler>
   
   <query>
   
@@ -43,6 +49,9 @@
         <lst> <str name="q">rocks</str> <str name="start">0</str> <str name="rows">10</str> <str name="qt">mock</str></lst>
       </arr>
     </listener>
+    <listener event="newSearcher"
+              class="org.apache.solr.core.MockEventListener" />
+
 
     <!-- a firstSearcher event is fired whenever a new searcher is being
          prepared but there is no current registered searcher to handle
@@ -54,6 +63,9 @@
         </lst>
       </arr>
     </listener>
+    <listener event="firstSearcher"
+              class="org.apache.solr.core.MockEventListener" />
+
   
   </query>
   <requestHandler name="mock" class="org.apache.solr.core.MockQuerySenderListenerReqHandler" default="true">