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,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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user