Skip to content

v0.22.0

Latest

Choose a tag to compare

@github-actions github-actions released this 15 Nov 22:24
· 1 commit to main since this release

This release is mostly about performance: backup and restore now use far less memory, and backup is faster and uses less CPU. It also changes how hook commands receive values, which is a breaking change (see below).

Backup tool benchmark: 49 GiB / 367k files

Benchmark vs v0.21.1

Dataset: 49 GiB in 367k files, backed up to a local repository, same zstd level for every tool, mean of 5 runs.

v0.21.1 v0.22.0 Change
Backup duration 72.4 s 58.4 s −19%
Backup throughput 695 MiB/s 862 MiB/s +24%
Backup CPU time 223 s 176 s −21%
Backup peak memory 332 MiB 173 MiB −48%
Restore duration 73.1 s 74.8 s ±0 (within noise)
Restore CPU time 90 s 83 s −8%
Restore peak memory 236 MiB 84 MiB −64%

Repository size is unchanged (19.7 GB). These numbers cover local repositories only. Network backends (SFTP, S3, REST server) are the focus of the next release.

⚠️ Breaking change

  • Hooks: values are now passed only through environment variables. Placeholders like {error}, {repository}, {label}, {command}, {source_label} and {source_path} were substituted into the command text, which was unsafe in some quoting contexts (an error message containing $(...) could be executed). A config whose hooks still use them is rejected at load. Use the matching variable in double quotes instead, e.g. "$VYKAR_ERROR" ($env:VYKAR_ERROR in PowerShell). The VYKAR_* variables are now always set, empty when there is no value. (603b5fb)

Performance

Backup

  • Stream-decode the chunk index and file cache instead of buffering them whole; pre-size decoded maps (81768a7, c8617ce)
  • Release the loaded file cache after the walk, and keep cached entries for unchanged files instead of copying them (2b797ae, fae9976)
  • Build the dedup xor filter after dropping the chunk index; confirm filter hits in the worker instead of keeping raw chunks (eb50ae0, 6a2b1bf)
  • Hydrate the chunk index after saving the file cache; drop index blob copies after the fast-path compare (7a87774, 4a9d3cd)
  • Record refcount bumps for cached chunks by dedup-cache position (04121ee)
  • Local repositories: stream data packs to a temp file and bound queued pack uploads by bytes (5e60c7b, 4dde724)
  • Chunker scans the buffered window instead of compacting before every cut (8fcf0eb)
  • Batch no-read walk entries to the consumer; byte-level path prefix checks in the walk and file cache (b43ff9f, ed2e285)
  • Buffer streaming zstd writes of metadata blobs; cheaper small reads in the streaming metadata decoder (fffae8a, 4562f3d)
  • Map the Argon2 work buffer directly from the OS (2baac99)

Restore

  • Stream read groups blob by blob instead of buffering the whole range (3c175d0)
  • Decrypt chunks in place and reuse the write accumulator (fb75c46)
  • Resolve data chunks through the restore cache (f538e88)
  • Decode the item stream lazily instead of holding it in memory (42babd2)
  • Leaner restore plan: boxed xattrs, exact-size paths, exactly sized read groups, shared directory paths, and read groups freed once their worker is done (943adac, 5f0740d, f4ddfda, a513ed3, b4e98b6)

Features

  • vykar restore --continue-on-error salvages intact files from a damaged repository. Files whose data can't be read or decoded are skipped and listed on stderr, and the exit code is 3. Everything written to the destination is still fully verified. The default stays strict. (c84208d)

Bug Fixes

  • Lock: repository lock is exclusive without relying on clocks (aec05da)
  • Plaintext repos: verify chunk IDs on every read (cac7f5d)
  • SFTP: upload atomically and verify packs during journal recovery (adc4103)
  • Restore: create each file leaf once and never follow a leaf symlink (8942f8a)
  • Backup: continue past a failing source in multi-source runs (c030094)
  • Backup: upload packs before taking the commit lock (c248cd3)

Docs & Testing

  • Restructured user guide and corrected technical inaccuracies (3042e1f)
  • README and docs index lead with the benchmark (46826e7)
  • mem-ab RSS comparison harness with backup, incremental and restore workloads (53c1698, b9d835e)
  • Cron delay tests no longer depend on the wall clock (ac8dd64)

Updating

To update to the latest version, run:

curl -fsSL https://vykar.borgbase.com/install.sh | sh

See the quickstart guide for other install options.

Downloads

Platform Artifact
Linux x86_64 (gnu) vykar-v0.22.0-x86_64-unknown-linux-gnu.tar.gz
Linux x86_64 (musl) vykar-v0.22.0-x86_64-unknown-linux-musl.tar.gz
Linux aarch64 (gnu) vykar-v0.22.0-aarch64-unknown-linux-gnu.tar.gz
Linux aarch64 (musl) vykar-v0.22.0-aarch64-unknown-linux-musl.tar.gz
macOS aarch64 vykar-v0.22.0-aarch64-apple-darwin.tar.gz
Windows x86_64 vykar-v0.22.0-x86_64-pc-windows-msvc.zip
GUI (AppImage) vykar-gui-v0.22.0-x86_64.AppImage

SHA256 digests are shown next to each asset on this release page.