You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by da...@apache.org on 2018/09/10 08:15:13 UTC

lucene-solr:jira/http2: SOLR-12641: Support rolling updates when jira/http2 get merged

Repository: lucene-solr
Updated Branches:
  refs/heads/jira/http2 b26c6fda6 -> afe88fb8b


SOLR-12641: Support rolling updates when jira/http2 get merged


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/afe88fb8
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/afe88fb8
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/afe88fb8

Branch: refs/heads/jira/http2
Commit: afe88fb8b85eebc42b02c8bdd8fd54e70907d1e2
Parents: b26c6fd
Author: Cao Manh Dat <da...@apache.org>
Authored: Mon Sep 10 15:14:55 2018 +0700
Committer: Cao Manh Dat <da...@apache.org>
Committed: Mon Sep 10 15:14:55 2018 +0700

----------------------------------------------------------------------
 .../solr/client/solrj/embedded/JettyConfig.java |  13 ++-
 .../client/solrj/embedded/JettySolrRunner.java  |   8 +-
 .../solr/client/solrj/impl/Http2SolrClient.java |   4 +-
 .../impl/Http2SolrClientCompatibilityTest.java  | 107 +++++++++++++++++++
 4 files changed, 127 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/afe88fb8/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettyConfig.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettyConfig.java b/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettyConfig.java
index 28c3cdf..c177126 100644
--- a/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettyConfig.java
+++ b/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettyConfig.java
@@ -25,6 +25,8 @@ import java.util.TreeMap;
 
 public class JettyConfig {
 
+  public final boolean useOnlyHttp1;
+
   public final int port;
 
   public final String context;
@@ -39,8 +41,9 @@ public class JettyConfig {
 
   public final SSLConfig sslConfig;
 
-  private JettyConfig(int port, String context, boolean stopAtShutdown, Long waitForLoadingCoresToFinishMs, Map<ServletHolder, String> extraServlets,
+  private JettyConfig(boolean useOnlyHttp1, int port, String context, boolean stopAtShutdown, Long waitForLoadingCoresToFinishMs, Map<ServletHolder, String> extraServlets,
                       Map<Class<? extends Filter>, String> extraFilters, SSLConfig sslConfig) {
+    this.useOnlyHttp1 = useOnlyHttp1;
     this.port = port;
     this.context = context;
     this.stopAtShutdown = stopAtShutdown;
@@ -67,6 +70,7 @@ public class JettyConfig {
 
   public static class Builder {
 
+    boolean useOnlyHttp1 = false;
     int port = 0;
     String context = "/solr";
     boolean stopAtShutdown = true;
@@ -75,6 +79,11 @@ public class JettyConfig {
     Map<Class<? extends Filter>, String> extraFilters = new LinkedHashMap<>();
     SSLConfig sslConfig = null;
 
+    public Builder useOnlyHttp1(boolean useOnlyHttp1) {
+      this.useOnlyHttp1 = useOnlyHttp1;
+      return this;
+    }
+
     public Builder setPort(int port) {
       this.port = port;
       return this;
@@ -123,7 +132,7 @@ public class JettyConfig {
     }
 
     public JettyConfig build() {
-      return new JettyConfig(port, context, stopAtShutdown, waitForLoadingCoresToFinishMs, extraServlets, extraFilters, sslConfig);
+      return new JettyConfig(useOnlyHttp1, port, context, stopAtShutdown, waitForLoadingCoresToFinishMs, extraServlets, extraFilters, sslConfig);
     }
 
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/afe88fb8/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettySolrRunner.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettySolrRunner.java b/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettySolrRunner.java
index 84469cd..55eb60b 100644
--- a/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettySolrRunner.java
+++ b/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettySolrRunner.java
@@ -239,8 +239,12 @@ public class JettySolrRunner {
         connector = new ServerConnector(server, new SslConnectionFactory(sslcontext, "http/1.1"),
             new HttpConnectionFactory(configuration));
       } else {
-        connector = new ServerConnector(server, new HttpConnectionFactory(configuration),
-            new HTTP2CServerConnectionFactory(configuration));
+        if (config.useOnlyHttp1) {
+          connector = new ServerConnector(server, new HttpConnectionFactory(configuration));
+        } else {
+          connector = new ServerConnector(server, new HttpConnectionFactory(configuration),
+              new HTTP2CServerConnectionFactory(configuration));
+        }
       }
 
       connector.setReuseAddress(true);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/afe88fb8/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java
index e358aa9..57a0dd7 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java
@@ -198,6 +198,7 @@ public class Http2SolrClient extends SolrClient {
 
     HttpClientTransport transport;
     if (builder.useHttp1_1 || builder.sslConfig != null) {
+      LOG.info("Create Http2SolrClient with HTTP/1.1 transport");
       transport = new HttpClientTransportOverHTTP(2);
 
       SslContextFactory sslContextFactory;
@@ -208,6 +209,7 @@ public class Http2SolrClient extends SolrClient {
       }
       httpClient = new HttpClient(transport, sslContextFactory);
     } else {
+      LOG.info("Create Http2SolrClient with HTTP/2 transport");
       //TODO adding https support for HTTP2 when use JDK 9
       HTTP2Client http2client = new HTTP2Client();
       transport = new HttpClientTransportOverHTTP2(http2client);
@@ -655,7 +657,7 @@ public class Http2SolrClient extends SolrClient {
     private SSLConfig sslConfig = defaultSSLConfig;
     private Integer idleTimeout;
     private Integer connectionTimeout;
-    private boolean useHttp1_1 = false;
+    private boolean useHttp1_1 = Boolean.getBoolean("solr.http1");
     protected String baseSolrUrl;
     private Request.BeginListener beginListener = request -> {};
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/afe88fb8/solr/solrj/src/test/org/apache/solr/client/solrj/impl/Http2SolrClientCompatibilityTest.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/Http2SolrClientCompatibilityTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/Http2SolrClientCompatibilityTest.java
new file mode 100644
index 0000000..b5df28a
--- /dev/null
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/Http2SolrClientCompatibilityTest.java
@@ -0,0 +1,107 @@
+/*
+ * 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.
+ */
+
+package org.apache.solr.client.solrj.impl;
+
+import org.apache.http.ParseException;
+import org.apache.solr.SolrJettyTestBase;
+import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.client.solrj.SolrQuery;
+import org.apache.solr.client.solrj.SolrRequest;
+import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.client.solrj.embedded.JettyConfig;
+import org.eclipse.jetty.client.http.HttpClientTransportOverHTTP;
+import org.eclipse.jetty.http2.client.http.HttpClientTransportOverHTTP2;
+import org.eclipse.jetty.servlet.ServletHolder;
+
+@SolrTestCaseJ4.SuppressSSL
+public class Http2SolrClientCompatibilityTest extends SolrJettyTestBase {
+
+  public void testSystemPropertyFlag() {
+    System.setProperty("solr.http1", "true");
+    try (Http2SolrClient client = new Http2SolrClient.Builder("")
+        .build()) {
+      assertTrue(client.getHttpClient().getTransport() instanceof HttpClientTransportOverHTTP);
+    }
+    System.clearProperty("solr.http1");
+    try (Http2SolrClient client = new Http2SolrClient.Builder("")
+        .build()) {
+      assertTrue(client.getHttpClient().getTransport() instanceof HttpClientTransportOverHTTP2);
+    }
+  }
+
+  public void testConnectToOldNodesUsingHttp1() throws Exception {
+
+    JettyConfig jettyConfig = JettyConfig.builder()
+        .withServlet(new ServletHolder(Http2SolrClientTest.DebugServlet.class), "/debug/*")
+        .useOnlyHttp1(true)
+        .build();
+    createJetty(legacyExampleCollection1SolrHome(), jettyConfig);
+
+    try (Http2SolrClient client = new Http2SolrClient.Builder(jetty.getBaseUrl().toString() + "/debug/foo")
+        .useHttp1_1(true)
+        .build()) {
+      assertTrue(client.getHttpClient().getTransport() instanceof HttpClientTransportOverHTTP);
+      try {
+        client.query(new SolrQuery("*:*"), SolrRequest.METHOD.GET);
+      } catch (ParseException ignored) {}
+    }
+    afterSolrJettyTestBase();
+  }
+
+  public void testConnectToNewNodesUsingHttp1() throws Exception {
+
+    JettyConfig jettyConfig = JettyConfig.builder()
+        .withServlet(new ServletHolder(Http2SolrClientTest.DebugServlet.class), "/debug/*")
+        .useOnlyHttp1(false)
+        .build();
+    createJetty(legacyExampleCollection1SolrHome(), jettyConfig);
+
+    try (Http2SolrClient client = new Http2SolrClient.Builder(jetty.getBaseUrl().toString() + "/debug/foo")
+        .useHttp1_1(true)
+        .build()) {
+      assertTrue(client.getHttpClient().getTransport() instanceof HttpClientTransportOverHTTP);
+      try {
+        client.query(new SolrQuery("*:*"), SolrRequest.METHOD.GET);
+      } catch (ParseException ignored) {}
+    }
+    afterSolrJettyTestBase();
+  }
+
+  public void testConnectToOldNodesUsingHttp2() throws Exception {
+    // if this test some how failure, this mean that Jetty client now be able to switch between HTTP/1
+    // and HTTP/2.2 protocol dynamically therefore rolling updates will be easier we should then notify this to users
+    JettyConfig jettyConfig = JettyConfig.builder()
+        .withServlet(new ServletHolder(Http2SolrClientTest.DebugServlet.class), "/debug/*")
+        .useOnlyHttp1(true)
+        .build();
+    createJetty(legacyExampleCollection1SolrHome(), jettyConfig);
+    try (Http2SolrClient client = new Http2SolrClient.Builder(jetty.getBaseUrl().toString() + "/debug/foo")
+        .build()) {
+      assertTrue(client.getHttpClient().getTransport() instanceof HttpClientTransportOverHTTP2);
+      try {
+        client.query(new SolrQuery("*:*"), SolrRequest.METHOD.GET);
+        fail("Jetty client with HTTP2 transport should not be able to connect to HTTP1 only nodes");
+      } catch (ParseException ignored) {
+        fail("Jetty client with HTTP2 transport should not be able to connect to HTTP1 only nodes");
+      } catch (SolrServerException e) {
+        // expected
+      }
+    }
+    afterSolrJettyTestBase();
+  }
+}