Skip to content

Commit 101c527

Browse files
committed
Refactor GCC
1 parent 1072695 commit 101c527

21 files changed

+1602
-1
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/pion/interceptor
22

3-
go 1.20
3+
go 1.21
44

55
require (
66
github.com/pion/logging v0.2.3

pkg/bwe/acknowledgment.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package bwe
2+
3+
import (
4+
"fmt"
5+
"time"
6+
)
7+
8+
type ECN uint8
9+
10+
const (
11+
//nolint:misspell
12+
// ECNNonECT signals Non ECN-Capable Transport, Non-ECT
13+
ECNNonECT ECN = iota // 00
14+
15+
//nolint:misspell
16+
// ECNECT1 signals ECN Capable Transport, ECT(0)
17+
ECNECT1 // 01
18+
19+
//nolint:misspell
20+
// ECNECT0 signals ECN Capable Transport, ECT(1)
21+
ECNECT0 // 10
22+
23+
// ECNCE signals ECN Congestion Encountered, CE
24+
ECNCE // 11
25+
)
26+
27+
type Acknowledgment struct {
28+
SeqNr int64
29+
Size uint16
30+
Departure time.Time
31+
Arrived bool
32+
Arrival time.Time
33+
ECN ECN
34+
}
35+
36+
func (a Acknowledgment) String() string {
37+
return fmt.Sprintf("seq=%v, departure=%v, arrival=%v", a.SeqNr, a.Departure, a.Arrival)
38+
}

pkg/bwe/arrival_group_accumulator.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package bwe
2+
3+
import (
4+
"time"
5+
)
6+
7+
type arrivalGroup []Acknowledgment
8+
9+
type arrivalGroupAccumulator struct {
10+
next arrivalGroup
11+
burstInterval time.Duration
12+
maxBurstDuration time.Duration
13+
}
14+
15+
func newArrivalGroupAccumulator() *arrivalGroupAccumulator {
16+
return &arrivalGroupAccumulator{
17+
next: make([]Acknowledgment, 0),
18+
burstInterval: 5 * time.Millisecond,
19+
maxBurstDuration: 100 * time.Millisecond,
20+
}
21+
}
22+
23+
func (a *arrivalGroupAccumulator) onPacketAcked(ack Acknowledgment) arrivalGroup {
24+
if len(a.next) == 0 {
25+
a.next = append(a.next, ack)
26+
return nil
27+
}
28+
29+
if ack.Departure.Sub(a.next[0].Departure) < a.burstInterval {
30+
a.next = append(a.next, ack)
31+
return nil
32+
}
33+
34+
sendTimeDelta := ack.Departure.Sub(a.next[0].Departure)
35+
arrivalTimeDeltaLast := ack.Arrival.Sub(a.next[len(a.next)-1].Arrival)
36+
arrivalTimeDeltaFirst := ack.Arrival.Sub(a.next[0].Arrival)
37+
propagationDelta := arrivalTimeDeltaFirst - sendTimeDelta
38+
39+
if propagationDelta < 0 && arrivalTimeDeltaLast <= a.burstInterval && arrivalTimeDeltaFirst < a.maxBurstDuration {
40+
a.next = append(a.next, ack)
41+
return nil
42+
}
43+
44+
group := make(arrivalGroup, len(a.next))
45+
copy(group, a.next)
46+
a.next = arrivalGroup{ack}
47+
return group
48+
}
Lines changed: 239 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,239 @@
1+
package bwe
2+
3+
import (
4+
"testing"
5+
"time"
6+
7+
"github.com/stretchr/testify/assert"
8+
)
9+
10+
func TestArrivalGroupAccumulator(t *testing.T) {
11+
triggerNewGroupElement := Acknowledgment{
12+
Departure: time.Time{}.Add(time.Second),
13+
Arrival: time.Time{}.Add(time.Second),
14+
}
15+
cases := []struct {
16+
name string
17+
log []Acknowledgment
18+
exp []arrivalGroup
19+
}{
20+
{
21+
name: "emptyCreatesNoGroups",
22+
log: []Acknowledgment{},
23+
exp: []arrivalGroup{},
24+
},
25+
{
26+
name: "createsSingleElementGroup",
27+
log: []Acknowledgment{
28+
{
29+
Departure: time.Time{},
30+
Arrival: time.Time{}.Add(time.Millisecond),
31+
},
32+
triggerNewGroupElement,
33+
},
34+
exp: []arrivalGroup{{
35+
{
36+
Departure: time.Time{},
37+
Arrival: time.Time{}.Add(time.Millisecond),
38+
},
39+
},
40+
},
41+
},
42+
{
43+
name: "createsTwoElementGroup",
44+
log: []Acknowledgment{
45+
{
46+
Arrival: time.Time{}.Add(15 * time.Millisecond),
47+
},
48+
{
49+
Departure: time.Time{}.Add(3 * time.Millisecond),
50+
Arrival: time.Time{}.Add(20 * time.Millisecond),
51+
},
52+
triggerNewGroupElement,
53+
},
54+
exp: []arrivalGroup{{
55+
{
56+
Departure: time.Time{},
57+
Arrival: time.Time{}.Add(15 * time.Millisecond),
58+
},
59+
{
60+
Departure: time.Time{}.Add(3 * time.Millisecond),
61+
Arrival: time.Time{}.Add(20 * time.Millisecond),
62+
},
63+
}},
64+
},
65+
{
66+
name: "createsTwoArrivalGroups1",
67+
log: []Acknowledgment{
68+
{
69+
Departure: time.Time{},
70+
Arrival: time.Time{}.Add(15 * time.Millisecond),
71+
},
72+
{
73+
Departure: time.Time{}.Add(3 * time.Millisecond),
74+
Arrival: time.Time{}.Add(20 * time.Millisecond),
75+
},
76+
{
77+
Departure: time.Time{}.Add(9 * time.Millisecond),
78+
Arrival: time.Time{}.Add(24 * time.Millisecond),
79+
},
80+
triggerNewGroupElement,
81+
},
82+
exp: []arrivalGroup{
83+
{
84+
{
85+
Arrival: time.Time{}.Add(15 * time.Millisecond),
86+
},
87+
{
88+
Departure: time.Time{}.Add(3 * time.Millisecond),
89+
Arrival: time.Time{}.Add(20 * time.Millisecond),
90+
},
91+
},
92+
{
93+
{
94+
Departure: time.Time{}.Add(9 * time.Millisecond),
95+
Arrival: time.Time{}.Add(24 * time.Millisecond),
96+
},
97+
},
98+
},
99+
},
100+
{
101+
name: "createsTwoArrivalGroups2",
102+
log: []Acknowledgment{
103+
{
104+
Departure: time.Time{},
105+
Arrival: time.Time{}.Add(15 * time.Millisecond),
106+
},
107+
{
108+
Departure: time.Time{}.Add(3 * time.Millisecond),
109+
Arrival: time.Time{}.Add(20 * time.Millisecond),
110+
},
111+
{
112+
Departure: time.Time{}.Add(9 * time.Millisecond),
113+
Arrival: time.Time{}.Add(30 * time.Millisecond),
114+
},
115+
triggerNewGroupElement,
116+
},
117+
exp: []arrivalGroup{
118+
{
119+
{
120+
Arrival: time.Time{}.Add(15 * time.Millisecond),
121+
},
122+
{
123+
Departure: time.Time{}.Add(3 * time.Millisecond),
124+
Arrival: time.Time{}.Add(20 * time.Millisecond),
125+
},
126+
},
127+
{
128+
{
129+
Departure: time.Time{}.Add(9 * time.Millisecond),
130+
Arrival: time.Time{}.Add(30 * time.Millisecond),
131+
},
132+
},
133+
},
134+
},
135+
{
136+
name: "ignoresOutOfOrderPackets",
137+
log: []Acknowledgment{
138+
{
139+
Departure: time.Time{},
140+
Arrival: time.Time{}.Add(15 * time.Millisecond),
141+
},
142+
{
143+
Departure: time.Time{}.Add(6 * time.Millisecond),
144+
Arrival: time.Time{}.Add(34 * time.Millisecond),
145+
},
146+
{
147+
Departure: time.Time{}.Add(8 * time.Millisecond),
148+
Arrival: time.Time{}.Add(30 * time.Millisecond),
149+
},
150+
triggerNewGroupElement,
151+
},
152+
exp: []arrivalGroup{
153+
{
154+
{
155+
Departure: time.Time{},
156+
Arrival: time.Time{}.Add(15 * time.Millisecond),
157+
},
158+
},
159+
{
160+
{
161+
Departure: time.Time{}.Add(6 * time.Millisecond),
162+
Arrival: time.Time{}.Add(34 * time.Millisecond),
163+
},
164+
{
165+
Departure: time.Time{}.Add(8 * time.Millisecond),
166+
Arrival: time.Time{}.Add(30 * time.Millisecond),
167+
},
168+
},
169+
},
170+
},
171+
{
172+
name: "newGroupBecauseOfInterDepartureTime",
173+
log: []Acknowledgment{
174+
{
175+
SeqNr: 0,
176+
Departure: time.Time{},
177+
Arrival: time.Time{}.Add(4 * time.Millisecond),
178+
},
179+
{
180+
SeqNr: 1,
181+
Departure: time.Time{}.Add(3 * time.Millisecond),
182+
Arrival: time.Time{}.Add(4 * time.Millisecond),
183+
},
184+
{
185+
SeqNr: 2,
186+
Departure: time.Time{}.Add(6 * time.Millisecond),
187+
Arrival: time.Time{}.Add(10 * time.Millisecond),
188+
},
189+
{
190+
SeqNr: 3,
191+
Departure: time.Time{}.Add(9 * time.Millisecond),
192+
Arrival: time.Time{}.Add(10 * time.Millisecond),
193+
},
194+
triggerNewGroupElement,
195+
},
196+
exp: []arrivalGroup{
197+
{
198+
{
199+
SeqNr: 0,
200+
Departure: time.Time{},
201+
Arrival: time.Time{}.Add(4 * time.Millisecond),
202+
},
203+
{
204+
SeqNr: 1,
205+
Departure: time.Time{}.Add(3 * time.Millisecond),
206+
Arrival: time.Time{}.Add(4 * time.Millisecond),
207+
},
208+
},
209+
{
210+
{
211+
SeqNr: 2,
212+
Departure: time.Time{}.Add(6 * time.Millisecond),
213+
Arrival: time.Time{}.Add(10 * time.Millisecond),
214+
},
215+
{
216+
SeqNr: 3,
217+
Departure: time.Time{}.Add(9 * time.Millisecond),
218+
Arrival: time.Time{}.Add(10 * time.Millisecond),
219+
},
220+
},
221+
},
222+
},
223+
}
224+
225+
for _, tc := range cases {
226+
tc := tc
227+
t.Run(tc.name, func(t *testing.T) {
228+
aga := newArrivalGroupAccumulator()
229+
received := []arrivalGroup{}
230+
for _, ack := range tc.log {
231+
next := aga.onPacketAcked(ack)
232+
if next != nil {
233+
received = append(received, next)
234+
}
235+
}
236+
assert.Equal(t, tc.exp, received)
237+
})
238+
}
239+
}

0 commit comments

Comments
 (0)