You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ma...@apache.org on 2014/03/17 23:26:49 UTC

svn commit: r1578635 - in /lucene/dev/trunk/solr/core/src: java/org/apache/solr/cloud/Overseer.java java/org/apache/solr/cloud/OverseerCollectionProcessor.java test/org/apache/solr/cloud/SSLMigrationTest.java

Author: markrmiller
Date: Mon Mar 17 22:26:49 2014
New Revision: 1578635

URL: http://svn.apache.org/r1578635
Log:
SOLR-5770: Further fixes and SSL migration test.

Added:
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/SSLMigrationTest.java   (with props)
Modified:
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/Overseer.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/Overseer.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/Overseer.java?rev=1578635&r1=1578634&r2=1578635&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/Overseer.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/Overseer.java Mon Mar 17 22:26:49 2014
@@ -783,13 +783,13 @@ public class Overseer {
         if (slices != null) {
           for (Slice slice : slices) {
             for (Replica replica : slice.getReplicas()) {
-              String baseUrl = replica.getStr(ZkStateReader.BASE_URL_PROP);
+              String nodeName = replica.getStr(ZkStateReader.NODE_NAME_PROP);
               String core = replica.getStr(ZkStateReader.CORE_NAME_PROP);
               
-              String msgBaseUrl = message.getStr(ZkStateReader.BASE_URL_PROP);
+              String msgNodeName = message.getStr(ZkStateReader.NODE_NAME_PROP);
               String msgCore = message.getStr(ZkStateReader.CORE_NAME_PROP);
               
-              if (baseUrl.equals(msgBaseUrl) && core.equals(msgCore)) {
+              if (nodeName.equals(msgNodeName) && core.equals(msgCore)) {
                 return replica.getName();
               }
             }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java?rev=1578635&r1=1578634&r2=1578635&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java Mon Mar 17 22:26:49 2014
@@ -1009,7 +1009,7 @@ public class OverseerCollectionProcessor
       for (String subShardName : subShardNames) {
         // wait for parent leader to acknowledge the sub-shard core
         log.info("Asking parent leader to wait for: " + subShardName + " to be alive on: " + nodeName);
-        String coreNodeName = waitForCoreNodeName(collection, zkStateReader.getBaseUrlForNodeName(nodeName), subShardName);
+        String coreNodeName = waitForCoreNodeName(collection, nodeName, subShardName);
         CoreAdminRequest.WaitForState cmd = new CoreAdminRequest.WaitForState();
         cmd.setCoreName(subShardName);
         cmd.setNodeName(nodeName);
@@ -1137,7 +1137,7 @@ public class OverseerCollectionProcessor
 
           sendShardRequest(subShardNodeName, params);
 
-          String coreNodeName = waitForCoreNodeName(collection, zkStateReader.getBaseUrlForNodeName(subShardNodeName), shardName);
+          String coreNodeName = waitForCoreNodeName(collection, subShardNodeName, shardName);
           // wait for the replicas to be seen as active on sub shard leader
           log.info("Asking sub shard leader to wait for: " + shardName + " to be alive on: " + subShardNodeName);
           CoreAdminRequest.WaitForState cmd = new CoreAdminRequest.WaitForState();
@@ -1232,7 +1232,7 @@ public class OverseerCollectionProcessor
     }
   }
   
-  private String waitForCoreNodeName(DocCollection collection, String msgBaseUrl, String msgCore) {
+  private String waitForCoreNodeName(DocCollection collection, String msgNodeName, String msgCore) {
     int retryCount = 320;
     while (retryCount-- > 0) {
       Map<String,Slice> slicesMap = zkStateReader.getClusterState()
@@ -1243,10 +1243,10 @@ public class OverseerCollectionProcessor
           for (Replica replica : slice.getReplicas()) {
             // TODO: for really large clusters, we could 'index' on this
             
-            String baseUrl = replica.getStr(ZkStateReader.BASE_URL_PROP);
+            String nodeName = replica.getStr(ZkStateReader.NODE_NAME_PROP);
             String core = replica.getStr(ZkStateReader.CORE_NAME_PROP);
             
-            if (baseUrl.equals(msgBaseUrl) && core.equals(msgCore)) {
+            if (nodeName.equals(msgNodeName) && core.equals(msgCore)) {
               return replica.getName();
             }
           }
@@ -1530,7 +1530,7 @@ public class OverseerCollectionProcessor
 
     String tempCollectionReplica1 = tempSourceCollectionName + "_" + tempSourceSlice.getName() + "_replica1";
     String coreNodeName = waitForCoreNodeName(clusterState.getCollection(tempSourceCollectionName),
-        zkStateReader.getBaseUrlForNodeName(sourceLeader.getNodeName()), tempCollectionReplica1);
+        sourceLeader.getNodeName(), tempCollectionReplica1);
     // wait for the replicas to be seen as active on temp source leader
     log.info("Asking source leader to wait for: " + tempCollectionReplica1 + " to be alive on: " + sourceLeader.getNodeName());
     CoreAdminRequest.WaitForState cmd = new CoreAdminRequest.WaitForState();
@@ -1578,7 +1578,7 @@ public class OverseerCollectionProcessor
     completeAsyncRequest(asyncId, requestMap, results);
 
     coreNodeName = waitForCoreNodeName(clusterState.getCollection(tempSourceCollectionName),
-        zkStateReader.getBaseUrlForNodeName(targetLeader.getNodeName()), tempCollectionReplica2);
+        targetLeader.getNodeName(), tempCollectionReplica2);
     // wait for the replicas to be seen as active on temp source leader
     log.info("Asking temp source leader to wait for: " + tempCollectionReplica2 + " to be alive on: " + targetLeader.getNodeName());
     cmd = new CoreAdminRequest.WaitForState();

Added: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/SSLMigrationTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/SSLMigrationTest.java?rev=1578635&view=auto
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/SSLMigrationTest.java (added)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/SSLMigrationTest.java Mon Mar 17 22:26:49 2014
@@ -0,0 +1,119 @@
+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 static org.apache.solr.common.cloud.ZkNodeProps.makeMap;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.solr.client.solrj.SolrRequest;
+import org.apache.solr.client.solrj.embedded.JettySolrRunner;
+import org.apache.solr.client.solrj.impl.HttpClientUtil;
+import org.apache.solr.client.solrj.impl.LBHttpSolrServer;
+import org.apache.solr.client.solrj.request.QueryRequest;
+import org.apache.solr.common.cloud.DocCollection;
+import org.apache.solr.common.cloud.Replica;
+import org.apache.solr.common.cloud.Slice;
+import org.apache.solr.common.cloud.ZkStateReader;
+import org.apache.solr.common.params.CollectionParams.CollectionAction;
+import org.apache.solr.common.params.MapSolrParams;
+import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.util.SSLTestConfig;
+import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
+import org.apache.lucene.util.LuceneTestCase.Slow;
+
+/**
+ * We want to make sure that when migrating between http and https modes the
+ * replicas will not be rejoined as new nodes, but rather take off where it left
+ * off in the cluster.
+ */
+@Slow
+@SuppressSSL
+public class SSLMigrationTest extends AbstractFullDistribZkTestBase {
+  
+  @Override
+  public void doTest() throws Exception {
+    //Migrate from HTTP -> HTTPS -> HTTP
+    assertReplicaInformation("http");
+    testMigrateSSL(new SSLTestConfig(true, false));
+    testMigrateSSL(new SSLTestConfig(false, false));
+  }
+  
+  public void testMigrateSSL(SSLTestConfig sslConfig) throws Exception {
+    String urlScheme = sslConfig.isSSLMode() ? "https" : "http";
+    setUrlScheme(urlScheme);
+    
+    for(JettySolrRunner runner : jettys) {
+      runner.stop();
+    }
+    
+    HttpClientUtil.setConfigurer(sslConfig.getHttpClientConfigurer());
+    for(int i = 0; i < this.jettys.size(); i++) {
+      JettySolrRunner runner = jettys.get(i);
+      JettySolrRunner newRunner = new JettySolrRunner(runner.getSolrHome(), 
+          context, runner.getLocalPort(), getSolrConfigFile(), getSchemaFile(), 
+          false, getExtraServlets(), sslConfig, getExtraRequestFilters());
+      newRunner.setDataDir(getDataDir(testDir + "/shard" + i + "/data"));
+      newRunner.start(true);
+      jettys.set(i, newRunner);
+    }
+    
+    assertReplicaInformation(urlScheme);
+  }
+  
+  private void assertReplicaInformation(String urlScheme) throws Exception {
+    List<Replica> replicas = getReplicas();
+    assertEquals("Wrong number of replicas found", 4, replicas.size());
+    for(Replica replica : replicas) {
+      assertTrue("Replica didn't have the proper urlScheme in the ClusterState",
+          StringUtils.startsWith(replica.getStr(ZkStateReader.BASE_URL_PROP), urlScheme));
+    }
+  }
+  
+  private List<Replica> getReplicas() {
+    List<Replica> replicas = new ArrayList<Replica>();
+    
+    DocCollection collection = this.cloudClient.getZkStateReader().getClusterState().getCollection(DEFAULT_COLLECTION);
+    for(Slice slice : collection.getSlices()) {
+      replicas.addAll(slice.getReplicas());
+    }
+    return replicas;
+  }
+  
+  private void setUrlScheme(String value) throws Exception {
+    @SuppressWarnings("rawtypes")
+    Map m = makeMap("action", CollectionAction.CLUSTERPROP.toString()
+        .toLowerCase(Locale.ROOT), "name", "urlScheme", "val", value);
+    @SuppressWarnings("unchecked")
+    SolrParams params = new MapSolrParams(m);
+    SolrRequest request = new QueryRequest(params);
+    request.setPath("/admin/collections");
+    
+    List<String> urls = new ArrayList<String>();
+    for(Replica replica : getReplicas()) {
+      urls.add(replica.getStr(ZkStateReader.BASE_URL_PROP));
+    }
+    //Create new SolrServer to configure new HttpClient w/ SSL config
+    new LBHttpSolrServer(urls.toArray(new String[]{})).request(request);
+  }
+  
+}
\ No newline at end of file