| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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/proxy/proxy_resolver_v8_tracing.h" | 5 #include "net/proxy/proxy_resolver_v8_tracing.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/message_loop/message_loop_proxy.h" | 8 #include "base/message_loop/message_loop_proxy.h" |
| 9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
| 10 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 HostResolver* host_resolver(); | 138 HostResolver* host_resolver(); |
| 139 ProxyResolverErrorObserver* error_observer(); | 139 ProxyResolverErrorObserver* error_observer(); |
| 140 NetLog* net_log(); | 140 NetLog* net_log(); |
| 141 | 141 |
| 142 // Invokes the user's callback. | 142 // Invokes the user's callback. |
| 143 void NotifyCaller(int result); | 143 void NotifyCaller(int result); |
| 144 void NotifyCallerOnOriginLoop(int result); | 144 void NotifyCallerOnOriginLoop(int result); |
| 145 | 145 |
| 146 void RecordMetrics() const; | 146 void RecordMetrics() const; |
| 147 | 147 |
| 148 void Start(Operation op, bool blocking_dns, | 148 void Start(Operation op, |
| 149 bool blocking_dns, |
| 149 const CompletionCallback& callback); | 150 const CompletionCallback& callback); |
| 150 | 151 |
| 151 void ExecuteBlocking(); | 152 void ExecuteBlocking(); |
| 152 void ExecuteNonBlocking(); | 153 void ExecuteNonBlocking(); |
| 153 int ExecuteProxyResolver(); | 154 int ExecuteProxyResolver(); |
| 154 | 155 |
| 155 // Implementation of ProxyResolverv8::JSBindings | 156 // Implementation of ProxyResolverv8::JSBindings |
| 156 virtual bool ResolveDns(const std::string& host, | 157 virtual bool ResolveDns(const std::string& host, |
| 157 ResolveDnsOperation op, | 158 ResolveDnsOperation op, |
| 158 std::string* output, | 159 std::string* output, |
| 159 bool* terminate) OVERRIDE; | 160 bool* terminate) OVERRIDE; |
| 160 virtual void Alert(const base::string16& message) OVERRIDE; | 161 virtual void Alert(const base::string16& message) OVERRIDE; |
| 161 virtual void OnError(int line_number, const base::string16& error) OVERRIDE; | 162 virtual void OnError(int line_number, const base::string16& error) OVERRIDE; |
| 162 | 163 |
| 163 bool ResolveDnsBlocking(const std::string& host, | 164 bool ResolveDnsBlocking(const std::string& host, |
| 164 ResolveDnsOperation op, | 165 ResolveDnsOperation op, |
| 165 std::string* output); | 166 std::string* output); |
| 166 | 167 |
| 167 bool ResolveDnsNonBlocking(const std::string& host, | 168 bool ResolveDnsNonBlocking(const std::string& host, |
| 168 ResolveDnsOperation op, | 169 ResolveDnsOperation op, |
| 169 std::string* output, | 170 std::string* output, |
| 170 bool* terminate); | 171 bool* terminate); |
| 171 | 172 |
| 172 bool PostDnsOperationAndWait(const std::string& host, | 173 bool PostDnsOperationAndWait(const std::string& host, |
| 173 ResolveDnsOperation op, | 174 ResolveDnsOperation op, |
| 174 bool* completed_synchronously) | 175 bool* completed_synchronously) |
| 175 WARN_UNUSED_RESULT; | 176 WARN_UNUSED_RESULT; |
| 176 | 177 |
| 177 void DoDnsOperation(); | 178 void DoDnsOperation(); |
| 178 void OnDnsOperationComplete(int result); | 179 void OnDnsOperationComplete(int result); |
| 179 | 180 |
| 180 void ScheduleRestartWithBlockingDns(); | 181 void ScheduleRestartWithBlockingDns(); |
| 181 | 182 |
| 182 bool GetDnsFromLocalCache(const std::string& host, ResolveDnsOperation op, | 183 bool GetDnsFromLocalCache(const std::string& host, |
| 183 std::string* output, bool* return_value); | 184 ResolveDnsOperation op, |
| 185 std::string* output, |
| 186 bool* return_value); |
| 184 | 187 |
| 185 void SaveDnsToLocalCache(const std::string& host, ResolveDnsOperation op, | 188 void SaveDnsToLocalCache(const std::string& host, |
| 186 int net_error, const net::AddressList& addresses); | 189 ResolveDnsOperation op, |
| 190 int net_error, |
| 191 const net::AddressList& addresses); |
| 187 | 192 |
| 188 // Builds a RequestInfo to service the specified PAC DNS operation. | 193 // Builds a RequestInfo to service the specified PAC DNS operation. |
| 189 static HostResolver::RequestInfo MakeDnsRequestInfo(const std::string& host, | 194 static HostResolver::RequestInfo MakeDnsRequestInfo(const std::string& host, |
| 190 ResolveDnsOperation op); | 195 ResolveDnsOperation op); |
| 191 | 196 |
| 192 // Makes a key for looking up |host, op| in |dns_cache_|. Strings are used for | 197 // Makes a key for looking up |host, op| in |dns_cache_|. Strings are used for |
| 193 // convenience, to avoid defining custom comparators. | 198 // convenience, to avoid defining custom comparators. |
| 194 static std::string MakeDnsCacheKey(const std::string& host, | 199 static std::string MakeDnsCacheKey(const std::string& host, |
| 195 ResolveDnsOperation op); | 200 ResolveDnsOperation op); |
| 196 | 201 |
| 197 void HandleAlertOrError(bool is_alert, int line_number, | 202 void HandleAlertOrError(bool is_alert, |
| 203 int line_number, |
| 198 const base::string16& message); | 204 const base::string16& message); |
| 199 void DispatchBufferedAlertsAndErrors(); | 205 void DispatchBufferedAlertsAndErrors(); |
| 200 void DispatchAlertOrError(bool is_alert, int line_number, | 206 void DispatchAlertOrError(bool is_alert, |
| 207 int line_number, |
| 201 const base::string16& message); | 208 const base::string16& message); |
| 202 | 209 |
| 203 void LogEventToCurrentRequestAndGlobally( | 210 void LogEventToCurrentRequestAndGlobally( |
| 204 NetLog::EventType type, | 211 NetLog::EventType type, |
| 205 const NetLog::ParametersCallback& parameters_callback); | 212 const NetLog::ParametersCallback& parameters_callback); |
| 206 | 213 |
| 207 // The thread which called into ProxyResolverV8Tracing, and on which the | 214 // The thread which called into ProxyResolverV8Tracing, and on which the |
| 208 // completion callback is expected to run. | 215 // completion callback is expected to run. |
| 209 scoped_refptr<base::MessageLoopProxy> origin_loop_; | 216 scoped_refptr<base::MessageLoopProxy> origin_loop_; |
| 210 | 217 |
| (...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 486 NetLog* ProxyResolverV8Tracing::Job::net_log() { | 493 NetLog* ProxyResolverV8Tracing::Job::net_log() { |
| 487 return parent_->net_log_; | 494 return parent_->net_log_; |
| 488 } | 495 } |
| 489 | 496 |
| 490 void ProxyResolverV8Tracing::Job::NotifyCaller(int result) { | 497 void ProxyResolverV8Tracing::Job::NotifyCaller(int result) { |
| 491 CheckIsOnWorkerThread(); | 498 CheckIsOnWorkerThread(); |
| 492 | 499 |
| 493 metrics_end_time_ = base::TimeTicks::Now(); | 500 metrics_end_time_ = base::TimeTicks::Now(); |
| 494 | 501 |
| 495 origin_loop_->PostTask( | 502 origin_loop_->PostTask( |
| 496 FROM_HERE, | 503 FROM_HERE, base::Bind(&Job::NotifyCallerOnOriginLoop, this, result)); |
| 497 base::Bind(&Job::NotifyCallerOnOriginLoop, this, result)); | |
| 498 } | 504 } |
| 499 | 505 |
| 500 void ProxyResolverV8Tracing::Job::NotifyCallerOnOriginLoop(int result) { | 506 void ProxyResolverV8Tracing::Job::NotifyCallerOnOriginLoop(int result) { |
| 501 CheckIsOnOriginThread(); | 507 CheckIsOnOriginThread(); |
| 502 | 508 |
| 503 if (cancelled_.IsSet()) | 509 if (cancelled_.IsSet()) |
| 504 return; | 510 return; |
| 505 | 511 |
| 506 DCHECK(!callback_.is_null()); | 512 DCHECK(!callback_.is_null()); |
| 507 DCHECK(!pending_dns_); | 513 DCHECK(!pending_dns_); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 524 | 530 |
| 525 owned_self_reference_ = NULL; | 531 owned_self_reference_ = NULL; |
| 526 } | 532 } |
| 527 | 533 |
| 528 void ProxyResolverV8Tracing::Job::RecordMetrics() const { | 534 void ProxyResolverV8Tracing::Job::RecordMetrics() const { |
| 529 CheckIsOnOriginThread(); | 535 CheckIsOnOriginThread(); |
| 530 DCHECK_EQ(GET_PROXY_FOR_URL, operation_); | 536 DCHECK_EQ(GET_PROXY_FOR_URL, operation_); |
| 531 | 537 |
| 532 base::TimeTicks now = base::TimeTicks::Now(); | 538 base::TimeTicks now = base::TimeTicks::Now(); |
| 533 | 539 |
| 534 // Metrics are output for each completed request to GetProxyForURL()). | 540 // Metrics are output for each completed request to GetProxyForURL()). |
| 535 // | 541 // |
| 536 // Note that a different set of histograms is used to record the metrics for | 542 // Note that a different set of histograms is used to record the metrics for |
| 537 // requests that completed in non-blocking mode versus blocking mode. The | 543 // requests that completed in non-blocking mode versus blocking mode. The |
| 538 // expectation is for requests to complete in non-blocking mode each time. | 544 // expectation is for requests to complete in non-blocking mode each time. |
| 539 // If they don't then something strange is happening, and the purpose of the | 545 // If they don't then something strange is happening, and the purpose of the |
| 540 // seprate statistics is to better understand that trend. | 546 // seprate statistics is to better understand that trend. |
| 541 #define UPDATE_HISTOGRAMS(base_name) \ | 547 #define UPDATE_HISTOGRAMS(base_name) \ |
| 542 do {\ | 548 do { \ |
| 543 UMA_HISTOGRAM_MEDIUM_TIMES(base_name "TotalTime", now - metrics_start_time_);\ | 549 UMA_HISTOGRAM_MEDIUM_TIMES(base_name "TotalTime", \ |
| 544 UMA_HISTOGRAM_MEDIUM_TIMES(base_name "TotalTimeWorkerThread",\ | 550 now - metrics_start_time_); \ |
| 545 metrics_end_time_ - metrics_start_time_);\ | 551 UMA_HISTOGRAM_MEDIUM_TIMES(base_name "TotalTimeWorkerThread", \ |
| 546 UMA_HISTOGRAM_TIMES(base_name "OriginThreadLatency",\ | 552 metrics_end_time_ - metrics_start_time_); \ |
| 547 now - metrics_end_time_);\ | 553 UMA_HISTOGRAM_TIMES(base_name "OriginThreadLatency", \ |
| 548 UMA_HISTOGRAM_MEDIUM_TIMES(base_name "TotalTimeDNS",\ | 554 now - metrics_end_time_); \ |
| 549 metrics_dns_total_time_);\ | 555 UMA_HISTOGRAM_MEDIUM_TIMES(base_name "TotalTimeDNS", \ |
| 550 UMA_HISTOGRAM_MEDIUM_TIMES(base_name "ExecutionTime",\ | 556 metrics_dns_total_time_); \ |
| 551 metrics_execution_time_);\ | 557 UMA_HISTOGRAM_MEDIUM_TIMES(base_name "ExecutionTime", \ |
| 552 UMA_HISTOGRAM_MEDIUM_TIMES(base_name "AbandonedExecutionTotalTime",\ | 558 metrics_execution_time_); \ |
| 553 metrics_abandoned_execution_total_time_);\ | 559 UMA_HISTOGRAM_MEDIUM_TIMES(base_name "AbandonedExecutionTotalTime", \ |
| 554 UMA_HISTOGRAM_MEDIUM_TIMES(base_name "DnsWaitTotalTime",\ | 560 metrics_abandoned_execution_total_time_); \ |
| 555 metrics_nonblocking_dns_wait_total_time_);\ | 561 UMA_HISTOGRAM_MEDIUM_TIMES(base_name "DnsWaitTotalTime", \ |
| 556 UMA_HISTOGRAM_CUSTOM_COUNTS(\ | 562 metrics_nonblocking_dns_wait_total_time_); \ |
| 557 base_name "NumRestarts", metrics_num_executions_ - 1,\ | 563 UMA_HISTOGRAM_CUSTOM_COUNTS(base_name "NumRestarts", \ |
| 558 1, kMaxUniqueResolveDnsPerExec, kMaxUniqueResolveDnsPerExec);\ | 564 metrics_num_executions_ - 1, \ |
| 559 UMA_HISTOGRAM_CUSTOM_COUNTS(\ | 565 1, \ |
| 560 base_name "UniqueDNS", metrics_num_unique_dns_,\ | 566 kMaxUniqueResolveDnsPerExec, \ |
| 561 1, kMaxUniqueResolveDnsPerExec, kMaxUniqueResolveDnsPerExec);\ | 567 kMaxUniqueResolveDnsPerExec); \ |
| 562 UMA_HISTOGRAM_COUNTS_100(base_name "NumAlerts", metrics_num_alerts_);\ | 568 UMA_HISTOGRAM_CUSTOM_COUNTS(base_name "UniqueDNS", \ |
| 563 UMA_HISTOGRAM_CUSTOM_COUNTS(\ | 569 metrics_num_unique_dns_, \ |
| 564 base_name "NumErrors", metrics_num_errors_, 1, 10, 10);\ | 570 1, \ |
| 571 kMaxUniqueResolveDnsPerExec, \ |
| 572 kMaxUniqueResolveDnsPerExec); \ |
| 573 UMA_HISTOGRAM_COUNTS_100(base_name "NumAlerts", metrics_num_alerts_); \ |
| 574 UMA_HISTOGRAM_CUSTOM_COUNTS( \ |
| 575 base_name "NumErrors", metrics_num_errors_, 1, 10, 10); \ |
| 565 } while (false) | 576 } while (false) |
| 566 | 577 |
| 567 if (!blocking_dns_) | 578 if (!blocking_dns_) |
| 568 UPDATE_HISTOGRAMS("Net.ProxyResolver."); | 579 UPDATE_HISTOGRAMS("Net.ProxyResolver."); |
| 569 else | 580 else |
| 570 UPDATE_HISTOGRAMS("Net.ProxyResolver.BlockingDNSMode."); | 581 UPDATE_HISTOGRAMS("Net.ProxyResolver.BlockingDNSMode."); |
| 571 | 582 |
| 572 #undef UPDATE_HISTOGRAMS | 583 #undef UPDATE_HISTOGRAMS |
| 573 | 584 |
| 574 // Histograms to better understand http://crbug.com/240536 -- long | 585 // Histograms to better understand http://crbug.com/240536 -- long |
| (...skipping 20 matching lines...) Expand all Loading... |
| 595 metrics_execution_time_); | 606 metrics_execution_time_); |
| 596 } | 607 } |
| 597 | 608 |
| 598 if (url_size > 131072) { | 609 if (url_size > 131072) { |
| 599 UMA_HISTOGRAM_MEDIUM_TIMES("Net.ProxyResolver.ExecutionTime_UrlOver128K", | 610 UMA_HISTOGRAM_MEDIUM_TIMES("Net.ProxyResolver.ExecutionTime_UrlOver128K", |
| 600 metrics_execution_time_); | 611 metrics_execution_time_); |
| 601 } | 612 } |
| 602 } | 613 } |
| 603 } | 614 } |
| 604 | 615 |
| 605 | 616 void ProxyResolverV8Tracing::Job::Start(Operation op, |
| 606 void ProxyResolverV8Tracing::Job::Start(Operation op, bool blocking_dns, | 617 bool blocking_dns, |
| 607 const CompletionCallback& callback) { | 618 const CompletionCallback& callback) { |
| 608 CheckIsOnOriginThread(); | 619 CheckIsOnOriginThread(); |
| 609 | 620 |
| 610 metrics_start_time_ = base::TimeTicks::Now(); | 621 metrics_start_time_ = base::TimeTicks::Now(); |
| 611 operation_ = op; | 622 operation_ = op; |
| 612 blocking_dns_ = blocking_dns; | 623 blocking_dns_ = blocking_dns; |
| 613 SetCallback(callback); | 624 SetCallback(callback); |
| 614 | 625 |
| 615 owned_self_reference_ = this; | 626 owned_self_reference_ = this; |
| 616 | 627 |
| 617 worker_loop()->PostTask(FROM_HERE, | 628 worker_loop()->PostTask(FROM_HERE, |
| 618 blocking_dns_ ? base::Bind(&Job::ExecuteBlocking, this) : | 629 blocking_dns_ |
| 619 base::Bind(&Job::ExecuteNonBlocking, this)); | 630 ? base::Bind(&Job::ExecuteBlocking, this) |
| 631 : base::Bind(&Job::ExecuteNonBlocking, this)); |
| 620 } | 632 } |
| 621 | 633 |
| 622 void ProxyResolverV8Tracing::Job::ExecuteBlocking() { | 634 void ProxyResolverV8Tracing::Job::ExecuteBlocking() { |
| 623 CheckIsOnWorkerThread(); | 635 CheckIsOnWorkerThread(); |
| 624 DCHECK(blocking_dns_); | 636 DCHECK(blocking_dns_); |
| 625 | 637 |
| 626 if (cancelled_.IsSet()) | 638 if (cancelled_.IsSet()) |
| 627 return; | 639 return; |
| 628 | 640 |
| 629 NotifyCaller(ExecuteProxyResolver()); | 641 NotifyCaller(ExecuteProxyResolver()); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 668 | 680 |
| 669 base::TimeTicks start = base::TimeTicks::Now(); | 681 base::TimeTicks start = base::TimeTicks::Now(); |
| 670 | 682 |
| 671 JSBindings* prev_bindings = v8_resolver()->js_bindings(); | 683 JSBindings* prev_bindings = v8_resolver()->js_bindings(); |
| 672 v8_resolver()->set_js_bindings(this); | 684 v8_resolver()->set_js_bindings(this); |
| 673 | 685 |
| 674 int result = ERR_UNEXPECTED; // Initialized to silence warnings. | 686 int result = ERR_UNEXPECTED; // Initialized to silence warnings. |
| 675 | 687 |
| 676 switch (operation_) { | 688 switch (operation_) { |
| 677 case SET_PAC_SCRIPT: | 689 case SET_PAC_SCRIPT: |
| 678 result = v8_resolver()->SetPacScript( | 690 result = v8_resolver()->SetPacScript(script_data_, CompletionCallback()); |
| 679 script_data_, CompletionCallback()); | |
| 680 break; | 691 break; |
| 681 case GET_PROXY_FOR_URL: | 692 case GET_PROXY_FOR_URL: |
| 682 result = v8_resolver()->GetProxyForURL( | 693 result = v8_resolver()->GetProxyForURL( |
| 683 url_, | 694 url_, |
| 684 // Important: Do not write directly into |user_results_|, since if the | 695 // Important: Do not write directly into |user_results_|, since if the |
| 685 // request were to be cancelled from the origin thread, must guarantee | 696 // request were to be cancelled from the origin thread, must guarantee |
| 686 // that |user_results_| is not accessed anymore. | 697 // that |user_results_| is not accessed anymore. |
| 687 &results_, | 698 &results_, |
| 688 CompletionCallback(), | 699 CompletionCallback(), |
| 689 NULL, | 700 NULL, |
| 690 bound_net_log_); | 701 bound_net_log_); |
| 691 break; | 702 break; |
| 692 } | 703 } |
| 693 | 704 |
| 694 v8_resolver()->set_js_bindings(prev_bindings); | 705 v8_resolver()->set_js_bindings(prev_bindings); |
| 695 | 706 |
| 696 metrics_execution_time_ = base::TimeTicks::Now() - start; | 707 metrics_execution_time_ = base::TimeTicks::Now() - start; |
| 697 | 708 |
| 698 return result; | 709 return result; |
| 699 } | 710 } |
| 700 | 711 |
| 701 bool ProxyResolverV8Tracing::Job::ResolveDns(const std::string& host, | 712 bool ProxyResolverV8Tracing::Job::ResolveDns(const std::string& host, |
| 702 ResolveDnsOperation op, | 713 ResolveDnsOperation op, |
| 703 std::string* output, | 714 std::string* output, |
| 704 bool* terminate) { | 715 bool* terminate) { |
| 705 if (cancelled_.IsSet()) { | 716 if (cancelled_.IsSet()) { |
| 706 *terminate = true; | 717 *terminate = true; |
| 707 return false; | 718 return false; |
| 708 } | 719 } |
| 709 | 720 |
| 710 if ((op == DNS_RESOLVE || op == DNS_RESOLVE_EX) && host.empty()) { | 721 if ((op == DNS_RESOLVE || op == DNS_RESOLVE_EX) && host.empty()) { |
| 711 // a DNS resolve with an empty hostname is considered an error. | 722 // a DNS resolve with an empty hostname is considered an error. |
| 712 return false; | 723 return false; |
| 713 } | 724 } |
| 714 | 725 |
| 715 return blocking_dns_ ? | 726 return blocking_dns_ ? ResolveDnsBlocking(host, op, output) |
| 716 ResolveDnsBlocking(host, op, output) : | 727 : ResolveDnsNonBlocking(host, op, output, terminate); |
| 717 ResolveDnsNonBlocking(host, op, output, terminate); | |
| 718 } | 728 } |
| 719 | 729 |
| 720 void ProxyResolverV8Tracing::Job::Alert(const base::string16& message) { | 730 void ProxyResolverV8Tracing::Job::Alert(const base::string16& message) { |
| 721 HandleAlertOrError(true, -1, message); | 731 HandleAlertOrError(true, -1, message); |
| 722 } | 732 } |
| 723 | 733 |
| 724 void ProxyResolverV8Tracing::Job::OnError(int line_number, | 734 void ProxyResolverV8Tracing::Job::OnError(int line_number, |
| 725 const base::string16& error) { | 735 const base::string16& error) { |
| 726 HandleAlertOrError(false, line_number, error); | 736 HandleAlertOrError(false, line_number, error); |
| 727 } | 737 } |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 805 // Otherwise if the result was not in the cache, then a DNS request has | 815 // Otherwise if the result was not in the cache, then a DNS request has |
| 806 // been started. Abandon this invocation of FindProxyForURL(), it will be | 816 // been started. Abandon this invocation of FindProxyForURL(), it will be |
| 807 // restarted once the DNS request completes. | 817 // restarted once the DNS request completes. |
| 808 abandoned_ = true; | 818 abandoned_ = true; |
| 809 *terminate = true; | 819 *terminate = true; |
| 810 last_num_dns_ = num_dns_; | 820 last_num_dns_ = num_dns_; |
| 811 return false; | 821 return false; |
| 812 } | 822 } |
| 813 | 823 |
| 814 bool ProxyResolverV8Tracing::Job::PostDnsOperationAndWait( | 824 bool ProxyResolverV8Tracing::Job::PostDnsOperationAndWait( |
| 815 const std::string& host, ResolveDnsOperation op, | 825 const std::string& host, |
| 826 ResolveDnsOperation op, |
| 816 bool* completed_synchronously) { | 827 bool* completed_synchronously) { |
| 817 | |
| 818 base::TimeTicks start = base::TimeTicks::Now(); | 828 base::TimeTicks start = base::TimeTicks::Now(); |
| 819 | 829 |
| 820 // Post the DNS request to the origin thread. | 830 // Post the DNS request to the origin thread. |
| 821 DCHECK(!pending_dns_); | 831 DCHECK(!pending_dns_); |
| 822 metrics_pending_dns_start_ = base::TimeTicks::Now(); | 832 metrics_pending_dns_start_ = base::TimeTicks::Now(); |
| 823 pending_dns_host_ = host; | 833 pending_dns_host_ = host; |
| 824 pending_dns_op_ = op; | 834 pending_dns_op_ = op; |
| 825 origin_loop_->PostTask(FROM_HERE, base::Bind(&Job::DoDnsOperation, this)); | 835 origin_loop_->PostTask(FROM_HERE, base::Bind(&Job::DoDnsOperation, this)); |
| 826 | 836 |
| 827 event_.Wait(); | 837 event_.Wait(); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 880 event_.Signal(); | 890 event_.Signal(); |
| 881 } | 891 } |
| 882 } | 892 } |
| 883 | 893 |
| 884 void ProxyResolverV8Tracing::Job::OnDnsOperationComplete(int result) { | 894 void ProxyResolverV8Tracing::Job::OnDnsOperationComplete(int result) { |
| 885 CheckIsOnOriginThread(); | 895 CheckIsOnOriginThread(); |
| 886 | 896 |
| 887 DCHECK(!cancelled_.IsSet()); | 897 DCHECK(!cancelled_.IsSet()); |
| 888 DCHECK(pending_dns_completed_synchronously_ == (pending_dns_ == NULL)); | 898 DCHECK(pending_dns_completed_synchronously_ == (pending_dns_ == NULL)); |
| 889 | 899 |
| 890 SaveDnsToLocalCache(pending_dns_host_, pending_dns_op_, result, | 900 SaveDnsToLocalCache( |
| 891 pending_dns_addresses_); | 901 pending_dns_host_, pending_dns_op_, result, pending_dns_addresses_); |
| 892 pending_dns_ = NULL; | 902 pending_dns_ = NULL; |
| 893 | 903 |
| 894 metrics_dns_total_time_ += | 904 metrics_dns_total_time_ += |
| 895 base::TimeTicks::Now() - metrics_pending_dns_start_; | 905 base::TimeTicks::Now() - metrics_pending_dns_start_; |
| 896 | 906 |
| 897 if (blocking_dns_) { | 907 if (blocking_dns_) { |
| 898 event_.Signal(); | 908 event_.Signal(); |
| 899 return; | 909 return; |
| 900 } | 910 } |
| 901 | 911 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 913 DCHECK(!should_restart_with_blocking_dns_); | 923 DCHECK(!should_restart_with_blocking_dns_); |
| 914 DCHECK(!abandoned_); | 924 DCHECK(!abandoned_); |
| 915 DCHECK(!blocking_dns_); | 925 DCHECK(!blocking_dns_); |
| 916 | 926 |
| 917 abandoned_ = true; | 927 abandoned_ = true; |
| 918 | 928 |
| 919 // The restart will happen after ExecuteNonBlocking() finishes. | 929 // The restart will happen after ExecuteNonBlocking() finishes. |
| 920 should_restart_with_blocking_dns_ = true; | 930 should_restart_with_blocking_dns_ = true; |
| 921 } | 931 } |
| 922 | 932 |
| 923 bool ProxyResolverV8Tracing::Job::GetDnsFromLocalCache( | 933 bool ProxyResolverV8Tracing::Job::GetDnsFromLocalCache(const std::string& host, |
| 924 const std::string& host, | 934 ResolveDnsOperation op, |
| 925 ResolveDnsOperation op, | 935 std::string* output, |
| 926 std::string* output, | 936 bool* return_value) { |
| 927 bool* return_value) { | |
| 928 CheckIsOnWorkerThread(); | 937 CheckIsOnWorkerThread(); |
| 929 | 938 |
| 930 DnsCache::const_iterator it = dns_cache_.find(MakeDnsCacheKey(host, op)); | 939 DnsCache::const_iterator it = dns_cache_.find(MakeDnsCacheKey(host, op)); |
| 931 if (it == dns_cache_.end()) | 940 if (it == dns_cache_.end()) |
| 932 return false; | 941 return false; |
| 933 | 942 |
| 934 *output = it->second; | 943 *output = it->second; |
| 935 *return_value = !it->second.empty(); | 944 *return_value = !it->second.empty(); |
| 936 return true; | 945 return true; |
| 937 } | 946 } |
| 938 | 947 |
| 939 void ProxyResolverV8Tracing::Job::SaveDnsToLocalCache( | 948 void ProxyResolverV8Tracing::Job::SaveDnsToLocalCache( |
| 940 const std::string& host, | 949 const std::string& host, |
| 941 ResolveDnsOperation op, | 950 ResolveDnsOperation op, |
| 942 int net_error, | 951 int net_error, |
| 943 const net::AddressList& addresses) { | 952 const net::AddressList& addresses) { |
| 944 CheckIsOnOriginThread(); | 953 CheckIsOnOriginThread(); |
| 945 | 954 |
| 946 // Serialize the result into a string to save to the cache. | 955 // Serialize the result into a string to save to the cache. |
| 947 std::string cache_value; | 956 std::string cache_value; |
| 948 if (net_error != OK) { | 957 if (net_error != OK) { |
| 949 cache_value = std::string(); | 958 cache_value = std::string(); |
| 950 } else if (op == DNS_RESOLVE || op == MY_IP_ADDRESS) { | 959 } else if (op == DNS_RESOLVE || op == MY_IP_ADDRESS) { |
| 951 // dnsResolve() and myIpAddress() are expected to return a single IP | 960 // dnsResolve() and myIpAddress() are expected to return a single IP |
| 952 // address. | 961 // address. |
| 953 cache_value = addresses.front().ToStringWithoutPort(); | 962 cache_value = addresses.front().ToStringWithoutPort(); |
| 954 } else { | 963 } else { |
| 955 // The *Ex versions are expected to return a semi-colon separated list. | 964 // The *Ex versions are expected to return a semi-colon separated list. |
| 956 for (AddressList::const_iterator iter = addresses.begin(); | 965 for (AddressList::const_iterator iter = addresses.begin(); |
| 957 iter != addresses.end(); ++iter) { | 966 iter != addresses.end(); |
| 967 ++iter) { |
| 958 if (!cache_value.empty()) | 968 if (!cache_value.empty()) |
| 959 cache_value += ";"; | 969 cache_value += ";"; |
| 960 cache_value += iter->ToStringWithoutPort(); | 970 cache_value += iter->ToStringWithoutPort(); |
| 961 } | 971 } |
| 962 } | 972 } |
| 963 | 973 |
| 964 dns_cache_[MakeDnsCacheKey(host, op)] = cache_value; | 974 dns_cache_[MakeDnsCacheKey(host, op)] = cache_value; |
| 965 } | 975 } |
| 966 | 976 |
| 967 // static | 977 // static |
| 968 HostResolver::RequestInfo ProxyResolverV8Tracing::Job::MakeDnsRequestInfo( | 978 HostResolver::RequestInfo ProxyResolverV8Tracing::Job::MakeDnsRequestInfo( |
| 969 const std::string& host, ResolveDnsOperation op) { | 979 const std::string& host, |
| 980 ResolveDnsOperation op) { |
| 970 HostPortPair host_port = HostPortPair(host, 80); | 981 HostPortPair host_port = HostPortPair(host, 80); |
| 971 if (op == MY_IP_ADDRESS || op == MY_IP_ADDRESS_EX) { | 982 if (op == MY_IP_ADDRESS || op == MY_IP_ADDRESS_EX) { |
| 972 host_port.set_host(GetHostName()); | 983 host_port.set_host(GetHostName()); |
| 973 } | 984 } |
| 974 | 985 |
| 975 HostResolver::RequestInfo info(host_port); | 986 HostResolver::RequestInfo info(host_port); |
| 976 | 987 |
| 977 // The non-ex flavors are limited to IPv4 results. | 988 // The non-ex flavors are limited to IPv4 results. |
| 978 if (op == MY_IP_ADDRESS || op == DNS_RESOLVE) { | 989 if (op == MY_IP_ADDRESS || op == DNS_RESOLVE) { |
| 979 info.set_address_family(ADDRESS_FAMILY_IPV4); | 990 info.set_address_family(ADDRESS_FAMILY_IPV4); |
| 980 } | 991 } |
| 981 | 992 |
| 982 return info; | 993 return info; |
| 983 } | 994 } |
| 984 | 995 |
| 985 std::string ProxyResolverV8Tracing::Job::MakeDnsCacheKey( | 996 std::string ProxyResolverV8Tracing::Job::MakeDnsCacheKey( |
| 986 const std::string& host, ResolveDnsOperation op) { | 997 const std::string& host, |
| 998 ResolveDnsOperation op) { |
| 987 return base::StringPrintf("%d:%s", op, host.c_str()); | 999 return base::StringPrintf("%d:%s", op, host.c_str()); |
| 988 } | 1000 } |
| 989 | 1001 |
| 990 void ProxyResolverV8Tracing::Job::HandleAlertOrError( | 1002 void ProxyResolverV8Tracing::Job::HandleAlertOrError( |
| 991 bool is_alert, | 1003 bool is_alert, |
| 992 int line_number, | 1004 int line_number, |
| 993 const base::string16& message) { | 1005 const base::string16& message) { |
| 994 CheckIsOnWorkerThread(); | 1006 CheckIsOnWorkerThread(); |
| 995 | 1007 |
| 996 if (cancelled_.IsSet()) | 1008 if (cancelled_.IsSet()) |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1027 DCHECK(!blocking_dns_); | 1039 DCHECK(!blocking_dns_); |
| 1028 DCHECK(!abandoned_); | 1040 DCHECK(!abandoned_); |
| 1029 | 1041 |
| 1030 for (size_t i = 0; i < alerts_and_errors_.size(); ++i) { | 1042 for (size_t i = 0; i < alerts_and_errors_.size(); ++i) { |
| 1031 const AlertOrError& x = alerts_and_errors_[i]; | 1043 const AlertOrError& x = alerts_and_errors_[i]; |
| 1032 DispatchAlertOrError(x.is_alert, x.line_number, x.message); | 1044 DispatchAlertOrError(x.is_alert, x.line_number, x.message); |
| 1033 } | 1045 } |
| 1034 } | 1046 } |
| 1035 | 1047 |
| 1036 void ProxyResolverV8Tracing::Job::DispatchAlertOrError( | 1048 void ProxyResolverV8Tracing::Job::DispatchAlertOrError( |
| 1037 bool is_alert, int line_number, const base::string16& message) { | 1049 bool is_alert, |
| 1050 int line_number, |
| 1051 const base::string16& message) { |
| 1038 CheckIsOnWorkerThread(); | 1052 CheckIsOnWorkerThread(); |
| 1039 | 1053 |
| 1040 // Note that the handling of cancellation is racy with regard to | 1054 // Note that the handling of cancellation is racy with regard to |
| 1041 // alerts/errors. The request might get cancelled shortly after this | 1055 // alerts/errors. The request might get cancelled shortly after this |
| 1042 // check! (There is no lock being held to guarantee otherwise). | 1056 // check! (There is no lock being held to guarantee otherwise). |
| 1043 // | 1057 // |
| 1044 // If this happens, then some information will get written to the NetLog | 1058 // If this happens, then some information will get written to the NetLog |
| 1045 // needlessly, however the NetLog will still be alive so it shouldn't cause | 1059 // needlessly, however the NetLog will still be alive so it shouldn't cause |
| 1046 // problems. | 1060 // problems. |
| 1047 if (cancelled_.IsSet()) | 1061 if (cancelled_.IsSet()) |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1059 NetLog::TYPE_PAC_JAVASCRIPT_ALERT, | 1073 NetLog::TYPE_PAC_JAVASCRIPT_ALERT, |
| 1060 NetLog::StringCallback("message", &message)); | 1074 NetLog::StringCallback("message", &message)); |
| 1061 } else { | 1075 } else { |
| 1062 // ------------------- | 1076 // ------------------- |
| 1063 // error | 1077 // error |
| 1064 // ------------------- | 1078 // ------------------- |
| 1065 IncrementWithoutOverflow(&metrics_num_errors_); | 1079 IncrementWithoutOverflow(&metrics_num_errors_); |
| 1066 if (line_number == -1) | 1080 if (line_number == -1) |
| 1067 VLOG(1) << "PAC-error: " << message; | 1081 VLOG(1) << "PAC-error: " << message; |
| 1068 else | 1082 else |
| 1069 VLOG(1) << "PAC-error: " << "line: " << line_number << ": " << message; | 1083 VLOG(1) << "PAC-error: " |
| 1084 << "line: " << line_number << ": " << message; |
| 1070 | 1085 |
| 1071 // Send the error to the NetLog. | 1086 // Send the error to the NetLog. |
| 1072 LogEventToCurrentRequestAndGlobally( | 1087 LogEventToCurrentRequestAndGlobally( |
| 1073 NetLog::TYPE_PAC_JAVASCRIPT_ERROR, | 1088 NetLog::TYPE_PAC_JAVASCRIPT_ERROR, |
| 1074 base::Bind(&NetLogErrorCallback, line_number, &message)); | 1089 base::Bind(&NetLogErrorCallback, line_number, &message)); |
| 1075 | 1090 |
| 1076 if (error_observer()) | 1091 if (error_observer()) |
| 1077 error_observer()->OnPACScriptError(line_number, message); | 1092 error_observer()->OnPACScriptError(line_number, message); |
| 1078 } | 1093 } |
| 1079 } | 1094 } |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1164 DCHECK(!set_pac_script_job_.get()); | 1179 DCHECK(!set_pac_script_job_.get()); |
| 1165 CHECK_EQ(0, num_outstanding_callbacks_); | 1180 CHECK_EQ(0, num_outstanding_callbacks_); |
| 1166 | 1181 |
| 1167 set_pac_script_job_ = new Job(this); | 1182 set_pac_script_job_ = new Job(this); |
| 1168 set_pac_script_job_->StartSetPacScript(script_data, callback); | 1183 set_pac_script_job_->StartSetPacScript(script_data, callback); |
| 1169 | 1184 |
| 1170 return ERR_IO_PENDING; | 1185 return ERR_IO_PENDING; |
| 1171 } | 1186 } |
| 1172 | 1187 |
| 1173 } // namespace net | 1188 } // namespace net |
| OLD | NEW |