[
https://issues.apache.org/jira/browse/SSHD-781?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
MayDay updated SSHD-781:
------------------------
Affects Version/s: 1.6.0
Labels: test (was: )
Description:
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.
was:
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}
> 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)