diff options
author | Jaime Martinez <jmartinez@gitlab.com> | 2022-07-05 08:04:14 +0300 |
---|---|---|
committer | Jaime Martinez <jmartinez@gitlab.com> | 2022-07-05 08:04:14 +0300 |
commit | f85c07170b2cbfb50cb9375689f15cf09492dee9 (patch) | |
tree | b2bdc64e8f5cd51d68b63b7d001e7a21501f1fa7 | |
parent | ece2a232bafa09a1f037de514899003cc5b364d2 (diff) | |
parent | f94de222c0e4d228a981a493d088fdc1173c3513 (diff) |
Merge branch 'perf/nil-zip-archive' into 'master'
perf: null out zip reader after reading archive
See merge request gitlab-org/gitlab-pages!804
-rw-r--r-- | internal/vfs/zip/archive.go | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/internal/vfs/zip/archive.go b/internal/vfs/zip/archive.go index 9f01794b..2b04310d 100644 --- a/internal/vfs/zip/archive.go +++ b/internal/vfs/zip/archive.go @@ -56,7 +56,6 @@ type zipArchive struct { resource *httprange.Resource reader *httprange.RangedReader - archive *zip.Reader err error files map[string]*zip.File @@ -128,13 +127,15 @@ func (a *zipArchive) readArchive(url string) { return } + var archive *zip.Reader + // load all archive files into memory using a cached ranged reader a.reader = httprange.NewRangedReader(a.resource) a.reader.WithCachedReader(ctx, func() { - a.archive, a.err = zip.NewReader(a.reader, a.resource.Size) + archive, a.err = zip.NewReader(a.reader, a.resource.Size) }) - if a.archive == nil || a.err != nil { + if archive == nil || a.err != nil { log.WithFields(log.Fields{ "archive_url": url, }).WithError(a.err).Infoln("loading zip archive files into memory failed") @@ -143,7 +144,7 @@ func (a *zipArchive) readArchive(url string) { } // TODO: Improve preprocessing of zip archives https://gitlab.com/gitlab-org/gitlab-pages/-/issues/432 - for _, file := range a.archive.File { + for _, file := range archive.File { if !strings.HasPrefix(file.Name, dirPrefix) { continue } @@ -164,8 +165,10 @@ func (a *zipArchive) readArchive(url string) { a.addPathDirectory(file.Name) } - // recycle memory - a.archive.File = nil + // Each file stores a pointer to the zip.reader. + // The file slice is not used so we null it out + // to reduce memory consumption. + archive.File = nil fileCount := float64(len(a.files)) metrics.ZipOpened.WithLabelValues("ok").Inc() |