Your object-storage gateway just lost its last C codec.
Today we released rs3gw 0.2.1 — a hardening patch that moves compression onto Pure-Rust OxiArc and broadens correctness coverage across Object Lock, RestoreObject, and SSE.
No C. No C++. No Go. No Fortran. rs3gw was already a single static binary speaking the S3 wire protocol without a line of native code in the request path — but until now the storage layer still leaned on the C-backed zstd and lz4 codecs to compress object data. With 0.2.1 that changes: compression is served by COOLJAPAN OxiArc (oxiarc-zstd, oxiarc-lz4, oxiarc-deflate), closing another C dependency in the storage path. The result is the same Zstd and LZ4 behavior on the wire, now sovereign, auditable, and built from Rust source you can read end to end.
Why 0.2.1 matters
This is a small, focused patch — but it carries one genuinely strategic change and several pieces of hardening:
- Compression is now Pure Rust. The storage layer no longer links the C-backed
zstd,lz4_flex, orflate2crates. It compresses object data throughoxiarc-zstd,oxiarc-lz4, andoxiarc-deflate(all 0.2.8). Same Zstd/LZ4 semantics, no native codec — a real supply-chain and sovereignty win. - Hardened test coverage. The suite now stands at 961 tests, with comprehensive new tests for S3 Object Lock, RestoreObject, and SSE operations — the areas where correctness matters most.
- OpenTelemetry conflict resolved. The
opentelemetry*stack was downgraded from 0.32 to 0.31 to align withtracing-opentelemetry0.32.x (which internally targets opentelemetry 0.31.x), so tracing builds cleanly again. - Dependency modernization. Upgraded to
scirs2-io0.4.4,quick-xml0.40,parquet/arrow58.x, andazure_core1.0.
Technical Deep Dive
OxiArc compression in the storage layer. Object compression lives in src/storage/. Where the gateway previously handed bytes to the C zstd/lz4 codecs, it now routes them through OxiArc — oxiarc-zstd for the zstd:N levels, oxiarc-lz4 for fast LZ4, and oxiarc-deflate for deflate-class needs. The codec selection driven by RS3GW_COMPRESSION is unchanged from the caller’s perspective; only the implementation underneath moved to Pure Rust.
Correctness coverage for retention and encryption. S3 Object Lock (both GOVERNANCE and COMPLIANCE modes), RestoreObject, and server-side encryption are the features where a subtle bug is least acceptable. The new tests exercise these paths directly. Object Lock and SSE live under src/storage (encryption in src/storage/encryption.rs) and src/api; the added tests cover lock retention semantics, restore flows, and SSE round-trips.
Observability alignment. Tracing is wired in src/observability/tracing.rs. The OpenTelemetry version pin to 0.31 keeps that module compiling against tracing-opentelemetry 0.32.x without the dependency resolver fighting over incompatible OTel majors.
Getting Started
rs3gw is a server. Build it and run it:
git clone https://github.com/cool-japan/rs3gw.git
cd rs3gw
git checkout v0.2.1
cargo build --release
./target/release/rs3gw
Configure it through the environment:
export RS3GW_BIND_ADDR="0.0.0.0:9000"
export RS3GW_STORAGE_ROOT="./data"
export RS3GW_ACCESS_KEY="minioadmin"
export RS3GW_SECRET_KEY="minioadmin"
export RS3GW_COMPRESSION="zstd:3" # now served by OxiArc (oxiarc-zstd) under the hood
Then talk to it with the standard AWS CLI — point --endpoint-url at port 9000:
aws --endpoint-url http://localhost:9000 s3 cp data.csv s3://my-bucket/ # stored & compressed via OxiArc
aws --endpoint-url http://localhost:9000 s3 ls s3://my-bucket/
Objects written through this path are compressed by OxiArc — no C codec involved.
What’s New in 0.2.1
- Compression migrated to OxiArc —
oxiarc-zstd0.2.8,oxiarc-lz40.2.8, andoxiarc-deflate0.2.8 replace the C-backedzstd/lz4_flex/flate2crates in the storage layer. - 961 tests — comprehensive new coverage for S3 Object Lock, RestoreObject, and SSE operations.
- Dependency bumps —
scirs2-core/scirs2-ioto 0.4.4,quick-xmlto 0.40,parquet/arrowto 58.x, andazure_coreto 1.0. - OpenTelemetry fix —
opentelemetry*aligned to 0.31 to matchtracing-opentelemetry0.32.x, resolving a version conflict. - Smoke-test workflow reintroduced — the integration smoke test workflow is back (as
.disabled).
Tips
-
Your compression config didn’t change.
RS3GW_COMPRESSION="zstd:3"orRS3GW_COMPRESSION="lz4"still work exactly as before — they’re just backed by Pure-Rust OxiArc now, with no C codec dependency in your build. -
Pinning OpenTelemetry downstream? If your build pins
opentelemetry*explicitly, match 0.31.x to avoid the version conflict this release fixes:opentelemetry = "0.31" -
Use the new tests as a reference. The added Object Lock, SSE, and RestoreObject tests are a good template for exercising those features against a local instance before you depend on them in production.
-
Rebuild from
v0.2.1for S3 Select. The modernizedparquet/arrow58.x stack ships in this tag, so a fresh build picks up the updated columnar/S3 Select path.
This is the foundation
rs3gw fits into the COOLJAPAN ecosystem: it is built on scirs2-io and SciRS2, and as of 0.2.1 it compresses through OxiArc — the COOLJAPAN Pure-Rust compression toolkit — alongside siblings like SciRS2, NumRS2, OptiRS, PandRS, OxiBLAS, OxiCode, and OxiZ. Every layer that touches your bytes is Rust you can audit.
Repository: https://github.com/cool-japan/rs3gw
Star the repo if a Pure-Rust S3 gateway with no native codec dependency belongs in your stack. Sovereign storage, all the way down.
— KitaSan at COOLJAPAN OÜ May 16, 2026