tomaswolf commented on code in PR #507:
URL: https://github.com/apache/mina-sshd/pull/507#discussion_r1618319934


##########
CHANGES.md:
##########
@@ -58,7 +59,39 @@ NTRU Prime sntrup761 and X25519 with SHA-512: 
sntrup761x25519-sha512](https://ww
 
 ## Behavioral changes and enhancements
 
-* [GH-468](https://github.com/apache/mina-sshd/issues/468) SFTP: validate 
length of data received: must not be more than requested
+### [GH-461](https://github.com/apache/mina-sshd/issues/461) Fix heartbeats 
with `wantReply=true`
+
+The client-side heartbeat mechanism has been updated. Such heartbeats are 
configured via the
+`CoreModuleProperties.HEARTBEAT_INTERVAL` property. If this interval is > 0, 
heartbeats are sent to
+the server.
+
+Previously these heartbeats could also be configured with a 
`CoreModuleProperties.HEARTBEAT_REPLY_WAIT`
+timeout. If the timeout was <= 0, the client would just send heartbeat 
requests without expecting any
+answers. If the timeout was > 0, the client would send requests with a flag 
indicating that the server
+should reply. The client would then wait for the specified duration for the 
reply and would terminate
+the connection if none was received.
+
+This old mechanism could cause trouble if the timeout was fairly long and the 
server was slow to respond.

Review Comment:
   Done.



##########
sshd-core/src/main/java/org/apache/sshd/client/session/ClientConnectionService.java:
##########
@@ -55,7 +61,41 @@ 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 previous system, 
that would have killed the session when
+            // the

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

Reply via email to