I've managed to overcome this issue myself. First, I tried to find out where the blocking actually occurs. After a number of sent bulk requests the ChannelSftp.header(Buffer, Header) method gets blocked for exactly 60 seconds, that's the stack trace:
Daemon Thread [Camel (camel-1) thread #0 - sftp://secret/archive] (Suspended) waiting for: Channel$MyPipedInputStream (id=26) Object.wait(long) line: not available [native method] Channel$MyPipedInputStream(PipedInputStream).read() line: 326 Channel$MyPipedInputStream(PipedInputStream).read(byte[], int, int) line: 377 ChannelSftp.fill(byte[], int, int) line: 2605 ChannelSftp.header(Buffer, ChannelSftp$Header) line: 2631 ChannelSftp.access$11(ChannelSftp, Buffer, ChannelSftp$Header) line: 2629 ChannelSftp$2.read(byte[], int, int) line: 1282 ChannelSftp$2.read(byte[]) line: 1232 FileOperations.writeFileByStream(InputStream, File) line: 382 I don't know what is causing this. After the "timeout" occurred processing continued until the next outage. I tried to reproduce the "bug" with Openssh's sftp command and the -R (num_requests) argument which I think is meant by "sending multiple requests at any one time". As Openssh's sftp works well I compared the ChannelSftp implementation with what is in sftp-client.c. The only obvious difference I found is the "rq.count()==0" condition in "ChannelSftp.get(String, SftpProgressMonitor, long).new InputStream() {...}.read(byte[], int, int)". Removing the condition fixes the issue for me. Can this be considered as a bug? Is this something eligible for a next version of JSCH? The following patch is based upon jsch-0.1.53: --- src/com/jcraft/jsch/ChannelSftp.java +++ src/com/jcraft/jsch/ChannelSftp.java @@ -1374,17 +1374,16 @@ len=1024; } - if(rq.count()==0) { - int request_len = buf.buffer.length-13; - if(server_version==0){ request_len=1024; } - while(rq.count() < request_max){ - try{ - sendREAD(handle, request_offset, request_len, rq); - } - catch(Exception e){ throw new IOException("error"); } - request_offset += request_len; + int request_len = buf.buffer.length-13; + if(server_version==0){ request_len=1024; } + + while(rq.count() < request_max){ + try{ + sendREAD(handle, request_offset, request_len, rq); } + catch(Exception e){ throw new IOException("error"); } + request_offset += request_len; } header=header(buf, header); Thanks for considering this. Regards, Thomas ------------------------------------------------------------------------------ Transform Data into Opportunity. Accelerate data analysis in your applications with Intel Data Analytics Acceleration Library. Click to learn more. http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140 _______________________________________________ JSch-users mailing list JSch-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jsch-users