diff --git a/presto-cli/src/main/java/com/facebook/presto/cli/QueryRunner.java b/presto-cli/src/main/java/com/facebook/presto/cli/QueryRunner.java index d32732b9f2ef4..be936d861d79e 100644 --- a/presto-cli/src/main/java/com/facebook/presto/cli/QueryRunner.java +++ b/presto-cli/src/main/java/com/facebook/presto/cli/QueryRunner.java @@ -14,7 +14,6 @@ package com.facebook.presto.cli; import com.facebook.presto.client.ClientSession; -import com.facebook.presto.client.SocketChannelSocketFactory; import com.facebook.presto.client.StatementClient; import com.google.common.net.HostAndPort; import okhttp3.OkHttpClient; @@ -29,6 +28,7 @@ import static com.facebook.presto.client.GCSOAuthInterceptor.GCS_CREDENTIALS_PATH_KEY; import static com.facebook.presto.client.GCSOAuthInterceptor.GCS_OAUTH_SCOPES_KEY; import static com.facebook.presto.client.OkHttpUtil.basicAuth; +import static com.facebook.presto.client.OkHttpUtil.forceHttp11OnJava11OrLater; import static com.facebook.presto.client.OkHttpUtil.setupCookieJar; import static com.facebook.presto.client.OkHttpUtil.setupGCSOauth; import static com.facebook.presto.client.OkHttpUtil.setupHttpProxy; @@ -76,7 +76,8 @@ public QueryRunner( OkHttpClient.Builder builder = new OkHttpClient.Builder(); - builder.socketFactory(new SocketChannelSocketFactory()); + // Avoids threads hanging using http2 on java 11 or later + forceHttp11OnJava11OrLater(builder); setupTimeouts(builder, 30, SECONDS); setupCookieJar(builder); diff --git a/presto-client/src/main/java/com/facebook/presto/client/OkHttpUtil.java b/presto-client/src/main/java/com/facebook/presto/client/OkHttpUtil.java index 0fc557bae18bf..043bc01bcaa72 100644 --- a/presto-client/src/main/java/com/facebook/presto/client/OkHttpUtil.java +++ b/presto-client/src/main/java/com/facebook/presto/client/OkHttpUtil.java @@ -15,6 +15,7 @@ import com.facebook.airlift.security.pem.PemReader; import com.google.common.base.CharMatcher; +import com.google.common.base.StandardSystemProperty; import com.google.common.net.HostAndPort; import okhttp3.Call; import okhttp3.Callback; @@ -22,6 +23,7 @@ import okhttp3.Interceptor; import okhttp3.JavaNetCookieJar; import okhttp3.OkHttpClient; +import okhttp3.Protocol; import okhttp3.Response; import javax.net.ssl.KeyManager; @@ -46,6 +48,7 @@ import java.security.cert.CertificateNotYetValidException; import java.security.cert.X509Certificate; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.concurrent.TimeUnit; @@ -277,4 +280,25 @@ public static void setupGCSOauth(OkHttpClient.Builder clientBuilder, String cred GCSOAuthInterceptor handler = new GCSOAuthInterceptor(credentialPath, gcsOAuthScopesString); clientBuilder.addInterceptor(handler); } + + public static void forceHttp11OnJava11OrLater(OkHttpClient.Builder builder) + { + if (isJava11OrLater()) { + builder.protocols(Collections.singletonList(Protocol.HTTP_1_1)); + } + } + + private static boolean isJava11OrLater() + { + try { + String javaVersion = StandardSystemProperty.JAVA_VERSION.value(); + if (javaVersion == null) { + return false; + } + return Integer.parseInt(javaVersion.split("\\.")[0]) >= 11; + } + catch (NumberFormatException e) { + return false; + } + } } diff --git a/presto-jdbc/src/main/java/com/facebook/presto/jdbc/PrestoDriver.java b/presto-jdbc/src/main/java/com/facebook/presto/jdbc/PrestoDriver.java index a8b7fcdbbccda..ffdd93d911d0b 100644 --- a/presto-jdbc/src/main/java/com/facebook/presto/jdbc/PrestoDriver.java +++ b/presto-jdbc/src/main/java/com/facebook/presto/jdbc/PrestoDriver.java @@ -28,6 +28,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import static com.facebook.presto.client.OkHttpUtil.forceHttp11OnJava11OrLater; import static com.facebook.presto.client.OkHttpUtil.userAgent; import static com.google.common.base.Strings.nullToEmpty; import static java.lang.Integer.parseInt; @@ -42,10 +43,7 @@ public class PrestoDriver private static final String DRIVER_URL_START = "jdbc:presto:"; - private final OkHttpClient httpClient = new OkHttpClient.Builder() - .addInterceptor(userAgent(DRIVER_NAME + "/" + DRIVER_VERSION)) - .socketFactory(new SocketChannelSocketFactory()) - .build(); + private final OkHttpClient httpClient = buildHttpClient(); static { String version = nullToEmpty(PrestoDriver.class.getPackage().getImplementationVersion()); @@ -137,4 +135,14 @@ public Logger getParentLogger() // TODO: support java.util.Logging throw new SQLFeatureNotSupportedException(); } + + private static OkHttpClient buildHttpClient() + { + OkHttpClient.Builder builder = new OkHttpClient.Builder() + .addInterceptor(userAgent(DRIVER_NAME + '/' + DRIVER_VERSION)) + .socketFactory(new SocketChannelSocketFactory()); + // Avoids threads hanging using http2 on java 11 or later + forceHttp11OnJava11OrLater(builder); + return builder.build(); + } }