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

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

Issue 2801533002: Persist QUIC Broken State 0: change RecentlyBrokenAlternativeServies (Closed)
Patch Set: Address #4 Created 3 years, 8 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
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 <algorithm> 7 #include <algorithm>
8 #include <memory> 8 #include <memory>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 15 matching lines...) Expand all
26 const uint64_t kBrokenAlternativeProtocolDelaySecs = 300; 26 const uint64_t kBrokenAlternativeProtocolDelaySecs = 300;
27 // Subsequent failures result in exponential (base 2) backoff. 27 // Subsequent failures result in exponential (base 2) backoff.
28 // Limit binary shift to limit delay to approximately 2 days. 28 // Limit binary shift to limit delay to approximately 2 days.
29 const int kBrokenDelayMaxShift = 9; 29 const int kBrokenDelayMaxShift = 9;
30 30
31 } // namespace 31 } // namespace
32 32
33 HttpServerPropertiesImpl::HttpServerPropertiesImpl() 33 HttpServerPropertiesImpl::HttpServerPropertiesImpl()
34 : spdy_servers_map_(SpdyServersMap::NO_AUTO_EVICT), 34 : spdy_servers_map_(SpdyServersMap::NO_AUTO_EVICT),
35 alternative_service_map_(AlternativeServiceMap::NO_AUTO_EVICT), 35 alternative_service_map_(AlternativeServiceMap::NO_AUTO_EVICT),
36 recently_broken_alternative_services_(
37 RecentlyBrokenAlternativeServices::NO_AUTO_EVICT),
36 server_network_stats_map_(ServerNetworkStatsMap::NO_AUTO_EVICT), 38 server_network_stats_map_(ServerNetworkStatsMap::NO_AUTO_EVICT),
37 quic_server_info_map_(QuicServerInfoMap::NO_AUTO_EVICT), 39 quic_server_info_map_(QuicServerInfoMap::NO_AUTO_EVICT),
38 max_server_configs_stored_in_properties_(kMaxQuicServersToPersist), 40 max_server_configs_stored_in_properties_(kMaxQuicServersToPersist),
39 weak_ptr_factory_(this) { 41 weak_ptr_factory_(this) {
40 canonical_suffixes_.push_back(".ggpht.com"); 42 canonical_suffixes_.push_back(".ggpht.com");
41 canonical_suffixes_.push_back(".c.youtube.com"); 43 canonical_suffixes_.push_back(".c.youtube.com");
42 canonical_suffixes_.push_back(".googlevideo.com"); 44 canonical_suffixes_.push_back(".googlevideo.com");
43 canonical_suffixes_.push_back(".googleusercontent.com"); 45 canonical_suffixes_.push_back(".googleusercontent.com");
44 } 46 }
45 47
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after
447 } 449 }
448 450
449 void HttpServerPropertiesImpl::MarkAlternativeServiceBroken( 451 void HttpServerPropertiesImpl::MarkAlternativeServiceBroken(
450 const AlternativeService& alternative_service) { 452 const AlternativeService& alternative_service) {
451 // Empty host means use host of origin, callers are supposed to substitute. 453 // Empty host means use host of origin, callers are supposed to substitute.
452 DCHECK(!alternative_service.host.empty()); 454 DCHECK(!alternative_service.host.empty());
453 if (alternative_service.protocol == kProtoUnknown) { 455 if (alternative_service.protocol == kProtoUnknown) {
454 LOG(DFATAL) << "Trying to mark unknown alternate protocol broken."; 456 LOG(DFATAL) << "Trying to mark unknown alternate protocol broken.";
455 return; 457 return;
456 } 458 }
457 ++recently_broken_alternative_services_[alternative_service]; 459 auto it = recently_broken_alternative_services_.Get(alternative_service);
458 int shift = recently_broken_alternative_services_[alternative_service] - 1; 460 int shift = 0;
461 if (it == recently_broken_alternative_services_.end()) {
462 recently_broken_alternative_services_.Put(alternative_service, 1);
463 } else {
464 shift = it->second++;
465 }
459 if (shift > kBrokenDelayMaxShift) 466 if (shift > kBrokenDelayMaxShift)
460 shift = kBrokenDelayMaxShift; 467 shift = kBrokenDelayMaxShift;
461 base::TimeDelta delay = 468 base::TimeDelta delay =
462 base::TimeDelta::FromSeconds(kBrokenAlternativeProtocolDelaySecs); 469 base::TimeDelta::FromSeconds(kBrokenAlternativeProtocolDelaySecs);
463 base::TimeTicks when = base::TimeTicks::Now() + delay * (1 << shift); 470 base::TimeTicks when = base::TimeTicks::Now() + delay * (1 << shift);
464 auto result = broken_alternative_services_.insert( 471 auto result = broken_alternative_services_.insert(
465 std::make_pair(alternative_service, when)); 472 std::make_pair(alternative_service, when));
466 // Return if alternative service is already in expiration queue. 473 // Return if alternative service is already in expiration queue.
467 if (!result.second) { 474 if (!result.second) {
468 return; 475 return;
469 } 476 }
470 477
471 // If this is the only entry in the list, schedule an expiration task. 478 // If this is the only entry in the list, schedule an expiration task.
472 // Otherwise it will be rescheduled automatically when the pending task runs. 479 // Otherwise it will be rescheduled automatically when the pending task runs.
473 if (broken_alternative_services_.size() == 1) { 480 if (broken_alternative_services_.size() == 1) {
474 ScheduleBrokenAlternateProtocolMappingsExpiration(); 481 ScheduleBrokenAlternateProtocolMappingsExpiration();
475 } 482 }
476 } 483 }
477 484
478 void HttpServerPropertiesImpl::MarkAlternativeServiceRecentlyBroken( 485 void HttpServerPropertiesImpl::MarkAlternativeServiceRecentlyBroken(
479 const AlternativeService& alternative_service) { 486 const AlternativeService& alternative_service) {
480 if (!base::ContainsKey(recently_broken_alternative_services_, 487 if (recently_broken_alternative_services_.Get(alternative_service) ==
481 alternative_service)) 488 recently_broken_alternative_services_.end()) {
482 recently_broken_alternative_services_[alternative_service] = 1; 489 recently_broken_alternative_services_.Put(alternative_service, 1);
490 }
483 } 491 }
484 492
485 bool HttpServerPropertiesImpl::IsAlternativeServiceBroken( 493 bool HttpServerPropertiesImpl::IsAlternativeServiceBroken(
486 const AlternativeService& alternative_service) const { 494 const AlternativeService& alternative_service) const {
487 // Empty host means use host of origin, callers are supposed to substitute. 495 // Empty host means use host of origin, callers are supposed to substitute.
488 DCHECK(!alternative_service.host.empty()); 496 DCHECK(!alternative_service.host.empty());
489 return base::ContainsKey(broken_alternative_services_, alternative_service); 497 return base::ContainsKey(broken_alternative_services_, alternative_service);
490 } 498 }
491 499
492 bool HttpServerPropertiesImpl::WasAlternativeServiceRecentlyBroken( 500 bool HttpServerPropertiesImpl::WasAlternativeServiceRecentlyBroken(
493 const AlternativeService& alternative_service) { 501 const AlternativeService& alternative_service) {
494 if (alternative_service.protocol == kProtoUnknown) 502 if (alternative_service.protocol == kProtoUnknown)
495 return false; 503 return false;
496 return base::ContainsKey(recently_broken_alternative_services_, 504
497 alternative_service); 505 return recently_broken_alternative_services_.Get(alternative_service) !=
506 recently_broken_alternative_services_.end();
498 } 507 }
499 508
500 void HttpServerPropertiesImpl::ConfirmAlternativeService( 509 void HttpServerPropertiesImpl::ConfirmAlternativeService(
501 const AlternativeService& alternative_service) { 510 const AlternativeService& alternative_service) {
502 if (alternative_service.protocol == kProtoUnknown) 511 if (alternative_service.protocol == kProtoUnknown)
503 return; 512 return;
504 broken_alternative_services_.erase(alternative_service); 513 broken_alternative_services_.erase(alternative_service);
505 recently_broken_alternative_services_.erase(alternative_service); 514 auto it = recently_broken_alternative_services_.Get(alternative_service);
515 if (it != recently_broken_alternative_services_.end()) {
516 recently_broken_alternative_services_.Erase(it);
517 }
506 } 518 }
507 519
508 const AlternativeServiceMap& HttpServerPropertiesImpl::alternative_service_map() 520 const AlternativeServiceMap& HttpServerPropertiesImpl::alternative_service_map()
509 const { 521 const {
510 return alternative_service_map_; 522 return alternative_service_map_;
511 } 523 }
512 524
513 std::unique_ptr<base::Value> 525 std::unique_ptr<base::Value>
514 HttpServerPropertiesImpl::GetAlternativeServiceInfoAsValue() const { 526 HttpServerPropertiesImpl::GetAlternativeServiceInfoAsValue() const {
515 std::unique_ptr<base::ListValue> dict_list(new base::ListValue); 527 std::unique_ptr<base::ListValue> dict_list(new base::ListValue);
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
751 base::TimeDelta delay = when > now ? when - now : base::TimeDelta(); 763 base::TimeDelta delay = when > now ? when - now : base::TimeDelta();
752 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 764 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
753 FROM_HERE, 765 FROM_HERE,
754 base::Bind( 766 base::Bind(
755 &HttpServerPropertiesImpl::ExpireBrokenAlternateProtocolMappings, 767 &HttpServerPropertiesImpl::ExpireBrokenAlternateProtocolMappings,
756 weak_ptr_factory_.GetWeakPtr()), 768 weak_ptr_factory_.GetWeakPtr()),
757 delay); 769 delay);
758 } 770 }
759 771
760 } // namespace net 772 } // 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