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);
       }