You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-commits@lucene.apache.org by no...@apache.org on 2009/12/15 08:05:59 UTC

svn commit: r890675 - in /lucene/solr/trunk: ./ example/solr/ src/common/org/apache/solr/common/params/ src/java/org/apache/solr/core/ src/java/org/apache/solr/handler/admin/ src/test/org/apache/solr/client/solrj/ src/webapp/web/ src/webapp/web/admin/

Author: noble
Date: Tue Dec 15 07:05:58 2009
New Revision: 890675

URL: http://svn.apache.org/viewvc?rev=890675&view=rev
Log:
SOLR-1621 :Allow current single core deployments to be specified by solr.xml  
SOLR-1637 : Remove ALIAS command

Added:
    lucene/solr/trunk/example/solr/solr.xml
Modified:
    lucene/solr/trunk/CHANGES.txt
    lucene/solr/trunk/src/common/org/apache/solr/common/params/CoreAdminParams.java
    lucene/solr/trunk/src/java/org/apache/solr/core/CoreContainer.java
    lucene/solr/trunk/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java
    lucene/solr/trunk/src/test/org/apache/solr/client/solrj/MultiCoreExampleTestBase.java
    lucene/solr/trunk/src/webapp/web/admin/index.jsp
    lucene/solr/trunk/src/webapp/web/index.jsp

Modified: lucene/solr/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/CHANGES.txt?rev=890675&r1=890674&r2=890675&view=diff
==============================================================================
--- lucene/solr/trunk/CHANGES.txt (original)
+++ lucene/solr/trunk/CHANGES.txt Tue Dec 15 07:05:58 2009
@@ -24,6 +24,7 @@
 ==================  1.5.0-dev ==================
 Upgrading from Solr 1.4
 ----------------------
+The experimental ALIAS command is removed in Solr 1.5 (SOLR-1637).
 
 Versions of Major Components
 ---------------------
@@ -64,6 +65,8 @@
 
 * SOLR-1177: Distributed Search support for TermsComponent (Matt Weber via shalin)
 
+* SOLR-1621: Allow current single core deployments to be specified by solr.xml (Mark Miller , noble)
+
 Optimizations
 ----------------------
 
@@ -157,6 +160,8 @@
 
 * SOLR-1610: Generify SolrCache (Jason Rutherglen via shalin)
 
+* SOLR-1637: Remove ALIAS command
+
 Build
 ----------------------
 

Added: lucene/solr/trunk/example/solr/solr.xml
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/example/solr/solr.xml?rev=890675&view=auto
==============================================================================
--- lucene/solr/trunk/example/solr/solr.xml (added)
+++ lucene/solr/trunk/example/solr/solr.xml Tue Dec 15 07:05:58 2009
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ 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.
+-->
+
+<!--
+ All (relative) paths are relative to the installation path
+  
+  persistent: Save changes made via the API to this file
+  sharedLib: path to a lib directory that will be shared across all cores
+-->
+<solr persistent="false">
+
+  <!--
+  adminPath: RequestHandler path to manage cores.  
+    If 'null' (or absent), cores will not be manageable via request handler
+  -->
+  <cores adminPath="/admin/cores">
+    <core name="DEFAULT_CORE" instanceDir="." />
+  </cores>
+</solr>

Modified: lucene/solr/trunk/src/common/org/apache/solr/common/params/CoreAdminParams.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/common/org/apache/solr/common/params/CoreAdminParams.java?rev=890675&r1=890674&r2=890675&view=diff
==============================================================================
--- lucene/solr/trunk/src/common/org/apache/solr/common/params/CoreAdminParams.java (original)
+++ lucene/solr/trunk/src/common/org/apache/solr/common/params/CoreAdminParams.java Tue Dec 15 07:05:58 2009
@@ -66,6 +66,7 @@
     PERSIST,
     SWAP,
     RENAME,
+    @Deprecated
     ALIAS,
     MERGEINDEXES;
     

Modified: lucene/solr/trunk/src/java/org/apache/solr/core/CoreContainer.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/core/CoreContainer.java?rev=890675&r1=890674&r2=890675&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/core/CoreContainer.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/core/CoreContainer.java Tue Dec 15 07:05:58 2009
@@ -17,14 +17,7 @@
 
 package org.apache.solr.core;
 
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-import java.io.InputStream;
+import java.io.*;
 import java.nio.channels.FileChannel;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
@@ -42,7 +35,6 @@
 import org.apache.solr.common.params.CoreAdminParams;
 import org.apache.solr.common.util.DOMUtil;
 import org.apache.solr.common.util.XML;
-import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.common.util.FileUtils;
 import org.apache.solr.handler.admin.CoreAdminHandler;
 import org.apache.solr.schema.IndexSchema;
@@ -58,6 +50,8 @@
  */
 public class CoreContainer 
 {
+  private static final String DEFAULT_CORE_NAME = "DEFAULT_CORE";
+
   protected static Logger log = LoggerFactory.getLogger(CoreContainer.class);
   
   protected final Map<String, SolrCore> cores = new LinkedHashMap<String, SolrCore>();
@@ -69,12 +63,14 @@
   protected String libDir = null;
   protected ClassLoader libLoader = null;
   protected SolrResourceLoader loader = null;
+  @Deprecated
   protected java.lang.ref.WeakReference<SolrCore> adminCore = null;
   protected Properties containerProperties;
   protected Map<String ,IndexSchema> indexSchemaCache;
   protected String adminHandler;
   protected boolean shareSchema;
   protected String solrHome;
+  protected String solrConfigFilenameOverride;
 
   public CoreContainer() {
     solrHome = SolrResourceLoader.locateSolrHome();
@@ -100,47 +96,37 @@
     public String getSolrConfigFilename() {
       return solrConfigFilename;
     }
-
+   @Deprecated
     public void setSolrConfigFilename(String solrConfigFilename) {
       this.solrConfigFilename = solrConfigFilename;
     }
 
     // core container instantiation
-    public CoreContainer initialize() throws IOException, ParserConfigurationException, SAXException {
+    public CoreContainer initialize() throws IOException,
+        ParserConfigurationException, SAXException {
       CoreContainer cores = null;
       String solrHome = SolrResourceLoader.locateSolrHome();
-      File fconf = new File(solrHome, solrConfigFilename == null? "solr.xml": solrConfigFilename);
+      File fconf = new File(solrHome, solrConfigFilename == null ? "solr.xml"
+          : solrConfigFilename);
       log.info("looking for solr.xml: " + fconf.getAbsolutePath());
-
-      if (fconf.exists()) {
-        cores = new CoreContainer();
+      cores = new CoreContainer();
+      cores.solrConfigFilenameOverride = solrConfigFilename;
+      if (fconf.exists())
         cores.load(solrHome, fconf);
-        abortOnConfigurationError = false;
-        // if any core aborts on startup, then abort
-        for (SolrCore c : cores.getCores()) {
-          if (c.getSolrConfig().getBool("abortOnConfigurationError", false)) {
-            abortOnConfigurationError = true;
-            break;
-          }
+      else {
+        cores.load(solrHome, new ByteArrayInputStream(DEF_SOLR_XML.getBytes()));
+        cores.configFile = fconf;
+      }
+      abortOnConfigurationError = false;
+      // if any core aborts on startup, then abort
+      for (SolrCore c : cores.getCores()) {
+        if (c.getSolrConfig().getBool("abortOnConfigurationError", false)) {
+          abortOnConfigurationError = true;
+          break;
         }
-        solrConfigFilename = cores.getConfigFile().getName();
-      } else {
-        // perform compatibility init
-        cores = new CoreContainer(solrHome);
-        CoreDescriptor dcore = new CoreDescriptor(cores, "", ".");
-        dcore.setCoreProperties(null);
-        SolrResourceLoader resourceLoader = new SolrResourceLoader(solrHome, null, getCoreProps(solrHome, null,dcore.getCoreProperties()));
-        cores.loader = resourceLoader;
-        SolrConfig cfg = solrConfigFilename == null ?
-                new SolrConfig(resourceLoader, SolrConfig.DEFAULT_CONF_FILE,null) :
-                new SolrConfig(resourceLoader, solrConfigFilename,null);
-        SolrCore singlecore = new SolrCore(null, null, cfg, null, dcore);
-        abortOnConfigurationError = cfg.getBool(
-                "abortOnConfigurationError", abortOnConfigurationError);
-        cores.register("", singlecore, false);
-        cores.setPersistent(false);
-        solrConfigFilename = cfg.getName();
       }
+      solrConfigFilename = cores.getConfigFile().getName();
+      
       return cores;
     }
   }
@@ -176,7 +162,7 @@
    * @throws IOException
    * @throws SAXException
    */
-  public CoreContainer(String dir, File configFile ) throws ParserConfigurationException, IOException, SAXException 
+  public CoreContainer(String dir, File configFile) throws ParserConfigurationException, IOException, SAXException 
   {
     this.load(dir, configFile);
   }
@@ -208,9 +194,23 @@
    */
   public void load(String dir, File configFile ) throws ParserConfigurationException, IOException, SAXException {
     this.configFile = configFile;
+    this.load(dir, new FileInputStream(configFile));
+  } 
+
+  /**
+   * Load a config file listing the available solr cores.
+   * 
+   * @param dir the home directory of all resources.
+   * @param cfgis the configuration file InputStream
+   * @param configName
+   * @throws ParserConfigurationException
+   * @throws IOException
+   * @throws SAXException
+   */
+  public void load(String dir, InputStream cfgis)
+      throws ParserConfigurationException, IOException, SAXException {
     this.loader = new SolrResourceLoader(dir);
     solrHome = loader.getInstanceDir();
-    FileInputStream cfgis = new FileInputStream(configFile);
     try {
       Config cfg = new Config(loader, null, cfgis, null);
 
@@ -246,18 +246,23 @@
       }
 
       NodeList nodes = (NodeList)cfg.evaluate("solr/cores/core", XPathConstants.NODESET);
-
+      boolean defaultCoreFound = false;
       for (int i=0; i<nodes.getLength(); i++) {
         Node node = nodes.item(i);
         try {
-          String names = DOMUtil.getAttr(node, "name", null);
-          List<String> aliases = StrUtils.splitSmart(names,',');
-          String name = aliases.get(0);
+          String name = DOMUtil.getAttr(node, "name", null);
+          if(name.equals(DEFAULT_CORE_NAME)){
+            if(defaultCoreFound) throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,"Only one 'DEFAULT_CORE' is allowed ");            
+            defaultCoreFound = true;
+            name="";
+          }
           CoreDescriptor p = new CoreDescriptor(this, name, DOMUtil.getAttr(node, "instanceDir", null));
 
           // deal with optional settings
           String opt = DOMUtil.getAttr(node, "config", null);
-          if (opt != null) {
+          if(solrConfigFilenameOverride != null && name.equals("")) {
+            p.setConfigName(solrConfigFilenameOverride);
+          } else if (opt != null) {
             p.setConfigName(opt);
           }
           opt = DOMUtil.getAttr(node, "schema", null);
@@ -276,12 +281,6 @@
           p.setCoreProperties(readProperties(cfg, node));
 
           SolrCore core = create(p);
-
-          for (int a=1; a<aliases.size(); a++) {
-            core.open();
-            register(aliases.get(a), core, false);
-          }
-
           register(name, core, false);
         }
         catch (Throwable ex) {
@@ -479,6 +478,7 @@
    */
 
   public void reload(String name) throws ParserConfigurationException, IOException, SAXException {
+    name= checkDefault(name);
     SolrCore core;
     synchronized(cores) {
       core = cores.get(name);
@@ -487,19 +487,13 @@
       throw new SolrException( SolrException.ErrorCode.BAD_REQUEST, "No such core: " + name );
 
     SolrCore newCore = create(core.getCoreDescriptor());
-
-    // point all aliases to the reloaded core
-    for (String alias : getCoreNames(core)) {
-      if (!name.equals(alias)) {
-        newCore.open();
-        register(alias, newCore, false);
-      }
-    }
-
     register(name, newCore, false);
   }
-    
-  
+
+  private String checkDefault(String name) {
+    return name.length() == 0  || DEFAULT_CORE_NAME.equals(name) || name.trim().length() == 0 ? "" : name;
+  } 
+
   /**
    * Swaps two SolrCore descriptors.
    * @param n0
@@ -509,6 +503,8 @@
     if( n0 == null || n1 == null ) {
       throw new SolrException( SolrException.ErrorCode.BAD_REQUEST, "Can not swap unnamed cores." );
     }
+    n0 = checkDefault(n0);
+    n1 = checkDefault(n1);
     synchronized( cores ) {
       SolrCore c0 = cores.get(n0);
       SolrCore c1 = cores.get(n1);
@@ -520,7 +516,9 @@
       cores.put(n1, c0);
 
       c0.setName(n1);
+      c0.getCoreDescriptor().name = n1;
       c1.setName(n0);
+      c1.getCoreDescriptor().name = n0;
     }
 
 
@@ -529,6 +527,7 @@
   
   /** Removes and returns registered core w/o decrementing it's reference count */
   public SolrCore remove( String name ) {
+    name = checkDefault(name);    
     synchronized(cores) {
       return cores.remove( name );
     }
@@ -542,6 +541,7 @@
    * @return the core if found
    */
   public SolrCore getCore(String name) {
+    name= checkDefault(name);
     synchronized(cores) {
       SolrCore core = cores.get(name);
       if (core != null)
@@ -708,26 +708,12 @@
     if(shareSchema) writeAttribute(w, "shareSchema","true");
     w.write(">\n");
 
-    Map<SolrCore, LinkedList<String>> aliases = new HashMap<SolrCore,LinkedList<String>>();
-
     synchronized(cores) {
-      for (Map.Entry<String, SolrCore> entry : cores.entrySet()) {
-        String name = entry.getKey();
-        LinkedList<String> a = aliases.get(entry.getValue());
-        if (a==null) a = new LinkedList<String>();
-        if (name.equals(entry.getValue().getName())) {
-          a.addFirst(name);
-        } else {
-          a.addLast(name);
-        }
-        aliases.put(entry.getValue(), a);
+      for (SolrCore solrCore : cores.values()) {
+        persist(w,solrCore.getCoreDescriptor());
       }
     }
 
-    for (Map.Entry<SolrCore, LinkedList<String>> entry : aliases.entrySet()) {
-      persist(w, entry.getValue(), entry.getKey().getCoreDescriptor());
-    }
-
     w.write("</cores>\n");
     w.write("</solr>\n");
   }
@@ -742,9 +728,9 @@
   }
   
   /** Writes the cores configuration node for a given core. */
-  void persist(Writer w, List<String> aliases, CoreDescriptor dcore) throws IOException {
+  void persist(Writer w, CoreDescriptor dcore) throws IOException {
     w.write("  <core");
-    writeAttribute(w,"name",StrUtils.join(aliases,','));
+    writeAttribute(w,"name",dcore.name);
     writeAttribute(w,"instanceDir",dcore.getInstanceDir());
     //write config (if not default)
     String opt = dcore.getConfigName();
@@ -819,4 +805,10 @@
   public String getSolrHome() {
     return solrHome;
   }
+  private static final String DEF_SOLR_XML ="<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" +
+          "<solr persistent=\"false\">\n" +
+          "  <cores adminPath=\"/admin/cores\">\n" +
+          "    <core name=\""+ DEFAULT_CORE_NAME + "\" instanceDir=\".\" />\n" +
+          "  </cores>\n" +
+          "</solr>";
 }

Modified: lucene/solr/trunk/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java?rev=890675&r1=890674&r2=890675&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java Tue Dec 15 07:05:58 2009
@@ -41,7 +41,9 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.Set;
 
 /**
  * @version $Id$
@@ -118,8 +120,8 @@
         }
 
         case ALIAS: {
-          doPersist = this.handleAliasAction(req, rsp);
-          break;
+          throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "'ALIAS' is not supported " +
+            req.getParams().get(CoreAdminParams.ACTION));
         }
 
         case UNLOAD: {
@@ -291,6 +293,7 @@
    * @return true if a modification has resulted that requires persistance 
    *         of the CoreContainer configuration.
    */
+  @Deprecated
   protected boolean handleAliasAction(SolrQueryRequest req, SolrQueryResponse rsp) {
     SolrParams params = req.getParams();
 

Modified: lucene/solr/trunk/src/test/org/apache/solr/client/solrj/MultiCoreExampleTestBase.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/test/org/apache/solr/client/solrj/MultiCoreExampleTestBase.java?rev=890675&r1=890674&r2=890675&view=diff
==============================================================================
--- lucene/solr/trunk/src/test/org/apache/solr/client/solrj/MultiCoreExampleTestBase.java (original)
+++ lucene/solr/trunk/src/test/org/apache/solr/client/solrj/MultiCoreExampleTestBase.java Tue Dec 15 07:05:58 2009
@@ -17,8 +17,6 @@
 
 package org.apache.solr.client.solrj;
 
-import java.io.File;
-
 import org.apache.solr.client.solrj.request.CoreAdminRequest;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
@@ -132,35 +130,6 @@
     long after = mcr.getStartTime( name ).getTime();
     assertTrue( "should have more recent time: "+after+","+before, after > before );
 
-    // test alias
-    CoreAdminRequest.aliasCore("core1","corefoo",coreadmin);
-    assertEquals( 1, getSolrCore1().query( new SolrQuery( "id:BBB" ) ).getResults().size() );
-    assertEquals( 1, getSolrCore("corefoo").query( new SolrQuery( "id:BBB" ) ).getResults().size() );
-
-    // test that reload affects aliases
-    CoreAdminRequest.reloadCore("core1", coreadmin);
-
-    // this is only an effective test for embedded, where we have
-    // direct access to the core container.
-    SolrCore c1 = cores.getCore("core1");
-    SolrCore c2 = cores.getCore("corefoo");
-    assertTrue(c1 == c2);
-    if (c1 != null) c1.close();
-    if (c2 != null) c2.close();
-
-    // retest core query
-    assertEquals( 1, getSolrCore1().query( new SolrQuery( "id:BBB" ) ).getResults().size() );
-
-    // test close
-    CoreAdminRequest.unloadCore("corefoo",coreadmin);
-    try {
-      getSolrCore("corefoo").query( new SolrQuery( "id:BBB" ) );
-      fail( "corefoo should be gone" );
-    }
-    catch( Exception ex ) {}
-    // aliased core should still work
-    assertEquals( 1, getSolrCore1().query( new SolrQuery( "id:BBB" ) ).getResults().size() );
-    
     // test move
     CoreAdminRequest.renameCore("core1","corea",coreadmin);
     CoreAdminRequest.renameCore("corea","coreb",coreadmin);

Modified: lucene/solr/trunk/src/webapp/web/admin/index.jsp
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/webapp/web/admin/index.jsp?rev=890675&r1=890674&r2=890675&view=diff
==============================================================================
--- lucene/solr/trunk/src/webapp/web/admin/index.jsp (original)
+++ lucene/solr/trunk/src/webapp/web/admin/index.jsp Tue Dec 15 07:05:58 2009
@@ -58,10 +58,11 @@
 <%-- List the cores (that arent this one) so we can switch --%>
 <% org.apache.solr.core.CoreContainer cores = (org.apache.solr.core.CoreContainer)request.getAttribute("org.apache.solr.CoreContainer");
   if (cores!=null) {
-    Collection<String> names = cores.getCoreNames();
+    Collection<SolrCore> names = cores.getCores();
     if (names.size() > 1) {%><tr><td><strong>Cores:</strong><br></td><td><%
-    for (String name : names) {
-    %>[<a href="../../<%=name%>/admin/"><%=name%></a>]<%         
+    for (SolrCore name : names) {
+      if(name.equals(core.getName())) continue;
+    %>[<a href="../../<%=name.getName()%>/admin/"><%=name%></a>]<%         
   }%></td></tr><%
 }}%>
 

Modified: lucene/solr/trunk/src/webapp/web/index.jsp
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/webapp/web/index.jsp?rev=890675&r1=890674&r2=890675&view=diff
==============================================================================
--- lucene/solr/trunk/src/webapp/web/index.jsp (original)
+++ lucene/solr/trunk/src/webapp/web/index.jsp Tue Dec 15 07:05:58 2009
@@ -1,3 +1,5 @@
+<%@ page import="org.apache.solr.core.SolrCore" %>
+<%@ page import="java.util.Collection" %>
 <%--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
@@ -29,11 +31,16 @@
 
 <% 
   org.apache.solr.core.CoreContainer cores = (org.apache.solr.core.CoreContainer)request.getAttribute("org.apache.solr.CoreContainer");
+  Collection<SolrCore> solrCores = cores.getCores();
   if( cores != null
-   && cores.getCores().size() > 0 // HACK! check that we have valid names...
-   && cores.getCores().iterator().next().getName().length() != 0 ) { 
-    for( org.apache.solr.core.SolrCore core : cores.getCores() ) {%>
-<a href="<%= core.getName() %>/admin/">Admin <%= core.getName() %></a><br/>
+   && solrCores.size() > 0 // HACK! check that we have valid names...
+   && solrCores.iterator().next().getName().length() != 0 ) {
+    for( org.apache.solr.core.SolrCore core : cores.getCores() ) {
+       String coreName = core.getName();
+      if("".equals(coreName) ) coreName =".";
+%>
+<a href="<%= coreName %>/admin/">Admin <%= core.getName() %></a>
+<br/>
 <% }} else { %>
 <a href="admin/">Solr Admin</a>
 <% } %>