[ 
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)

Reply via email to