| Index: net/base/network_quality_estimator.cc
|
| diff --git a/net/base/network_quality_estimator.cc b/net/base/network_quality_estimator.cc
|
| index 6415ee6e6d7eb36b47ab4fd568d3537283b27729..8f96aacbd97f710d9d0e4f09a8bb98bbfa3be5e2 100644
|
| --- a/net/base/network_quality_estimator.cc
|
| +++ b/net/base/network_quality_estimator.cc
|
| @@ -15,6 +15,9 @@
|
|
|
| namespace net {
|
|
|
| +// Maximum number of samples to hold in the SampleRingBuffer.
|
| +const size_t NetworkQualityEstimator::SampleRingBuffer::kMaximumSamples = 500;
|
| +
|
| NetworkQualityEstimator::NetworkQualityEstimator()
|
| : NetworkQualityEstimator(false) {
|
| }
|
| @@ -36,10 +39,13 @@ NetworkQualityEstimator::~NetworkQualityEstimator() {
|
| NetworkChangeNotifier::RemoveConnectionTypeObserver(this);
|
| }
|
|
|
| -void NetworkQualityEstimator::NotifyDataReceived(const URLRequest& request,
|
| - int64_t prefilter_bytes_read) {
|
| +void NetworkQualityEstimator::NotifyDataReceived(
|
| + const URLRequest& request,
|
| + int64_t cummulative_prefilter_bytes_read,
|
| + int64_t prefiltered_bytes_read) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK_GT(prefilter_bytes_read, 0);
|
| + DCHECK_GT(cummulative_prefilter_bytes_read, 0);
|
| + DCHECK_GT(prefiltered_bytes_read, 0);
|
|
|
| if (!request.url().is_valid() ||
|
| (!allow_localhost_requests_ && IsLocalhost(request.url().host())) ||
|
| @@ -61,15 +67,22 @@ void NetworkQualityEstimator::NotifyDataReceived(const URLRequest& request,
|
| if (request_duration < fastest_RTT_since_last_connection_change_)
|
| fastest_RTT_since_last_connection_change_ = request_duration;
|
|
|
| + // Only add RTT sample if this is the first read for this response.
|
| + if (cummulative_prefilter_bytes_read == prefiltered_bytes_read)
|
| + rtt_msec_samples_.AddSample(request_duration.InMilliseconds());
|
| +
|
| // Ignore tiny transfers which will not produce accurate rates.
|
| // Ignore short duration transfers.
|
| - if (prefilter_bytes_read >= kMinTransferSizeInBytes &&
|
| + if (cummulative_prefilter_bytes_read >= kMinTransferSizeInBytes &&
|
| request_duration >=
|
| base::TimeDelta::FromMicroseconds(kMinRequestDurationMicroseconds)) {
|
| - uint64_t kbps = static_cast<uint64_t>(prefilter_bytes_read * 8 * 1000 /
|
| - request_duration.InMicroseconds());
|
| + uint64_t kbps =
|
| + static_cast<uint64_t>(cummulative_prefilter_bytes_read * 8 * 1000 /
|
| + request_duration.InMicroseconds());
|
| if (kbps > peak_kbps_since_last_connection_change_)
|
| peak_kbps_since_last_connection_change_ = kbps;
|
| +
|
| + kbps_samples_.AddSample(kbps);
|
| }
|
| }
|
|
|
| @@ -162,19 +175,44 @@ void NetworkQualityEstimator::OnConnectionTypeChanged(
|
| current_connection_type_ = type;
|
| }
|
|
|
| -NetworkQuality NetworkQualityEstimator::GetEstimate() const {
|
| +NetworkQuality NetworkQualityEstimator::GetPeakEstimate() const {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
|
|
| if (!bytes_read_since_last_connection_change_) {
|
| - return NetworkQuality(fastest_RTT_since_last_connection_change_, 0,
|
| - peak_kbps_since_last_connection_change_, 0);
|
| + return NetworkQuality(base::TimeDelta(), 0.0, 0, 0.0);
|
| }
|
| if (!peak_kbps_since_last_connection_change_) {
|
| - return NetworkQuality(fastest_RTT_since_last_connection_change_, 0.1,
|
| - peak_kbps_since_last_connection_change_, 0);
|
| + return NetworkQuality(fastest_RTT_since_last_connection_change_, 0.0, 0,
|
| + 0.0);
|
| }
|
| - return NetworkQuality(fastest_RTT_since_last_connection_change_, 0.1,
|
| - peak_kbps_since_last_connection_change_, 0.1);
|
| + return NetworkQuality(fastest_RTT_since_last_connection_change_, 0.0,
|
| + peak_kbps_since_last_connection_change_, 0.0);
|
| +}
|
| +
|
| +NetworkQualityEstimator::Sample::Sample(int value, base::TimeTicks timestamp)
|
| + : value(value), timestamp(timestamp) {
|
| + DCHECK_GE(value, 0);
|
| +}
|
| +
|
| +NetworkQualityEstimator::Sample::~Sample() {
|
| +}
|
| +
|
| +NetworkQualityEstimator::SampleRingBuffer::SampleRingBuffer() {
|
| + static_assert(kMaximumSamples > 0U,
|
| + "Minimum size of sample buffer must be > 0");
|
| +}
|
| +
|
| +NetworkQualityEstimator::SampleRingBuffer::~SampleRingBuffer() {
|
| +}
|
| +
|
| +void NetworkQualityEstimator::SampleRingBuffer::AddSample(int value) {
|
| + DCHECK_LE(samples_.size(), kMaximumSamples);
|
| + // Pop the oldest element if the buffer is already full.
|
| + if (samples_.size() == kMaximumSamples)
|
| + samples_.pop_front();
|
| +
|
| + samples_.push_back(Sample(value, base::TimeTicks::Now()));
|
| + DCHECK_LE(samples_.size(), kMaximumSamples);
|
| }
|
|
|
| } // namespace net
|
|
|