[JSch-users] Sftp Hangs for large files - the fix
Status: Alpha
Brought to you by:
ymnk
From: Lindani P. <lp...@nc...> - 2004-02-27 15:54:29
|
I found that sending (put) any files larger than 1K were hanging the jsch client. The problem in my case was that my server had stringent window size requirements (max 1K). The client was then hanging in the write method of Session.java: public /*synchronized*/ void write(Packet packet, Channel c, int length) throws Exception{ while(true){ if(c.rwsize>length){ c.rwsize-=length; break; } try{ Thread.sleep(10); }catch(Exception e){}; } write(packet); } In my case c.rwsize>length will never be true for files larger than 1K (put method attempts to read in 1024 bytes at a time) , so I got stuck in the while loop. My fix for this was to check for the available remote window size (rwsize) in the put method of ChannelSftp and make sure that I only attempt to send a length smaller then the available window space (minus any packet padding such as handle.length) . This also improved my performance as I can send much more than the hardcoded 1024 bytes at a time, if the window space is available. Also I changed the above code to : public /*synchronized*/ void write(Packet packet, Channel c, int length) throws Exception{ int retry = 0; while(true){ if(c.rwsize>length){ c.rwsize-=length; break; } Thread.sleep(10); retry++; if (retry > 10000) throw Exception("Unable to negotiate adequate window size"); //wait for only 100s } write(packet); } So the caller can at least get an exception if the required window size is not obtained in after a certain wait. LD. |