Skip to content

Commit e187410

Browse files
sterlingdengsterlingdeng
authored andcommitted
Fixes bug in gcc: group accumulator
This fixes issue #274.
1 parent b820cd3 commit e187410

File tree

4 files changed

+130
-16
lines changed

4 files changed

+130
-16
lines changed

pkg/gcc/arrival_group.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,17 @@ type arrivalGroup struct {
1616
arrival time.Time
1717
}
1818

19+
func newArrivalGroup(a cc.Acknowledgment) arrivalGroup {
20+
return arrivalGroup{
21+
packets: []cc.Acknowledgment{a},
22+
departure: a.Departure,
23+
arrival: a.Arrival,
24+
}
25+
}
26+
1927
func (g *arrivalGroup) add(a cc.Acknowledgment) {
2028
g.packets = append(g.packets, a)
2129
g.arrival = a.Arrival
22-
g.departure = a.Departure
2330
}
2431

2532
func (g arrivalGroup) String() string {

pkg/gcc/arrival_group_accumulator.go

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ func (a *arrivalGroupAccumulator) run(in <-chan []cc.Acknowledgment, agWriter fu
2929
for acks := range in {
3030
for _, next := range acks {
3131
if !init {
32-
group.add(next)
32+
group = newArrivalGroup(next)
3333
init = true
3434
continue
3535
}
@@ -38,36 +38,40 @@ func (a *arrivalGroupAccumulator) run(in <-chan []cc.Acknowledgment, agWriter fu
3838
continue
3939
}
4040
if next.Departure.After(group.departure) {
41+
// A sequence of packets which are sent within a burst_time interval
42+
// constitute a group.
4143
if interDepartureTimePkt(group, next) <= a.interDepartureThreshold {
4244
group.add(next)
4345
continue
4446
}
4547

48+
// A Packet which has an inter-arrival time less than burst_time and
49+
// an inter-group delay variation d(i) less than 0 is considered
50+
// being part of the current group of packets.
4651
if interArrivalTimePkt(group, next) <= a.interArrivalThreshold &&
4752
interGroupDelayVariationPkt(group, next) < a.interGroupDelayVariationTreshold {
4853
group.add(next)
4954
continue
5055
}
5156

5257
agWriter(group)
53-
group = arrivalGroup{}
54-
group.add(next)
58+
group = newArrivalGroup(next)
5559
}
5660
}
5761
}
5862
}
5963

60-
func interArrivalTimePkt(a arrivalGroup, b cc.Acknowledgment) time.Duration {
61-
return b.Arrival.Sub(a.arrival)
64+
func interArrivalTimePkt(group arrivalGroup, ack cc.Acknowledgment) time.Duration {
65+
return ack.Arrival.Sub(group.arrival)
6266
}
6367

64-
func interDepartureTimePkt(a arrivalGroup, b cc.Acknowledgment) time.Duration {
65-
if len(a.packets) == 0 {
68+
func interDepartureTimePkt(group arrivalGroup, ack cc.Acknowledgment) time.Duration {
69+
if len(group.packets) == 0 {
6670
return 0
6771
}
68-
return b.Departure.Sub(a.packets[len(a.packets)-1].Departure)
72+
return ack.Departure.Sub(group.departure)
6973
}
7074

71-
func interGroupDelayVariationPkt(a arrivalGroup, b cc.Acknowledgment) time.Duration {
72-
return b.Arrival.Sub(a.arrival) - b.Departure.Sub(a.departure)
75+
func interGroupDelayVariationPkt(group arrivalGroup, ack cc.Acknowledgment) time.Duration {
76+
return ack.Arrival.Sub(group.arrival) - ack.Departure.Sub(group.departure)
7377
}

pkg/gcc/arrival_group_accumulator_test.go

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ func TestArrivalGroupAccumulator(t *testing.T) {
7070
},
7171
},
7272
arrival: time.Time{}.Add(20 * time.Millisecond),
73-
departure: time.Time{}.Add(3 * time.Millisecond),
73+
departure: time.Time{},
7474
}},
7575
},
7676
{
@@ -102,7 +102,7 @@ func TestArrivalGroupAccumulator(t *testing.T) {
102102
},
103103
},
104104
arrival: time.Time{}.Add(20 * time.Millisecond),
105-
departure: time.Time{}.Add(3 * time.Millisecond),
105+
departure: time.Time{}.Add(0 * time.Millisecond),
106106
},
107107
{
108108
packets: []cc.Acknowledgment{
@@ -156,6 +156,66 @@ func TestArrivalGroupAccumulator(t *testing.T) {
156156
},
157157
},
158158
},
159+
{
160+
name: "newGroupBecauseOfInterDepartureTime",
161+
log: []cc.Acknowledgment{
162+
{
163+
SequenceNumber: 0,
164+
Departure: time.Time{},
165+
Arrival: time.Time{}.Add(4 * time.Millisecond),
166+
},
167+
{
168+
SequenceNumber: 1,
169+
Departure: time.Time{}.Add(3 * time.Millisecond),
170+
Arrival: time.Time{}.Add(4 * time.Millisecond),
171+
},
172+
{
173+
SequenceNumber: 2,
174+
Departure: time.Time{}.Add(6 * time.Millisecond),
175+
Arrival: time.Time{}.Add(10 * time.Millisecond),
176+
},
177+
{
178+
SequenceNumber: 3,
179+
Departure: time.Time{}.Add(9 * time.Millisecond),
180+
Arrival: time.Time{}.Add(10 * time.Millisecond),
181+
},
182+
triggerNewGroupElement,
183+
},
184+
exp: []arrivalGroup{
185+
{
186+
packets: []cc.Acknowledgment{
187+
{
188+
SequenceNumber: 0,
189+
Departure: time.Time{},
190+
Arrival: time.Time{}.Add(4 * time.Millisecond),
191+
},
192+
{
193+
SequenceNumber: 1,
194+
Departure: time.Time{}.Add(3 * time.Millisecond),
195+
Arrival: time.Time{}.Add(4 * time.Millisecond),
196+
},
197+
},
198+
departure: time.Time{},
199+
arrival: time.Time{}.Add(4 * time.Millisecond),
200+
},
201+
{
202+
packets: []cc.Acknowledgment{
203+
{
204+
SequenceNumber: 2,
205+
Departure: time.Time{}.Add(6 * time.Millisecond),
206+
Arrival: time.Time{}.Add(10 * time.Millisecond),
207+
},
208+
{
209+
SequenceNumber: 3,
210+
Departure: time.Time{}.Add(9 * time.Millisecond),
211+
Arrival: time.Time{}.Add(10 * time.Millisecond),
212+
},
213+
},
214+
departure: time.Time{}.Add(6 * time.Millisecond),
215+
arrival: time.Time{}.Add(10 * time.Millisecond),
216+
},
217+
},
218+
},
159219
}
160220

161221
for _, tc := range cases {

pkg/gcc/arrival_group_test.go

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,46 @@ func TestArrivalGroup(t *testing.T) {
7171
Arrival: time.Time{}.Add(time.Second),
7272
}},
7373
arrival: time.Time{}.Add(time.Second),
74-
departure: time.Time{}.Add(time.Second),
74+
departure: time.Time{},
75+
},
76+
},
77+
{
78+
name: "departure time of group is the departure time of the first packet in the group",
79+
acks: []cc.Acknowledgment{{
80+
SequenceNumber: 0,
81+
Size: 0,
82+
Departure: time.Time{}.Add(27 * time.Millisecond),
83+
Arrival: time.Time{},
84+
}, {
85+
SequenceNumber: 1,
86+
Size: 1,
87+
Departure: time.Time{}.Add(32 * time.Millisecond),
88+
Arrival: time.Time{}.Add(37 * time.Millisecond),
89+
}, {
90+
SequenceNumber: 2,
91+
Size: 2,
92+
Departure: time.Time{}.Add(50 * time.Millisecond),
93+
Arrival: time.Time{}.Add(56 * time.Millisecond),
94+
}},
95+
expected: arrivalGroup{
96+
packets: []cc.Acknowledgment{{
97+
SequenceNumber: 0,
98+
Size: 0,
99+
Departure: time.Time{}.Add(27 * time.Millisecond),
100+
Arrival: time.Time{},
101+
}, {
102+
SequenceNumber: 1,
103+
Size: 1,
104+
Departure: time.Time{}.Add(32 * time.Millisecond),
105+
Arrival: time.Time{}.Add(37 * time.Millisecond),
106+
}, {
107+
SequenceNumber: 2,
108+
Size: 2,
109+
Departure: time.Time{}.Add(50 * time.Millisecond),
110+
Arrival: time.Time{}.Add(56 * time.Millisecond),
111+
}},
112+
arrival: time.Time{}.Add(56 * time.Millisecond),
113+
departure: time.Time{}.Add(27 * time.Millisecond),
75114
},
76115
},
77116
}
@@ -80,8 +119,12 @@ func TestArrivalGroup(t *testing.T) {
80119
tc := tc
81120
t.Run(tc.name, func(t *testing.T) {
82121
ag := arrivalGroup{}
83-
for _, ack := range tc.acks {
84-
ag.add(ack)
122+
for i, ack := range tc.acks {
123+
if i == 0 {
124+
ag = newArrivalGroup(ack)
125+
} else {
126+
ag.add(ack)
127+
}
85128
}
86129
assert.Equal(t, tc.expected, ag)
87130
})

0 commit comments

Comments
 (0)