only delete a Packet from history in SentPacketHandler once it has been ACKed

This commit is contained in:
Marten Seemann
2016-04-27 17:19:54 +07:00
parent 2c95141ee1
commit 2056960e07
3 changed files with 11 additions and 14 deletions

View File

@@ -13,4 +13,5 @@ type Packet struct {
Entropy EntropyAccumulator Entropy EntropyAccumulator
MissingReports uint8 MissingReports uint8
Retransmitted bool // has this Packet ever been retransmitted
} }

View File

@@ -50,6 +50,12 @@ func (h *sentPacketHandler) nackPacket(packetNumber protocol.PacketNumber) error
return ErrMapAccess return ErrMapAccess
} }
// if the packet has already been retransmit, do nothing
// we're probably only receiving another NACK for this packet because the retransmission has not yet arrived at the client
if packet.Retransmitted {
return nil
}
packet.MissingReports++ packet.MissingReports++
if packet.MissingReports > retransmissionThreshold { if packet.MissingReports > retransmissionThreshold {
@@ -58,20 +64,9 @@ func (h *sentPacketHandler) nackPacket(packetNumber protocol.PacketNumber) error
return nil return nil
} }
func (h *sentPacketHandler) recalculateHighestInOrderAckedPacketNumberFromPacketHistory() {
for i := h.highestInOrderAckedPacketNumber; i <= h.lastSentPacketNumber; i++ {
_, ok := h.packetHistory[i]
if ok {
break
}
h.highestInOrderAckedPacketNumber = i
}
}
func (h *sentPacketHandler) queuePacketForRetransmission(packet *Packet) { func (h *sentPacketHandler) queuePacketForRetransmission(packet *Packet) {
h.retransmissionQueue = append(h.retransmissionQueue, packet) h.retransmissionQueue = append(h.retransmissionQueue, packet)
h.ackPacket(packet.PacketNumber) packet.Retransmitted = true
h.recalculateHighestInOrderAckedPacketNumberFromPacketHistory()
} }
func (h *sentPacketHandler) SentPacket(packet *Packet) error { func (h *sentPacketHandler) SentPacket(packet *Packet) error {

View File

@@ -340,15 +340,16 @@ var _ = Describe("SentPacketHandler", func() {
Expect(handler.DequeuePacketForRetransmission()).To(BeNil()) Expect(handler.DequeuePacketForRetransmission()).To(BeNil())
}) })
It("recalculates the highestInOrderAckedPacketNumber after queueing a retransmission", func() { It("does not change the highestInOrderAckedPacketNumber after queueing a retransmission", func() {
ack := frames.AckFrame{ ack := frames.AckFrame{
LargestObserved: 4, LargestObserved: 4,
NackRanges: []frames.NackRange{frames.NackRange{FirstPacketNumber: 3, LastPacketNumber: 3}}, NackRanges: []frames.NackRange{frames.NackRange{FirstPacketNumber: 3, LastPacketNumber: 3}},
} }
err := handler.ReceivedAck(&ack) err := handler.ReceivedAck(&ack)
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(handler.highestInOrderAckedPacketNumber).To(Equal(protocol.PacketNumber(2)))
handler.nackPacket(3) // this is the second NACK for this packet handler.nackPacket(3) // this is the second NACK for this packet
Expect(handler.highestInOrderAckedPacketNumber).To(Equal(protocol.PacketNumber(4))) Expect(handler.highestInOrderAckedPacketNumber).To(Equal(protocol.PacketNumber(2)))
}) })
}) })
}) })