Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(47)

Side by Side Diff: net/http/http_server_properties_impl.cc

Issue 182383016: HttpServerProperties - Implement MRU for AlternateProtocolMap. Persist (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Increment the iterator before calling Erase Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/http/http_server_properties_impl.h" 5 #include "net/http/http_server_properties_impl.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/memory/scoped_ptr.h" 8 #include "base/memory/scoped_ptr.h"
9 #include "base/stl_util.h" 9 #include "base/stl_util.h"
10 #include "base/strings/string_util.h" 10 #include "base/strings/string_util.h"
11 #include "base/strings/stringprintf.h" 11 #include "base/strings/stringprintf.h"
12 #include "net/http/http_pipelined_host_capability.h" 12 #include "net/http/http_pipelined_host_capability.h"
13 13
14 namespace net { 14 namespace net {
15 15
16 // TODO(simonjam): Run experiments with different values of this to see what 16 // TODO(simonjam): Run experiments with different values of this to see what
17 // value is good at avoiding evictions without eating too much memory. Until 17 // value is good at avoiding evictions without eating too much memory. Until
18 // then, this is just a bad guess. 18 // then, this is just a bad guess.
19 static const int kDefaultNumHostsToRemember = 200; 19 static const int kDefaultNumHostsToRemember = 200;
20 20
21 HttpServerPropertiesImpl::HttpServerPropertiesImpl() 21 HttpServerPropertiesImpl::HttpServerPropertiesImpl()
22 : pipeline_capability_map_( 22 : alternate_protocol_map_(new CachedAlternateProtocolMap(
23 CachedAlternateProtocolMap::NO_AUTO_EVICT)),
ramant (doing other things) 2014/03/05 00:01:30 rch: Should we keep fewer entries in the memory? A
24 pipeline_capability_map_(
23 new CachedPipelineCapabilityMap(kDefaultNumHostsToRemember)), 25 new CachedPipelineCapabilityMap(kDefaultNumHostsToRemember)),
24 weak_ptr_factory_(this) { 26 weak_ptr_factory_(this) {
25 canoncial_suffixes_.push_back(".c.youtube.com"); 27 canoncial_suffixes_.push_back(".c.youtube.com");
26 canoncial_suffixes_.push_back(".googlevideo.com"); 28 canoncial_suffixes_.push_back(".googlevideo.com");
27 } 29 }
28 30
29 HttpServerPropertiesImpl::~HttpServerPropertiesImpl() { 31 HttpServerPropertiesImpl::~HttpServerPropertiesImpl() {
30 } 32 }
31 33
32 void HttpServerPropertiesImpl::InitializeSpdyServers( 34 void HttpServerPropertiesImpl::InitializeSpdyServers(
33 std::vector<std::string>* spdy_servers, 35 std::vector<std::string>* spdy_servers,
34 bool support_spdy) { 36 bool support_spdy) {
35 DCHECK(CalledOnValidThread()); 37 DCHECK(CalledOnValidThread());
36 spdy_servers_table_.clear(); 38 spdy_servers_table_.clear();
37 if (!spdy_servers) 39 if (!spdy_servers)
38 return; 40 return;
39 for (std::vector<std::string>::iterator it = spdy_servers->begin(); 41 for (std::vector<std::string>::iterator it = spdy_servers->begin();
40 it != spdy_servers->end(); ++it) { 42 it != spdy_servers->end(); ++it) {
41 spdy_servers_table_[*it] = support_spdy; 43 spdy_servers_table_[*it] = support_spdy;
42 } 44 }
43 } 45 }
44 46
45 void HttpServerPropertiesImpl::InitializeAlternateProtocolServers( 47 void HttpServerPropertiesImpl::InitializeAlternateProtocolServers(
46 AlternateProtocolMap* alternate_protocol_map) { 48 AlternateProtocolMap* alternate_protocol_map) {
47 // First swap, and then add back all the ALTERNATE_PROTOCOL_BROKEN ones since 49 // Keep all the ALTERNATE_PROTOCOL_BROKEN ones since those don't
48 // those don't get persisted. 50 // get persisted.
49 alternate_protocol_map_.swap(*alternate_protocol_map); 51 for (CachedAlternateProtocolMap::iterator it =
52 alternate_protocol_map_->begin();
53 it != alternate_protocol_map_->end();) {
54 if (it->second.protocol != ALTERNATE_PROTOCOL_BROKEN) {
55 CachedAlternateProtocolMap::iterator old_it = it;
56 ++it;
57 alternate_protocol_map_->Erase(old_it);
58 } else {
59 ++it;
60 }
61 }
62
63 // Add the entries from persisted data.
50 for (AlternateProtocolMap::const_iterator it = 64 for (AlternateProtocolMap::const_iterator it =
51 alternate_protocol_map->begin(); 65 alternate_protocol_map->begin();
52 it != alternate_protocol_map->end(); ++it) { 66 it != alternate_protocol_map->end(); ++it) {
53 if (it->second.protocol == ALTERNATE_PROTOCOL_BROKEN) 67 alternate_protocol_map_->Put(it->first, it->second);
54 alternate_protocol_map_[it->first] = it->second;
55 } 68 }
69
56 // Attempt to find canonical servers. 70 // Attempt to find canonical servers.
57 int canonical_ports[] = { 80, 443 }; 71 int canonical_ports[] = { 80, 443 };
58 for (size_t i = 0; i < canoncial_suffixes_.size(); ++i) { 72 for (size_t i = 0; i < canoncial_suffixes_.size(); ++i) {
59 std::string canonical_suffix = canoncial_suffixes_[i]; 73 std::string canonical_suffix = canoncial_suffixes_[i];
60 for (size_t j = 0; j < arraysize(canonical_ports); ++j) { 74 for (size_t j = 0; j < arraysize(canonical_ports); ++j) {
61 HostPortPair canonical_host(canonical_suffix, canonical_ports[j]); 75 HostPortPair canonical_host(canonical_suffix, canonical_ports[j]);
62 // If we already have a valid canonical server, we're done. 76 // If we already have a valid canonical server, we're done.
63 if (ContainsKey(canonical_host_to_origin_map_, canonical_host) && 77 if (ContainsKey(canonical_host_to_origin_map_, canonical_host) &&
64 ContainsKey(alternate_protocol_map_, 78 (alternate_protocol_map_->Get(
65 canonical_host_to_origin_map_[canonical_host])) { 79 canonical_host_to_origin_map_[canonical_host]) !=
80 alternate_protocol_map_->end())) {
66 continue; 81 continue;
67 } 82 }
68 // Now attempt to find a server which matches this origin and set it as 83 // Now attempt to find a server which matches this origin and set it as
69 // canonical . 84 // canonical .
70 for (AlternateProtocolMap::const_iterator it = 85 for (CachedAlternateProtocolMap::const_iterator it =
71 alternate_protocol_map_.begin(); 86 alternate_protocol_map_->begin();
72 it != alternate_protocol_map_.end(); ++it) { 87 it != alternate_protocol_map_->end(); ++it) {
73 if (EndsWith(it->first.host(), canoncial_suffixes_[i], false)) { 88 if (EndsWith(it->first.host(), canoncial_suffixes_[i], false)) {
74 canonical_host_to_origin_map_[canonical_host] = it->first; 89 canonical_host_to_origin_map_[canonical_host] = it->first;
75 break; 90 break;
76 } 91 }
77 } 92 }
78 } 93 }
79 } 94 }
80 } 95 }
81 96
82 void HttpServerPropertiesImpl::InitializeSpdySettingsServers( 97 void HttpServerPropertiesImpl::InitializeSpdySettingsServers(
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 g_forced_alternate_protocol = NULL; 155 g_forced_alternate_protocol = NULL;
141 } 156 }
142 157
143 base::WeakPtr<HttpServerProperties> HttpServerPropertiesImpl::GetWeakPtr() { 158 base::WeakPtr<HttpServerProperties> HttpServerPropertiesImpl::GetWeakPtr() {
144 return weak_ptr_factory_.GetWeakPtr(); 159 return weak_ptr_factory_.GetWeakPtr();
145 } 160 }
146 161
147 void HttpServerPropertiesImpl::Clear() { 162 void HttpServerPropertiesImpl::Clear() {
148 DCHECK(CalledOnValidThread()); 163 DCHECK(CalledOnValidThread());
149 spdy_servers_table_.clear(); 164 spdy_servers_table_.clear();
150 alternate_protocol_map_.clear(); 165 alternate_protocol_map_->Clear();
151 spdy_settings_map_.clear(); 166 spdy_settings_map_.clear();
152 pipeline_capability_map_->Clear(); 167 pipeline_capability_map_->Clear();
153 } 168 }
154 169
155 bool HttpServerPropertiesImpl::SupportsSpdy( 170 bool HttpServerPropertiesImpl::SupportsSpdy(
156 const net::HostPortPair& host_port_pair) const { 171 const net::HostPortPair& host_port_pair) const {
157 DCHECK(CalledOnValidThread()); 172 DCHECK(CalledOnValidThread());
158 if (host_port_pair.host().empty()) 173 if (host_port_pair.host().empty())
159 return false; 174 return false;
160 std::string spdy_server = GetFlattenedSpdyServer(host_port_pair); 175 std::string spdy_server = GetFlattenedSpdyServer(host_port_pair);
(...skipping 18 matching lines...) Expand all
179 if ((spdy_host_port != spdy_servers_table_.end()) && 194 if ((spdy_host_port != spdy_servers_table_.end()) &&
180 (spdy_host_port->second == support_spdy)) { 195 (spdy_host_port->second == support_spdy)) {
181 return; 196 return;
182 } 197 }
183 // Cache the data. 198 // Cache the data.
184 spdy_servers_table_[spdy_server] = support_spdy; 199 spdy_servers_table_[spdy_server] = support_spdy;
185 } 200 }
186 201
187 bool HttpServerPropertiesImpl::HasAlternateProtocol( 202 bool HttpServerPropertiesImpl::HasAlternateProtocol(
188 const HostPortPair& server) const { 203 const HostPortPair& server) const {
189 if (ContainsKey(alternate_protocol_map_, server) || 204 if (alternate_protocol_map_->Get(server) != alternate_protocol_map_->end() ||
190 g_forced_alternate_protocol) 205 g_forced_alternate_protocol)
191 return true; 206 return true;
192 207
193 return GetCanonicalHost(server) != canonical_host_to_origin_map_.end(); 208 return GetCanonicalHost(server) != canonical_host_to_origin_map_.end();
194 } 209 }
195 210
196 PortAlternateProtocolPair 211 PortAlternateProtocolPair
197 HttpServerPropertiesImpl::GetAlternateProtocol( 212 HttpServerPropertiesImpl::GetAlternateProtocol(
198 const HostPortPair& server) const { 213 const HostPortPair& server) const {
199 DCHECK(HasAlternateProtocol(server)); 214 DCHECK(HasAlternateProtocol(server));
200 215
201 // First check the map. 216 // First check the map.
202 AlternateProtocolMap::const_iterator it = 217 CachedAlternateProtocolMap::const_iterator it =
203 alternate_protocol_map_.find(server); 218 alternate_protocol_map_->Get(server);
204 if (it != alternate_protocol_map_.end()) 219 if (it != alternate_protocol_map_->end())
205 return it->second; 220 return it->second;
206 221
207 // Next check the canonical host. 222 // Next check the canonical host.
208 CanonicalHostMap::const_iterator canonical_host = GetCanonicalHost(server); 223 CanonicalHostMap::const_iterator canonical_host = GetCanonicalHost(server);
209 if (canonical_host != canonical_host_to_origin_map_.end()) 224 if (canonical_host != canonical_host_to_origin_map_.end())
210 return alternate_protocol_map_.find(canonical_host->second)->second; 225 return alternate_protocol_map_->Get(canonical_host->second)->second;
211 226
212 // We must be forcing an alternate. 227 // We must be forcing an alternate.
213 DCHECK(g_forced_alternate_protocol); 228 DCHECK(g_forced_alternate_protocol);
214 return *g_forced_alternate_protocol; 229 return *g_forced_alternate_protocol;
215 } 230 }
216 231
217 void HttpServerPropertiesImpl::SetAlternateProtocol( 232 void HttpServerPropertiesImpl::SetAlternateProtocol(
218 const HostPortPair& server, 233 const HostPortPair& server,
219 uint16 alternate_port, 234 uint16 alternate_port,
220 AlternateProtocol alternate_protocol) { 235 AlternateProtocol alternate_protocol) {
(...skipping 19 matching lines...) Expand all
240 LOG(WARNING) << "Changing the alternate protocol for: " 255 LOG(WARNING) << "Changing the alternate protocol for: "
241 << server.ToString() 256 << server.ToString()
242 << " from [Port: " << existing_alternate.port 257 << " from [Port: " << existing_alternate.port
243 << ", Protocol: " << existing_alternate.protocol 258 << ", Protocol: " << existing_alternate.protocol
244 << "] to [Port: " << alternate_port 259 << "] to [Port: " << alternate_port
245 << ", Protocol: " << alternate_protocol 260 << ", Protocol: " << alternate_protocol
246 << "]."; 261 << "].";
247 } 262 }
248 } 263 }
249 264
250 alternate_protocol_map_[server] = alternate; 265 alternate_protocol_map_->Put(server, alternate);
251 266
252 // If this host ends with a canonical suffix, then set it as the 267 // If this host ends with a canonical suffix, then set it as the
253 // canonical host. 268 // canonical host.
254 for (size_t i = 0; i < canoncial_suffixes_.size(); ++i) { 269 for (size_t i = 0; i < canoncial_suffixes_.size(); ++i) {
255 std::string canonical_suffix = canoncial_suffixes_[i]; 270 std::string canonical_suffix = canoncial_suffixes_[i];
256 if (EndsWith(server.host(), canoncial_suffixes_[i], false)) { 271 if (EndsWith(server.host(), canoncial_suffixes_[i], false)) {
257 HostPortPair canonical_host(canonical_suffix, server.port()); 272 HostPortPair canonical_host(canonical_suffix, server.port());
258 canonical_host_to_origin_map_[canonical_host] = server; 273 canonical_host_to_origin_map_[canonical_host] = server;
259 break; 274 break;
260 } 275 }
261 } 276 }
262 } 277 }
263 278
264 void HttpServerPropertiesImpl::SetBrokenAlternateProtocol( 279 void HttpServerPropertiesImpl::SetBrokenAlternateProtocol(
265 const HostPortPair& server) { 280 const HostPortPair& server) {
266 alternate_protocol_map_[server].protocol = ALTERNATE_PROTOCOL_BROKEN; 281 CachedAlternateProtocolMap::iterator it =
282 alternate_protocol_map_->Get(server);
283 if (it != alternate_protocol_map_->end()) {
284 it->second.protocol = ALTERNATE_PROTOCOL_BROKEN;
285 return;
286 }
287 PortAlternateProtocolPair alternate;
288 alternate.protocol = ALTERNATE_PROTOCOL_BROKEN;
289 alternate_protocol_map_->Put(server, alternate);
267 } 290 }
268 291
269 const AlternateProtocolMap& 292 AlternateProtocolMap
270 HttpServerPropertiesImpl::alternate_protocol_map() const { 293 HttpServerPropertiesImpl::GetAlternateProtocolMap() const {
271 return alternate_protocol_map_; 294 AlternateProtocolMap result;
295 CachedAlternateProtocolMap::const_iterator it;
296 for (it = alternate_protocol_map_->begin();
297 it != alternate_protocol_map_->end(); ++it) {
298 result[it->first] = it->second;
299 }
300 return result;
272 } 301 }
273 302
274 const SettingsMap& HttpServerPropertiesImpl::GetSpdySettings( 303 const SettingsMap& HttpServerPropertiesImpl::GetSpdySettings(
275 const HostPortPair& host_port_pair) const { 304 const HostPortPair& host_port_pair) const {
276 SpdySettingsMap::const_iterator it = spdy_settings_map_.find(host_port_pair); 305 SpdySettingsMap::const_iterator it = spdy_settings_map_.find(host_port_pair);
277 if (it == spdy_settings_map_.end()) { 306 if (it == spdy_settings_map_.end()) {
278 CR_DEFINE_STATIC_LOCAL(SettingsMap, kEmptySettingsMap, ()); 307 CR_DEFINE_STATIC_LOCAL(SettingsMap, kEmptySettingsMap, ());
279 return kEmptySettingsMap; 308 return kEmptySettingsMap;
280 } 309 }
281 return it->second; 310 return it->second;
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 if (EndsWith(server.host(), canoncial_suffixes_[i], false)) { 399 if (EndsWith(server.host(), canoncial_suffixes_[i], false)) {
371 HostPortPair canonical_host(canonical_suffix, server.port()); 400 HostPortPair canonical_host(canonical_suffix, server.port());
372 return canonical_host_to_origin_map_.find(canonical_host); 401 return canonical_host_to_origin_map_.find(canonical_host);
373 } 402 }
374 } 403 }
375 404
376 return canonical_host_to_origin_map_.end(); 405 return canonical_host_to_origin_map_.end();
377 } 406 }
378 407
379 } // namespace net 408 } // namespace net
OLDNEW
« net/http/http_server_properties_impl.h ('K') | « net/http/http_server_properties_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698