You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mina.apache.org by John Hartnup <jo...@gmail.com> on 2015/02/10 12:53:16 UTC

ChannelPipedInputStream read() hangs

Hi,

I'm seeing my SFTP server leak threads, as threads hang on
ChannelPipedInputStream.read():

"Thread-14609" prio=10 tid=0x00002b454c0a8000 nid=0x72c5 in Object.wait()
[0x00002b454a68a000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00002b4537b5f0c8> (a
org.apache.sshd.common.util.Buffer)
        at java.lang.Object.wait(Object.java:485)
        at
org.apache.sshd.common.channel.ChannelPipedInputStream.read(ChannelPipedInputStream.java:85)
        - locked <0x00002b4537b5f0c8> (a org.apache.sshd.common.util.Buffer)
        at
org.apache.sshd.common.channel.ChannelPipedInputStream.read(ChannelPipedInputStream.java:62)
        - locked <0x00002b4537b5f0e8> (a [B)
        at java.io.DataInputStream.readInt(Unknown Source)
        at
org.apache.sshd.server.sftp.SftpSubsystem.run(SftpSubsystem.java:379)
        at java.lang.Thread.run(Unknown Source)

This is in SSHd 0.7.0 from Maven, and the wait() is here:

*synchronized* (buffer) {

            *for* (;;) {

                *if* (closed) {

                    *throw* *new* IOException("Pipe closed");

                }

                *if* (buffer.available() > 0) {

                    *break*;

                }

                *if* (writerClosed) {

                    *return* -1; // no more data to read

                }

                *try* {

                    buffer.wait();

                } *catch* (InterruptedException e) {

                    *throw* (IOException) *new*
InterruptedIOException().initCause(e);

                }

            }

            *if* (len > buffer.available()) {

                len = buffer.available();

            }

            buffer.getRawBytes(b, off, len);

            *if* (buffer.rpos() > localWindow.getPacketSize() ||
buffer.available()
== 0) {

                buffer.compact();

            }

            avail = localWindow.getMaxSize() - buffer.available();

        }

        localWindow.check(avail);

        *return* *len*;
    }


I've updated to 0.13.0 and note that
https://issues.apache.org/jira/browse/SSHD-209 saw a timeout added to this
method.

However I don't see that anything in the sshd-core source actually calls
setTimeout(). Would that be the solution? Or is there a different solution
to my hangs?

Thanks,
John

Re: ChannelPipedInputStream read() hangs

Posted by Guillaume Nodet <gn...@apache.org>.
You're right, I think it's missing a configuration property for that.
I've raised https://issues.apache.org/jira/browse/SSHD-419
In the mean time, you should be able to set it manually after the channel
has been opened.

2015-02-10 12:53 GMT+01:00 John Hartnup <jo...@gmail.com>:

> Hi,
>
> I'm seeing my SFTP server leak threads, as threads hang on
> ChannelPipedInputStream.read():
>
> "Thread-14609" prio=10 tid=0x00002b454c0a8000 nid=0x72c5 in Object.wait()
> [0x00002b454a68a000]
>    java.lang.Thread.State: WAITING (on object monitor)
>         at java.lang.Object.wait(Native Method)
>         - waiting on <0x00002b4537b5f0c8> (a
> org.apache.sshd.common.util.Buffer)
>         at java.lang.Object.wait(Object.java:485)
>         at
>
> org.apache.sshd.common.channel.ChannelPipedInputStream.read(ChannelPipedInputStream.java:85)
>         - locked <0x00002b4537b5f0c8> (a
> org.apache.sshd.common.util.Buffer)
>         at
>
> org.apache.sshd.common.channel.ChannelPipedInputStream.read(ChannelPipedInputStream.java:62)
>         - locked <0x00002b4537b5f0e8> (a [B)
>         at java.io.DataInputStream.readInt(Unknown Source)
>         at
> org.apache.sshd.server.sftp.SftpSubsystem.run(SftpSubsystem.java:379)
>         at java.lang.Thread.run(Unknown Source)
>
> This is in SSHd 0.7.0 from Maven, and the wait() is here:
>
> *synchronized* (buffer) {
>
>             *for* (;;) {
>
>                 *if* (closed) {
>
>                     *throw* *new* IOException("Pipe closed");
>
>                 }
>
>                 *if* (buffer.available() > 0) {
>
>                     *break*;
>
>                 }
>
>                 *if* (writerClosed) {
>
>                     *return* -1; // no more data to read
>
>                 }
>
>                 *try* {
>
>                     buffer.wait();
>
>                 } *catch* (InterruptedException e) {
>
>                     *throw* (IOException) *new*
> InterruptedIOException().initCause(e);
>
>                 }
>
>             }
>
>             *if* (len > buffer.available()) {
>
>                 len = buffer.available();
>
>             }
>
>             buffer.getRawBytes(b, off, len);
>
>             *if* (buffer.rpos() > localWindow.getPacketSize() ||
> buffer.available()
> == 0) {
>
>                 buffer.compact();
>
>             }
>
>             avail = localWindow.getMaxSize() - buffer.available();
>
>         }
>
>         localWindow.check(avail);
>
>         *return* *len*;
>     }
>
>
> I've updated to 0.13.0 and note that
> https://issues.apache.org/jira/browse/SSHD-209 saw a timeout added to this
> method.
>
> However I don't see that anything in the sshd-core source actually calls
> setTimeout(). Would that be the solution? Or is there a different solution
> to my hangs?
>
> Thanks,
> John
>