[ 
https://issues.apache.org/jira/browse/SSHD-1262?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17530965#comment-17530965
 ] 

Thomas Wolf commented on SSHD-1262:
-----------------------------------

I've only looked at local port forwarding and the Nio2 implementation so far.

It seems to me the problem in local port forwarding is that we bind an 
Nio2IoAcceptor on the local port, which creates an Nio2Session and calls 
session.startReading() right away. So we read data from the local port before 
we even sent the SSH_MSG_CHANNEL_OPEN, and before we get the 
SSH_MSG_CHANNEL_OPEN_CONFIRMATION (or FAILURE). That's why we buffer data read 
on the socket and then try to write it once we do have the open confirmation.

Perhaps the message handler ({{StaticIoHandler.messageReceived()}}) should 
suspend reads on the Nio2Session when there's not enough window space, and 
reading should be resumed only once the window has been enlarged again. 
Initially reading should be suspended, and be resumed only once the open 
confirmation has been received. Then one might not need a queue, one could be 
sure that there'd be no pending data when the confirmation comes in, and that 
no further data accumulates through the local socket when the window size is 
exhausted.

I'd have to look at how this is implemented with MINA and Netty, and what 
exactly happens in remote port forwarding and in dynamic port forwarding to see 
if that might be a viable avenue to avoid the problem here without 
re-introducing SSHD-849 or other past problems.

> Unhandled SSH_MSG_CHANNEL_WINDOW_ADJUST leeds to SocketTimeoutException
> -----------------------------------------------------------------------
>
>                 Key: SSHD-1262
>                 URL: https://issues.apache.org/jira/browse/SSHD-1262
>             Project: MINA SSHD
>          Issue Type: Bug
>    Affects Versions: 2.7.0, 2.8.0
>            Reporter: Stefan Maute
>            Priority: Major
>              Labels: mina, sshd
>         Attachments: failing-pf-trace-logs.txt
>
>
> Wanted to open a local port forwarding to an SSH server and afterwards 
> connect to MQTT server over the SSh tunnel. During the MQTT connection 
> attempt I encountered a SocketTimeoutException in the logs (StackTrace below).
> What I could see in the logs is that the server is sending an initial window 
> size of 0 and afterwards the _waitForCondition_ method is throwing the 
> SocketTimeoutException .
> After analyzing the logs I maybe have an idea what is going on here. My 
> assumption is that  there is some deadlock in case the initial window size is 
> 0 and the SSH_MSG_CHANNEL_WINDOW_ADJUST  isn't handled properly. 
> I have attached the whole log file. Lines of interest are from 169 to 229.
> Tested with 2.7.0 and 2.8.0.
>  
> {code:java}
> WARN org.apache.sshd.common.forward.DefaultForwarder - 
> exceptionCaught(Nio2Session[local=/127.0.0.1:44259, remote=/127.0.0.1:60188]) 
> SocketTimeoutException: 
> waitForCondition(Window[client/remote](TcpipClientChannel[id=0, 
> recipient=0]-ClientSessionImpl[Admin@/x.xxx.xx.x:xxxx])) timeout exceeded: 
> PT30S java.net.SocketTimeoutException: 
> waitForCondition(Window[client/remote](TcpipClientChannel[id=0, 
> recipient=0]-ClientSessionImpl[Admin@/x.xxx.xx.x:xxxx])) timeout exceeded: 
> PT30S     at 
> org.apache.sshd.common.channel.Window.waitForCondition(Window.java:332)     
> at org.apache.sshd.common.channel.Window.waitForSpace(Window.java:286)     at 
> org.apache.sshd.common.channel.ChannelOutputStream.write(ChannelOutputStream.java:154)
>      at 
> org.apache.sshd.client.channel.ClientChannelPendingMessagesQueue.writeMessage(ClientChannelPendingMessagesQueue.java:174)
>      at 
> org.apache.sshd.client.channel.ClientChannelPendingMessagesQueue.flushPendingQueue(ClientChannelPendingMessagesQueue.java:221)
>      at 
> org.apache.sshd.client.channel.ClientChannelPendingMessagesQueue.operationComplete(ClientChannelPendingMessagesQueue.java:206)
>      at 
> org.apache.sshd.client.channel.ClientChannelPendingMessagesQueue.operationComplete(ClientChannelPendingMessagesQueue.java:51)
>      at 
> org.apache.sshd.common.future.AbstractSshFuture.notifyListener(AbstractSshFuture.java:159)
>      at 
> org.apache.sshd.common.future.DefaultSshFuture.notifyListeners(DefaultSshFuture.java:215)
>      at 
> org.apache.sshd.common.future.DefaultSshFuture.setValue(DefaultSshFuture.java:112)
>      at 
> org.apache.sshd.client.future.DefaultOpenFuture.setOpened(DefaultOpenFuture.java:68)
>      at 
> org.apache.sshd.client.channel.AbstractClientChannel.handleOpenSuccess(AbstractClientChannel.java:360)
>      at 
> org.apache.sshd.common.session.helpers.AbstractConnectionService.channelOpenConfirmation(AbstractConnectionService.java:545)
>      at 
> org.apache.sshd.common.session.helpers.AbstractConnectionService.process(AbstractConnectionService.java:456)
>      at 
> org.apache.sshd.common.session.helpers.AbstractSession.doHandleMessage(AbstractSession.java:503)
>      at 
> org.apache.sshd.common.session.helpers.AbstractSession.handleMessage(AbstractSession.java:429)
>      at 
> org.apache.sshd.common.session.helpers.AbstractSession.decode(AbstractSession.java:1466)
>      at 
> org.apache.sshd.common.session.helpers.AbstractSession.messageReceived(AbstractSession.java:389)
>      at 
> org.apache.sshd.common.session.helpers.AbstractSessionIoHandler.messageReceived(AbstractSessionIoHandler.java:64)
>      at 
> org.apache.sshd.common.io.nio2.Nio2Session.handleReadCycleCompletion(Nio2Session.java:359)
>      at 
> org.apache.sshd.common.io.nio2.Nio2Session$1.onCompleted(Nio2Session.java:336)
>      at 
> org.apache.sshd.common.io.nio2.Nio2Session$1.onCompleted(Nio2Session.java:333)
>      at 
> org.apache.sshd.common.io.nio2.Nio2CompletionHandler.lambda$completed$0(Nio2CompletionHandler.java:38)
>      at 
> java.base/java.security.AccessController.doPrivileged(AccessController.java:318)
>      at 
> org.apache.sshd.common.io.nio2.Nio2CompletionHandler.completed(Nio2CompletionHandler.java:37)
>      at java.base/sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:129)     at 
> java.base/sun.nio.ch.Invoker$2.run(Invoker.java:221)     at 
> java.base/sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:113)
>      at 
> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
>      at 
> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
>      at java.base/java.lang.Thread.run(Thread.java:833) {code}
>  
>  



--
This message was sent by Atlassian Jira
(v8.20.7#820007)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@mina.apache.org
For additional commands, e-mail: dev-h...@mina.apache.org

Reply via email to