Let QuicBandwidth::FromBytesAndTimeDelta return 1 bit per second if the result is less than that but not zero. Protected by FLAGS_quic_reloadable_flag_quic_round_up_tiny_bandwidth (Default True). PiperOrigin-RevId: 341455235 Change-Id: I48c3bb613eb966f7dd0f93881715e434de84b6ff
diff --git a/quic/core/quic_bandwidth.h b/quic/core/quic_bandwidth.h index e3e0cd1..97de22c 100644 --- a/quic/core/quic_bandwidth.h +++ b/quic/core/quic_bandwidth.h
@@ -17,6 +17,7 @@ #include "net/third_party/quiche/src/quic/core/quic_time.h" #include "net/third_party/quiche/src/quic/core/quic_types.h" #include "net/third_party/quiche/src/quic/platform/api/quic_export.h" +#include "net/third_party/quiche/src/quic/platform/api/quic_flag_utils.h" namespace quic { @@ -54,8 +55,23 @@ // Create a new QuicBandwidth based on the bytes per the elapsed delta. static inline QuicBandwidth FromBytesAndTimeDelta(QuicByteCount bytes, QuicTime::Delta delta) { - return QuicBandwidth((8 * bytes * kNumMicrosPerSecond) / - delta.ToMicroseconds()); + if (!GetQuicReloadableFlag(quic_round_up_tiny_bandwidth)) { + return QuicBandwidth((8 * bytes * kNumMicrosPerSecond) / + delta.ToMicroseconds()); + } + + if (bytes == 0) { + return QuicBandwidth(0); + } + + // 1 bit is 1000000 micro bits. + int64_t num_micro_bits = 8 * bytes * kNumMicrosPerSecond; + if (num_micro_bits < delta.ToMicroseconds()) { + QUIC_RELOADABLE_FLAG_COUNT(quic_round_up_tiny_bandwidth); + return QuicBandwidth(1); + } + + return QuicBandwidth(num_micro_bits / delta.ToMicroseconds()); } inline int64_t ToBitsPerSecond() const { return bits_per_second_; }
diff --git a/quic/core/quic_bandwidth_test.cc b/quic/core/quic_bandwidth_test.cc index 005eef0..0a32e4e 100644 --- a/quic/core/quic_bandwidth_test.cc +++ b/quic/core/quic_bandwidth_test.cc
@@ -58,6 +58,18 @@ EXPECT_EQ(QuicBandwidth::FromKBytesPerSecond(10), QuicBandwidth::FromBytesAndTimeDelta( 1000, QuicTime::Delta::FromMilliseconds(100))); + + EXPECT_EQ(QuicBandwidth::Zero(), QuicBandwidth::FromBytesAndTimeDelta( + 0, QuicTime::Delta::FromSeconds(9))); + + if (GetQuicReloadableFlag(quic_round_up_tiny_bandwidth)) { + EXPECT_EQ(QuicBandwidth::FromBitsPerSecond(1), + QuicBandwidth::FromBytesAndTimeDelta( + 1, QuicTime::Delta::FromSeconds(9))); + } else { + EXPECT_EQ(QuicBandwidth::Zero(), QuicBandwidth::FromBytesAndTimeDelta( + 1, QuicTime::Delta::FromSeconds(9))); + } } TEST_F(QuicBandwidthTest, Scale) {
diff --git a/quic/core/quic_flags_list.h b/quic/core/quic_flags_list.h index 0662174..6c87293 100644 --- a/quic/core/quic_flags_list.h +++ b/quic/core/quic_flags_list.h
@@ -63,6 +63,7 @@ QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_reject_spdy_frames, true) QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_reject_spdy_settings, true) QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_require_handshake_confirmation, false) +QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_round_up_tiny_bandwidth, false) QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_send_goaway_with_connection_close, false) QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_send_path_response, false) QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_send_timestamps, false)