Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(58)

Side by Side Diff: net/dns/host_resolver_impl.cc

Issue 723343002: Update from https://crrev.com/304121 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/dns/host_resolver_impl.h" 5 #include "net/dns/host_resolver_impl.h"
6 6
7 #if defined(OS_WIN) 7 #if defined(OS_WIN)
8 #include <Winsock2.h> 8 #include <Winsock2.h>
9 #elif defined(OS_POSIX) 9 #elif defined(OS_POSIX)
10 #include <netdb.h> 10 #include <netdb.h>
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after
322 NetLog::LogLevel /* log_level */) { 322 NetLog::LogLevel /* log_level */) {
323 base::DictionaryValue* dict = new base::DictionaryValue(); 323 base::DictionaryValue* dict = new base::DictionaryValue();
324 dict->SetInteger("net_error", net_error); 324 dict->SetInteger("net_error", net_error);
325 if (dns_error) 325 if (dns_error)
326 dict->SetInteger("dns_error", dns_error); 326 dict->SetInteger("dns_error", dns_error);
327 return dict; 327 return dict;
328 }; 328 };
329 329
330 // Creates NetLog parameters containing the information in a RequestInfo object, 330 // Creates NetLog parameters containing the information in a RequestInfo object,
331 // along with the associated NetLog::Source. 331 // along with the associated NetLog::Source.
332 base::Value* NetLogRequestInfoCallback(const NetLog::Source& source, 332 base::Value* NetLogRequestInfoCallback(const HostResolver::RequestInfo* info,
333 const HostResolver::RequestInfo* info,
334 NetLog::LogLevel /* log_level */) { 333 NetLog::LogLevel /* log_level */) {
335 base::DictionaryValue* dict = new base::DictionaryValue(); 334 base::DictionaryValue* dict = new base::DictionaryValue();
336 source.AddToEventParameters(dict);
337 335
338 dict->SetString("host", info->host_port_pair().ToString()); 336 dict->SetString("host", info->host_port_pair().ToString());
339 dict->SetInteger("address_family", 337 dict->SetInteger("address_family",
340 static_cast<int>(info->address_family())); 338 static_cast<int>(info->address_family()));
341 dict->SetBoolean("allow_cached_response", info->allow_cached_response()); 339 dict->SetBoolean("allow_cached_response", info->allow_cached_response());
342 dict->SetBoolean("is_speculative", info->is_speculative()); 340 dict->SetBoolean("is_speculative", info->is_speculative());
343 return dict; 341 return dict;
344 } 342 }
345 343
346 // Creates NetLog parameters for the creation of a HostResolverImpl::Job. 344 // Creates NetLog parameters for the creation of a HostResolverImpl::Job.
(...skipping 20 matching lines...) Expand all
367 base::Value* NetLogDnsConfigCallback(const DnsConfig* config, 365 base::Value* NetLogDnsConfigCallback(const DnsConfig* config,
368 NetLog::LogLevel /* log_level */) { 366 NetLog::LogLevel /* log_level */) {
369 return config->ToValue(); 367 return config->ToValue();
370 } 368 }
371 369
372 // The logging routines are defined here because some requests are resolved 370 // The logging routines are defined here because some requests are resolved
373 // without a Request object. 371 // without a Request object.
374 372
375 // Logs when a request has just been started. 373 // Logs when a request has just been started.
376 void LogStartRequest(const BoundNetLog& source_net_log, 374 void LogStartRequest(const BoundNetLog& source_net_log,
377 const BoundNetLog& request_net_log,
378 const HostResolver::RequestInfo& info) { 375 const HostResolver::RequestInfo& info) {
379 source_net_log.BeginEvent( 376 source_net_log.BeginEvent(
380 NetLog::TYPE_HOST_RESOLVER_IMPL,
381 request_net_log.source().ToEventParametersCallback());
382
383 request_net_log.BeginEvent(
384 NetLog::TYPE_HOST_RESOLVER_IMPL_REQUEST, 377 NetLog::TYPE_HOST_RESOLVER_IMPL_REQUEST,
385 base::Bind(&NetLogRequestInfoCallback, source_net_log.source(), &info)); 378 base::Bind(&NetLogRequestInfoCallback, &info));
386 } 379 }
387 380
388 // Logs when a request has just completed (before its callback is run). 381 // Logs when a request has just completed (before its callback is run).
389 void LogFinishRequest(const BoundNetLog& source_net_log, 382 void LogFinishRequest(const BoundNetLog& source_net_log,
390 const BoundNetLog& request_net_log,
391 const HostResolver::RequestInfo& info, 383 const HostResolver::RequestInfo& info,
392 int net_error) { 384 int net_error) {
393 request_net_log.EndEventWithNetErrorCode( 385 source_net_log.EndEventWithNetErrorCode(
394 NetLog::TYPE_HOST_RESOLVER_IMPL_REQUEST, net_error); 386 NetLog::TYPE_HOST_RESOLVER_IMPL_REQUEST, net_error);
395 source_net_log.EndEvent(NetLog::TYPE_HOST_RESOLVER_IMPL);
396 } 387 }
397 388
398 // Logs when a request has been cancelled. 389 // Logs when a request has been cancelled.
399 void LogCancelRequest(const BoundNetLog& source_net_log, 390 void LogCancelRequest(const BoundNetLog& source_net_log,
400 const BoundNetLog& request_net_log,
401 const HostResolverImpl::RequestInfo& info) { 391 const HostResolverImpl::RequestInfo& info) {
402 request_net_log.AddEvent(NetLog::TYPE_CANCELLED); 392 source_net_log.AddEvent(NetLog::TYPE_CANCELLED);
403 request_net_log.EndEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_REQUEST); 393 source_net_log.EndEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_REQUEST);
404 source_net_log.EndEvent(NetLog::TYPE_HOST_RESOLVER_IMPL);
405 } 394 }
406 395
407 //----------------------------------------------------------------------------- 396 //-----------------------------------------------------------------------------
408 397
409 // Keeps track of the highest priority. 398 // Keeps track of the highest priority.
410 class PriorityTracker { 399 class PriorityTracker {
411 public: 400 public:
412 explicit PriorityTracker(RequestPriority initial_priority) 401 explicit PriorityTracker(RequestPriority initial_priority)
413 : highest_priority_(initial_priority), total_count_(0) { 402 : highest_priority_(initial_priority), total_count_(0) {
414 memset(counts_, 0, sizeof(counts_)); 403 memset(counts_, 0, sizeof(counts_));
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 //----------------------------------------------------------------------------- 443 //-----------------------------------------------------------------------------
455 444
456 const unsigned HostResolverImpl::kMaximumDnsFailures = 16; 445 const unsigned HostResolverImpl::kMaximumDnsFailures = 16;
457 446
458 // Holds the data for a request that could not be completed synchronously. 447 // Holds the data for a request that could not be completed synchronously.
459 // It is owned by a Job. Canceled Requests are only marked as canceled rather 448 // It is owned by a Job. Canceled Requests are only marked as canceled rather
460 // than removed from the Job's |requests_| list. 449 // than removed from the Job's |requests_| list.
461 class HostResolverImpl::Request { 450 class HostResolverImpl::Request {
462 public: 451 public:
463 Request(const BoundNetLog& source_net_log, 452 Request(const BoundNetLog& source_net_log,
464 const BoundNetLog& request_net_log,
465 const RequestInfo& info, 453 const RequestInfo& info,
466 RequestPriority priority, 454 RequestPriority priority,
467 const CompletionCallback& callback, 455 const CompletionCallback& callback,
468 AddressList* addresses) 456 AddressList* addresses)
469 : source_net_log_(source_net_log), 457 : source_net_log_(source_net_log),
470 request_net_log_(request_net_log),
471 info_(info), 458 info_(info),
472 priority_(priority), 459 priority_(priority),
473 job_(NULL), 460 job_(NULL),
474 callback_(callback), 461 callback_(callback),
475 addresses_(addresses), 462 addresses_(addresses),
476 request_time_(base::TimeTicks::Now()) {} 463 request_time_(base::TimeTicks::Now()) {}
477 464
478 // Mark the request as canceled. 465 // Mark the request as canceled.
479 void MarkAsCanceled() { 466 void MarkAsCanceled() {
480 job_ = NULL; 467 job_ = NULL;
(...skipping 23 matching lines...) Expand all
504 491
505 Job* job() const { 492 Job* job() const {
506 return job_; 493 return job_;
507 } 494 }
508 495
509 // NetLog for the source, passed in HostResolver::Resolve. 496 // NetLog for the source, passed in HostResolver::Resolve.
510 const BoundNetLog& source_net_log() { 497 const BoundNetLog& source_net_log() {
511 return source_net_log_; 498 return source_net_log_;
512 } 499 }
513 500
514 // NetLog for this request.
515 const BoundNetLog& request_net_log() {
516 return request_net_log_;
517 }
518
519 const RequestInfo& info() const { 501 const RequestInfo& info() const {
520 return info_; 502 return info_;
521 } 503 }
522 504
523 RequestPriority priority() const { return priority_; } 505 RequestPriority priority() const { return priority_; }
524 506
525 base::TimeTicks request_time() const { return request_time_; } 507 base::TimeTicks request_time() const { return request_time_; }
526 508
527 private: 509 private:
528 BoundNetLog source_net_log_; 510 const BoundNetLog source_net_log_;
529 BoundNetLog request_net_log_;
530 511
531 // The request info that started the request. 512 // The request info that started the request.
532 const RequestInfo info_; 513 const RequestInfo info_;
533 514
534 // TODO(akalin): Support reprioritization. 515 // TODO(akalin): Support reprioritization.
535 const RequestPriority priority_; 516 const RequestPriority priority_;
536 517
537 // The resolve job that this request is dependent on. 518 // The resolve job that this request is dependent on.
538 Job* job_; 519 Job* job_;
539 520
(...skipping 653 matching lines...) Expand 10 before | Expand all | Expand 10 after
1193 1174
1194 // Aggregates all Requests for the same Key. Dispatched via PriorityDispatch. 1175 // Aggregates all Requests for the same Key. Dispatched via PriorityDispatch.
1195 class HostResolverImpl::Job : public PrioritizedDispatcher::Job, 1176 class HostResolverImpl::Job : public PrioritizedDispatcher::Job,
1196 public HostResolverImpl::DnsTask::Delegate { 1177 public HostResolverImpl::DnsTask::Delegate {
1197 public: 1178 public:
1198 // Creates new job for |key| where |request_net_log| is bound to the 1179 // Creates new job for |key| where |request_net_log| is bound to the
1199 // request that spawned it. 1180 // request that spawned it.
1200 Job(const base::WeakPtr<HostResolverImpl>& resolver, 1181 Job(const base::WeakPtr<HostResolverImpl>& resolver,
1201 const Key& key, 1182 const Key& key,
1202 RequestPriority priority, 1183 RequestPriority priority,
1203 const BoundNetLog& request_net_log) 1184 const BoundNetLog& source_net_log)
1204 : resolver_(resolver), 1185 : resolver_(resolver),
1205 key_(key), 1186 key_(key),
1206 priority_tracker_(priority), 1187 priority_tracker_(priority),
1207 had_non_speculative_request_(false), 1188 had_non_speculative_request_(false),
1208 had_dns_config_(false), 1189 had_dns_config_(false),
1209 num_occupied_job_slots_(0), 1190 num_occupied_job_slots_(0),
1210 dns_task_error_(OK), 1191 dns_task_error_(OK),
1211 creation_time_(base::TimeTicks::Now()), 1192 creation_time_(base::TimeTicks::Now()),
1212 priority_change_time_(creation_time_), 1193 priority_change_time_(creation_time_),
1213 net_log_(BoundNetLog::Make(request_net_log.net_log(), 1194 net_log_(BoundNetLog::Make(source_net_log.net_log(),
1214 NetLog::SOURCE_HOST_RESOLVER_IMPL_JOB)) { 1195 NetLog::SOURCE_HOST_RESOLVER_IMPL_JOB)) {
1215 request_net_log.AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_CREATE_JOB); 1196 source_net_log.AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_CREATE_JOB);
1216 1197
1217 net_log_.BeginEvent( 1198 net_log_.BeginEvent(
1218 NetLog::TYPE_HOST_RESOLVER_IMPL_JOB, 1199 NetLog::TYPE_HOST_RESOLVER_IMPL_JOB,
1219 base::Bind(&NetLogJobCreationCallback, 1200 base::Bind(&NetLogJobCreationCallback,
1220 request_net_log.source(), 1201 source_net_log.source(),
1221 &key_.hostname)); 1202 &key_.hostname));
1222 } 1203 }
1223 1204
1224 ~Job() override { 1205 ~Job() override {
1225 if (is_running()) { 1206 if (is_running()) {
1226 // |resolver_| was destroyed with this Job still in flight. 1207 // |resolver_| was destroyed with this Job still in flight.
1227 // Clean-up, record in the log, but don't run any callbacks. 1208 // Clean-up, record in the log, but don't run any callbacks.
1228 if (is_proc_running()) { 1209 if (is_proc_running()) {
1229 proc_task_->Cancel(); 1210 proc_task_->Cancel();
1230 proc_task_ = NULL; 1211 proc_task_ = NULL;
(...skipping 10 matching lines...) Expand all
1241 } 1222 }
1242 // else CompleteRequests logged EndEvent. 1223 // else CompleteRequests logged EndEvent.
1243 1224
1244 // Log any remaining Requests as cancelled. 1225 // Log any remaining Requests as cancelled.
1245 for (RequestsList::const_iterator it = requests_.begin(); 1226 for (RequestsList::const_iterator it = requests_.begin();
1246 it != requests_.end(); ++it) { 1227 it != requests_.end(); ++it) {
1247 Request* req = *it; 1228 Request* req = *it;
1248 if (req->was_canceled()) 1229 if (req->was_canceled())
1249 continue; 1230 continue;
1250 DCHECK_EQ(this, req->job()); 1231 DCHECK_EQ(this, req->job());
1251 LogCancelRequest(req->source_net_log(), req->request_net_log(), 1232 LogCancelRequest(req->source_net_log(), req->info());
1252 req->info());
1253 } 1233 }
1254 } 1234 }
1255 1235
1256 // Add this job to the dispatcher. If "at_head" is true, adds at the front 1236 // Add this job to the dispatcher. If "at_head" is true, adds at the front
1257 // of the queue. 1237 // of the queue.
1258 void Schedule(bool at_head) { 1238 void Schedule(bool at_head) {
1259 DCHECK(!is_queued()); 1239 DCHECK(!is_queued());
1260 PrioritizedDispatcher::Handle handle; 1240 PrioritizedDispatcher::Handle handle;
1261 if (!at_head) { 1241 if (!at_head) {
1262 handle = resolver_->dispatcher_->Add(this, priority()); 1242 handle = resolver_->dispatcher_->Add(this, priority());
1263 } else { 1243 } else {
1264 handle = resolver_->dispatcher_->AddAtHead(this, priority()); 1244 handle = resolver_->dispatcher_->AddAtHead(this, priority());
1265 } 1245 }
1266 // The dispatcher could have started |this| in the above call to Add, which 1246 // The dispatcher could have started |this| in the above call to Add, which
1267 // could have called Schedule again. In that case |handle| will be null, 1247 // could have called Schedule again. In that case |handle| will be null,
1268 // but |handle_| may have been set by the other nested call to Schedule. 1248 // but |handle_| may have been set by the other nested call to Schedule.
1269 if (!handle.is_null()) { 1249 if (!handle.is_null()) {
1270 DCHECK(handle_.is_null()); 1250 DCHECK(handle_.is_null());
1271 handle_ = handle; 1251 handle_ = handle;
1272 } 1252 }
1273 } 1253 }
1274 1254
1275 void AddRequest(scoped_ptr<Request> req) { 1255 void AddRequest(scoped_ptr<Request> req) {
1276 DCHECK_EQ(key_.hostname, req->info().hostname()); 1256 DCHECK_EQ(key_.hostname, req->info().hostname());
1277 1257
1278 req->set_job(this); 1258 req->set_job(this);
1279 priority_tracker_.Add(req->priority()); 1259 priority_tracker_.Add(req->priority());
1280 1260
1281 req->request_net_log().AddEvent( 1261 req->source_net_log().AddEvent(
1282 NetLog::TYPE_HOST_RESOLVER_IMPL_JOB_ATTACH, 1262 NetLog::TYPE_HOST_RESOLVER_IMPL_JOB_ATTACH,
1283 net_log_.source().ToEventParametersCallback()); 1263 net_log_.source().ToEventParametersCallback());
1284 1264
1285 net_log_.AddEvent( 1265 net_log_.AddEvent(
1286 NetLog::TYPE_HOST_RESOLVER_IMPL_JOB_REQUEST_ATTACH, 1266 NetLog::TYPE_HOST_RESOLVER_IMPL_JOB_REQUEST_ATTACH,
1287 base::Bind(&NetLogJobAttachCallback, 1267 base::Bind(&NetLogJobAttachCallback,
1288 req->request_net_log().source(), 1268 req->source_net_log().source(),
1289 priority())); 1269 priority()));
1290 1270
1291 // TODO(szym): Check if this is still needed. 1271 // TODO(szym): Check if this is still needed.
1292 if (!req->info().is_speculative()) { 1272 if (!req->info().is_speculative()) {
1293 had_non_speculative_request_ = true; 1273 had_non_speculative_request_ = true;
1294 if (proc_task_.get()) 1274 if (proc_task_.get())
1295 proc_task_->set_had_non_speculative_request(); 1275 proc_task_->set_had_non_speculative_request();
1296 } 1276 }
1297 1277
1298 requests_.push_back(req.release()); 1278 requests_.push_back(req.release());
1299 1279
1300 UpdatePriority(); 1280 UpdatePriority();
1301 } 1281 }
1302 1282
1303 // Marks |req| as cancelled. If it was the last active Request, also finishes 1283 // Marks |req| as cancelled. If it was the last active Request, also finishes
1304 // this Job, marking it as cancelled, and deletes it. 1284 // this Job, marking it as cancelled, and deletes it.
1305 void CancelRequest(Request* req) { 1285 void CancelRequest(Request* req) {
1306 DCHECK_EQ(key_.hostname, req->info().hostname()); 1286 DCHECK_EQ(key_.hostname, req->info().hostname());
1307 DCHECK(!req->was_canceled()); 1287 DCHECK(!req->was_canceled());
1308 1288
1309 // Don't remove it from |requests_| just mark it canceled. 1289 // Don't remove it from |requests_| just mark it canceled.
1310 req->MarkAsCanceled(); 1290 req->MarkAsCanceled();
1311 LogCancelRequest(req->source_net_log(), req->request_net_log(), 1291 LogCancelRequest(req->source_net_log(), req->info());
1312 req->info());
1313 1292
1314 priority_tracker_.Remove(req->priority()); 1293 priority_tracker_.Remove(req->priority());
1315 net_log_.AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_JOB_REQUEST_DETACH, 1294 net_log_.AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_JOB_REQUEST_DETACH,
1316 base::Bind(&NetLogJobAttachCallback, 1295 base::Bind(&NetLogJobAttachCallback,
1317 req->request_net_log().source(), 1296 req->source_net_log().source(),
1318 priority())); 1297 priority()));
1319 1298
1320 if (num_active_requests() > 0) { 1299 if (num_active_requests() > 0) {
1321 UpdatePriority(); 1300 UpdatePriority();
1322 } else { 1301 } else {
1323 // If we were called from a Request's callback within CompleteRequests, 1302 // If we were called from a Request's callback within CompleteRequests,
1324 // that Request could not have been cancelled, so num_active_requests() 1303 // that Request could not have been cancelled, so num_active_requests()
1325 // could not be 0. Therefore, we are not in CompleteRequests(). 1304 // could not be 0. Therefore, we are not in CompleteRequests().
1326 CompleteRequestsWithError(OK /* cancelled */); 1305 CompleteRequestsWithError(OK /* cancelled */);
1327 } 1306 }
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after
1693 // Complete all of the requests that were attached to the job. 1672 // Complete all of the requests that were attached to the job.
1694 for (RequestsList::const_iterator it = requests_.begin(); 1673 for (RequestsList::const_iterator it = requests_.begin();
1695 it != requests_.end(); ++it) { 1674 it != requests_.end(); ++it) {
1696 Request* req = *it; 1675 Request* req = *it;
1697 1676
1698 if (req->was_canceled()) 1677 if (req->was_canceled())
1699 continue; 1678 continue;
1700 1679
1701 DCHECK_EQ(this, req->job()); 1680 DCHECK_EQ(this, req->job());
1702 // Update the net log and notify registered observers. 1681 // Update the net log and notify registered observers.
1703 LogFinishRequest(req->source_net_log(), req->request_net_log(), 1682 LogFinishRequest(req->source_net_log(), req->info(), entry.error);
1704 req->info(), entry.error);
1705 if (did_complete) { 1683 if (did_complete) {
1706 // Record effective total time from creation to completion. 1684 // Record effective total time from creation to completion.
1707 RecordTotalTime(had_dns_config_, req->info().is_speculative(), 1685 RecordTotalTime(had_dns_config_, req->info().is_speculative(),
1708 base::TimeTicks::Now() - req->request_time()); 1686 base::TimeTicks::Now() - req->request_time());
1709 } 1687 }
1710 req->OnComplete(entry.error, entry.addrlist); 1688 req->OnComplete(entry.error, entry.addrlist);
1711 1689
1712 // Check if the resolver was destroyed as a result of running the 1690 // Check if the resolver was destroyed as a result of running the
1713 // callback. If it was, we could continue, but we choose to bail. 1691 // callback. If it was, we could continue, but we choose to bail.
1714 if (!resolver_.get()) 1692 if (!resolver_.get())
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
1864 const BoundNetLog& source_net_log) { 1842 const BoundNetLog& source_net_log) {
1865 DCHECK(addresses); 1843 DCHECK(addresses);
1866 DCHECK(CalledOnValidThread()); 1844 DCHECK(CalledOnValidThread());
1867 DCHECK_EQ(false, callback.is_null()); 1845 DCHECK_EQ(false, callback.is_null());
1868 1846
1869 // Check that the caller supplied a valid hostname to resolve. 1847 // Check that the caller supplied a valid hostname to resolve.
1870 std::string labeled_hostname; 1848 std::string labeled_hostname;
1871 if (!DNSDomainFromDot(info.hostname(), &labeled_hostname)) 1849 if (!DNSDomainFromDot(info.hostname(), &labeled_hostname))
1872 return ERR_NAME_NOT_RESOLVED; 1850 return ERR_NAME_NOT_RESOLVED;
1873 1851
1874 // Make a log item for the request. 1852 LogStartRequest(source_net_log, info);
1875 BoundNetLog request_net_log = BoundNetLog::Make(net_log_,
1876 NetLog::SOURCE_HOST_RESOLVER_IMPL_REQUEST);
1877
1878 LogStartRequest(source_net_log, request_net_log, info);
1879 1853
1880 // Build a key that identifies the request in the cache and in the 1854 // Build a key that identifies the request in the cache and in the
1881 // outstanding jobs map. 1855 // outstanding jobs map.
1882 Key key = GetEffectiveKeyForRequest(info, request_net_log); 1856 Key key = GetEffectiveKeyForRequest(info, source_net_log);
1883 1857
1884 int rv = ResolveHelper(key, info, addresses, request_net_log); 1858 int rv = ResolveHelper(key, info, addresses, source_net_log);
1885 if (rv != ERR_DNS_CACHE_MISS) { 1859 if (rv != ERR_DNS_CACHE_MISS) {
1886 LogFinishRequest(source_net_log, request_net_log, info, rv); 1860 LogFinishRequest(source_net_log, info, rv);
1887 RecordTotalTime(HaveDnsConfig(), info.is_speculative(), base::TimeDelta()); 1861 RecordTotalTime(HaveDnsConfig(), info.is_speculative(), base::TimeDelta());
1888 return rv; 1862 return rv;
1889 } 1863 }
1890 1864
1891 // Next we need to attach our request to a "job". This job is responsible for 1865 // Next we need to attach our request to a "job". This job is responsible for
1892 // calling "getaddrinfo(hostname)" on a worker thread. 1866 // calling "getaddrinfo(hostname)" on a worker thread.
1893 1867
1894 JobMap::iterator jobit = jobs_.find(key); 1868 JobMap::iterator jobit = jobs_.find(key);
1895 Job* job; 1869 Job* job;
1896 if (jobit == jobs_.end()) { 1870 if (jobit == jobs_.end()) {
1897 job = 1871 job =
1898 new Job(weak_ptr_factory_.GetWeakPtr(), key, priority, request_net_log); 1872 new Job(weak_ptr_factory_.GetWeakPtr(), key, priority, source_net_log);
1899 job->Schedule(false); 1873 job->Schedule(false);
1900 1874
1901 // Check for queue overflow. 1875 // Check for queue overflow.
1902 if (dispatcher_->num_queued_jobs() > max_queued_jobs_) { 1876 if (dispatcher_->num_queued_jobs() > max_queued_jobs_) {
1903 Job* evicted = static_cast<Job*>(dispatcher_->EvictOldestLowest()); 1877 Job* evicted = static_cast<Job*>(dispatcher_->EvictOldestLowest());
1904 DCHECK(evicted); 1878 DCHECK(evicted);
1905 evicted->OnEvicted(); // Deletes |evicted|. 1879 evicted->OnEvicted(); // Deletes |evicted|.
1906 if (evicted == job) { 1880 if (evicted == job) {
1907 rv = ERR_HOST_RESOLVER_QUEUE_TOO_LARGE; 1881 rv = ERR_HOST_RESOLVER_QUEUE_TOO_LARGE;
1908 LogFinishRequest(source_net_log, request_net_log, info, rv); 1882 LogFinishRequest(source_net_log, info, rv);
1909 return rv; 1883 return rv;
1910 } 1884 }
1911 } 1885 }
1912 jobs_.insert(jobit, std::make_pair(key, job)); 1886 jobs_.insert(jobit, std::make_pair(key, job));
1913 } else { 1887 } else {
1914 job = jobit->second; 1888 job = jobit->second;
1915 } 1889 }
1916 1890
1917 // Can't complete synchronously. Create and attach request. 1891 // Can't complete synchronously. Create and attach request.
1918 scoped_ptr<Request> req(new Request( 1892 scoped_ptr<Request> req(new Request(
1919 source_net_log, request_net_log, info, priority, callback, addresses)); 1893 source_net_log, info, priority, callback, addresses));
1920 if (out_req) 1894 if (out_req)
1921 *out_req = reinterpret_cast<RequestHandle>(req.get()); 1895 *out_req = reinterpret_cast<RequestHandle>(req.get());
1922 1896
1923 job->AddRequest(req.Pass()); 1897 job->AddRequest(req.Pass());
1924 // Completion happens during Job::CompleteRequests(). 1898 // Completion happens during Job::CompleteRequests().
1925 return ERR_IO_PENDING; 1899 return ERR_IO_PENDING;
1926 } 1900 }
1927 1901
1928 int HostResolverImpl::ResolveHelper(const Key& key, 1902 int HostResolverImpl::ResolveHelper(const Key& key,
1929 const RequestInfo& info, 1903 const RequestInfo& info,
1930 AddressList* addresses, 1904 AddressList* addresses,
1931 const BoundNetLog& request_net_log) { 1905 const BoundNetLog& source_net_log) {
1932 // The result of |getaddrinfo| for empty hosts is inconsistent across systems. 1906 // The result of |getaddrinfo| for empty hosts is inconsistent across systems.
1933 // On Windows it gives the default interface's address, whereas on Linux it 1907 // On Windows it gives the default interface's address, whereas on Linux it
1934 // gives an error. We will make it fail on all platforms for consistency. 1908 // gives an error. We will make it fail on all platforms for consistency.
1935 if (info.hostname().empty() || info.hostname().size() > kMaxHostLength) 1909 if (info.hostname().empty() || info.hostname().size() > kMaxHostLength)
1936 return ERR_NAME_NOT_RESOLVED; 1910 return ERR_NAME_NOT_RESOLVED;
1937 1911
1938 int net_error = ERR_UNEXPECTED; 1912 int net_error = ERR_UNEXPECTED;
1939 if (ResolveAsIP(key, info, &net_error, addresses)) 1913 if (ResolveAsIP(key, info, &net_error, addresses))
1940 return net_error; 1914 return net_error;
1941 if (ServeFromCache(key, info, &net_error, addresses)) { 1915 if (ServeFromCache(key, info, &net_error, addresses)) {
1942 request_net_log.AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_CACHE_HIT); 1916 source_net_log.AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_CACHE_HIT);
1943 return net_error; 1917 return net_error;
1944 } 1918 }
1945 // TODO(szym): Do not do this if nsswitch.conf instructs not to. 1919 // TODO(szym): Do not do this if nsswitch.conf instructs not to.
1946 // http://crbug.com/117655 1920 // http://crbug.com/117655
1947 if (ServeFromHosts(key, info, addresses)) { 1921 if (ServeFromHosts(key, info, addresses)) {
1948 request_net_log.AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_HOSTS_HIT); 1922 source_net_log.AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_HOSTS_HIT);
1949 return OK; 1923 return OK;
1950 } 1924 }
1951 return ERR_DNS_CACHE_MISS; 1925 return ERR_DNS_CACHE_MISS;
1952 } 1926 }
1953 1927
1954 int HostResolverImpl::ResolveFromCache(const RequestInfo& info, 1928 int HostResolverImpl::ResolveFromCache(const RequestInfo& info,
1955 AddressList* addresses, 1929 AddressList* addresses,
1956 const BoundNetLog& source_net_log) { 1930 const BoundNetLog& source_net_log) {
1957 DCHECK(CalledOnValidThread()); 1931 DCHECK(CalledOnValidThread());
1958 DCHECK(addresses); 1932 DCHECK(addresses);
1959 1933
1960 // Make a log item for the request. 1934 // Update the net log and notify registered observers.
1961 BoundNetLog request_net_log = BoundNetLog::Make(net_log_, 1935 LogStartRequest(source_net_log, info);
1962 NetLog::SOURCE_HOST_RESOLVER_IMPL_REQUEST);
1963 1936
1964 // Update the net log and notify registered observers. 1937 Key key = GetEffectiveKeyForRequest(info, source_net_log);
1965 LogStartRequest(source_net_log, request_net_log, info);
1966 1938
1967 Key key = GetEffectiveKeyForRequest(info, request_net_log); 1939 int rv = ResolveHelper(key, info, addresses, source_net_log);
1968 1940 LogFinishRequest(source_net_log, info, rv);
1969 int rv = ResolveHelper(key, info, addresses, request_net_log);
1970 LogFinishRequest(source_net_log, request_net_log, info, rv);
1971 return rv; 1941 return rv;
1972 } 1942 }
1973 1943
1974 void HostResolverImpl::CancelRequest(RequestHandle req_handle) { 1944 void HostResolverImpl::CancelRequest(RequestHandle req_handle) {
1975 DCHECK(CalledOnValidThread()); 1945 DCHECK(CalledOnValidThread());
1976 Request* req = reinterpret_cast<Request*>(req_handle); 1946 Request* req = reinterpret_cast<Request*>(req_handle);
1977 DCHECK(req); 1947 DCHECK(req);
1978 Job* job = req->job(); 1948 Job* job = req->job();
1979 DCHECK(job); 1949 DCHECK(job);
1980 job->CancelRequest(req); 1950 job->CancelRequest(req);
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after
2359 dns_client_->SetConfig(dns_config); 2329 dns_client_->SetConfig(dns_config);
2360 num_dns_failures_ = 0; 2330 num_dns_failures_ = 0;
2361 if (dns_client_->GetConfig()) 2331 if (dns_client_->GetConfig())
2362 UMA_HISTOGRAM_BOOLEAN("AsyncDNS.DnsClientEnabled", true); 2332 UMA_HISTOGRAM_BOOLEAN("AsyncDNS.DnsClientEnabled", true);
2363 } 2333 }
2364 2334
2365 AbortDnsTasks(); 2335 AbortDnsTasks();
2366 } 2336 }
2367 2337
2368 } // namespace net 2338 } // namespace net
OLDNEW
« no previous file with comments | « net/data/url_request_unittest/two-content-lengths.html.mock-http-headers ('k') | net/http/disk_cache_based_quic_server_info.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698