Narrow the instrumentation to track jank in HostResolverImpl.
I am fairly confident this is coming from IsGloballyReachable(), which seems to have a dependency on UDP sockets, so focused the instrumentation there.
One weakness of this instrumentation is it doesn't separate out some of the non-trivial work being done by local variable's destructors (most notably deletion of the UDP sockets, which will likely be hitting issue 165382).
BUG=455942
TBR=pkasting@chromium.org
Review URL: https://codereview.chromium.org/1120733002
Cr-Commit-Position: refs/heads/master@{#327831}
diff --git a/net/dns/host_resolver_impl.cc b/net/dns/host_resolver_impl.cc
index 141f7f8..6cf01c7 100644
--- a/net/dns/host_resolver_impl.cc
+++ b/net/dns/host_resolver_impl.cc
@@ -185,19 +185,33 @@
// Attempts to connect a UDP socket to |dest|:53.
bool IsGloballyReachable(const IPAddressNumber& dest,
const BoundNetLog& net_log) {
+ // TODO(eroman): Remove ScopedTracker below once crbug.com/455942 is fixed.
+ tracked_objects::ScopedTracker tracking_profile_1(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "455942 IsGloballyReachable (create udp socket)"));
+
scoped_ptr<DatagramClientSocket> socket(
ClientSocketFactory::GetDefaultFactory()->CreateDatagramClientSocket(
DatagramSocket::DEFAULT_BIND,
RandIntCallback(),
net_log.net_log(),
net_log.source()));
+ // TODO(eroman): Remove ScopedTracker below once crbug.com/455942 is fixed.
+ tracked_objects::ScopedTracker tracking_profile_2(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION("455942 IsGloballyReachable (connect)"));
int rv = socket->Connect(IPEndPoint(dest, 53));
if (rv != OK)
return false;
+ tracked_objects::ScopedTracker tracking_profile_3(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "455942 IsGloballyReachable (get local addr)"));
IPEndPoint endpoint;
rv = socket->GetLocalAddress(&endpoint);
if (rv != OK)
return false;
+ tracked_objects::ScopedTracker tracking_profile_4(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "455942 IsGloballyReachable (remainder)"));
DCHECK_EQ(ADDRESS_FAMILY_IPV6, endpoint.GetFamily());
const IPAddressNumber& address = endpoint.address();
bool is_link_local = (address[0] == 0xFE) && ((address[1] & 0xC0) == 0x80);
@@ -1887,11 +1901,17 @@
LogStartRequest(source_net_log, info);
+ tracked_objects::ScopedTracker tracking_profile_1a(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION("455942 HostResolverImpl::Resolve 1a"));
+
IPAddressNumber ip_number;
IPAddressNumber* ip_number_ptr = nullptr;
if (ParseIPLiteralToNumber(info.hostname(), &ip_number))
ip_number_ptr = &ip_number;
+ tracked_objects::ScopedTracker tracking_profile_1b(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION("455942 HostResolverImpl::Resolve 1b"));
+
// Build a key that identifies the request in the cache and in the
// outstanding jobs map.
Key key = GetEffectiveKeyForRequest(info, ip_number_ptr, source_net_log);
@@ -1907,27 +1927,16 @@
return rv;
}
- // TODO(eroman): Remove ScopedTracker below once crbug.com/455942 is fixed.
- tracked_objects::ScopedTracker tracking_profile_3(
- FROM_HERE_WITH_EXPLICIT_FUNCTION("455942 HostResolverImpl::Resolve 3"));
-
// Next we need to attach our request to a "job". This job is responsible for
// calling "getaddrinfo(hostname)" on a worker thread.
JobMap::iterator jobit = jobs_.find(key);
Job* job;
if (jobit == jobs_.end()) {
- // TODO(eroman): Remove ScopedTracker below once crbug.com/455942 is fixed.
- tracked_objects::ScopedTracker tracking_profile_4(
- FROM_HERE_WITH_EXPLICIT_FUNCTION("455942 HostResolverImpl::Resolve 4"));
job =
new Job(weak_ptr_factory_.GetWeakPtr(), key, priority, source_net_log);
job->Schedule(false);
- // TODO(eroman): Remove ScopedTracker below once crbug.com/455942 is fixed.
- tracked_objects::ScopedTracker tracking_profile_5(
- FROM_HERE_WITH_EXPLICIT_FUNCTION("455942 HostResolverImpl::Resolve 5"));
-
// Check for queue overflow.
if (dispatcher_->num_queued_jobs() > max_queued_jobs_) {
Job* evicted = static_cast<Job*>(dispatcher_->EvictOldestLowest());
@@ -1944,10 +1953,6 @@
job = jobit->second;
}
- // TODO(eroman): Remove ScopedTracker below once crbug.com/455942 is fixed.
- tracked_objects::ScopedTracker tracking_profile_6(
- FROM_HERE_WITH_EXPLICIT_FUNCTION("455942 HostResolverImpl::Resolve 6"));
-
// Can't complete synchronously. Create and attach request.
scoped_ptr<Request> req(new Request(
source_net_log, info, priority, callback, addresses));