1
0
mirror of https://github.com/facebookincubator/mvfst.git synced 2025-08-12 19:02:43 +03:00

refactor calculatePacingRate function

Summary:
No need to pass the minimal interval any more since everywhere we just
pass the transportSettings value. Just that inside the function directly

Reviewed By: mjoras

Differential Revision: D16773023

fbshipit-source-id: 22ada4f25d565e97e7fce27371a0e2240bbfe8c0
This commit is contained in:
Yang Chi
2019-08-19 09:11:23 -07:00
committed by Facebook Github Bot
parent a9305ebbe1
commit eb10f2e36d
6 changed files with 21 additions and 23 deletions

View File

@@ -273,12 +273,8 @@ void BbrCongestionController::updatePacing() noexcept {
pacingWindow_ = std::max(pacingWindow_, targetPacingWindow); pacingWindow_ = std::max(pacingWindow_, targetPacingWindow);
} }
// TODO: slower pacing if we are in STARTUP and loss has happened // TODO: slower pacing if we are in STARTUP and loss has happened
std::tie(pacingInterval_, pacingBurstSize_) = calculatePacingRate( std::tie(pacingInterval_, pacingBurstSize_) =
conn_, calculatePacingRate(conn_, pacingWindow_, kMinCwndInMssForBbr, mrtt);
pacingWindow_,
kMinCwndInMssForBbr,
conn_.transportSettings.pacingTimerTickInterval,
mrtt);
if (conn_.transportSettings.pacingEnabled && conn_.qLogger) { if (conn_.transportSettings.pacingEnabled && conn_.qLogger) {
conn_.qLogger->addPacingMetricUpdate(pacingBurstSize_, pacingInterval_); conn_.qLogger->addPacingMetricUpdate(pacingBurstSize_, pacingInterval_);

View File

@@ -28,9 +28,8 @@ std::pair<std::chrono::microseconds, uint64_t> calculatePacingRate(
const QuicConnectionStateBase& conn, const QuicConnectionStateBase& conn,
uint64_t cwnd, uint64_t cwnd,
uint64_t minCwndInMss, uint64_t minCwndInMss,
std::chrono::microseconds minimalInterval,
std::chrono::microseconds rtt) { std::chrono::microseconds rtt) {
if (minimalInterval > rtt) { if (conn.transportSettings.pacingTimerTickInterval > rtt) {
// We cannot really pace in this case. // We cannot really pace in this case.
return std::make_pair( return std::make_pair(
0us, conn.transportSettings.writeConnectionDataPacketsLimit); 0us, conn.transportSettings.writeConnectionDataPacketsLimit);
@@ -42,10 +41,12 @@ std::pair<std::chrono::microseconds, uint64_t> calculatePacingRate(
conn.transportSettings.maxBurstPackets, conn.transportSettings.maxBurstPackets,
static_cast<uint64_t>(std::ceil( static_cast<uint64_t>(std::ceil(
static_cast<double>(cwndInPackets) * static_cast<double>(cwndInPackets) *
static_cast<double>(minimalInterval.count()) / static_cast<double>(
conn.transportSettings.pacingTimerTickInterval.count()) /
static_cast<double>(rtt.count())))); static_cast<double>(rtt.count()))));
auto interval = auto interval = timeMax(
timeMax(minimalInterval, rtt * burstPerInterval / cwndInPackets); conn.transportSettings.pacingTimerTickInterval,
rtt * burstPerInterval / cwndInPackets);
return std::make_pair(interval, burstPerInterval); return std::make_pair(interval, burstPerInterval);
} }
} // namespace quic } // namespace quic

View File

@@ -21,12 +21,10 @@ uint64_t boundedCwnd(
uint64_t maxCwndInMss, uint64_t maxCwndInMss,
uint64_t minCwndInMss) noexcept; uint64_t minCwndInMss) noexcept;
// TODO: remove minimalInterval, use transportSettings from conn
std::pair<std::chrono::microseconds, uint64_t> calculatePacingRate( std::pair<std::chrono::microseconds, uint64_t> calculatePacingRate(
const QuicConnectionStateBase& conn, const QuicConnectionStateBase& conn,
uint64_t cwnd, uint64_t cwnd,
uint64_t minCwndInMss, uint64_t minCwndInMss,
std::chrono::microseconds minimalInterval,
std::chrono::microseconds rtt); std::chrono::microseconds rtt);
template <class T1, class T2> template <class T1, class T2>

View File

@@ -316,7 +316,6 @@ void Copa::updatePacing() noexcept {
conn_, conn_,
cwndBytes_ * 2, cwndBytes_ * 2,
conn_.transportSettings.minCwndInMss, conn_.transportSettings.minCwndInMss,
conn_.transportSettings.pacingTimerTickInterval,
conn_.lossState.srtt); conn_.lossState.srtt);
if (pacingInterval_ == std::chrono::milliseconds::zero()) { if (pacingInterval_ == std::chrono::milliseconds::zero()) {
return; return;

View File

@@ -541,7 +541,6 @@ void Cubic::updatePacing() noexcept {
conn_, conn_,
cwndBytes_ * pacingGain(), cwndBytes_ * pacingGain(),
conn_.transportSettings.minCwndInMss, conn_.transportSettings.minCwndInMss,
conn_.transportSettings.pacingTimerTickInterval,
conn_.lossState.srtt); conn_.lossState.srtt);
if (pacingInterval_ == std::chrono::milliseconds::zero()) { if (pacingInterval_ == std::chrono::milliseconds::zero()) {
return; return;

View File

@@ -23,14 +23,16 @@ class CongestionControlFunctionsTest : public Test {};
TEST_F(CongestionControlFunctionsTest, CalculatePacingRate) { TEST_F(CongestionControlFunctionsTest, CalculatePacingRate) {
QuicConnectionStateBase conn(QuicNodeType::Client); QuicConnectionStateBase conn(QuicNodeType::Client);
conn.udpSendPacketLen = 1; conn.udpSendPacketLen = 1;
conn.transportSettings.pacingTimerTickInterval = 10ms;
std::chrono::microseconds rtt(1000 * 100); std::chrono::microseconds rtt(1000 * 100);
auto result = calculatePacingRate( auto result =
conn, 50, conn.transportSettings.minCwndInMss, 10ms, rtt); calculatePacingRate(conn, 50, conn.transportSettings.minCwndInMss, rtt);
EXPECT_EQ(10ms, result.first); EXPECT_EQ(10ms, result.first);
EXPECT_EQ(5, result.second); EXPECT_EQ(5, result.second);
auto result2 = calculatePacingRate( conn.transportSettings.pacingTimerTickInterval = 1ms;
conn, 300, conn.transportSettings.minCwndInMss, 1ms, rtt); auto result2 =
calculatePacingRate(conn, 300, conn.transportSettings.minCwndInMss, rtt);
EXPECT_EQ(1ms, result2.first); EXPECT_EQ(1ms, result2.first);
EXPECT_EQ(3, result2.second); EXPECT_EQ(3, result2.second);
} }
@@ -38,8 +40,9 @@ TEST_F(CongestionControlFunctionsTest, CalculatePacingRate) {
TEST_F(CongestionControlFunctionsTest, MinPacingRate) { TEST_F(CongestionControlFunctionsTest, MinPacingRate) {
QuicConnectionStateBase conn(QuicNodeType::Client); QuicConnectionStateBase conn(QuicNodeType::Client);
conn.udpSendPacketLen = 1; conn.udpSendPacketLen = 1;
conn.transportSettings.pacingTimerTickInterval = 1ms;
auto result = calculatePacingRate( auto result = calculatePacingRate(
conn, 100, conn.transportSettings.minCwndInMss, 1ms, 100000us); conn, 100, conn.transportSettings.minCwndInMss, 100000us);
EXPECT_EQ(1ms, result.first); EXPECT_EQ(1ms, result.first);
EXPECT_EQ(1, result.second); EXPECT_EQ(1, result.second);
} }
@@ -47,8 +50,9 @@ TEST_F(CongestionControlFunctionsTest, MinPacingRate) {
TEST_F(CongestionControlFunctionsTest, SmallCwnd) { TEST_F(CongestionControlFunctionsTest, SmallCwnd) {
QuicConnectionStateBase conn(QuicNodeType::Client); QuicConnectionStateBase conn(QuicNodeType::Client);
conn.udpSendPacketLen = 1; conn.udpSendPacketLen = 1;
conn.transportSettings.pacingTimerTickInterval = 1ms;
auto result = calculatePacingRate( auto result = calculatePacingRate(
conn, 10, conn.transportSettings.minCwndInMss, 1ms, 100000us); conn, 10, conn.transportSettings.minCwndInMss, 100000us);
EXPECT_EQ(10ms, result.first); EXPECT_EQ(10ms, result.first);
EXPECT_EQ(1, result.second); EXPECT_EQ(1, result.second);
} }
@@ -56,8 +60,9 @@ TEST_F(CongestionControlFunctionsTest, SmallCwnd) {
TEST_F(CongestionControlFunctionsTest, RttSmallerThanInterval) { TEST_F(CongestionControlFunctionsTest, RttSmallerThanInterval) {
QuicConnectionStateBase conn(QuicNodeType::Client); QuicConnectionStateBase conn(QuicNodeType::Client);
conn.udpSendPacketLen = 1; conn.udpSendPacketLen = 1;
auto result = calculatePacingRate( conn.transportSettings.pacingTimerTickInterval = 10ms;
conn, 10, conn.transportSettings.minCwndInMss, 10ms, 1ms); auto result =
calculatePacingRate(conn, 10, conn.transportSettings.minCwndInMss, 1ms);
EXPECT_EQ(std::chrono::milliseconds::zero(), result.first); EXPECT_EQ(std::chrono::milliseconds::zero(), result.first);
EXPECT_EQ( EXPECT_EQ(
conn.transportSettings.writeConnectionDataPacketsLimit, result.second); conn.transportSettings.writeConnectionDataPacketsLimit, result.second);