mirror of
https://github.com/facebookincubator/mvfst.git
synced 2025-08-08 09:42:06 +03:00
Update QUIC stream state after BufferMeta is written
Summary: Update retransmission queue in the stream after BufferMeta is written, for both new data and lost data cases. Reviewed By: mjoras Differential Revision: D26260987 fbshipit-source-id: 15a4fa17826426b4b972b63cf370fe791b3101ff
This commit is contained in:
committed by
Facebook GitHub Bot
parent
14c56000b5
commit
78170a2f3b
@@ -2612,5 +2612,62 @@ TEST_F(QuicTransportFunctionsTest, WriteD6DProbesWithInplaceBuilder) {
|
||||
EXPECT_EQ(0, bufPtr->headroom());
|
||||
}
|
||||
|
||||
TEST_F(QuicTransportFunctionsTest, UpdateConnectionWithBufferMeta) {
|
||||
auto conn = createConn();
|
||||
// Builds a fake packet to test with.
|
||||
auto packet = buildEmptyPacket(*conn, PacketNumberSpace::AppData);
|
||||
|
||||
auto streamId =
|
||||
conn->streamManager->createNextBidirectionalStream().value()->id;
|
||||
auto stream = conn->streamManager->findStream(streamId);
|
||||
EXPECT_TRUE(stream->retransmissionBufMetas.empty());
|
||||
writeDataToQuicStream(
|
||||
*stream, IOBuf::copyBuffer("Wear a face mask please!"), false /* eof */);
|
||||
BufferMeta bufMeta(2000);
|
||||
writeBufMetaToQuicStream(*stream, bufMeta, true /* eof */);
|
||||
EXPECT_TRUE(stream->writeBufMeta.eof);
|
||||
EXPECT_EQ(2000, stream->writeBufMeta.length);
|
||||
auto bufMetaStartingOffset = stream->writeBufMeta.offset;
|
||||
WriteStreamFrame writeStreamFrame(
|
||||
streamId, bufMetaStartingOffset, 1000, false /* fin */);
|
||||
writeStreamFrame.fromBufMeta = true;
|
||||
packet.packet.frames.push_back(writeStreamFrame);
|
||||
|
||||
updateConnection(
|
||||
*conn, folly::none, packet.packet, TimePoint(), getEncodedSize(packet));
|
||||
EXPECT_EQ(1000 + bufMetaStartingOffset, stream->writeBufMeta.offset);
|
||||
EXPECT_EQ(1000, stream->writeBufMeta.length);
|
||||
EXPECT_FALSE(stream->retransmissionBufMetas.empty());
|
||||
auto retxBufMetaIter =
|
||||
stream->retransmissionBufMetas.find(bufMetaStartingOffset);
|
||||
EXPECT_NE(retxBufMetaIter, stream->retransmissionBufMetas.end());
|
||||
EXPECT_EQ(bufMetaStartingOffset, retxBufMetaIter->second.offset);
|
||||
EXPECT_EQ(1000, retxBufMetaIter->second.length);
|
||||
EXPECT_FALSE(retxBufMetaIter->second.eof);
|
||||
|
||||
// Manually lose this packet:
|
||||
stream->lossBufMetas.push_back(retxBufMetaIter->second);
|
||||
stream->retransmissionBufMetas.erase(retxBufMetaIter);
|
||||
ASSERT_FALSE(stream->lossBufMetas.empty());
|
||||
ASSERT_TRUE(stream->retransmissionBufMetas.empty());
|
||||
|
||||
// Retransmit it:
|
||||
auto retxPacket = buildEmptyPacket(*conn, PacketNumberSpace::AppData);
|
||||
// Retx of the stream looks exactly the same
|
||||
retxPacket.packet.frames.push_back(writeStreamFrame);
|
||||
updateConnection(
|
||||
*conn,
|
||||
folly::none,
|
||||
retxPacket.packet,
|
||||
TimePoint(),
|
||||
getEncodedSize(retxPacket));
|
||||
EXPECT_TRUE(stream->lossBufMetas.empty());
|
||||
retxBufMetaIter = stream->retransmissionBufMetas.find(bufMetaStartingOffset);
|
||||
EXPECT_NE(retxBufMetaIter, stream->retransmissionBufMetas.end());
|
||||
EXPECT_EQ(bufMetaStartingOffset, retxBufMetaIter->second.offset);
|
||||
EXPECT_EQ(1000, retxBufMetaIter->second.length);
|
||||
EXPECT_FALSE(retxBufMetaIter->second.eof);
|
||||
}
|
||||
|
||||
} // namespace test
|
||||
} // namespace quic
|
||||
|
Reference in New Issue
Block a user