Skip to content

Commit a4c7bb4

Browse files
eckardnetEckard Mühlich
andauthored
Enable TCP keep alive for CRT HTTP client if configured (#5052)
* enable keep alive if configured * Added test. * Added changelog. --------- Co-authored-by: Eckard Mühlich <[email protected]>
1 parent 61e555b commit a4c7bb4

File tree

3 files changed

+55
-0
lines changed

3 files changed

+55
-0
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"type": "bugfix",
3+
"category": "AWS SDK for Java v2",
4+
"contributor": "eckardnet",
5+
"description": "Set keepAile in SocketOptions to true if TcpKeepAliveConfiguration is set."
6+
}

http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/AwsCrtConfigurationUtils.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public static SocketOptions buildSocketOptions(TcpKeepAliveConfiguration tcpKeep
4141
}
4242

4343
if (tcpKeepAliveConfiguration != null) {
44+
clientSocketOptions.keepAlive = true;
4445
clientSocketOptions.keepAliveIntervalSecs =
4546
NumericUtils.saturatedCast(tcpKeepAliveConfiguration.keepAliveInterval().getSeconds());
4647
clientSocketOptions.keepAliveTimeoutSecs =

http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/internal/AwsCrtConfigurationUtilsTest.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,16 @@
1919
import static software.amazon.awssdk.crt.io.TlsCipherPreference.TLS_CIPHER_PREF_PQ_TLSv1_0_2021_05;
2020
import static software.amazon.awssdk.crt.io.TlsCipherPreference.TLS_CIPHER_SYSTEM_DEFAULT;
2121

22+
import java.time.Duration;
2223
import java.util.stream.Stream;
2324
import org.junit.jupiter.api.Assumptions;
2425
import org.junit.jupiter.api.Test;
2526
import org.junit.jupiter.params.ParameterizedTest;
2627
import org.junit.jupiter.params.provider.Arguments;
2728
import org.junit.jupiter.params.provider.MethodSource;
29+
import software.amazon.awssdk.crt.io.SocketOptions;
2830
import software.amazon.awssdk.crt.io.TlsCipherPreference;
31+
import software.amazon.awssdk.http.crt.TcpKeepAliveConfiguration;
2932

3033
class AwsCrtConfigurationUtilsTest {
3134

@@ -51,4 +54,49 @@ private static Stream<Arguments> cipherPreferences() {
5154
);
5255
}
5356

57+
@ParameterizedTest
58+
@MethodSource("tcpKeepAliveConfiguration")
59+
void tcpKeepAliveConfiguration(TcpKeepAliveConfiguration tcpKeepAliveConfiguration, Duration connectionTimeout, SocketOptions expected) {
60+
assertThat(AwsCrtConfigurationUtils.buildSocketOptions(tcpKeepAliveConfiguration, connectionTimeout))
61+
.satisfies(socketOptions -> {
62+
assertThat(socketOptions.connectTimeoutMs).isEqualTo(expected.connectTimeoutMs);
63+
assertThat(socketOptions.keepAlive).isEqualTo(expected.keepAlive);
64+
assertThat(socketOptions.keepAliveIntervalSecs).isEqualTo(expected.keepAliveIntervalSecs);
65+
assertThat(socketOptions.keepAliveTimeoutSecs).isEqualTo(expected.keepAliveTimeoutSecs);
66+
});
67+
}
68+
69+
private static Stream<Arguments> tcpKeepAliveConfiguration() {
70+
Duration duration1Minute = Duration.ofMinutes(1);
71+
72+
SocketOptions expectedConnectTimeOutOnly = new SocketOptions();
73+
expectedConnectTimeOutOnly.connectTimeoutMs = (int) duration1Minute.toMillis();
74+
75+
SocketOptions expectedKeepAliveOnly = new SocketOptions();
76+
expectedKeepAliveOnly.keepAlive = true;
77+
expectedKeepAliveOnly.keepAliveIntervalSecs = (int)duration1Minute.getSeconds();
78+
expectedKeepAliveOnly.keepAliveTimeoutSecs = (int)duration1Minute.getSeconds();
79+
80+
SocketOptions expectedAll = new SocketOptions();
81+
expectedAll.connectTimeoutMs = (int) duration1Minute.toMillis();
82+
expectedAll.keepAlive = true;
83+
expectedAll.keepAliveIntervalSecs = (int)duration1Minute.getSeconds();
84+
expectedAll.keepAliveTimeoutSecs = (int)duration1Minute.getSeconds();
85+
86+
return Stream.of(
87+
Arguments.of(null, null, new SocketOptions()),
88+
Arguments.of(null, duration1Minute, expectedConnectTimeOutOnly),
89+
Arguments.of(
90+
TcpKeepAliveConfiguration.builder().keepAliveInterval(duration1Minute).keepAliveTimeout(duration1Minute).build(),
91+
null,
92+
expectedKeepAliveOnly
93+
),
94+
Arguments.of(
95+
TcpKeepAliveConfiguration.builder().keepAliveInterval(duration1Minute).keepAliveTimeout(duration1Minute).build(),
96+
duration1Minute,
97+
expectedAll
98+
)
99+
);
100+
}
101+
54102
}

0 commit comments

Comments
 (0)