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

Unified Diff: net/http/broken_alternative_services.cc

Issue 2917913002: Add getters and setters for BrokenAlternativeService's list of broken and recently-broken alt svcs (Closed)
Patch Set: Fixed entry override logic in SetBrokenAndRecentlyBrokenAlternativeServices() Created 3 years, 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/http/broken_alternative_services.h ('k') | net/http/broken_alternative_services_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/http/broken_alternative_services.cc
diff --git a/net/http/broken_alternative_services.cc b/net/http/broken_alternative_services.cc
index d660f25c06d860ea26586dda5c3811b4a7b6568c..5e2d88d387193362f3bcb9c82fed3b8e3ced1061 100644
--- a/net/http/broken_alternative_services.cc
+++ b/net/http/broken_alternative_services.cc
@@ -114,6 +114,90 @@ void BrokenAlternativeServices::ConfirmAlternativeService(
}
}
+const BrokenAlternativeServiceList&
+BrokenAlternativeServices::broken_alternative_service_list() const {
+ return broken_alternative_service_list_;
+}
+
+const RecentlyBrokenAlternativeServices&
+BrokenAlternativeServices::recently_broken_alternative_services() const {
+ return recently_broken_alternative_services_;
+}
+
+void BrokenAlternativeServices::SetBrokenAndRecentlyBrokenAlternativeServices(
+ std::unique_ptr<BrokenAlternativeServiceList>
+ broken_alternative_service_list,
+ std::unique_ptr<RecentlyBrokenAlternativeServices>
+ recently_broken_alternative_services) {
+ DCHECK(broken_alternative_service_list);
+ DCHECK(recently_broken_alternative_services);
+
+ // Make sure all alt svcs in |broken_alternative_service_list| has an entry
+ // in |recently_broken_alternative_services|
+ for (const auto& pair : *broken_alternative_service_list) {
+ DCHECK(recently_broken_alternative_services->Peek(pair.first) !=
+ recently_broken_alternative_services->end());
+ }
+
+ base::TimeTicks next_expiration =
+ broken_alternative_service_list_.empty()
+ ? base::TimeTicks::Max()
+ : broken_alternative_service_list_.front().second;
+
+ // Add recently broken alt svcs to |recently_broken_alternative_services_|.
+ // If an alt-svc already exists, update its broken-count to the one provided
+ // in |recently_broken_alternative_services|.
+
+ recently_broken_alternative_services_.Swap(
+ *recently_broken_alternative_services);
+ // Add back all existing recently broken alt svcs to cache so they're at
+ // front of recency list (MRUCache::Get() does this automatically).
+ for (auto it = recently_broken_alternative_services->rbegin();
+ it != recently_broken_alternative_services->rend(); ++it) {
+ if (recently_broken_alternative_services_.Get(it->first) ==
+ recently_broken_alternative_services_.end()) {
+ recently_broken_alternative_services_.Put(it->first, it->second);
+ }
+ }
+
+ // Add broken alt svcs to |broken_alternative_service_map_|. If an entry
+ // already exists, delete its corresponding entry in
+ // |broken_alternative_service_list_| and update its map entry to point to
+ // its position in |broken_alternative_service_list|.
Zhongyi Shi 2017/06/12 23:20:38 This method has no guarantee on when it will be ca
wangyix1 2017/06/13 01:17:46 If some data exists in both cache and disk, I curr
Zhongyi Shi 2017/06/13 21:45:22 Urm, I don't think we could assume before disk loa
Ryan Hamilton 2017/06/19 17:05:35 I think we should be consistent with the behavior
wangyix1 2017/06/19 19:47:35 The other setters in HttpServerPropertiesImpl() al
+ for (auto it = broken_alternative_service_list->begin();
+ it != broken_alternative_service_list->end(); ++it) {
+ const AlternativeService& alternative_service = it->first;
+ auto map_it = broken_alternative_service_map_.find(alternative_service);
+ if (map_it != broken_alternative_service_map_.end()) {
+ broken_alternative_service_list_.erase(map_it->second);
+ map_it->second = it;
+ } else {
+ broken_alternative_service_map_.insert(
+ std::make_pair(alternative_service, it));
+ }
+ }
+
+ // Merge |broken_alternative_service_list| with
+ // |broken_alternative_service_list_|. Both should already be sorted by
+ // expiration time. std::list::merge() will not invalidate any iterators
+ // of either list, so all iterators in |broken_alternative_service_map_|
+ // remain valid.
+ broken_alternative_service_list_.merge(
+ *broken_alternative_service_list,
+ [](const std::pair<AlternativeService, base::TimeTicks>& lhs,
+ const std::pair<AlternativeService, base::TimeTicks>& rhs) -> bool {
+ return lhs.second < rhs.second;
+ });
+
+ base::TimeTicks new_next_expiration =
+ broken_alternative_service_list_.empty()
+ ? base::TimeTicks::Max()
+ : broken_alternative_service_list_.front().second;
+
+ if (new_next_expiration != next_expiration)
+ ScheduleBrokenAlternateProtocolMappingsExpiration();
+}
+
bool BrokenAlternativeServices::AddToBrokenAlternativeServiceListAndMap(
const AlternativeService& alternative_service,
base::TimeTicks expiration,
@@ -129,7 +213,7 @@ bool BrokenAlternativeServices::AddToBrokenAlternativeServiceListAndMap(
auto list_it = broken_alternative_service_list_.end();
while (list_it != broken_alternative_service_list_.begin()) {
--list_it;
- if (list_it->expiration <= expiration) {
+ if (list_it->second <= expiration) {
++list_it;
break;
}
@@ -137,7 +221,7 @@ bool BrokenAlternativeServices::AddToBrokenAlternativeServiceListAndMap(
// Insert |alternative_service| into the list and the map
list_it = broken_alternative_service_list_.insert(
- list_it, BrokenAltSvcExpireInfo(alternative_service, expiration));
+ list_it, std::make_pair(alternative_service, expiration));
broken_alternative_service_map_.insert(
std::make_pair(alternative_service, list_it));
@@ -150,13 +234,13 @@ void BrokenAlternativeServices::ExpireBrokenAlternateProtocolMappings() {
while (!broken_alternative_service_list_.empty()) {
auto it = broken_alternative_service_list_.begin();
- if (now < it->expiration) {
+ if (now < it->second) {
break;
}
- delegate_->OnExpireBrokenAlternativeService(it->alternative_service);
+ delegate_->OnExpireBrokenAlternativeService(it->first);
- broken_alternative_service_map_.erase(it->alternative_service);
+ broken_alternative_service_map_.erase(it->first);
broken_alternative_service_list_.erase(it);
}
@@ -168,7 +252,7 @@ void BrokenAlternativeServices ::
ScheduleBrokenAlternateProtocolMappingsExpiration() {
DCHECK(!broken_alternative_service_list_.empty());
base::TimeTicks now = clock_->NowTicks();
- base::TimeTicks when = broken_alternative_service_list_.front().expiration;
+ base::TimeTicks when = broken_alternative_service_list_.front().second;
base::TimeDelta delay = when > now ? when - now : base::TimeDelta();
expiration_timer_.Stop();
expiration_timer_.Start(
« no previous file with comments | « net/http/broken_alternative_services.h ('k') | net/http/broken_alternative_services_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698