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