mirror of
https://github.com/livekit/livekit.git
synced 2026-07-28 22:59:33 +00:00
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:
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user