Unreviewed changes
2 is the latest approved patch-set.
The change was submitted with unreviewed changes in the following files:
```
The name of the file: src/net/http/internal/http2/server.go
Insertions: 2, Deletions: 3.
@@ -2322,9 +2322,6 @@
didPanic := true
defer func() {
rw.rws.stream.cancelCtx()
- if req.MultipartForm != nil {
- req.MultipartForm.RemoveAll()
- }
if didPanic {
e := recover()
sc.writeFrameFromHandler(FrameWriteRequest{
@@ -2797,7 +2794,7 @@
func (w *responseWriter) FlushError() error {
rws := w.rws
if rws == nil {
- panic("Header called after Handler finished")
+ panic("Flush called after Handler finished")
}
var err error
if rws.bw != nil && rws.bw.Buffered() > 0 {
@@ -2974,8 +2971,7 @@
}
}
-// releaseWriteBuffer returns rws.bw, which must be empty, to
-// handlerWriterPool.
+// releaseWriteBuffer returns rws.bw to handlerWriterPool.
func (rws *responseWriterState) releaseWriteBuffer() {
bw := rws.bw
rws.bw = nil
```
Change information
Commit message:
net/http/internal/http2: release handler write buffers when idle
Each in-flight server response held a 4KB bufio.Writer for the
lifetime of its handler, including handlers that sit idle
mid-response for a very long time between writes, as when streaming
long polls or server-sent events. For servers with many such
concurrent streams, that's 4KB of dead weight per stream. (e.g. 40 GB
of RAM at 10M streaming conns)
Instead of tying the buffer to the responseWriterState for the whole
response, acquire it from a pool on the first buffered write and
return it to the pool whenever a Flush leaves it empty. Handlers that
never flush keep the buffer until the handler completes, as before.
Updates #80735
Change-Id: Icf7cdb5c21abb1126f6571cb00bbe2f00bf23b3c
Files:
- M src/net/http/internal/http2/export_test.go
- M src/net/http/internal/http2/server.go
- M src/net/http/internal/http2/server_test.go
Change size: M
Delta: 3 files changed, 134 insertions(+), 9 deletions(-)
Branch: refs/heads/master