aboutsummaryrefslogtreecommitdiff
path: root/src/net/http
diff options
context:
space:
mode:
authorDamien Neil <dneil@google.com>2026-03-10 09:38:22 -0700
committerGopher Robot <gobot@golang.org>2026-03-12 08:10:43 -0700
commita8a0dc9ea2e8cd37f667614e1b9a6dd5fc0af040 (patch)
tree2dd6949a83d4a90f59f58594db32908988da5be1 /src/net/http
parent29ada7aa481930fbddab626e0686f84c1fcd63a2 (diff)
downloadgo-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/net/http')
-rw-r--r--src/net/http/internal/http2/http2.go14
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