Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 7A696200BA3 for ; Thu, 20 Oct 2016 21:31:16 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 79574160B01; Thu, 20 Oct 2016 19:31:16 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 50899160AF5 for ; Thu, 20 Oct 2016 21:31:15 +0200 (CEST) Received: (qmail 34786 invoked by uid 500); 20 Oct 2016 19:31:12 -0000 Mailing-List: contact commits-help@lucene.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@lucene.apache.org Delivered-To: mailing list commits@lucene.apache.org Received: (qmail 31827 invoked by uid 99); 20 Oct 2016 19:31:10 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 20 Oct 2016 19:31:10 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id B213BF0DC6; Thu, 20 Oct 2016 19:31:10 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: krisden@apache.org To: commits@lucene.apache.org Date: Thu, 20 Oct 2016 19:31:20 -0000 Message-Id: In-Reply-To: <1aa9813a5cb84ba2822094c91ac1b858@git.apache.org> References: <1aa9813a5cb84ba2822094c91ac1b858@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [11/50] [abbrv] lucene-solr:jira/solr-8593: SOLR-9566: Don't put replicas into recovery when collections are created archived-at: Thu, 20 Oct 2016 19:31:16 -0000 SOLR-9566: Don't put replicas into recovery when collections are created Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/65f55802 Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/65f55802 Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/65f55802 Branch: refs/heads/jira/solr-8593 Commit: 65f55802ee01b90a7f529de270d5d866a2282a40 Parents: 927fd51 Author: Alan Woodward Authored: Mon Sep 26 22:51:39 2016 +0100 Committer: Alan Woodward Committed: Mon Oct 17 17:18:25 2016 +0100 ---------------------------------------------------------------------- solr/CHANGES.txt | 2 ++ .../apache/solr/cloud/CreateCollectionCmd.java | 1 + .../org/apache/solr/cloud/ZkController.java | 23 +++++++++-------- .../org/apache/solr/core/CoreContainer.java | 26 ++++++++++---------- .../java/org/apache/solr/core/ZkContainer.java | 4 +-- .../solr/handler/admin/CoreAdminOperation.java | 4 ++- .../org/apache/solr/core/TestCodecSupport.java | 2 +- .../apache/solr/search/TestIndexSearcher.java | 6 ++--- .../solr/common/params/CoreAdminParams.java | 5 ++++ 9 files changed, 41 insertions(+), 32 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/65f55802/solr/CHANGES.txt ---------------------------------------------------------------------- diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index 4f8d682..08abc76 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -195,6 +195,8 @@ Optimizations reader rather than ask for a global view. In extreme cases, this leads to a 100x speedup. (Takahiro Ishikawa, yonik) +* SOLR-9566: Don't put replicas into recovery when first creating a Collection + (Alan Woodward) Other Changes ---------------------- http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/65f55802/solr/core/src/java/org/apache/solr/cloud/CreateCollectionCmd.java ---------------------------------------------------------------------- diff --git a/solr/core/src/java/org/apache/solr/cloud/CreateCollectionCmd.java b/solr/core/src/java/org/apache/solr/cloud/CreateCollectionCmd.java index 01e3fdf..a067b4a 100644 --- a/solr/core/src/java/org/apache/solr/cloud/CreateCollectionCmd.java +++ b/solr/core/src/java/org/apache/solr/cloud/CreateCollectionCmd.java @@ -217,6 +217,7 @@ public class CreateCollectionCmd implements Cmd { params.set(CoreAdminParams.COLLECTION, collectionName); params.set(CoreAdminParams.SHARD, position.shard); params.set(ZkStateReader.NUM_SHARDS_PROP, numSlices); + params.set(CoreAdminParams.NEW_COLLECTION, "true"); if (async != null) { String coreAdminAsyncId = async + Math.abs(System.nanoTime()); http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/65f55802/solr/core/src/java/org/apache/solr/cloud/ZkController.java ---------------------------------------------------------------------- diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkController.java b/solr/core/src/java/org/apache/solr/cloud/ZkController.java index b56d1c9..9b0a90e 100644 --- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java +++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java @@ -231,7 +231,7 @@ public class ZkController { public Object call() throws Exception { log.info("Registering core {} afterExpiration? {}", descriptor.getName(), afterExpiration); - register(descriptor.getName(), descriptor, recoverReloadedCores, afterExpiration); + register(descriptor.getName(), descriptor, recoverReloadedCores, afterExpiration, false); return descriptor; } } @@ -354,7 +354,7 @@ public class ZkController { if (executorService != null) { executorService.submit(new RegisterCoreAsync(descriptor, true, true)); } else { - register(descriptor.getName(), descriptor, true, true); + register(descriptor.getName(), descriptor, true, true, false); } } catch (Exception e) { SolrException.log(log, "Error registering SolrCore", e); @@ -840,8 +840,8 @@ public class ZkController { * * @return the shardId for the SolrCore */ - public String register(String coreName, final CoreDescriptor desc) throws Exception { - return register(coreName, desc, false, false); + public String register(String coreName, final CoreDescriptor desc, boolean skipRecovery) throws Exception { + return register(coreName, desc, false, false, skipRecovery); } @@ -850,7 +850,8 @@ public class ZkController { * * @return the shardId for the SolrCore */ - public String register(String coreName, final CoreDescriptor desc, boolean recoverReloadedCores, boolean afterExpiration) throws Exception { + public String register(String coreName, final CoreDescriptor desc, boolean recoverReloadedCores, + boolean afterExpiration, boolean skipRecovery) throws Exception { try (SolrCore core = cc.getCore(desc.getName())) { MDCLoggingContext.setCore(core); } @@ -929,8 +930,8 @@ public class ZkController { } } } - boolean didRecovery = checkRecovery(coreName, desc, recoverReloadedCores, isLeader, cloudDesc, collection, - coreZkNodeName, shardId, leaderProps, core, cc, afterExpiration); + boolean didRecovery + = checkRecovery(recoverReloadedCores, isLeader, skipRecovery, collection, coreZkNodeName, core, cc, afterExpiration); if (!didRecovery) { publish(desc, Replica.State.ACTIVE); } @@ -1080,10 +1081,8 @@ public class ZkController { /** * Returns whether or not a recovery was started */ - private boolean checkRecovery(String coreName, final CoreDescriptor desc, - boolean recoverReloadedCores, final boolean isLeader, - final CloudDescriptor cloudDesc, final String collection, - final String shardZkNodeName, String shardId, ZkNodeProps leaderProps, + private boolean checkRecovery(boolean recoverReloadedCores, final boolean isLeader, boolean skipRecovery, + final String collection, String shardId, SolrCore core, CoreContainer cc, boolean afterExpiration) { if (SKIP_AUTO_RECOVERY) { log.warn("Skipping recovery according to sys prop solrcloud.skip.autorecovery"); @@ -1092,7 +1091,7 @@ public class ZkController { boolean doRecovery = true; if (!isLeader) { - if (!afterExpiration && core.isReloaded() && !recoverReloadedCores) { + if (skipRecovery || (!afterExpiration && core.isReloaded() && !recoverReloadedCores)) { doRecovery = false; } http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/65f55802/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 fa8a8c0..a020b00 100644 --- a/solr/core/src/java/org/apache/solr/core/CoreContainer.java +++ b/solr/core/src/java/org/apache/solr/core/CoreContainer.java @@ -517,14 +517,14 @@ public class CoreContainer { zkSys.getZkController().throwErrorIfReplicaReplaced(cd); } - core = create(cd, false); + core = create(cd, false, false); } finally { if (asyncSolrCoreLoad) { solrCores.markCoreAsNotLoading(cd); } } try { - zkSys.registerInZk(core, true); + zkSys.registerInZk(core, true, false); } catch (RuntimeException e) { SolrException.log(log, "Error registering SolrCore", e); } @@ -706,7 +706,7 @@ public class CoreContainer { return coresLocator; } - protected SolrCore registerCore(String name, SolrCore core, boolean registerInZk) { + protected SolrCore registerCore(String name, SolrCore core, boolean registerInZk, boolean skipRecovery) { if( core == null ) { throw new RuntimeException( "Can not register a null core." ); } @@ -744,7 +744,7 @@ public class CoreContainer { if( old == null || old == core) { log.debug( "registering core: "+name ); if (registerInZk) { - zkSys.registerInZk(core, false); + zkSys.registerInZk(core, false, skipRecovery); } return null; } @@ -752,7 +752,7 @@ public class CoreContainer { log.debug( "replacing core: "+name ); old.close(); if (registerInZk) { - zkSys.registerInZk(core, false); + zkSys.registerInZk(core, false, skipRecovery); } return old; } @@ -765,7 +765,7 @@ public class CoreContainer { * @return the newly created core */ public SolrCore create(String coreName, Map parameters) { - return create(coreName, cfg.getCoreRootDirectory().resolve(coreName), parameters); + return create(coreName, cfg.getCoreRootDirectory().resolve(coreName), parameters, false); } /** @@ -775,7 +775,7 @@ public class CoreContainer { * @param parameters the core parameters * @return the newly created core */ - public SolrCore create(String coreName, Path instancePath, Map parameters) { + public SolrCore create(String coreName, Path instancePath, Map parameters, boolean newCollection) { CoreDescriptor cd = new CoreDescriptor(this, coreName, instancePath, parameters); @@ -798,7 +798,7 @@ public class CoreContainer { preExisitingZkEntry = getZkController().checkIfCoreNodeNameAlreadyExists(cd); } - SolrCore core = create(cd, true); + SolrCore core = create(cd, true, newCollection); // only write out the descriptor if the core is successfully created coresLocator.create(this, cd); @@ -845,7 +845,7 @@ public class CoreContainer { * * @return the newly created core */ - private SolrCore create(CoreDescriptor dcore, boolean publishState) { + private SolrCore create(CoreDescriptor dcore, boolean publishState, boolean newCollection) { if (isShutDown) { throw new SolrException(ErrorCode.SERVICE_UNAVAILABLE, "Solr has been shutdown."); @@ -868,7 +868,7 @@ public class CoreContainer { core.getUpdateHandler().getUpdateLog().recoverFromLog(); } - registerCore(dcore.getName(), core, publishState); + registerCore(dcore.getName(), core, publishState, newCollection); return core; } catch (Exception e) { @@ -964,7 +964,7 @@ public class CoreContainer { 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); + registerCore(name, newCore, false, false); } catch (SolrCoreState.CoreIsClosedException e) { throw e; } catch (Exception e) { @@ -1061,7 +1061,7 @@ public class CoreContainer { SolrIdentifierValidator.validateCoreName(toName); try (SolrCore core = getCore(name)) { if (core != null) { - registerCore(toName, core, true); + registerCore(toName, core, true, false); SolrCore old = solrCores.remove(name); coresLocator.rename(this, old.getCoreDescriptor(), core.getCoreDescriptor()); } @@ -1132,7 +1132,7 @@ public class CoreContainer { if (zkSys.getZkController() != null) { zkSys.getZkController().throwErrorIfReplicaReplaced(desc); } - core = create(desc, true); // This should throw an error if it fails. + core = create(desc, true, false); // This should throw an error if it fails. } core.open(); } http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/65f55802/solr/core/src/java/org/apache/solr/core/ZkContainer.java ---------------------------------------------------------------------- diff --git a/solr/core/src/java/org/apache/solr/core/ZkContainer.java b/solr/core/src/java/org/apache/solr/core/ZkContainer.java index 22afe99..6665c4e 100644 --- a/solr/core/src/java/org/apache/solr/core/ZkContainer.java +++ b/solr/core/src/java/org/apache/solr/core/ZkContainer.java @@ -173,12 +173,12 @@ public class ZkContainer { return zkRun.substring(0, zkRun.lastIndexOf('/')); } - public void registerInZk(final SolrCore core, boolean background) { + public void registerInZk(final SolrCore core, boolean background, boolean skipRecovery) { Runnable r = () -> { MDCLoggingContext.setCore(core); try { try { - zkController.register(core.getName(), core.getCoreDescriptor()); + zkController.register(core.getName(), core.getCoreDescriptor(), skipRecovery); } catch (InterruptedException e) { // Restore the interrupted status Thread.currentThread().interrupt(); http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/65f55802/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 e0d66a5..0b17d9e 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 @@ -82,7 +82,9 @@ enum CoreAdminOperation implements CoreAdminOp { instancePath = coreContainer.getCoreRootDirectory().resolve(instanceDir).normalize(); } - coreContainer.create(coreName, instancePath, coreParams); + boolean newCollection = params.getBool(CoreAdminParams.NEW_COLLECTION, false); + + coreContainer.create(coreName, instancePath, coreParams, newCollection); it.rsp.add("core", coreName); }), http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/65f55802/solr/core/src/test/org/apache/solr/core/TestCodecSupport.java ---------------------------------------------------------------------- diff --git a/solr/core/src/test/org/apache/solr/core/TestCodecSupport.java b/solr/core/src/test/org/apache/solr/core/TestCodecSupport.java index 0fe6a02..b6097ab 100644 --- a/solr/core/src/test/org/apache/solr/core/TestCodecSupport.java +++ b/solr/core/src/test/org/apache/solr/core/TestCodecSupport.java @@ -219,7 +219,7 @@ public class TestCodecSupport extends SolrTestCaseJ4 { try { c = new SolrCore(new CoreDescriptor(h.getCoreContainer(), newCoreName, testSolrHome.resolve(newCoreName)), new ConfigSet("fakeConfigset", config, schema, null)); - assertNull(h.getCoreContainer().registerCore(newCoreName, c, false)); + assertNull(h.getCoreContainer().registerCore(newCoreName, c, false, false)); h.coreName = newCoreName; assertEquals("We are not using the correct core", "solrconfig_codec2.xml", h.getCore().getConfigResource()); assertU(add(doc("string_f", "foo"))); http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/65f55802/solr/core/src/test/org/apache/solr/search/TestIndexSearcher.java ---------------------------------------------------------------------- diff --git a/solr/core/src/test/org/apache/solr/search/TestIndexSearcher.java b/solr/core/src/test/org/apache/solr/search/TestIndexSearcher.java index f732f20..8fe3f97 100644 --- a/solr/core/src/test/org/apache/solr/search/TestIndexSearcher.java +++ b/solr/core/src/test/org/apache/solr/search/TestIndexSearcher.java @@ -230,7 +230,7 @@ public class TestIndexSearcher extends SolrTestCaseJ4 { try { // Create a new core, this should call all the firstSearcherListeners - newCore = cores.create("core1", cd.getInstanceDir(), ImmutableMap.of("config", "solrconfig-searcher-listeners1.xml")); + newCore = cores.create("core1", cd.getInstanceDir(), ImmutableMap.of("config", "solrconfig-searcher-listeners1.xml"), false); //validate that the new core was created with the correct solrconfig assertNotNull(newCore.getSearchComponent("mock")); @@ -280,7 +280,7 @@ public class TestIndexSearcher extends SolrTestCaseJ4 { boolean coreCreated = false; try { // Create a new core, this should call all the firstSearcherListeners - newCore = cores.create("core1", cd.getInstanceDir(), ImmutableMap.of("config", "solrconfig-searcher-listeners1.xml")); + newCore = cores.create("core1", cd.getInstanceDir(), ImmutableMap.of("config", "solrconfig-searcher-listeners1.xml"), false); coreCreated = true; //validate that the new core was created with the correct solrconfig @@ -346,7 +346,7 @@ public class TestIndexSearcher extends SolrTestCaseJ4 { try { System.setProperty("tests.solr.useColdSearcher", "true"); // Create a new core, this should call all the firstSearcherListeners - newCore = cores.create("core1", cd.getInstanceDir(), ImmutableMap.of("config", "solrconfig-searcher-listeners1.xml")); + newCore = cores.create("core1", cd.getInstanceDir(), ImmutableMap.of("config", "solrconfig-searcher-listeners1.xml"), false); coreCreated = true; //validate that the new core was created with the correct solrconfig http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/65f55802/solr/solrj/src/java/org/apache/solr/common/params/CoreAdminParams.java ---------------------------------------------------------------------- diff --git a/solr/solrj/src/java/org/apache/solr/common/params/CoreAdminParams.java b/solr/solrj/src/java/org/apache/solr/common/params/CoreAdminParams.java index 7f90a90..f3e0d7e 100644 --- a/solr/solrj/src/java/org/apache/solr/common/params/CoreAdminParams.java +++ b/solr/solrj/src/java/org/apache/solr/common/params/CoreAdminParams.java @@ -123,6 +123,11 @@ public abstract class CoreAdminParams */ public static final String COMMIT_NAME = "commitName"; + /** + * A boolean parameter specifying if a core is being created as part of a new collection + */ + public static final String NEW_COLLECTION = "newCollection"; + public enum CoreAdminAction { STATUS(true), UNLOAD,