Fix a race where keepalives could be sent while there is pending data

PiperOrigin-RevId: 219571556
Change-Id: I5a1042c1cb05eb2711eb01627fd298bad6c543a6
This commit is contained in:
Ian Gudger
2018-10-31 18:42:44 -07:00
committed by Shentubot
parent eeddae1199
commit 59b7766af7
3 changed files with 14 additions and 2 deletions
-2
View File
@@ -62,8 +62,6 @@ go_test(
"tcp_test.go",
"tcp_timestamp_test.go",
],
# FIXME
tags = ["flaky"],
deps = [
":tcp",
"//pkg/tcpip",
+7
View File
@@ -829,6 +829,13 @@ func (e *endpoint) resetKeepaliveTimer(receivedData bool) {
}
}
// disableKeepaliveTimer stops the keepalive timer.
func (e *endpoint) disableKeepaliveTimer() {
e.keepalive.Lock()
e.keepalive.timer.disable()
e.keepalive.Unlock()
}
// protocolMainLoop is the main loop of the TCP protocol. It runs in its own
// goroutine and is responsible for sending segments and handling received
// segments.
+7
View File
@@ -405,6 +405,7 @@ func (s *sender) sendData() {
// eventually.
var seg *segment
end := s.sndUna.Add(s.sndWnd)
var dataSent bool
for seg = s.writeNext; seg != nil && s.outstanding < s.sndCwnd; seg = seg.Next() {
// We abuse the flags field to determine if we have already
// assigned a sequence number to this segment.
@@ -448,6 +449,12 @@ func (s *sender) sendData() {
segEnd = seg.sequenceNumber.Add(seqnum.Size(seg.data.Size()))
}
if !dataSent {
dataSent = true
// We are sending data, so we should stop the keepalive timer to
// ensure that no keepalives are sent while there is pending data.
s.ep.disableKeepaliveTimer()
}
s.sendSegment(seg.data, seg.flags, seg.sequenceNumber)
// Update sndNxt if we actually sent new data (as opposed to