Index: net/quic/core/quic_spdy_session.cc |
diff --git a/net/quic/core/quic_spdy_session.cc b/net/quic/core/quic_spdy_session.cc |
index 444c35c45bc49ac3b37fb5db0f0a486829c96a82..b2bb42ffca2a7efdfb03bc0c757f530cc05e6fe8 100644 |
--- a/net/quic/core/quic_spdy_session.cc |
+++ b/net/quic/core/quic_spdy_session.cc |
@@ -121,12 +121,24 @@ void QuicSpdySession::OnConfigNegotiated() { |
if (FLAGS_quic_enable_force_hol_blocking && version > QUIC_VERSION_35 && |
config()->ForceHolBlocking(perspective())) { |
force_hol_blocking_ = true; |
- // Autotuning makes sure that the headers stream flow control does |
- // not get in the way, and normal stream and connection level flow |
- // control are active anyway. This is really only for the client |
- // side (and mainly there just in tests and toys), where |
- // autotuning and/or large buffers are not enabled by default. |
- headers_stream_->flow_controller()->set_auto_tune_receive_window(true); |
+ if (!FLAGS_quic_bugfix_fhol_writev_fin_only_v2) { |
+ // Autotuning makes sure that the headers stream flow control does |
+ // not get in the way, and normal stream and connection level flow |
+ // control are active anyway. This is really only for the client |
+ // side (and mainly there just in tests and toys), where |
+ // autotuning and/or large buffers are not enabled by default. |
+ headers_stream_->flow_controller()->set_auto_tune_receive_window(true); |
+ } else { |
+ // Since all streams are tunneled through the headers stream, it |
+ // is important that headers stream never flow control blocks. |
+ // Otherwise, busy-loop behaviour can ensue where data streams |
+ // data try repeatedly to write data not realizing that the |
+ // tunnel through the headers stream is blocked. |
+ headers_stream_->flow_controller()->UpdateReceiveWindowSize( |
+ kStreamReceiveWindowLimit); |
+ headers_stream_->flow_controller()->UpdateSendWindowOffset( |
+ kStreamReceiveWindowLimit); |
+ } |
} |
if (version > QUIC_VERSION_34) { |