mirror of
https://github.com/scylladb/scylladb.git
synced 2026-04-24 18:40:38 +00:00
In case of
local: Send Data + FIN
remote: Ack Data + FIN
We should strip 1 byte off in data ACK only if we have sent out
FIN. Otherwise, we will think there is 1 bytes that remote hasn't
acked and retransmit.
This patch fixes the unnecessary retransmission of the last memcache get
response. Found this issue when looking at TCP flow in memaslap testing.
Before:
38811 1.000117000 192.168.66.100 -> 192.168.66.123 MEMCACHE 124 get
38812 1.000593000 192.168.66.123 -> 192.168.66.100 MEMCACHE 1164 VALUE
38813 1.000624000 192.168.66.100 -> 192.168.66.123 TCP 54 59708 > 11211
[FIN, ACK] Seq=2217067730 Ack=20399459 Win=185856 Len=0
38814 1.000769000 192.168.66.123 -> 192.168.66.100 TCP 54 11211 > 59708
[ACK] Seq=20399459 Ack=2217067731 Win=3737600 Len=0
38815 4.000883000 192.168.66.123 -> 192.168.66.100 MEMCACHE 1164
[TCP Retransmission] VALUE
38816 4.000934000 192.168.66.100 -> 192.168.66.123 TCP 54
[TCP Dup ACK 38813#1] 59708 > 11211
[ACK] Seq=2217067731 Ack=20399459 Win=185856 Len=0
38817 4.001054000 192.168.66.123 -> 192.168.66.100 TCP 54 11211 > 59708
[FIN, ACK] Seq=20399459 Ack=2217067731 Win=3737600 Len=0
38818 4.001094000 192.168.66.100 -> 192.168.66.123 TCP 54 59708 > 11211
[ACK] Seq=2217067731 Ack=20399460 Win=185856 Len=0
After:
38547 1.000224000 192.168.66.100 -> 192.168.66.123 MEMCACHE 124 get
38548 1.000264000 192.168.66.123 -> 192.168.66.100 MEMCACHE 1164 VALUE
38549 1.000292000 192.168.66.100 -> 192.168.66.123 TCP 54 59717 > 11211
[FIN, ACK] Seq=1862323816 Ack=20267265 Win=185856 Len=0
38550 1.000441000 192.168.66.123 -> 192.168.66.100 TCP 54 11211 > 59717
[ACK] Seq=20267265 Ack=1862323817 Win=3737600 Len=0
38551 1.000602000 192.168.66.123 -> 192.168.66.100 TCP 54 11211 > 59717
[FIN, ACK] Seq=20267265 Ack=1862323817 Win=3737600 Len=0
38552 1.000626000 192.168.66.100 -> 192.168.66.123 TCP 54 59717 > 11211
[ACK] Seq=1862323817 Ack=20267266 Win=185856 Len=0