1
0
mirror of https://github.com/facebookincubator/mvfst.git synced 2025-11-22 16:02:34 +03:00

Properly close DSR streams on ACK.

Summary: The bug here is that we weren't accounting for the DSR state when checking if the stream should be closed. This causes the stream state to live until the connection closes.

Reviewed By: yairgott

Differential Revision: D36269711

fbshipit-source-id: 403268db1940b2f00130709243aa6df1d2af39cd
This commit is contained in:
Matt Joras
2022-05-10 11:03:37 -07:00
committed by Facebook GitHub Bot
parent 580dfad3de
commit b0987bde3d
3 changed files with 92 additions and 4 deletions

View File

@@ -854,6 +854,45 @@ TEST_F(QuicOpenStateTest, DSRStreamAcked) {
frame.fromBufMeta = true;
sendAckSMHandler(*stream, frame);
EXPECT_TRUE(stream->retransmissionBufMetas.empty());
EXPECT_EQ(stream->sendState, StreamSendState::Open);
}
TEST_F(QuicOpenStateTest, DSRFullStreamAcked) {
auto conn = createConn();
conn->clientConnectionId = getTestConnectionId(0);
conn->serverConnectionId = getTestConnectionId(1);
auto stream = conn->streamManager->createNextBidirectionalStream().value();
auto buf = folly::IOBuf::copyBuffer("Big ship stucks in small water");
size_t len = buf->computeChainDataLength();
writeDataToQuicStream(*stream, std::move(buf), false);
handleStreamWritten(
*conn, *stream, 0, len, false, 1, PacketNumberSpace::AppData);
ASSERT_EQ(stream->retransmissionBuffer.size(), 1);
writeBufMetaToQuicStream(*stream, BufferMeta(1000), true);
auto bufMetaStartingOffset = stream->writeBufMeta.offset;
handleStreamBufMetaWritten(
*conn,
*stream,
bufMetaStartingOffset,
1000,
true,
1,
PacketNumberSpace::AppData);
ASSERT_EQ(stream->writeBuffer.chainLength(), 0);
ASSERT_NE(
stream->retransmissionBufMetas.end(),
stream->retransmissionBufMetas.find(bufMetaStartingOffset));
WriteStreamFrame frame(stream->id, bufMetaStartingOffset, 1000, true);
frame.fromBufMeta = true;
sendAckSMHandler(*stream, frame);
frame.offset = 0;
frame.len = len;
frame.fin = false;
frame.fromBufMeta = false;
sendAckSMHandler(*stream, frame);
EXPECT_TRUE(stream->retransmissionBuffer.empty());
EXPECT_TRUE(stream->retransmissionBufMetas.empty());
EXPECT_EQ(stream->sendState, StreamSendState::Closed);
}
} // namespace test