1
0
mirror of https://github.com/facebookincubator/mvfst.git synced 2025-08-06 22:22:38 +03:00

Redo "Update QUIC stream state after BufferMeta is written "

Summary: try to land this again without the compiler flags change

Differential Revision: D26958681

fbshipit-source-id: d00659aaf819dbb2942da8b41deab3d108a19f0f
This commit is contained in:
Yang Chi
2021-03-10 17:44:25 -08:00
committed by Facebook GitHub Bot
parent eefd6f88d0
commit cabbdfa0d7
3 changed files with 176 additions and 42 deletions

View File

@@ -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