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

Side by Side Diff: net/nqe/network_quality_estimator.cc

Issue 2107243003: NQE: Record correlation metric in UMA (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed Ilya's comments Created 4 years, 5 months 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/nqe/network_quality_estimator.h" 5 #include "net/nqe/network_quality_estimator.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 #include <limits> 9 #include <limits>
10 #include <utility> 10 #include <utility>
11 #include <vector> 11 #include <vector>
12 12
13 #include "base/bind_helpers.h" 13 #include "base/bind_helpers.h"
14 #include "base/location.h" 14 #include "base/location.h"
15 #include "base/logging.h" 15 #include "base/logging.h"
16 #include "base/metrics/histogram.h" 16 #include "base/metrics/histogram.h"
17 #include "base/metrics/histogram_base.h" 17 #include "base/metrics/histogram_base.h"
18 #include "base/metrics/sparse_histogram.h"
19 #include "base/rand_util.h"
18 #include "base/single_thread_task_runner.h" 20 #include "base/single_thread_task_runner.h"
19 #include "base/strings/string_number_conversions.h" 21 #include "base/strings/string_number_conversions.h"
20 #include "base/threading/thread_task_runner_handle.h" 22 #include "base/threading/thread_task_runner_handle.h"
21 #include "base/time/default_tick_clock.h" 23 #include "base/time/default_tick_clock.h"
22 #include "base/trace_event/trace_event.h" 24 #include "base/trace_event/trace_event.h"
23 #include "build/build_config.h" 25 #include "build/build_config.h"
24 #include "net/base/load_flags.h" 26 #include "net/base/load_flags.h"
25 #include "net/base/load_timing_info.h" 27 #include "net/base/load_timing_info.h"
26 #include "net/base/network_interfaces.h" 28 #include "net/base/network_interfaces.h"
27 #include "net/base/url_util.h" 29 #include "net/base/url_util.h"
30 #include "net/http/http_status_code.h"
28 #include "net/nqe/socket_watcher_factory.h" 31 #include "net/nqe/socket_watcher_factory.h"
29 #include "net/nqe/throughput_analyzer.h" 32 #include "net/nqe/throughput_analyzer.h"
30 #include "net/url_request/url_request.h" 33 #include "net/url_request/url_request.h"
34 #include "net/url_request/url_request_status.h"
31 #include "url/gurl.h" 35 #include "url/gurl.h"
32 36
33 #if defined(OS_ANDROID) 37 #if defined(OS_ANDROID)
34 #include "net/android/cellular_signal_strength.h" 38 #include "net/android/cellular_signal_strength.h"
35 #include "net/android/network_library.h" 39 #include "net/android/network_library.h"
36 #endif // OS_ANDROID 40 #endif // OS_ANDROID
37 41
38 namespace { 42 namespace {
39 43
40 // Default value of the half life (in seconds) for computing time weighted 44 // Default value of the half life (in seconds) for computing time weighted
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 146
143 bool GetValueForVariationParam( 147 bool GetValueForVariationParam(
144 const std::map<std::string, std::string>& variation_params, 148 const std::map<std::string, std::string>& variation_params,
145 const std::string& parameter_name, 149 const std::string& parameter_name,
146 int32_t* variations_value) { 150 int32_t* variations_value) {
147 const auto it = variation_params.find(parameter_name); 151 const auto it = variation_params.find(parameter_name);
148 return it != variation_params.end() && 152 return it != variation_params.end() &&
149 base::StringToInt(it->second, variations_value); 153 base::StringToInt(it->second, variations_value);
150 } 154 }
151 155
156 // Returns the variation value for |parameter_name|. If the value is
157 // unavailable, |default_value| is returned.
158 double GetDoubleValueForVariationParamWithDefaultValue(
159 const std::map<std::string, std::string>& variation_params,
160 const std::string& parameter_name,
161 double default_value) {
162 const auto it = variation_params.find(parameter_name);
163 if (it == variation_params.end())
164 return default_value;
165
166 double variations_value = default_value;
167 if (!base::StringToDouble(it->second, &variations_value))
168 return default_value;
169 return variations_value;
170 }
171
152 // Returns the algorithm that should be used for computing effective connection 172 // Returns the algorithm that should be used for computing effective connection
153 // type based on field trial params. Returns an empty string if a valid 173 // type based on field trial params. Returns an empty string if a valid
154 // algorithm paramter is not present in the field trial params. 174 // algorithm paramter is not present in the field trial params.
155 std::string GetEffectiveConnectionTypeAlgorithm( 175 std::string GetEffectiveConnectionTypeAlgorithm(
156 const std::map<std::string, std::string>& variation_params) { 176 const std::map<std::string, std::string>& variation_params) {
157 const auto it = variation_params.find("effective_connection_type_algorithm"); 177 const auto it = variation_params.find("effective_connection_type_algorithm");
158 if (it == variation_params.end()) 178 if (it == variation_params.end())
159 return std::string(); 179 return std::string();
160 return it->second; 180 return it->second;
161 } 181 }
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 static const char* const kSuffixes[] = { 229 static const char* const kSuffixes[] = {
210 "0_20", "20_60", "60_140", "140_300", "300_620", 230 "0_20", "20_60", "60_140", "140_300", "300_620",
211 "620_1260", "1260_2540", "2540_5100", "5100_Infinity"}; 231 "620_1260", "1260_2540", "2540_5100", "5100_Infinity"};
212 for (size_t i = 0; i < arraysize(kSuffixes) - 1; ++i) { 232 for (size_t i = 0; i < arraysize(kSuffixes) - 1; ++i) {
213 if (observed_throughput_kbps <= static_cast<float>((20 * (2 << i) - 20))) 233 if (observed_throughput_kbps <= static_cast<float>((20 * (2 << i) - 20)))
214 return kSuffixes[i]; 234 return kSuffixes[i];
215 } 235 }
216 return kSuffixes[arraysize(kSuffixes) - 1]; 236 return kSuffixes[arraysize(kSuffixes) - 1];
217 } 237 }
218 238
239 // The least significant kTrimBits of the metric will be discarded. If the
240 // trimmed metric value is greater than what can be fit in kBitsPerMetric bits,
241 // then the largest value that can be represented in kBitsPerMetric bits is
242 // returned.
243 const int32_t kTrimBits = 5;
244
245 // Maximum number of bits in which one metric should fit. Restricting the amount
246 // of space allocated to a single metric makes it possile to fit multiple
247 // metrics in a single histogram sample, and ensures that all those metrics
248 // are recorded together as a single tuple.
249 const int32_t kBitsPerMetric = 7;
Ilya Sherman 2016/07/21 23:39:51 Did you want to set this to 8? (And update the cod
tbansal1 2016/07/22 00:15:44 I want to keep the 4 bits unused. I might add Effe
250
251 static_assert(32 >= kBitsPerMetric * 4,
252 "Four metrics would not fit in a 32-bit int");
253
254 // Trims the |metric| by removing the last kTrimBits, and then rounding down
255 // the |metric| such that the |metric| fits in kBitsPerMetric.
256 int32_t FitInKBitsPerMetricBits(int32_t metric) {
257 // Remove the last kTrimBits. This will allow the metric to fit within
258 // kBitsPerMetric while losing only the least significant bits.
259 metric = metric >> kTrimBits;
260
261 // kLargestValuePossible is the largest value that can be recorded using
262 // kBitsPerMetric.
263 static const int32_t kLargestValuePossible = (1 << kBitsPerMetric) - 1;
264 if (metric > kLargestValuePossible) {
265 // Fit |metric| in kBitsPerMetric by clamping it down.
266 metric = kLargestValuePossible;
267 }
268 DCHECK_EQ(0, metric >> kBitsPerMetric);
269 return metric;
270 }
271
219 } // namespace 272 } // namespace
220 273
221 namespace net { 274 namespace net {
222 275
223 NetworkQualityEstimator::NetworkQualityEstimator( 276 NetworkQualityEstimator::NetworkQualityEstimator(
224 std::unique_ptr<ExternalEstimateProvider> external_estimates_provider, 277 std::unique_ptr<ExternalEstimateProvider> external_estimates_provider,
225 const std::map<std::string, std::string>& variation_params) 278 const std::map<std::string, std::string>& variation_params)
226 : NetworkQualityEstimator(std::move(external_estimates_provider), 279 : NetworkQualityEstimator(std::move(external_estimates_provider),
227 variation_params, 280 variation_params,
228 false, 281 false,
(...skipping 29 matching lines...) Expand all
258 NetworkID(NetworkChangeNotifier::ConnectionType::CONNECTION_UNKNOWN, 311 NetworkID(NetworkChangeNotifier::ConnectionType::CONNECTION_UNKNOWN,
259 std::string())), 312 std::string())),
260 downstream_throughput_kbps_observations_(weight_multiplier_per_second_), 313 downstream_throughput_kbps_observations_(weight_multiplier_per_second_),
261 rtt_observations_(weight_multiplier_per_second_), 314 rtt_observations_(weight_multiplier_per_second_),
262 effective_connection_type_at_last_main_frame_( 315 effective_connection_type_at_last_main_frame_(
263 EFFECTIVE_CONNECTION_TYPE_UNKNOWN), 316 EFFECTIVE_CONNECTION_TYPE_UNKNOWN),
264 external_estimate_provider_(std::move(external_estimates_provider)), 317 external_estimate_provider_(std::move(external_estimates_provider)),
265 effective_connection_type_(EFFECTIVE_CONNECTION_TYPE_UNKNOWN), 318 effective_connection_type_(EFFECTIVE_CONNECTION_TYPE_UNKNOWN),
266 min_signal_strength_since_connection_change_(INT32_MAX), 319 min_signal_strength_since_connection_change_(INT32_MAX),
267 max_signal_strength_since_connection_change_(INT32_MIN), 320 max_signal_strength_since_connection_change_(INT32_MIN),
321 correlation_uma_logging_probability_(
322 GetDoubleValueForVariationParamWithDefaultValue(
323 variation_params,
324 "correlation_logging_probability",
325 0.0)),
268 weak_ptr_factory_(this) { 326 weak_ptr_factory_(this) {
269 static_assert(kDefaultHalfLifeSeconds > 0, 327 static_assert(kDefaultHalfLifeSeconds > 0,
270 "Default half life duration must be > 0"); 328 "Default half life duration must be > 0");
271 static_assert(kMaximumNetworkQualityCacheSize > 0, 329 static_assert(kMaximumNetworkQualityCacheSize > 0,
272 "Size of the network quality cache must be > 0"); 330 "Size of the network quality cache must be > 0");
273 // This limit should not be increased unless the logic for removing the 331 // This limit should not be increased unless the logic for removing the
274 // oldest cache entry is rewritten to use a doubly-linked-list LRU queue. 332 // oldest cache entry is rewritten to use a doubly-linked-list LRU queue.
275 static_assert(kMaximumNetworkQualityCacheSize <= 10, 333 static_assert(kMaximumNetworkQualityCacheSize <= 10,
276 "Size of the network quality cache must <= 10"); 334 "Size of the network quality cache must <= 10");
277 // None of the algorithms can have an empty name. 335 // None of the algorithms can have an empty name.
278 DCHECK(algorithm_name_to_enum_.end() == 336 DCHECK(algorithm_name_to_enum_.end() ==
279 algorithm_name_to_enum_.find(std::string())); 337 algorithm_name_to_enum_.find(std::string()));
280 338
281 DCHECK_EQ(algorithm_name_to_enum_.size(), 339 DCHECK_EQ(algorithm_name_to_enum_.size(),
282 static_cast<size_t>(EffectiveConnectionTypeAlgorithm:: 340 static_cast<size_t>(EffectiveConnectionTypeAlgorithm::
283 EFFECTIVE_CONNECTION_TYPE_ALGORITHM_LAST)); 341 EFFECTIVE_CONNECTION_TYPE_ALGORITHM_LAST));
284 DCHECK_NE(EffectiveConnectionTypeAlgorithm:: 342 DCHECK_NE(EffectiveConnectionTypeAlgorithm::
285 EFFECTIVE_CONNECTION_TYPE_ALGORITHM_LAST, 343 EFFECTIVE_CONNECTION_TYPE_ALGORITHM_LAST,
286 effective_connection_type_algorithm_); 344 effective_connection_type_algorithm_);
345 DCHECK_LE(0.0, correlation_uma_logging_probability_);
346 DCHECK_GE(1.0, correlation_uma_logging_probability_);
287 347
288 ObtainOperatingParams(variation_params); 348 ObtainOperatingParams(variation_params);
289 ObtainEffectiveConnectionTypeModelParams(variation_params); 349 ObtainEffectiveConnectionTypeModelParams(variation_params);
290 NetworkChangeNotifier::AddConnectionTypeObserver(this); 350 NetworkChangeNotifier::AddConnectionTypeObserver(this);
291 if (external_estimate_provider_) { 351 if (external_estimate_provider_) {
292 RecordExternalEstimateProviderMetrics( 352 RecordExternalEstimateProviderMetrics(
293 EXTERNAL_ESTIMATE_PROVIDER_STATUS_AVAILABLE); 353 EXTERNAL_ESTIMATE_PROVIDER_STATUS_AVAILABLE);
294 external_estimate_provider_->SetUpdatedEstimateDelegate(this); 354 external_estimate_provider_->SetUpdatedEstimateDelegate(this);
295 } else { 355 } else {
296 RecordExternalEstimateProviderMetrics( 356 RecordExternalEstimateProviderMetrics(
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
536 596
537 LoadTimingInfo load_timing_info; 597 LoadTimingInfo load_timing_info;
538 request.GetLoadTimingInfo(&load_timing_info); 598 request.GetLoadTimingInfo(&load_timing_info);
539 599
540 // If the load timing info is unavailable, it probably means that the request 600 // If the load timing info is unavailable, it probably means that the request
541 // did not go over the network. 601 // did not go over the network.
542 if (load_timing_info.send_start.is_null() || 602 if (load_timing_info.send_start.is_null() ||
543 load_timing_info.receive_headers_end.is_null()) { 603 load_timing_info.receive_headers_end.is_null()) {
544 return; 604 return;
545 } 605 }
606 DCHECK(!request.response_info().was_cached);
546 607
547 // Duration between when the resource was requested and when the response 608 // Duration between when the resource was requested and when the response
548 // headers were received. 609 // headers were received.
549 base::TimeDelta observed_http_rtt = 610 base::TimeDelta observed_http_rtt =
550 load_timing_info.receive_headers_end - load_timing_info.send_start; 611 load_timing_info.receive_headers_end - load_timing_info.send_start;
551 DCHECK_GE(observed_http_rtt, base::TimeDelta()); 612 DCHECK_GE(observed_http_rtt, base::TimeDelta());
552 if (observed_http_rtt < peak_network_quality_.http_rtt()) { 613 if (observed_http_rtt < peak_network_quality_.http_rtt()) {
553 peak_network_quality_ = nqe::internal::NetworkQuality( 614 peak_network_quality_ = nqe::internal::NetworkQuality(
554 observed_http_rtt, peak_network_quality_.transport_rtt(), 615 observed_http_rtt, peak_network_quality_.transport_rtt(),
555 peak_network_quality_.downstream_throughput_kbps()); 616 peak_network_quality_.downstream_throughput_kbps());
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
677 void NetworkQualityEstimator::NotifyRequestCompleted( 738 void NetworkQualityEstimator::NotifyRequestCompleted(
678 const URLRequest& request) { 739 const URLRequest& request) {
679 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("net"), 740 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("net"),
680 "NetworkQualityEstimator::NotifyRequestCompleted"); 741 "NetworkQualityEstimator::NotifyRequestCompleted");
681 DCHECK(thread_checker_.CalledOnValidThread()); 742 DCHECK(thread_checker_.CalledOnValidThread());
682 743
683 if (!RequestSchemeIsHTTPOrHTTPS(request)) 744 if (!RequestSchemeIsHTTPOrHTTPS(request))
684 return; 745 return;
685 746
686 throughput_analyzer_->NotifyRequestCompleted(request); 747 throughput_analyzer_->NotifyRequestCompleted(request);
748 RecordCorrelationMetric(request);
749 }
750
751 void NetworkQualityEstimator::RecordCorrelationMetric(
752 const URLRequest& request) const {
753 DCHECK(thread_checker_.CalledOnValidThread());
754
755 // The histogram is recorded with probability
756 // |correlation_uma_logging_probability_| to reduce overhead involved with
757 // sparse histograms. Also, recording the correlation on each request is
758 // unnecessary.
759 if (RandDouble() >= correlation_uma_logging_probability_)
760 return;
761
762 if (request.response_info().was_cached ||
763 !request.response_info().network_accessed) {
764 return;
765 }
766
767 LoadTimingInfo load_timing_info;
768 request.GetLoadTimingInfo(&load_timing_info);
769 DCHECK(!load_timing_info.send_start.is_null() &&
770 !load_timing_info.receive_headers_end.is_null());
771
772 // Record UMA only for successful requests that have completed.
773 if (!request.status().is_success() || request.status().is_io_pending())
774 return;
775 if (request.GetResponseCode() != HTTP_OK)
776 return;
777 if (load_timing_info.receive_headers_end < last_main_frame_request_)
778 return;
779
780 const base::TimeTicks now = tick_clock_->NowTicks();
781 // Record UMA only for requests that started recently.
782 if (now - last_main_frame_request_ > base::TimeDelta::FromSeconds(15))
783 return;
784
785 DCHECK_GE(now, load_timing_info.send_start);
786
787 int32_t rtt = 0;
788
789 if (UseTransportRTT()) {
790 rtt = estimated_quality_at_last_main_frame_.transport_rtt() !=
791 nqe::internal::InvalidRTT()
792 ? FitInKBitsPerMetricBits(
793 estimated_quality_at_last_main_frame_.transport_rtt()
794 .InMilliseconds())
795 : 0;
796 } else {
797 rtt = estimated_quality_at_last_main_frame_.http_rtt() !=
798 nqe::internal::InvalidRTT()
799 ? FitInKBitsPerMetricBits(
800 estimated_quality_at_last_main_frame_.http_rtt()
801 .InMilliseconds())
802 : 0;
803 }
804
805 const int32_t downstream_throughput =
806 estimated_quality_at_last_main_frame_.downstream_throughput_kbps() !=
807 nqe::internal::kInvalidThroughput
808 ? FitInKBitsPerMetricBits(estimated_quality_at_last_main_frame_
809 .downstream_throughput_kbps())
810 : 0;
811
812 const int32_t resource_load_time = FitInKBitsPerMetricBits(
813 (now - load_timing_info.send_start).InMilliseconds());
814
815 int64_t resource_size = (request.GetTotalReceivedBytes() * 8) / 1024;
816 if (resource_size >= (1 << kBitsPerMetric)) {
817 // Too large resource size (at least 128 Kb).
818 return;
819 }
820
821 DCHECK_EQ(
822 0, (rtt | downstream_throughput | resource_load_time | resource_size) >>
823 kBitsPerMetric);
824
825 // First 32 - (4* kBitsPerMetric) of the sample are unset. Next
826 // kBitsPerMetric of the sample contain |rtt|. Next
827 // kBitsPerMetric contain |downstream_throughput|. Next kBitsPerMetric
828 // contain |resource_load_time|. And, the last kBitsPerMetric
829 // contain |resource_size|.
830 int32_t sample = rtt;
831 sample = (sample << kBitsPerMetric) | downstream_throughput;
832 sample = (sample << kBitsPerMetric) | resource_load_time;
833 sample = (sample << kBitsPerMetric) | resource_size;
834
835 UMA_HISTOGRAM_SPARSE_SLOWLY("NQE.Correlation.ResourceLoadTime.0Kb_128Kb",
836 sample);
687 } 837 }
688 838
689 void NetworkQualityEstimator::NotifyURLRequestDestroyed( 839 void NetworkQualityEstimator::NotifyURLRequestDestroyed(
690 const URLRequest& request) { 840 const URLRequest& request) {
691 DCHECK(thread_checker_.CalledOnValidThread()); 841 DCHECK(thread_checker_.CalledOnValidThread());
692 842
693 NotifyRequestCompleted(request); 843 if (!RequestSchemeIsHTTPOrHTTPS(request))
844 return;
845
846 throughput_analyzer_->NotifyRequestCompleted(request);
694 } 847 }
695 848
696 void NetworkQualityEstimator::AddRTTObserver(RTTObserver* rtt_observer) { 849 void NetworkQualityEstimator::AddRTTObserver(RTTObserver* rtt_observer) {
697 DCHECK(thread_checker_.CalledOnValidThread()); 850 DCHECK(thread_checker_.CalledOnValidThread());
698 rtt_observer_list_.AddObserver(rtt_observer); 851 rtt_observer_list_.AddObserver(rtt_observer);
699 } 852 }
700 853
701 void NetworkQualityEstimator::RemoveRTTObserver(RTTObserver* rtt_observer) { 854 void NetworkQualityEstimator::RemoveRTTObserver(RTTObserver* rtt_observer) {
702 DCHECK(thread_checker_.CalledOnValidThread()); 855 DCHECK(thread_checker_.CalledOnValidThread());
703 rtt_observer_list_.RemoveObserver(rtt_observer); 856 rtt_observer_list_.RemoveObserver(rtt_observer);
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
962 NetworkQualityEstimator::MetricUsage:: 1115 NetworkQualityEstimator::MetricUsage::
963 USE_IF_AVAILABLE /* transport_rtt_metric */, 1116 USE_IF_AVAILABLE /* transport_rtt_metric */,
964 NetworkQualityEstimator::MetricUsage:: 1117 NetworkQualityEstimator::MetricUsage::
965 USE_IF_AVAILABLE /* downstream_throughput_kbps_metric */); 1118 USE_IF_AVAILABLE /* downstream_throughput_kbps_metric */);
966 } 1119 }
967 // Add additional algorithms here. 1120 // Add additional algorithms here.
968 NOTREACHED(); 1121 NOTREACHED();
969 return EFFECTIVE_CONNECTION_TYPE_UNKNOWN; 1122 return EFFECTIVE_CONNECTION_TYPE_UNKNOWN;
970 } 1123 }
971 1124
1125 bool NetworkQualityEstimator::UseTransportRTT() const {
1126 DCHECK(thread_checker_.CalledOnValidThread());
1127
1128 if (effective_connection_type_algorithm_ ==
1129 EffectiveConnectionTypeAlgorithm::HTTP_RTT_AND_DOWNSTREAM_THROUGHOUT) {
1130 return false;
1131 }
1132 if (effective_connection_type_algorithm_ ==
1133 EffectiveConnectionTypeAlgorithm::
1134 TRANSPORT_RTT_OR_DOWNSTREAM_THROUGHOUT) {
1135 return true;
1136 }
1137 // Add additional algorithms here.
1138 NOTREACHED();
1139 return false;
1140 }
1141
972 NetworkQualityEstimator::EffectiveConnectionType 1142 NetworkQualityEstimator::EffectiveConnectionType
973 NetworkQualityEstimator::GetRecentEffectiveConnectionTypeUsingMetrics( 1143 NetworkQualityEstimator::GetRecentEffectiveConnectionTypeUsingMetrics(
974 const base::TimeTicks& start_time, 1144 const base::TimeTicks& start_time,
975 NetworkQualityEstimator::MetricUsage http_rtt_metric, 1145 NetworkQualityEstimator::MetricUsage http_rtt_metric,
976 NetworkQualityEstimator::MetricUsage transport_rtt_metric, 1146 NetworkQualityEstimator::MetricUsage transport_rtt_metric,
977 NetworkQualityEstimator::MetricUsage downstream_throughput_kbps_metric) 1147 NetworkQualityEstimator::MetricUsage downstream_throughput_kbps_metric)
978 const { 1148 const {
979 DCHECK(thread_checker_.CalledOnValidThread()); 1149 DCHECK(thread_checker_.CalledOnValidThread());
980 1150
981 // If the device is currently offline, then return 1151 // If the device is currently offline, then return
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after
1330 NOTREACHED(); 1500 NOTREACHED();
1331 return EFFECTIVE_CONNECTION_TYPE_UNKNOWN; 1501 return EFFECTIVE_CONNECTION_TYPE_UNKNOWN;
1332 } 1502 }
1333 1503
1334 void NetworkQualityEstimator::SetTickClockForTesting( 1504 void NetworkQualityEstimator::SetTickClockForTesting(
1335 std::unique_ptr<base::TickClock> tick_clock) { 1505 std::unique_ptr<base::TickClock> tick_clock) {
1336 DCHECK(thread_checker_.CalledOnValidThread()); 1506 DCHECK(thread_checker_.CalledOnValidThread());
1337 tick_clock_ = std::move(tick_clock); 1507 tick_clock_ = std::move(tick_clock);
1338 } 1508 }
1339 1509
1510 double NetworkQualityEstimator::RandDouble() const {
1511 return base::RandDouble();
1512 }
1513
1340 void NetworkQualityEstimator::CacheNetworkQualityEstimate() { 1514 void NetworkQualityEstimator::CacheNetworkQualityEstimate() {
1341 DCHECK(thread_checker_.CalledOnValidThread()); 1515 DCHECK(thread_checker_.CalledOnValidThread());
1342 DCHECK_LE(cached_network_qualities_.size(), 1516 DCHECK_LE(cached_network_qualities_.size(),
1343 static_cast<size_t>(kMaximumNetworkQualityCacheSize)); 1517 static_cast<size_t>(kMaximumNetworkQualityCacheSize));
1344 1518
1345 // If the network name is unavailable, caching should not be performed. 1519 // If the network name is unavailable, caching should not be performed.
1346 if (current_network_id_.id.empty()) 1520 if (current_network_id_.id.empty())
1347 return; 1521 return;
1348 1522
1349 base::TimeDelta http_rtt = nqe::internal::InvalidRTT(); 1523 base::TimeDelta http_rtt = nqe::internal::InvalidRTT();
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
1472 NotifyObserversOfEffectiveConnectionTypeChanged() { 1646 NotifyObserversOfEffectiveConnectionTypeChanged() {
1473 DCHECK(thread_checker_.CalledOnValidThread()); 1647 DCHECK(thread_checker_.CalledOnValidThread());
1474 1648
1475 // TODO(tbansal): Add hysteresis in the notification. 1649 // TODO(tbansal): Add hysteresis in the notification.
1476 FOR_EACH_OBSERVER( 1650 FOR_EACH_OBSERVER(
1477 EffectiveConnectionTypeObserver, effective_connection_type_observer_list_, 1651 EffectiveConnectionTypeObserver, effective_connection_type_observer_list_,
1478 OnEffectiveConnectionTypeChanged(effective_connection_type_)); 1652 OnEffectiveConnectionTypeChanged(effective_connection_type_));
1479 } 1653 }
1480 1654
1481 } // namespace net 1655 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698