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

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

Issue 1376473003: Notify NQE of TCP RTT values (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased, addressed sleevi comments Created 4 years, 8 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/base/network_quality_estimator.h" 5 #include "net/base/network_quality_estimator.h"
6 6
7 #include <float.h> 7 #include <float.h>
8 #include <algorithm> 8 #include <algorithm>
9 #include <cmath> 9 #include <cmath>
10 #include <limits> 10 #include <limits>
11 #include <utility> 11 #include <utility>
12 #include <vector> 12 #include <vector>
13 13
14 #include "base/logging.h" 14 #include "base/logging.h"
15 #include "base/metrics/histogram.h" 15 #include "base/metrics/histogram.h"
16 #include "base/metrics/histogram_base.h" 16 #include "base/metrics/histogram_base.h"
17 #include "base/strings/string_number_conversions.h" 17 #include "base/strings/string_number_conversions.h"
18 #include "build/build_config.h" 18 #include "build/build_config.h"
19 #include "net/base/load_flags.h" 19 #include "net/base/load_flags.h"
20 #include "net/base/load_timing_info.h" 20 #include "net/base/load_timing_info.h"
21 #include "net/base/network_interfaces.h" 21 #include "net/base/network_interfaces.h"
22 #include "net/base/network_quality_estimator_watcher_factory.h"
22 #include "net/base/url_util.h" 23 #include "net/base/url_util.h"
23 #include "net/url_request/url_request.h" 24 #include "net/url_request/url_request.h"
24 #include "url/gurl.h" 25 #include "url/gurl.h"
25 26
26 #if defined(OS_ANDROID) 27 #if defined(OS_ANDROID)
27 #include "net/android/network_library.h" 28 #include "net/android/network_library.h"
28 #endif // OS_ANDROID 29 #endif // OS_ANDROID
29 30
30 namespace { 31 namespace {
31 32
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 bool allow_smaller_responses_for_tests) 135 bool allow_smaller_responses_for_tests)
135 : allow_localhost_requests_(allow_local_host_requests_for_tests), 136 : allow_localhost_requests_(allow_local_host_requests_for_tests),
136 allow_small_responses_(allow_smaller_responses_for_tests), 137 allow_small_responses_(allow_smaller_responses_for_tests),
137 last_connection_change_(base::TimeTicks::Now()), 138 last_connection_change_(base::TimeTicks::Now()),
138 current_network_id_( 139 current_network_id_(
139 NetworkID(NetworkChangeNotifier::ConnectionType::CONNECTION_UNKNOWN, 140 NetworkID(NetworkChangeNotifier::ConnectionType::CONNECTION_UNKNOWN,
140 std::string())), 141 std::string())),
141 downstream_throughput_kbps_observations_( 142 downstream_throughput_kbps_observations_(
142 GetWeightMultiplierPerSecond(variation_params)), 143 GetWeightMultiplierPerSecond(variation_params)),
143 rtt_msec_observations_(GetWeightMultiplierPerSecond(variation_params)), 144 rtt_msec_observations_(GetWeightMultiplierPerSecond(variation_params)),
144 external_estimate_provider_(std::move(external_estimates_provider)) { 145 external_estimate_provider_(std::move(external_estimates_provider)),
146 weak_ptr_factory_(this) {
145 static_assert(kMinRequestDurationMicroseconds > 0, 147 static_assert(kMinRequestDurationMicroseconds > 0,
146 "Minimum request duration must be > 0"); 148 "Minimum request duration must be > 0");
147 static_assert(kDefaultHalfLifeSeconds > 0, 149 static_assert(kDefaultHalfLifeSeconds > 0,
148 "Default half life duration must be > 0"); 150 "Default half life duration must be > 0");
149 static_assert(kMaximumNetworkQualityCacheSize > 0, 151 static_assert(kMaximumNetworkQualityCacheSize > 0,
150 "Size of the network quality cache must be > 0"); 152 "Size of the network quality cache must be > 0");
151 // This limit should not be increased unless the logic for removing the 153 // This limit should not be increased unless the logic for removing the
152 // oldest cache entry is rewritten to use a doubly-linked-list LRU queue. 154 // oldest cache entry is rewritten to use a doubly-linked-list LRU queue.
153 static_assert(kMaximumNetworkQualityCacheSize <= 10, 155 static_assert(kMaximumNetworkQualityCacheSize <= 10,
154 "Size of the network quality cache must <= 10"); 156 "Size of the network quality cache must <= 10");
155 157
156 ObtainOperatingParams(variation_params); 158 ObtainOperatingParams(variation_params);
157 NetworkChangeNotifier::AddConnectionTypeObserver(this); 159 NetworkChangeNotifier::AddConnectionTypeObserver(this);
158 if (external_estimate_provider_) { 160 if (external_estimate_provider_) {
159 RecordExternalEstimateProviderMetrics( 161 RecordExternalEstimateProviderMetrics(
160 EXTERNAL_ESTIMATE_PROVIDER_STATUS_AVAILABLE); 162 EXTERNAL_ESTIMATE_PROVIDER_STATUS_AVAILABLE);
161 external_estimate_provider_->SetUpdatedEstimateDelegate(this); 163 external_estimate_provider_->SetUpdatedEstimateDelegate(this);
162 QueryExternalEstimateProvider(); 164 QueryExternalEstimateProvider();
163 } else { 165 } else {
164 RecordExternalEstimateProviderMetrics( 166 RecordExternalEstimateProviderMetrics(
165 EXTERNAL_ESTIMATE_PROVIDER_STATUS_NOT_AVAILABLE); 167 EXTERNAL_ESTIMATE_PROVIDER_STATUS_NOT_AVAILABLE);
166 } 168 }
167 current_network_id_ = GetCurrentNetworkID(); 169 current_network_id_ = GetCurrentNetworkID();
168 AddDefaultEstimates(); 170 AddDefaultEstimates();
171
172 socket_performance_watcher_factory_.reset(
173 new NetworkQualityEstimatorWatcherFactory(
174 GetWeakPtr(), base::ThreadTaskRunnerHandle::Get()));
169 } 175 }
170 176
171 // static 177 // static
172 const base::TimeDelta NetworkQualityEstimator::InvalidRTT() { 178 const base::TimeDelta NetworkQualityEstimator::InvalidRTT() {
173 return base::TimeDelta::Max(); 179 return base::TimeDelta::Max();
174 } 180 }
175 181
176 void NetworkQualityEstimator::ObtainOperatingParams( 182 void NetworkQualityEstimator::ObtainOperatingParams(
177 const std::map<std::string, std::string>& variation_params) { 183 const std::map<std::string, std::string>& variation_params) {
178 DCHECK(thread_checker_.CalledOnValidThread()); 184 DCHECK(thread_checker_.CalledOnValidThread());
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 DCHECK(thread_checker_.CalledOnValidThread()); 375 DCHECK(thread_checker_.CalledOnValidThread());
370 throughput_observer_list_.AddObserver(throughput_observer); 376 throughput_observer_list_.AddObserver(throughput_observer);
371 } 377 }
372 378
373 void NetworkQualityEstimator::RemoveThroughputObserver( 379 void NetworkQualityEstimator::RemoveThroughputObserver(
374 ThroughputObserver* throughput_observer) { 380 ThroughputObserver* throughput_observer) {
375 DCHECK(thread_checker_.CalledOnValidThread()); 381 DCHECK(thread_checker_.CalledOnValidThread());
376 throughput_observer_list_.RemoveObserver(throughput_observer); 382 throughput_observer_list_.RemoveObserver(throughput_observer);
377 } 383 }
378 384
385 SocketPerformanceWatcherFactory*
386 NetworkQualityEstimator::GetSocketPerformanceWatcherFactory() {
387 DCHECK(thread_checker_.CalledOnValidThread());
388
389 return socket_performance_watcher_factory_.get();
390 }
391
379 void NetworkQualityEstimator::RecordRTTUMA(int32_t estimated_value_msec, 392 void NetworkQualityEstimator::RecordRTTUMA(int32_t estimated_value_msec,
380 int32_t actual_value_msec) const { 393 int32_t actual_value_msec) const {
381 DCHECK(thread_checker_.CalledOnValidThread()); 394 DCHECK(thread_checker_.CalledOnValidThread());
382 395
383 // Record the difference between the actual and the estimated value. 396 // Record the difference between the actual and the estimated value.
384 if (estimated_value_msec >= actual_value_msec) { 397 if (estimated_value_msec >= actual_value_msec) {
385 base::HistogramBase* difference_rtt = 398 base::HistogramBase* difference_rtt =
386 GetHistogram("DifferenceRTTEstimatedAndActual.", 399 GetHistogram("DifferenceRTTEstimatedAndActual.",
387 current_network_id_.type, 10 * 1000); // 10 seconds 400 current_network_id_.type, 10 * 1000); // 10 seconds
388 difference_rtt->Add(estimated_value_msec - actual_value_msec); 401 difference_rtt->Add(estimated_value_msec - actual_value_msec);
(...skipping 490 matching lines...) Expand 10 before | Expand all | Expand 10 after
879 } 892 }
880 DCHECK_LT(cached_network_qualities_.size(), 893 DCHECK_LT(cached_network_qualities_.size(),
881 static_cast<size_t>(kMaximumNetworkQualityCacheSize)); 894 static_cast<size_t>(kMaximumNetworkQualityCacheSize));
882 895
883 cached_network_qualities_.insert(std::make_pair( 896 cached_network_qualities_.insert(std::make_pair(
884 current_network_id_, CachedNetworkQuality(network_quality))); 897 current_network_id_, CachedNetworkQuality(network_quality)));
885 DCHECK_LE(cached_network_qualities_.size(), 898 DCHECK_LE(cached_network_qualities_.size(),
886 static_cast<size_t>(kMaximumNetworkQualityCacheSize)); 899 static_cast<size_t>(kMaximumNetworkQualityCacheSize));
887 } 900 }
888 901
889 scoped_ptr<SocketPerformanceWatcher>
890 NetworkQualityEstimator::CreateSocketPerformanceWatcher(
891 const Protocol protocol) {
892 DCHECK(thread_checker_.CalledOnValidThread());
893
894 return scoped_ptr<SocketPerformanceWatcher>(
895 new SocketPerformanceWatcher(protocol, this));
896 }
897
898 void NetworkQualityEstimator::OnUpdatedRTTAvailable( 902 void NetworkQualityEstimator::OnUpdatedRTTAvailable(
899 const Protocol protocol, 903 SocketPerformanceWatcherFactory::Protocol protocol,
900 const base::TimeDelta& rtt) { 904 const base::TimeDelta& rtt) {
901 DCHECK(thread_checker_.CalledOnValidThread()); 905 DCHECK(thread_checker_.CalledOnValidThread());
902 906
903 switch (protocol) { 907 switch (protocol) {
904 case PROTOCOL_TCP: 908 case SocketPerformanceWatcherFactory::PROTOCOL_TCP:
905 NotifyObserversOfRTT(RttObservation(rtt, base::TimeTicks::Now(), TCP)); 909 NotifyObserversOfRTT(RttObservation(rtt, base::TimeTicks::Now(), TCP));
906 return; 910 return;
907 case PROTOCOL_QUIC: 911 case SocketPerformanceWatcherFactory::PROTOCOL_QUIC:
908 NotifyObserversOfRTT(RttObservation(rtt, base::TimeTicks::Now(), QUIC)); 912 NotifyObserversOfRTT(RttObservation(rtt, base::TimeTicks::Now(), QUIC));
909 return; 913 return;
910 default: 914 default:
911 NOTREACHED(); 915 NOTREACHED();
912 } 916 }
913 } 917 }
914 918
919 void NetworkQualityEstimator::OnWatcherReset() {
920 DCHECK(thread_checker_.CalledOnValidThread());
921 // Nothing needs to be done for RTT observations since NetworkQualityEstimator
922 // does not maintain any watcher-specific state.
923 }
924
915 void NetworkQualityEstimator::NotifyObserversOfRTT( 925 void NetworkQualityEstimator::NotifyObserversOfRTT(
916 const RttObservation& observation) { 926 const RttObservation& observation) {
917 FOR_EACH_OBSERVER( 927 FOR_EACH_OBSERVER(
918 RTTObserver, rtt_observer_list_, 928 RTTObserver, rtt_observer_list_,
919 OnRTTObservation(observation.value.InMilliseconds(), 929 OnRTTObservation(observation.value.InMilliseconds(),
920 observation.timestamp, observation.source)); 930 observation.timestamp, observation.source));
921 } 931 }
922 932
923 void NetworkQualityEstimator::NotifyObserversOfThroughput( 933 void NetworkQualityEstimator::NotifyObserversOfThroughput(
924 const ThroughputObservation& observation) { 934 const ThroughputObservation& observation) {
925 FOR_EACH_OBSERVER( 935 FOR_EACH_OBSERVER(
926 ThroughputObserver, throughput_observer_list_, 936 ThroughputObserver, throughput_observer_list_,
927 OnThroughputObservation(observation.value, observation.timestamp, 937 OnThroughputObservation(observation.value, observation.timestamp,
928 observation.source)); 938 observation.source));
929 } 939 }
930 940
941 base::WeakPtr<NetworkQualityEstimator> NetworkQualityEstimator::GetWeakPtr() {
942 DCHECK(thread_checker_.CalledOnValidThread());
943
944 return weak_ptr_factory_.GetWeakPtr();
945 }
946
931 NetworkQualityEstimator::CachedNetworkQuality::CachedNetworkQuality( 947 NetworkQualityEstimator::CachedNetworkQuality::CachedNetworkQuality(
932 const NetworkQuality& network_quality) 948 const NetworkQuality& network_quality)
933 : last_update_time_(base::TimeTicks::Now()), 949 : last_update_time_(base::TimeTicks::Now()),
934 network_quality_(network_quality) { 950 network_quality_(network_quality) {
935 } 951 }
936 952
937 NetworkQualityEstimator::CachedNetworkQuality::CachedNetworkQuality( 953 NetworkQualityEstimator::CachedNetworkQuality::CachedNetworkQuality(
938 const CachedNetworkQuality& other) 954 const CachedNetworkQuality& other)
939 : last_update_time_(other.last_update_time_), 955 : last_update_time_(other.last_update_time_),
940 network_quality_(other.network_quality_) { 956 network_quality_(other.network_quality_) {
(...skipping 27 matching lines...) Expand all
968 984
969 NetworkQualityEstimator::NetworkQuality& 985 NetworkQualityEstimator::NetworkQuality&
970 NetworkQualityEstimator::NetworkQuality:: 986 NetworkQualityEstimator::NetworkQuality::
971 operator=(const NetworkQuality& other) { 987 operator=(const NetworkQuality& other) {
972 rtt_ = other.rtt_; 988 rtt_ = other.rtt_;
973 downstream_throughput_kbps_ = other.downstream_throughput_kbps_; 989 downstream_throughput_kbps_ = other.downstream_throughput_kbps_;
974 return *this; 990 return *this;
975 } 991 }
976 992
977 } // namespace net 993 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698