Skip to content

SSH connection without SoTimeout can hang for two hours on connect #1610

@csc-gip

Description

@csc-gip

The old SSH lib (JSch) sets a SoTimeout when a ConnectTimeout is used.

https://github.com/mwiede/jsch/blob/22161263bcece99567e57e8267cf4eab9f8803ba/src/main/java/com/jcraft/jsch/Session.java#L250

The new lib (SSHj) uses 0 as default, which blocks 4ewa.

https://github.com/hierynomus/sshj/blob/607e80591cdbf956e7d66eb88b09e6510d513f4f/src/main/java/net/schmizz/sshj/SocketClient.java#L42

https://github.com/hierynomus/sshj/blob/607e80591cdbf956e7d66eb88b09e6510d513f4f/src/main/java/net/schmizz/sshj/SocketClient.java#L203

The timeout was not

and is not

changed by Xyna.

If a connection breaks during a connection attempt, the process can hang during SSH setup. The TCP session is still valid as the other side just disappeared. The TCP keepalive defaults to two hours.

  Thread.cputime=67ms
   .usertime=60ms
   "Xyna Worker (prio 7, count 1645)" Id=6328 RUNNABLE (in native)
        at java.base@11.0.24/java.net.SocketInputStream.socketRead0(Native Method)
        at java.base@11.0.24/java.net.SocketInputStream.socketRead(SocketInputStream.java:115)
        at java.base@11.0.24/java.net.SocketInputStream.read(SocketInputStream.java:168)
        at java.base@11.0.24/java.net.SocketInputStream.read(SocketInputStream.java:140)
        at java.base@11.0.24/java.net.SocketInputStream.read(SocketInputStream.java:200)
        at net.schmizz.sshj.transport.TransportImpl.receiveServerIdent(TransportImpl.java:193)
        at net.schmizz.sshj.transport.TransportImpl.init(TransportImpl.java:158)
        at net.schmizz.sshj.SSHClient.onConnect(SSHClient.java:806)
        at net.schmizz.sshj.SocketClient.connect(SocketClient.java:71)
        at xact.ssh.impl.SSHConnectionInstanceOperationImpl.createSession(SSHConnectionInstanceOperationImpl.java:402)
        at xact.ssh.impl.SSHConnectionInstanceOperationImpl.createSession(SSHConnectionInstanceOperationImpl.java:261)
        at xact.ssh.impl.SSHConnectionInstanceOperationImpl.connect(SSHConnectionInstanceOperationImpl.java:233)
        at xact.ssh.SSHShellConnectionSuperProxy.access$001(SSHShellConnectionSuperProxy.java:73)
        at xact.ssh.SSHShellConnectionSuperProxy$1.connect(SSHShellConnectionSuperProxy.java:100)
        at xact.ssh.SSHConnection.connect_InternalSuperCallDestination(SSHConnection.java:267)
        at xact.ssh.SSHShellConnection.connect_InternalSuperCallProxy(SSHShellConnection.java:399)
        at jdk.internal.reflect.GeneratedMethodAccessor147.invoke(Unknown Source)
        at java.base@11.0.24/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base@11.0.24/java.lang.reflect.Method.invoke(Method.java:566)
        at xact.ssh.SSHShellConnectionSuperProxy.connect(SSHShellConnectionSuperProxy.java:299)
        at xact.ssh.SSHConnectionImpl.connect(SSHConnectionImpl.java:104)
        at xact.ssh.SSHConnection.connect_InternalImplementation(SSHConnection.java:276)
        at xact.ssh.SSHConnection.connect(SSHConnection.java:272)
        at xact.ssh.impl.SSHConnectionManagementServiceOperationImpl.getConnection(SSHConnectionManagementServiceOperationImpl.java:168)
        at xact.ssh.SSHConnectionManagementImpl.getConnection(SSHConnectionManagementImpl.java:111)
        at xact.ssh.SSHConnectionManagement.getConnection(SSHConnectionManagement.java:277)
        at csc.test.TestSSHConnectionAdtran$Step10.executeInternally(TestSSHConnectionAdtran.java:1265)

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions