1
0
mirror of https://github.com/facebookincubator/mvfst.git synced 2025-11-24 04:01:07 +03:00

Remove WriteBufferMeta from retransmission buffer upon ack

Summary: as title

Reviewed By: mjoras

Differential Revision: D27361934

fbshipit-source-id: 81618c039ff026a8b3dc2caba5ce335ee431e15e
This commit is contained in:
Yang Chi
2021-04-01 10:40:39 -07:00
committed by Facebook GitHub Bot
parent 082b0f5df7
commit 31f9d93f45
2 changed files with 59 additions and 12 deletions

View File

@@ -97,18 +97,36 @@ void sendAckSMHandler(
const WriteStreamFrame& ackedFrame) { const WriteStreamFrame& ackedFrame) {
switch (stream.sendState) { switch (stream.sendState) {
case StreamSendState::Open: { case StreamSendState::Open: {
// Clean up the acked buffers from the retransmissionBuffer. if (!ackedFrame.fromBufMeta) {
auto ackedBuffer = stream.retransmissionBuffer.find(ackedFrame.offset); // Clean up the acked buffers from the retransmissionBuffer.
if (ackedBuffer != stream.retransmissionBuffer.end()) { auto ackedBuffer = stream.retransmissionBuffer.find(ackedFrame.offset);
VLOG(10) << "Open: acked stream data stream=" << stream.id if (ackedBuffer != stream.retransmissionBuffer.end()) {
<< " offset=" << ackedBuffer->second->offset VLOG(10) << "Open: acked stream data stream=" << stream.id
<< " len=" << ackedBuffer->second->data.chainLength() << " offset=" << ackedBuffer->second->offset
<< " eof=" << ackedBuffer->second->eof << " " << stream.conn; << " len=" << ackedBuffer->second->data.chainLength()
stream.ackedIntervals.insert( << " eof=" << ackedBuffer->second->eof << " " << stream.conn;
ackedBuffer->second->offset, stream.ackedIntervals.insert(
ackedBuffer->second->offset + ackedBuffer->second->offset,
ackedBuffer->second->data.chainLength()); ackedBuffer->second->offset +
stream.retransmissionBuffer.erase(ackedBuffer); ackedBuffer->second->data.chainLength());
stream.retransmissionBuffer.erase(ackedBuffer);
}
} else {
auto ackedBuffer =
stream.retransmissionBufMetas.find(ackedFrame.offset);
if (ackedBuffer != stream.retransmissionBufMetas.end()) {
CHECK_EQ(ackedFrame.offset, ackedBuffer->second.offset);
CHECK_EQ(ackedFrame.len, ackedBuffer->second.length);
CHECK_EQ(ackedFrame.fin, ackedBuffer->second.eof);
VLOG(10) << "Open: acked stream data bufmeta=" << stream.id
<< " offset=" << ackedBuffer->second.offset
<< " len=" << ackedBuffer->second.length
<< " eof=" << ackedBuffer->second.eof << " " << stream.conn;
stream.ackedIntervals.insert(
ackedBuffer->second.offset,
ackedBuffer->second.offset + ackedBuffer->second.length);
stream.retransmissionBufMetas.erase(ackedBuffer);
}
} }
// This stream may be able to invoke some deliveryCallbacks: // This stream may be able to invoke some deliveryCallbacks:

View File

@@ -829,5 +829,34 @@ TEST_F(QuicUnidirectionalStreamTest, ResetSentInvalidRstStream) {
QuicTransportException); QuicTransportException);
} }
TEST_F(QuicOpenStateTest, DSRStreamAcked) {
auto conn = createConn();
conn->clientConnectionId = getTestConnectionId(0);
conn->serverConnectionId = getTestConnectionId(1);
auto stream = conn->streamManager->createNextBidirectionalStream().value();
writeDataToQuicStream(
*stream,
folly::IOBuf::copyBuffer("Big ship stucks in small water"),
false);
writeBufMetaToQuicStream(*stream, BufferMeta(1000), true);
auto bufMetaStartingOffset = stream->writeBufMeta.offset;
handleStreamWritten(
*conn,
*stream,
bufMetaStartingOffset,
300,
false,
1,
PacketNumberSpace::AppData,
true);
ASSERT_NE(
stream->retransmissionBufMetas.end(),
stream->retransmissionBufMetas.find(bufMetaStartingOffset));
WriteStreamFrame frame(stream->id, bufMetaStartingOffset, 300, false);
frame.fromBufMeta = true;
sendAckSMHandler(*stream, frame);
EXPECT_TRUE(stream->retransmissionBufMetas.empty());
}
} // namespace test } // namespace test
} // namespace quic } // namespace quic