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
>