Solr-2598 (Commenting out the <arr name="queries"> section in firstSearcher generates an NPE)

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1137092 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Erick Erickson 2011-06-18 00:10:21 +00:00
parent 5083ab7e5d
commit 4f711ca57a
3 changed files with 172 additions and 1 deletions

View File

@ -41,7 +41,9 @@ public class QuerySenderListener extends AbstractSolrEventListener {
public void newSearcher(SolrIndexSearcher newSearcher, SolrIndexSearcher currentSearcher) {
final SolrIndexSearcher searcher = newSearcher;
log.info("QuerySenderListener sending requests to " + newSearcher);
for (NamedList nlst : (List<NamedList>)args.get("queries")) {
List<NamedList> allLists = (List<NamedList>)args.get("queries");
if (allLists == null) return;
for (NamedList nlst : allLists) {
SolrQueryRequest req = null;
try {

View File

@ -0,0 +1,79 @@
<?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.
-->
<!-- $Id: solrconfig-querysender.xml 1048886 2010-12-14 01:10:52Z hossman $
$Source$
$Name$
-->
<config>
<luceneMatchVersion>${tests.luceneMatchVersion:LUCENE_CURRENT}</luceneMatchVersion>
<!-- The DirectoryFactory to use for indexes.
solr.StandardDirectoryFactory, the default, is filesystem based.
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>
<!-- a newSearcher event is fired whenever a new searcher is being prepared
and there is a current searcher handling requests (aka registered). -->
<!-- QuerySenderListener takes an array of NamedList and executes a
local query request for each NamedList in sequence. -->
<listener event="newSearcher" class="solr.QuerySenderListener">
<!--
<arr name="queries">
<lst> <str name="q">solr</str> <str name="start">0</str> <str name="rows">10</str> <str name="qt">mock</str></lst>
<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
requests or to gain prewarming data from. -->
<listener event="firstSearcher" class="solr.QuerySenderListener">
<!--
<arr name="queries">
<lst> <str name="q">fast_warm</str> <str name="start">0</str> <str name="rows">10</str>
<str name="qt">mock</str>
</lst>
</arr>
-->
</listener>
<listener event="firstSearcher"
class="org.apache.solr.core.MockEventListener" />
</query>
<requestHandler name="mock" class="org.apache.solr.core.MockQuerySenderListenerReqHandler" default="true">
<!-- default values for query parameters -->
</requestHandler>
</config>

View File

@ -0,0 +1,90 @@
package org.apache.solr.core;
/**
* 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.
*/
import org.apache.lucene.store.Directory;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.common.params.EventParams;
import org.apache.solr.search.SolrIndexSearcher;
import org.apache.solr.search.TestExtendedDismaxParser;
import org.apache.solr.util.RefCounted;
import org.junit.BeforeClass;
import org.junit.Test;
public class TestQuerySenderNoQuery 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-noquery.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( 2, core.firstSearcherListeners.size() );
assertEquals( 2, core.newSearcherListeners.size() );
}
// Determine that when the query lists are commented out of both new and
// first searchers in the config, we don't throw an NPE
@Test
public void testSearcherEvents() throws Exception {
SolrCore core = h.getCore();
SolrEventListener newSearcherListener = core.newSearcherListeners.get(0);
assertTrue("Not an instance of QuerySenderListener", newSearcherListener instanceof QuerySenderListener);
QuerySenderListener qsl = (QuerySenderListener) newSearcherListener;
RefCounted<SolrIndexSearcher> currentSearcherRef = core.getSearcher();
SolrIndexSearcher currentSearcher = currentSearcherRef.get();
SolrIndexSearcher dummy = null;
qsl.newSearcher(currentSearcher, dummy);//test first Searcher (since param is null)
MockQuerySenderListenerReqHandler mock = (MockQuerySenderListenerReqHandler) core.getRequestHandler("mock");
assertNotNull("Mock is null", mock);
assertNull("Req (firstsearcher) is not null", mock.req);
Directory dir = currentSearcher.getIndexReader().directory();
SolrIndexSearcher newSearcher = new SolrIndexSearcher(core, core.getSchema(), "testQuerySenderNoQuery", dir, true, false);
qsl.newSearcher(newSearcher, currentSearcher); // get newSearcher.
assertNull("Req (newsearcher) is not null", mock.req);
newSearcher.close();
currentSearcherRef.decref();
}
}