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

Unified Diff: net/nqe/network_quality_estimator.cc

Issue 2113363002: NQE: Add Transport RTT based GetECT algorithm (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/nqe/network_quality_estimator.h ('k') | net/nqe/network_quality_estimator_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/nqe/network_quality_estimator.cc
diff --git a/net/nqe/network_quality_estimator.cc b/net/nqe/network_quality_estimator.cc
index 3756629a07e8153c0eb388221e3749b4df35d72e..aa0eed3e0df71ae155a5a4bd2bf76baa7faf5e7a 100644
--- a/net/nqe/network_quality_estimator.cc
+++ b/net/nqe/network_quality_estimator.cc
@@ -93,6 +93,13 @@ const char kDefaultKbpsObservationSuffix[] = ".DefaultMedianKbps";
const char kThresholdURLRTTMsecSuffix[] = ".ThresholdMedianHttpRTTMsec";
// Suffix of the name of the variation parameter that contains the threshold
+// transport RTTs (in milliseconds) for different effective connection types.
+// Complete name of the variation parameter would be
+// |EffectiveConnectionType|.|kThresholdTransportRTTMsecSuffix|.
+const char kThresholdTransportRTTMsecSuffix[] =
+ ".ThresholdMedianTransportRTTMsec";
+
+// Suffix of the name of the variation parameter that contains the threshold
// downlink throughput (in kbps) for different effective connection types.
// Complete name of the variation parameter would be
// |EffectiveConnectionType|.|kThresholdKbpsSuffix|.
@@ -227,7 +234,10 @@ NetworkQualityEstimator::NetworkQualityEstimator(
bool use_smaller_responses_for_tests)
: algorithm_name_to_enum_({{"HttpRTTAndDownstreamThroughput",
EffectiveConnectionTypeAlgorithm::
- HTTP_RTT_AND_DOWNSTREAM_THROUGHOUT}}),
+ HTTP_RTT_AND_DOWNSTREAM_THROUGHOUT},
+ {"TransportRTTOrDownstreamThroughput",
Not at Google. Contact bengr 2016/07/06 19:04:07 This is brittle because it allows adding an entry
tbansal1 2016/07/06 23:17:32 That error would be caught by DCHECK below. See li
Not at Google. Contact bengr 2016/07/07 00:03:04 Macro does not have this issue. You will get a com
tbansal1 2016/07/07 16:47:32 Agreed. Right now this error is captured using NQE
Not at Google. Contact bengr 2016/07/07 17:19:17 It is easy to map strings to enums. You just use a
tbansal1 2016/07/07 18:01:32 "if" condtional does not catch duplicates in value
Not at Google. Contact bengr 2016/07/07 19:10:49 We don't rely on the switch to catch duplicates. T
tbansal1 2016/07/07 22:47:26 Added TODO. For now the duplicates are catched usi
+ EffectiveConnectionTypeAlgorithm::
+ TRANSPORT_RTT_OR_DOWNSTREAM_THROUGHOUT}}),
use_localhost_requests_(use_local_host_requests_for_tests),
use_small_responses_(use_smaller_responses_for_tests),
weight_multiplier_per_second_(
@@ -386,6 +396,26 @@ void NetworkQualityEstimator::ObtainEffectiveConnectionTypeModelParams(
rtt <= connection_thresholds_[i - 1].http_rtt());
}
+ variations_value = kMinimumRTTVariationParameterMsec - 1;
Not at Google. Contact bengr 2016/07/07 00:03:04 This block is extremely similar to the block above
tbansal1 2016/07/07 16:47:32 I am not sure of a better way to combine them.
+ if (GetValueForVariationParam(
+ variation_params,
+ connection_type_name + kThresholdTransportRTTMsecSuffix,
+ &variations_value) &&
+ variations_value >= kMinimumRTTVariationParameterMsec) {
+ base::TimeDelta transport_rtt(
+ base::TimeDelta::FromMilliseconds(variations_value));
+ connection_thresholds_[i] = nqe::internal::NetworkQuality(
Not at Google. Contact bengr 2016/07/07 00:03:04 Any reason to create new instance of NetworkQualit
tbansal1 2016/07/07 16:47:32 Done.
+ connection_thresholds_[i].http_rtt(), transport_rtt,
+ connection_thresholds_[i].downstream_throughput_kbps());
+
+ // Verify that the transport RTT values are in decreasing order as the
+ // network quality improves.
+ DCHECK(i == 0 ||
+ connection_thresholds_[i - 1].transport_rtt() ==
+ nqe::internal::InvalidRTT() ||
+ transport_rtt <= connection_thresholds_[i - 1].transport_rtt());
+ }
+
variations_value = kMinimumThroughputVariationParameterKbps - 1;
if (GetValueForVariationParam(variation_params,
connection_type_name + kThresholdKbpsSuffix,
@@ -892,6 +922,12 @@ NetworkQualityEstimator::GetRecentEffectiveConnectionType(
return GetRecentEffectiveConnectionTypeHttpRTTAndDownstreamThroughput(
start_time);
}
+ if (effective_connection_type_algorithm_ ==
+ EffectiveConnectionTypeAlgorithm::
+ TRANSPORT_RTT_OR_DOWNSTREAM_THROUGHOUT) {
+ return GetRecentEffectiveConnectionTypeTransportRTTOrDownstreamThroughput(
+ start_time);
+ }
// Add additional algorithms here.
NOTREACHED();
return EFFECTIVE_CONNECTION_TYPE_UNKNOWN;
@@ -928,11 +964,11 @@ NetworkQualityEstimator::EffectiveConnectionType NetworkQualityEstimator::
EffectiveConnectionType type = static_cast<EffectiveConnectionType>(i);
if (i == EFFECTIVE_CONNECTION_TYPE_UNKNOWN)
continue;
- bool estimated_http_rtt_is_higher_than_threshold =
+ const bool estimated_http_rtt_is_higher_than_threshold =
http_rtt != nqe::internal::InvalidRTT() &&
connection_thresholds_[i].http_rtt() != nqe::internal::InvalidRTT() &&
http_rtt >= connection_thresholds_[i].http_rtt();
- bool estimated_throughput_is_lower_than_threshold =
+ const bool estimated_throughput_is_lower_than_threshold =
kbps != nqe::internal::kInvalidThroughput &&
connection_thresholds_[i].downstream_throughput_kbps() !=
nqe::internal::kInvalidThroughput &&
@@ -951,6 +987,62 @@ NetworkQualityEstimator::EffectiveConnectionType NetworkQualityEstimator::
1);
}
+NetworkQualityEstimator::EffectiveConnectionType NetworkQualityEstimator::
+ GetRecentEffectiveConnectionTypeTransportRTTOrDownstreamThroughput(
+ const base::TimeTicks& start_time) const {
+ DCHECK(thread_checker_.CalledOnValidThread());
+
+ // If the device is currently offline, then return
Not at Google. Contact bengr 2016/07/06 19:04:07 FWIW code is very readable, so this comment seems
tbansal1 2016/07/06 23:17:32 Done.
+ // EFFECTIVE_CONNECTION_TYPE_OFFLINE.
+ if (GetCurrentNetworkID().type == NetworkChangeNotifier::CONNECTION_NONE)
+ return EFFECTIVE_CONNECTION_TYPE_OFFLINE;
+
+ base::TimeDelta transport_rtt = nqe::internal::InvalidRTT();
+ if (!GetRecentTransportRTTMedian(start_time, &transport_rtt))
+ transport_rtt = nqe::internal::InvalidRTT();
Not at Google. Contact bengr 2016/07/06 19:04:07 Can we have GetRecentTransportRTTMedian(..) set tr
tbansal1 2016/07/06 23:17:32 Yeah, I need to fix that. It is easier now since G
Not at Google. Contact bengr 2016/07/07 00:03:04 Add TODO?
tbansal1 2016/07/07 16:47:32 Done in .h file.
+
+ int32_t kbps = nqe::internal::kInvalidThroughput;
+ if (!GetRecentMedianDownlinkThroughputKbps(start_time, &kbps))
+ kbps = nqe::internal::kInvalidThroughput;
Not at Google. Contact bengr 2016/07/06 19:04:07 Similar to above comment: Can GetRecentMedianDownl
tbansal1 2016/07/06 23:17:32 same as above.
Not at Google. Contact bengr 2016/07/07 00:03:04 Acknowledged.
+
+ if (transport_rtt == nqe::internal::InvalidRTT() &&
+ kbps == nqe::internal::kInvalidThroughput) {
+ // Quality of the current network is unknown.
+ return EFFECTIVE_CONNECTION_TYPE_UNKNOWN;
+ }
+
+ // Search from the slowest connection type to the fastest to find the
+ // EffectiveConnectionType that best matches the current connection's
+ // performance. The match is done by comparing RTT and throughput.
+ for (size_t i = 0; i < EFFECTIVE_CONNECTION_TYPE_LAST; ++i) {
+ EffectiveConnectionType type = static_cast<EffectiveConnectionType>(i);
+ if (i == EFFECTIVE_CONNECTION_TYPE_UNKNOWN)
+ continue;
+ const bool estimated_transport_rtt_is_higher_than_threshold =
+ transport_rtt != nqe::internal::InvalidRTT() &&
+ connection_thresholds_[i].transport_rtt() !=
+ nqe::internal::InvalidRTT() &&
+ transport_rtt >= connection_thresholds_[i].transport_rtt();
+ const bool estimated_throughput_is_lower_than_threshold =
+ kbps != nqe::internal::kInvalidThroughput &&
+ connection_thresholds_[i].downstream_throughput_kbps() !=
+ nqe::internal::kInvalidThroughput &&
+ kbps <= connection_thresholds_[i].downstream_throughput_kbps();
+
+ // Return |type| as the effective connection type if the current network's
+ // transport RTT is worse than the threshold RTT for |type|, or if the
+ // current network's throughput is lower than the threshold throughput for
+ // |type|.
+ if (estimated_transport_rtt_is_higher_than_threshold ||
+ estimated_throughput_is_lower_than_threshold) {
+ return type;
+ }
+ }
+ // Return the fastest connection type.
+ return static_cast<EffectiveConnectionType>(EFFECTIVE_CONNECTION_TYPE_LAST -
+ 1);
+}
+
void NetworkQualityEstimator::AddEffectiveConnectionTypeObserver(
EffectiveConnectionTypeObserver* observer) {
DCHECK(thread_checker_.CalledOnValidThread());
« no previous file with comments | « net/nqe/network_quality_estimator.h ('k') | net/nqe/network_quality_estimator_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698