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,6 +97,7 @@ void sendAckSMHandler(
const WriteStreamFrame& ackedFrame) { const WriteStreamFrame& ackedFrame) {
switch (stream.sendState) { switch (stream.sendState) {
case StreamSendState::Open: { case StreamSendState::Open: {
if (!ackedFrame.fromBufMeta) {
// Clean up the acked buffers from the retransmissionBuffer. // Clean up the acked buffers from the retransmissionBuffer.
auto ackedBuffer = stream.retransmissionBuffer.find(ackedFrame.offset); auto ackedBuffer = stream.retransmissionBuffer.find(ackedFrame.offset);
if (ackedBuffer != stream.retransmissionBuffer.end()) { if (ackedBuffer != stream.retransmissionBuffer.end()) {
@@ -110,6 +111,23 @@ void sendAckSMHandler(
ackedBuffer->second->data.chainLength()); ackedBuffer->second->data.chainLength());
stream.retransmissionBuffer.erase(ackedBuffer); 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:
stream.conn.streamManager->addDeliverable(stream.id); stream.conn.streamManager->addDeliverable(stream.id);

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