www.libssh2.org | Daily snapshots | Mailing list archive | Docs | Examples | github

Archive Index This month's Index

Subject: [libssh2] #258: [PATCH] client spins on write when window full

[libssh2] #258: [PATCH] client spins on write when window full

From: libssh2 Trac <trac_at_libssh2.stuge.se>
Date: Wed, 13 Feb 2013 22:10:37 -0000

#258: [PATCH] client spins on write when window full
--------------------+--------------------
 Reporter: ncm | Owner:
     Type: defect | Status: new
 Priority: normal | Milestone: 1.4.3
Component: misc | Version: 1.4.2
 Keywords: | Blocked By:
   Blocks: |
--------------------+--------------------
 I see CPU go to 100% on writes when the receiver is slow or slow to
 deliver window adjustments. When the window appears to be full, it
 seems a grave error to sleep on writability of a socket that is
 writable all the time.

 Suggesting this to reduce sender CPU load without reducing throughput:
 {{{
 --- a/src/channel.c
 +++ b/src/channel.c
 @@ -2012,9 +2012,17 @@ _libssh2_channel_write(LIBSSH2_CHANNEL *channel,
 int stream_id,
          if((rc < 0) && (rc != LIBSSH2_ERROR_EAGAIN))
              return rc;

 - if(channel->local.window_size <= 0)
 - /* there's no room for data so we stop */
 + if(channel->local.window_size <= 0) {
 + /* there's no room for data so we stop. */
 +
 + /* Waiting on the socket to be writable would be wrong
 + * because we would be back here immediately, but a readable
 + * socket might herald an incoming window adjustment.
 + */
 + session->socket_block_directions =
 LIBSSH2_SESSION_BLOCK_INBOUND;
 +
              return (rc==LIBSSH2_ERROR_EAGAIN?rc:0);
 + }

          channel->write_bufwrite = buflen;
 }}}

-- 
Ticket URL: <https://trac.libssh2.org/ticket/258>
libssh2 <https://trac.libssh2.org/>
C library for writing portable SSH2 clients
_______________________________________________
libssh2-devel http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel
Received on 2013-02-13

the libssh2 team