]> Cypherpunks.ru repositories - gostls13.git/commitdiff
net/http: use copyBufPool in transferWriter.doBodyCopy()
authorMichaƂ Matczuk <mmatczuk@gmail.com>
Thu, 9 Nov 2023 09:43:26 +0000 (09:43 +0000)
committerDamien Neil <dneil@google.com>
Thu, 9 Nov 2023 18:51:38 +0000 (18:51 +0000)
This is a followup to CL 14177. It applies copyBufPool optimization to
transferWriter.doBodyCopy(). The function is used every time Request or
Response is written.

Without this patch for every Request and Response processed, if there is
a body, we need to allocate and GC a 32k buffer. This is quickly causing
GC pressure.

Fixes #57202

Change-Id: I4c30e1737726ac8d9937846106efd02effbae300
GitHub-Last-Rev: 908573cdbe2e8b6f91ce026cf8632ff5f2c41110
GitHub-Pull-Request: golang/go#57205
Reviewed-on: https://go-review.googlesource.com/c/go/+/456435
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: Bryan Mills <bcmills@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: qiulaidongfeng <2645477756@qq.com>
src/net/http/transfer.go

index b24998174f6ecc9dba8a91d0115d9cb8d6ad81fc..dffff56b31e94ff8345eedb769948032bf34d9e0 100644 (file)
@@ -410,7 +410,11 @@ func (t *transferWriter) writeBody(w io.Writer) (err error) {
 //
 // This function is only intended for use in writeBody.
 func (t *transferWriter) doBodyCopy(dst io.Writer, src io.Reader) (n int64, err error) {
-       n, err = io.Copy(dst, src)
+       bufp := copyBufPool.Get().(*[]byte)
+       buf := *bufp
+       defer copyBufPool.Put(bufp)
+
+       n, err = io.CopyBuffer(dst, src, buf)
        if err != nil && err != io.EOF {
                t.bodyReadError = err
        }