diff --git a/core/src/main/java/com/linecorp/armeria/internal/common/util/ChannelUtil.java b/core/src/main/java/com/linecorp/armeria/internal/common/util/ChannelUtil.java index 657a815a42f..36f225d8fcf 100644 --- a/core/src/main/java/com/linecorp/armeria/internal/common/util/ChannelUtil.java +++ b/core/src/main/java/com/linecorp/armeria/internal/common/util/ChannelUtil.java @@ -33,6 +33,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; +import com.google.common.math.LongMath; import com.google.common.primitives.Ints; import com.linecorp.armeria.common.Flags; @@ -234,7 +235,8 @@ static Map, Object> applyDefaultChannelOptions( if (idleTimeoutMillis > 0) { final int tcpUserTimeoutMillis = - Ints.saturatedCast(idleTimeoutMillis + TCP_USER_TIMEOUT_BUFFER_MILLIS); + Ints.saturatedCast(LongMath.saturatedAdd(idleTimeoutMillis, + TCP_USER_TIMEOUT_BUFFER_MILLIS)); if (transportType == TransportType.EPOLL && canAddChannelOption(epollTcpUserTimeout, channelOptions)) { assert epollTcpUserTimeout != null; diff --git a/core/src/test/java/com/linecorp/armeria/internal/common/util/ChannelUtilTest.java b/core/src/test/java/com/linecorp/armeria/internal/common/util/ChannelUtilTest.java index ee09b84b89d..6bf0a366e24 100644 --- a/core/src/test/java/com/linecorp/armeria/internal/common/util/ChannelUtilTest.java +++ b/core/src/test/java/com/linecorp/armeria/internal/common/util/ChannelUtilTest.java @@ -107,6 +107,18 @@ void tcpUserTimeoutDefaultApplied(TransportType transportType, ChannelOption assertThat(newOptions).containsExactlyInAnyOrderEntriesOf(userDefinedOptions); } + @ParameterizedTest + @MethodSource("tcpUserTimeout_arguments") + void tcpUserTimeoutWithMaxIdleTimeout(TransportType transportType, ChannelOption option) { + final Map, Object> options = ImmutableMap.of( + ChannelOption.SO_LINGER, 1000); + + final Map, Object> newOptions = + ChannelUtil.applyDefaultChannelOptions( + true, transportType, options, Long.MAX_VALUE); + assertThat(newOptions).containsEntry(option, Integer.MAX_VALUE); + } + @Test void tcpUserTimeoutUnsupportedTransport() { final Map, Object> options = ImmutableMap.of(