diff options
author | rtenneti@chromium.org <rtenneti@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-02-29 08:19:36 +0000 |
---|---|---|
committer | rtenneti@chromium.org <rtenneti@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-02-29 08:19:36 +0000 |
commit | ef02724686033a97f5619168b52e612735b37008 (patch) | |
tree | 9e87437428c0dda84fcdbab24a18149d6b1c8bb4 /net/spdy | |
parent | 2aba99da8333d9fe2df2b1bea3bbd0cef5ed5079 (diff) | |
download | chromium_src-ef02724686033a97f5619168b52e612735b37008.zip chromium_src-ef02724686033a97f5619168b52e612735b37008.tar.gz chromium_src-ef02724686033a97f5619168b52e612735b37008.tar.bz2 |
SPDY - flow control optimizations. Send WINDOW_UPDATE
message only when window update size is greater than
50% of the session's send window size.
BUG=107472
R=willchan
TEST=network unittests
Review URL: http://codereview.chromium.org/9443022
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@124153 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/spdy')
-rw-r--r-- | net/spdy/spdy_network_transaction_unittest.cc | 4 | ||||
-rw-r--r-- | net/spdy/spdy_session.h | 8 | ||||
-rw-r--r-- | net/spdy/spdy_stream.cc | 15 | ||||
-rw-r--r-- | net/spdy/spdy_stream.h | 4 |
4 files changed, 30 insertions, 1 deletions
diff --git a/net/spdy/spdy_network_transaction_unittest.cc b/net/spdy/spdy_network_transaction_unittest.cc index 10b0ceb..6f770cb 100644 --- a/net/spdy/spdy_network_transaction_unittest.cc +++ b/net/spdy/spdy_network_transaction_unittest.cc @@ -2020,6 +2020,10 @@ TEST_P(SpdyNetworkTransactionTest, WindowUpdateSent) { EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); EXPECT_TRUE(response->was_fetched_via_spdy); + // Force sending of WINDOW_UPDATE by setting initial_recv_window_size to a + // small value. + stream->stream()->set_initial_recv_window_size(kUploadDataSize / 2); + // Issue a read which will cause a WINDOW_UPDATE to be sent and window // size increased to default. scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kUploadDataSize)); diff --git a/net/spdy/spdy_session.h b/net/spdy/spdy_session.h index 1e49559..743cced 100644 --- a/net/spdy/spdy_session.h +++ b/net/spdy/spdy_session.h @@ -264,6 +264,14 @@ class NET_EXPORT SpdySession : public base::RefCounted<SpdySession>, return flow_control_; } + // Returns the current |initial_recv_window_size_|. + int32 initial_recv_window_size() const { return initial_recv_window_size_; } + + // Sets |initial_recv_window_size_| used by unittests. + void set_initial_recv_window_size(int32 window_size) { + initial_recv_window_size_ = window_size; + } + const BoundNetLog& net_log() const { return net_log_; } int GetPeerAddress(AddressList* address) const; diff --git a/net/spdy/spdy_stream.cc b/net/spdy/spdy_stream.cc index ab2cbfa..3280d00 100644 --- a/net/spdy/spdy_stream.cc +++ b/net/spdy/spdy_stream.cc @@ -76,6 +76,7 @@ SpdyStream::SpdyStream(SpdySession* session, stalled_by_flow_control_(false), send_window_size_(spdy::kSpdyStreamInitialWindowSize), recv_window_size_(spdy::kSpdyStreamInitialWindowSize), + unacked_recv_window_bytes_(0), pushed_(pushed), response_received_(false), session_(session), @@ -159,12 +160,18 @@ void SpdyStream::set_spdy_headers( request_ = headers; } +void SpdyStream::set_initial_recv_window_size(int32 window_size) { + session_->set_initial_recv_window_size(window_size); +} + void SpdyStream::AdjustSendWindowSize(int32 delta_window_size) { send_window_size_ += delta_window_size; } void SpdyStream::IncreaseSendWindowSize(int32 delta_window_size) { + DCHECK(session_->is_flow_control_enabled()); DCHECK_GE(delta_window_size, 1); + int32 new_window_size = send_window_size_ + delta_window_size; // We should ignore WINDOW_UPDATEs received before or after this state, @@ -202,6 +209,7 @@ void SpdyStream::IncreaseSendWindowSize(int32 delta_window_size) { void SpdyStream::DecreaseSendWindowSize(int32 delta_window_size) { // we only call this method when sending a frame, therefore // |delta_window_size| should be within the valid frame size range. + DCHECK(session_->is_flow_control_enabled()); DCHECK_GE(delta_window_size, 1); DCHECK_LE(delta_window_size, kMaxSpdyFrameChunkSize); @@ -235,7 +243,12 @@ void SpdyStream::IncreaseRecvWindowSize(int32 delta_window_size) { NetLog::TYPE_SPDY_STREAM_UPDATE_RECV_WINDOW, make_scoped_refptr(new NetLogSpdyStreamWindowUpdateParameter( stream_id_, delta_window_size, recv_window_size_))); - session_->SendWindowUpdate(stream_id_, delta_window_size); + + unacked_recv_window_bytes_ += delta_window_size; + if (unacked_recv_window_bytes_ > session_->initial_recv_window_size() / 2) { + session_->SendWindowUpdate(stream_id_, unacked_recv_window_bytes_); + unacked_recv_window_bytes_ = 0; + } } void SpdyStream::DecreaseRecvWindowSize(int32 delta_window_size) { diff --git a/net/spdy/spdy_stream.h b/net/spdy/spdy_stream.h index a40c744..a7342a7 100644 --- a/net/spdy/spdy_stream.h +++ b/net/spdy/spdy_stream.h @@ -135,6 +135,9 @@ class NET_EXPORT_PRIVATE SpdyStream recv_window_size_ = window_size; } + // Set session_'s initial_recv_window_size. Used by unittests. + void set_initial_recv_window_size(int32 window_size); + void set_stalled_by_flow_control(bool stalled) { stalled_by_flow_control_ = stalled; } @@ -308,6 +311,7 @@ class NET_EXPORT_PRIVATE SpdyStream bool stalled_by_flow_control_; int32 send_window_size_; int32 recv_window_size_; + int32 unacked_recv_window_bytes_; const bool pushed_; ScopedBandwidthMetrics metrics_; |