You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by si...@apache.org on 2011/07/07 11:04:29 UTC
svn commit: r1143719 [16/20] - in /lucene/dev/branches/LUCENE2793: ./
dev-tools/eclipse/ dev-tools/idea/.idea/ dev-tools/idea/lucene/contrib/
dev-tools/idea/lucene/contrib/demo/
dev-tools/idea/lucene/contrib/highlighter/ dev-tools/idea/lucene/contrib/i...
Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/CloseHook.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/CloseHook.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/CloseHook.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/CloseHook.java Thu Jul 7 09:03:58 2011
@@ -18,27 +18,40 @@ package org.apache.solr.core;
/**
- * Interface to request notification when the core is closed.
- *<p/>
+ * Used to request notification when the core is closed.
+ * <p/>
* Call {@link org.apache.solr.core.SolrCore#addCloseHook(org.apache.solr.core.CloseHook)} during the {@link org.apache.solr.util.plugin.SolrCoreAware#inform(SolrCore)} method to
* add a close hook to your object.
* <p/>
- * The close hook can be useful for releasing objects related to the request handler (for instance, if you have a JDBC DataSource or something like that)
- *
- *
- */
+ * The close hook can be useful for releasing objects related to the request handler (for instance, if you have a JDBC DataSource or something like that)
+ */
+
+public abstract class CloseHook {
+
+ /**
+ * Method called when the given SolrCore object is closing / shutting down but before the update handler and
+ * searcher(s) are actually closed
+ * <br />
+ * <b>Important:</b> Keep the method implementation as short as possible. If it were to use any heavy i/o , network connections -
+ * it might be a better idea to launch in a separate Thread so as to not to block the process of
+ * shutting down a given SolrCore instance.
+ *
+ * @param core SolrCore object that is shutting down / closing
+ */
+ public abstract void preClose(SolrCore core);
- public interface CloseHook {
-
- /**
- * Method called when the given SolrCore object is closing / shutting down.
- * <br />
- * <b>Important:</b> Keep the method implementation as short as possible. If it were to use any heavy i/o , network connections -
- * it might be a better idea to launch in a separate Thread so as to not to block the process of
- * shutting down a given SolrCore instance.
- *
- *
- * @param core SolrCore object that is shutting down / closing
- */
- void close( SolrCore core );
- }
+ /**
+ * Method called when the given SolrCore object has been shut down and update handlers and searchers are closed
+ * <br/>
+ * Use this method for post-close clean up operations e.g. deleting the index from disk.
+ * <br/>
+ * <b>The core's passed to the method is already closed and therefore, it's update handler or searcher should *NOT* be used</b>
+ *
+ * <b>Important:</b> Keep the method implementation as short as possible. If it were to use any heavy i/o , network connections -
+ * it might be a better idea to launch in a separate Thread so as to not to block the process of
+ * shutting down a given SolrCore instance.
+ *
+ * @param core
+ */
+ public abstract void postClose(SolrCore core);
+}
Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/CoreContainer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/CoreContainer.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/CoreContainer.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/CoreContainer.java Thu Jul 7 09:03:58 2011
@@ -18,7 +18,6 @@
package org.apache.solr.core;
import java.io.*;
-import java.nio.channels.FileChannel;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeoutException;
@@ -43,6 +42,8 @@ import org.apache.solr.common.util.DOMUt
import org.apache.solr.common.util.XML;
import org.apache.solr.common.util.FileUtils;
import org.apache.solr.common.util.SystemIdResolver;
+import org.apache.solr.core.SolrXMLSerializer.SolrCoreXMLDef;
+import org.apache.solr.core.SolrXMLSerializer.SolrXMLDef;
import org.apache.solr.handler.admin.CoreAdminHandler;
import org.apache.solr.schema.IndexSchema;
import org.apache.zookeeper.KeeperException;
@@ -82,6 +83,7 @@ public class CoreContainer
protected Integer zkClientTimeout;
protected String solrHome;
protected String defaultCoreName = "";
+ private SolrXMLSerializer solrXMLSerializer = new SolrXMLSerializer();
private ZkController zkController;
private SolrZkServer zkServer;
@@ -250,7 +252,7 @@ public class CoreContainer
}
}
- private static Properties getCoreProps(String instanceDir, String file, Properties defaults) {
+ static Properties getCoreProps(String instanceDir, String file, Properties defaults) {
if(file == null) file = "conf"+File.separator+ "solrcore.properties";
File corePropsFile = new File(file);
if(!corePropsFile.isAbsolute()){
@@ -648,9 +650,8 @@ public class CoreContainer
schema = new IndexSchema(config, dcore.getSchemaName(), null);
}
}
- String dataDir = null;
- SolrCore core = new SolrCore(dcore.getName(), dataDir, config, schema, dcore);
+ SolrCore core = new SolrCore(dcore.getName(), null, config, schema, dcore);
return core;
}
@@ -712,7 +713,7 @@ public class CoreContainer
if (core == null)
throw new SolrException( SolrException.ErrorCode.BAD_REQUEST, "No such core: " + name );
- SolrCore newCore = create(core.getCoreDescriptor());
+ SolrCore newCore = core.reload(libLoader);
register(name, newCore, false);
}
@@ -847,172 +848,79 @@ public class CoreContainer
/** Persists the cores config file in a user provided file. */
public void persistFile(File file) {
- log.info("Persisting cores config to " + (file==null ? configFile : file));
-
- File tmpFile = null;
- try {
- // write in temp first
- if (file == null) {
- file = tmpFile = File.createTempFile("solr", ".xml", configFile.getParentFile());
- }
- java.io.FileOutputStream out = new java.io.FileOutputStream(file);
- Writer writer = new BufferedWriter(new OutputStreamWriter(out, "UTF-8"));
- persist(writer);
- writer.flush();
- writer.close();
- out.close();
- // rename over origin or copy it this fails
- if (tmpFile != null) {
- if (tmpFile.renameTo(configFile))
- tmpFile = null;
- else
- fileCopy(tmpFile, configFile);
- }
- }
- catch(java.io.FileNotFoundException xnf) {
- throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, xnf);
- }
- catch(java.io.IOException xio) {
- throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, xio);
- }
- finally {
- if (tmpFile != null) {
- if (!tmpFile.delete())
- tmpFile.deleteOnExit();
- }
- }
- }
-
- /** Write the cores configuration through a writer.*/
- void persist(Writer w) throws IOException {
- w.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
- w.write("<solr");
- if (this.libDir != null) {
- writeAttribute(w,"sharedLib",libDir);
- }
- if(zkHost != null) writeAttribute(w, "zkHost", zkHost);
- writeAttribute(w,"persistent",isPersistent());
- w.write(">\n");
-
- if (containerProperties != null && !containerProperties.isEmpty()) {
- writeProperties(w, containerProperties, " ");
- }
- w.write(" <cores");
- writeAttribute(w, "adminPath",adminPath);
- if(adminHandler != null) writeAttribute(w, "adminHandler", adminHandler);
- if(shareSchema) writeAttribute(w, "shareSchema", "true");
- if(!defaultCoreName.equals("")) writeAttribute(w, "defaultCoreName", defaultCoreName);
- if(host != null) writeAttribute(w, "host", host);
- if(hostPort != null) writeAttribute(w, "hostPort", hostPort);
- if(zkClientTimeout != null) writeAttribute(w, "zkClientTimeout", zkClientTimeout);
- if(hostContext != null) writeAttribute(w, "hostContext", hostContext);
- w.write(">\n");
-
- synchronized(cores) {
+ log.info("Persisting cores config to " + (file == null ? configFile : file));
+ // <solr attrib="value">
+ Map<String,String> rootSolrAttribs = new HashMap<String,String>();
+ if (libDir != null) rootSolrAttribs.put("sharedLib", libDir);
+ rootSolrAttribs.put("persistent", Boolean.toString(isPersistent()));
+
+ // <solr attrib="value"> <cores attrib="value">
+ Map<String,String> coresAttribs = new HashMap<String,String>();
+ coresAttribs.put("adminPath", adminPath);
+ if (adminHandler != null) coresAttribs.put("adminHandler", adminHandler);
+ if (shareSchema) coresAttribs.put("shareSchema", "true");
+ if (!defaultCoreName.equals("")) coresAttribs.put("defaultCoreName",
+ defaultCoreName);
+ if (host != null) coresAttribs.put("host", host);
+ if (hostPort != null) coresAttribs.put("hostPort", hostPort);
+ if (zkClientTimeout != null) coresAttribs.put("zkClientTimeout", Integer.toString(zkClientTimeout));
+ if (hostContext != null) coresAttribs.put("hostContext", hostContext);
+
+ List<SolrCoreXMLDef> solrCoreXMLDefs = new ArrayList<SolrCoreXMLDef>();
+
+ synchronized (cores) {
+ Map<String,String> coreAttribs = new HashMap<String,String>();
for (SolrCore solrCore : cores.values()) {
- persist(w,solrCore.getCoreDescriptor());
+ CoreDescriptor dcore = solrCore.getCoreDescriptor();
+
+ coreAttribs.put("name", dcore.name.equals("") ? defaultCoreName
+ : dcore.name);
+ coreAttribs.put("instanceDir", dcore.getInstanceDir());
+ // write config (if not default)
+ String opt = dcore.getConfigName();
+ if (opt != null && !opt.equals(dcore.getDefaultConfigName())) {
+ coreAttribs.put("config", opt);
+ }
+ // write schema (if not default)
+ opt = dcore.getSchemaName();
+ if (opt != null && !opt.equals(dcore.getDefaultSchemaName())) {
+ coreAttribs.put("schema", opt);
+ }
+ opt = dcore.getPropertiesName();
+ if (opt != null) {
+ coreAttribs.put("properties", opt);
+ }
+ opt = dcore.dataDir;
+ if (opt != null) coreAttribs.put("dataDir", opt);
+
+ CloudDescriptor cd = dcore.getCloudDescriptor();
+ if (cd != null) {
+ opt = cd.getShardId();
+ if (opt != null) coreAttribs.put("shard", opt);
+ // only write out the collection name if it's not the default (the
+ // core
+ // name)
+ opt = cd.getCollectionName();
+ if (opt != null && !opt.equals(dcore.name)) coreAttribs.put(
+ "collection", opt);
+ }
+
+ SolrCoreXMLDef solrCoreXMLDef = new SolrCoreXMLDef();
+ solrCoreXMLDef.coreAttribs = coreAttribs;
+ solrCoreXMLDef.coreProperties = dcore.getCoreProperties();
+ solrCoreXMLDefs.add(solrCoreXMLDef);
}
- }
-
- w.write(" </cores>\n");
- w.write("</solr>\n");
- }
-
- private void writeAttribute(Writer w, String name, Object value) throws IOException {
- if (value == null) return;
- w.write(" ");
- w.write(name);
- w.write("=\"");
- XML.escapeAttributeValue(value.toString(), w);
- w.write("\"");
- }
-
- /** Writes the cores configuration node for a given core. */
- void persist(Writer w, CoreDescriptor dcore) throws IOException {
- w.write(" <core");
- writeAttribute(w,"name",dcore.name.equals("") ? defaultCoreName : dcore.name);
- writeAttribute(w,"instanceDir",dcore.getInstanceDir());
- //write config (if not default)
- String opt = dcore.getConfigName();
- if (opt != null && !opt.equals(dcore.getDefaultConfigName())) {
- writeAttribute(w, "config",opt);
- }
- //write schema (if not default)
- opt = dcore.getSchemaName();
- if (opt != null && !opt.equals(dcore.getDefaultSchemaName())) {
- writeAttribute(w,"schema",opt);
- }
- opt = dcore.getPropertiesName();
- if (opt != null) {
- writeAttribute(w,"properties",opt);
- }
- opt = dcore.dataDir;
- if (opt != null) writeAttribute(w,"dataDir",opt);
-
- CloudDescriptor cd = dcore.getCloudDescriptor();
- if (cd != null) {
- opt = cd.getShardId();
- if (opt != null)
- writeAttribute(w,"shard",opt);
- // only write out the collection name if it's not the default (the core name)
- opt = cd.getCollectionName();
- if (opt != null && !opt.equals(dcore.name))
- writeAttribute(w,"collection",opt);
- }
-
- if (dcore.getCoreProperties() == null || dcore.getCoreProperties().isEmpty())
- w.write("/>\n"); // core
- else {
- w.write(">\n");
- writeProperties(w, dcore.getCoreProperties(), " ");
- w.write(" </core>\n");
- }
- }
-
- private void writeProperties(Writer w, Properties props, String indent) throws IOException {
- for (Map.Entry<Object, Object> entry : props.entrySet()) {
- w.write(indent + "<property");
- writeAttribute(w,"name",entry.getKey());
- writeAttribute(w,"value",entry.getValue());
- w.write("/>\n");
+
+ SolrXMLDef solrXMLDef = new SolrXMLDef();
+ solrXMLDef.coresDefs = solrCoreXMLDefs;
+ solrXMLDef.containerProperties = containerProperties;
+ solrXMLDef.solrAttribs = rootSolrAttribs;
+ solrXMLDef.coresAttribs = coresAttribs;
+ solrXMLSerializer.persistFile(file == null ? configFile : file,
+ solrXMLDef);
}
}
- /** Copies a src file to a dest file:
- * used to circumvent the platform discrepancies regarding renaming files.
- */
- public static void fileCopy(File src, File dest) throws IOException {
- IOException xforward = null;
- FileInputStream fis = null;
- FileOutputStream fos = null;
- FileChannel fcin = null;
- FileChannel fcout = null;
- try {
- fis = new FileInputStream(src);
- fos = new FileOutputStream(dest);
- fcin = fis.getChannel();
- fcout = fos.getChannel();
- // do the file copy 32Mb at a time
- final int MB32 = 32*1024*1024;
- long size = fcin.size();
- long position = 0;
- while (position < size) {
- position += fcin.transferTo(position, MB32, fcout);
- }
- }
- catch(IOException xio) {
- xforward = xio;
- }
- finally {
- if (fis != null) try { fis.close(); fis = null; } catch(IOException xio) {}
- if (fos != null) try { fos.close(); fos = null; } catch(IOException xio) {}
- if (fcin != null && fcin.isOpen() ) try { fcin.close(); fcin = null; } catch(IOException xio) {}
- if (fcout != null && fcout.isOpen()) try { fcout.close(); fcout = null; } catch(IOException xio) {}
- }
- if (xforward != null) {
- throw xforward;
- }
- }
public String getSolrHome() {
return solrHome;
Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrConfig.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrConfig.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrConfig.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrConfig.java Thu Jul 7 09:03:58 2011
@@ -20,11 +20,7 @@ package org.apache.solr.core;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.util.DOMUtil;
import org.apache.solr.common.util.RegexFileFilter;
-import org.apache.solr.common.util.NamedList;
-import org.apache.solr.handler.PingRequestHandler;
import org.apache.solr.handler.component.SearchComponent;
-import org.apache.solr.request.LocalSolrQueryRequest;
-import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.request.SolrRequestHandler;
import org.apache.solr.response.QueryResponseWriter;
import org.apache.solr.response.transform.TransformerFactory;
@@ -36,7 +32,6 @@ import org.apache.solr.search.ValueSourc
import org.apache.solr.update.SolrIndexConfig;
import org.apache.solr.update.processor.UpdateRequestProcessorChain;
import org.apache.solr.spelling.QueryConverter;
-import org.apache.solr.highlight.SolrHighlighter;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.index.IndexDeletionPolicy;
import org.apache.lucene.index.codecs.Codec;
@@ -217,7 +212,9 @@ public class SolrConfig extends Config {
return new UpdateHandlerInfo(get("updateHandler/@class",null),
getInt("updateHandler/autoCommit/maxDocs",-1),
getInt("updateHandler/autoCommit/maxTime",-1),
- getInt("updateHandler/commitIntervalLowerBound",-1));
+ getInt("updateHandler/commitIntervalLowerBound",-1),
+ getInt("updateHandler/autoSoftCommit/maxDocs",-1),
+ getInt("updateHandler/autoSoftCommit/maxTime",-1));
}
private void loadPluginInfo(Class clazz, String tag, boolean requireName, boolean requireClass) {
@@ -374,7 +371,8 @@ public class SolrConfig extends Config {
public static class UpdateHandlerInfo{
public final String className;
- public final int autoCommmitMaxDocs,autoCommmitMaxTime,commitIntervalLowerBound;
+ public final int autoCommmitMaxDocs,autoCommmitMaxTime,commitIntervalLowerBound,
+ autoSoftCommmitMaxDocs,autoSoftCommmitMaxTime;
/**
* @param className
@@ -382,11 +380,15 @@ public class SolrConfig extends Config {
* @param autoCommmitMaxTime set -1 as default
* @param commitIntervalLowerBound set -1 as default
*/
- public UpdateHandlerInfo(String className, int autoCommmitMaxDocs, int autoCommmitMaxTime, int commitIntervalLowerBound) {
+ public UpdateHandlerInfo(String className, int autoCommmitMaxDocs, int autoCommmitMaxTime, int commitIntervalLowerBound,
+ int autoSoftCommmitMaxDocs, int autoSoftCommmitMaxTime) {
this.className = className;
this.autoCommmitMaxDocs = autoCommmitMaxDocs;
this.autoCommmitMaxTime = autoCommmitMaxTime;
this.commitIntervalLowerBound = commitIntervalLowerBound;
+
+ this.autoSoftCommmitMaxDocs = autoSoftCommmitMaxDocs;
+ this.autoSoftCommmitMaxTime = autoSoftCommmitMaxTime;
}
}
Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrCore.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrCore.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrCore.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrCore.java Thu Jul 7 09:03:58 2011
@@ -32,7 +32,6 @@ import org.apache.solr.common.util.Named
import org.apache.solr.common.util.SimpleOrderedMap;
import org.apache.solr.handler.admin.ShowFileRequestHandler;
import org.apache.solr.handler.component.*;
-import org.apache.solr.highlight.SolrHighlighter;
import org.apache.solr.request.*;
import org.apache.solr.response.*;
import org.apache.solr.response.transform.TransformerFactory;
@@ -297,6 +296,24 @@ public final class SolrCore implements S
public void registerResponseWriter( String name, QueryResponseWriter responseWriter ){
responseWriters.put(name, responseWriter);
}
+
+ public SolrCore reload(ClassLoader libLoader) throws IOException, ParserConfigurationException, SAXException {
+ // TODO - null descriptor and what if indexwriter settings have changed
+ SolrResourceLoader solrLoader = new SolrResourceLoader(getResourceLoader()
+ .getInstanceDir(), libLoader, CoreContainer.getCoreProps(
+ getResourceLoader().getInstanceDir(),
+ coreDescriptor.getPropertiesName(), coreDescriptor.getCoreProperties()));
+ SolrConfig config = new SolrConfig(solrLoader,
+ coreDescriptor.getConfigName(), null);
+
+ IndexSchema schema = new IndexSchema(config,
+ coreDescriptor.getSchemaName(), null);
+
+ updateHandler.incref();
+ SolrCore core = new SolrCore(coreDescriptor.getName(), null, config,
+ schema, coreDescriptor, updateHandler);
+ return core;
+ }
// gets a non-caching searcher
@@ -411,6 +428,32 @@ public final class SolrCore implements S
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,"Error Instantiating "+msg+", "+className+ " failed to instantiate " +cast.getName(), e, false);
}
}
+
+ private <T extends Object> T createReloadedUpdateHandler(String className, Class<UpdateHandler> class1, String msg, UpdateHandler updateHandler) {
+ Class clazz = null;
+ if (msg == null) msg = "SolrCore Object";
+ try {
+ clazz = getResourceLoader().findClass(className);
+ if (class1 != null && !class1.isAssignableFrom(clazz)) {
+ throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,"Error Instantiating "+msg+", "+className+ " is not a " +class1.getName());
+ }
+ //most of the classes do not have constructors which takes SolrCore argument. It is recommended to obtain SolrCore by implementing SolrCoreAware.
+ // So invariably always it will cause a NoSuchMethodException. So iterate though the list of available constructors
+ Constructor justSolrCoreCon = null;
+ Constructor[] cons = clazz.getConstructors();
+ for (Constructor con : cons) {
+ Class[] types = con.getParameterTypes();
+ if(types.length == 2 && types[0] == SolrCore.class && types[1] == UpdateHandler.class){
+ return (T)con.newInstance(this, updateHandler);
+ }
+ }
+ throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,"Error Instantiating "+msg+", "+className+ " could not find proper constructor for " +class1.getName(), false);
+ } catch (SolrException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,"Error Instantiating "+msg+", "+className+ " failed to instantiate " +class1.getName(), e, false);
+ }
+ }
public <T extends Object> T createInitInstance(PluginInfo info,Class<T> cast, String msg, String defClassName){
if(info == null) return null;
@@ -435,6 +478,10 @@ public final class SolrCore implements S
return createInstance(className, UpdateHandler.class, "Update Handler");
}
+ private UpdateHandler createUpdateHandler(String className, UpdateHandler updateHandler) {
+ return createReloadedUpdateHandler(className, UpdateHandler.class, "Update Handler", updateHandler);
+ }
+
/**
*
* @param dataDir
@@ -452,13 +499,30 @@ public final class SolrCore implements S
/**
* Creates a new core and register it in the list of cores.
* If a core with the same name already exists, it will be stopped and replaced by this one.
+ *
+ * @param name
+ * @param dataDir the index directory
+ * @param config a solr config instance
+ * @param schema a solr schema instance
+ * @param cd
+ *
+ * @since solr 1.3
+ */
+ public SolrCore(String name, String dataDir, SolrConfig config, IndexSchema schema, CoreDescriptor cd) {
+ this(name, dataDir, config, schema, cd, null);
+ }
+
+ /**
+ * Creates a new core and register it in the list of cores.
+ * If a core with the same name already exists, it will be stopped and replaced by this one.
*@param dataDir the index directory
*@param config a solr config instance
*@param schema a solr schema instance
+ *@param updateHandler
*
*@since solr 1.3
*/
- public SolrCore(String name, String dataDir, SolrConfig config, IndexSchema schema, CoreDescriptor cd) {
+ public SolrCore(String name, String dataDir, SolrConfig config, IndexSchema schema, CoreDescriptor cd, UpdateHandler updateHandler) {
coreDescriptor = cd;
this.setName( name );
resourceLoader = config.getResourceLoader();
@@ -536,13 +600,22 @@ public final class SolrCore implements S
String updateHandlerClass = solrConfig.getUpdateHandlerInfo().className;
- updateHandler = createUpdateHandler(updateHandlerClass == null ? DirectUpdateHandler2.class.getName():updateHandlerClass);
- infoRegistry.put("updateHandler", updateHandler);
+ if (updateHandler == null) {
+ this.updateHandler = createUpdateHandler(updateHandlerClass == null ? DirectUpdateHandler2.class
+ .getName() : updateHandlerClass);
+ } else {
+
+ this.updateHandler = createUpdateHandler(
+ updateHandlerClass == null ? DirectUpdateHandler2.class.getName()
+ : updateHandlerClass, updateHandler);
+ }
+ infoRegistry.put("updateHandler", this.updateHandler);
// Finally tell anyone who wants to know
resourceLoader.inform( resourceLoader );
resourceLoader.inform( this ); // last call before the latch is released.
} catch (IOException e) {
+ log.error("", e);
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, null, e, false);
} finally {
// allow firstSearcher events to fire
@@ -654,7 +727,7 @@ public final class SolrCore implements S
if( closeHooks != null ) {
for( CloseHook hook : closeHooks ) {
try {
- hook.close( this );
+ hook.preClose( this );
} catch (Throwable e) {
SolrException.log(log, e);
}
@@ -693,7 +766,15 @@ public final class SolrCore implements S
SolrException.log(log,e);
}
-
+ if( closeHooks != null ) {
+ for( CloseHook hook : closeHooks ) {
+ try {
+ hook.postClose( this );
+ } catch (Throwable e) {
+ SolrException.log(log, e);
+ }
+ }
+ }
}
/** Current core usage count. */
@@ -909,7 +990,10 @@ public final class SolrCore implements S
}
}
-
+ public RefCounted<SolrIndexSearcher> getSearcher(boolean forceNew, boolean returnSearcher, final Future[] waitSearcher) throws IOException {
+ return getSearcher(forceNew, returnSearcher, waitSearcher, false);
+ }
+
/**
* Get a {@link SolrIndexSearcher} or start the process of creating a new one.
* <p>
@@ -944,12 +1028,13 @@ public final class SolrCore implements S
* <tt>null</tt> in which case the SolrIndexSearcher created has already been registered at the time
* this method returned.
* <p>
- * @param forceNew if true, force the open of a new index searcher regardless if there is already one open.
- * @param returnSearcher if true, returns a {@link SolrIndexSearcher} holder with the refcount already incremented.
- * @param waitSearcher if non-null, will be filled in with a {@link Future} that will return after the new searcher is registered.
+ * @param forceNew if true, force the open of a new index searcher regardless if there is already one open.
+ * @param returnSearcher if true, returns a {@link SolrIndexSearcher} holder with the refcount already incremented.
+ * @param waitSearcher if non-null, will be filled in with a {@link Future} that will return after the new searcher is registered.
+ * @param updateHandlerReopens if true, the UpdateHandler will be used when reopening a {@link SolrIndexSearcher}.
* @throws IOException
*/
- public RefCounted<SolrIndexSearcher> getSearcher(boolean forceNew, boolean returnSearcher, final Future[] waitSearcher) throws IOException {
+ public RefCounted<SolrIndexSearcher> getSearcher(boolean forceNew, boolean returnSearcher, final Future[] waitSearcher, boolean updateHandlerReopens) throws IOException {
// it may take some time to open an index.... we may need to make
// sure that two threads aren't trying to open one at the same time
// if it isn't necessary.
@@ -1016,14 +1101,25 @@ public final class SolrCore implements S
if (newestSearcher != null && solrConfig.reopenReaders
&& indexDirFile.equals(newIndexDirFile)) {
- IndexReader currentReader = newestSearcher.get().getIndexReader();
- IndexReader newReader = currentReader.reopen();
-
- if (newReader == currentReader) {
- currentReader.incRef();
+
+ if (updateHandlerReopens) {
+
+ tmp = getUpdateHandler().reopenSearcher(newestSearcher.get());
+
+ } else {
+
+ IndexReader currentReader = newestSearcher.get().getIndexReader();
+ IndexReader newReader;
+
+ newReader = currentReader.reopen();
+
+ if (newReader == currentReader) {
+ currentReader.incRef();
+ }
+
+ tmp = new SolrIndexSearcher(this, schema, "main", newReader, true, true);
}
- tmp = new SolrIndexSearcher(this, schema, "main", newReader, true, true);
} else {
IndexReader reader = getIndexReaderFactory().newReader(getDirectoryFactory().open(newIndexDir), true);
tmp = new SolrIndexSearcher(this, schema, "main", reader, true, true);
Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrEventListener.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrEventListener.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrEventListener.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrEventListener.java Thu Jul 7 09:03:58 2011
@@ -31,6 +31,8 @@ public interface SolrEventListener exten
public void postCommit();
+
+ public void postSoftCommit();
/** The searchers passed here are only guaranteed to be valid for the duration
* of this method call, so care should be taken not to spawn threads or asynchronous
Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrResourceLoader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrResourceLoader.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrResourceLoader.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrResourceLoader.java Thu Jul 7 09:03:58 2011
@@ -30,6 +30,7 @@ import java.net.URLClassLoader;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
+import org.apache.solr.handler.component.ShardHandlerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -653,7 +654,8 @@ public class SolrResourceLoader implemen
SolrRequestHandler.class,
QueryResponseWriter.class,
SearchComponent.class,
- UpdateRequestProcessorFactory.class
+ UpdateRequestProcessorFactory.class,
+ ShardHandlerFactory.class
}
);
Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/JsonLoader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/JsonLoader.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/JsonLoader.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/JsonLoader.java Thu Jul 7 09:03:58 2011
@@ -105,13 +105,13 @@ class JsonLoader extends ContentStreamLo
}
else if( v.equals( XmlUpdateRequestHandler.COMMIT ) ) {
CommitUpdateCommand cmd = new CommitUpdateCommand(req, false );
- cmd.waitFlush = cmd.waitSearcher = true;
+ cmd.waitSearcher = true;
parseCommitOptions( cmd );
processor.processCommit( cmd );
}
else if( v.equals( XmlUpdateRequestHandler.OPTIMIZE ) ) {
CommitUpdateCommand cmd = new CommitUpdateCommand(req, true );
- cmd.waitFlush = cmd.waitSearcher = true;
+ cmd.waitSearcher = true;
parseCommitOptions( cmd );
processor.processCommit( cmd );
}
@@ -207,9 +207,6 @@ class JsonLoader extends ContentStreamLo
if( XmlUpdateRequestHandler.WAIT_SEARCHER.equals( key ) ) {
cmd.waitSearcher = parser.getBoolean();
}
- else if( XmlUpdateRequestHandler.WAIT_FLUSH.equals( key ) ) {
- cmd.waitFlush = parser.getBoolean();
- }
else {
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Unknown key: "+key+" ["+parser.getPosition()+"]" );
}
Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/PingRequestHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/PingRequestHandler.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/PingRequestHandler.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/PingRequestHandler.java Thu Jul 7 09:03:58 2011
@@ -56,6 +56,11 @@ public class PingRequestHandler extends
"Unknown RequestHandler: "+qt );
}
+ if( handler instanceof PingRequestHandler ) {
+ throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
+ "Cannot execute the PingRequestHandler recursively" );
+ }
+
// Execute the ping query and catch any possible exception
Throwable ex = null;
try {
Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/ReplicationHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/ReplicationHandler.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/ReplicationHandler.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/ReplicationHandler.java Thu Jul 7 09:03:58 2011
@@ -31,7 +31,6 @@ import org.apache.solr.request.SolrQuery
import org.apache.solr.response.BinaryQueryResponseWriter;
import org.apache.solr.response.SolrQueryResponse;
import org.apache.solr.search.SolrIndexSearcher;
-import org.apache.solr.update.DirectUpdateHandler2;
import org.apache.solr.util.RefCounted;
import org.apache.solr.util.plugin.SolrCoreAware;
import org.apache.commons.io.IOUtils;
@@ -852,12 +851,9 @@ public class ReplicationHandler extends
***/
}
}
- if (core.getUpdateHandler() instanceof DirectUpdateHandler2) {
- ((DirectUpdateHandler2) core.getUpdateHandler()).forceOpenWriter();
- } else {
- LOG.warn("The update handler being used is not an instance or sub-class of DirectUpdateHandler2. " +
- "Replicate on Startup cannot work.");
- }
+
+ // reboot the writer on the new index
+ core.getUpdateHandler().newIndexWriter();
} catch (IOException e) {
LOG.warn("Unable to get IndexCommit on startup", e);
@@ -889,11 +885,15 @@ public class ReplicationHandler extends
*/
private void registerCloseHook() {
core.addCloseHook(new CloseHook() {
- public void close(SolrCore core) {
+ @Override
+ public void preClose(SolrCore core) {
if (snapPuller != null) {
snapPuller.destroy();
}
}
+
+ @Override
+ public void postClose(SolrCore core) {}
});
}
@@ -965,6 +965,11 @@ public class ReplicationHandler extends
}
public void newSearcher(SolrIndexSearcher newSearcher, SolrIndexSearcher currentSearcher) { /*no op*/}
+
+ @Override
+ public void postSoftCommit() {
+
+ }
};
}
Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/RequestHandlerUtils.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/RequestHandlerUtils.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/RequestHandlerUtils.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/RequestHandlerUtils.java Thu Jul 7 09:03:58 2011
@@ -66,8 +66,8 @@ public class RequestHandlerUtils
if( optimize || commit || force ) {
CommitUpdateCommand cmd = new CommitUpdateCommand(req, optimize );
- cmd.waitFlush = params.getBool( UpdateParams.WAIT_FLUSH, cmd.waitFlush );
cmd.waitSearcher = params.getBool( UpdateParams.WAIT_SEARCHER, cmd.waitSearcher );
+ cmd.softCommit = params.getBool( UpdateParams.SOFT_COMMIT, cmd.softCommit );
cmd.expungeDeletes = params.getBool( UpdateParams.EXPUNGE_DELETES, cmd.expungeDeletes);
cmd.maxOptimizeSegments = params.getInt(UpdateParams.MAX_OPTIMIZE_SEGMENTS, cmd.maxOptimizeSegments);
req.getCore().getUpdateHandler().commit( cmd );
@@ -100,8 +100,8 @@ public class RequestHandlerUtils
if( optimize || commit || force ) {
CommitUpdateCommand cmd = new CommitUpdateCommand(req, optimize );
- cmd.waitFlush = params.getBool( UpdateParams.WAIT_FLUSH, cmd.waitFlush );
cmd.waitSearcher = params.getBool( UpdateParams.WAIT_SEARCHER, cmd.waitSearcher );
+ cmd.softCommit = params.getBool( UpdateParams.SOFT_COMMIT, cmd.softCommit );
cmd.expungeDeletes = params.getBool( UpdateParams.EXPUNGE_DELETES, cmd.expungeDeletes);
cmd.maxOptimizeSegments = params.getInt(UpdateParams.MAX_OPTIMIZE_SEGMENTS, cmd.maxOptimizeSegments);
processor.processCommit( cmd );
Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/SnapPuller.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/SnapPuller.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/SnapPuller.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/SnapPuller.java Thu Jul 7 09:03:58 2011
@@ -24,17 +24,15 @@ import org.apache.lucene.index.IndexComm
import org.apache.solr.common.SolrException;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.common.util.FastInputStream;
+import org.apache.solr.common.util.FileUtils;
import org.apache.solr.common.util.JavaBinCodec;
import org.apache.solr.common.util.NamedList;
-import org.apache.solr.common.util.FileUtils;
import org.apache.solr.core.SolrCore;
import static org.apache.solr.handler.ReplicationHandler.*;
import org.apache.solr.request.LocalSolrQueryRequest;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.search.SolrIndexSearcher;
-import org.apache.solr.update.CommitUpdateCommand;
-import org.apache.solr.update.DirectUpdateHandler2;
import org.apache.solr.util.RefCounted;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -63,9 +61,6 @@ import java.util.zip.InflaterInputStream
public class SnapPuller {
private static final Logger LOG = LoggerFactory.getLogger(SnapPuller.class.getName());
- private static final List<Map<String,Object>> EMPTY_LIST_OF_MAPS
- = Collections.emptyList();
-
private final String masterUrl;
private final ReplicationHandler replicationHandler;
@@ -475,21 +470,15 @@ public class SnapPuller {
}
private void doCommit() throws IOException {
- SolrQueryRequest req = new LocalSolrQueryRequest(solrCore, new ModifiableSolrParams());
+ SolrQueryRequest req = new LocalSolrQueryRequest(solrCore,
+ new ModifiableSolrParams());
try {
- CommitUpdateCommand cmd = new CommitUpdateCommand(req, false);
- cmd.waitFlush = true;
- cmd.waitSearcher = true;
- solrCore.getUpdateHandler().commit(cmd);
- if (solrCore.getUpdateHandler() instanceof DirectUpdateHandler2) {
- LOG.info("Force open index writer to make sure older index files get deleted");
- DirectUpdateHandler2 handler = (DirectUpdateHandler2) solrCore.getUpdateHandler();
- handler.forceOpenWriter();
- replicationHandler.refreshCommitpoint();
- } else {
- LOG.warn("The update handler is not an instance or sub-class of DirectUpdateHandler2. " +
- "ReplicationHandler may not be able to cleanup un-used index files.");
- }
+
+ // reboot the writer on the new index and get a new searcher
+ solrCore.getUpdateHandler().newIndexWriter();
+ solrCore.getSearcher(true, false, null);
+
+ replicationHandler.refreshCommitpoint();
} finally {
req.close();
}
@@ -605,6 +594,7 @@ public class SnapPuller {
+ " to: " + indexFileInIndex , e);
}
}
+
if (!success) {
for (String f : copiedfiles) {
File indexFile = new File(indexDir, f);
@@ -715,11 +705,10 @@ public class SnapPuller {
*/
private Collection<Map<String, Object>> getModifiedConfFiles(List<Map<String, Object>> confFilesToDownload) {
if (confFilesToDownload == null || confFilesToDownload.isEmpty())
- return EMPTY_LIST_OF_MAPS;
-
+ return Collections.EMPTY_LIST;
//build a map with alias/name as the key
Map<String, Map<String, Object>> nameVsFile = new HashMap<String, Map<String, Object>>();
- NamedList<String> names = new NamedList<String>();
+ NamedList names = new NamedList();
for (Map<String, Object> map : confFilesToDownload) {
//if alias is present that is the name the file may have in the slave
String name = (String) (map.get(ALIAS) == null ? map.get(NAME) : map.get(ALIAS));
@@ -737,7 +726,7 @@ public class SnapPuller {
nameVsFile.remove(name); //checksums are same so the file need not be downloaded
}
}
- return nameVsFile.isEmpty() ? EMPTY_LIST_OF_MAPS : nameVsFile.values();
+ return nameVsFile.isEmpty() ? Collections.EMPTY_LIST : nameVsFile.values();
}
/**
@@ -800,25 +789,25 @@ public class SnapPuller {
//make a copy first because it can be null later
List<Map<String, Object>> tmp = confFilesToDownload;
//create a new instance. or else iterator may fail
- return tmp == null ? EMPTY_LIST_OF_MAPS : new ArrayList<Map<String, Object>>(tmp);
+ return tmp == null ? Collections.EMPTY_LIST : new ArrayList<Map<String, Object>>(tmp);
}
List<Map<String, Object>> getConfFilesDownloaded() {
//make a copy first because it can be null later
List<Map<String, Object>> tmp = confFilesDownloaded;
// NOTE: it's safe to make a copy of a SynchronizedCollection(ArrayList)
- return tmp == null ? EMPTY_LIST_OF_MAPS : new ArrayList<Map<String, Object>>(tmp);
+ return tmp == null ? Collections.EMPTY_LIST : new ArrayList<Map<String, Object>>(tmp);
}
List<Map<String, Object>> getFilesToDownload() {
//make a copy first because it can be null later
List<Map<String, Object>> tmp = filesToDownload;
- return tmp == null ? EMPTY_LIST_OF_MAPS : new ArrayList<Map<String, Object>>(tmp);
+ return tmp == null ? Collections.EMPTY_LIST : new ArrayList<Map<String, Object>>(tmp);
}
List<Map<String, Object>> getFilesDownloaded() {
List<Map<String, Object>> tmp = filesDownloaded;
- return tmp == null ? EMPTY_LIST_OF_MAPS : new ArrayList<Map<String, Object>>(tmp);
+ return tmp == null ? Collections.EMPTY_LIST : new ArrayList<Map<String, Object>>(tmp);
}
Map<String, Object> getCurrentFile() {
Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/XMLLoader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/XMLLoader.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/XMLLoader.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/XMLLoader.java Thu Jul 7 09:03:58 2011
@@ -48,7 +48,7 @@ import java.io.IOException;
**/
class XMLLoader extends ContentStreamLoader {
protected UpdateRequestProcessor processor;
- private XMLInputFactory inputFactory;
+ protected XMLInputFactory inputFactory;
public XMLLoader(UpdateRequestProcessor processor, XMLInputFactory inputFactory) {
this.processor = processor;
@@ -130,16 +130,13 @@ class XMLLoader extends ContentStreamLoa
CommitUpdateCommand cmd = new CommitUpdateCommand(req, XmlUpdateRequestHandler.OPTIMIZE.equals(currTag));
- boolean sawWaitSearcher = false, sawWaitFlush = false;
for (int i = 0; i < parser.getAttributeCount(); i++) {
String attrName = parser.getAttributeLocalName(i);
String attrVal = parser.getAttributeValue(i);
- if (XmlUpdateRequestHandler.WAIT_FLUSH.equals(attrName)) {
- cmd.waitFlush = StrUtils.parseBoolean(attrVal);
- sawWaitFlush = true;
- } else if (XmlUpdateRequestHandler.WAIT_SEARCHER.equals(attrName)) {
+ if (XmlUpdateRequestHandler.WAIT_SEARCHER.equals(attrName)) {
cmd.waitSearcher = StrUtils.parseBoolean(attrVal);
- sawWaitSearcher = true;
+ } else if (XmlUpdateRequestHandler.SOFT_COMMIT.equals(attrName)) {
+ cmd.softCommit = StrUtils.parseBoolean(attrVal);
} else if (UpdateParams.MAX_OPTIMIZE_SEGMENTS.equals(attrName)) {
cmd.maxOptimizeSegments = Integer.parseInt(attrVal);
} else if (UpdateParams.EXPUNGE_DELETES.equals(attrName)) {
@@ -149,11 +146,6 @@ class XMLLoader extends ContentStreamLoa
}
}
- // If waitFlush is specified and waitSearcher wasn't, then
- // clear waitSearcher.
- if (sawWaitFlush && !sawWaitSearcher) {
- cmd.waitSearcher = false;
- }
processor.processCommit(cmd);
} // end commit
else if (XmlUpdateRequestHandler.ROLLBACK.equals(currTag)) {
Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java Thu Jul 7 09:03:58 2011
@@ -17,25 +17,15 @@
package org.apache.solr.handler;
-import org.apache.solr.common.SolrException;
+import javax.xml.stream.XMLInputFactory;
+
import org.apache.solr.common.util.NamedList;
-import org.apache.solr.common.util.XML;
import org.apache.solr.common.util.XMLErrorLogger;
-import org.apache.solr.core.SolrCore;
-import org.apache.solr.request.LocalSolrQueryRequest;
import org.apache.solr.request.SolrQueryRequest;
-import org.apache.solr.response.SolrQueryResponse;
import org.apache.solr.update.processor.UpdateRequestProcessor;
-import org.apache.solr.update.processor.UpdateRequestProcessorChain;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.xml.stream.XMLInputFactory;
-import javax.xml.stream.XMLStreamReader;
-import java.io.Reader;
-import java.io.Writer;
-import java.util.HashMap;
-
/**
* Add documents to solr using the STAX XML parser.
*/
@@ -52,7 +42,7 @@ public class XmlUpdateRequestHandler ext
public static final String COMMIT = "commit";
public static final String ROLLBACK = "rollback";
public static final String WAIT_SEARCHER = "waitSearcher";
- public static final String WAIT_FLUSH = "waitFlush";
+ public static final String SOFT_COMMIT = "softCommit";
public static final String OVERWRITE = "overwrite";
public static final String COMMIT_WITHIN = "commitWithin";
Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java Thu Jul 7 09:03:58 2011
@@ -18,7 +18,6 @@
package org.apache.solr.handler.admin;
import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.util.IOUtils;
import org.apache.solr.cloud.CloudDescriptor;
import org.apache.solr.common.SolrException;
@@ -28,10 +27,7 @@ import org.apache.solr.common.params.Sol
import org.apache.solr.common.params.UpdateParams;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.common.util.SimpleOrderedMap;
-import org.apache.solr.core.CoreContainer;
-import org.apache.solr.core.CoreDescriptor;
-import org.apache.solr.core.SolrCore;
-import org.apache.solr.core.DirectoryFactory;
+import org.apache.solr.core.*;
import org.apache.solr.handler.RequestHandlerBase;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.request.LocalSolrQueryRequest;
@@ -41,19 +37,19 @@ import org.apache.solr.util.RefCounted;
import org.apache.solr.update.MergeIndexesCommand;
import org.apache.solr.update.processor.UpdateRequestProcessor;
import org.apache.solr.update.processor.UpdateRequestProcessorChain;
-import org.apache.lucene.store.Directory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
-import java.util.ArrayList;
import java.util.Date;
-import java.util.List;
/**
*
* @since solr 1.3
*/
public class CoreAdminHandler extends RequestHandlerBase {
+ protected static Logger log = LoggerFactory.getLogger(CoreAdminHandler.class);
protected final CoreContainer coreContainer;
public CoreAdminHandler() {
@@ -397,6 +393,23 @@ public class CoreAdminHandler extends Re
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
"No such core exists '"+cname+"'");
}
+ if (params.getBool(CoreAdminParams.DELETE_INDEX, false)) {
+ core.addCloseHook(new CloseHook() {
+ @Override
+ public void preClose(SolrCore core) {}
+
+ @Override
+ public void postClose(SolrCore core) {
+ File dataDir = new File(core.getIndexDir());
+ for (File file : dataDir.listFiles()) {
+ if (!file.delete()) {
+ log.error(file.getAbsolutePath() + " could not be deleted on core unload");
+ }
+ }
+ if (!dataDir.delete()) log.error(dataDir.getAbsolutePath() + " could not be deleted on core unload");
+ }
+ });
+ }
core.close();
return coreContainer.isPersistent();
Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/QueryComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/QueryComponent.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/QueryComponent.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/QueryComponent.java Thu Jul 7 09:03:58 2011
@@ -126,7 +126,6 @@ public class QueryComponent extends Sear
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, e);
}
- checkDistributed(rb);
}
@@ -181,7 +180,7 @@ public class QueryComponent extends Sear
slices = cloudState.getSlices(cloudDescriptor.getCollectionName());
rb.slices = slices.keySet().toArray(new String[slices.size()]);
rb.shards = new String[rb.slices.length];
-
+
/***
rb.slices = new String[slices.size()];
for (int i=0; i<rb.slices.length; i++) {
@@ -288,6 +287,7 @@ public class QueryComponent extends Sear
DocListAndSet res = new DocListAndSet();
res.docList = new DocSlice(0, docs, luceneIds, null, docs, 0);
if (rb.isNeedDocSet()) {
+ // TODO: create a cache for this!
List<Query> queries = new ArrayList<Query>();
queries.add(rb.getQuery());
List<Query> filters = rb.getFilters();
@@ -435,8 +435,8 @@ public class QueryComponent extends Sear
}
for (SortField sortField: sortFields) {
- int type = sortField.getType();
- if (type==SortField.SCORE || type==SortField.DOC) continue;
+ SortField.Type type = sortField.getType();
+ if (type==SortField.Type.SCORE || type==SortField.Type.DOC) continue;
FieldComparator comparator = null;
FieldComparator comparators[] = (leaves==null) ? null : new FieldComparator[leaves.length];
Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/QueryElevationComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/QueryElevationComponent.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/QueryElevationComponent.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/QueryElevationComponent.java Thu Jul 7 09:03:58 2011
@@ -46,7 +46,6 @@ import org.apache.lucene.index.IndexRead
import org.apache.lucene.index.IndexReader.AtomicReaderContext;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.*;
-import org.apache.lucene.util.StringHelper;
import org.apache.solr.cloud.ZkController;
import org.apache.lucene.util.BytesRef;
import org.apache.solr.common.SolrException;
@@ -161,7 +160,7 @@ public class QueryElevationComponent ext
throw new SolrException( SolrException.ErrorCode.SERVER_ERROR,
"QueryElevationComponent requires the schema to have a uniqueKeyField implemented using StrField" );
}
- idField = StringHelper.intern(sf.getName());
+ idField = sf.getName();
forceElevation = initArgs.getBool( QueryElevationParams.FORCE_ELEVATION, forceElevation );
try {
@@ -379,7 +378,7 @@ public class QueryElevationComponent ext
if( sortSpec.getSort() == null ) {
sortSpec.setSort( new Sort( new SortField[] {
new SortField(idField, booster.comparatorSource, false ),
- new SortField(null, SortField.SCORE, false)
+ new SortField(null, SortField.Type.SCORE, false)
}));
}
else {
@@ -388,12 +387,12 @@ public class QueryElevationComponent ext
SortField[] current = sortSpec.getSort().getSort();
ArrayList<SortField> sorts = new ArrayList<SortField>( current.length + 1 );
// Perhaps force it to always sort by score
- if( force && current[0].getType() != SortField.SCORE ) {
+ if( force && current[0].getType() != SortField.Type.SCORE ) {
sorts.add( new SortField(idField, booster.comparatorSource, false ) );
modify = true;
}
for( SortField sf : current ) {
- if( sf.getType() == SortField.SCORE ) {
+ if( sf.getType() == SortField.Type.SCORE ) {
sorts.add( new SortField(idField, booster.comparatorSource, sf.getReverse() ) );
modify = true;
}
Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/SearchHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/SearchHandler.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/SearchHandler.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/SearchHandler.java Thu Jul 7 09:03:58 2011
@@ -17,84 +17,45 @@
package org.apache.solr.handler.component;
-import java.net.MalformedURLException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-import java.util.Set;
-import java.util.concurrent.Callable;
-import java.util.concurrent.CompletionService;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executor;
-import java.util.concurrent.ExecutorCompletionService;
-import java.util.concurrent.Future;
-import java.util.concurrent.SynchronousQueue;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
-import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.lucene.queryParser.ParseException;
-import org.apache.solr.client.solrj.SolrRequest;
-import org.apache.solr.client.solrj.SolrResponse;
-import org.apache.solr.client.solrj.SolrServer;
-import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
-import org.apache.solr.client.solrj.impl.LBHttpSolrServer;
-import org.apache.solr.client.solrj.request.QueryRequest;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.params.CommonParams;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.common.params.ShardParams;
-import org.apache.solr.common.util.NamedList;
import org.apache.solr.common.util.RTimer;
-import org.apache.solr.common.util.StrUtils;
+import org.apache.solr.core.PluginInfo;
import org.apache.solr.core.SolrCore;
import org.apache.solr.handler.RequestHandlerBase;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.response.SolrQueryResponse;
import org.apache.solr.util.SolrPluginUtils;
+import org.apache.solr.util.plugin.PluginInfoInitialized;
import org.apache.solr.util.plugin.SolrCoreAware;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.util.*;
+
/**
*
* Refer SOLR-281
*
*/
-public class SearchHandler extends RequestHandlerBase implements SolrCoreAware
+public class SearchHandler extends RequestHandlerBase implements SolrCoreAware , PluginInfoInitialized
{
static final String INIT_COMPONENTS = "components";
static final String INIT_FIRST_COMPONENTS = "first-components";
static final String INIT_LAST_COMPONENTS = "last-components";
- // socket timeout measured in ms, closes a socket if read
- // takes longer than x ms to complete. throws
- // java.net.SocketTimeoutException: Read timed out exception
- static final String INIT_SO_TIMEOUT = "shard-socket-timeout";
-
- // connection timeout measures in ms, closes a socket if connection
- // cannot be established within x ms. with a
- // java.net.SocketTimeoutException: Connection timed out
- static final String INIT_CONNECTION_TIMEOUT = "shard-connection-timeout";
- // URL scheme to be used in distributed search.
- static final String INIT_URL_SCHEME = "url-scheme";
- static int soTimeout = 0; //current default values
- static int connectionTimeout = 0; //current default values
- public static String scheme = "http://"; //current default values
+
protected static Logger log = LoggerFactory.getLogger(SearchHandler.class);
protected List<SearchComponent> components = null;
+ private ShardHandlerFactory shardHandlerFactory ;
+ private PluginInfo shfInfo;
protected List<String> getDefaultComponents()
{
@@ -108,6 +69,16 @@ public class SearchHandler extends Reque
return names;
}
+ public void init(PluginInfo info) {
+ init(info.initArgs);
+ for (PluginInfo child : info.children) {
+ if("shardHandlerFactory".equals(child.type)){
+ this.shfInfo = child;
+ break;
+ }
+ }
+ }
+
/**
* Initialize the components based on name. Note, if using {@link #INIT_FIRST_COMPONENTS} or {@link #INIT_LAST_COMPONENTS},
* then the {@link DebugComponent} will always occur last. If this is not desired, then one must explicitly declare all components using
@@ -161,24 +132,12 @@ public class SearchHandler extends Reque
components.add(dbgCmp);
log.info("Adding debug component:" + dbgCmp);
}
-
- Object co = initArgs.get(INIT_CONNECTION_TIMEOUT);
- if (co != null) {
- connectionTimeout = (Integer) co;
- log.info("Setting shard-connection-timeout to: " + connectionTimeout);
- }
-
- Object so = initArgs.get(INIT_SO_TIMEOUT);
- if (so != null) {
- soTimeout = (Integer) so;
- log.info("Setting shard-socket-timeout to: " + soTimeout);
- }
-
- Object urlScheme = initArgs.get(INIT_URL_SCHEME);
- if (urlScheme != null) {
- SearchHandler.scheme = (String) urlScheme + "://";
- log.info("Setting url-scheme to: " + urlScheme);
+ if(shfInfo ==null) {
+ Map m = new HashMap();
+ m.put("class",HttpShardHandlerFactory.class.getName());
+ shfInfo = new PluginInfo("shardHandlerFactory", m,null,Collections.<PluginInfo>emptyList());
}
+ shardHandlerFactory = core.createInitInstance(shfInfo, ShardHandlerFactory.class, null, null);
}
public List<SearchComponent> getComponents() {
@@ -204,6 +163,10 @@ public class SearchHandler extends Reque
final RTimer timer = rb.isDebug() ? new RTimer() : null;
+
+ ShardHandler shardHandler1 = shardHandlerFactory.getShardHandler();
+ shardHandler1.checkDistributed(rb);
+
if (timer == null) {
// non-debugging prepare phase
for( SearchComponent c : components ) {
@@ -251,8 +214,6 @@ public class SearchHandler extends Reque
} else {
// a distributed request
- HttpCommComponent comm = new HttpCommComponent();
-
if (rb.outgoing == null) {
rb.outgoing = new LinkedList<ShardRequest>();
}
@@ -295,13 +256,13 @@ public class SearchHandler extends Reque
// we could try and detect when this is needed, but it could be tricky
params.set("NOW", Long.toString(rb.requestInfo.getNOW().getTime()));
}
- String shardHandler = req.getParams().get(ShardParams.SHARDS_QT);
- if (shardHandler == null) {
+ String shardQt = req.getParams().get(ShardParams.SHARDS_QT);
+ if (shardQt == null) {
params.remove(CommonParams.QT);
} else {
- params.set(CommonParams.QT, shardHandler);
+ params.set(CommonParams.QT, shardQt);
}
- comm.submit(sreq, shard, params);
+ shardHandler1.submit(sreq, shard, params);
}
}
@@ -310,13 +271,13 @@ public class SearchHandler extends Reque
// the outgoing queue, send them out immediately (by exiting
// this loop)
while (rb.outgoing.size() == 0) {
- ShardResponse srsp = comm.takeCompletedOrError();
+ ShardResponse srsp = shardHandler1.takeCompletedOrError();
if (srsp == null) break; // no more requests to wait for
// Was there an exception? If so, abort everything and
// rethrow
if (srsp.getException() != null) {
- comm.cancelAll();
+ shardHandler1.cancelAll();
if (srsp.getException() instanceof SolrException) {
throw (SolrException)srsp.getException();
} else {
@@ -377,225 +338,4 @@ public class SearchHandler extends Reque
// TODO: generalize how a comm component can fit into search component framework
// TODO: statics should be per-core singletons
-class HttpCommComponent {
-
- // We want an executor that doesn't take up any resources if
- // it's not used, so it could be created statically for
- // the distributed search component if desired.
- //
- // Consider CallerRuns policy and a lower max threads to throttle
- // requests at some point (or should we simply return failure?)
- static Executor commExecutor = new ThreadPoolExecutor(
- 0,
- Integer.MAX_VALUE,
- 5, TimeUnit.SECONDS, // terminate idle threads after 5 sec
- new SynchronousQueue<Runnable>() // directly hand off tasks
- );
-
-
- static HttpClient client;
- static Random r = new Random();
- static LBHttpSolrServer loadbalancer;
-
- static {
- MultiThreadedHttpConnectionManager mgr = new MultiThreadedHttpConnectionManager();
- mgr.getParams().setDefaultMaxConnectionsPerHost(20);
- mgr.getParams().setMaxTotalConnections(10000);
- mgr.getParams().setConnectionTimeout(SearchHandler.connectionTimeout);
- mgr.getParams().setSoTimeout(SearchHandler.soTimeout);
- // mgr.getParams().setStaleCheckingEnabled(false);
-
- client = new HttpClient(mgr);
-
- // prevent retries (note: this didn't work when set on mgr.. needed to be set on client)
- DefaultHttpMethodRetryHandler retryhandler = new DefaultHttpMethodRetryHandler(0, false);
- client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, retryhandler);
-
- try {
- loadbalancer = new LBHttpSolrServer(client);
- } catch (MalformedURLException e) {
- // should be impossible since we're not passing any URLs here
- throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,e);
- }
- }
-
- CompletionService<ShardResponse> completionService = new ExecutorCompletionService<ShardResponse>(commExecutor);
- Set<Future<ShardResponse>> pending = new HashSet<Future<ShardResponse>>();
-
- // maps "localhost:8983|localhost:7574" to a shuffled List("http://localhost:8983","http://localhost:7574")
- // This is primarily to keep track of what order we should use to query the replicas of a shard
- // so that we use the same replica for all phases of a distributed request.
- Map<String,List<String>> shardToURLs = new HashMap<String,List<String>>();
-
- HttpCommComponent() {
- }
-
- private static class SimpleSolrResponse extends SolrResponse {
- long elapsedTime;
- NamedList<Object> nl;
-
- @Override
- public long getElapsedTime() {
- return elapsedTime;
- }
-
- @Override
- public NamedList<Object> getResponse() {
- return nl;
- }
-
- @Override
- public void setResponse(NamedList<Object> rsp) {
- nl = rsp;
- }
- }
-
-
- // Not thread safe... don't use in Callable.
- // Don't modify the returned URL list.
- private List<String> getURLs(String shard) {
- List<String> urls = shardToURLs.get(shard);
- if (urls==null) {
- urls = StrUtils.splitSmart(shard,"|",true);
-
- // convert shard to URL
- for (int i=0; i<urls.size(); i++) {
- urls.set(i, SearchHandler.scheme + urls.get(i));
- }
-
- //
- // Shuffle the list instead of use round-robin by default.
- // This prevents accidental synchronization where multiple shards could get in sync
- // and query the same replica at the same time.
- //
- if (urls.size() > 1)
- Collections.shuffle(urls, r);
- shardToURLs.put(shard, urls);
- }
- return urls;
- }
-
-
- void submit(final ShardRequest sreq, final String shard, final ModifiableSolrParams params) {
- // do this outside of the callable for thread safety reasons
- final List<String> urls = getURLs(shard);
-
- Callable<ShardResponse> task = new Callable<ShardResponse>() {
- public ShardResponse call() throws Exception {
-
- ShardResponse srsp = new ShardResponse();
- srsp.setShardRequest(sreq);
- srsp.setShard(shard);
- SimpleSolrResponse ssr = new SimpleSolrResponse();
- srsp.setSolrResponse(ssr);
- long startTime = System.currentTimeMillis();
-
- try {
- params.remove(CommonParams.WT); // use default (currently javabin)
- params.remove(CommonParams.VERSION);
-
- // SolrRequest req = new QueryRequest(SolrRequest.METHOD.POST, "/select");
- // use generic request to avoid extra processing of queries
- QueryRequest req = new QueryRequest(params);
- req.setMethod(SolrRequest.METHOD.POST);
-
- // no need to set the response parser as binary is the default
- // req.setResponseParser(new BinaryResponseParser());
-
- // if there are no shards available for a slice, urls.size()==0
- if (urls.size()==0) {
- // TODO: what's the right error code here? We should use the same thing when
- // all of the servers for a shard are down.
- throw new SolrException(SolrException.ErrorCode.SERVICE_UNAVAILABLE, "no servers hosting shard: " + shard);
- }
- if (urls.size() <= 1) {
- String url = urls.get(0);
- srsp.setShardAddress(url);
- SolrServer server = new CommonsHttpSolrServer(url, client);
- ssr.nl = server.request(req);
- } else {
- LBHttpSolrServer.Rsp rsp = loadbalancer.request(new LBHttpSolrServer.Req(req, urls));
- ssr.nl = rsp.getResponse();
- srsp.setShardAddress(rsp.getServer());
- }
- } catch (Throwable th) {
- srsp.setException(th);
- if (th instanceof SolrException) {
- srsp.setResponseCode(((SolrException)th).code());
- } else {
- srsp.setResponseCode(-1);
- }
- }
-
- ssr.elapsedTime = System.currentTimeMillis() - startTime;
-
- return srsp;
- }
- };
-
- pending.add( completionService.submit(task) );
- }
-
- /** returns a ShardResponse of the last response correlated with a ShardRequest */
- ShardResponse take() {
- while (pending.size() > 0) {
- try {
- Future<ShardResponse> future = completionService.take();
- pending.remove(future);
- ShardResponse rsp = future.get();
- rsp.getShardRequest().responses.add(rsp);
- if (rsp.getShardRequest().responses.size() == rsp.getShardRequest().actualShards.length) {
- return rsp;
- }
- } catch (InterruptedException e) {
- throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e);
- } catch (ExecutionException e) {
- // should be impossible... the problem with catching the exception
- // at this level is we don't know what ShardRequest it applied to
- throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Impossible Exception",e);
- }
- }
- return null;
- }
-
-
- /** returns a ShardResponse of the last response correlated with a ShardRequest,
- * or immediately returns a ShardResponse if there was an error detected
- */
- ShardResponse takeCompletedOrError() {
- while (pending.size() > 0) {
- try {
- Future<ShardResponse> future = completionService.take();
- pending.remove(future);
- ShardResponse rsp = future.get();
- if (rsp.getException() != null) return rsp; // if exception, return immediately
- // add response to the response list... we do this after the take() and
- // not after the completion of "call" so we know when the last response
- // for a request was received. Otherwise we might return the same
- // request more than once.
- rsp.getShardRequest().responses.add(rsp);
- if (rsp.getShardRequest().responses.size() == rsp.getShardRequest().actualShards.length) {
- return rsp;
- }
- } catch (InterruptedException e) {
- throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e);
- } catch (ExecutionException e) {
- // should be impossible... the problem with catching the exception
- // at this level is we don't know what ShardRequest it applied to
- throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Impossible Exception",e);
- }
- }
- return null;
- }
-
-
- void cancelAll() {
- for (Future<ShardResponse> future : pending) {
- // TODO: any issues with interrupting? shouldn't be if
- // there are finally blocks to release connections.
- future.cancel(true);
- }
- }
-
-}
Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/ShardDoc.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/ShardDoc.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/ShardDoc.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/ShardDoc.java Thu Jul 7 09:03:58 2011
@@ -89,8 +89,8 @@ class ShardFieldSortedHitQueue extends P
for (int i = 0; i < n; ++i) {
// keep track of the named fields
- int type = fields[i].getType();
- if (type!=SortField.SCORE && type!=SortField.DOC) {
+ SortField.Type type = fields[i].getType();
+ if (type!=SortField.Type.SCORE && type!=SortField.Type.DOC) {
fieldNames.add(fields[i].getField());
}
@@ -98,8 +98,8 @@ class ShardFieldSortedHitQueue extends P
comparators[i] = getCachedComparator(fieldname, fields[i]
.getType(), fields[i].getComparatorSource());
- if (fields[i].getType() == SortField.STRING) {
- this.fields[i] = new SortField(fieldname, SortField.STRING,
+ if (fields[i].getType() == SortField.Type.STRING) {
+ this.fields[i] = new SortField(fieldname, SortField.Type.STRING,
fields[i].getReverse());
} else {
this.fields[i] = new SortField(fieldname, fields[i].getType(),
@@ -144,16 +144,16 @@ class ShardFieldSortedHitQueue extends P
return c < 0;
}
- Comparator getCachedComparator(String fieldname, int type, FieldComparatorSource factory) {
+ Comparator getCachedComparator(String fieldname, SortField.Type type, FieldComparatorSource factory) {
Comparator comparator = null;
switch (type) {
- case SortField.SCORE:
+ case SCORE:
comparator = comparatorScore(fieldname);
break;
- case SortField.STRING:
+ case STRING:
comparator = comparatorNatural(fieldname);
break;
- case SortField.CUSTOM:
+ case CUSTOM:
if (factory instanceof MissingStringLastComparatorSource){
comparator = comparatorMissingStringLast(fieldname);
} else {
@@ -163,7 +163,7 @@ class ShardFieldSortedHitQueue extends P
// throw new RuntimeException("Custom sort not supported factory is "+factory.getClass());
}
break;
- case SortField.DOC:
+ case DOC:
// TODO: we can support this!
throw new RuntimeException("Doc sort not supported");
default:
@@ -282,4 +282,4 @@ class ShardFieldSortedHitQueue extends P
};
}
-}
\ No newline at end of file
+}
Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/ShardResponse.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/ShardResponse.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/ShardResponse.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/ShardResponse.java Thu Jul 7 09:03:58 2011
@@ -56,12 +56,12 @@ public final class ShardResponse {
return shard;
}
- void setShardRequest(ShardRequest rsp)
+ public void setShardRequest(ShardRequest rsp)
{
this.req = rsp;
}
- void setSolrResponse(SolrResponse rsp)
+ public void setSolrResponse(SolrResponse rsp)
{
this.rsp = rsp;
}
Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/SpellCheckComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/SpellCheckComponent.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/SpellCheckComponent.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/SpellCheckComponent.java Thu Jul 7 09:03:58 2011
@@ -702,6 +702,10 @@ public class SpellCheckComponent extends
public void postCommit() {
}
+
+ @Override
+ public void postSoftCommit() {
+ }
}
public Map<String, SolrSpellChecker> getSpellCheckers() {
Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/TermVectorComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/TermVectorComponent.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/TermVectorComponent.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/TermVectorComponent.java Thu Jul 7 09:03:58 2011
@@ -5,7 +5,6 @@ import org.apache.lucene.document.Fielda
import org.apache.lucene.document.SetBasedFieldSelector;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.MultiFields;
-import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermVectorMapper;
import org.apache.lucene.index.TermVectorOffsetInfo;
import org.apache.lucene.index.Terms;
@@ -103,8 +102,7 @@ public class TermVectorComponent extends
allFields.tfIdf = params.getBool(TermVectorParams.TF_IDF, false);
//boolean cacheIdf = params.getBool(TermVectorParams.IDF, false);
//short cut to all values.
- boolean all = params.getBool(TermVectorParams.ALL, false);
- if (all == true) {
+ if (params.getBool(TermVectorParams.ALL, false)) {
allFields.termFreq = true;
allFields.positions = true;
allFields.offsets = true;
@@ -145,11 +143,11 @@ public class TermVectorComponent extends
option.tfIdf = params.getFieldBool(field, TermVectorParams.TF_IDF, allFields.tfIdf);
//Validate these are even an option
option.positions = params.getFieldBool(field, TermVectorParams.POSITIONS, allFields.positions);
- if (option.positions == true && sf.storeTermPositions() == false){
+ if (option.positions && !sf.storeTermPositions()){
noPos.add(field);
}
option.offsets = params.getFieldBool(field, TermVectorParams.OFFSETS, allFields.offsets);
- if (option.offsets == true && sf.storeTermOffsets() == false){
+ if (option.offsets && !sf.storeTermOffsets()){
noOff.add(field);
}
} else {//field doesn't have term vectors
@@ -162,26 +160,26 @@ public class TermVectorComponent extends
}
} //else, deal with all fields
boolean hasWarnings = false;
- if (noTV.isEmpty() == false) {
+ if (!noTV.isEmpty()) {
warnings.add("noTermVectors", noTV);
hasWarnings = true;
}
- if (noPos.isEmpty() == false) {
+ if (!noPos.isEmpty()) {
warnings.add("noPositions", noPos);
hasWarnings = true;
}
- if (noOff.isEmpty() == false) {
+ if (!noOff.isEmpty()) {
warnings.add("noOffsets", noOff);
hasWarnings = true;
}
- if (hasWarnings == true) {
+ if (hasWarnings) {
termVectors.add("warnings", warnings);
}
DocListAndSet listAndSet = rb.getResults();
List<Integer> docIds = getInts(params.getParams(TermVectorParams.DOC_IDS));
Iterator<Integer> iter;
- if (docIds != null && docIds.isEmpty() == false) {
+ if (docIds != null && !docIds.isEmpty()) {
iter = docIds.iterator();
} else {
DocList list = listAndSet.docList;
@@ -218,7 +216,7 @@ public class TermVectorComponent extends
termVectors.add("uniqueKeyFieldName", uniqFieldName);
}
}
- if (fieldOptions.isEmpty() == false) {
+ if (!fieldOptions.isEmpty()) {
for (Map.Entry<String, FieldOptions> entry : fieldOptions.entrySet()) {
mapper.fieldOptions = entry.getValue();
reader.getTermFreqVector(docId, entry.getKey(), mapper);
@@ -296,7 +294,7 @@ public class TermVectorComponent extends
private boolean useOffsets, usePositions;
//private Map<String, Integer> idfCache;
private NamedList<Object> fieldNL;
- private Term currentTerm;
+ private String field;
public TVMapper(IndexReader reader) {
@@ -310,7 +308,7 @@ public class TermVectorComponent extends
if (fieldOptions.termFreq == true) {
termInfo.add("tf", frequency);
}
- if (useOffsets == true) {
+ if (useOffsets) {
NamedList<Number> theOffsets = new NamedList<Number>();
termInfo.add("offsets", theOffsets);
for (int i = 0; i < offsets.length; i++) {
@@ -319,17 +317,17 @@ public class TermVectorComponent extends
theOffsets.add("end", offset.getEndOffset());
}
}
- if (usePositions == true) {
+ if (usePositions) {
NamedList<Integer> positionsNL = new NamedList<Integer>();
for (int i = 0; i < positions.length; i++) {
positionsNL.add("position", positions[i]);
}
termInfo.add("positions", positionsNL);
}
- if (fieldOptions.docFreq == true) {
+ if (fieldOptions.docFreq) {
termInfo.add("df", getDocFreq(term));
}
- if (fieldOptions.tfIdf == true) {
+ if (fieldOptions.tfIdf) {
double tfIdfVal = ((double) frequency) / getDocFreq(term);
termInfo.add("tf-idf", tfIdfVal);
}
@@ -337,12 +335,11 @@ public class TermVectorComponent extends
private int getDocFreq(BytesRef term) {
int result = 1;
- currentTerm = currentTerm.createTerm(term);
try {
- Terms terms = MultiFields.getTerms(reader, currentTerm.field());
+ Terms terms = MultiFields.getTerms(reader, field);
if (terms != null) {
TermsEnum termsEnum = terms.iterator();
- if (termsEnum.seek(term) == TermsEnum.SeekStatus.FOUND) {
+ if (termsEnum.seekExact(term, true)) {
result = termsEnum.docFreq();
}
}
@@ -354,10 +351,7 @@ public class TermVectorComponent extends
@Override
public void setExpectations(String field, int numTerms, boolean storeOffsets, boolean storePositions) {
-
- if (fieldOptions.docFreq == true && reader != null) {
- this.currentTerm = new Term(field);
- }
+ this.field = field;
useOffsets = storeOffsets && fieldOptions.offsets;
usePositions = storePositions && fieldOptions.positions;
fieldNL = new NamedList<Object>();
@@ -366,12 +360,12 @@ public class TermVectorComponent extends
@Override
public boolean isIgnoringPositions() {
- return fieldOptions.positions == false; // if we are not interested in positions, then return true telling Lucene to skip loading them
+ return !fieldOptions.positions; // if we are not interested in positions, then return true telling Lucene to skip loading them
}
@Override
public boolean isIgnoringOffsets() {
- return fieldOptions.offsets == false; // if we are not interested in offsets, then return true telling Lucene to skip loading them
+ return !fieldOptions.offsets; // if we are not interested in offsets, then return true telling Lucene to skip loading them
}
}
Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/TermsComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/TermsComponent.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/TermsComponent.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/TermsComponent.java Thu Jul 7 09:03:58 2011
@@ -162,7 +162,7 @@ public class TermsComponent extends Sear
BytesRef term = null;
if (lowerBytes != null) {
- if (termsEnum.seek(lowerBytes, true) == TermsEnum.SeekStatus.END) {
+ if (termsEnum.seekCeil(lowerBytes, true) == TermsEnum.SeekStatus.END) {
termsEnum = null;
} else {
term = termsEnum.term();
Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java Thu Jul 7 09:03:58 2011
@@ -362,6 +362,7 @@ public class DefaultSolrHighlighter exte
params.getBool( HighlightParams.USE_PHRASE_HIGHLIGHTER, true ),
// FVH cannot process hl.requireFieldMatch parameter per-field basis
params.getBool( HighlightParams.FIELD_MATCH, false ) );
+ fvh.setPhraseLimit(params.getInt(HighlightParams.PHRASE_LIMIT, Integer.MAX_VALUE));
FieldQuery fieldQuery = fvh.getFieldQuery( query );
// Highlight each document
Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/request/PerSegmentSingleValuedFaceting.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/request/PerSegmentSingleValuedFaceting.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/request/PerSegmentSingleValuedFaceting.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/request/PerSegmentSingleValuedFaceting.java Thu Jul 7 09:03:58 2011
@@ -157,7 +157,7 @@ class PerSegmentSingleValuedFaceting {
}
if (seg.pos < seg.endTermIndex) {
seg.tenum = seg.si.getTermsEnum();
- seg.tenum.seek(seg.pos);
+ seg.tenum.seekExact(seg.pos);
seg.tempBR = seg.tenum.term();
queue.add(seg);
}