Index: net/http/http_server_properties_impl.cc |
diff --git a/net/http/http_server_properties_impl.cc b/net/http/http_server_properties_impl.cc |
index f0489c8698671be4b62107d75724afec2fc16a8d..79c6e08dca802ef97d58f144b24b56e729df92c1 100644 |
--- a/net/http/http_server_properties_impl.cc |
+++ b/net/http/http_server_properties_impl.cc |
@@ -23,7 +23,11 @@ namespace net { |
namespace { |
+// Initial delay for broken alternative services. |
const uint64_t kBrokenAlternativeProtocolDelaySecs = 300; |
+// Subsequent failures result in exponential (base 2) backoff. |
+// Limit binary shift to limit delay to approximately 2 days. |
+const int kBrokenDelayMaxShift = 9; |
} // namespace |
@@ -472,10 +476,13 @@ void HttpServerPropertiesImpl::MarkAlternativeServiceBroken( |
LOG(DFATAL) << "Trying to mark unknown alternate protocol broken."; |
return; |
} |
- int count = ++recently_broken_alternative_services_[alternative_service]; |
+ ++recently_broken_alternative_services_[alternative_service]; |
+ int shift = recently_broken_alternative_services_[alternative_service] - 1; |
+ if (shift > kBrokenDelayMaxShift) |
+ shift = kBrokenDelayMaxShift; |
base::TimeDelta delay = |
base::TimeDelta::FromSeconds(kBrokenAlternativeProtocolDelaySecs); |
- base::TimeTicks when = base::TimeTicks::Now() + delay * (1 << (count - 1)); |
+ base::TimeTicks when = base::TimeTicks::Now() + delay * (1 << shift); |
auto result = broken_alternative_services_.insert( |
std::make_pair(alternative_service, when)); |
// Return if alternative service is already in expiration queue. |