| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 #ifndef NET_NQE_THROUGHPUT_ANALYZER_H_ | 5 #ifndef NET_NQE_THROUGHPUT_ANALYZER_H_ |
| 6 #define NET_NQE_THROUGHPUT_ANALYZER_H_ | 6 #define NET_NQE_THROUGHPUT_ANALYZER_H_ |
| 7 | 7 |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 } | 24 } |
| 25 | 25 |
| 26 namespace net { | 26 namespace net { |
| 27 | 27 |
| 28 class URLRequest; | 28 class URLRequest; |
| 29 | 29 |
| 30 namespace nqe { | 30 namespace nqe { |
| 31 | 31 |
| 32 namespace internal { | 32 namespace internal { |
| 33 | 33 |
| 34 class NetworkQualityEstimatorParams; |
| 35 |
| 34 // Makes throughput observations. Polls NetworkActivityMonitor | 36 // Makes throughput observations. Polls NetworkActivityMonitor |
| 35 // (TrafficStats on Android) to count number of bits received over throughput | 37 // (TrafficStats on Android) to count number of bits received over throughput |
| 36 // observation windows in accordance with the following rules: | 38 // observation windows in accordance with the following rules: |
| 37 // (1) A new window of observation begins any time a URL request header is | 39 // (1) A new window of observation begins any time a URL request header is |
| 38 // about to be sent, or a request completes or is destroyed. | 40 // about to be sent, or a request completes or is destroyed. |
| 39 // (2) A request is "active" if its headers are sent, but it hasn't completed, | 41 // (2) A request is "active" if its headers are sent, but it hasn't completed, |
| 40 // and "local" if destined to local host. If at any time during a | 42 // and "local" if destined to local host. If at any time during a |
| 41 // throughput observation window there is an active, local request, the | 43 // throughput observation window there is an active, local request, the |
| 42 // window is discarded. | 44 // window is discarded. |
| 43 // (3) If less than 32KB is received over the network during a window of | 45 // (3) If less than 32KB is received over the network during a window of |
| 44 // observation, that window is discarded. | 46 // observation, that window is discarded. |
| 45 class NET_EXPORT_PRIVATE ThroughputAnalyzer { | 47 class NET_EXPORT_PRIVATE ThroughputAnalyzer { |
| 46 public: | 48 public: |
| 47 // |throughput_observation_callback| is called on the |task_runner| when | 49 // |throughput_observation_callback| is called on the |task_runner| when |
| 48 // |this| has a new throughput observation. | 50 // |this| has a new throughput observation. |
| 49 // |use_local_host_requests_for_tests| should only be true when testing | 51 // |use_local_host_requests_for_tests| should only be true when testing |
| 50 // against local HTTP server and allows the requests to local host to be | 52 // against local HTTP server and allows the requests to local host to be |
| 51 // used for network quality estimation. |use_smaller_responses_for_tests| | 53 // used for network quality estimation. |use_smaller_responses_for_tests| |
| 52 // should only be true when testing, and allows the responses smaller than | 54 // should only be true when testing, and allows the responses smaller than |
| 53 // |kMinTransferSizeInBits| or shorter than | 55 // |kMinTransferSizeInBits| or shorter than |
| 54 // |kMinRequestDurationMicroseconds| to be used for network quality | 56 // |kMinRequestDurationMicroseconds| to be used for network quality |
| 55 // estimation. | 57 // estimation. |
| 56 // Virtualized for testing. | 58 // Virtualized for testing. |
| 57 ThroughputAnalyzer( | 59 ThroughputAnalyzer( |
| 60 const NetworkQualityEstimatorParams* params, |
| 58 scoped_refptr<base::SingleThreadTaskRunner> task_runner, | 61 scoped_refptr<base::SingleThreadTaskRunner> task_runner, |
| 59 ThroughputObservationCallback throughput_observation_callback, | 62 ThroughputObservationCallback throughput_observation_callback, |
| 60 bool use_local_host_requests_for_tests, | 63 bool use_local_host_requests_for_tests, |
| 61 bool use_smaller_responses_for_tests); | 64 bool use_smaller_responses_for_tests); |
| 62 virtual ~ThroughputAnalyzer(); | 65 virtual ~ThroughputAnalyzer(); |
| 63 | 66 |
| 64 // Notifies |this| that the headers of |request| are about to be sent. | 67 // Notifies |this| that the headers of |request| are about to be sent. |
| 65 void NotifyStartTransaction(const URLRequest& request); | 68 void NotifyStartTransaction(const URLRequest& request); |
| 66 | 69 |
| 67 // Notifies |this| that |request| has completed. | 70 // Notifies |this| that |request| has completed. |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 99 | 102 |
| 100 typedef base::hash_set<const URLRequest*> Requests; | 103 typedef base::hash_set<const URLRequest*> Requests; |
| 101 | 104 |
| 102 // Returns true if downstream throughput can be recorded. In that case, | 105 // Returns true if downstream throughput can be recorded. In that case, |
| 103 // |downstream_kbps| is set to the computed downstream throughput (in | 106 // |downstream_kbps| is set to the computed downstream throughput (in |
| 104 // kilobits per second). If a downstream throughput observation is taken, | 107 // kilobits per second). If a downstream throughput observation is taken, |
| 105 // then the throughput observation window is reset so as to continue | 108 // then the throughput observation window is reset so as to continue |
| 106 // tracking throughput. A throughput observation can be taken only if the | 109 // tracking throughput. A throughput observation can be taken only if the |
| 107 // time-window is currently active, and enough bytes have accumulated in | 110 // time-window is currently active, and enough bytes have accumulated in |
| 108 // that window. |downstream_kbps| should not be null. | 111 // that window. |downstream_kbps| should not be null. |
| 109 bool MayBeGetThroughputObservation(int32_t* downstream_kbps); | 112 bool MaybeGetThroughputObservation(int32_t* downstream_kbps); |
| 110 | 113 |
| 111 // Starts the throughput observation window that keeps track of network | 114 // Starts the throughput observation window that keeps track of network |
| 112 // bytes if the following conditions are true: | 115 // bytes if the following conditions are true: |
| 113 // (i) All active requests are non-local; | 116 // (i) All active requests are non-local; |
| 114 // (ii) There is at least one active, non-local request; and, | 117 // (ii) There is at least one active, non-local request; and, |
| 115 // (iii) The throughput observation window is not already tracking | 118 // (iii) The throughput observation window is not already tracking |
| 116 // throughput. The window is started by setting the |start_| and | 119 // throughput. The window is started by setting the |start_| and |
| 117 // |bits_received_|. | 120 // |bits_received_|. |
| 118 void MaybeStartThroughputObservationWindow(); | 121 void MaybeStartThroughputObservationWindow(); |
| 119 | 122 |
| 120 // EndThroughputObservationWindow ends the throughput observation window. | 123 // EndThroughputObservationWindow ends the throughput observation window. |
| 121 void EndThroughputObservationWindow(); | 124 void EndThroughputObservationWindow(); |
| 122 | 125 |
| 123 // Returns true if throughput is currently tracked by a throughput | 126 // Returns true if throughput is currently tracked by a throughput |
| 124 // observation window. | 127 // observation window. |
| 125 bool IsCurrentlyTrackingThroughput() const; | 128 bool IsCurrentlyTrackingThroughput() const; |
| 126 | 129 |
| 127 // Returns true if the |request| degrades the accuracy of the throughput | 130 // Returns true if the |request| degrades the accuracy of the throughput |
| 128 // observation window. A local request or a request that spans a connection | 131 // observation window. A local request or a request that spans a connection |
| 129 // change degrades the accuracy of the throughput computation. | 132 // change degrades the accuracy of the throughput computation. |
| 130 bool DegradesAccuracy(const URLRequest& request) const; | 133 bool DegradesAccuracy(const URLRequest& request) const; |
| 131 | 134 |
| 132 // Bounds |accuracy_degrading_requests_| and |requests_| to ensure their sizes | 135 // Bounds |accuracy_degrading_requests_| and |requests_| to ensure their sizes |
| 133 // do not exceed their capacities. | 136 // do not exceed their capacities. |
| 134 void BoundRequestsSize(); | 137 void BoundRequestsSize(); |
| 135 | 138 |
| 139 const NetworkQualityEstimatorParams* params_; |
| 136 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | 140 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
| 137 | 141 |
| 138 // Called every time a new throughput observation is available. | 142 // Called every time a new throughput observation is available. |
| 139 ThroughputObservationCallback throughput_observation_callback_; | 143 ThroughputObservationCallback throughput_observation_callback_; |
| 140 | 144 |
| 141 // Time when last connection change was observed. | 145 // Time when last connection change was observed. |
| 142 base::TimeTicks last_connection_change_; | 146 base::TimeTicks last_connection_change_; |
| 143 | 147 |
| 144 // Start time of the current throughput observation window. Set to null if | 148 // Start time of the current throughput observation window. Set to null if |
| 145 // the window is not currently active. | 149 // the window is not currently active. |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 178 DISALLOW_COPY_AND_ASSIGN(ThroughputAnalyzer); | 182 DISALLOW_COPY_AND_ASSIGN(ThroughputAnalyzer); |
| 179 }; | 183 }; |
| 180 | 184 |
| 181 } // namespace internal | 185 } // namespace internal |
| 182 | 186 |
| 183 } // namespace nqe | 187 } // namespace nqe |
| 184 | 188 |
| 185 } // namespace net | 189 } // namespace net |
| 186 | 190 |
| 187 #endif // NET_NQE_THROUGHPUT_ANALYZER_H_ | 191 #endif // NET_NQE_THROUGHPUT_ANALYZER_H_ |
| OLD | NEW |