diff options
author | mef@chromium.org <mef@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-29 21:53:10 +0000 |
---|---|---|
committer | mef@chromium.org <mef@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-29 21:53:10 +0000 |
commit | a144bd29d917b7818caf202cd7da0fe9f18f0a97 (patch) | |
tree | 9039c02b0b2970827d1c50501702996e4e848a07 | |
parent | 1120cd085be7b5212bd80aad38b5e5687065688b (diff) | |
download | chromium_src-a144bd29d917b7818caf202cd7da0fe9f18f0a97.zip chromium_src-a144bd29d917b7818caf202cd7da0fe9f18f0a97.tar.gz chromium_src-a144bd29d917b7818caf202cd7da0fe9f18f0a97.tar.bz2 |
Use Histogram algorithm to calculate DNS timeout.
Honor DnsConfig timeout if it exceeds 5s.
BUG=110197
TEST=net_unittests --gtest_filter=DnsSessionTest.HistogramTimeout*
Review URL: https://chromiumcodereview.appspot.com/20482002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@214235 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | net/dns/dns_session.cc | 18 | ||||
-rw-r--r-- | net/dns/dns_session_unittest.cc | 25 |
2 files changed, 30 insertions, 13 deletions
diff --git a/net/dns/dns_session.cc b/net/dns/dns_session.cc index 67d5779..ea8b6a1 100644 --- a/net/dns/dns_session.cc +++ b/net/dns/dns_session.cc @@ -38,6 +38,8 @@ struct DnsSession::ServerStats { ServerStats(base::TimeDelta rtt_estimate_param, RttBuckets* buckets) : last_failure_count(0), rtt_estimate(rtt_estimate_param) { rtt_histogram.reset(new base::SampleVector(buckets)); + // Seed histogram with 2 samples at |rtt_estimate| timeout. + rtt_histogram->Accumulate(rtt_estimate.InMilliseconds(), 2); } // Count of consecutive failures after last success. @@ -209,18 +211,10 @@ void DnsSession::RecordServerStats() { base::TimeDelta DnsSession::NextTimeout(unsigned server_index, int attempt) { - DCHECK_LT(server_index, server_stats_.size()); - - base::TimeDelta timeout = config_.timeout; - // If this server has not responded successfully, then don't wait too long. - if (server_stats_[server_index]->last_success.is_null()) - return timeout; - - // The timeout doubles every full round (each nameserver once). - unsigned num_backoffs = attempt / config_.nameservers.size(); - - return std::min(timeout * (1 << num_backoffs), - base::TimeDelta::FromMilliseconds(kMaxTimeoutMs)); + // Respect config timeout if it exceeds |kMaxTimeoutMs|. + if (config_.timeout.InMilliseconds() >= kMaxTimeoutMs) + return config_.timeout; + return NextTimeoutFromHistogram(server_index, attempt); } // Allocate a socket, already connected to the server address. diff --git a/net/dns/dns_session_unittest.cc b/net/dns/dns_session_unittest.cc index d0a12f2..4662706 100644 --- a/net/dns/dns_session_unittest.cc +++ b/net/dns/dns_session_unittest.cc @@ -220,6 +220,29 @@ TEST_F(DnsSessionTest, AllocateFree) { EXPECT_TRUE(NoMoreEvents()); } -} // namespace +// Expect default calculated timeout to be within 10ms of in DnsConfig. +TEST_F(DnsSessionTest, HistogramTimeoutNormal) { + Initialize(2); + base::TimeDelta timeoutDelta = session_->NextTimeout(0, 0) - config_.timeout; + EXPECT_LT(timeoutDelta.InMilliseconds(), 10); +} + +// Expect short calculated timeout to be within 10ms of in DnsConfig. +TEST_F(DnsSessionTest, HistogramTimeoutShort) { + config_.timeout = base::TimeDelta::FromMilliseconds(15); + Initialize(2); + base::TimeDelta timeoutDelta = session_->NextTimeout(0, 0) - config_.timeout; + EXPECT_LT(timeoutDelta.InMilliseconds(), 10); +} + +// Expect long calculated timeout to be equal to one in DnsConfig. +TEST_F(DnsSessionTest, HistogramTimeoutLong) { + config_.timeout = base::TimeDelta::FromSeconds(15); + Initialize(2); + base::TimeDelta timeout = session_->NextTimeout(0, 0); + EXPECT_EQ(config_.timeout.InMilliseconds(), timeout.InMilliseconds()); +} + +} // namespace } // namespace net |