[net/dns] Turn DnsConfigService on by default.

[email protected]
BUG=125599
TEST=net_unittests


Review URL: https://chromiumcodereview.appspot.com/10334009

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@139892 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/net/base/host_resolver_impl.cc b/net/base/host_resolver_impl.cc
index d2d9d5db..a66f950 100644
--- a/net/base/host_resolver_impl.cc
+++ b/net/base/host_resolver_impl.cc
@@ -147,6 +147,8 @@
                             RESOLVE_STATUS_MAX);
 }
 
+//-----------------------------------------------------------------------------
+
 // Wraps call to SystemHostResolverProc as an instance of HostResolverProc.
 // TODO(szym): This should probably be declared in host_resolver_proc.h.
 class CallSystemHostResolverProc : public HostResolverProc {
@@ -435,6 +437,7 @@
                                  size_t max_retry_attempts,
                                  HostCache* cache,
                                  scoped_ptr<DnsConfigService> config_service,
+                                 scoped_ptr<DnsClient> dns_client,
                                  NetLog* net_log) {
   if (max_concurrent_resolves == HostResolver::kDefaultParallelism)
     max_concurrent_resolves = kDefaultMaxProcTasks;
@@ -449,6 +452,7 @@
       limits,
       HostResolverImpl::ProcTaskParams(NULL, max_retry_attempts),
       config_service.Pass(),
+      dns_client.Pass(),
       net_log);
 
   return resolver;
@@ -464,7 +468,8 @@
   return CreateHostResolver(max_concurrent_resolves,
                             max_retry_attempts,
                             HostCache::CreateDefaultCache(),
-                            scoped_ptr<DnsConfigService>(NULL),
+                            DnsConfigService::CreateSystemService(),
+                            scoped_ptr<DnsClient>(NULL),
                             net_log);
 }
 
@@ -475,18 +480,18 @@
                             max_retry_attempts,
                             NULL,
                             scoped_ptr<DnsConfigService>(NULL),
+                            scoped_ptr<DnsClient>(NULL),
                             net_log);
 }
 
 HostResolver* CreateAsyncHostResolver(size_t max_concurrent_resolves,
                                       size_t max_retry_attempts,
                                       NetLog* net_log) {
-  scoped_ptr<DnsConfigService> config_service =
-      DnsConfigService::CreateSystemService();
   return CreateHostResolver(max_concurrent_resolves,
                             max_retry_attempts,
                             HostCache::CreateDefaultCache(),
-                            config_service.Pass(),
+                            DnsConfigService::CreateSystemService(),
+                            DnsClient::CreateClient(net_log),
                             net_log);
 }
 
@@ -1424,8 +1429,14 @@
 
     DCHECK(!requests_.empty());
 
-    if (net_error == OK)
+    if (net_error == OK) {
       SetPortOnAddressList(requests_->front()->info().port(), &list);
+      // Record this histogram here, when we know the system has a valid DNS
+      // configuration.
+      UMA_HISTOGRAM_ENUMERATION("AsyncDNS.HaveDnsConfig",
+                                resolver_->received_dns_config_ ? 1 : 0,
+                                2);
+    }
 
     if ((net_error != ERR_ABORTED) &&
         (net_error != ERR_HOST_RESOLVER_QUEUE_TOO_LARGE)) {
@@ -1516,14 +1527,16 @@
     const PrioritizedDispatcher::Limits& job_limits,
     const ProcTaskParams& proc_params,
     scoped_ptr<DnsConfigService> dns_config_service,
+    scoped_ptr<DnsClient> dns_client,
     NetLog* net_log)
     : cache_(cache),
       dispatcher_(job_limits),
       max_queued_jobs_(job_limits.total_jobs * 100u),
       proc_params_(proc_params),
       default_address_family_(ADDRESS_FAMILY_UNSPECIFIED),
-      dns_client_(NULL),
       dns_config_service_(dns_config_service.Pass()),
+      dns_client_(dns_client.Pass()),
+      received_dns_config_(false),
       ipv6_probe_monitoring_(false),
       additional_resolver_flags_(0),
       net_log_(net_log) {
@@ -1544,18 +1557,16 @@
     additional_resolver_flags_ |= HOST_RESOLVER_LOOPBACK_ONLY;
 #endif
   NetworkChangeNotifier::AddIPAddressObserver(this);
-#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_OPENBSD)
-#if !defined(OS_ANDROID)
-  EnsureDnsReloaderInit();
-#endif
+#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_OPENBSD) && \
+    !defined(OS_ANDROID)
   NetworkChangeNotifier::AddDNSObserver(this);
+  EnsureDnsReloaderInit();
 #endif
 
   if (dns_config_service_.get()) {
     dns_config_service_->Watch(
         base::Bind(&HostResolverImpl::OnDnsConfigChanged,
                    base::Unretained(this)));
-    dns_client_ = DnsClient::CreateClient(net_log_);
   }
 }
 
@@ -1566,9 +1577,7 @@
   STLDeleteValues(&jobs_);
 
   NetworkChangeNotifier::RemoveIPAddressObserver(this);
-#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_OPENBSD)
   NetworkChangeNotifier::RemoveDNSObserver(this);
-#endif
 }
 
 void HostResolverImpl::SetMaxQueuedJobs(size_t value) {
@@ -1931,6 +1940,12 @@
 }
 
 void HostResolverImpl::OnDNSChanged(unsigned detail) {
+  // Ignore signals about watches.
+  const unsigned kIgnoredDetail =
+      NetworkChangeNotifier::CHANGE_DNS_WATCH_STARTED |
+      NetworkChangeNotifier::CHANGE_DNS_WATCH_FAILED;
+  if ((detail & ~kIgnoredDetail) == 0)
+    return;
   // If the DNS server has changed, existing cached info could be wrong so we
   // have to drop our internal cache :( Note that OS level DNS caches, such
   // as NSCD's cache should be dropped automatically by the OS when
@@ -1938,7 +1953,7 @@
   if (cache_.get())
     cache_->clear();
   // Existing jobs will have been sent to the original server so they need to
-  // be aborted. TODO(Craig): Should these jobs be restarted?
+  // be aborted.
   AbortAllInProgressJobs();
   // |this| may be deleted inside AbortAllInProgressJobs().
 }
@@ -1950,28 +1965,21 @@
         make_scoped_refptr(new DnsConfigParameters(dns_config)));
   }
 
-  DCHECK(dns_client_.get());
+  // TODO(szym): Remove once http://crbug.com/125599 is resolved.
+  received_dns_config_ = dns_config.IsValid();
 
   // Life check to bail once |this| is deleted.
   base::WeakPtr<HostResolverImpl> self = AsWeakPtr();
 
-  bool config_changed = (dns_client_->GetConfig() != NULL) &&
-      !dns_config.EqualsIgnoreHosts(*dns_client_->GetConfig());
-
-  // We want a new factory in place, before we Abort running Jobs, so that the
-  // newly started jobs use the new factory.
-  dns_client_->SetConfig(dns_config);
-
-  // Don't Abort running Jobs unless they were running on DnsTransaction and
-  // DnsConfig changed beyond DnsHosts. HOSTS-only change will be resolved by
-  // TryServingAllJobsFromHosts below.
-  if (config_changed) {
-    // TODO(szym): This will change once http://crbug.com/114827 is fixed.
+  if (dns_client_.get()) {
+    // We want a new factory in place, before we Abort running Jobs, so that the
+    // newly started jobs use the new factory.
+    dns_client_->SetConfig(dns_config);
     OnDNSChanged(NetworkChangeNotifier::CHANGE_DNS_SETTINGS);
+    // |this| may be deleted inside OnDNSChanged().
+    if (self)
+      TryServingAllJobsFromHosts();
   }
-
-  if (self && dns_config.IsValid())
-    TryServingAllJobsFromHosts();
 }
 
 bool HostResolverImpl::HaveDnsConfig() const {