You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by cp...@apache.org on 2017/02/24 21:20:20 UTC

[37/50] [abbrv] lucene-solr:jira/solr-6203: SOLR-10021: Cannot reload a core if it fails initialization.

SOLR-10021: Cannot reload a core if it fails initialization.


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/8367e159
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/8367e159
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/8367e159

Branch: refs/heads/jira/solr-6203
Commit: 8367e159e4a287a34adf6552a5aecfe3b8073d8e
Parents: c53b7c3
Author: Erick Erickson <er...@apache.org>
Authored: Wed Feb 22 17:46:36 2017 -0800
Committer: Erick Erickson <er...@apache.org>
Committed: Wed Feb 22 17:46:36 2017 -0800

----------------------------------------------------------------------
 solr/CHANGES.txt                                |  2 +
 .../org/apache/solr/core/CoreContainer.java     | 44 +++++++++++---------
 .../solr/handler/admin/CoreAdminOperation.java  |  6 +--
 .../handler/admin/CoreAdminHandlerTest.java     |  5 ++-
 .../client/solrj/request/TestCoreAdmin.java     | 39 +++++++++++++++++
 5 files changed, 69 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8367e159/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index ed30d53..fc5bfe1 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -244,6 +244,8 @@ Other Changes
 * SOLR-9848: Lower solr.cloud.wait-for-updates-with-stale-state-pause back down from 7 seconds. 
   (Mark Miller) 
 
+* SOLR-10020: Cannot reload a core if it fails initialization. (Mike Drob via Erick Erickson)
+
 ==================  6.4.2 ==================
 
 Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8367e159/solr/core/src/java/org/apache/solr/core/CoreContainer.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/core/CoreContainer.java b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
index f7a8f33..e3977d7 100644
--- a/solr/core/src/java/org/apache/solr/core/CoreContainer.java
+++ b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
@@ -1116,28 +1116,32 @@ public class CoreContainer {
    * @param name the name of the SolrCore to reload
    */
   public void reload(String name) {
-
     SolrCore core = solrCores.getCoreFromAnyList(name, false);
-    if (core == null)
-      throw new SolrException( SolrException.ErrorCode.BAD_REQUEST, "No such core: " + name );
-
-    CoreDescriptor cd = core.getCoreDescriptor();
-    try {
-      solrCores.waitAddPendingCoreOps(name);
-      ConfigSet coreConfig = coreConfigService.getConfig(cd);
-      log.info("Reloading SolrCore '{}' using configuration from {}", cd.getName(), coreConfig.getName());
-      SolrCore newCore = core.reload(coreConfig);
-      registerCore(name, newCore, false, false);
-    } catch (SolrCoreState.CoreIsClosedException e) {
-      throw e;
-    } catch (Exception e) {
-      coreInitFailures.put(cd.getName(), new CoreLoadFailure(cd, e));
-      throw new SolrException(ErrorCode.SERVER_ERROR, "Unable to reload core [" + cd.getName() + "]", e);
-    }
-    finally {
-      solrCores.removeFromPendingOps(name);
+    if (core != null) {
+      CoreDescriptor cd = core.getCoreDescriptor();
+      try {
+        solrCores.waitAddPendingCoreOps(cd.getName());
+        ConfigSet coreConfig = coreConfigService.getConfig(cd);
+        log.info("Reloading SolrCore '{}' using configuration from {}", cd.getName(), coreConfig.getName());
+        SolrCore newCore = core.reload(coreConfig);
+        registerCore(cd.getName(), newCore, false, false);
+      } catch (SolrCoreState.CoreIsClosedException e) {
+        throw e;
+      } catch (Exception e) {
+        coreInitFailures.put(cd.getName(), new CoreLoadFailure(cd, e));
+        throw new SolrException(ErrorCode.SERVER_ERROR, "Unable to reload core [" + cd.getName() + "]", e);
+      }
+      finally {
+        solrCores.removeFromPendingOps(cd.getName());
+      }
+    } else {
+      CoreLoadFailure clf = coreInitFailures.get(name);
+      if (clf != null) {
+        create(clf.cd, true, false);
+      } else {
+        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "No such core: " + name );
+      }
     }
-
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8367e159/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminOperation.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminOperation.java b/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminOperation.java
index a5782db..e712407 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminOperation.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminOperation.java
@@ -102,11 +102,7 @@ enum CoreAdminOperation implements CoreAdminOp {
   }),
   RELOAD_OP(RELOAD, it -> {
     SolrParams params = it.req.getParams();
-    String cname = params.get(CoreAdminParams.CORE);
-
-    if (cname == null || !it.handler.coreContainer.getCoreNames().contains(cname)) {
-      throw new SolrException(ErrorCode.BAD_REQUEST, "Core with core name [" + cname + "] does not exist.");
-    }
+    String cname = params.required().get(CoreAdminParams.CORE);
 
     try {
       it.handler.coreContainer.reload(cname);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8367e159/solr/core/src/test/org/apache/solr/handler/admin/CoreAdminHandlerTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/CoreAdminHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/admin/CoreAdminHandlerTest.java
index 1a596ab..a81cf13 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/CoreAdminHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/CoreAdminHandlerTest.java
@@ -349,7 +349,8 @@ public class CoreAdminHandlerTest extends SolrTestCaseJ4 {
           , resp);
       fail("Was able to successfully reload non-existent-core");
     } catch (Exception e) {
-      assertEquals("Expected error message for non-existent core.", "Core with core name [non-existent-core] does not exist.", e.getMessage());
+      String e1 = e.getCause().getMessage();
+      assertEquals("Expected error message for non-existent core.", "No such core: non-existent-core", e.getCause().getMessage());
     }
 
     // test null core
@@ -364,7 +365,7 @@ public class CoreAdminHandlerTest extends SolrTestCaseJ4 {
       if (!(e instanceof SolrException)) {
         fail("Expected SolrException but got " + e);
       }
-      assertEquals("Expected error message for non-existent core.", "Core with core name [null] does not exist.", e.getMessage());
+      assertEquals("Expected error message for non-existent core.", "Missing required parameter: core", e.getMessage());
     }
 
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8367e159/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestCoreAdmin.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestCoreAdmin.java b/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestCoreAdmin.java
index c8c67ec..b2174cd 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestCoreAdmin.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestCoreAdmin.java
@@ -19,6 +19,9 @@ package org.apache.solr.client.solrj.request;
 import java.io.File;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.Collection;
 
 import com.carrotsearch.randomizedtesting.annotations.ThreadLeakFilters;
@@ -41,6 +44,7 @@ import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.util.NamedList;
+import org.apache.solr.core.CoreContainer;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.metrics.SolrCoreMetricManager;
 import org.apache.solr.metrics.SolrMetricManager;
@@ -292,6 +296,41 @@ public class TestCoreAdmin extends AbstractEmbeddedSolrServerTestCase {
       expectThrows(SolrException.class, () -> recoverRequestCmd.process(getSolrAdmin()));
   }
   
+  @Test
+  public void testReloadCoreAfterFailure() throws Exception {
+    cores.shutdown();
+    useFactory(null); // use FS factory
+
+    try {
+      cores = CoreContainer.createAndLoad(SOLR_HOME, getSolrXml());
+
+      String ddir = CoreAdminRequest.getCoreStatus("core0", getSolrCore0()).getDataDirectory();
+      Path data = Paths.get(ddir, "index");
+      assumeTrue("test can't handle relative data directory paths (yet?)", data.isAbsolute());
+
+      getSolrCore0().add(new SolrInputDocument("id", "core0-1"));
+      getSolrCore0().commit();
+
+      cores.shutdown();
+
+      // destroy the index
+      Files.move(data.resolve("_0.si"), data.resolve("backup"));
+      cores = CoreContainer.createAndLoad(SOLR_HOME, getSolrXml());
+
+      // Need to run a query to confirm that the core couldn't load
+      expectThrows(SolrException.class, () -> getSolrCore0().query(new SolrQuery("*:*")));
+
+      // We didn't fix anything, so should still throw
+      expectThrows(SolrException.class, () -> CoreAdminRequest.reloadCore("core0", getSolrCore0()));
+
+      Files.move(data.resolve("backup"), data.resolve("_0.si"));
+      CoreAdminRequest.reloadCore("core0", getSolrCore0());
+      assertEquals(1, getSolrCore0().query(new SolrQuery("*:*")).getResults().getNumFound());
+    } finally {
+      resetFactory();
+    }
+  }
+
   @BeforeClass
   public static void before() {
     // wtf?