summaryrefslogtreecommitdiffstats
path: root/net/spdy
diff options
context:
space:
mode:
authorrtenneti@chromium.org <rtenneti@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-29 08:19:36 +0000
committerrtenneti@chromium.org <rtenneti@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-29 08:19:36 +0000
commitef02724686033a97f5619168b52e612735b37008 (patch)
tree9e87437428c0dda84fcdbab24a18149d6b1c8bb4 /net/spdy
parent2aba99da8333d9fe2df2b1bea3bbd0cef5ed5079 (diff)
downloadchromium_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.cc4
-rw-r--r--net/spdy/spdy_session.h8
-rw-r--r--net/spdy/spdy_stream.cc15
-rw-r--r--net/spdy/spdy_stream.h4
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_;