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

Side by Side Diff: net/quic/core/congestion_control/cubic.cc

Issue 2335283002: Removes QUIC flag and code that shifts cubic epoch on quiescence, since it's buggy and should not b… (Closed)
Patch Set: rebased Created 4 years, 3 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
« no previous file with comments | « no previous file | net/quic/core/congestion_control/tcp_cubic_sender_packets_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/quic/core/congestion_control/cubic.h" 5 #include "net/quic/core/congestion_control/cubic.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 #include <algorithm> 8 #include <algorithm>
9 #include <cmath> 9 #include <cmath>
10 10
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 last_congestion_window_ = 0; 74 last_congestion_window_ = 0;
75 last_max_congestion_window_ = 0; 75 last_max_congestion_window_ = 0;
76 acked_packets_count_ = 0; 76 acked_packets_count_ = 0;
77 estimated_tcp_congestion_window_ = 0; 77 estimated_tcp_congestion_window_ = 0;
78 origin_point_congestion_window_ = 0; 78 origin_point_congestion_window_ = 0;
79 time_to_origin_point_ = 0; 79 time_to_origin_point_ = 0;
80 last_target_congestion_window_ = 0; 80 last_target_congestion_window_ = 0;
81 } 81 }
82 82
83 void Cubic::OnApplicationLimited() { 83 void Cubic::OnApplicationLimited() {
84 if (FLAGS_shift_quic_cubic_epoch_when_app_limited) { 84 // When sender is not using the available congestion window, Cubic's epoch
85 // When sender is not using the available congestion window, Cubic's epoch 85 // should not continue growing. Reset the epoch when in such a period.
86 // should not continue growing. Record the time when sender goes into an 86 epoch_ = QuicTime::Zero();
87 // app-limited period here, to compensate later when cwnd growth happens.
88 if (app_limited_start_time_ == QuicTime::Zero()) {
89 app_limited_start_time_ = clock_->ApproximateNow();
90 }
91 } else {
92 // When sender is not using the available congestion window, Cubic's epoch
93 // should not continue growing. Reset the epoch when in such a period.
94 epoch_ = QuicTime::Zero();
95 }
96 } 87 }
97 88
98 QuicPacketCount Cubic::CongestionWindowAfterPacketLoss( 89 QuicPacketCount Cubic::CongestionWindowAfterPacketLoss(
99 QuicPacketCount current_congestion_window) { 90 QuicPacketCount current_congestion_window) {
100 if (current_congestion_window < last_max_congestion_window_) { 91 if (current_congestion_window < last_max_congestion_window_) {
101 // We never reached the old max, so assume we are competing with another 92 // We never reached the old max, so assume we are competing with another
102 // flow. Use our extra back off factor to allow the other flow to go up. 93 // flow. Use our extra back off factor to allow the other flow to go up.
103 last_max_congestion_window_ = 94 last_max_congestion_window_ =
104 static_cast<int>(kBetaLastMax * current_congestion_window); 95 static_cast<int>(kBetaLastMax * current_congestion_window);
105 } else { 96 } else {
(...skipping 26 matching lines...) Expand all
132 estimated_tcp_congestion_window_ = current_congestion_window; 123 estimated_tcp_congestion_window_ = current_congestion_window;
133 if (last_max_congestion_window_ <= current_congestion_window) { 124 if (last_max_congestion_window_ <= current_congestion_window) {
134 time_to_origin_point_ = 0; 125 time_to_origin_point_ = 0;
135 origin_point_congestion_window_ = current_congestion_window; 126 origin_point_congestion_window_ = current_congestion_window;
136 } else { 127 } else {
137 time_to_origin_point_ = static_cast<uint32_t>( 128 time_to_origin_point_ = static_cast<uint32_t>(
138 cbrt(kCubeFactor * 129 cbrt(kCubeFactor *
139 (last_max_congestion_window_ - current_congestion_window))); 130 (last_max_congestion_window_ - current_congestion_window)));
140 origin_point_congestion_window_ = last_max_congestion_window_; 131 origin_point_congestion_window_ = last_max_congestion_window_;
141 } 132 }
142 } else {
143 // If sender was app-limited, then freeze congestion window growth during
144 // app-limited period. Continue growth now by shifting the epoch-start
145 // through the app-limited period.
146 if (FLAGS_shift_quic_cubic_epoch_when_app_limited &&
147 app_limited_start_time_ != QuicTime::Zero()) {
148 QuicTime::Delta shift = current_time - app_limited_start_time_;
149 DVLOG(1) << "Shifting epoch for quiescence by " << shift.ToMicroseconds();
150 epoch_ = epoch_ + shift;
151 app_limited_start_time_ = QuicTime::Zero();
152 }
153 } 133 }
154 134
155 // Change the time unit from microseconds to 2^10 fractions per second. Take 135 // Change the time unit from microseconds to 2^10 fractions per second. Take
156 // the round trip time in account. This is done to allow us to use shift as a 136 // the round trip time in account. This is done to allow us to use shift as a
157 // divide operator. 137 // divide operator.
158 int64_t elapsed_time = 138 int64_t elapsed_time =
159 ((current_time + delay_min - epoch_).ToMicroseconds() << 10) / 139 ((current_time + delay_min - epoch_).ToMicroseconds() << 10) /
160 kNumMicrosPerSecond; 140 kNumMicrosPerSecond;
161 141
162 int64_t offset = time_to_origin_point_ - elapsed_time; 142 int64_t offset = time_to_origin_point_ - elapsed_time;
(...skipping 25 matching lines...) Expand all
188 // congestion_window, use highest (fastest). 168 // congestion_window, use highest (fastest).
189 if (target_congestion_window < estimated_tcp_congestion_window_) { 169 if (target_congestion_window < estimated_tcp_congestion_window_) {
190 target_congestion_window = estimated_tcp_congestion_window_; 170 target_congestion_window = estimated_tcp_congestion_window_;
191 } 171 }
192 172
193 DVLOG(1) << "Final target congestion_window: " << target_congestion_window; 173 DVLOG(1) << "Final target congestion_window: " << target_congestion_window;
194 return target_congestion_window; 174 return target_congestion_window;
195 } 175 }
196 176
197 } // namespace net 177 } // namespace net
OLDNEW
« no previous file with comments | « no previous file | net/quic/core/congestion_control/tcp_cubic_sender_packets_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698