Skip to content

Changelog

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[0.4.0] - unreleased

Changed

  • The project is renamed leBLOB. The package and the command become leblob, environment variables start with LEBLOB_ and metrics with leblob_, and the Docker image runs as the user leblob. Objects stored with SSE-C by an earlier version can no longer be read.
  • Writes queued in a worker share one commit, each in a savepoint of its own, and none is acknowledged before that commit is durable. At 32 clients, small PUTs about double.
  • What the server can't honour is refused rather than dropped: an ACL grant to another account, and copy, tag, ACL and encryption key headers on a route that doesn't use them. A bad encryption key header gets a 400.
  • Checks are stricter: a form upload's x-amz-date must parse, signed aws-chunked bodies are refused where there is no signature to chain from, and a deeply nested form policy is rejected.
  • A CORS answer says Vary: Origin when the bucket has rules and none matches, so caches don't serve one origin's answer to another.

Testing

  • The power-loss test runs a control, a build that never syncs a blob's file, and passes only if it catches lost writes on every filesystem. CI runs it on every push. tests/power/README.md says how to run and read these tests.
  • A test that writes sharing a commit aren't acknowledged before it, which fails every time on a build that does.
  • tests/bench/run_comparison.py compares speed and s3-tests coverage with MinIO and Garage.

[0.3.0] - 2026-11-07

Added

  • Several volumes on one server, with a number of copies, read failover, background repair and scrub, and draining a volume.
  • Versioning, lifecycle rules, object tags, UploadPartCopy, CORS, canned ACLs with anonymous reads, form uploads signed with SigV4, and SSE-C.
  • theblob backup and theblob restore for the metadata, Prometheus metrics at /-/metrics, and a Dockerfile.
  • A check that rclone sync moves a bucket from MinIO and Garage, and a sample store from each release that later ones have to open.
  • Licensed under Apache-2.0.
  • Per-key, per-bucket permissions: theblob key create --scoped, key grant and key revoke, with the levels read, write and admin. Existing keys keep full access.

Changed

  • serve defaults to the number of CPUs, 4 at most, for workers. Each takes about 30 MiB, and writes gain nothing from more.
  • The data format is upgraded when a newer version starts, and can't then be read by an older one. Back up first with theblob backup.

Fixed

  • A read on a worker that has none of its volumes answers 503 before any headers, rather than a 200 that then breaks.
  • A failed connection no longer breaks a worker, and a worker starts and recovers on a full disk.
  • Concurrent writers queue on a kernel lock instead of SQLite's sleep-and-retry. With 8 clients on one test disk, p99 fell from about 1.4 s to about 340 ms for deletes and from about 1.8 s to about 780 ms for small PUTs, and rates rose, but median latency roughly doubled.
  • A delimiter listing read up to 1000 rows per common prefix and used one. A page of 100 prefixes now takes under 2 ms, where it took about 100 ms in a bucket of 100,000 keys.

Documentation

  • Presigned URLs from boto3 need signature_version="s3v4": its default, SigV2, is refused.