mirror of
https://github.com/facebookincubator/mvfst.git
synced 2025-08-06 22:22:38 +03:00
QUIC flow control accounts for DSR bytes
Summary: This was completely missing previously, which led to Client quickly shutting down a connection with flow control violation when server oversends in DSR mode. Reviewed By: mjoras Differential Revision: D27940953 fbshipit-source-id: 5644c1a3da5217365df9de33258bb5b071ff8187
This commit is contained in:
committed by
Facebook GitHub Bot
parent
5590b9f573
commit
62b0d8b879
@@ -16,6 +16,8 @@
|
||||
#include <quic/codec/QuicPacketBuilder.h>
|
||||
#include <quic/codec/test/Mocks.h>
|
||||
#include <quic/common/test/TestUtils.h>
|
||||
#include <quic/dsr/Types.h>
|
||||
#include <quic/dsr/test/Mocks.h>
|
||||
#include <quic/fizz/client/handshake/FizzClientQuicHandshakeContext.h>
|
||||
#include <quic/fizz/server/handshake/FizzServerQuicHandshakeContext.h>
|
||||
#include <quic/server/state/ServerStateMachine.h>
|
||||
@@ -1739,6 +1741,39 @@ TEST_F(QuicPacketSchedulerTest, RunOutFlowControlDuringStreamWrite) {
|
||||
EXPECT_EQ(200, stream2->retransmissionBuffer[0]->data.chainLength());
|
||||
}
|
||||
|
||||
TEST_F(QuicPacketSchedulerTest, NoFinWhenThereIsPendingWriteBuf) {
|
||||
QuicServerConnectionState conn(
|
||||
FizzServerQuicHandshakeContext::Builder().build());
|
||||
conn.streamManager->setMaxLocalBidirectionalStreams(10);
|
||||
conn.flowControlState.peerAdvertisedMaxOffset = 100000;
|
||||
auto* stream = *(conn.streamManager->createNextBidirectionalStream());
|
||||
stream->flowControlState.peerAdvertisedMaxOffset = 100000;
|
||||
|
||||
writeDataToQuicStream(*stream, folly::IOBuf::copyBuffer("Ascent"), false);
|
||||
stream->dsrSender = std::make_unique<MockDSRPacketizationRequestSender>();
|
||||
BufferMeta bufferMeta(5000);
|
||||
writeBufMetaToQuicStream(*stream, bufferMeta, true);
|
||||
EXPECT_TRUE(stream->finalWriteOffset.hasValue());
|
||||
PacketNum packetNum = 0;
|
||||
ShortHeader header(
|
||||
ProtectionType::KeyPhaseOne,
|
||||
conn.clientConnectionId.value_or(getTestConnectionId()),
|
||||
packetNum);
|
||||
RegularQuicPacketBuilder builder(
|
||||
conn.udpSendPacketLen,
|
||||
std::move(header),
|
||||
conn.ackStates.appDataAckState.largestAckedByPeer.value_or(0));
|
||||
builder.encodePacketHeader();
|
||||
StreamFrameScheduler scheduler(conn);
|
||||
scheduler.writeStreams(builder);
|
||||
auto packet = std::move(builder).buildPacket().packet;
|
||||
EXPECT_EQ(1, packet.frames.size());
|
||||
auto streamFrame = *packet.frames[0].asWriteStreamFrame();
|
||||
EXPECT_EQ(streamFrame.len, 6);
|
||||
EXPECT_EQ(streamFrame.offset, 0);
|
||||
EXPECT_FALSE(streamFrame.fin);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(
|
||||
QuicPacketSchedulerTests,
|
||||
QuicPacketSchedulerTest,
|
||||
|
Reference in New Issue
Block a user