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 2014/12/23 02:30:42 UTC
svn commit: r1647462 - in /lucene/dev/trunk/solr: ./
core/src/test/org/apache/solr/cloud/
solrj/src/java/org/apache/solr/client/solrj/request/
Author: anshum
Date: Tue Dec 23 01:30:41 2014
New Revision: 1647462
URL: http://svn.apache.org/r1647462
Log:
SOLR-6881: Add split.key support for SPLITSHARD via SolrJ.
Added:
lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/CollectionsAPISolrJTests.java (with props)
Modified:
lucene/dev/trunk/solr/CHANGES.txt
lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/CollectionsAPIDistributedZkTest.java
lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1647462&r1=1647461&r2=1647462&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Tue Dec 23 01:30:41 2014
@@ -528,6 +528,8 @@ Other Changes
* SOLR-6523: Provide SolrJ support for specifying stateFormat while creating Collections.
(Anshum Gupta)
+* SOLR-6881: Add split.key support for SPLITSHARD via SolrJ (Anshum Gupta)
+
================== 4.10.3 ==================
Bug Fixes
Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/CollectionsAPIDistributedZkTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/CollectionsAPIDistributedZkTest.java?rev=1647462&r1=1647461&r2=1647462&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/CollectionsAPIDistributedZkTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/CollectionsAPIDistributedZkTest.java Tue Dec 23 01:30:41 2014
@@ -199,7 +199,6 @@ public class CollectionsAPIDistributedZk
@Override
public void doTest() throws Exception {
- testSolrJAPICalls();
testPropertyParamsForCreate();
testNodesUsedByCreate();
testCollectionsAPI();
@@ -299,152 +298,6 @@ public class CollectionsAPIDistributedZk
}
- private void testSolrJAPICalls() throws Exception {
- SolrServer server = createNewSolrServer("", getBaseUrl((HttpSolrServer) clients.get(0)));
- CollectionAdminResponse response;
- Map<String, NamedList<Integer>> coresStatus;
- Map<String, NamedList<Integer>> nodesStatus;
-
- CollectionAdminRequest.Create createCollectionRequest = new CollectionAdminRequest.Create();
- createCollectionRequest.setCollectionName("solrj_collection");
- createCollectionRequest.setNumShards(2);
- createCollectionRequest.setReplicationFactor(2);
- createCollectionRequest.setConfigName("conf1");
- createCollectionRequest.setRouterField("myOwnField");
- response = createCollectionRequest.process(server);
-
- assertEquals(0, response.getStatus());
- assertTrue(response.isSuccess());
- coresStatus = response.getCollectionCoresStatus();
- assertEquals(4, coresStatus.size());
- for (int i=0; i<4; i++) {
- NamedList<Integer> status = coresStatus.get("solrj_collection_shard" + (i/2+1) + "_replica" + (i%2+1));
- assertEquals(0, (int)status.get("status"));
- assertTrue(status.get("QTime") > 0);
- }
-
- // TODO: This test tries to validates defaulting to implicit router.
- createCollectionRequest = new CollectionAdminRequest.Create();
- createCollectionRequest.setCollectionName("solrj_implicit");
- createCollectionRequest.setShards("shardA,shardB");
- createCollectionRequest.setConfigName("conf1");
- createCollectionRequest.setRouterName("implicit");
- response = createCollectionRequest.process(server);
-
- assertEquals(0, response.getStatus());
- assertTrue(response.isSuccess());
- coresStatus = response.getCollectionCoresStatus();
- assertEquals(2, coresStatus.size());
-
- // Test Creating a collection with new stateformat.
- String collectionName = "solrj_newstateformat";
- createCollectionRequest = new CollectionAdminRequest.Create();
- createCollectionRequest.setCollectionName(collectionName);
- createCollectionRequest.setNumShards(2);
- createCollectionRequest.setConfigName("conf1");
- createCollectionRequest.setStateFormat(2);
-
- response = createCollectionRequest.process(server);
- assertEquals(0, response.getStatus());
- assertTrue(response.isSuccess());
-
- waitForRecoveriesToFinish(collectionName, false);
- assertTrue("Collection state does not exist",
- cloudClient.getZkStateReader().getZkClient()
- .exists(ZkStateReader.getCollectionPath(collectionName), true));
-
- CollectionAdminRequest.CreateShard createShardRequest = new CollectionAdminRequest
- .CreateShard();
- createShardRequest.setCollectionName("solrj_implicit");
- createShardRequest.setShardName("shardC");
- response = createShardRequest.process(server);
-
- assertEquals(0, response.getStatus());
- assertTrue(response.isSuccess());
- coresStatus = response.getCollectionCoresStatus();
- assertEquals(1, coresStatus.size());
- assertEquals(0, (int) coresStatus.get("solrj_implicit_shardC_replica1").get("status"));
-
- CollectionAdminRequest.DeleteShard deleteShardRequest = new CollectionAdminRequest
- .DeleteShard();
- deleteShardRequest.setCollectionName("solrj_implicit");
- deleteShardRequest.setShardName("shardC");
- response = deleteShardRequest.process(server);
-
- assertEquals(0, response.getStatus());
- assertTrue(response.isSuccess());
- nodesStatus = response.getCollectionNodesStatus();
- assertEquals(1, nodesStatus.size());
-
- CollectionAdminRequest.Delete deleteCollectionRequest = new CollectionAdminRequest.Delete();
- deleteCollectionRequest.setCollectionName("solrj_implicit");
- response = deleteCollectionRequest.process(server);
-
- assertEquals(0, response.getStatus());
- assertTrue(response.isSuccess());
- nodesStatus = response.getCollectionNodesStatus();
- assertEquals(2, nodesStatus.size());
-
- createCollectionRequest = new CollectionAdminRequest.Create();
- createCollectionRequest.setCollectionName("conf1");
- createCollectionRequest.setNumShards(4);
- createCollectionRequest.setConfigName("conf1");
- response = createCollectionRequest.process(server);
-
- assertEquals(0, response.getStatus());
- assertTrue(response.isSuccess());
-
- CollectionAdminRequest.Reload reloadCollectionRequest = new CollectionAdminRequest.Reload();
- reloadCollectionRequest.setCollectionName("conf1");
- response = reloadCollectionRequest.process(server);
-
- assertEquals(0, response.getStatus());
-
- CollectionAdminRequest.CreateAlias createAliasRequest = new CollectionAdminRequest
- .CreateAlias();
- createAliasRequest.setCollectionName("solrj_alias");
- createAliasRequest.setAliasedCollections("conf1,solrj_collection");
- response = createAliasRequest.process(server);
-
- assertEquals(0, response.getStatus());
-
- CollectionAdminRequest.DeleteAlias deleteAliasRequest = new CollectionAdminRequest.DeleteAlias();
- deleteAliasRequest.setCollectionName("solrj_alias");
- deleteAliasRequest.process(server);
-
- assertEquals(0, response.getStatus());
-
- CollectionAdminRequest.SplitShard splitShardRequest = new CollectionAdminRequest.SplitShard();
- splitShardRequest.setCollectionName("conf1");
- splitShardRequest.setShardName("shard1");
- response = splitShardRequest.process(server);
-
- assertEquals(0, response.getStatus());
- assertTrue(response.isSuccess());
- coresStatus = response.getCollectionCoresStatus();
- assertEquals(0, (int) coresStatus.get("conf1_shard1_0_replica1").get("status"));
- assertEquals(0, (int) coresStatus.get("conf1_shard1_1_replica1").get("status"));
-
- deleteCollectionRequest = new CollectionAdminRequest.Delete();
- deleteCollectionRequest.setCollectionName("conf1");
- response = deleteCollectionRequest.process(server);
-
- assertEquals(0, response.getStatus());
- nodesStatus = response.getCollectionNodesStatus();
- assertTrue(response.isSuccess());
- assertEquals(4, nodesStatus.size());
-
- deleteCollectionRequest = new CollectionAdminRequest.Delete();
- deleteCollectionRequest.setCollectionName("solrj_collection");
- deleteCollectionRequest.process(server);
-
- assertEquals(0, response.getStatus());
- nodesStatus = response.getCollectionNodesStatus();
- assertTrue(response.isSuccess());
- assertEquals(4, nodesStatus.size());
- }
-
-
private void deletePartiallyCreatedCollection() throws Exception {
final String baseUrl = getBaseUrl((HttpSolrServer) clients.get(0));
String collectionName = "halfdeletedcollection";
Added: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/CollectionsAPISolrJTests.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/CollectionsAPISolrJTests.java?rev=1647462&view=auto
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/CollectionsAPISolrJTests.java (added)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/CollectionsAPISolrJTests.java Tue Dec 23 01:30:41 2014
@@ -0,0 +1,218 @@
+package org.apache.solr.cloud;
+
+/*
+ * 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.
+ */
+
+import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.client.solrj.request.CollectionAdminRequest;
+import org.apache.solr.client.solrj.response.CollectionAdminResponse;
+import org.apache.solr.common.cloud.ClusterState;
+import org.apache.solr.common.cloud.Slice;
+import org.apache.solr.common.cloud.ZkStateReader;
+import org.apache.solr.common.util.NamedList;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Map;
+
+@LuceneTestCase.Slow
+public class CollectionsAPISolrJTests extends AbstractFullDistribZkTestBase {
+
+ @Override
+ public void doTest() throws Exception {
+ testCreateAndDeleteCollection();
+ testCreateAndDeleteShard();
+ testReloadCollection();
+ testCreateAndDeleteAlias();
+ testSplitShard();
+ }
+
+ public void tearDown() throws Exception {
+ if (controlClient != null) {
+ controlClient.shutdown();
+ }
+ if (cloudClient != null) {
+ cloudClient.shutdown();
+ }
+ if (controlClientCloud != null) {
+ controlClientCloud.shutdown();
+ }
+ super.tearDown();
+ }
+
+
+ protected void testCreateAndDeleteCollection() throws Exception {
+ String collectionName = "solrj_test";
+ CollectionAdminRequest.Create createCollectionRequest = new CollectionAdminRequest.Create();
+ createCollectionRequest.setCollectionName(collectionName);
+ createCollectionRequest.setNumShards(2);
+ createCollectionRequest.setReplicationFactor(2);
+ createCollectionRequest.setConfigName("conf1");
+ createCollectionRequest.setRouterField("myOwnField");
+ CollectionAdminResponse response = createCollectionRequest.process(cloudClient);
+
+ assertEquals(0, response.getStatus());
+ assertTrue(response.isSuccess());
+ Map<String, NamedList<Integer>> coresStatus = response.getCollectionCoresStatus();
+ assertEquals(4, coresStatus.size());
+ for (int i=0; i<4; i++) {
+ NamedList<Integer> status = coresStatus.get(collectionName + "_shard" + (i/2+1) + "_replica" + (i%2+1));
+ assertEquals(0, (int)status.get("status"));
+ assertTrue(status.get("QTime") > 0);
+ }
+
+ cloudClient.setDefaultCollection(collectionName);
+ CollectionAdminRequest.Delete deleteCollectionRequest = new CollectionAdminRequest.Delete();
+ deleteCollectionRequest.setCollectionName(collectionName);
+ response = deleteCollectionRequest.process(cloudClient);
+
+ assertEquals(0, response.getStatus());
+ assertTrue(response.isSuccess());
+ Map<String,NamedList<Integer>> nodesStatus = response.getCollectionNodesStatus();
+ assertNull("Deleted collection " + collectionName + "still exists",
+ cloudClient.getZkStateReader().getClusterState().getCollectionOrNull(collectionName));
+ assertEquals(4, nodesStatus.size());
+
+ // Test Creating a collection with new stateformat.
+ collectionName = "solrj_newstateformat";
+ createCollectionRequest = new CollectionAdminRequest.Create();
+ createCollectionRequest.setCollectionName(collectionName);
+ createCollectionRequest.setNumShards(2);
+ createCollectionRequest.setConfigName("conf1");
+ createCollectionRequest.setStateFormat(2);
+
+ response = createCollectionRequest.process(cloudClient);
+ assertEquals(0, response.getStatus());
+ assertTrue(response.isSuccess());
+
+ waitForRecoveriesToFinish(collectionName, false);
+ assertTrue("Collection state does not exist",
+ cloudClient.getZkStateReader().getZkClient()
+ .exists(ZkStateReader.getCollectionPath(collectionName), true));
+
+ }
+
+ protected void testCreateAndDeleteShard() throws IOException, SolrServerException {
+ // Create an implicit collection
+ String collectionName = "solrj_implicit";
+ CollectionAdminRequest.Create createCollectionRequest = new CollectionAdminRequest.Create();
+ createCollectionRequest.setCollectionName(collectionName);
+ createCollectionRequest.setShards("shardA,shardB");
+ createCollectionRequest.setConfigName("conf1");
+ createCollectionRequest.setRouterName("implicit");
+ CollectionAdminResponse response = createCollectionRequest.process(cloudClient);
+
+ assertEquals(0, response.getStatus());
+ assertTrue(response.isSuccess());
+ Map<String, NamedList<Integer>> coresStatus = response.getCollectionCoresStatus();
+ assertEquals(2, coresStatus.size());
+
+ cloudClient.setDefaultCollection(collectionName);
+ // Add a shard to the implicit collection
+ CollectionAdminRequest.CreateShard createShardRequest = new CollectionAdminRequest
+ .CreateShard();
+ createShardRequest.setCollectionName(collectionName);
+ createShardRequest.setShardName("shardC");
+ response = createShardRequest.process(cloudClient);
+
+ assertEquals(0, response.getStatus());
+ assertTrue(response.isSuccess());
+ coresStatus = response.getCollectionCoresStatus();
+ assertEquals(1, coresStatus.size());
+ assertEquals(0, (int) coresStatus.get(collectionName + "_shardC_replica1").get("status"));
+
+ CollectionAdminRequest.DeleteShard deleteShardRequest = new CollectionAdminRequest
+ .DeleteShard();
+ deleteShardRequest.setCollectionName(collectionName);
+ deleteShardRequest.setShardName("shardC");
+ response = deleteShardRequest.process(cloudClient);
+
+ assertEquals(0, response.getStatus());
+ assertTrue(response.isSuccess());
+ Map<String, NamedList<Integer>> nodesStatus = response.getCollectionNodesStatus();
+ assertEquals(1, nodesStatus.size());
+ }
+
+ protected void testReloadCollection() throws IOException, SolrServerException {
+ cloudClient.setDefaultCollection(DEFAULT_COLLECTION);
+ CollectionAdminRequest.Reload reloadCollectionRequest = new CollectionAdminRequest.Reload();
+ reloadCollectionRequest.setCollectionName("collection1");
+ CollectionAdminResponse response = reloadCollectionRequest.process(cloudClient);
+
+ assertEquals(0, response.getStatus());
+ }
+
+ protected void testCreateAndDeleteAlias() throws IOException, SolrServerException {
+ CollectionAdminRequest.CreateAlias createAliasRequest = new CollectionAdminRequest
+ .CreateAlias();
+ createAliasRequest.setCollectionName("solrj_alias");
+ createAliasRequest.setAliasedCollections("collection1");
+ CollectionAdminResponse response = createAliasRequest.process(cloudClient);
+
+ assertEquals(0, response.getStatus());
+
+ CollectionAdminRequest.DeleteAlias deleteAliasRequest = new CollectionAdminRequest.DeleteAlias();
+ deleteAliasRequest.setCollectionName("solrj_alias");
+ deleteAliasRequest.process(cloudClient);
+
+ assertEquals(0, response.getStatus());
+ }
+
+ protected void testSplitShard() throws Exception {
+ String collectionName = "solrj_test_splitshard";
+ cloudClient.setDefaultCollection(collectionName);
+
+ CollectionAdminRequest.Create createCollectionRequest = new CollectionAdminRequest.Create();
+ createCollectionRequest.setConfigName("conf1");
+ createCollectionRequest.setNumShards(2);
+ createCollectionRequest.setCollectionName(collectionName);
+ createCollectionRequest.process(cloudClient);
+
+ CollectionAdminRequest.SplitShard splitShardRequest = new CollectionAdminRequest.SplitShard();
+ splitShardRequest.setCollectionName(collectionName);
+ splitShardRequest.setShardName("shard1");
+ CollectionAdminResponse response = splitShardRequest.process(cloudClient);
+
+ assertEquals(0, response.getStatus());
+ assertTrue(response.isSuccess());
+ Map<String, NamedList<Integer>> coresStatus = response.getCollectionCoresStatus();
+ assertEquals(0, (int) coresStatus.get(collectionName + "_shard1_0_replica1").get("status"));
+ assertEquals(0, (int) coresStatus.get(collectionName + "_shard1_1_replica1").get("status"));
+
+ waitForRecoveriesToFinish(collectionName, false);
+ waitForThingsToLevelOut(10);
+
+ // Test splitting using split.key
+ splitShardRequest = new CollectionAdminRequest.SplitShard();
+ splitShardRequest.setCollectionName(collectionName);
+ splitShardRequest.setSplitKey("b!");
+ response = splitShardRequest.process(cloudClient);
+
+ assertEquals(0, response.getStatus());
+ assertTrue(response.isSuccess());
+
+ waitForRecoveriesToFinish(collectionName, false);
+ waitForThingsToLevelOut(10);
+
+ ClusterState clusterState = cloudClient.getZkStateReader().getClusterState();
+ Collection<Slice> slices = clusterState.getActiveSlices(collectionName);
+ assertEquals("ClusterState: "+ clusterState.getActiveSlices(collectionName), 5, slices.size());
+
+ }
+
+}
Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java?rev=1647462&r1=1647461&r2=1647462&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java (original)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java Tue Dec 23 01:30:41 2014
@@ -229,12 +229,21 @@ public class CollectionAdminRequest exte
//a split shard collection request
public static class SplitShard extends CollectionShardAdminRequest {
protected String ranges;
+ protected String splitKey;
private Properties properties;
public void setRanges(String ranges) { this.ranges = ranges; }
public String getRanges() { return ranges; }
+ public void setSplitKey(String splitKey) {
+ this.splitKey = splitKey;
+ }
+
+ public String getSplitKey() {
+ return this.splitKey;
+ }
+
public Properties getProperties() {
return properties;
}
@@ -252,6 +261,9 @@ public class CollectionAdminRequest exte
ModifiableSolrParams params = getCommonParams();
params.set( "ranges", ranges);
+ if(splitKey != null)
+ params.set("split.key", this.splitKey);
+
if(properties != null) {
addProperties(params, properties);
}