| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/spdy/spdy_session.h" | 5 #include "net/spdy/spdy_session.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <map> | 9 #include <map> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 637 spdy_session_key_(spdy_session_key), | 637 spdy_session_key_(spdy_session_key), |
| 638 pool_(NULL), | 638 pool_(NULL), |
| 639 http_server_properties_(http_server_properties), | 639 http_server_properties_(http_server_properties), |
| 640 transport_security_state_(transport_security_state), | 640 transport_security_state_(transport_security_state), |
| 641 read_buffer_(new IOBuffer(kReadBufferSize)), | 641 read_buffer_(new IOBuffer(kReadBufferSize)), |
| 642 stream_hi_water_mark_(kFirstStreamId), | 642 stream_hi_water_mark_(kFirstStreamId), |
| 643 last_accepted_push_stream_id_(0), | 643 last_accepted_push_stream_id_(0), |
| 644 unclaimed_pushed_streams_(this), | 644 unclaimed_pushed_streams_(this), |
| 645 num_pushed_streams_(0u), | 645 num_pushed_streams_(0u), |
| 646 num_active_pushed_streams_(0u), | 646 num_active_pushed_streams_(0u), |
| 647 bytes_pushed_count_(0u), |
| 648 bytes_pushed_and_unclaimed_count_(0u), |
| 647 in_flight_write_frame_type_(DATA), | 649 in_flight_write_frame_type_(DATA), |
| 648 in_flight_write_frame_size_(0), | 650 in_flight_write_frame_size_(0), |
| 649 is_secure_(false), | 651 is_secure_(false), |
| 650 availability_state_(STATE_AVAILABLE), | 652 availability_state_(STATE_AVAILABLE), |
| 651 read_state_(READ_STATE_DO_READ), | 653 read_state_(READ_STATE_DO_READ), |
| 652 write_state_(WRITE_STATE_IDLE), | 654 write_state_(WRITE_STATE_IDLE), |
| 653 error_on_close_(OK), | 655 error_on_close_(OK), |
| 654 max_concurrent_streams_(kInitialMaxConcurrentStreams), | 656 max_concurrent_streams_(kInitialMaxConcurrentStreams), |
| 655 max_concurrent_pushed_streams_(kMaxConcurrentPushedStreams), | 657 max_concurrent_pushed_streams_(kMaxConcurrentPushedStreams), |
| 656 streams_initiated_count_(0), | 658 streams_initiated_count_(0), |
| (...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1172 | 1174 |
| 1173 // TODO(akalin): When SpdyStream was ref-counted (and | 1175 // TODO(akalin): When SpdyStream was ref-counted (and |
| 1174 // |unclaimed_pushed_streams_| held scoped_refptr<SpdyStream>), this | 1176 // |unclaimed_pushed_streams_| held scoped_refptr<SpdyStream>), this |
| 1175 // was only done when status was not OK. This meant that pushed | 1177 // was only done when status was not OK. This meant that pushed |
| 1176 // streams can still be claimed after they're closed. This is | 1178 // streams can still be claimed after they're closed. This is |
| 1177 // probably something that we still want to support, although server | 1179 // probably something that we still want to support, although server |
| 1178 // push is hardly used. Write tests for this and fix this. (See | 1180 // push is hardly used. Write tests for this and fix this. (See |
| 1179 // http://crbug.com/261712 .) | 1181 // http://crbug.com/261712 .) |
| 1180 if (owned_stream->type() == SPDY_PUSH_STREAM) { | 1182 if (owned_stream->type() == SPDY_PUSH_STREAM) { |
| 1181 unclaimed_pushed_streams_.erase(owned_stream->url()); | 1183 unclaimed_pushed_streams_.erase(owned_stream->url()); |
| 1184 bytes_pushed_count_ += owned_stream->recv_bytes(); |
| 1182 num_pushed_streams_--; | 1185 num_pushed_streams_--; |
| 1183 if (!owned_stream->IsReservedRemote()) | 1186 if (!owned_stream->IsReservedRemote()) |
| 1184 num_active_pushed_streams_--; | 1187 num_active_pushed_streams_--; |
| 1185 } | 1188 } |
| 1186 | 1189 |
| 1187 DeleteStream(std::move(owned_stream), status); | 1190 DeleteStream(std::move(owned_stream), status); |
| 1188 | 1191 |
| 1189 // If there are no active streams and the socket pool is stalled, close the | 1192 // If there are no active streams and the socket pool is stalled, close the |
| 1190 // session to free up a socket slot. | 1193 // session to free up a socket slot. |
| 1191 if (active_streams_.empty() && created_streams_.empty() && | 1194 if (active_streams_.empty() && created_streams_.empty() && |
| (...skipping 982 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2174 if (minimum_freshness > it->second.creation_time) | 2177 if (minimum_freshness > it->second.creation_time) |
| 2175 streams_to_close.push_back(it->second.stream_id); | 2178 streams_to_close.push_back(it->second.stream_id); |
| 2176 } | 2179 } |
| 2177 | 2180 |
| 2178 for (std::vector<SpdyStreamId>::const_iterator to_close_it = | 2181 for (std::vector<SpdyStreamId>::const_iterator to_close_it = |
| 2179 streams_to_close.begin(); | 2182 streams_to_close.begin(); |
| 2180 to_close_it != streams_to_close.end(); ++to_close_it) { | 2183 to_close_it != streams_to_close.end(); ++to_close_it) { |
| 2181 ActiveStreamMap::iterator active_it = active_streams_.find(*to_close_it); | 2184 ActiveStreamMap::iterator active_it = active_streams_.find(*to_close_it); |
| 2182 if (active_it == active_streams_.end()) | 2185 if (active_it == active_streams_.end()) |
| 2183 continue; | 2186 continue; |
| 2187 bytes_pushed_and_unclaimed_count_ += active_it->second.stream->recv_bytes(); |
| 2184 | 2188 |
| 2185 LogAbandonedActiveStream(active_it, ERR_INVALID_SPDY_STREAM); | 2189 LogAbandonedActiveStream(active_it, ERR_INVALID_SPDY_STREAM); |
| 2186 // CloseActiveStreamIterator() will remove the stream from | 2190 // CloseActiveStreamIterator() will remove the stream from |
| 2187 // |unclaimed_pushed_streams_|. | 2191 // |unclaimed_pushed_streams_|. |
| 2188 ResetStreamIterator( | 2192 ResetStreamIterator( |
| 2189 active_it, RST_STREAM_REFUSED_STREAM, "Stream not claimed."); | 2193 active_it, RST_STREAM_REFUSED_STREAM, "Stream not claimed."); |
| 2190 } | 2194 } |
| 2191 | 2195 |
| 2192 next_unclaimed_push_stream_sweep_time_ = time_func_() + | 2196 next_unclaimed_push_stream_sweep_time_ = time_func_() + |
| 2193 base::TimeDelta::FromSeconds(kMinPushedStreamLifetimeSeconds); | 2197 base::TimeDelta::FromSeconds(kMinPushedStreamLifetimeSeconds); |
| (...skipping 663 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2857 | 2861 |
| 2858 void SpdySession::RecordHistograms() { | 2862 void SpdySession::RecordHistograms() { |
| 2859 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SpdyStreamsPerSession", | 2863 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SpdyStreamsPerSession", |
| 2860 streams_initiated_count_, 1, 300, 50); | 2864 streams_initiated_count_, 1, 300, 50); |
| 2861 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SpdyStreamsPushedPerSession", | 2865 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SpdyStreamsPushedPerSession", |
| 2862 streams_pushed_count_, 1, 300, 50); | 2866 streams_pushed_count_, 1, 300, 50); |
| 2863 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SpdyStreamsPushedAndClaimedPerSession", | 2867 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SpdyStreamsPushedAndClaimedPerSession", |
| 2864 streams_pushed_and_claimed_count_, 1, 300, 50); | 2868 streams_pushed_and_claimed_count_, 1, 300, 50); |
| 2865 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SpdyStreamsAbandonedPerSession", | 2869 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SpdyStreamsAbandonedPerSession", |
| 2866 streams_abandoned_count_, 1, 300, 50); | 2870 streams_abandoned_count_, 1, 300, 50); |
| 2871 UMA_HISTOGRAM_COUNTS_1M("Net.SpdySession.PushedBytes", bytes_pushed_count_); |
| 2872 DCHECK_LE(bytes_pushed_and_unclaimed_count_, bytes_pushed_count_); |
| 2873 UMA_HISTOGRAM_COUNTS_1M("Net.SpdySession.PushedAndUnclaimedBytes", |
| 2874 bytes_pushed_and_unclaimed_count_); |
| 2867 UMA_HISTOGRAM_ENUMERATION("Net.SpdySettingsSent", | 2875 UMA_HISTOGRAM_ENUMERATION("Net.SpdySettingsSent", |
| 2868 sent_settings_ ? 1 : 0, 2); | 2876 sent_settings_ ? 1 : 0, 2); |
| 2869 UMA_HISTOGRAM_ENUMERATION("Net.SpdySettingsReceived", | 2877 UMA_HISTOGRAM_ENUMERATION("Net.SpdySettingsReceived", |
| 2870 received_settings_ ? 1 : 0, 2); | 2878 received_settings_ ? 1 : 0, 2); |
| 2871 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SpdyStreamStallsPerSession", | 2879 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SpdyStreamStallsPerSession", |
| 2872 stalled_streams_, 1, 300, 50); | 2880 stalled_streams_, 1, 300, 50); |
| 2873 UMA_HISTOGRAM_ENUMERATION("Net.SpdySessionsWithStalls", | 2881 UMA_HISTOGRAM_ENUMERATION("Net.SpdySessionsWithStalls", |
| 2874 stalled_streams_ > 0 ? 1 : 0, 2); | 2882 stalled_streams_ > 0 ? 1 : 0, 2); |
| 2875 | 2883 |
| 2876 if (received_settings_) { | 2884 if (received_settings_) { |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3107 if (!queue->empty()) { | 3115 if (!queue->empty()) { |
| 3108 SpdyStreamId stream_id = queue->front(); | 3116 SpdyStreamId stream_id = queue->front(); |
| 3109 queue->pop_front(); | 3117 queue->pop_front(); |
| 3110 return stream_id; | 3118 return stream_id; |
| 3111 } | 3119 } |
| 3112 } | 3120 } |
| 3113 return 0; | 3121 return 0; |
| 3114 } | 3122 } |
| 3115 | 3123 |
| 3116 } // namespace net | 3124 } // namespace net |
| OLD | NEW |