You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mina.apache.org by "Guillaume Nodet (JIRA)" <ji...@apache.org> on 2017/10/27 06:27:00 UTC

[jira] [Reopened] (SSHD-781) The heartbeat task of client not support keepalive function well

     [ https://issues.apache.org/jira/browse/SSHD-781?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Guillaume Nodet reopened SSHD-781:
----------------------------------
      Assignee:     (was: Goldstein Lyor)

What happens is that server keeps timeout for each client so that when the timeout elapses, the session will be closed by the server for inactivity.  Whenever the server receives a message from the client, this internal timer will be reset.  So the effect of sending the keep alive messages is that the server will not close the connection because the client remains always active.
That's how keep alive works with most servers

The fact that keep-alive thread is never stopped is a real problem and should be fixed.
Another thing to consider would be to close the session if anything goes wrong when writing the keep-alive message, so that if the server is down, the heart beat would throw an exception and this would close the session.

> 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, 1.6.0
>         Environment: Any environment
>            Reporter: MayDay
>              Labels: test
>
>  
>         The heartbeat request of sshClient is a 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}
> if the sshClient reopen a new session and close it many times,the number of invalid scheduling heartbeat  task will become very large, it's not  equitable.
>          



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)