mirror of
https://github.com/livekit/livekit.git
synced 2026-10-23 10:52:46 +00:00
Decrement value when end is in open range. (#2072)
* Decrement value when end is in open range. Not an error when end is in open range. * change API call
This commit is contained in:
1 parent
69177b8b6e
commit
7ac0abdf1b
3 files changed
+39
-17
No files matched your search
@@ -297,9 +297,7 @@ func (r *RTPMunger) UpdateAndGetPaddingSnTs(num int, clockRate uint32, frameRate
|
||||
|
||||
r.extSecondLastSN = extLastSN - 1
|
||||
r.extLastSN = extLastSN
|
||||
if err := r.snRangeMap.CloseRangeAndDecValue(r.extHighestIncomingSN, uint64(num)); err != nil {
|
||||
r.logger.Errorw("could not close range", err, "sn", r.extHighestIncomingSN)
|
||||
}
|
||||
r.snRangeMap.DecValue(r.extHighestIncomingSN, uint64(num))
|
||||
r.updateSnOffset("pad")
|
||||
|
||||
r.tsOffset -= extLastTS - r.extLastTS
|
||||
|
||||
@@ -16,6 +16,7 @@ package utils
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"math"
|
||||
"unsafe"
|
||||
)
|
||||
@@ -66,13 +67,15 @@ func (r *RangeMap[RT, VT]) ClearAndResetValue(val VT) {
|
||||
r.initRanges(val)
|
||||
}
|
||||
|
||||
func (r *RangeMap[RT, VT]) CloseRangeAndDecValue(end RT, dec VT) error {
|
||||
// close open range
|
||||
func (r *RangeMap[RT, VT]) DecValue(end RT, dec VT) {
|
||||
lr := &r.ranges[len(r.ranges)-1]
|
||||
if lr.start > end {
|
||||
// start of open range is after given end
|
||||
return errReversedOrder
|
||||
// modify existing value if end is in open range
|
||||
lr.value -= dec
|
||||
return
|
||||
}
|
||||
|
||||
// close open range
|
||||
lr.end = end
|
||||
|
||||
// start a new open one with decremented value
|
||||
@@ -82,7 +85,6 @@ func (r *RangeMap[RT, VT]) CloseRangeAndDecValue(end RT, dec VT) error {
|
||||
value: lr.value - dec,
|
||||
})
|
||||
r.prune()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *RangeMap[RT, VT]) initRanges(val VT) {
|
||||
@@ -97,13 +99,13 @@ func (r *RangeMap[RT, VT]) initRanges(val VT) {
|
||||
|
||||
func (r *RangeMap[RT, VT]) ExcludeRange(startInclusive RT, endExclusive RT) error {
|
||||
if endExclusive == startInclusive || endExclusive-startInclusive > r.halfRange {
|
||||
return errReversedOrder
|
||||
return fmt.Errorf("%w, start %d, end %d", errReversedOrder, startInclusive, endExclusive)
|
||||
}
|
||||
|
||||
lr := &r.ranges[len(r.ranges)-1]
|
||||
if lr.start > startInclusive {
|
||||
// start of open range is after start of exclusion range, cannot close the open range
|
||||
return errReversedOrder
|
||||
return fmt.Errorf("%w, existingStart %d, newStart %d", errReversedOrder, lr.start, startInclusive)
|
||||
}
|
||||
|
||||
newValue := lr.value + VT(endExclusive-startInclusive)
|
||||
|
||||
@@ -234,8 +234,7 @@ func TestRangeMapUint32(t *testing.T) {
|
||||
require.Equal(t, uint32(23), value)
|
||||
|
||||
// decrement value and ensure that any key returns that value
|
||||
err = r.CloseRangeAndDecValue(34, 12)
|
||||
require.NoError(t, err)
|
||||
r.DecValue(34, 12)
|
||||
|
||||
expectedRanges = []rangeVal[uint32, uint32]{
|
||||
{
|
||||
@@ -293,8 +292,7 @@ func TestRangeMapUint32(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, uint32(16), value)
|
||||
|
||||
err = r.CloseRangeAndDecValue(66, 6)
|
||||
require.NoError(t, err)
|
||||
r.DecValue(66, 6)
|
||||
|
||||
expectedRanges = []rangeVal[uint32, uint32]{
|
||||
{
|
||||
@@ -315,9 +313,6 @@ func TestRangeMapUint32(t *testing.T) {
|
||||
}
|
||||
require.Equal(t, expectedRanges, r.ranges)
|
||||
|
||||
err = r.CloseRangeAndDecValue(66, 6)
|
||||
require.ErrorIs(t, err, errReversedOrder)
|
||||
|
||||
// aged out range access
|
||||
value, err = r.GetValue(5)
|
||||
require.ErrorIs(t, err, errKeyTooOld)
|
||||
@@ -331,4 +326,31 @@ func TestRangeMapUint32(t *testing.T) {
|
||||
value, err = r.GetValue(67)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, uint32(10), value)
|
||||
|
||||
// decrement with old end and check that open range gets decremented
|
||||
r.DecValue(66, 6)
|
||||
|
||||
expectedRanges = []rangeVal[uint32, uint32]{
|
||||
{
|
||||
start: 35,
|
||||
end: 39,
|
||||
value: 11,
|
||||
},
|
||||
{
|
||||
start: 45,
|
||||
end: 66,
|
||||
value: 16,
|
||||
},
|
||||
{
|
||||
start: 67,
|
||||
end: 0,
|
||||
value: 4,
|
||||
},
|
||||
}
|
||||
require.Equal(t, expectedRanges, r.ranges)
|
||||
|
||||
// open range access should get decremented value
|
||||
value, err = r.GetValue(67)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, uint32(4), value)
|
||||
}
|
||||
Reference in new issue
Block a user