diff options
author | Bhasker Hariharan <bhaskerh@google.com> | 2020-05-07 10:24:47 -0700 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2020-05-07 10:26:00 -0700 |
commit | 08f4846ebe79236ded6f4bc816b0a776afe14463 (patch) | |
tree | b972f70c342165d479fbedc0f8ae424353f41463 /pkg/buffer/safemem.go | |
parent | 16da7e790f570d9743fb47e50c304e6a24834772 (diff) |
Fix bugs in SACK recovery.
Every call to sender.NextSeg does not need to iterate from the
front of the writeList as in a given recovery episode we can cache
the last nextSeg returned. There cannot be a lower sequenced segment
that matches the next call to NextSeg as otherwise we would have
returned that instead in the previous call.
This fixes the issue of excessive CPU usage w/ large send buffers
where we spend a lot of time iterating from the front of the list on
every NextSeg invocation.
Further the following other bugs were also fixed:
* Iteration of segments never sent in NextSeg() when looking for segments for
retransmission that match step1/3/4 of the NextSeg algorithm
* Correctly setting rescueRxt only if the rescue segment was actually sent.
* Correctly initializing rescueRxt/highRxt when entering SACK recovery.
* Correctly re-arming the timer only on retransmissions when SACK is in use
and not for every segment being sent as it was being done before.
* Copy over xmitTime and xmitCount on segment clone.
* Move writeNext along when skipping over SACKED segments. This is required
to prevent spurious retransmissions where we end up retransmitting data
that was never lost.
PiperOrigin-RevId: 310387671
Diffstat (limited to 'pkg/buffer/safemem.go')
0 files changed, 0 insertions, 0 deletions