1
0
mirror of https://github.com/facebookincubator/mvfst.git synced 2025-08-08 09:42:06 +03:00

Do not use the regular CloningScheduler to clone DSR packet

Summary: For now let it fallback to ping.

Reviewed By: mjoras

Differential Revision: D27481741

fbshipit-source-id: 874529a06ab882d9651e06f615bc82505c1c2872
This commit is contained in:
Yang Chi
2021-04-19 11:07:16 -07:00
committed by Facebook GitHub Bot
parent a4d235934c
commit 4ab385c216
6 changed files with 47 additions and 2 deletions

View File

@@ -689,7 +689,8 @@ bool CloningScheduler::hasData() const {
// TODO: I'm not completely convinced d6d.outstandingProbes has been updated // TODO: I'm not completely convinced d6d.outstandingProbes has been updated
// correctly. // correctly.
return frameScheduler_.hasData() || return frameScheduler_.hasData() ||
conn_.outstandings.numOutstanding() > conn_.d6d.outstandingProbes; conn_.outstandings.numOutstanding() >
conn_.d6d.outstandingProbes + conn_.outstandings.dsrCount;
} }
SchedulingResult CloningScheduler::scheduleFramesForPacket( SchedulingResult CloningScheduler::scheduleFramesForPacket(
@@ -712,7 +713,8 @@ SchedulingResult CloningScheduler::scheduleFramesForPacket(
// Look for an outstanding packet that's no larger than the writableBytes // Look for an outstanding packet that's no larger than the writableBytes
for (auto& outstandingPacket : conn_.outstandings.packets) { for (auto& outstandingPacket : conn_.outstandings.packets) {
if (outstandingPacket.declaredLost || if (outstandingPacket.declaredLost ||
outstandingPacket.metadata.isD6DProbe) { outstandingPacket.metadata.isD6DProbe ||
outstandingPacket.isDSRPacket) {
continue; continue;
} }
auto opPnSpace = outstandingPacket.packet.header.getPacketNumberSpace(); auto opPnSpace = outstandingPacket.packet.header.getPacketNumberSpace();

View File

@@ -815,6 +815,9 @@ void updateConnection(
conn.lossState.totalBytesCloned += encodedSize; conn.lossState.totalBytesCloned += encodedSize;
} }
pkt.isDSRPacket = isDSRPacket; pkt.isDSRPacket = isDSRPacket;
if (isDSRPacket) {
++conn.outstandings.dsrCount;
}
if (conn.congestionController) { if (conn.congestionController) {
conn.congestionController->onPacketSent(pkt); conn.congestionController->onPacketSent(pkt);

View File

@@ -478,6 +478,32 @@ TEST_F(QuicPacketSchedulerTest, StreamFrameSchedulerStreamNotExists) {
EXPECT_EQ(builder.remainingSpaceInPkt(), originalSpace); EXPECT_EQ(builder.remainingSpaceInPkt(), originalSpace);
} }
TEST_F(QuicPacketSchedulerTest, NoCloningForDSR) {
QuicClientConnectionState conn(
FizzClientQuicHandshakeContext::Builder().build());
FrameScheduler noopScheduler("frame");
ASSERT_FALSE(noopScheduler.hasData());
CloningScheduler cloningScheduler(noopScheduler, conn, "Juice WRLD", 0);
EXPECT_FALSE(cloningScheduler.hasData());
addOutstandingPacket(conn);
EXPECT_TRUE(cloningScheduler.hasData());
conn.outstandings.packets.back().isDSRPacket = true;
conn.outstandings.dsrCount++;
EXPECT_FALSE(cloningScheduler.hasData());
ShortHeader header(
ProtectionType::KeyPhaseOne,
conn.clientConnectionId.value_or(getTestConnectionId()),
getNextPacketNum(conn, PacketNumberSpace::AppData));
RegularQuicPacketBuilder builder(
conn.udpSendPacketLen,
std::move(header),
conn.ackStates.appDataAckState.largestAckedByPeer.value_or(0));
auto result = cloningScheduler.scheduleFramesForPacket(
std::move(builder), kDefaultUDPSendPacketLen);
EXPECT_FALSE(result.packetEvent.hasValue());
EXPECT_FALSE(result.packet.hasValue());
}
TEST_F(QuicPacketSchedulerTest, CloningSchedulerTest) { TEST_F(QuicPacketSchedulerTest, CloningSchedulerTest) {
QuicClientConnectionState conn( QuicClientConnectionState conn(
FizzClientQuicHandshakeContext::Builder().build()); FizzClientQuicHandshakeContext::Builder().build());

View File

@@ -262,6 +262,10 @@ folly::Optional<CongestionController::LossEvent> detectLossPackets(
lossEvent.addLostPacket(pkt); lossEvent.addLostPacket(pkt);
observerLossEvent.addLostPacket(lostByTimeout, lostByReorder, pkt); observerLossEvent.addLostPacket(lostByTimeout, lostByReorder, pkt);
if (pkt.isDSRPacket) {
CHECK_GT(conn.outstandings.dsrCount, 0);
--conn.outstandings.dsrCount;
}
if (pkt.associatedEvent) { if (pkt.associatedEvent) {
CHECK(conn.outstandings.clonedPacketCount[pnSpace]); CHECK(conn.outstandings.clonedPacketCount[pnSpace]);
--conn.outstandings.clonedPacketCount[pnSpace]; --conn.outstandings.clonedPacketCount[pnSpace];

View File

@@ -48,6 +48,7 @@ void processAckFrame(
// acks which leads to different number of packets being acked usually. // acks which leads to different number of packets being acked usually.
ack.ackedPackets.reserve(kDefaultRxPacketsBeforeAckAfterInit); ack.ackedPackets.reserve(kDefaultRxPacketsBeforeAckAfterInit);
auto currentPacketIt = getLastOutstandingPacketIncludingLost(conn, pnSpace); auto currentPacketIt = getLastOutstandingPacketIncludingLost(conn, pnSpace);
uint64_t dsrPacketsAcked = 0;
folly::Optional<decltype(conn.lossState.lastAckedPacketSentTime)> folly::Optional<decltype(conn.lossState.lastAckedPacketSentTime)>
lastAckedPacketSentTime; lastAckedPacketSentTime;
folly::Optional<Observer::SpuriousLossEvent> spuriousLossEvent; folly::Optional<Observer::SpuriousLossEvent> spuriousLossEvent;
@@ -139,6 +140,9 @@ void processAckFrame(
CHECK(conn.outstandings.clonedPacketCount[currentPacketNumberSpace]); CHECK(conn.outstandings.clonedPacketCount[currentPacketNumberSpace]);
--conn.outstandings.clonedPacketCount[currentPacketNumberSpace]; --conn.outstandings.clonedPacketCount[currentPacketNumberSpace];
} }
if (rPacketIt->isDSRPacket) {
++dsrPacketsAcked;
}
// Update RTT if current packet is the largestAcked in the frame: // Update RTT if current packet is the largestAcked in the frame:
auto ackReceiveTimeOrNow = ackReceiveTime > rPacketIt->metadata.time auto ackReceiveTimeOrNow = ackReceiveTime > rPacketIt->metadata.time
? ackReceiveTime ? ackReceiveTime
@@ -229,6 +233,8 @@ void processAckFrame(
if (lastAckedPacketSentTime) { if (lastAckedPacketSentTime) {
conn.lossState.lastAckedPacketSentTime = *lastAckedPacketSentTime; conn.lossState.lastAckedPacketSentTime = *lastAckedPacketSentTime;
} }
CHECK_GE(conn.outstandings.dsrCount, dsrPacketsAcked);
conn.outstandings.dsrCount -= dsrPacketsAcked;
CHECK_GE( CHECK_GE(
conn.outstandings.packets.size(), conn.outstandings.declaredLostCount); conn.outstandings.packets.size(), conn.outstandings.declaredLostCount);
auto updatedOustandingPacketsCount = conn.outstandings.numOutstanding(); auto updatedOustandingPacketsCount = conn.outstandings.numOutstanding();

View File

@@ -127,6 +127,10 @@ struct OutstandingsInfo {
// Number of packets currently declared lost. // Number of packets currently declared lost.
uint64_t declaredLostCount{0}; uint64_t declaredLostCount{0};
// Number of outstanding inflight DSR packet. That is, when a DSR packet is
// declared lost, this counter will be decreased.
uint64_t dsrCount{0};
// Number of packets outstanding and not declared lost. // Number of packets outstanding and not declared lost.
uint64_t numOutstanding() { uint64_t numOutstanding() {
return packets.size() - declaredLostCount; return packets.size() - declaredLostCount;