Chromium Code Reviews| Index: net/spdy/spdy_session.cc |
| diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc |
| index ba84ea12acbbe9e41dfea287860e52eda6fdbbef..f0e0053d5e2075050e6c3ad7ed2ec1c6d7646e30 100644 |
| --- a/net/spdy/spdy_session.cc |
| +++ b/net/spdy/spdy_session.cc |
| @@ -1132,19 +1132,8 @@ void SpdySession::WriteSocket() { |
| } |
| } |
| -void SpdySession::CloseAllStreams(net::Error status) { |
| - base::StatsCounter abandoned_streams("spdy.abandoned_streams"); |
| - base::StatsCounter abandoned_push_streams( |
| - "spdy.abandoned_push_streams"); |
| - |
| - if (!active_streams_.empty()) |
| - abandoned_streams.Add(active_streams_.size()); |
| - if (!unclaimed_pushed_streams_.empty()) { |
| - streams_abandoned_count_ += unclaimed_pushed_streams_.size(); |
| - abandoned_push_streams.Add(unclaimed_pushed_streams_.size()); |
| - unclaimed_pushed_streams_.clear(); |
| - } |
| - |
| +void SpdySession::CloseAllStreamsAfter(SpdyStreamId last_good_stream_id, |
| + net::Error status) { |
| for (int i = 0; i < NUM_PRIORITIES; ++i) { |
| PendingStreamRequestQueue queue; |
| queue.swap(pending_create_stream_queues_[i]); |
| @@ -1154,11 +1143,17 @@ void SpdySession::CloseAllStreams(net::Error status) { |
| } |
| } |
| - while (!active_streams_.empty()) { |
| - ActiveStreamMap::iterator it = active_streams_.begin(); |
| + ActiveStreamMap::iterator it = |
| + active_streams_.lower_bound(last_good_stream_id + 1); |
| + while (it != active_streams_.end()) { |
| const scoped_refptr<SpdyStream>& stream = it->second; |
| + ++it; |
| + if (stream->stream_id() <= last_good_stream_id) { |
|
akalin
2013/04/18 01:29:59
you don't need this check, right? Since ActiveStre
Ryan Hamilton
2013/04/18 17:18:29
Hah! Yes :> Done.
|
| + continue; |
| + } |
| LogAbandonedStream(stream, status); |
| DeleteStream(stream->stream_id(), status); |
| + streams_abandoned_count_++; |
|
akalin
2013/04/18 01:29:59
hunh. we weren't incrementing this correctly? i se
Ryan Hamilton
2013/04/18 17:18:29
Before I got started? I think we were doing somet
|
| } |
| while (!created_streams_.empty()) { |
| @@ -1169,7 +1164,21 @@ void SpdySession::CloseAllStreams(net::Error status) { |
| stream->OnClose(status); |
| } |
| - write_queue_.Clear(); |
| + write_queue_.RemovePendingWritesForStreamsAfter(last_good_stream_id); |
| +} |
| + |
| +void SpdySession::CloseAllStreams(net::Error status) { |
|
akalin
2013/04/18 01:29:59
please put this above to match order in header (or
Ryan Hamilton
2013/04/18 17:18:29
Done.
|
| + base::StatsCounter abandoned_streams("spdy.abandoned_streams"); |
| + base::StatsCounter abandoned_push_streams( |
| + "spdy.abandoned_push_streams"); |
| + |
| + if (!unclaimed_pushed_streams_.empty()) { |
| + streams_abandoned_count_ += unclaimed_pushed_streams_.size(); |
| + abandoned_push_streams.Add(unclaimed_pushed_streams_.size()); |
| + unclaimed_pushed_streams_.clear(); |
| + } |
| + |
| + CloseAllStreamsAfter(0, status); |
| } |
| void SpdySession::LogAbandonedStream(const scoped_refptr<SpdyStream>& stream, |
| @@ -1743,14 +1752,7 @@ void SpdySession::OnGoAway(SpdyStreamId last_accepted_stream_id, |
| unclaimed_pushed_streams_.size(), |
| status)); |
| RemoveFromPool(); |
| - CloseAllStreams(net::ERR_ABORTED); |
| - |
| - // TODO(willchan): Cancel any streams that are past the GoAway frame's |
| - // |last_accepted_stream_id|. |
| - |
| - // Don't bother killing any streams that are still reading. They'll either |
| - // complete successfully or get an ERR_CONNECTION_CLOSED when the socket is |
| - // closed. |
| + CloseAllStreamsAfter(last_accepted_stream_id, net::ERR_ABORTED); |
| } |
| void SpdySession::OnPing(uint32 unique_id) { |