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 withLEBLOB_and metrics withleblob_, and the Docker image runs as the userleblob. 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-datemust parse, signedaws-chunkedbodies are refused where there is no signature to chain from, and a deeply nested form policy is rejected. - A CORS answer says
Vary: Originwhen 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.mdsays 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.pycompares speed ands3-testscoverage 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 backupandtheblob restorefor the metadata, Prometheus metrics at/-/metrics, and aDockerfile.- A check that
rclone syncmoves 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 grantandkey revoke, with the levels read, write and admin. Existing keys keep full access.
Changed¶
servedefaults 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.