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..b26a08321a134b6179eb1914a982947b2a38bf73 100644 |
--- a/net/http/broken_alternative_services.cc |
+++ b/net/http/broken_alternative_services.cc |
@@ -114,6 +114,75 @@ 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::AddBrokenAndRecentlyBrokenAlternativeServices( |
+ std::unique_ptr<BrokenAlternativeServiceList> |
+ broken_alternative_service_list, |
+ std::unique_ptr<RecentlyBrokenAlternativeServices> |
+ 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()); |
+ } |
Zhongyi Shi
2017/06/02 18:19:44
|recently_broken_alternative_services| is an MRUCa
wangyix1
2017/06/05 19:16:25
No, Peek() does not modify the recency list, unlik
Zhongyi Shi
2017/06/06 22:17:49
I miss-read the code, yeah, Peek() should be fine.
wangyix1
2017/06/09 19:26:40
Acknowledged.
|
+ |
+ 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. |
Zhongyi Shi
2017/06/02 18:19:44
I might lose some context but why those existing r
wangyix1
2017/06/05 19:16:24
It's not clear from the name, but this method will
|
+ 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_|. Remove all |
+ // that already exist in the map. |
+ auto it = broken_alternative_service_list->begin(); |
+ while (it != broken_alternative_service_list->end()) { |
+ const AlternativeService& alternative_service = it->first; |
+ if (broken_alternative_service_map_.find(alternative_service) == |
+ broken_alternative_service_map_.end()) { |
+ broken_alternative_service_map_.insert( |
+ std::make_pair(alternative_service, it)); |
+ ++it; |
+ } else { |
+ broken_alternative_service_list->erase(it++); |
+ } |
+ } |
+ |
+ // Merge |broken_alternative_service_list| with |
+ // |broken_alternative_service_list_|. Both should already be sorted by |
+ // expiration time. |
+ bool schedule_expiration = |
+ (!broken_alternative_service_list->empty() && |
+ (broken_alternative_service_list_.empty() || |
+ broken_alternative_service_list->front().second < |
+ broken_alternative_service_list_.front().second)); |
+ |
+ 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; |
+ }); |
+ |
+ if (schedule_expiration) |
+ ScheduleBrokenAlternateProtocolMappingsExpiration(); |
+} |
+ |
bool BrokenAlternativeServices::AddToBrokenAlternativeServiceListAndMap( |
const AlternativeService& alternative_service, |
base::TimeTicks expiration, |
@@ -129,7 +198,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 +206,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 +219,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 +237,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( |