Skip to content

perf: parallel Unzip, klauspost/compress zip, modern Go - #36

Open
joshowen wants to merge 1 commit into
leroy-merlin-br:developfrom
joshowen:use-klauspost-compress-for-parallel-zip
Open

perf: parallel Unzip, klauspost/compress zip, modern Go#36
joshowen wants to merge 1 commit into
leroy-merlin-br:developfrom
joshowen:use-klauspost-compress-for-parallel-zip

Conversation

@joshowen

@joshowen joshowen commented May 5, 2026

Copy link
Copy Markdown

Summary

Speeds up cache restore/save by using multiple CPU cores for decompression, switching to a faster zip library, and modernising the Go toolchain.

Changes

Parallel decompression (Unzip)

  • Uses a runtime.NumCPU() worker pool so files are decompressed concurrently
  • Directories are created up-front (single pass) to avoid goroutine races
  • Extracted extractZipFile helper for clarity
  • os.File.ReadAt (used internally by the zip reader) is pread(2)-safe, so concurrent access to the same zip archive fd is correct

Faster zip library (archive/zipgithub.com/klauspost/compress/zip)

  • Drop-in replacement with assembly-optimised deflate routines — faster single-core compress and decompress with no API changes

Bug fixes in Zip

  • filepath.Walk return value was silently discarded; errors during walking are now propagated
  • Walk callback err parameter was immediately shadowed by :=, hiding mid-walk filesystem errors

Modern Go / CI

  • go directive: 1.161.23
  • actions/checkout: v2 → v4
  • actions/setup-go: v2 → v5, go-version: stable
  • Runner images: ubuntu-20.04 / windows-2019latest

- Replace archive/zip with github.com/klauspost/compress/zip for
  faster assembly-optimised deflate on both compress and decompress
- Parallelise Unzip using a runtime.NumCPU() worker pool; each file
  is decompressed concurrently via os.File.ReadAt (pread-safe)
- Pre-create all directories before spawning goroutines to avoid races
- Extract extractZipFile helper for clarity
- Fix Zip: filepath.Walk return value was silently ignored; walk
  errors are now propagated correctly
- Fix Zip: walk callback err parameter was shadowed immediately,
  preventing detection of mid-walk filesystem errors
- Update go directive: 1.16 -> 1.23
- Update CI: actions/checkout@v2->v4, actions/setup-go@v2->v5,
  go-version: stable, ubuntu-20.04/windows-2019 -> latest

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant