From 125a621f792ac803ce5fdb3822a6995d1f1431f7 Mon Sep 17 00:00:00 2001 From: oliverpool Date: Thu, 22 Jan 2026 16:26:18 +0100 Subject: [PATCH] feat: optimization: use fs.ReadFile (#10987) While reviewing cpuprofiles of #10985, I noticed a bunch of slice-grows within this function. Instead of `io.ReadAll` (which does not know the size in advance), use `fs.ReadFile`, which will perform correctly-sized allocations. ### Tests This function is already covered by tests in `modules/assetfs/layered_test.go` ### Documentation - [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change. - [x] I did not document these changes and I do not expect someone else to do it. ### Release notes - [ ] This change will be noticed by a Forgejo user or admin (feature, bug fix, performance, etc.). I suggest to include a release note for this change. - [x] This change is not visible to a Forgejo user or admin (refactor, dependency upgrade, etc.). I think there is no need to add a release note for this change. *The decision if the pull request will be shown in the release notes is up to the mergers / release team.* The content of the `release-notes/.md` file will serve as the basis for the release notes. If the file does not exist, the title of the pull request will be used instead. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10987 Reviewed-by: Michael Kriese Reviewed-by: Mathieu Fenniak Co-authored-by: oliverpool Co-committed-by: oliverpool --- modules/assetfs/layered.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/modules/assetfs/layered.go b/modules/assetfs/layered.go index 2041f28bb1..a9b99556e2 100644 --- a/modules/assetfs/layered.go +++ b/modules/assetfs/layered.go @@ -7,7 +7,6 @@ import ( "context" "errors" "fmt" - "io" "io/fs" "os" "path/filepath" @@ -97,14 +96,12 @@ func (l *LayeredFS) ReadFile(elems ...string) ([]byte, error) { func (l *LayeredFS) ReadLayeredFile(elems ...string) ([]byte, string, error) { name := util.PathJoinRel(elems...) for _, layer := range l.layers { - f, err := layer.Open(name) - if os.IsNotExist(err) { + bs, err := fs.ReadFile(layer, name) + if errors.Is(err, fs.ErrNotExist) { continue } else if err != nil { return nil, layer.name, err } - bs, err := io.ReadAll(f) - _ = f.Close() return bs, layer.name, err } return nil, "", fs.ErrNotExist