mirror of https://github.com/apache/lucene.git
SOLR-2536: add ReloadCacheRequestHandler
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1126487 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
00c35bfec3
commit
0974e2768a
|
@ -333,6 +333,10 @@ Bug Fixes
|
||||||
in strings since those characters are not valid in javascript strings
|
in strings since those characters are not valid in javascript strings
|
||||||
(although they are valid in JSON strings). (yonik)
|
(although they are valid in JSON strings). (yonik)
|
||||||
|
|
||||||
|
* SOLR-2536: Add ReloadCacheRequestHandler to fix ExternalFileField bug (if reopenReaders
|
||||||
|
set to true and no index segments have been changed, commit cannot trigger reload
|
||||||
|
external file). (koji)
|
||||||
|
|
||||||
|
|
||||||
Other Changes
|
Other Changes
|
||||||
----------------------
|
----------------------
|
||||||
|
|
|
@ -16,23 +16,38 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.solr.search.function;
|
package org.apache.solr.search.function;
|
||||||
|
|
||||||
import org.apache.lucene.index.IndexReader;
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.WeakHashMap;
|
||||||
|
|
||||||
import org.apache.lucene.index.DocsEnum;
|
import org.apache.lucene.index.DocsEnum;
|
||||||
|
import org.apache.lucene.index.IndexReader;
|
||||||
|
import org.apache.lucene.index.MultiFields;
|
||||||
|
import org.apache.lucene.index.TermsEnum;
|
||||||
import org.apache.lucene.index.IndexReader.AtomicReaderContext;
|
import org.apache.lucene.index.IndexReader.AtomicReaderContext;
|
||||||
import org.apache.lucene.index.IndexReader.ReaderContext;
|
import org.apache.lucene.index.IndexReader.ReaderContext;
|
||||||
import org.apache.lucene.index.TermsEnum;
|
import org.apache.lucene.util.BytesRef;
|
||||||
import org.apache.lucene.index.MultiFields;
|
|
||||||
import org.apache.lucene.util.ReaderUtil;
|
import org.apache.lucene.util.ReaderUtil;
|
||||||
import org.apache.lucene.util.StringHelper;
|
import org.apache.lucene.util.StringHelper;
|
||||||
import org.apache.lucene.util.BytesRef;
|
|
||||||
import org.apache.solr.core.SolrCore;
|
import org.apache.solr.core.SolrCore;
|
||||||
import org.apache.solr.schema.SchemaField;
|
import org.apache.solr.handler.RequestHandlerBase;
|
||||||
|
import org.apache.solr.handler.RequestHandlerUtils;
|
||||||
|
import org.apache.solr.request.SolrQueryRequest;
|
||||||
|
import org.apache.solr.response.SolrQueryResponse;
|
||||||
import org.apache.solr.schema.FieldType;
|
import org.apache.solr.schema.FieldType;
|
||||||
|
import org.apache.solr.schema.SchemaField;
|
||||||
import org.apache.solr.search.QParser;
|
import org.apache.solr.search.QParser;
|
||||||
|
import org.apache.solr.update.processor.UpdateRequestProcessor;
|
||||||
import org.apache.solr.util.VersionedFile;
|
import org.apache.solr.util.VersionedFile;
|
||||||
|
import org.slf4j.Logger;
|
||||||
import java.io.*;
|
import org.slf4j.LoggerFactory;
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Obtains float field values from an external file.
|
* Obtains float field values from an external file.
|
||||||
|
@ -100,6 +115,10 @@ public class FileFloatSource extends ValueSource {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void resetCache(){
|
||||||
|
floatCache.resetCache();
|
||||||
|
}
|
||||||
|
|
||||||
private final float[] getCachedFloats(IndexReader reader) {
|
private final float[] getCachedFloats(IndexReader reader) {
|
||||||
return (float[])floatCache.get(reader, new Entry(this));
|
return (float[])floatCache.get(reader, new Entry(this));
|
||||||
}
|
}
|
||||||
|
@ -150,6 +169,14 @@ public class FileFloatSource extends ValueSource {
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void resetCache(){
|
||||||
|
synchronized(readerCache){
|
||||||
|
// Map.clear() is optional and can throw UnsipportedOperationException,
|
||||||
|
// but readerCache is WeakHashMap and it supports clear().
|
||||||
|
readerCache.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static Object onlyForTesting; // set to the last value
|
static Object onlyForTesting; // set to the last value
|
||||||
|
@ -272,5 +299,44 @@ public class FileFloatSource extends ValueSource {
|
||||||
return vals;
|
return vals;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class ReloadCacheRequestHandler extends RequestHandlerBase {
|
||||||
|
|
||||||
|
static final Logger log = LoggerFactory.getLogger(ReloadCacheRequestHandler.class);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp)
|
||||||
|
throws Exception {
|
||||||
|
FileFloatSource.resetCache();
|
||||||
|
log.debug("readerCache has been reset.");
|
||||||
|
|
||||||
|
UpdateRequestProcessor processor =
|
||||||
|
req.getCore().getUpdateProcessingChain(null).createProcessor(req, rsp);
|
||||||
|
try{
|
||||||
|
RequestHandlerUtils.handleCommit(req, processor, req.getParams(), true);
|
||||||
|
}
|
||||||
|
finally{
|
||||||
|
processor.finish();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDescription() {
|
||||||
|
return "Reload readerCache request handler";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getSource() {
|
||||||
|
return "$URL$";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getSourceId() {
|
||||||
|
return "$Id$";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getVersion() {
|
||||||
|
return "$Revision$";
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,9 @@
|
||||||
<updateHandler class="solr.DirectUpdateHandler2"/>
|
<updateHandler class="solr.DirectUpdateHandler2"/>
|
||||||
<requestHandler name="/update" class="solr.XmlUpdateRequestHandler" />
|
<requestHandler name="/update" class="solr.XmlUpdateRequestHandler" />
|
||||||
|
|
||||||
|
<requestHandler name="/reloadCache"
|
||||||
|
class="org.apache.solr.search.function.FileFloatSource$ReloadCacheRequestHandler" />
|
||||||
|
|
||||||
<!-- test ValueSourceParser plugins -->
|
<!-- test ValueSourceParser plugins -->
|
||||||
<valueSourceParser name="nvl" class="org.apache.solr.search.function.NvlValueSourceParser">
|
<valueSourceParser name="nvl" class="org.apache.solr.search.function.NvlValueSourceParser">
|
||||||
<float name="nvlFloatValue">0.0</float>
|
<float name="nvlFloatValue">0.0</float>
|
||||||
|
|
|
@ -22,6 +22,8 @@ import org.apache.lucene.search.DefaultSimilarity;
|
||||||
import org.apache.lucene.search.FieldCache;
|
import org.apache.lucene.search.FieldCache;
|
||||||
import org.apache.lucene.search.Similarity;
|
import org.apache.lucene.search.Similarity;
|
||||||
import org.apache.solr.SolrTestCaseJ4;
|
import org.apache.solr.SolrTestCaseJ4;
|
||||||
|
import org.apache.solr.common.params.SolrParams;
|
||||||
|
import org.apache.solr.common.util.NamedList;
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.Ignore;
|
import org.junit.Ignore;
|
||||||
|
@ -191,7 +193,7 @@ public class TestFunctionQuery extends SolrTestCaseJ4 {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testExternalField() {
|
public void testExternalField() throws Exception {
|
||||||
String field = "foo_extf";
|
String field = "foo_extf";
|
||||||
|
|
||||||
float[] ids = {100,-4,0,10,25,5,77,23,55,-78,-45,-24,63,78,94,22,34,54321,261,-627};
|
float[] ids = {100,-4,0,10,25,5,77,23,55,-78,-45,-24,63,78,94,22,34,54321,261,-627};
|
||||||
|
@ -210,8 +212,7 @@ public class TestFunctionQuery extends SolrTestCaseJ4 {
|
||||||
assertTrue(orig == FileFloatSource.onlyForTesting);
|
assertTrue(orig == FileFloatSource.onlyForTesting);
|
||||||
|
|
||||||
makeExternalFile(field, "0=1","UTF-8");
|
makeExternalFile(field, "0=1","UTF-8");
|
||||||
assertU(adoc("id", "10000")); // will get same reader if no index change
|
assertU(h.query("/reloadCache",lrf.makeRequest("","")));
|
||||||
assertU(commit());
|
|
||||||
singleTest(field, "sqrt(\0)");
|
singleTest(field, "sqrt(\0)");
|
||||||
assertTrue(orig != FileFloatSource.onlyForTesting);
|
assertTrue(orig != FileFloatSource.onlyForTesting);
|
||||||
|
|
||||||
|
@ -247,8 +248,7 @@ public class TestFunctionQuery extends SolrTestCaseJ4 {
|
||||||
makeExternalFile(field, sb.toString(),"UTF-8");
|
makeExternalFile(field, sb.toString(),"UTF-8");
|
||||||
|
|
||||||
// make it visible
|
// make it visible
|
||||||
assertU(adoc("id", "10001")); // will get same reader if no index change
|
assertU(h.query("/reloadCache",lrf.makeRequest("","")));
|
||||||
assertU(commit());
|
|
||||||
|
|
||||||
// test it
|
// test it
|
||||||
float[] answers = new float[ids.length*2];
|
float[] answers = new float[ids.length*2];
|
||||||
|
|
Loading…
Reference in New Issue