partially revert "window_size: explicit adjustments only"
This partially reverts commit 03ca9020756a4e16f0294e5b35e9826ee6af2364 in order to fix extreme slowdown when uploading to localhost via SFTP. I was able to repeat the issue on RHEL-7 on localhost only. It did not occur when uploading via network and it did not occur on a RHEL-6 box with the same version of libssh2. The problem was that sftp_read() used a read-ahead logic to figure out the window_size, but sftp_packet_read() called indirectly from sftp_write() did not use any read-ahead logic.
This commit is contained in:
parent
e6c46cc249
commit
61e40a32ff
@ -1760,6 +1760,15 @@ ssize_t _libssh2_channel_read(LIBSSH2_CHANNEL *channel, int stream_id,
|
|||||||
channel->read_state = libssh2_NB_state_created;
|
channel->read_state = libssh2_NB_state_created;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* =============================== NOTE ===============================
|
||||||
|
* I know this is very ugly and not a really good use of "goto", but
|
||||||
|
* this case statement would be even uglier to do it any other way
|
||||||
|
*/
|
||||||
|
if (channel->read_state == libssh2_NB_state_jump1) {
|
||||||
|
goto channel_read_window_adjust;
|
||||||
|
}
|
||||||
|
|
||||||
rc = 1; /* set to >0 to let the while loop start */
|
rc = 1; /* set to >0 to let the while loop start */
|
||||||
|
|
||||||
/* Process all pending incoming packets in all states in order to "even
|
/* Process all pending incoming packets in all states in order to "even
|
||||||
@ -1868,6 +1877,27 @@ ssize_t _libssh2_channel_read(LIBSSH2_CHANNEL *channel, int stream_id,
|
|||||||
more off the network again */
|
more off the network again */
|
||||||
channel->read_state = libssh2_NB_state_created;
|
channel->read_state = libssh2_NB_state_created;
|
||||||
|
|
||||||
|
if(channel->remote.window_size < (LIBSSH2_CHANNEL_WINDOW_DEFAULT*30)) {
|
||||||
|
/* the window is getting too narrow, expand it! */
|
||||||
|
|
||||||
|
channel_read_window_adjust:
|
||||||
|
channel->read_state = libssh2_NB_state_jump1;
|
||||||
|
/* the actual window adjusting may not finish so we need to deal with
|
||||||
|
this special state here */
|
||||||
|
rc = _libssh2_channel_receive_window_adjust(channel,
|
||||||
|
(LIBSSH2_CHANNEL_WINDOW_DEFAULT*60),
|
||||||
|
0, NULL);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
_libssh2_debug(session, LIBSSH2_TRACE_CONN,
|
||||||
|
"channel_read() filled %d adjusted %d",
|
||||||
|
bytes_read, buflen);
|
||||||
|
/* continue in 'created' state to drain the already read packages
|
||||||
|
first before starting to empty the socket further */
|
||||||
|
channel->read_state = libssh2_NB_state_created;
|
||||||
|
}
|
||||||
|
|
||||||
return bytes_read;
|
return bytes_read;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user