[
https://issues.apache.org/jira/browse/SSHD-633?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15121233#comment-15121233
]
Goldstein Lyor commented on SSHD-633:
-------------------------------------
I don't understand the exact scenario of messages that you claim can lead to
the race condition you describe. I do have a few thoughts on the issue though -
see below.
{quote}What I did is to start sending a huge data block without creating a
thread in command's start method. Of course this is a bit incorrect, but it
easily make it fail.{quote} This is not "a bit" but rather *entirely*
incorrect. The _Command#start_ method implementation *must* use a *separate*
thread to consume the input/output streams or they will get stuck eventually -
so no surprise that they do in your code.
There are several things you should try - especially for applications that have
large amounts of data to transfer:
* Increase the number of worker threads for the SSH server
* Increase the default packet size used for channel data transfer
{code:java}
SshServer sshd = ...set up the server...
PropertyResolverUtils.updateProperty(sshd, FactoryManager.NIO_WORKERS, 8 /*
try playing with the value and see how it affects you */);
PropertyResolverUtils.updateProperty(sshd, FactoryManager.MAX_PACKET_SIZE,
48 * KB); // do not go beyond 65535 until version 1.2 is released...
{code}
In any case, I also recommend trying version 1.1 (to be released very soon)
since many bug fixes and optimizations have been added to it.
> Race condition in command execution and SSH_MSG_CHANNEL_SUCCESS
> ---------------------------------------------------------------
>
> Key: SSHD-633
> URL: https://issues.apache.org/jira/browse/SSHD-633
> Project: MINA SSHD
> Issue Type: Bug
> Affects Versions: 1.0.0
> Reporter: Eugene Petrenko
> Priority: Critical
>
> We use the library for production. From time to time we see timeout
> exceptions from clients that calls our SSH server. It was not clear what is
> that. Most of the time I saw command suck reading STDIN. We use JSCH as
> client here. The problem was reproducing rarely.
> I connect JSCH 1.51 to SSHD server to execute a command
> JSCH client expects to read {{SSH_MSG_CHANNEL_SUCCESS}} or
> {{SSH_MSG_CHANNEL_FAILURE}} as response to {{SSH_MSG_CHANNEL_REQUEST}} call
> to execute command.
> SSHD implementation calls command's method {{start}} and than posts reply
> with success to the channel. It may easily command thread is able to fill
> send window with DATA messages. Thus {{SSH_MSG_CHANNEL_SUCCESS}} reply is not
> delivered.
> This makes JSCH to wait for the message and fail on timeout. The SSHD server
> command is simply suck on reading stdin.
> Here goes the code I managed to reproduce the issue. What I did is to start
> sending a huge data block without creating a thread in command's start
> method. Of course this is a bit incorrect, but it easily make it fail.
> The server contains the following command implementation
> {code}
> final OutputStream out = getOut();
> out.write(new byte[32 * 1024 * 1024]);
> out.flush();
> new Thread(new Runnable() {
> @Override
> public void run() {
> try {
> getIn().read();
> onExit(0);
> } catch (Throwable e) {
> onExit(1, e.getMessage());
> }
> }
> }).start();
> {code}
> Jsch client code is follows
> {code}
> final JSch j = new JSch();
> final Session session = j.getSession("jonnyzzz",
> myResource.getHostname(), myResource.getSSHPort());
> session.setTimeout(60_000);
> session.connect();
> final ChannelExec e = (ChannelExec) session.openChannel("exec");
> e.setCommand("test-buffer-underrun");
> final InputStream inputStream = new e.getInputStream();
> e.connect(10_000); //meaningful timeout to reproduce the bug
> ByteStreams.copy(inputStream, FileUtil.nullOutputStream());
> {code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)