Chromium Code Reviews| Index: net/base/network_quality_estimator.cc |
| diff --git a/net/base/network_quality_estimator.cc b/net/base/network_quality_estimator.cc |
| index fdd2212adfb1b4c4853d6be76456ce0e990ef8a7..c5cc320e94e5f9c9b630c0bbf9cbc91d22729c09 100644 |
| --- a/net/base/network_quality_estimator.cc |
| +++ b/net/base/network_quality_estimator.cc |
| @@ -10,10 +10,13 @@ |
| #include <limits> |
| #include <vector> |
| +#include "base/bind.h" |
| #include "base/logging.h" |
| +#include "base/message_loop/message_loop.h" |
| #include "base/metrics/histogram.h" |
| #include "base/metrics/histogram_base.h" |
| #include "base/strings/string_number_conversions.h" |
| +#include "base/task_runner.h" |
| #include "build/build_config.h" |
| #include "net/base/load_flags.h" |
| #include "net/base/load_timing_info.h" |
| @@ -140,7 +143,10 @@ NetworkQualityEstimator::NetworkQualityEstimator( |
| downstream_throughput_kbps_observations_( |
| GetWeightMultiplierPerSecond(variation_params)), |
| rtt_msec_observations_(GetWeightMultiplierPerSecond(variation_params)), |
| - external_estimates_provider_(external_estimates_provider.Pass()) { |
| + external_estimates_provider_(external_estimates_provider.Pass()), |
| + eep_queried_(base::TimeTicks()), |
|
bengr
2015/09/02 20:27:56
Don't use eep.
tbansal1
2015/09/03 00:22:40
Done.
|
| + eep_delayed_task_posted_(false), |
| + weak_factory_(this) { |
| static_assert(kMinRequestDurationMicroseconds > 0, |
| "Minimum request duration must be > 0"); |
| static_assert(kDefaultHalfLifeSeconds > 0, |
| @@ -154,8 +160,17 @@ NetworkQualityEstimator::NetworkQualityEstimator( |
| ObtainOperatingParams(variation_params); |
| NetworkChangeNotifier::AddConnectionTypeObserver(this); |
| - if (external_estimates_provider_) |
| + if (external_estimates_provider_) { |
| + UMA_HISTOGRAM_ENUMERATION("NQE.ExternalEstimateProviderStatus", |
| + EXTERNAL_ESTIMATE_PROVIDER_STATUS_AVAILABLE, |
| + EXTERNAL_ESTIMATE_PROVIDER_STATUS_BOUNDARY); |
| external_estimates_provider_->SetUpdatedEstimateDelegate(this); |
| + QueryExternalEstimateProvider(); |
| + } else { |
| + UMA_HISTOGRAM_ENUMERATION("NQE.ExternalEstimateProviderStatus", |
| + EXTERNAL_ESTIMATE_PROVIDER_STATUS_NOT_AVAILABLE, |
| + EXTERNAL_ESTIMATE_PROVIDER_STATUS_BOUNDARY); |
| + } |
| current_network_id_ = GetCurrentNetworkID(); |
| AddDefaultEstimates(); |
| } |
| @@ -774,8 +789,66 @@ bool NetworkQualityEstimator::ReadCachedNetworkQualityEstimate() { |
| void NetworkQualityEstimator::OnUpdatedEstimateAvailable() { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| + |
| + UMA_HISTOGRAM_ENUMERATION("NQE.ExternalEstimateProviderStatus", |
| + EXTERNAL_ESTIMATE_PROVIDER_STATUS_CALLBACK, |
| + EXTERNAL_ESTIMATE_PROVIDER_STATUS_BOUNDARY); |
| + |
| + QueryExternalEstimateProvider(); |
| +} |
| + |
| +void NetworkQualityEstimator::QueryExternalEstimateProvider() { |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| DCHECK(external_estimates_provider_); |
| - // TODO(tbansal): Query provider for the recent value. |
| + |
| + UMA_HISTOGRAM_ENUMERATION("NQE.ExternalEstimateProviderStatus", |
| + EXTERNAL_ESTIMATE_PROVIDER_STATUS_QUERIED, |
| + EXTERNAL_ESTIMATE_PROVIDER_STATUS_BOUNDARY); |
| + |
| + base::TimeDelta time_since_last_update; |
| + if (!external_estimates_provider_->GetTimeSinceLastUpdate( |
|
bengr
2015/09/02 20:27:56
external_estimate_provider_?
tbansal1
2015/09/03 00:22:40
Done.
|
| + &time_since_last_update)) { |
| + external_estimates_provider_->RequestUpdate(); |
| + return; |
| + } |
| + |
| + eep_queried_ = base::TimeTicks::Now(); |
|
bengr
2015/09/02 20:27:56
external_estimate_request_time_. Also, is this use
tbansal1
2015/09/03 00:22:40
It is used now.
|
| + |
| + UMA_HISTOGRAM_ENUMERATION("NQE.ExternalEstimateProviderStatus", |
| + EXTERNAL_ESTIMATE_PROVIDER_STATUS_QUERY_SUCCESSFUL, |
| + EXTERNAL_ESTIMATE_PROVIDER_STATUS_BOUNDARY); |
| + |
| + base::TimeDelta rtt; |
| + if (external_estimates_provider_->GetRTT(&rtt)) { |
| + rtt_msec_observations_.AddObservation(Observation( |
| + rtt.InMilliseconds(), base::TimeTicks::Now() - time_since_last_update)); |
| + } |
| + |
| + int32_t downstream_throughput_kbps; |
| + if (external_estimates_provider_->GetDownstreamThroughputKbps( |
| + &downstream_throughput_kbps)) { |
| + downstream_throughput_kbps_observations_.AddObservation( |
| + Observation(downstream_throughput_kbps, |
| + base::TimeTicks::Now() - time_since_last_update)); |
| + } |
| + |
| + if (!eep_delayed_task_posted_ && base::MessageLoop::current()) { |
|
bengr
2015/09/02 20:27:56
eep_delayed_task_posted_ -> external_estimate_pend
tbansal1
2015/09/03 00:22:40
Done.
|
| + base::MessageLoop::current()->task_runner()->PostDelayedTask( |
| + FROM_HERE, |
| + base::Bind( |
| + &NetworkQualityEstimator::RunExternalEstimateProviderDelayedTask, |
| + weak_factory_.GetWeakPtr()), |
| + base::TimeDelta::FromMilliseconds( |
| + kExternalEstimateProviderQueryIntervalMsec)); |
| + eep_delayed_task_posted_ = true; |
| + } |
| +} |
| + |
| +void NetworkQualityEstimator::RunExternalEstimateProviderDelayedTask() { |
|
bengr
2015/09/02 20:27:56
I don't understand the flow. Here's what I underst
tbansal1
2015/09/03 00:22:40
Updated to make it synchronous call. No posting of
|
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + DCHECK(eep_delayed_task_posted_); |
| + eep_delayed_task_posted_ = false; |
| + QueryExternalEstimateProvider(); |
| } |
| void NetworkQualityEstimator::CacheNetworkQualityEstimate() { |