From e7d7207206bf1fcce8f0c1d5f8cc77c53b12fda6 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Thu, 11 Aug 2016 15:51:32 +0700 Subject: [PATCH] garbage collect skippedPackets slice in SentPacketHandler --- ackhandler/sent_packet_handler.go | 12 ++++++++++++ ackhandler/sent_packet_handler_test.go | 23 +++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/ackhandler/sent_packet_handler.go b/ackhandler/sent_packet_handler.go index 299777ea5..4bd9a9e17 100644 --- a/ackhandler/sent_packet_handler.go +++ b/ackhandler/sent_packet_handler.go @@ -248,6 +248,8 @@ func (h *sentPacketHandler) ReceivedAck(ackFrame *frames.AckFrame, withPacketNum } } + h.garbageCollectSkippedPackets() + h.stopWaitingManager.ReceivedAck(ackFrame) h.congestion.OnCongestionEvent( @@ -345,3 +347,13 @@ func (h *sentPacketHandler) TimeOfFirstRTO() time.Time { } return h.lastSentPacketTime.Add(h.getRTO()) } + +func (h *sentPacketHandler) garbageCollectSkippedPackets() { + deleteIndex := 0 + for i, p := range h.skippedPackets { + if p <= h.LargestInOrderAcked { + deleteIndex = i + 1 + } + } + h.skippedPackets = h.skippedPackets[deleteIndex:] +} diff --git a/ackhandler/sent_packet_handler_test.go b/ackhandler/sent_packet_handler_test.go index ecc2ce8c1..f6f76226a 100644 --- a/ackhandler/sent_packet_handler_test.go +++ b/ackhandler/sent_packet_handler_test.go @@ -186,6 +186,29 @@ var _ = Describe("SentPacketHandler", func() { Expect(handler.skippedPackets[0]).To(Equal(protocol.PacketNumber(10))) Expect(handler.skippedPackets[protocol.MaxTrackedSkippedPackets-1]).To(Equal(protocol.PacketNumber(10 + 2*(protocol.MaxTrackedSkippedPackets-1)))) }) + + Context("garbage collection", func() { + It("keeps all packet numbers above the LargestInOrderAcked", func() { + handler.skippedPackets = []protocol.PacketNumber{2, 5, 8, 10} + handler.LargestInOrderAcked = 1 + handler.garbageCollectSkippedPackets() + Expect(handler.skippedPackets).To(Equal([]protocol.PacketNumber{2, 5, 8, 10})) + }) + + It("doesn't keep packet numbers below the LargestInOrderAcked", func() { + handler.skippedPackets = []protocol.PacketNumber{1, 5, 8, 10} + handler.LargestInOrderAcked = 5 + handler.garbageCollectSkippedPackets() + Expect(handler.skippedPackets).To(Equal([]protocol.PacketNumber{8, 10})) + }) + + It("deletes all packet numbers if LargestInOrderAcked is sufficiently high", func() { + handler.skippedPackets = []protocol.PacketNumber{1, 5, 10} + handler.LargestInOrderAcked = 15 + handler.garbageCollectSkippedPackets() + Expect(handler.skippedPackets).To(BeEmpty()) + }) + }) }) })