From e13b1ce6f14e17025a84d401ae0a88158142ba4e Mon Sep 17 00:00:00 2001 From: Philip Marzullo Date: Mon, 7 Jun 2021 12:32:57 -0400 Subject: [PATCH] 0005017: HTTP timeout is used for both connect and read timeouts; should provide a separate HTTP connect timeout parameter --- .../jumpmind/symmetric/SymmetricPushClient.java | 2 +- .../symmetric/common/ParameterConstants.java | 1 + .../transport/http/HttpOutgoingTransport.java | 13 ++++++++----- .../transport/http/HttpTransportManager.java | 16 ++++++++++------ .../main/resources/symmetric-default.properties | 9 ++++++++- 5 files changed, 28 insertions(+), 13 deletions(-) diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/SymmetricPushClient.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/SymmetricPushClient.java index 5dd6fd449e..c604340cc0 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/SymmetricPushClient.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/SymmetricPushClient.java @@ -49,7 +49,7 @@ public SymmetricPushClient(String nodeId, String securityToken, String syncUrl) public void open() { try { - transport = new HttpOutgoingTransport(new HttpTransportManager(), new URL(buildUrl()), 30000, true, 0, -1, null, + transport = new HttpOutgoingTransport(new HttpTransportManager(), new URL(buildUrl()), 30000, 30000, true, 0, -1, null, null, false, -1, false); writer = new ProtocolDataWriter(nodeId, transport.openWriter(), false); writer.start(batch); diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/common/ParameterConstants.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/common/ParameterConstants.java index 1fba11498e..6d9a328597 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/common/ParameterConstants.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/common/ParameterConstants.java @@ -278,6 +278,7 @@ private ParameterConstants() { public final static String TRANSPORT_HTTP_MANUAL_REDIRECTS_ENABLED = "http.manual.redirects.enabled"; public final static String TRANSPORT_HTTP_TIMEOUT = "http.timeout.ms"; + public final static String TRANSPORT_HTTP_CONNECT_TIMEOUT = "http.connect.timeout.ms"; public final static String TRANSPORT_HTTP_PUSH_STREAM_ENABLED = "http.push.stream.output.enabled"; public final static String TRANSPORT_HTTP_PUSH_STREAM_SIZE = "http.push.stream.output.size"; public final static String TRANSPORT_HTTP_USE_COMPRESSION_CLIENT = "http.compression"; diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/http/HttpOutgoingTransport.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/http/HttpOutgoingTransport.java index 6838505a0a..660e39628b 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/http/HttpOutgoingTransport.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/http/HttpOutgoingTransport.java @@ -68,6 +68,8 @@ public class HttpOutgoingTransport implements IOutgoingWithResponseTransport { private HttpURLConnection connection; private int httpTimeout; + + private int httpConnectTimeout; private boolean useCompression; @@ -87,13 +89,14 @@ public class HttpOutgoingTransport implements IOutgoingWithResponseTransport { private Map requestProperties; - public HttpOutgoingTransport(HttpTransportManager httpTransportManager, URL url, int httpTimeout, boolean useCompression, + public HttpOutgoingTransport(HttpTransportManager httpTransportManager, URL url, int httpTimeout, int httpConnectTimeout, boolean useCompression, int compressionStrategy, int compressionLevel, String nodeId, String securityToken, boolean streamOutputEnabled, int streamOutputSize, boolean fileUpload) { this.httpTransportManager = httpTransportManager; this.url = url; this.httpTimeout = httpTimeout; + this.httpConnectTimeout = httpConnectTimeout; this.useCompression = useCompression; this.compressionLevel = compressionLevel; this.compressionStrategy = compressionStrategy; @@ -104,11 +107,11 @@ public HttpOutgoingTransport(HttpTransportManager httpTransportManager, URL url, this.fileUpload = fileUpload; } - public HttpOutgoingTransport(HttpTransportManager httpTransportManager, URL url, int httpTimeout, boolean useCompression, + public HttpOutgoingTransport(HttpTransportManager httpTransportManager, URL url, int httpTimeout, int httpConnectTimeout, boolean useCompression, int compressionStrategy, int compressionLevel, String nodeId, String securityToken, boolean streamOutputEnabled, int streamOutputSize, boolean fileUpload, Map requestProperties) { - this(httpTransportManager, url, httpTimeout, useCompression, compressionStrategy, compressionLevel, nodeId, securityToken, + this(httpTransportManager, url, httpTimeout, httpConnectTimeout, useCompression, compressionStrategy, compressionLevel, nodeId, securityToken, streamOutputEnabled, streamOutputSize, fileUpload); this.requestProperties = requestProperties; } @@ -201,7 +204,7 @@ private HttpURLConnection requestReservation(String queue) { try { connection = httpTransportManager.openConnection(url, nodeId, securityToken); connection.setUseCaches(false); - connection.setConnectTimeout(httpTimeout); + connection.setConnectTimeout(httpConnectTimeout); connection.setReadTimeout(httpTimeout); connection.setRequestMethod("HEAD"); connection.setRequestProperty(WebConstants.CHANNEL_QUEUE, queue); @@ -223,7 +226,7 @@ public OutputStream openStream() { connection.setDoInput(true); connection.setDoOutput(true); connection.setUseCaches(false); - connection.setConnectTimeout(httpTimeout); + connection.setConnectTimeout(httpConnectTimeout); connection.setReadTimeout(httpTimeout); if (requestProperties != null) { diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/http/HttpTransportManager.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/http/HttpTransportManager.java index 6dc0247272..ebd3bd55ef 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/http/HttpTransportManager.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/http/HttpTransportManager.java @@ -143,7 +143,7 @@ protected int sendMessage(URL url, String nodeId, String securityToken, String d conn.setRequestMethod("POST"); conn.setAllowUserInteraction(false); conn.setDoOutput(true); - conn.setConnectTimeout(getHttpTimeOutInMs()); + conn.setConnectTimeout(getHttpConnectTimeOutInMs()); conn.setReadTimeout(getHttpTimeOutInMs()); try(OutputStream os = conn.getOutputStream()) { writeMessage(os, data); @@ -214,6 +214,10 @@ public boolean isOutputStreamEnabled() { public int getHttpTimeOutInMs() { return engine.getParameterService().getInt(ParameterConstants.TRANSPORT_HTTP_TIMEOUT); } + + public int getHttpConnectTimeOutInMs() { + return engine.getParameterService().getInt(ParameterConstants.TRANSPORT_HTTP_CONNECT_TIMEOUT); + } public boolean isUseCompression(Node targetNode) { // if the node is local, no need to use compression @@ -268,7 +272,7 @@ public IOutgoingWithResponseTransport getPushTransport(Node remote, Node local, String securityToken, Map requestProperties, String registrationUrl) throws IOException { URL url = new URL(buildURL("push", remote, local, securityToken, registrationUrl)); - return new HttpOutgoingTransport(this, url, getHttpTimeOutInMs(), isUseCompression(remote), + return new HttpOutgoingTransport(this, url, getHttpTimeOutInMs(), getHttpConnectTimeOutInMs(), isUseCompression(remote), getCompressionStrategy(), getCompressionLevel(), local.getNodeId(), securityToken, isOutputStreamEnabled(), getOutputStreamSize(), false, requestProperties); } @@ -276,7 +280,7 @@ public IOutgoingWithResponseTransport getPushTransport(Node remote, Node local, public IOutgoingWithResponseTransport getPushTransport(Node remote, Node local, String securityToken, String registrationUrl) throws IOException { URL url = new URL(buildURL("push", remote, local, securityToken, registrationUrl)); - return new HttpOutgoingTransport(this, url, getHttpTimeOutInMs(), isUseCompression(remote), + return new HttpOutgoingTransport(this, url, getHttpTimeOutInMs(), getHttpConnectTimeOutInMs(), isUseCompression(remote), getCompressionStrategy(), getCompressionLevel(), local.getNodeId(), securityToken, isOutputStreamEnabled(), getOutputStreamSize(), false); } @@ -284,7 +288,7 @@ public IOutgoingWithResponseTransport getPushTransport(Node remote, Node local, public IOutgoingWithResponseTransport getFilePushTransport(Node remote, Node local, String securityToken, String registrationUrl) throws IOException { URL url = new URL(buildURL("filesync/push", remote, local, securityToken, registrationUrl)); - return new HttpOutgoingTransport(this, url, getHttpTimeOutInMs(), isUseCompression(remote), + return new HttpOutgoingTransport(this, url, getHttpTimeOutInMs(), getHttpConnectTimeOutInMs(), isUseCompression(remote), getCompressionStrategy(), getCompressionLevel(), local.getNodeId(), securityToken, isOutputStreamEnabled(), getOutputStreamSize(), true); } @@ -308,7 +312,7 @@ public IOutgoingWithResponseTransport getBandwidthPushTransport(Node remote, Nod Map requestProperties, String registrationUrl) throws IOException { URL url = new URL(resolveURL(remote.getSyncUrl(), registrationUrl) + "/" + "bandwidth?direction=push"); - return new HttpOutgoingTransport(this, url, getHttpTimeOutInMs(), isUseCompression(remote), + return new HttpOutgoingTransport(this, url, getHttpTimeOutInMs(), getHttpConnectTimeOutInMs(), isUseCompression(remote), getCompressionStrategy(), getCompressionLevel(), local.getNodeId(), securityToken, isOutputStreamEnabled(), getOutputStreamSize(), false, requestProperties); } @@ -335,7 +339,7 @@ public static String buildRegistrationUrl(String baseUrl, Node node) throws IOEx protected HttpURLConnection createGetConnectionFor(URL url, String nodeId, String securityToken) throws IOException { HttpURLConnection conn = openConnection(url, nodeId, securityToken); conn.setRequestProperty("accept-encoding", "gzip"); - conn.setConnectTimeout(getHttpTimeOutInMs()); + conn.setConnectTimeout(getHttpConnectTimeOutInMs()); conn.setReadTimeout(getHttpTimeOutInMs()); conn.setRequestMethod("GET"); return conn; diff --git a/symmetric-core/src/main/resources/symmetric-default.properties b/symmetric-core/src/main/resources/symmetric-default.properties index 042307ec3f..2c5fd5d162 100644 --- a/symmetric-core/src/main/resources/symmetric-default.properties +++ b/symmetric-core/src/main/resources/symmetric-default.properties @@ -329,13 +329,20 @@ send.ack.keepalive.ms=30000 # Type: integer time.between.ack.retries.ms=5000 -# Sets both the connection and read timeout on the internal HttpUrlConnection +# Sets the read timeout on the internal HttpUrlConnection # # DatabaseOverridable: true # Tags: transport # Type: integer http.timeout.ms=90000 +# Sets the connection timeout on the internal HttpUrlConnection +# +# DatabaseOverridable: true +# Tags: transport +# Type: integer +http.connect.timeout.ms=90000 + # Whether or not to use compression over HTTP connections. # Currently, this setting only affects the push connection of the source node. # Compression on a pull is enabled using a filter in the web.xml for the PullServlet.