diff options
| author | Damien Neil <dneil@google.com> | 2026-03-10 09:38:22 -0700 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2026-03-12 08:10:43 -0700 |
| commit | a8a0dc9ea2e8cd37f667614e1b9a6dd5fc0af040 (patch) | |
| tree | 2dd6949a83d4a90f59f58594db32908988da5be1 /src | |
| parent | 29ada7aa481930fbddab626e0686f84c1fcd63a2 (diff) | |
| download | go-a8a0dc9ea2e8cd37f667614e1b9a6dd5fc0af040.tar.xz | |
net/http/internal/http2: make server write errors sticky
After encountering a write error on a server's connection,
remember the error and reuse it for future writes.
Fixes a rare flakiness in TestServerWriteByteTimeout,
where we can sometimes attempt to flush the write buffer
after encountering a write timeout.
Change-Id: I01649ae41185d6109180e222d4e8f8426a6a6964
Reviewed-on: https://go-review.googlesource.com/c/go/+/753720
Auto-Submit: Damien Neil <dneil@google.com>
Reviewed-by: Nicholas Husin <nsh@golang.org>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Nicholas Husin <husin@google.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/net/http/internal/http2/http2.go | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/net/http/internal/http2/http2.go b/src/net/http/internal/http2/http2.go index ba93bb9479..edf34e1f77 100644 --- a/src/net/http/internal/http2/http2.go +++ b/src/net/http/internal/http2/http2.go @@ -258,6 +258,7 @@ type bufferedWriter struct { conn net.Conn // immutable bw *bufio.Writer // non-nil when data is buffered byteTimeout time.Duration // immutable, WriteByteTimeout + werr error } func newBufferedWriter(conn net.Conn, timeout time.Duration) *bufferedWriter { @@ -289,12 +290,16 @@ func (w *bufferedWriter) Available() int { } func (w *bufferedWriter) Write(p []byte) (n int, err error) { + if w.werr != nil { + return 0, w.werr + } if w.bw == nil { bw := bufWriterPool.Get().(*bufio.Writer) bw.Reset((*bufferedWriterTimeoutWriter)(w)) w.bw = bw } - return w.bw.Write(p) + n, w.werr = w.bw.Write(p) + return n, w.werr } func (w *bufferedWriter) Flush() error { @@ -302,11 +307,14 @@ func (w *bufferedWriter) Flush() error { if bw == nil { return nil } - err := bw.Flush() + if w.werr != nil { + return w.werr + } + w.werr = bw.Flush() bw.Reset(nil) bufWriterPool.Put(bw) w.bw = nil - return err + return w.werr } type bufferedWriterTimeoutWriter bufferedWriter |
