From bd0b44d01da32933eeef40909f428f621ff474f8 Mon Sep 17 00:00:00 2001 From: oliverpool Date: Thu, 28 May 2026 23:51:15 +0200 Subject: [PATCH] chore: use `io.ReadFull` instead of `io.ReadAll` for `DataAsync` (#12795) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since the final size is already known, no need to `ReadAll` a `LimitedReader`: directly `ReadFull` a properly sized buffer. Tests are already present in `blob_test.go` (a failure can be triggered by creating a smaller `buf`). `go test -run=TestBlob_Data -bench=Blob_Data -benchmem` before: ``` Benchmark_Blob_Data-18 43964 28727 ns/op 1373 B/op 11 allocs/op ``` After: ``` Benchmark_Blob_Data-18 41308 27679 ns/op 846 B/op 10 allocs/op ``` 🎉 one allocation spared! Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/12795 Reviewed-by: Gusted --- modules/git/blob.go | 5 +++-- modules/git/blob_test.go | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/git/blob.go b/modules/git/blob.go index 020a591a23..a093dee205 100644 --- a/modules/git/blob.go +++ b/modules/git/blob.go @@ -83,13 +83,14 @@ func (b *Blob) DataAsync() (io.ReadCloser, error) { } if size < 4096 { - bs, err := io.ReadAll(io.LimitReader(rd, size)) + buf := make([]byte, size) + _, err := io.ReadFull(rd, buf) defer cancel() if err != nil { return nil, err } _, err = rd.Discard(1) - return io.NopCloser(bytes.NewReader(bs)), err + return io.NopCloser(bytes.NewReader(buf)), err } return &blobReader{ diff --git a/modules/git/blob_test.go b/modules/git/blob_test.go index 7caa2d2de3..96190aaf24 100644 --- a/modules/git/blob_test.go +++ b/modules/git/blob_test.go @@ -143,7 +143,7 @@ func Benchmark_Blob_Data(b *testing.B) { b.Fatal(err) } - for i := 0; i < b.N; i++ { + for b.Loop() { r, err := testBlob.DataAsync() if err != nil { b.Fatal(err)