You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by an...@apache.org on 2016/03/03 22:58:42 UTC
[1/3] lucene-solr git commit: SOLR-8725: Allow hyphen in shard,
collection, core, and alias names but not the first char
Repository: lucene-solr
Updated Branches:
refs/heads/branch_6_0 79a7008b7 -> ca03639e6
SOLR-8725: Allow hyphen in shard, collection, core, and alias names but not the first char
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/3f15560b
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/3f15560b
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/3f15560b
Branch: refs/heads/branch_6_0
Commit: 3f15560b519f41eb579d114363a4874aa585b324
Parents: 79a7008
Author: anshum <an...@apache.org>
Authored: Wed Mar 2 16:18:42 2016 -0800
Committer: anshum <an...@apache.org>
Committed: Thu Mar 3 13:54:59 2016 -0800
----------------------------------------------------------------------
solr/CHANGES.txt | 2 ++
.../org/apache/solr/core/CoreContainer.java | 9 ++++-----
.../solr/handler/admin/CollectionsHandler.java | 17 +++++++----------
.../apache/solr/cloud/TestCollectionAPI.java | 8 ++++----
.../solrj/request/CollectionAdminRequest.java | 20 ++++++++++----------
.../client/solrj/request/CoreAdminRequest.java | 8 ++++----
.../solrj/util/SolrIdentifierValidator.java | 16 +++++++++++++---
.../request/TestCollectionAdminRequest.java | 8 ++++----
.../client/solrj/request/TestCoreAdmin.java | 4 ++--
9 files changed, 50 insertions(+), 42 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/3f15560b/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index f070d81..b3750db 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -361,6 +361,8 @@ Other Changes
* SOLR-7010: Remove facet.date client functionality. (Steve Rowe)
+* SOLR-8725: Allow hyphen in collection, core, shard, and alias name as the non-first character (Anshum Gupta)
+
================== 5.5.1 ==================
Bug Fixes
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/3f15560b/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 7a55e05..9ff45ea 100644
--- a/solr/core/src/java/org/apache/solr/core/CoreContainer.java
+++ b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
@@ -805,8 +805,7 @@ public class CoreContainer {
try {
MDCLoggingContext.setCore(core);
if (!SolrIdentifierValidator.validateCoreName(dcore.getName())) {
- throw new SolrException(ErrorCode.BAD_REQUEST, "Invalid core: " + dcore.getName()
- + ". Core names must consist entirely of periods, underscores, and alphanumerics");
+ throw new SolrException(ErrorCode.BAD_REQUEST, SolrIdentifierValidator.getIdentifierMessage(SolrIdentifierValidator.IdentifierType.CORE, dcore.getName()));
}
if (zkSys.getZkController() != null) {
zkSys.getZkController().preRegister(dcore);
@@ -1010,9 +1009,9 @@ public class CoreContainer {
}
public void rename(String name, String toName) {
- if(!SolrIdentifierValidator.validateCoreName(toName)) {
- throw new SolrException(ErrorCode.BAD_REQUEST, "Invalid core: " + toName
- + ". Core names must consist entirely of periods, underscores, and alphanumerics");
+ if (!SolrIdentifierValidator.validateCoreName(toName)) {
+ throw new SolrException(ErrorCode.BAD_REQUEST, SolrIdentifierValidator.getIdentifierMessage(SolrIdentifierValidator.IdentifierType.CORE,
+ toName));
}
try (SolrCore core = getCore(name)) {
if (core != null) {
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/3f15560b/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
index c81e183..ce4eab2 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
@@ -347,14 +347,12 @@ public class CollectionsHandler extends RequestHandlerBase {
verifyRuleParams(h.coreContainer, props);
final String collectionName = (String) props.get(NAME);
if (!SolrIdentifierValidator.validateCollectionName(collectionName)) {
- throw new SolrException(ErrorCode.BAD_REQUEST, "Invalid collection: " + collectionName
- + ". Collection names must consist entirely of periods, underscores, and alphanumerics");
+ throw new SolrException(ErrorCode.BAD_REQUEST,
+ SolrIdentifierValidator.getIdentifierMessage(SolrIdentifierValidator.IdentifierType.COLLECTION, collectionName));
}
final String shardsParam = (String) props.get(SHARDS_PROP);
if (StringUtils.isNotEmpty(shardsParam)) {
- log.info("Validating shards param!!!!!!!!" + shardsParam);
verifyShardsParam(shardsParam);
- log.info("Validating shards param!!!!!!! done" + shardsParam);
}
if (SYSTEM_COLL.equals(collectionName)) {
//We must always create a .system collection with only a single shard
@@ -434,8 +432,7 @@ public class CollectionsHandler extends RequestHandlerBase {
throws Exception {
final String aliasName = req.getParams().get(NAME);
if (!SolrIdentifierValidator.validateCollectionName(aliasName)) {
- throw new SolrException(ErrorCode.BAD_REQUEST, "Invalid alias: " + aliasName
- + ". Aliases must consist entirely of periods, underscores, and alphanumerics");
+ throw new SolrException(ErrorCode.BAD_REQUEST, SolrIdentifierValidator.getIdentifierMessage(SolrIdentifierValidator.IdentifierType.ALIAS, aliasName));
}
return req.getParams().required().getAll(null, NAME, "collections");
}
@@ -502,8 +499,8 @@ public class CollectionsHandler extends RequestHandlerBase {
ClusterState clusterState = handler.coreContainer.getZkController().getClusterState();
final String newShardName = req.getParams().get(SHARD_ID_PROP);
if (!SolrIdentifierValidator.validateShardName(newShardName)) {
- throw new SolrException(ErrorCode.BAD_REQUEST, "Invalid shard: " + newShardName
- + ". Shard names must consist entirely of periods, underscores, and alphanumerics");
+ throw new SolrException(ErrorCode.BAD_REQUEST, SolrIdentifierValidator.getIdentifierMessage(SolrIdentifierValidator.IdentifierType.SHARD,
+ newShardName));
}
if (!ImplicitDocRouter.NAME.equals(((Map) clusterState.getCollection(req.getParams().get(COLLECTION_PROP)).get(DOC_ROUTER)).get(NAME)))
throw new SolrException(ErrorCode.BAD_REQUEST, "shards can be added only to 'implicit' collections");
@@ -989,8 +986,8 @@ public class CollectionsHandler extends RequestHandlerBase {
private static void verifyShardsParam(String shardsParam) {
for (String shard : shardsParam.split(",")) {
if (!SolrIdentifierValidator.validateShardName(shard))
- throw new SolrException(ErrorCode.BAD_REQUEST, "Invalid shard: " + shard
- + ". Shard names must consist entirely of periods, underscores, and alphanumerics");;
+ throw new SolrException(ErrorCode.BAD_REQUEST, SolrIdentifierValidator.getIdentifierMessage(SolrIdentifierValidator.IdentifierType.SHARD,
+ shard));
}
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/3f15560b/solr/core/src/test/org/apache/solr/cloud/TestCollectionAPI.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestCollectionAPI.java b/solr/core/src/test/org/apache/solr/cloud/TestCollectionAPI.java
index 353c708..b203f02 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestCollectionAPI.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestCollectionAPI.java
@@ -649,7 +649,7 @@ public class TestCollectionAPI extends ReplicaPropertiesBase {
final String errorMessage = e.getMessage();
assertTrue(errorMessage.contains("Invalid collection"));
assertTrue(errorMessage.contains("invalid@name#with$weird%characters"));
- assertTrue(errorMessage.contains("Collection names must consist entirely of"));
+ assertTrue(errorMessage.contains("collection names must consist entirely of"));
}
}
}
@@ -672,7 +672,7 @@ public class TestCollectionAPI extends ReplicaPropertiesBase {
final String errorMessage = e.getMessage();
assertTrue(errorMessage.contains("Invalid shard"));
assertTrue(errorMessage.contains("invalid@name#with$weird%characters"));
- assertTrue(errorMessage.contains("Shard names must consist entirely of"));
+ assertTrue(errorMessage.contains("shard names must consist entirely of"));
}
}
}
@@ -693,7 +693,7 @@ public class TestCollectionAPI extends ReplicaPropertiesBase {
final String errorMessage = e.getMessage();
assertTrue(errorMessage.contains("Invalid alias"));
assertTrue(errorMessage.contains("invalid@name#with$weird%characters"));
- assertTrue(errorMessage.contains("Aliases must consist entirely of"));
+ assertTrue(errorMessage.contains("alias names must consist entirely of"));
}
}
}
@@ -726,7 +726,7 @@ public class TestCollectionAPI extends ReplicaPropertiesBase {
final String errorMessage = e.getMessage();
assertTrue(errorMessage.contains("Invalid shard"));
assertTrue(errorMessage.contains("invalid@name#with$weird%characters"));
- assertTrue(errorMessage.contains("Shard names must consist entirely of"));
+ assertTrue(errorMessage.contains("shard names must consist entirely of"));
}
}
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/3f15560b/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
index 768de29..9aead92 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
@@ -292,15 +292,15 @@ public abstract class CollectionAdminRequest <Q extends CollectionAdminRequest<Q
/**
* Provide the name of the shards to be created, separated by commas
*
- * Shard names must consist entirely of periods, underscores, and alphanumerics. Other characters are not allowed.
+ * Shard names must consist entirely of periods, underscores, hyphens, and alphanumerics. Other characters are not allowed.
*
* @throws IllegalArgumentException if any of the shard names contain invalid characters.
*/
public Create setShards(String shards) {
for (String shard : shards.split(",")) {
if (!SolrIdentifierValidator.validateShardName(shard)) {
- throw new IllegalArgumentException("Invalid shard: " + shard
- + ". Shard names must consist entirely of periods, underscores, and alphanumerics");
+ throw new IllegalArgumentException(SolrIdentifierValidator.getIdentifierMessage(SolrIdentifierValidator.IdentifierType.SHARD,
+ shard));
}
}
this.shards = shards;
@@ -317,8 +317,8 @@ public abstract class CollectionAdminRequest <Q extends CollectionAdminRequest<Q
@Override
public Create setCollectionName(String collectionName) throws SolrException {
if (!SolrIdentifierValidator.validateCollectionName(collectionName)) {
- throw new IllegalArgumentException("Invalid collection: " + collectionName
- + ". Collection names must consist entirely of periods, underscores, and alphanumerics");
+ throw new IllegalArgumentException(SolrIdentifierValidator.getIdentifierMessage(SolrIdentifierValidator.IdentifierType.COLLECTION,
+ collectionName));
}
this.collection = collectionName;
return this;
@@ -440,15 +440,15 @@ public abstract class CollectionAdminRequest <Q extends CollectionAdminRequest<Q
/**
* Provide the name of the shard to be created.
*
- * Shard names must consist entirely of periods, underscores, and alphanumerics. Other characters are not allowed.
+ * Shard names must consist entirely of periods, underscores, hyphens, and alphanumerics. Other characters are not allowed.
*
* @throws IllegalArgumentException if the shard name contains invalid characters.
*/
@Override
public CreateShard setShardName(String shardName) {
if (!SolrIdentifierValidator.validateShardName(shardName)) {
- throw new IllegalArgumentException("Invalid shard: " + shardName
- + ". Shard names must consist entirely of periods, underscores, and alphanumerics");
+ throw new IllegalArgumentException(SolrIdentifierValidator.getIdentifierMessage(SolrIdentifierValidator.IdentifierType.SHARD,
+ shardName));
}
this.shardName = shardName;
return this;
@@ -641,8 +641,8 @@ public abstract class CollectionAdminRequest <Q extends CollectionAdminRequest<Q
*/
public CreateAlias setAliasName(String aliasName) {
if (!SolrIdentifierValidator.validateCollectionName(aliasName)) {
- throw new IllegalArgumentException("Invalid alias: " + aliasName
- + ". Aliases must consist entirely of periods, underscores, and alphanumerics");
+ throw new IllegalArgumentException(SolrIdentifierValidator.getIdentifierMessage(SolrIdentifierValidator.IdentifierType.ALIAS,
+ aliasName));
}
this.aliasName = aliasName;
return this;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/3f15560b/solr/solrj/src/java/org/apache/solr/client/solrj/request/CoreAdminRequest.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/CoreAdminRequest.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/CoreAdminRequest.java
index c1f986e..ab563ed 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/CoreAdminRequest.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/CoreAdminRequest.java
@@ -111,8 +111,8 @@ public class CoreAdminRequest extends SolrRequest<CoreAdminResponse> {
@Override
public void setCoreName(String coreName) {
if (!SolrIdentifierValidator.validateCoreName(coreName)) {
- throw new IllegalArgumentException("Invalid core: " + coreName
- + ". Core names must consist entirely of periods, underscores, and alphanumerics");
+ throw new IllegalArgumentException(SolrIdentifierValidator.getIdentifierMessage(SolrIdentifierValidator.IdentifierType.CORE,
+ coreName));
}
this.core = coreName;
}
@@ -560,8 +560,8 @@ public class CoreAdminRequest extends SolrRequest<CoreAdminResponse> {
public static CoreAdminResponse renameCore(String coreName, String newName, SolrClient client )
throws SolrServerException, IOException {
if (!SolrIdentifierValidator.validateCoreName(newName)) {
- throw new IllegalArgumentException("Invalid core: " + newName
- + ". Core names must consist entirely of periods, underscores, and alphanumerics");
+ throw new IllegalArgumentException(SolrIdentifierValidator.getIdentifierMessage(SolrIdentifierValidator.IdentifierType.CORE,
+ newName));
}
CoreAdminRequest req = new CoreAdminRequest();
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/3f15560b/solr/solrj/src/java/org/apache/solr/client/solrj/util/SolrIdentifierValidator.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/util/SolrIdentifierValidator.java b/solr/solrj/src/java/org/apache/solr/client/solrj/util/SolrIdentifierValidator.java
index 00d9b83..2b1f3b5 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/util/SolrIdentifierValidator.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/util/SolrIdentifierValidator.java
@@ -23,11 +23,15 @@ import java.util.regex.Pattern;
* Ensures that provided identifiers align with Solr's recommendations/requirements for choosing
* collection, core, etc identifiers.
*
- * Identifiers are allowed to contain underscores, periods, and alphanumeric characters.
+ * Identifiers are allowed to contain underscores, periods, hyphens, and alphanumeric characters.
*/
public class SolrIdentifierValidator {
- final static Pattern identifierPattern = Pattern.compile("^[\\._A-Za-z0-9]*$");
-
+ final static Pattern identifierPattern = Pattern.compile("^(?!\\-)[\\._A-Za-z0-9\\-]*$");
+
+ public enum IdentifierType {
+ SHARD, COLLECTION, CORE, ALIAS
+ }
+
public static boolean validateShardName(String shardName) {
return validateIdentifier(shardName);
}
@@ -46,6 +50,12 @@ public class SolrIdentifierValidator {
}
return true;
}
+
+ public static String getIdentifierMessage(IdentifierType identifierType, String name) {
+ return "Invalid " + identifierType.toString().toLowerCase() + ": " + name + ". " + identifierType.toString().toLowerCase()
+ + " names must consist entirely of periods, underscores, hyphens, and alphanumerics";
+
+ }
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/3f15560b/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestCollectionAdminRequest.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestCollectionAdminRequest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestCollectionAdminRequest.java
index ce6a6aa..5d5c315 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestCollectionAdminRequest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestCollectionAdminRequest.java
@@ -37,7 +37,7 @@ public class TestCollectionAdminRequest extends LuceneTestCase {
final String exceptionMessage = e.getMessage();
assertTrue(exceptionMessage.contains("Invalid collection"));
assertTrue(exceptionMessage.contains("invalid$collection@name"));
- assertTrue(exceptionMessage.contains("must consist entirely of periods, underscores, and alphanumerics"));
+ assertTrue(exceptionMessage.contains("must consist entirely of periods, underscores, hyphens, and alphanumerics"));
}
}
@@ -51,7 +51,7 @@ public class TestCollectionAdminRequest extends LuceneTestCase {
final String exceptionMessage = e.getMessage();
assertTrue(exceptionMessage.contains("Invalid shard"));
assertTrue(exceptionMessage.contains("invalid$shard@name"));
- assertTrue(exceptionMessage.contains("must consist entirely of periods, underscores, and alphanumerics"));
+ assertTrue(exceptionMessage.contains("must consist entirely of periods, underscores, hyphens, and alphanumerics"));
}
}
@@ -65,7 +65,7 @@ public class TestCollectionAdminRequest extends LuceneTestCase {
final String exceptionMessage = e.getMessage();
assertTrue(exceptionMessage.contains("Invalid alias"));
assertTrue(exceptionMessage.contains("invalid$alias@name"));
- assertTrue(exceptionMessage.contains("must consist entirely of periods, underscores, and alphanumerics"));
+ assertTrue(exceptionMessage.contains("must consist entirely of periods, underscores, hyphens, and alphanumerics"));
}
}
@@ -79,7 +79,7 @@ public class TestCollectionAdminRequest extends LuceneTestCase {
final String exceptionMessage = e.getMessage();
assertTrue(exceptionMessage.contains("Invalid shard"));
assertTrue(exceptionMessage.contains("invalid$shard@name"));
- assertTrue(exceptionMessage.contains("must consist entirely of periods, underscores, and alphanumerics"));
+ assertTrue(exceptionMessage.contains("must consist entirely of periods, underscores, hyphens, and alphanumerics"));
}
}
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/3f15560b/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 143d2c3..f3c3d55 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
@@ -171,7 +171,7 @@ public class TestCoreAdmin extends AbstractEmbeddedSolrServerTestCase {
final String exceptionMessage = e.getMessage();
assertTrue(exceptionMessage.contains("Invalid core"));
assertTrue(exceptionMessage.contains("invalid$core@name"));
- assertTrue(exceptionMessage.contains("must consist entirely of periods, underscores, and alphanumerics"));
+ assertTrue(exceptionMessage.contains("must consist entirely of periods, underscores, hyphens, and alphanumerics"));
}
}
@@ -184,7 +184,7 @@ public class TestCoreAdmin extends AbstractEmbeddedSolrServerTestCase {
final String exceptionMessage = e.getMessage();
assertTrue(e.getMessage(), exceptionMessage.contains("Invalid core"));
assertTrue(exceptionMessage.contains("invalid$core@name"));
- assertTrue(exceptionMessage.contains("must consist entirely of periods, underscores, and alphanumerics"));
+ assertTrue(exceptionMessage.contains("must consist entirely of periods, underscores, hyphens, and alphanumerics"));
}
}
[3/3] lucene-solr git commit: SOLR-8423: DeleteShard and
DeleteReplica should cleanup instance and data directory by default and add
support for optionally retaining the directories
Posted by an...@apache.org.
SOLR-8423: DeleteShard and DeleteReplica should cleanup instance and data directory by default and add support for optionally retaining the directories
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/ca03639e
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/ca03639e
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/ca03639e
Branch: refs/heads/branch_6_0
Commit: ca03639e6d5fbae924060fdb0b087189bb65a75d
Parents: 2fef533
Author: anshum <an...@apache.org>
Authored: Wed Mar 2 10:17:05 2016 -0800
Committer: anshum <an...@apache.org>
Committed: Thu Mar 3 13:55:24 2016 -0800
----------------------------------------------------------------------
solr/CHANGES.txt | 3 +
.../cloud/OverseerCollectionMessageHandler.java | 11 ++-
.../solr/handler/admin/CollectionsHandler.java | 16 +++-
.../java/org/apache/solr/util/FileUtils.java | 3 +
.../apache/solr/cloud/DeleteReplicaTest.java | 60 ++++++++++++---
.../org/apache/solr/cloud/DeleteShardTest.java | 78 +++++++++++++++++++-
.../solrj/request/CollectionAdminRequest.java | 64 ++++++++++++++++
7 files changed, 218 insertions(+), 17 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ca03639e/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index b3750db..7c42182 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -363,6 +363,9 @@ Other Changes
* SOLR-8725: Allow hyphen in collection, core, shard, and alias name as the non-first character (Anshum Gupta)
+* SOLR-8423: DeleteShard and DeleteReplica should cleanup instance and data directory by default and add
+ support for optionally retaining the directories. (Anshum Gupta)
+
================== 5.5.1 ==================
Bug Fixes
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ca03639e/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionMessageHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionMessageHandler.java b/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionMessageHandler.java
index 2f7a14e..084212e 100644
--- a/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionMessageHandler.java
+++ b/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionMessageHandler.java
@@ -602,8 +602,10 @@ public class OverseerCollectionMessageHandler implements OverseerMessageHandler
ModifiableSolrParams params = new ModifiableSolrParams();
params.add(CoreAdminParams.ACTION, CoreAdminAction.UNLOAD.toString());
params.add(CoreAdminParams.CORE, core);
- params.add(CoreAdminParams.DELETE_INSTANCE_DIR, "true");
- params.add(CoreAdminParams.DELETE_DATA_DIR, "true");
+
+ params.set(CoreAdminParams.DELETE_INDEX, message.getBool(CoreAdminParams.DELETE_INDEX, true));
+ params.set(CoreAdminParams.DELETE_INSTANCE_DIR, message.getBool(CoreAdminParams.DELETE_INSTANCE_DIR, true));
+ params.set(CoreAdminParams.DELETE_DATA_DIR, message.getBool(CoreAdminParams.DELETE_DATA_DIR, true));
sendShardRequest(replica.getNodeName(), params, shardHandler, asyncId, requestMap);
@@ -1409,7 +1411,10 @@ public class OverseerCollectionMessageHandler implements OverseerMessageHandler
try {
ModifiableSolrParams params = new ModifiableSolrParams();
params.set(CoreAdminParams.ACTION, CoreAdminAction.UNLOAD.toString());
- params.set(CoreAdminParams.DELETE_INDEX, "true");
+ params.set(CoreAdminParams.DELETE_INDEX, message.getBool(CoreAdminParams.DELETE_INDEX, true));
+ params.set(CoreAdminParams.DELETE_INSTANCE_DIR, message.getBool(CoreAdminParams.DELETE_INSTANCE_DIR, true));
+ params.set(CoreAdminParams.DELETE_DATA_DIR, message.getBool(CoreAdminParams.DELETE_DATA_DIR, true));
+
sliceCmd(clusterState, params, null, slice, shardHandler, asyncId, requestMap);
processResponses(results, shardHandler, true, "Failed to delete shard", asyncId, requestMap, Collections.emptySet());
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ca03639e/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
index ce4eab2..de2104f 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
@@ -45,6 +45,9 @@ import static org.apache.solr.common.params.CommonAdminParams.ASYNC;
import static org.apache.solr.common.params.CommonParams.NAME;
import static org.apache.solr.common.params.CommonParams.VALUE_LONG;
import static org.apache.solr.common.params.CoreAdminParams.DATA_DIR;
+import static org.apache.solr.common.params.CoreAdminParams.DELETE_DATA_DIR;
+import static org.apache.solr.common.params.CoreAdminParams.DELETE_INDEX;
+import static org.apache.solr.common.params.CoreAdminParams.DELETE_INSTANCE_DIR;
import static org.apache.solr.common.params.CoreAdminParams.INSTANCE_DIR;
import static org.apache.solr.common.params.ShardParams._ROUTE_;
import static org.apache.solr.common.util.StrUtils.formatString;
@@ -478,9 +481,14 @@ public class CollectionsHandler extends RequestHandlerBase {
DELETESHARD_OP(DELETESHARD) {
@Override
Map<String, Object> call(SolrQueryRequest req, SolrQueryResponse rsp, CollectionsHandler handler) throws Exception {
- return req.getParams().required().getAll(null,
+ Map<String, Object> map = req.getParams().required().getAll(null,
COLLECTION_PROP,
SHARD_ID_PROP);
+ req.getParams().getAll(map,
+ DELETE_INDEX,
+ DELETE_DATA_DIR,
+ DELETE_INSTANCE_DIR);
+ return map;
}
},
FORCELEADER_OP(FORCELEADER) {
@@ -517,6 +525,12 @@ public class CollectionsHandler extends RequestHandlerBase {
COLLECTION_PROP,
SHARD_ID_PROP,
REPLICA_PROP);
+
+ req.getParams().getAll(map,
+ DELETE_INDEX,
+ DELETE_DATA_DIR,
+ DELETE_INSTANCE_DIR);
+
return req.getParams().getAll(map, ONLY_IF_DOWN);
}
},
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ca03639e/solr/core/src/java/org/apache/solr/util/FileUtils.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/util/FileUtils.java b/solr/core/src/java/org/apache/solr/util/FileUtils.java
index 48148f6..09db4f0 100644
--- a/solr/core/src/java/org/apache/solr/util/FileUtils.java
+++ b/solr/core/src/java/org/apache/solr/util/FileUtils.java
@@ -93,4 +93,7 @@ public class FileUtils {
throw exc;
}
+ public static boolean fileExists(String filePathString) {
+ return new File(filePathString).exists();
+ }
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ca03639e/solr/core/src/test/org/apache/solr/cloud/DeleteReplicaTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/DeleteReplicaTest.java b/solr/core/src/test/org/apache/solr/cloud/DeleteReplicaTest.java
index b1f8c49dc..f0d6484 100644
--- a/solr/core/src/test/org/apache/solr/cloud/DeleteReplicaTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/DeleteReplicaTest.java
@@ -16,10 +16,19 @@
*/
package org.apache.solr.cloud;
+import java.io.File;
+import java.io.IOException;
+import java.lang.invoke.MethodHandles;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
+import org.apache.solr.client.solrj.request.CollectionAdminRequest;
import org.apache.solr.client.solrj.request.CoreAdminRequest;
import org.apache.solr.client.solrj.request.QueryRequest;
import org.apache.solr.client.solrj.response.CoreAdminResponse;
@@ -31,24 +40,17 @@ import org.apache.solr.common.cloud.ZkStateReader;
import org.apache.solr.common.params.MapSolrParams;
import org.apache.solr.common.params.SolrParams;
import org.apache.solr.common.util.NamedList;
+import org.apache.solr.util.FileUtils;
import org.apache.solr.util.TimeOut;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.File;
-import java.io.IOException;
-import java.lang.invoke.MethodHandles;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
import static org.apache.solr.cloud.OverseerCollectionMessageHandler.NUM_SLICES;
import static org.apache.solr.cloud.OverseerCollectionMessageHandler.ONLY_IF_DOWN;
-import static org.apache.solr.common.util.Utils.makeMap;
import static org.apache.solr.common.cloud.ZkStateReader.MAX_SHARDS_PER_NODE;
import static org.apache.solr.common.params.CollectionParams.CollectionAction.DELETEREPLICA;
+import static org.apache.solr.common.util.Utils.makeMap;
public class DeleteReplicaTest extends AbstractFullDistribZkTestBase {
@@ -170,4 +172,44 @@ public class DeleteReplicaTest extends AbstractFullDistribZkTestBase {
Map<String,List<Integer>> collectionInfos = new HashMap<>();
createCollection(collectionInfos, COLL_NAME, props, client);
}
+
+ @Test
+ @ShardsFixed(num = 2)
+ public void deleteReplicaAndVerifyDirectoryCleanup() throws IOException, SolrServerException, InterruptedException {
+ createCollection("deletereplica_test", 1, 2, 4);
+
+ Replica leader = cloudClient.getZkStateReader().getLeaderRetry("deletereplica_test", "shard1");
+ String baseUrl = (String) leader.get("base_url");
+ String core = (String) leader.get("core");
+ String leaderCoreName = leader.getName();
+
+ String instanceDir;
+ String dataDir;
+
+ try (HttpSolrClient client = new HttpSolrClient(baseUrl)) {
+ CoreAdminResponse statusResp = CoreAdminRequest.getStatus(core, client);
+ NamedList r = statusResp.getCoreStatus().get(core);
+ instanceDir = (String) r.findRecursive("instanceDir");
+ dataDir = (String) r.get("dataDir");
+ }
+
+ //Confirm that the instance and data directory exist
+ assertTrue("Instance directory doesn't exist", FileUtils.fileExists(instanceDir));
+ assertTrue("DataDirectory doesn't exist", FileUtils.fileExists(dataDir));
+
+ new CollectionAdminRequest.DeleteReplica()
+ .setCollectionName("deletereplica_test")
+ .setShardName("shard1")
+ .setReplica(leaderCoreName)
+ .process(cloudClient);
+
+ Replica newLeader = cloudClient.getZkStateReader().getLeaderRetry("deletereplica_test", "shard1");
+
+ assertFalse(leader.equals(newLeader));
+
+ //Confirm that the instance and data directory were deleted by default
+
+ assertFalse("Instance directory still exists", FileUtils.fileExists(instanceDir));
+ assertFalse("DataDirectory still exists", FileUtils.fileExists(dataDir));
+ }
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ca03639e/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java b/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java
index ae15e22..101bfb9 100644
--- a/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java
@@ -16,27 +16,34 @@
*/
package org.apache.solr.cloud;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
+import org.apache.solr.client.solrj.request.CollectionAdminRequest;
+import org.apache.solr.client.solrj.request.CoreAdminRequest;
import org.apache.solr.client.solrj.request.QueryRequest;
+import org.apache.solr.client.solrj.response.CollectionAdminResponse;
+import org.apache.solr.client.solrj.response.CoreAdminResponse;
import org.apache.solr.cloud.overseer.OverseerAction;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.cloud.ClusterState;
+import org.apache.solr.common.cloud.Replica;
import org.apache.solr.common.cloud.Slice;
import org.apache.solr.common.cloud.Slice.State;
import org.apache.solr.common.cloud.ZkNodeProps;
import org.apache.solr.common.cloud.ZkStateReader;
import org.apache.solr.common.params.CollectionParams;
import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.solr.common.util.NamedList;
import org.apache.solr.common.util.Utils;
+import org.apache.solr.util.FileUtils;
import org.apache.zookeeper.KeeperException;
import org.junit.Test;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
public class DeleteShardTest extends AbstractFullDistribZkTestBase {
public DeleteShardTest() {
@@ -150,4 +157,67 @@ public class DeleteShardTest extends AbstractFullDistribZkTestBase {
}
}
+ @Test
+ public void testDirectoryCleanupAfterDeleteShard() throws InterruptedException, IOException, SolrServerException {
+ CollectionAdminResponse rsp = new CollectionAdminRequest.Create()
+ .setCollectionName("deleteshard_test")
+ .setRouterName("implicit")
+ .setShards("a,b,c")
+ .setReplicationFactor(1)
+ .setConfigName("conf1")
+ .process(cloudClient);
+
+ // Get replica details
+ Replica leader = cloudClient.getZkStateReader().getLeaderRetry("deleteshard_test", "a");
+ String baseUrl = (String) leader.get("base_url");
+ String core = (String) leader.get("core");
+
+ String instanceDir;
+ String dataDir;
+
+ try (HttpSolrClient client = new HttpSolrClient(baseUrl)) {
+ CoreAdminResponse statusResp = CoreAdminRequest.getStatus(core, client);
+ NamedList r = statusResp.getCoreStatus().get(core);
+ instanceDir = (String) r.findRecursive("instanceDir");
+ dataDir = (String) r.get("dataDir");
+ }
+
+ assertTrue("Instance directory doesn't exist", FileUtils.fileExists(instanceDir));
+ assertTrue("Data directory doesn't exist", FileUtils.fileExists(dataDir));
+
+ assertEquals(3, cloudClient.getZkStateReader().getClusterState().getActiveSlices("deleteshard_test").size());
+
+ // Delete shard 'a'
+ new CollectionAdminRequest.DeleteShard()
+ .setCollectionName("deleteshard_test")
+ .setShardName("a")
+ .process(cloudClient);
+
+ assertEquals(2, cloudClient.getZkStateReader().getClusterState().getActiveSlices("deleteshard_test").size());
+ assertFalse("Instance directory still exists", FileUtils.fileExists(instanceDir));
+ assertFalse("Data directory still exists", FileUtils.fileExists(dataDir));
+
+ leader = cloudClient.getZkStateReader().getLeaderRetry("deleteshard_test", "b");
+ baseUrl = (String) leader.get("base_url");
+ core = (String) leader.get("core");
+
+ try (HttpSolrClient client = new HttpSolrClient(baseUrl)) {
+ CoreAdminResponse statusResp = CoreAdminRequest.getStatus(core, client);
+ NamedList r = statusResp.getCoreStatus().get(core);
+ instanceDir = (String) r.findRecursive("instanceDir");
+ dataDir = (String) r.get("dataDir");
+ }
+
+ // Delete shard 'b'
+ new CollectionAdminRequest.DeleteShard()
+ .setCollectionName("deleteshard_test")
+ .setShardName("b")
+ .setDeleteDataDir(false)
+ .setDeleteInstanceDir(false)
+ .process(cloudClient);
+
+ assertEquals(1, cloudClient.getZkStateReader().getClusterState().getActiveSlices("deleteshard_test").size());
+ assertTrue("Instance directory still exists", FileUtils.fileExists(instanceDir));
+ assertTrue("Data directory still exists", FileUtils.fileExists(dataDir));
+ }
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ca03639e/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
index 9aead92..a7d71ca 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
@@ -526,6 +526,10 @@ public abstract class CollectionAdminRequest <Q extends CollectionAdminRequest<Q
// DELETESHARD request
public static class DeleteShard extends CollectionShardAsyncAdminRequest<DeleteShard> {
+
+ private Boolean deleteInstanceDir;
+ private Boolean deleteDataDir;
+
public DeleteShard() {
action = CollectionAction.DELETESHARD;
}
@@ -534,6 +538,36 @@ public abstract class CollectionAdminRequest <Q extends CollectionAdminRequest<Q
protected DeleteShard getThis() {
return this;
}
+
+ public Boolean getDeleteInstanceDir() {
+ return deleteInstanceDir;
+ }
+
+ public DeleteShard setDeleteInstanceDir(Boolean deleteInstanceDir) {
+ this.deleteInstanceDir = deleteInstanceDir;
+ return this;
+ }
+
+ public Boolean getDeleteDataDir() {
+ return deleteDataDir;
+ }
+
+ public DeleteShard setDeleteDataDir(Boolean deleteDataDir) {
+ this.deleteDataDir = deleteDataDir;
+ return this;
+ }
+
+ @Override
+ public SolrParams getParams() {
+ ModifiableSolrParams params = new ModifiableSolrParams(super.getParams());
+ if (deleteInstanceDir != null) {
+ params.set(CoreAdminParams.DELETE_INSTANCE_DIR, deleteInstanceDir);
+ }
+ if (deleteDataDir != null) {
+ params.set(CoreAdminParams.DELETE_DATA_DIR, deleteDataDir);
+ }
+ return params;
+ }
}
// FORCELEADER request
@@ -793,6 +827,9 @@ public abstract class CollectionAdminRequest <Q extends CollectionAdminRequest<Q
public static class DeleteReplica extends CollectionShardAsyncAdminRequest<DeleteReplica> {
protected String replica;
protected Boolean onlyIfDown;
+ private Boolean deleteDataDir;
+ private Boolean deleteInstanceDir;
+ private Boolean deleteIndexDir;
public DeleteReplica() {
action = CollectionAction.DELETEREPLICA;
@@ -824,6 +861,15 @@ public abstract class CollectionAdminRequest <Q extends CollectionAdminRequest<Q
if (onlyIfDown != null) {
params.set("onlyIfDown", onlyIfDown);
}
+ if (deleteDataDir != null) {
+ params.set(CoreAdminParams.DELETE_DATA_DIR, deleteDataDir);
+ }
+ if (deleteInstanceDir != null) {
+ params.set(CoreAdminParams.DELETE_INSTANCE_DIR, deleteInstanceDir);
+ }
+ if (deleteIndexDir != null) {
+ params.set(CoreAdminParams.DELETE_INDEX, deleteIndexDir);
+ }
return params;
}
@@ -831,6 +877,24 @@ public abstract class CollectionAdminRequest <Q extends CollectionAdminRequest<Q
protected DeleteReplica getThis() {
return this;
}
+
+ public Boolean getDeleteDataDir() {
+ return deleteDataDir;
+ }
+
+ public DeleteReplica setDeleteDataDir(Boolean deleteDataDir) {
+ this.deleteDataDir = deleteDataDir;
+ return this;
+ }
+
+ public Boolean getDeleteInstanceDir() {
+ return deleteInstanceDir;
+ }
+
+ public DeleteReplica setDeleteInstanceDir(Boolean deleteInstanceDir) {
+ this.deleteInstanceDir = deleteInstanceDir;
+ return this;
+ }
}
// CLUSTERPROP request
[2/3] lucene-solr git commit: SOLR-8725: Fix precommit check
Posted by an...@apache.org.
SOLR-8725: Fix precommit check
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/2fef533f
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/2fef533f
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/2fef533f
Branch: refs/heads/branch_6_0
Commit: 2fef533fe97be90ffb41daee83b4d05c88cc3a7a
Parents: 3f15560b
Author: anshum <an...@apache.org>
Authored: Thu Mar 3 13:03:31 2016 -0800
Committer: anshum <an...@apache.org>
Committed: Thu Mar 3 13:55:13 2016 -0800
----------------------------------------------------------------------
.../solr/client/solrj/util/SolrIdentifierValidator.java | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2fef533f/solr/solrj/src/java/org/apache/solr/client/solrj/util/SolrIdentifierValidator.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/util/SolrIdentifierValidator.java b/solr/solrj/src/java/org/apache/solr/client/solrj/util/SolrIdentifierValidator.java
index 2b1f3b5..449c621 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/util/SolrIdentifierValidator.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/util/SolrIdentifierValidator.java
@@ -1,7 +1,3 @@
-package org.apache.solr.client.solrj.util;
-
-import java.util.regex.Pattern;
-
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
@@ -18,6 +14,10 @@ import java.util.regex.Pattern;
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+package org.apache.solr.client.solrj.util;
+
+import java.util.Locale;
+import java.util.regex.Pattern;
/**
* Ensures that provided identifiers align with Solr's recommendations/requirements for choosing
@@ -52,7 +52,8 @@ public class SolrIdentifierValidator {
}
public static String getIdentifierMessage(IdentifierType identifierType, String name) {
- return "Invalid " + identifierType.toString().toLowerCase() + ": " + name + ". " + identifierType.toString().toLowerCase()
+ return "Invalid " + identifierType.toString().toLowerCase(Locale.ROOT) + ": " + name + ". "
+ + identifierType.toString().toLowerCase(Locale.ROOT)
+ " names must consist entirely of periods, underscores, hyphens, and alphanumerics";
}