tomaswolf commented on code in PR #507: URL: https://github.com/apache/mina-sshd/pull/507#discussion_r1617834119
########## sshd-core/src/main/java/org/apache/sshd/core/CoreModuleProperties.java: ########## @@ -162,10 +162,21 @@ public final class CoreModuleProperties { /** * Key used to indicate that the heartbeat request is also expecting a reply - time in <U>milliseconds</U> to wait * for the reply. If non-positive then no reply is expected (nor requested). + * + * @deprecated since 2.13.0, use {@link #HEARTBEAT_NO_REPLY_MAX} instead */ + @Deprecated Review Comment: The since property does not exist in Java 8. It was introduced in Java 9. ########## sshd-core/src/main/java/org/apache/sshd/client/session/ClientConnectionService.java: ########## @@ -55,7 +61,40 @@ public ClientConnectionService(AbstractClientSession s) throws SshException { heartbeatRequest = CoreModuleProperties.HEARTBEAT_REQUEST.getRequired(this); heartbeatInterval = CoreModuleProperties.HEARTBEAT_INTERVAL.getRequired(this); - heartbeatReplyMaxWait = CoreModuleProperties.HEARTBEAT_REPLY_WAIT.getRequired(this); + heartbeatMaxNoReply = configureMaxNoReply(); + } + + protected int configureMaxNoReply() { + @SuppressWarnings("deprecation") + Duration timeout = CoreModuleProperties.HEARTBEAT_REPLY_WAIT.getOrNull(this); + if (timeout == null || GenericUtils.isNegativeOrNull(heartbeatInterval) || GenericUtils.isEmpty(heartbeatRequest)) { + return CoreModuleProperties.HEARTBEAT_NO_REPLY_MAX.getRequired(this).intValue(); + } + // The deprecated timeout is configured explicitly. If the new no reply max is _not_ explicitly configured, + // set it from the timeout. + Integer noReplyValue = CoreModuleProperties.HEARTBEAT_NO_REPLY_MAX.getOrNull(this); + if (noReplyValue != null) { + return noReplyValue.intValue(); + } + if (timeout.compareTo(heartbeatInterval) >= 0) { + // Timeout is longer than the interval. With the old system, that would have killed the session when the + // timeout was reached. A slow server that managed to return the reply just before the timeout expired would + // have delayed subsequent heartbeats. The new system will keep sending heartbeats with the given interval. + // Thus we can have timeout / interval heartbeats without reply if we want to approximate the old system. + double timeoutSec = timeout.getSeconds() + (timeout.getNano() / 1_000_000_000.0); + double intervalSec = heartbeatInterval.getSeconds() + (heartbeatInterval.getNano() / 1_000_000_000.0); + double multiple = timeoutSec / intervalSec; + if (multiple >= Integer.MAX_VALUE - 1) { + return Integer.MAX_VALUE; + } else { + return (int) multiple + 1; + } + } + // Timeout is smaller than the interval. We want to have every heartbeat replied to. + return 1; + // This is an approximation. If no reply is forthcoming, the session will newly be killed after the interval. In + // the old system it would have been killed after the timeout. We _could_ code something to schedule a task that Review Comment: Done. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: dev-unsubscr...@mina.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@mina.apache.org For additional commands, e-mail: dev-h...@mina.apache.org