mirror of
https://github.com/facebookincubator/mvfst.git
synced 2025-08-05 11:21:09 +03:00
Introduce Tokens in Quic Pacer
Summary: Add a token value into the pacer. This is so that when there is not enough application data to consume all the burst size in current event loop, we can accumulate the unused sending credit and use the later when new data comes in. Each time a packet is sent, we consume 1 token. On pakcet loss, we clear all tokens. Each time there is an ack and we refresh pacing rate, token increases by calculated burst size. It is also increased when timer drifts during writes. When there is available tokens, there is no delay of writing out packets, and the burst size is current token amount. Reviewed By: siyengar Differential Revision: D17670053 fbshipit-source-id: 6abc3acce39e0ece90248c52c3d73935a9878e02
This commit is contained in:
committed by
Facebook Github Bot
parent
5389228722
commit
537e178a5f
@@ -743,6 +743,9 @@ TEST_F(QuicTransportFunctionsTest, TestUpdateConnectionWithPureAck) {
|
||||
auto conn = createConn();
|
||||
conn->qLogger = std::make_shared<quic::FileQLogger>();
|
||||
auto packet = buildEmptyPacket(*conn, PacketNumberSpace::Handshake);
|
||||
auto mockPacer = std::make_unique<MockPacer>();
|
||||
auto rawPacer = mockPacer.get();
|
||||
conn->pacer = std::move(mockPacer);
|
||||
auto mockCongestionController = std::make_unique<MockCongestionController>();
|
||||
auto rawController = mockCongestionController.get();
|
||||
conn->congestionController = std::move(mockCongestionController);
|
||||
@@ -751,6 +754,7 @@ TEST_F(QuicTransportFunctionsTest, TestUpdateConnectionWithPureAck) {
|
||||
ackFrame.ackBlocks.insert(10);
|
||||
packet.packet.frames.push_back(std::move(ackFrame));
|
||||
EXPECT_CALL(*rawController, onPacketSent(_)).Times(0);
|
||||
EXPECT_CALL(*rawPacer, onPacketSent()).Times(0);
|
||||
updateConnection(
|
||||
*conn, folly::none, packet.packet, TimePoint(), getEncodedSize(packet));
|
||||
EXPECT_EQ(1, conn->outstandingPackets.size());
|
||||
@@ -986,6 +990,34 @@ TEST_F(QuicTransportFunctionsTest, WriteQuicDataToSocketWithCC) {
|
||||
conn->transportSettings.writeConnectionDataPacketsLimit);
|
||||
}
|
||||
|
||||
TEST_F(QuicTransportFunctionsTest, WriteQuicdataToSocketWithPacer) {
|
||||
auto conn = createConn();
|
||||
auto mockPacer = std::make_unique<MockPacer>();
|
||||
auto rawPacer = mockPacer.get();
|
||||
conn->pacer = std::move(mockPacer);
|
||||
|
||||
EventBase evb;
|
||||
auto socket = std::make_unique<folly::test::MockAsyncUDPSocket>(&evb);
|
||||
auto rawSocket = socket.get();
|
||||
|
||||
auto stream1 = conn->streamManager->createNextBidirectionalStream().value();
|
||||
auto buf =
|
||||
IOBuf::copyBuffer("0123456789012012345678901201234567890120123456789012");
|
||||
writeDataToQuicStream(*stream1, buf->clone(), true);
|
||||
|
||||
EXPECT_CALL(*rawPacer, onPacketSent()).Times(1);
|
||||
EXPECT_CALL(*transportInfoCb_, onWrite(_));
|
||||
writeQuicDataToSocket(
|
||||
*rawSocket,
|
||||
*conn,
|
||||
*conn->clientConnectionId,
|
||||
*conn->serverConnectionId,
|
||||
*aead,
|
||||
*headerCipher,
|
||||
getVersion(*conn),
|
||||
conn->transportSettings.writeConnectionDataPacketsLimit);
|
||||
}
|
||||
|
||||
TEST_F(QuicTransportFunctionsTest, WriteQuicDataToSocketLimitTest) {
|
||||
auto conn = createConn();
|
||||
auto mockCongestionController = std::make_unique<MockCongestionController>();
|
||||
|
Reference in New Issue
Block a user