1.0.0-rc.3
Pre-release
rustfs/rustfs1.0.0-rc.3Aug 21, 2026by github-actions[bot]
AI Summary
Enhancements to site replication, KMS integration, and scanner observability. This release adds Kubernetes auth for Vault and a SigV4-signed admin client.
Key Highlights
- Lifted rejoined site edit counters in site replication.
- Added Kubernetes auth support for Vault KMS.
- Implemented SigV4-signed admin client for heal and scanner APIs.
- Exposed prefix-level bucket usage via admin API.
New Features
- Site replication edit counter lifting
- KMS Kubernetes auth
- Admin SigV4 signed client
- Scanner prefix-level bucket usage API
- Helm TLSRoute passthrough support
Full Release Notes
<!-- rustfs-generated-release-notes: managed; remove this marker before manual edits --> ## What's Changed * fix(site-replication): lift a rejoined site's restarted edit counter over stale marks by @reatang in https://github.com/rustfs/rustfs/pull/6119 * fix(ci): pin Docker images to release source by @overtrue in https://github.com/rustfs/rustfs/pull/6121 * test(utils): allow ephemeral port reuse by @overtrue in https://github.com/rustfs/rustfs/pull/6122 * fix(scanner): add context to corrupt metadata logs by @marshawcoco in https://github.com/rustfs/rustfs/pull/6099 * feat(ecstore): report inline early-stop miss reasons by @houseme in https://github.com/rustfs/rustfs/pull/6134 * feat(table-catalog): finalize Iceberg REST behavior by @marshawcoco in https://github.com/rustfs/rustfs/pull/6072 * fix(admin): serialize replication metrics in minio-go wire shapes by @reatang in https://github.com/rustfs/rustfs/pull/6127 * fix(site-replication): merge incoming ILM expiry documents instead of overwriting by @reatang in https://github.com/rustfs/rustfs/pull/6130 * fix(admin): stream madmin ReplicationMRF documents from /v3/replication/mrf by @reatang in https://github.com/rustfs/rustfs/pull/6126 * fix(replication): transport and persist LWW timestamps for tag, retention, and legal hold by @reatang in https://github.com/rustfs/rustfs/pull/6129 * perf(ecstore): defer pending inline data shards by @houseme in https://github.com/rustfs/rustfs/pull/6137 * fix(ecstore): classify remote inline early-stop misses by @overtrue in https://github.com/rustfs/rustfs/pull/6136 * fix(ecstore): overlap metacache reader deadlines by @marshawcoco in https://github.com/rustfs/rustfs/pull/6098 * fix(heal): preserve timeout budget across retries by @marshawcoco in https://github.com/rustfs/rustfs/pull/6101 * fix(ecstore): mint bucket-target ARNs in the madmin arn:minio partition by @reatang in https://github.com/rustfs/rustfs/pull/6128 * chore(ecstore): drop the client dead_code blanket by @overtrue in https://github.com/rustfs/rustfs/pull/6138 * chore(deps): update flake.lock by @houseme in https://github.com/rustfs/rustfs/pull/6142 * fix(storage): skip table guards for multipart parts by @overtrue in https://github.com/rustfs/rustfs/pull/6143 * perf(ecstore): enable inline data read early-stop by default by @houseme in https://github.com/rustfs/rustfs/pull/6140 * chore(ecstore): drop the disk dead_code blanket by @overtrue in https://github.com/rustfs/rustfs/pull/6139 * chore(ecstore): drop the set_disk dead_code blanket by @overtrue in https://github.com/rustfs/rustfs/pull/6141 * chore(ecstore): drop the bucket dead_code blanket by @overtrue in https://github.com/rustfs/rustfs/pull/6147 * test(interop): let the MinIO fixture lab build from registry mirrors by @overtrue in https://github.com/rustfs/rustfs/pull/6148 * chore: drop the remaining product-code dead_code blankets by @overtrue in https://github.com/rustfs/rustfs/pull/6149 * fix(ecstore): silence two dead_code warnings left on main by @overtrue in https://github.com/rustfs/rustfs/pull/6153 * chore(ecstore): annotate the two dead fns the blanket removals missed by @overtrue in https://github.com/rustfs/rustfs/pull/6152 * test(tier): pin the compressed transitioned read against its stored bytes by @overtrue in https://github.com/rustfs/rustfs/pull/6151 * test(ecstore): add metadata slow-tail fault hook by @houseme in https://github.com/rustfs/rustfs/pull/6150 * feat(ecstore): default bounded metadata fanout by @houseme in https://github.com/rustfs/rustfs/pull/6156 * fix(table-catalog): assign fresh schema IDs on create by @marshawcoco in https://github.com/rustfs/rustfs/pull/6146 * fix(scanner): canonicalize temp_dir for drive field assertion on macOS by @overtrue in https://github.com/rustfs/rustfs/pull/6159 * chore(protocols): drop 43 no-op dead_code allows from swift by @overtrue in https://github.com/rustfs/rustfs/pull/6157 * refactor(rustfs): move module switches below the layer boundary by @overtrue in https://github.com/rustfs/rustfs/pull/6154 * fix(ecstore): resolve nine unused bindings in set_disk write and heal paths by @overtrue in https://github.com/rustfs/rustfs/pull/6158 * fix(table-catalog): prevent object catalog lock reentry by @marshawcoco in https://github.com/rustfs/rustfs/pull/6144 * ci(arch): ratchet ecstore module-level lint blankets by @overtrue in https://github.com/rustfs/rustfs/pull/6155 * perf(io-metrics): avoid get handoff label allocations by @houseme in https://github.com/rustfs/rustfs/pull/6160 * perf(get): avoid memory body stream wrapper by @houseme in https://github.com/rustfs/rustfs/pull/6163 * chore(obs): adjudicate 19 bare dead_code allows by @overtrue in https://github.com/rustfs/rustfs/pull/6162 * chore: adjudicate 19 bare dead_code allows across six leaf crates by @overtrue in https://github.com/rustfs/rustfs/pull/6161 * feat(site-replication): drain the retry queue from the reconcile tick by @reatang in https://github.com/rustfs/rustfs/pull/6131 * fix(kms): resolve Vault auth from the environment at startup and add Kubernetes auth by @reatang in https://github.com/rustfs/rustfs/pull/6095 * feat(ecstore): pin bitrot algorithms with a startup self-test (HS-11) by @houseme in https://github.com/rustfs/rustfs/pull/6165 * feat(madmin): add a SigV4-signed admin client for heal and scanner APIs (HS-05) by @houseme in https://github.com/rustfs/rustfs/pull/6166 * docs(ecstore): fix bitrot comment typo by @houseme in https://github.com/rustfs/rustfs/pull/6168 * fix(site-replication): admit only verifiable peer-edit fences by @reatang in https://github.com/rustfs/rustfs/pull/6123 * feat(scanner): expose prefix-level bucket usage via admin API (HS-08) by @houseme in https://github.com/rustfs/rustfs/pull/6171 * feat(helm): add TLSRoute passthrough support for gateway api by @majinghe in https://github.com/rustfs/rustfs/pull/6169 * chore(ecstore): adjudicate 32 bare dead_code allows by @overtrue in https://github.com/rustfs/rustfs/pull/6173 * feat(heal): add progress and trace observability by @houseme in https://github.com/rustfs/rustfs/pull/6179 * feat(scanner): emit excess alerts as S3 notification events (HS-04) by @houseme in https://github.com/rustfs/rustfs/pull/6176 * fix(ecstore): describe peer bucket RPC failures with no details by @overtrue in https://github.com/rustfs/rustfs/pull/6190 * test(heal): lock heal vs delete/overwrite race invariants (HS-12) by @houseme in https://github.com/rustfs/rustfs/pull/6183 * chore(deps): refresh cargo dependencies by @houseme in https://github.com/rustfs/rustfs/pull/6198 * feat(storage): add default-off PUT admission gate by @houseme in https://github.com/rustfs/rustfs/pull/6197 * refactor(admin): route kms management auth through shared gate by @overtrue in https://github.com/rustfs/rustfs/pull/6194 * chore(storage): drop dead io-schedule metrics and helpers by @overtrue in https://github.com/rustfs/rustfs/pull/6199 * feat(heal): wire MRF intents with durable repair journal (HS-01) by @houseme in https://github.com/rustfs/rustfs/pull/6189 * chore: adjudicate 26 bare dead_code allows across five crates by @overtrue in https://github.com/rustfs/rustfs/pull/6187 * chore(storage): drop dead backpressure and lock-optimizer wrappers by @overtrue in https://github.com/rustfs/rustfs/pull/6195 * fix(ecstore): give peer REST failures op and bucket context by @overtrue in https://github.com/rustfs/rustfs/pull/6200 * ci(package): auto-trigger DEB/RPM packaging on releases and upload to GitHub release assets by @majinghe in https://github.com/rustfs/rustfs/pull/6202 * refactor: import x-amz-checksum header names from the shared constants by @overtrue in https://github.com/rustfs/rustfs/pull/6193 * fix(admin): classify missing kms config by error variant by @overtrue in https://github.com/rustfs/rustfs/pull/6196 * fix(ecstore): resume remote shard reads once by @cxymds in https://github.com/rustfs/rustfs/pull/6091 * fix(lock): reap expired local lease guards by @cxymds in https://github.com/rustfs/rustfs/pull/6094 * fix(ecstore): single-flight remote disk recovery by @cxymds in https://github.com/rustfs/rustfs/pull/6096 * feat(heal): incremental status cursors and typed overlap policy (HS-06) by @houseme in https://github.com/rustfs/rustfs/pull/6206 * chore(io-core): drop eight zero-consumer modules by @overtrue in https://github.com/rustfs/rustfs/pull/6201 * fix(deps): record heal's bytes and crc-fast in the lockfile by @overtrue in https://github.com/rustfs/rustfs/pull/6211 * test(e2e): drop 187 no-op serial markers from the three densest e2e suites by @overtrue in https://github.com/rustfs/rustfs/pull/6209 * feat(ecstore): instrument rename sync tail metrics by @houseme in https://github.com/rustfs/rustfs/pull/6205 * chore(zip): trim the unused extract and create surface by @overtrue in https://github.com/rustfs/rustfs/pull/6210 * test(lifecycle,scanner): drop 47 no-op #[serial] markers (backlog#1846 T1) by @overtrue in https://github.com/rustfs/rustfs/pull/6213 * test(admin): replace a source-text guard with a behavior test by @overtrue in https://github.com/rustfs/rustfs/pull/6212 * feat(app): add opt-in small GET body once path by @houseme in https://github.com/rustfs/rustfs/pull/6216 * test(io-metrics): assert record helper emissions; fix census heuristic by @overtrue in https://github.com/rustfs/rustfs/pull/6217 * feat(replication): split oversized hot-path functions, proxy unreplicated reads, and fail SSE-C passthrough closed by @reatang in https://github.com/rustfs/rustfs/pull/6170 * test(kms): move the Vault KV2 doc guard into check_fips_wording.sh by @overtrue in https://github.com/rustfs/rustfs/pull/6215 * test(e2e): pin bounded physical reads for compressed multipart range GETs by @reatang in https://github.com/rustfs/rustfs/pull/6167 * chore(deps): update s3s to upstream main by @GatewayJ in https://github.com/rustfs/rustfs/pull/6203 * perf(ecstore): validate local IO paths with openat2 by @houseme in https://github.com/rustfs/rustfs/pull/6221 * fix(e2e): import serial test attribute by @houseme in https://github.com/rustfs/rustfs/pull/6222 * fix(package): declare /etc/default/rustfs as a deb conffile by @majinghe in https://github.com/rustfs/rustfs/pull/6220 * perf(get): emit accept-ranges with static header by @houseme in https://github.com/rustfs/rustfs/pull/6225 * fix(e2e): add missing serial_test import in replication_extension_test by @overtrue in https://github.com/rustfs/rustfs/pull/6224 * feat(ecstore): add default-off dst dir fsync group commit by @houseme in https://github.com/rustfs/rustfs/pull/6226 * docs(architecture): describe io-core by its surviving surface by @overtrue in https://github.com/rustfs/rustfs/pull/6227 * fix(ecstore): group inline dst dir fsync by @houseme in https://github.com/rustfs/rustfs/pull/6228 * fix(sse): read objects that MinIO encrypted by @overtrue in https://github.com/rustfs/rustfs/pull/6191 * fix(ecstore): make the data-usage cache load actually retry by @overtrue in https://github.com/rustfs/rustfs/pull/6229 * test(heal): cover privileged mount readiness by @houseme in https://github.com/rustfs/rustfs/pull/6231 * perf(server): skip output layer work on common GET paths by @houseme in https://github.com/rustfs/rustfs/pull/6232 * test(e2e): fold eleven post-object accept cases into one table-driven test by @overtrue in https://github.com/rustfs/rustfs/pull/6207 * fix(ecstore): classify a missing data-usage cache by the error that arrives by @overtrue in https://github.com/rustfs/rustfs/pull/6233 * fix(package): write release checksum entries with GitHub asset names by @majinghe in https://github.com/rustfs/rustfs/pull/6234 * test(io-metrics): assert what the remaining smoke tests only called by @overtrue in https://github.com/rustfs/rustfs/pull/6238 * refactor(data-usage): own SizeSummary once, with the scanner's semantics by @overtrue in https://github.com/rustfs/rustfs/pull/6237 * test(crypto): replace the one-file key scan with a repo-wide guard by @overtrue in https://github.com/rustfs/rustfs/pull/6246 * test(io-schedule): drop 24 no-op serial markers from the IO scheduler unit tests by @overtrue in https://github.com/rustfs/rustfs/pull/6243 * test(ecstore): assert the error conversions, and stop the census over-reporting by @overtrue in https://github.com/rustfs/rustfs/pull/6241 * test(e2e): drop 79 no-op serial markers from six more suites by @overtrue in https://github.com/rustfs/rustfs/pull/6239 * fix(admin): report refreshed lock lease TTLs by @cxymds in https://github.com/rustfs/rustfs/pull/6230 * refactor(app): resolve the bucket default SSE in one place by @overtrue in https://github.com/rustfs/rustfs/pull/6236 * fix(site-replication): clear pending_remove on join, surface failures by @reatang in https://github.com/rustfs/rustfs/pull/6244 * test(audit,heal): assert three more smoke tests by @overtrue in https://github.com/rustfs/rustfs/pull/6248 * docs(scanner): record heal/scanner MinIO parity decisions (backlog#1878 HS-14/16/18) by @houseme in https://github.com/rustfs/rustfs/pull/6250 * test(crypto): replace the one-file key scan with a repo-wide guard by @overtrue in https://github.com/rustfs/rustfs/pull/6255 * chore(rustfs): adjudicate all 73 bare dead_code allows by @overtrue in https://github.com/rustfs/rustfs/pull/6254 * refactor(heal,scanner): clean up dead heal/scanner code, flags, and metrics (HS-09/10/19/20) by @houseme in https://github.com/rustfs/rustfs/pull/6256 * refactor(admin): route plugin handler auth through authorize_admin_request by @overtrue in https://github.com/rustfs/rustfs/pull/6247 * docs(operations): land the heal/scanner MinIO audit baseline with closure results (backlog#1862) by @houseme in https://github.com/rustfs/rustfs/pull/6258 * test(lifecycle): cover noncurrent marker cleanup cascade by @cxymds in https://github.com/rustfs/rustfs/pull/6252 * docs(operations): add an English counterpart of the heal/scanner audit baseline by @houseme in https://github.com/rustfs/rustfs/pull/6261 * feat(ecstore): expose rename sync tail metrics by @houseme in https://github.com/rustfs/rustfs/pull/6257 * chore(rustfs): adjudicate the remaining 36 bare dead_code allows by @overtrue in https://github.com/rustfs/rustfs/pull/6259 * refactor(sse): keep one bucket-default algorithm mapping for every writer by @overtrue in https://github.com/rustfs/rustfs/pull/6251 * feat(io-metrics): attribute ReadVersion RPC stages by @houseme in https://github.com/rustfs/rustfs/pull/6262 * fix(lock): reject stale lease snapshots by @cxymds in https://github.com/rustfs/rustfs/pull/6249 * docs(operations): restore the truncated tail of the English audit baseline by @houseme in https://github.com/rustfs/rustfs/pull/6268 * feat(helm): add istio gateway class support by @majinghe in https://github.com/rustfs/rustfs/pull/6264 * fix(metrics): remove duplicate scanner counter producers by @marshawcoco in https://github.com/rustfs/rustfs/pull/6245 * docs(admin): pin two authorization semantics against a dedup rewrite by @overtrue in https://github.com/rustfs/rustfs/pull/6279 * chore(protocols): narrow the SessionDiag blanket to its one unread field by @overtrue in https://github.com/rustfs/rustfs/pull/6266 * refactor(heal): remove the dead MRF heal-type path by @houseme in https://github.com/rustfs/rustfs/pull/6275 * fix(scripts): stop the assertless-test census truncating bodies at string braces by @overtrue in https://github.com/rustfs/rustfs/pull/6280 * fix(admin): pass the real RemoteAddr so aws:SourceIp reaches policy evaluation by @overtrue in https://github.com/rustfs/rustfs/pull/6273 * fix(madmin): send background-heal status over POST by @houseme in https://github.com/rustfs/rustfs/pull/6270 * chore(common): drop dead rule helpers and the s3s dependency by @houseme in https://github.com/rustfs/rustfs/pull/6271 * fix(heal): stop O(window) memmove in the heal result window by @houseme in https://github.com/rustfs/rustfs/pull/6272 * perf(scanner): cut per-object allocations in the scan hot path by @houseme in https://github.com/rustfs/rustfs/pull/6274 * refactor(admin): route observability handler auth through the shared gate by @overtrue in https://github.com/rustfs/rustfs/pull/6263 * fix(ecstore): classify decommission stage failures by type, not by message by @overtrue in https://github.com/rustfs/rustfs/pull/6269 * feat(heal,scanner): best-effort repaired notices from the MRF consumer by @houseme in https://github.com/rustfs/rustfs/pull/6283 * perf(heal,scanner): single-flight MRF producers per detection event by @houseme in https://github.com/rustfs/rustfs/pull/6282 * chore: adjudicate the last 18 bare dead_code allows in the library crates by @overtrue in https://github.com/rustfs/rustfs/pull/6265 * feat(connect): add device identity store and registration proof by @overtrue in https://github.com/rustfs/rustfs/pull/6267 * fix(get): name the failing object on mid-stream GET body failures by @reatang in https://github.com/rustfs/rustfs/pull/6284 * refactor(scanner): split remote_scanner.rs into stream child module by @houseme in https://github.com/rustfs/rustfs/pull/6289 * refactor(heal): split resume.rs into focused child modules by @houseme in https://github.com/rustfs/rustfs/pull/6290 * refactor(scanner): split scanner_io.rs into child modules by @houseme in https://github.com/rustfs/rustfs/pull/6294 * refactor(scanner): split data_usage_define persistence and tests by @houseme in https://github.com/rustfs/rustfs/pull/6292 * chore(deps): bump datafusion to 55.0.0 by @houseme in https://github.com/rustfs/rustfs/pull/6288 * refactor(heal): split task.rs per heal kind by @houseme in https://github.com/rustfs/rustfs/pull/6293 * feat(ecstore): batch small file fdatasync commits by @houseme in https://github.com/rustfs/rustfs/pull/6297 * fix(tier): recover multi-committed mutation intents by @cxymds in https://github.com/rustfs/rustfs/pull/6296 * feat(ecstore): expose fdatasync group wait metrics by @houseme in https://github.com/rustfs/rustfs/pull/6299 * fix(lifecycle): safely expire all object versions by @cxymds in https://github.com/rustfs/rustfs/pull/6291 * test(ecstore): pin rename quorum tail visibility by @houseme in https://github.com/rustfs/rustfs/pull/6301 * refactor(scanner): split scanner_folder item actions and ledger by @houseme in https://github.com/rustfs/rustfs/pull/6302 * refactor(heal): split manager.rs queue/scheduler/scan children by @houseme in https://github.com/rustfs/rustfs/pull/6303 * perf(server): cache HTTP metric handles by @houseme in https://github.com/rustfs/rustfs/pull/6304 * refactor(scanner): split scanner.rs cycle/leadership/persist children by @houseme in https://github.com/rustfs/rustfs/pull/6305 * feat(ecstore): add default-off rename early ack probe by @houseme in https://github.com/rustfs/rustfs/pull/6306 * perf(heal): trim scanner and heal queue hot paths by @houseme in https://github.com/rustfs/rustfs/pull/6307 * fix(heal): emit MRF repair notices on completion by @houseme in https://github.com/rustfs/rustfs/pull/6309 * perf(heal): reduce scheduler skip heap churn by @houseme in https://github.com/rustfs/rustfs/pull/6311 * feat(ecstore): observe put commit lock wait by @houseme in https://github.com/rustfs/rustfs/pull/6310 * chore(release): prepare 1.0.0-rc.3 by @overtrue in https://github.com/rustfs/rustfs/pull/6308 * feat(obs): complete metric dimension coverage by @houseme in https://github.com/rustfs/rustfs/pull/6314 * refactor(heal): prune statistics label helpers by @houseme in https://github.com/rustfs/rustfs/pull/6312 * feat(ecstore): bound put commit lock admission by @houseme in https://github.com/rustfs/rustfs/pull/6315 * fix(scanner): honor explicit cycle cadence by @marshawcoco in https://github.com/rustfs/rustfs/pull/6313 * fix(webdav): allow bucket-scoped root listings by @GatewayJ in https://github.com/rustfs/rustfs/pull/6298 * test(obs): add metric dimension smoke harness by @houseme in https://github.com/rustfs/rustfs/pull/6316 * perf(io-metrics): cache read version metric handles by @houseme in https://github.com/rustfs/rustfs/pull/6317 * perf(scanner): reduce per-object allocation churn by @houseme in https://github.com/rustfs/rustfs/pull/6318 * fix: resolve release-blocking integration failures by @overtrue in https://github.com/rustfs/rustfs/pull/6320 * test: stabilize release-blocking full E2E checks by @overtrue in https://github.com/rustfs/rustfs/pull/6322 * feat(ecstore): observe PUT commit lock admission by @houseme in https://github.com/rustfs/rustfs/pull/6319 * docs(agents): run adversarial review before pre-pr by @cxymds in https://github.com/rustfs/rustfs/pull/6325 * fix(lifecycle): honor bucket default retention by @marshawcoco in https://github.com/rustfs/rustfs/pull/6324 **Full Changelog**: https://github.com/rustfs/rustfs/compare/1.0.0-rc.2...1.0.0-rc.3