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:
committed by
Facebook GitHub Bot
parent
082b0f5df7
commit
31f9d93f45
@@ -97,18 +97,36 @@ void sendAckSMHandler(
|
||||
const WriteStreamFrame& ackedFrame) {
|
||||
switch (stream.sendState) {
|
||||
case StreamSendState::Open: {
|
||||
// Clean up the acked buffers from the retransmissionBuffer.
|
||||
auto ackedBuffer = stream.retransmissionBuffer.find(ackedFrame.offset);
|
||||
if (ackedBuffer != stream.retransmissionBuffer.end()) {
|
||||
VLOG(10) << "Open: acked stream data stream=" << stream.id
|
||||
<< " offset=" << ackedBuffer->second->offset
|
||||
<< " len=" << ackedBuffer->second->data.chainLength()
|
||||
<< " eof=" << ackedBuffer->second->eof << " " << stream.conn;
|
||||
stream.ackedIntervals.insert(
|
||||
ackedBuffer->second->offset,
|
||||
ackedBuffer->second->offset +
|
||||
ackedBuffer->second->data.chainLength());
|
||||
stream.retransmissionBuffer.erase(ackedBuffer);
|
||||
if (!ackedFrame.fromBufMeta) {
|
||||
// Clean up the acked buffers from the retransmissionBuffer.
|
||||
auto ackedBuffer = stream.retransmissionBuffer.find(ackedFrame.offset);
|
||||
if (ackedBuffer != stream.retransmissionBuffer.end()) {
|
||||
VLOG(10) << "Open: acked stream data stream=" << stream.id
|
||||
<< " offset=" << ackedBuffer->second->offset
|
||||
<< " len=" << ackedBuffer->second->data.chainLength()
|
||||
<< " eof=" << ackedBuffer->second->eof << " " << stream.conn;
|
||||
stream.ackedIntervals.insert(
|
||||
ackedBuffer->second->offset,
|
||||
ackedBuffer->second->offset +
|
||||
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:
|
||||
|
||||
@@ -829,5 +829,34 @@ TEST_F(QuicUnidirectionalStreamTest, ResetSentInvalidRstStream) {
|
||||
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 quic
|
||||
|
||||
Reference in New Issue
Block a user