Log min sequence number changes. (#3331)

Seeing some negative loss count (seems to be when interacting with
Firefox, but don't have definitive proof it does not happen with
others). Debug logging a bit to understand what could cause it.

Also, consolidating some common code to process packet feedback.
This commit is contained in:
Raja Subramanian
2025-01-14 15:30:11 +05:30
committed by GitHub
parent fc009fc707
commit 8e90ae03f5
2 changed files with 39 additions and 30 deletions
+20 -30
View File
@@ -627,6 +627,7 @@ func (c *congestionDetector) HandleTWCCFeedback(report *rtcp.TransportLayerCC) {
// try an older group
for idx := len(c.packetGroups) - 2; idx >= 0; idx-- {
opg := c.packetGroups[idx]
c.params.Logger.Debugw("send side bwe: trying older group", "packetInfo", pi, "packetGroup", opg)
if err := opg.Add(pi, sendDelta, recvDelta, isLost); err == nil {
return
} else if err == errGroupFinalized {
@@ -650,6 +651,23 @@ func (c *congestionDetector) HandleTWCCFeedback(report *rtcp.TransportLayerCC) {
sequenceNumber := report.BaseSequenceNumber
endSequenceNumberExclusive := sequenceNumber + report.PacketStatusCount
deltaIdx := 0
processSymbol := func(symbol uint16) {
recvTime := int64(0)
isLost := false
if symbol != rtcp.TypeTCCPacketNotReceived {
recvRefTime += report.RecvDeltas[deltaIdx].Delta
deltaIdx++
recvTime = recvRefTime
} else {
isLost = true
}
pi, sendDelta, recvDelta := c.packetTracker.RecordPacketIndicationFromRemote(sequenceNumber, recvTime)
if pi.sendTime != 0 {
trackPacketGroup(&pi, sendDelta, recvDelta, isLost)
}
sequenceNumber++
}
for _, chunk := range report.PacketChunks {
if sequenceNumber == endSequenceNumberExclusive {
break
@@ -662,21 +680,7 @@ func (c *congestionDetector) HandleTWCCFeedback(report *rtcp.TransportLayerCC) {
break
}
recvTime := int64(0)
isLost := false
if chunk.PacketStatusSymbol != rtcp.TypeTCCPacketNotReceived {
recvRefTime += report.RecvDeltas[deltaIdx].Delta
deltaIdx++
recvTime = recvRefTime
} else {
isLost = true
}
pi, sendDelta, recvDelta := c.packetTracker.RecordPacketIndicationFromRemote(sequenceNumber, recvTime)
if pi.sendTime != 0 {
trackPacketGroup(&pi, sendDelta, recvDelta, isLost)
}
sequenceNumber++
processSymbol(chunk.PacketStatusSymbol)
}
case *rtcp.StatusVectorChunk:
@@ -685,21 +689,7 @@ func (c *congestionDetector) HandleTWCCFeedback(report *rtcp.TransportLayerCC) {
break
}
recvTime := int64(0)
isLost := false
if symbol != rtcp.TypeTCCPacketNotReceived {
recvRefTime += report.RecvDeltas[deltaIdx].Delta
deltaIdx++
recvTime = recvRefTime
} else {
isLost = true
}
pi, sendDelta, recvDelta := c.packetTracker.RecordPacketIndicationFromRemote(sequenceNumber, recvTime)
if pi.sendTime != 0 {
trackPacketGroup(&pi, sendDelta, recvDelta, isLost)
}
sequenceNumber++
processSymbol(symbol)
}
}
}
+19
View File
@@ -167,6 +167,13 @@ func (p *packetGroup) Add(pi *packetInfo, sendDelta, recvDelta int64, isLost boo
}
if p.minSequenceNumber == 0 || pi.sequenceNumber < p.minSequenceNumber {
if p.minSequenceNumber != 0 {
p.params.Logger.Debugw(
"send side bwe, out-of-order min sequence number",
"packetInfo", pi,
"packetGroup", p,
)
}
p.minSequenceNumber = pi.sequenceNumber
}
p.maxSequenceNumber = max(p.maxSequenceNumber, pi.sequenceNumber)
@@ -184,6 +191,11 @@ func (p *packetGroup) Add(pi *packetInfo, sendDelta, recvDelta int64, isLost boo
p.acked.add(int(pi.size), pi.isRTX, pi.isProbe)
if p.snBitmap.IsSet(pi.sequenceNumber - p.minSequenceNumber) {
// an earlier packet reported as lost has been received
p.params.Logger.Debugw(
"send side bwe, received previously lost packet",
"packetInfo", pi,
"packetGroup", p,
)
p.snBitmap.Clear(pi.sequenceNumber - p.minSequenceNumber)
p.lost.remove(int(pi.size), pi.isRTX, pi.isProbe)
}
@@ -213,6 +225,13 @@ func (p *packetGroup) lostPacket(pi *packetInfo) error {
}
if p.minSequenceNumber == 0 || pi.sequenceNumber < p.minSequenceNumber {
if p.minSequenceNumber != 0 {
p.params.Logger.Debugw(
"send side bwe, out-of-order min sequence number lost",
"packetInfo", pi,
"packetGroup", p,
)
}
p.minSequenceNumber = pi.sequenceNumber
}
p.maxSequenceNumber = max(p.maxSequenceNumber, pi.sequenceNumber)