Skip to content

Commit 53b1cbb

Browse files
Merge pull request #3010 from lucas-clemente/allow-acks-when-pacing-limited
allow sending of ACKs when pacing limited
2 parents e1b609c + 2c2b758 commit 53b1cbb

File tree

2 files changed

+34
-12
lines changed

2 files changed

+34
-12
lines changed

session.go

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1513,7 +1513,22 @@ func (s *session) sendPackets() error {
15131513

15141514
var sentPacket bool // only used in for packets sent in send mode SendAny
15151515
for {
1516-
switch sendMode := s.sentPacketHandler.SendMode(); sendMode {
1516+
sendMode := s.sentPacketHandler.SendMode()
1517+
if sendMode == ackhandler.SendAny && s.handshakeComplete && !s.sentPacketHandler.HasPacingBudget() {
1518+
deadline := s.sentPacketHandler.TimeUntilSend()
1519+
if deadline.IsZero() {
1520+
deadline = deadlineSendImmediately
1521+
}
1522+
s.pacingDeadline = deadline
1523+
// Allow sending of an ACK if we're pacing limit (if we haven't sent out a packet yet).
1524+
// This makes sure that a peer that is mostly receiving data (and thus has an inaccurate cwnd estimate)
1525+
// sends enough ACKs to allow its peer to utilize the bandwidth.
1526+
if sentPacket {
1527+
return nil
1528+
}
1529+
sendMode = ackhandler.SendAck
1530+
}
1531+
switch sendMode {
15171532
case ackhandler.SendNone:
15181533
return nil
15191534
case ackhandler.SendAck:
@@ -1540,14 +1555,6 @@ func (s *session) sendPackets() error {
15401555
return err
15411556
}
15421557
case ackhandler.SendAny:
1543-
if s.handshakeComplete && !s.sentPacketHandler.HasPacingBudget() {
1544-
deadline := s.sentPacketHandler.TimeUntilSend()
1545-
if deadline.IsZero() {
1546-
deadline = deadlineSendImmediately
1547-
}
1548-
s.pacingDeadline = deadline
1549-
return nil
1550-
}
15511558
sent, err := s.sendPacket()
15521559
if err != nil || !sent {
15531560
return err

session_test.go

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1446,10 +1446,8 @@ var _ = Describe("Session", func() {
14461446

14471447
It("sends multiple packets, when the pacer allows immediate sending", func() {
14481448
sph.EXPECT().SentPacket(gomock.Any())
1449-
sph.EXPECT().HasPacingBudget()
14501449
sph.EXPECT().HasPacingBudget().Return(true).AnyTimes()
1451-
sph.EXPECT().TimeUntilSend() // return the zero value of time.Time{}
1452-
sph.EXPECT().SendMode().Return(ackhandler.SendAny).Times(3)
1450+
sph.EXPECT().SendMode().Return(ackhandler.SendAny).Times(2)
14531451
packer.EXPECT().PackPacket().Return(getPacket(10), nil)
14541452
packer.EXPECT().PackPacket().Return(nil, nil)
14551453
sender.EXPECT().WouldBlock().AnyTimes()
@@ -1463,6 +1461,23 @@ var _ = Describe("Session", func() {
14631461
time.Sleep(50 * time.Millisecond) // make sure that only 1 packet is sent
14641462
})
14651463

1464+
It("allows an ACK to be sent when pacing limited", func() {
1465+
sph.EXPECT().SentPacket(gomock.Any())
1466+
sph.EXPECT().HasPacingBudget()
1467+
sph.EXPECT().TimeUntilSend().Return(time.Now().Add(time.Hour))
1468+
sph.EXPECT().SendMode().Return(ackhandler.SendAny)
1469+
packer.EXPECT().MaybePackAckPacket(gomock.Any()).Return(getPacket(10), nil)
1470+
sender.EXPECT().WouldBlock().AnyTimes()
1471+
sender.EXPECT().Send(gomock.Any())
1472+
go func() {
1473+
defer GinkgoRecover()
1474+
cryptoSetup.EXPECT().RunHandshake().MaxTimes(1)
1475+
sess.run()
1476+
}()
1477+
sess.scheduleSending()
1478+
time.Sleep(50 * time.Millisecond) // make sure that only 1 packet is sent
1479+
})
1480+
14661481
// when becoming congestion limited, at some point the SendMode will change from SendAny to SendAck
14671482
// we shouldn't send the ACK in the same run
14681483
It("doesn't send an ACK right after becoming congestion limited", func() {

0 commit comments

Comments
 (0)