summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorszym@chromium.org <szym@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-29 18:59:16 +0000
committerszym@chromium.org <szym@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-29 18:59:16 +0000
commit62e86ba6b589323f70fb435d456d241018db18d3 (patch)
tree9e3404d611939590e9eea27150f6c928584cb8aa
parent96ca5d7e7603d43da25c3cc0466902816366f7a0 (diff)
downloadchromium_src-62e86ba6b589323f70fb435d456d241018db18d3.zip
chromium_src-62e86ba6b589323f70fb435d456d241018db18d3.tar.gz
chromium_src-62e86ba6b589323f70fb435d456d241018db18d3.tar.bz2
[net] Add Net.UnspecResolvedIPv6 to measure if getaddrinfo resolves IPv6 addresses.
Assuming that "www.google.com" has IPv6 addresses, count the "network sessions" (in between IP address changes) during which we asked getaddrinfo for AF_UNSPEC family but have not received any IPv6 addresses. This will tells us how many of the times Net.IPv6Status = IPV6_GLOBAL_ADDRESS_PRESENT is wrong. BUG=171549 Review URL: https://codereview.chromium.org/12051052 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@179374 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--net/base/host_resolver_impl.cc20
-rw-r--r--net/base/host_resolver_impl.h8
2 files changed, 24 insertions, 4 deletions
diff --git a/net/base/host_resolver_impl.cc b/net/base/host_resolver_impl.cc
index 97522b4..ba59569 100644
--- a/net/base/host_resolver_impl.cc
+++ b/net/base/host_resolver_impl.cc
@@ -1405,6 +1405,20 @@ class HostResolverImpl::Job : public PrioritizedDispatcher::Job {
const AddressList& addr_list) {
DCHECK(is_proc_running());
+ if (!resolver_->resolved_known_ipv6_hostname_ &&
+ net_error == OK &&
+ key_.address_family == ADDRESS_FAMILY_UNSPECIFIED) {
+ if (key_.hostname == "www.google.com") {
+ resolver_->resolved_known_ipv6_hostname_ = true;
+ bool got_ipv6_address = false;
+ for (size_t i = 0; i < addr_list.size(); ++i) {
+ if (addr_list[i].GetFamily() == ADDRESS_FAMILY_IPV6)
+ got_ipv6_address = true;
+ }
+ UMA_HISTOGRAM_BOOLEAN("Net.UnspecResolvedIPv6", got_ipv6_address);
+ }
+ }
+
if (dns_task_error_ != OK) {
base::TimeDelta duration = base::TimeTicks::Now() - start_time;
if (net_error == OK) {
@@ -1659,14 +1673,15 @@ HostResolverImpl::HostResolverImpl(
dispatcher_(job_limits),
max_queued_jobs_(job_limits.total_jobs * 100u),
proc_params_(proc_params),
+ net_log_(net_log),
default_address_family_(ADDRESS_FAMILY_UNSPECIFIED),
weak_ptr_factory_(this),
probe_weak_ptr_factory_(this),
received_dns_config_(false),
num_dns_failures_(0),
ipv6_probe_monitoring_(false),
- additional_resolver_flags_(0),
- net_log_(net_log) {
+ resolved_known_ipv6_hostname_(false),
+ additional_resolver_flags_(0) {
DCHECK_GE(dispatcher_.num_priorities(), static_cast<size_t>(NUM_PRIORITIES));
@@ -2059,6 +2074,7 @@ void HostResolverImpl::TryServingAllJobsFromHosts() {
}
void HostResolverImpl::OnIPAddressChanged() {
+ resolved_known_ipv6_hostname_ = false;
// Abandon all ProbeJobs.
probe_weak_ptr_factory_.InvalidateWeakPtrs();
if (cache_.get())
diff --git a/net/base/host_resolver_impl.h b/net/base/host_resolver_impl.h
index d68d6ab..29a6d67 100644
--- a/net/base/host_resolver_impl.h
+++ b/net/base/host_resolver_impl.h
@@ -248,6 +248,8 @@ class NET_EXPORT HostResolverImpl
// Parameters for ProcTask.
ProcTaskParams proc_params_;
+ NetLog* net_log_;
+
// Address family to use when the request doesn't specify one.
AddressFamily default_address_family_;
@@ -270,11 +272,13 @@ class NET_EXPORT HostResolverImpl
// of the IPv6 probe job are ignored.
bool ipv6_probe_monitoring_;
+ // True iff ProcTask has successfully resolved a hostname known to have IPv6
+ // addresses using ADDRESS_FAMILY_UNSPECIFIED. Reset on IP address change.
+ bool resolved_known_ipv6_hostname_;
+
// Any resolver flags that should be added to a request by default.
HostResolverFlags additional_resolver_flags_;
- NetLog* net_log_;
-
DISALLOW_COPY_AND_ASSIGN(HostResolverImpl);
};