remove LargestInOrderAcked from v34 ackhandler

possibly: fix #283, fix #291
This commit is contained in:
Lucas Clemente
2016-08-16 15:57:32 +02:00
parent f0f500a218
commit baaf7027ae
2 changed files with 21 additions and 119 deletions

View File

@@ -30,7 +30,6 @@ type sentPacketHandler struct {
lastSentPacketTime time.Time
skippedPackets []protocol.PacketNumber
LargestInOrderAcked protocol.PacketNumber
LargestAcked protocol.PacketNumber
largestReceivedPacketWithAck protocol.PacketNumber
@@ -68,17 +67,7 @@ func NewSentPacketHandler() SentPacketHandler {
func (h *sentPacketHandler) ackPacket(packetElement *ackhandlerlegacy.PacketElement) {
packet := &packetElement.Value
h.bytesInFlight -= packet.Length
if h.LargestInOrderAcked == packet.PacketNumber-1 {
h.LargestInOrderAcked++
if next := packetElement.Next(); next != nil {
h.LargestInOrderAcked = next.Value.PacketNumber - 1
}
}
h.packetHistory.Remove(packetElement)
}
@@ -103,17 +92,6 @@ func (h *sentPacketHandler) queuePacketForRetransmission(packetElement *ackhandl
h.bytesInFlight -= packet.Length
h.retransmissionQueue = append(h.retransmissionQueue, packet)
// If this is the lowest packet that hasn't been acked or retransmitted yet ...
if packet.PacketNumber == h.LargestInOrderAcked+1 {
// ... increase the LargestInOrderAcked until it's one before the next packet that was not acked and not retransmitted
for el := packetElement; el != nil; el = el.Next() {
if h.LargestInOrderAcked == h.LargestAcked {
break
}
h.LargestInOrderAcked = el.Value.PacketNumber - 1
}
}
h.packetHistory.Remove(packetElement)
// strictly speaking, this is only necessary for RTO retransmissions
@@ -121,6 +99,13 @@ func (h *sentPacketHandler) queuePacketForRetransmission(packetElement *ackhandl
h.stopWaitingManager.QueuedRetransmissionForPacketNumber(packet.PacketNumber)
}
func (h *sentPacketHandler) largestInOrderAcked() protocol.PacketNumber {
if f := h.packetHistory.Front(); f != nil {
return f.Value.PacketNumber - 1
}
return h.LargestAcked
}
func (h *sentPacketHandler) SentPacket(packet *ackhandlerlegacy.Packet) error {
if packet.PacketNumber <= h.lastSentPacketNumber {
return errPacketNumberNotIncreasing
@@ -169,7 +154,7 @@ func (h *sentPacketHandler) ReceivedAck(ackFrame *frames.AckFrame, withPacketNum
h.largestReceivedPacketWithAck = withPacketNumber
// ignore repeated ACK (ACKs that don't have a higher LargestAcked than the last ACK)
if ackFrame.LargestAcked <= h.LargestInOrderAcked {
if ackFrame.LargestAcked <= h.largestInOrderAcked() {
return nil
}
@@ -277,7 +262,7 @@ func (h *sentPacketHandler) BytesInFlight() protocol.ByteCount {
}
func (h *sentPacketHandler) GetLeastUnacked() protocol.PacketNumber {
return h.LargestInOrderAcked + 1
return h.largestInOrderAcked() + 1
}
func (h *sentPacketHandler) GetStopWaitingFrame() *frames.StopWaitingFrame {
@@ -303,10 +288,6 @@ func (h *sentPacketHandler) MaybeQueueRTOs() {
for el := h.packetHistory.Front(); el != nil; el = el.Next() {
packet := &el.Value
if packet.PacketNumber < h.LargestInOrderAcked {
continue
}
packetsLost := congestion.PacketVector{congestion.PacketInfo{
Number: packet.PacketNumber,
Length: packet.Length,
@@ -337,9 +318,10 @@ func (h *sentPacketHandler) TimeOfFirstRTO() time.Time {
}
func (h *sentPacketHandler) garbageCollectSkippedPackets() {
lioa := h.largestInOrderAcked()
deleteIndex := 0
for i, p := range h.skippedPackets {
if p <= h.LargestInOrderAcked {
if p <= lioa {
deleteIndex = i + 1
}
}

View File

@@ -75,7 +75,7 @@ var _ = Describe("SentPacketHandler", func() {
}
It("gets the LeastUnacked packet number", func() {
handler.LargestInOrderAcked = 0x1337
handler.LargestAcked = 0x1337
Expect(handler.GetLeastUnacked()).To(Equal(protocol.PacketNumber(0x1337 + 1)))
})
@@ -188,23 +188,23 @@ var _ = Describe("SentPacketHandler", func() {
})
Context("garbage collection", func() {
It("keeps all packet numbers above the LargestInOrderAcked", func() {
It("keeps all packet numbers above the LargestAcked", func() {
handler.skippedPackets = []protocol.PacketNumber{2, 5, 8, 10}
handler.LargestInOrderAcked = 1
handler.LargestAcked = 1
handler.garbageCollectSkippedPackets()
Expect(handler.skippedPackets).To(Equal([]protocol.PacketNumber{2, 5, 8, 10}))
})
It("doesn't keep packet numbers below the LargestInOrderAcked", func() {
It("doesn't keep packet numbers below the LargestAcked", func() {
handler.skippedPackets = []protocol.PacketNumber{1, 5, 8, 10}
handler.LargestInOrderAcked = 5
handler.LargestAcked = 5
handler.garbageCollectSkippedPackets()
Expect(handler.skippedPackets).To(Equal([]protocol.PacketNumber{8, 10}))
})
It("deletes all packet numbers if LargestInOrderAcked is sufficiently high", func() {
It("deletes all packet numbers if LargestAcked is sufficiently high", func() {
handler.skippedPackets = []protocol.PacketNumber{1, 5, 10}
handler.LargestInOrderAcked = 15
handler.LargestAcked = 15
handler.garbageCollectSkippedPackets()
Expect(handler.skippedPackets).To(BeEmpty())
})
@@ -326,14 +326,14 @@ var _ = Describe("SentPacketHandler", func() {
})
Context("acks and nacks the right packets", func() {
It("adjusts the LargestInOrderAcked", func() {
It("adjusts the LargestAcked", func() {
ack := frames.AckFrame{
LargestAcked: 5,
LowestAcked: 1,
}
err := handler.ReceivedAck(&ack, 1)
Expect(err).ToNot(HaveOccurred())
Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(5)))
Expect(handler.LargestAcked).To(Equal(protocol.PacketNumber(5)))
el := handler.packetHistory.Front()
for i := 6; i <= 10; i++ {
Expect(el.Value.PacketNumber).To(Equal(protocol.PacketNumber(i)))
@@ -350,7 +350,6 @@ var _ = Describe("SentPacketHandler", func() {
}
err := handler.ReceivedAck(&ack, 1)
Expect(err).ToNot(HaveOccurred())
Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(0)))
el := handler.packetHistory.Front()
Expect(el.Value.PacketNumber).To(Equal(protocol.PacketNumber(1)))
el = el.Next()
@@ -373,8 +372,6 @@ var _ = Describe("SentPacketHandler", func() {
}
err := handler.ReceivedAck(&ack, 1)
Expect(err).ToNot(HaveOccurred())
Expect(handler.LargestInOrderAcked).To(BeZero())
Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(0)))
el := handler.packetHistory.Front()
Expect(el.Value.PacketNumber).To(Equal(protocol.PacketNumber(1)))
el = el.Next()
@@ -396,7 +393,6 @@ var _ = Describe("SentPacketHandler", func() {
}
err := handler.ReceivedAck(&ack, 1)
Expect(err).ToNot(HaveOccurred())
Expect(handler.LargestInOrderAcked).To(BeZero())
el := handler.packetHistory.Front()
Expect(el.Value.PacketNumber).To(Equal(protocol.PacketNumber(1)))
Expect(el.Value.MissingReports).To(Equal(uint8(1)))
@@ -419,7 +415,6 @@ var _ = Describe("SentPacketHandler", func() {
}
err := handler.ReceivedAck(&ack, 1)
Expect(err).ToNot(HaveOccurred())
Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(1)))
el := handler.packetHistory.Front()
Expect(el.Value.PacketNumber).To(Equal(protocol.PacketNumber(2)))
Expect(el.Value.MissingReports).To(Equal(uint8(1)))
@@ -459,7 +454,6 @@ var _ = Describe("SentPacketHandler", func() {
err = handler.ReceivedAck(&ack2, 2)
Expect(err).ToNot(HaveOccurred())
Expect(handler.BytesInFlight()).To(Equal(protocol.ByteCount(len(packets) - 6)))
Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(largestObserved)))
Expect(handler.packetHistory.Front().Value.PacketNumber).To(Equal(protocol.PacketNumber(7)))
})
@@ -484,7 +478,6 @@ var _ = Describe("SentPacketHandler", func() {
err = handler.ReceivedAck(&ack2, 2)
Expect(err).ToNot(HaveOccurred())
Expect(handler.BytesInFlight()).To(Equal(protocol.ByteCount(len(packets) - 7)))
Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(7)))
Expect(handler.packetHistory.Front().Value.PacketNumber).To(Equal(protocol.PacketNumber(8)))
})
@@ -616,79 +609,6 @@ var _ = Describe("SentPacketHandler", func() {
Expect(packet.PacketNumber).To(Equal(protocol.PacketNumber(4)))
})
It("changes the LargestInOrderAcked after queueing the lowest packet for retransmission", func() {
ack := frames.AckFrame{
LargestAcked: 7,
LowestAcked: 1,
AckRanges: []frames.AckRange{
{FirstPacketNumber: 7, LastPacketNumber: 7},
{FirstPacketNumber: 4, LastPacketNumber: 5},
{FirstPacketNumber: 1, LastPacketNumber: 2},
},
}
err := handler.ReceivedAck(&ack, 1)
Expect(err).ToNot(HaveOccurred())
Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(2)))
// this will trigger a retransmission of packet 3
for i := uint8(0); i < protocol.RetransmissionThreshold; i++ {
el := getPacketElement(3)
Expect(el).ToNot(BeNil())
handler.nackPacket(el)
}
Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(5)))
})
It("does not change the LargestInOrderAcked after queueing a higher packet for retransmission", func() {
ack := frames.AckFrame{
LargestAcked: 7,
LowestAcked: 1,
AckRanges: []frames.AckRange{
{FirstPacketNumber: 7, LastPacketNumber: 7},
{FirstPacketNumber: 4, LastPacketNumber: 5},
{FirstPacketNumber: 1, LastPacketNumber: 2},
},
}
err := handler.ReceivedAck(&ack, 1)
Expect(err).ToNot(HaveOccurred())
Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(2)))
// this will trigger a retransmission of packet 6
for i := uint8(0); i < protocol.RetransmissionThreshold; i++ {
el := getPacketElement(6)
Expect(el).ToNot(BeNil())
handler.nackPacket(el)
}
Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(2)))
})
It("increases LargestInOrderAcked past packets queued for retransmission", func() {
ack := frames.AckFrame{
LargestAcked: 7,
LowestAcked: 1,
AckRanges: []frames.AckRange{
{FirstPacketNumber: 7, LastPacketNumber: 7},
{FirstPacketNumber: 4, LastPacketNumber: 5},
{FirstPacketNumber: 1, LastPacketNumber: 1},
},
}
err := handler.ReceivedAck(&ack, 1)
Expect(err).ToNot(HaveOccurred())
// this will trigger a retransmission of packet 3
for i := uint8(0); i < protocol.RetransmissionThreshold; i++ {
el := getPacketElement(3)
Expect(el).ToNot(BeNil())
handler.nackPacket(el)
}
Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(1)))
// now, trigger retransmission of 2 ...
for i := uint8(0); i < protocol.RetransmissionThreshold; i++ {
el := getPacketElement(2)
Expect(el).ToNot(BeNil())
handler.nackPacket(el)
}
// and check that it increased LargestInOrderAcked past 3
Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(5)))
})
Context("StopWaitings", func() {
It("gets a StopWaitingFrame", func() {
ack := frames.AckFrame{LargestAcked: 5, LowestAcked: 5}