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

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: Used MRUCache for AlternateProtocolMap. 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_(AlternateProtocolMap::NO_AUTO_EVICT),
Ryan Hamilton 2014/03/05 17:51:22 With NO_AUTO_EVICT, this means the in-memory map w
ramant (doing other things) 2014/03/05 22:43:22 I went back and forth on the above. The current im
Ryan Hamilton 2014/03/05 23:10:20 SGTM. We can revisit this at any point.
23 pipeline_capability_map_(
23 new CachedPipelineCapabilityMap(kDefaultNumHostsToRemember)), 24 new CachedPipelineCapabilityMap(kDefaultNumHostsToRemember)),
24 weak_ptr_factory_(this) { 25 weak_ptr_factory_(this) {
25 canoncial_suffixes_.push_back(".c.youtube.com"); 26 canoncial_suffixes_.push_back(".c.youtube.com");
26 canoncial_suffixes_.push_back(".googlevideo.com"); 27 canoncial_suffixes_.push_back(".googlevideo.com");
27 } 28 }
28 29
29 HttpServerPropertiesImpl::~HttpServerPropertiesImpl() { 30 HttpServerPropertiesImpl::~HttpServerPropertiesImpl() {
30 } 31 }
31 32
32 void HttpServerPropertiesImpl::InitializeSpdyServers( 33 void HttpServerPropertiesImpl::InitializeSpdyServers(
33 std::vector<std::string>* spdy_servers, 34 std::vector<std::string>* spdy_servers,
34 bool support_spdy) { 35 bool support_spdy) {
35 DCHECK(CalledOnValidThread()); 36 DCHECK(CalledOnValidThread());
36 spdy_servers_table_.clear(); 37 spdy_servers_table_.clear();
37 if (!spdy_servers) 38 if (!spdy_servers)
38 return; 39 return;
39 for (std::vector<std::string>::iterator it = spdy_servers->begin(); 40 for (std::vector<std::string>::iterator it = spdy_servers->begin();
40 it != spdy_servers->end(); ++it) { 41 it != spdy_servers->end(); ++it) {
41 spdy_servers_table_[*it] = support_spdy; 42 spdy_servers_table_[*it] = support_spdy;
42 } 43 }
43 } 44 }
44 45
45 void HttpServerPropertiesImpl::InitializeAlternateProtocolServers( 46 void HttpServerPropertiesImpl::InitializeAlternateProtocolServers(
46 AlternateProtocolMap* alternate_protocol_map) { 47 AlternateProtocolMap* alternate_protocol_map) {
47 // First swap, and then add back all the ALTERNATE_PROTOCOL_BROKEN ones since 48 // Keep all the ALTERNATE_PROTOCOL_BROKEN ones since those don't
48 // those don't get persisted. 49 // get persisted.
49 alternate_protocol_map_.swap(*alternate_protocol_map); 50 for (AlternateProtocolMap::iterator it = alternate_protocol_map_.begin();
51 it != alternate_protocol_map_.end();) {
52 if (it->second.protocol != ALTERNATE_PROTOCOL_BROKEN) {
53 AlternateProtocolMap::iterator old_it = it;
54 ++it;
55 alternate_protocol_map_.Erase(old_it);
56 } else {
57 ++it;
58 }
Ryan Hamilton 2014/03/05 17:51:22 alternatively: AlternateProtocolMap::iterator old
ramant (doing other things) 2014/03/05 22:43:22 Done.
59 }
Ryan Hamilton 2014/03/05 17:51:22 I take it there is no swap() method in MRUCache?
ramant (doing other things) 2014/03/05 22:43:22 Correct.
60
61 // Add the entries from persisted data.
50 for (AlternateProtocolMap::const_iterator it = 62 for (AlternateProtocolMap::const_iterator it =
51 alternate_protocol_map->begin(); 63 alternate_protocol_map->begin();
52 it != alternate_protocol_map->end(); ++it) { 64 it != alternate_protocol_map->end(); ++it) {
53 if (it->second.protocol == ALTERNATE_PROTOCOL_BROKEN) 65 alternate_protocol_map_.Put(it->first, it->second);
54 alternate_protocol_map_[it->first] = it->second;
55 } 66 }
67
56 // Attempt to find canonical servers. 68 // Attempt to find canonical servers.
57 int canonical_ports[] = { 80, 443 }; 69 int canonical_ports[] = { 80, 443 };
58 for (size_t i = 0; i < canoncial_suffixes_.size(); ++i) { 70 for (size_t i = 0; i < canoncial_suffixes_.size(); ++i) {
59 std::string canonical_suffix = canoncial_suffixes_[i]; 71 std::string canonical_suffix = canoncial_suffixes_[i];
60 for (size_t j = 0; j < arraysize(canonical_ports); ++j) { 72 for (size_t j = 0; j < arraysize(canonical_ports); ++j) {
61 HostPortPair canonical_host(canonical_suffix, canonical_ports[j]); 73 HostPortPair canonical_host(canonical_suffix, canonical_ports[j]);
62 // If we already have a valid canonical server, we're done. 74 // If we already have a valid canonical server, we're done.
63 if (ContainsKey(canonical_host_to_origin_map_, canonical_host) && 75 if (ContainsKey(canonical_host_to_origin_map_, canonical_host) &&
64 ContainsKey(alternate_protocol_map_, 76 (alternate_protocol_map_.Get(canonical_host_to_origin_map_[
65 canonical_host_to_origin_map_[canonical_host])) { 77 canonical_host]) != alternate_protocol_map_.end())) {
66 continue; 78 continue;
67 } 79 }
68 // Now attempt to find a server which matches this origin and set it as 80 // Now attempt to find a server which matches this origin and set it as
69 // canonical . 81 // canonical .
70 for (AlternateProtocolMap::const_iterator it = 82 for (AlternateProtocolMap::const_iterator it =
71 alternate_protocol_map_.begin(); 83 alternate_protocol_map_.begin();
72 it != alternate_protocol_map_.end(); ++it) { 84 it != alternate_protocol_map_.end(); ++it) {
73 if (EndsWith(it->first.host(), canoncial_suffixes_[i], false)) { 85 if (EndsWith(it->first.host(), canoncial_suffixes_[i], false)) {
74 canonical_host_to_origin_map_[canonical_host] = it->first; 86 canonical_host_to_origin_map_[canonical_host] = it->first;
75 break; 87 break;
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 g_forced_alternate_protocol = NULL; 152 g_forced_alternate_protocol = NULL;
141 } 153 }
142 154
143 base::WeakPtr<HttpServerProperties> HttpServerPropertiesImpl::GetWeakPtr() { 155 base::WeakPtr<HttpServerProperties> HttpServerPropertiesImpl::GetWeakPtr() {
144 return weak_ptr_factory_.GetWeakPtr(); 156 return weak_ptr_factory_.GetWeakPtr();
145 } 157 }
146 158
147 void HttpServerPropertiesImpl::Clear() { 159 void HttpServerPropertiesImpl::Clear() {
148 DCHECK(CalledOnValidThread()); 160 DCHECK(CalledOnValidThread());
149 spdy_servers_table_.clear(); 161 spdy_servers_table_.clear();
150 alternate_protocol_map_.clear(); 162 alternate_protocol_map_.Clear();
151 spdy_settings_map_.clear(); 163 spdy_settings_map_.clear();
152 pipeline_capability_map_->Clear(); 164 pipeline_capability_map_->Clear();
153 } 165 }
154 166
155 bool HttpServerPropertiesImpl::SupportsSpdy( 167 bool HttpServerPropertiesImpl::SupportsSpdy(
156 const net::HostPortPair& host_port_pair) const { 168 const net::HostPortPair& host_port_pair) const {
157 DCHECK(CalledOnValidThread()); 169 DCHECK(CalledOnValidThread());
158 if (host_port_pair.host().empty()) 170 if (host_port_pair.host().empty())
159 return false; 171 return false;
160 std::string spdy_server = GetFlattenedSpdyServer(host_port_pair); 172 std::string spdy_server = GetFlattenedSpdyServer(host_port_pair);
(...skipping 17 matching lines...) Expand all
178 spdy_servers_table_.find(spdy_server); 190 spdy_servers_table_.find(spdy_server);
179 if ((spdy_host_port != spdy_servers_table_.end()) && 191 if ((spdy_host_port != spdy_servers_table_.end()) &&
180 (spdy_host_port->second == support_spdy)) { 192 (spdy_host_port->second == support_spdy)) {
181 return; 193 return;
182 } 194 }
183 // Cache the data. 195 // Cache the data.
184 spdy_servers_table_[spdy_server] = support_spdy; 196 spdy_servers_table_[spdy_server] = support_spdy;
185 } 197 }
186 198
187 bool HttpServerPropertiesImpl::HasAlternateProtocol( 199 bool HttpServerPropertiesImpl::HasAlternateProtocol(
188 const HostPortPair& server) const { 200 const HostPortPair& server) {
189 if (ContainsKey(alternate_protocol_map_, server) || 201 if (alternate_protocol_map_.Get(server) != alternate_protocol_map_.end() ||
190 g_forced_alternate_protocol) 202 g_forced_alternate_protocol)
191 return true; 203 return true;
192 204
193 return GetCanonicalHost(server) != canonical_host_to_origin_map_.end(); 205 return GetCanonicalHost(server) != canonical_host_to_origin_map_.end();
194 } 206 }
195 207
196 PortAlternateProtocolPair 208 PortAlternateProtocolPair
197 HttpServerPropertiesImpl::GetAlternateProtocol( 209 HttpServerPropertiesImpl::GetAlternateProtocol(
198 const HostPortPair& server) const { 210 const HostPortPair& server) {
199 DCHECK(HasAlternateProtocol(server)); 211 DCHECK(HasAlternateProtocol(server));
200 212
201 // First check the map. 213 // First check the map.
202 AlternateProtocolMap::const_iterator it = 214 AlternateProtocolMap::iterator it = alternate_protocol_map_.Get(server);
203 alternate_protocol_map_.find(server);
204 if (it != alternate_protocol_map_.end()) 215 if (it != alternate_protocol_map_.end())
205 return it->second; 216 return it->second;
206 217
207 // Next check the canonical host. 218 // Next check the canonical host.
208 CanonicalHostMap::const_iterator canonical_host = GetCanonicalHost(server); 219 CanonicalHostMap::const_iterator canonical_host = GetCanonicalHost(server);
209 if (canonical_host != canonical_host_to_origin_map_.end()) 220 if (canonical_host != canonical_host_to_origin_map_.end())
210 return alternate_protocol_map_.find(canonical_host->second)->second; 221 return alternate_protocol_map_.Get(canonical_host->second)->second;
211 222
212 // We must be forcing an alternate. 223 // We must be forcing an alternate.
213 DCHECK(g_forced_alternate_protocol); 224 DCHECK(g_forced_alternate_protocol);
214 return *g_forced_alternate_protocol; 225 return *g_forced_alternate_protocol;
215 } 226 }
216 227
217 void HttpServerPropertiesImpl::SetAlternateProtocol( 228 void HttpServerPropertiesImpl::SetAlternateProtocol(
218 const HostPortPair& server, 229 const HostPortPair& server,
219 uint16 alternate_port, 230 uint16 alternate_port,
220 AlternateProtocol alternate_protocol) { 231 AlternateProtocol alternate_protocol) {
(...skipping 19 matching lines...) Expand all
240 LOG(WARNING) << "Changing the alternate protocol for: " 251 LOG(WARNING) << "Changing the alternate protocol for: "
241 << server.ToString() 252 << server.ToString()
242 << " from [Port: " << existing_alternate.port 253 << " from [Port: " << existing_alternate.port
243 << ", Protocol: " << existing_alternate.protocol 254 << ", Protocol: " << existing_alternate.protocol
244 << "] to [Port: " << alternate_port 255 << "] to [Port: " << alternate_port
245 << ", Protocol: " << alternate_protocol 256 << ", Protocol: " << alternate_protocol
246 << "]."; 257 << "].";
247 } 258 }
248 } 259 }
249 260
250 alternate_protocol_map_[server] = alternate; 261 alternate_protocol_map_.Put(server, alternate);
251 262
252 // If this host ends with a canonical suffix, then set it as the 263 // If this host ends with a canonical suffix, then set it as the
253 // canonical host. 264 // canonical host.
254 for (size_t i = 0; i < canoncial_suffixes_.size(); ++i) { 265 for (size_t i = 0; i < canoncial_suffixes_.size(); ++i) {
255 std::string canonical_suffix = canoncial_suffixes_[i]; 266 std::string canonical_suffix = canoncial_suffixes_[i];
256 if (EndsWith(server.host(), canoncial_suffixes_[i], false)) { 267 if (EndsWith(server.host(), canoncial_suffixes_[i], false)) {
257 HostPortPair canonical_host(canonical_suffix, server.port()); 268 HostPortPair canonical_host(canonical_suffix, server.port());
258 canonical_host_to_origin_map_[canonical_host] = server; 269 canonical_host_to_origin_map_[canonical_host] = server;
259 break; 270 break;
260 } 271 }
261 } 272 }
262 } 273 }
263 274
264 void HttpServerPropertiesImpl::SetBrokenAlternateProtocol( 275 void HttpServerPropertiesImpl::SetBrokenAlternateProtocol(
265 const HostPortPair& server) { 276 const HostPortPair& server) {
266 alternate_protocol_map_[server].protocol = ALTERNATE_PROTOCOL_BROKEN; 277 AlternateProtocolMap::iterator it = alternate_protocol_map_.Get(server);
278 if (it != alternate_protocol_map_.end()) {
279 it->second.protocol = ALTERNATE_PROTOCOL_BROKEN;
280 return;
281 }
282 PortAlternateProtocolPair alternate;
283 alternate.protocol = ALTERNATE_PROTOCOL_BROKEN;
284 alternate_protocol_map_.Put(server, alternate);
267 } 285 }
268 286
269 const AlternateProtocolMap& 287 const AlternateProtocolMap&
270 HttpServerPropertiesImpl::alternate_protocol_map() const { 288 HttpServerPropertiesImpl::alternate_protocol_map() const {
271 return alternate_protocol_map_; 289 return alternate_protocol_map_;
272 } 290 }
273 291
274 const SettingsMap& HttpServerPropertiesImpl::GetSpdySettings( 292 const SettingsMap& HttpServerPropertiesImpl::GetSpdySettings(
275 const HostPortPair& host_port_pair) const { 293 const HostPortPair& host_port_pair) const {
276 SpdySettingsMap::const_iterator it = spdy_settings_map_.find(host_port_pair); 294 SpdySettingsMap::const_iterator it = spdy_settings_map_.find(host_port_pair);
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 if (EndsWith(server.host(), canoncial_suffixes_[i], false)) { 388 if (EndsWith(server.host(), canoncial_suffixes_[i], false)) {
371 HostPortPair canonical_host(canonical_suffix, server.port()); 389 HostPortPair canonical_host(canonical_suffix, server.port());
372 return canonical_host_to_origin_map_.find(canonical_host); 390 return canonical_host_to_origin_map_.find(canonical_host);
373 } 391 }
374 } 392 }
375 393
376 return canonical_host_to_origin_map_.end(); 394 return canonical_host_to_origin_map_.end();
377 } 395 }
378 396
379 } // namespace net 397 } // namespace net
OLDNEW
« no previous file with comments | « net/http/http_server_properties_impl.h ('k') | net/http/http_server_properties_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698