[ https://issues.apache.org/jira/browse/SSHD-781?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
MayDay updated SSHD-781: ------------------------ Description: The heartbeat request of sshClient is SSH_MSG_GLOBAL_REQUEST, but the default buffer of heartbeat set false (see [ClientConnectService#sendHeartbeat|https://github.com/apache/mina-sshd/blob/693fa5d90f54676de6655954046a8a4f5d09728a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientConnectionService.java]) {code:java} buf.putBoolean(false); {code} The sshServer reponse the heartbeat by the [KeepAliveHandler|https://github.com/apache/mina-sshd/blob/693fa5d90f54676de6655954046a8a4f5d09728a/sshd-core/src/main/java/org/apache/sshd/server/global/KeepAliveHandler.java], then [AbstractConnectionService #sendGlobalResponse|https://github.com/apache/mina-sshd/blob/693fa5d90f54676de6655954046a8a4f5d09728a/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractConnectionService.java]. {code:java} boolean wantReply = buffer.getBoolean(); {code} but if the buffer of heartbeat set false, then the sendGlobalResponse will not reponse sshClient {color:#205081}because of the wantReply is false{color} .(see [AbstractConnectionService #globalRequest|https://github.com/apache/mina-sshd/blob/693fa5d90f54676de6655954046a8a4f5d09728a/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractConnectionService.java]) {code:java} if (RequestHandler.Result.Replied.equals(result) || (!wantReply)) { return new AbstractIoWriteFuture(req, null) { { setValue(Boolean.TRUE); } }; } {code} 1 、Is it a Bug(set the heartbeat buffer false default)? how the sshClient know the server is available when the server don't response. I have test it whth create a client with params ( HEARTBEAT_INTERAL = 60 IDLE_TIMEOUT = 300 NIO_READ_TIMEOUT = 315)and a server, and the client will close seesion after the NIO_READ_TIMEOUT. 2、If the client reach the NIO_READ_TIMEOUT, then thows a {color:#8eb021}InterruptedByTimeoutException{color},and close the session.But the task of heratbeat not stoped, it will continue to run even though it will not send packet.See the [ClientConnectionService #startHeartBeat|https://github.com/apache/mina-sshd/blob/693fa5d90f54676de6655954046a8a4f5d09728a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientConnectionService.java] {code:java} service.scheduleAtFixedRate(this::sendHeartBeat, interval, interval, TimeUnit.MILLISECONDS); {code} was: The heartbeat request of sshClient is SSH_MSG_GLOBAL_REQUEST, but the default buffer of heartbeat set false (see ClientConnectService#sendHeartbeat ) {code:java} buf.putBoolean(false); {code} The sshServer reponse the heartbeat by the KeepAliveHandler, then sendGlobalResponse. but if the buffer of heartbeat set false, then the sendGlobalResponse will not reponse sshClient.(see AbstractConnectionService #globalRequest) {code:java} boolean wantReply = buffer.getBoolean(); {code} {code:java} protected IoWriteFuture sendGlobalResponse(Buffer buffer, String req, RequestHandler.Result result, boolean wantReply) throws IOException { if (log.isDebugEnabled()) { log.debug("sendGlobalResponse({})[{}] result={}, want-reply={}", this, req, result, wantReply); } if (RequestHandler.Result.Replied.equals(result) || (!wantReply)) { return new AbstractIoWriteFuture(req, null) { { setValue(Boolean.TRUE); } }; } byte cmd = RequestHandler.Result.ReplySuccess.equals(result) ? SshConstants.SSH_MSG_REQUEST_SUCCESS : SshConstants.SSH_MSG_REQUEST_FAILURE; Session session = getSession(); Buffer rsp = session.createBuffer(cmd, 2); return session.writePacket(rsp); } {code} 1 、if it a Bug? how the sshClient know the server is available when the server don't response. I have test it whth create a client with params ( HEARTBEAT_INTERAL = 60 IDLE_TIMEOUT = 300 NIO_READ_TIMEOUT = 315)and a server, and the client will close seesion after the NIO_READ_TIMEOUT. > The heartbeat task of client not support keepalive function well > ---------------------------------------------------------------- > > Key: SSHD-781 > URL: https://issues.apache.org/jira/browse/SSHD-781 > Project: MINA SSHD > Issue Type: Question > Affects Versions: 1.4.0 > Environment: Any environment > Reporter: MayDay > > > The heartbeat request of sshClient is SSH_MSG_GLOBAL_REQUEST, but the > default buffer of heartbeat set false (see > [ClientConnectService#sendHeartbeat|https://github.com/apache/mina-sshd/blob/693fa5d90f54676de6655954046a8a4f5d09728a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientConnectionService.java]) > {code:java} > buf.putBoolean(false); > {code} > The sshServer reponse the heartbeat by the > [KeepAliveHandler|https://github.com/apache/mina-sshd/blob/693fa5d90f54676de6655954046a8a4f5d09728a/sshd-core/src/main/java/org/apache/sshd/server/global/KeepAliveHandler.java], > then [AbstractConnectionService > #sendGlobalResponse|https://github.com/apache/mina-sshd/blob/693fa5d90f54676de6655954046a8a4f5d09728a/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractConnectionService.java]. > {code:java} > boolean wantReply = buffer.getBoolean(); > {code} > but if the buffer of heartbeat set false, then the sendGlobalResponse > will not reponse sshClient {color:#205081}because of the wantReply is > false{color} .(see [AbstractConnectionService > #globalRequest|https://github.com/apache/mina-sshd/blob/693fa5d90f54676de6655954046a8a4f5d09728a/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractConnectionService.java]) > {code:java} > if (RequestHandler.Result.Replied.equals(result) || (!wantReply)) { > return new AbstractIoWriteFuture(req, null) { > { > setValue(Boolean.TRUE); > } > }; > } > {code} > 1 、Is it a Bug(set the heartbeat buffer false default)? how the sshClient > know the server is available when the server don't response. > I have test it whth create a client with params ( > HEARTBEAT_INTERAL = 60 > IDLE_TIMEOUT = 300 > NIO_READ_TIMEOUT = 315)and a server, and the client will close seesion after > the NIO_READ_TIMEOUT. > 2、If the client reach the NIO_READ_TIMEOUT, then thows a > {color:#8eb021}InterruptedByTimeoutException{color},and close the session.But > the task of heratbeat not stoped, it will continue to run even though it will > not send packet.See the > [ClientConnectionService > #startHeartBeat|https://github.com/apache/mina-sshd/blob/693fa5d90f54676de6655954046a8a4f5d09728a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientConnectionService.java] > {code:java} > service.scheduleAtFixedRate(this::sendHeartBeat, interval, interval, > TimeUnit.MILLISECONDS); > {code} > -- This message was sent by Atlassian JIRA (v6.4.14#64029)