From 46f8930fef3d8f78ba013da7bb3d54cf6d4ecd0c Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Sat, 17 Mar 2018 11:13:55 +0000 Subject: [PATCH] calculate loss alarm based on send time of last retransmittable packet --- internal/ackhandler/sent_packet_handler.go | 23 +++++++++++-------- .../ackhandler/sent_packet_handler_test.go | 4 +++- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/internal/ackhandler/sent_packet_handler.go b/internal/ackhandler/sent_packet_handler.go index 47c3ddee7..8ba51fb3f 100644 --- a/internal/ackhandler/sent_packet_handler.go +++ b/internal/ackhandler/sent_packet_handler.go @@ -30,9 +30,11 @@ const ( ) type sentPacketHandler struct { - lastSentPacketNumber protocol.PacketNumber - nextPacketSendTime time.Time - skippedPackets []protocol.PacketNumber + lastSentPacketNumber protocol.PacketNumber + lastSentRetransmittablePacketTime time.Time + + nextPacketSendTime time.Time + skippedPackets []protocol.PacketNumber largestAcked protocol.PacketNumber largestReceivedPacketWithAck protocol.PacketNumber @@ -115,8 +117,8 @@ func (h *sentPacketHandler) SentPacket(packet *Packet) { packet.sendTime = time.Now() if isRetransmittable := h.sentPacketImpl(packet); isRetransmittable { h.packetHistory.SentPacket(packet) + h.updateLossDetectionAlarm() } - h.updateLossDetectionAlarm(packet.sendTime) } func (h *sentPacketHandler) SentPacketsAsRetransmission(packets []*Packet, retransmissionOf protocol.PacketNumber) { @@ -129,7 +131,7 @@ func (h *sentPacketHandler) SentPacketsAsRetransmission(packets []*Packet, retra } } h.packetHistory.SentPacketsAsRetransmission(p, retransmissionOf) - h.updateLossDetectionAlarm(now) + h.updateLossDetectionAlarm() } func (h *sentPacketHandler) sentPacketImpl(packet *Packet) bool /* isRetransmittable */ { @@ -154,6 +156,7 @@ func (h *sentPacketHandler) sentPacketImpl(packet *Packet) bool /* isRetransmitt if isRetransmittable { packet.largestAcked = largestAcked + h.lastSentRetransmittablePacketTime = packet.sendTime h.bytesInFlight += packet.Length } h.congestion.OnPacketSent(packet.sendTime, h.bytesInFlight, packet.PacketNumber, packet.Length, isRetransmittable) @@ -209,7 +212,7 @@ func (h *sentPacketHandler) ReceivedAck(ackFrame *wire.AckFrame, withPacketNumbe if err := h.detectLostPackets(rcvTime); err != nil { return err } - h.updateLossDetectionAlarm(rcvTime) + h.updateLossDetectionAlarm() h.garbageCollectSkippedPackets() h.stopWaitingManager.ReceivedAck(ackFrame) @@ -264,7 +267,7 @@ func (h *sentPacketHandler) maybeUpdateRTT(largestAcked protocol.PacketNumber, a return false } -func (h *sentPacketHandler) updateLossDetectionAlarm(now time.Time) { +func (h *sentPacketHandler) updateLossDetectionAlarm() { // Cancel the alarm if no packets are outstanding if h.packetHistory.Len() == 0 { h.alarm = time.Time{} @@ -273,13 +276,13 @@ func (h *sentPacketHandler) updateLossDetectionAlarm(now time.Time) { // TODO(#497): TLP if !h.handshakeComplete { - h.alarm = now.Add(h.computeHandshakeTimeout()) + h.alarm = h.lastSentRetransmittablePacketTime.Add(h.computeHandshakeTimeout()) } else if !h.lossTime.IsZero() { // Early retransmit timer or time loss detection. h.alarm = h.lossTime } else { // RTO - h.alarm = now.Add(h.computeRTOTimeout()) + h.alarm = h.lastSentRetransmittablePacketTime.Add(h.computeRTOTimeout()) } } @@ -336,7 +339,7 @@ func (h *sentPacketHandler) OnAlarm() error { if err != nil { return err } - h.updateLossDetectionAlarm(now) + h.updateLossDetectionAlarm() return nil } diff --git a/internal/ackhandler/sent_packet_handler_test.go b/internal/ackhandler/sent_packet_handler_test.go index cfa4484f3..729322e2a 100644 --- a/internal/ackhandler/sent_packet_handler_test.go +++ b/internal/ackhandler/sent_packet_handler_test.go @@ -114,12 +114,14 @@ var _ = Describe("SentPacketHandler", func() { It("stores the sent time", func() { handler.SentPacket(retransmittablePacket(1)) - Expect(getPacket(1).sendTime.Unix()).To(BeNumerically("~", time.Now().Unix(), 1)) + Expect(getPacket(1).sendTime).To(BeTemporally("~", time.Now(), 100*time.Millisecond)) + Expect(handler.lastSentRetransmittablePacketTime).To(BeTemporally("~", time.Now(), 100*time.Millisecond)) }) It("does not store non-retransmittable packets", func() { handler.SentPacket(nonRetransmittablePacket(1)) Expect(handler.packetHistory.Len()).To(BeZero()) + Expect(handler.lastSentRetransmittablePacketTime).To(BeZero()) }) Context("skipped packet numbers", func() {