From 5d5a036a503f8accd748f7453c0162115187be13 Mon Sep 17 00:00:00 2001 From: Damien Neil Date: Tue, 3 Oct 2023 13:49:48 -0700 Subject: [PATCH] quic: handle streams moving from the data queue to the meta queue In Conn.appendStreamFrames, a stream can be moved from the data queue (for streams with only flow-controlled frames to send) to the metadata queue (for streams with non-flow-controlled frames to send) if some other goroutine asynchronously modifies the stream state. Adjust the check at the end of this function to clear the needSend bool only if queueMeta and queueData are both empty, to avoid losing track of the need to send frames when this happens. For golang/go#58547 Change-Id: Ib9ad3b01f543cd7673f5233ceb58b2db9adfff5a Reviewed-on: https://go-review.googlesource.com/c/net/+/531656 LUCI-TryBot-Result: Go LUCI Reviewed-by: Jonathan Amsterdam --- internal/quic/conn_streams.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/internal/quic/conn_streams.go b/internal/quic/conn_streams.go index 7c6c8be2c0..a0793297e1 100644 --- a/internal/quic/conn_streams.go +++ b/internal/quic/conn_streams.go @@ -372,7 +372,9 @@ func (c *Conn) appendStreamFrames(w *packetWriter, pnum packetNumber, pto bool) state = s.state.set(0, streamQueueData) c.queueStreamForSendLocked(s, state) } - c.streams.needSend.Store(c.streams.queueData.head != nil) + if c.streams.queueMeta.head == nil && c.streams.queueData.head == nil { + c.streams.needSend.Store(false) + } return true }