4.41

spider-rs/spider4.41Aug 6, 2026by chrislusf

AI Summary

This release focuses heavily on S3 API robustness, specifically regarding versioning, manifest handling, and IAM policy enforcement. It also introduces significant improvements to the Filer's Redis/TLS support and enhances Iceberg table maintenance capabilities.

Key Highlights

  • Enhanced S3 versioning and manifest handling (folding large chunks, tracking ownership).
  • Improved IAM/STS with document-style policies and detailed auditing.
  • Filer improvements including conditional updates, credential handling, and TLS support for Redis.
  • Azure remote storage now supports Entra ID authentication.
  • Iceberg maintenance updates including file counters and schema rejection reporting.

New Features

  • Azure Entra ID authentication
  • Configurable Redis connection settings
  • Iceberg client bucket selection
  • S3 bucket policy ownership tracking

Full Release Notes

## What's Changed

- S3

  - S3: fold large chunk lists into manifest chunks on the direct write path by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10383
  - S3: track manifest blob ownership through multipart completion by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10386
  - s3: stop listing prefixes whose objects are all delete-marked by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10419
  - s3: chunk uploads at the filer's maxMB by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10439
  - s3: require a bucket-policy action to write a bucket policy by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10444
  - s3: apply filer identity changes despite a static config file by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10392
  - s3: register the advertised ip with the master by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10482
  - s3: keep the list marker exclusive for versioned objects by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10496
  - s3: allow copying an object onto itself in a versioned bucket by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10497
  - s3: report a peer that went away as ClientDisconnected, not IncompleteBody by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10511
  - s3: carry storage class in the cached listing metadata by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10516
  - s3: register an identity's inline account instead of collapsing it into admin by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10548
  - s3: honor a bucket owner recorded as an identity by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10567
  - s3: honor the version history of a directory marker by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10571
  - s3: stop treating a directory marker as a versioned object by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10573
  - s3 lifecycle: bound the daily-replay pass so a quiet cluster stops wedging the job by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10578
  - s3: let a suspended-versioning multipart completion replace the null delete marker by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10585
  - s3: retire the suspended null marker only once the PUT has committed by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10589
  - s3: report the effective ownership when a bucket has none stored by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10591
  - s3: give a versioned metadata-only copy its own chunks by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10594
  - \[s3\] force filer apply s3 expiry metadata by @kmlebedev in https://github.com/seaweedfs/seaweedfs/pull/10469
  - chore(weed/s3api): prune dead code by @alrs in https://github.com/seaweedfs/seaweedfs/pull/10462

- IAM and STS

  - s3api: load document-style policies from the advanced IAM config by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10481
  - s3: list the buckets an attached IAM policy grants by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10458
  - s3: keep an admin's role session scoped to the role by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10520
  - s3: audit the assumed-role principal and the STS caller by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10519
  - iam: authorize IAM management actions as IAM actions by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10593

- Iceberg

  - iceberg maintenance: resolve table files from the recorded location by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10418
  - iceberg maintenance: record file counters on the snapshots it commits by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10420
  - s3api/iceberg: report the reason a table schema was rejected by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10473
  - iceberg: read manifest lists that omit the Avro format version by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10475
  - iceberg: let clients select their table bucket as the catalog warehouse by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10549
  - iceberg: withhold the S3 endpoint from credential-vending clients by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10570

- Filer

  - filer: conditional UpdateEntry with a chunk-set write condition by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10382
  - filer: stop an oversized metadata log flush from wedging the change feed by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10430
  - log_buffer: bound the flush queue in bytes, not in copies by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10433
  - filer: reject a proxyChunkId that isn't a well-formed fid by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10436
  - filer: fix credential handling on the proxyChunkId path by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10434
  - filer: drop a caller's jwt query param on a proxied read by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10440
  - filer: add a placement overlay seam for the write path by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10437
  - filer: let a nested path rule turn worm off by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10503
  - fix(filer): stop skipping recent unflushed events on metadata subscription gaps by @kisow in https://github.com/seaweedfs/seaweedfs/pull/10501
  - fix(redis2/redis3): support separate sentinel auth credentials by @TJDawson10 in https://github.com/seaweedfs/seaweedfs/pull/10412
  - filer: honor the documented TLS options in every redis store by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10425
  - filer: make the redis connection settings configurable by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10441
  - Bump Tarantool client library from 2.4.2 to 3.0.0 by @MaratKarimov in https://github.com/seaweedfs/seaweedfs/pull/10377

- Filer sync and replicate

  - filer sync: do not advance the sync offset past a failed event by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10424
  - filer.replicate: acknowledge notifications after the sink write, not on receipt by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10427

- Remote storage

  - azure: authenticate with Entra ID instead of a storage account key by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10456
  - azure: let the blob endpoint be configured by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10460
  - remote storage: actually delete objects when a directory is removed by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10531
  - s3 remote: honor s3.support_tagging in UpdateFileMetadata by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10532

- Volume

  - volume: reject needle blob writes to read-only volumes by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10435
  - volume: widen the gRPC admin gate and stop it drifting by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10443
  - volume: recover .idx rows overwritten by tiered deletes by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10474
  - fix(volume): persist the leveldb needle map watermark at batch boundaries by @SuperMohit in https://github.com/seaweedfs/seaweedfs/pull/10557
  - volume: skip directory fsync on Windows, report a failed makeupDiff by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10572
  - rust volume: mark-readonly notifies the live leader, not the static seed by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10461

- Erasure coding

  - EC decode: read shards with the encode-time block layout by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10385
  - volume: fix EC decode/reconstruct index locality under -dir.idx by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10442
  - volume: EC decode onto a clean peer via staged-new-volume adopt (Go+Rust) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10463
  - volume: skip a shard-holding disk when staging a decoded volume (Go+Rust) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10464
  - volume: scan for on-disk EC shards when staging a decoded volume (Go+Rust) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10465
  - ec.encode: count shards wherever they landed before deleting the source by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10483
  - ec.encode: name the shard ids an aborted deletion found by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10486
  - EC scrubbing: list shards for needles failing scrubs in the result output by @plisandro in https://github.com/seaweedfs/seaweedfs/pull/10510

- Master

  - master: count EC volumes in statistics used size by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10457
  - master: count only writable volumes as crowded when deciding growth by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10522
  - fix(master): bump seaweedfs/raft to v1.2.0 for the snapshot race by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10498

- Shell and placement

  - volume.fix.replication: add a well-placed replica before deleting a misplaced one by @CodeRusher in https://github.com/seaweedfs/seaweedfs/pull/10364
  - exclusive_locks: clear renew-running flag before dropping isLocked by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10413
  - shell: accept a context in the volume move helpers by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10415
  - Fix volume.merge corrupting every needle it copies by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10565
  - shell: add a reusable target picker for volume moves by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10579
  - placement: move the target picker out of the shell package by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10580
  - placement: let callers reject candidates placement cannot judge by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10581
  - shell: pick tier.move replica targets with the shared placement picker by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10582

- Mount

  - mount: version open file handles by filer log position by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10403
  - mount: report data sizes to df with -df.logical by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10459
  - mount: keep a sealed chunk alive until its own upload finishes by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10504
  - mount: drop the unused go-fuse fs package dependency by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10534
  - mount: keep the xattr flag constants off freebsd by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10552
  - mount: build the package on windows by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10535
  - mount: support mounting on Windows through WinFsp by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10536
  - mount: forward extended attributes on windows by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10554
  - mount: tell windows about changes made elsewhere by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10553
  - mount: report . and .. from windows directories by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10556
  - mount: mark windows files archived and ignore a zero timestamp by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10559

- WebDAV

  - webdav: answer PROPFIND child stats from the listing by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10492

- Client

  - wdclient: read the vid map cache link before the live map by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10505
  - wdclient: age vid map entries by generation instead of chaining snapshots by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10506
  - operation: re-assign chunk upload when replica volume is full by @timolow in https://github.com/seaweedfs/seaweedfs/pull/10588
  - consolidate the duplicated transient-error classifiers onto util.IsTransientError by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10429
  - chore(weed/worker): prune unused Registry by @alrs in https://github.com/seaweedfs/seaweedfs/pull/10431

- Admin

  - fix(admin): implement ApplyPluginConfigFromToml to propagate settings by @baracudaz in https://github.com/seaweedfs/seaweedfs/pull/10388

- Helm

  - helm: support fixed nodePort numbers on all-in-one, s3, sftp, and admin services by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10381
  - helm: generate the SFTP host key per install by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10390
  - Do not fail immediately when running the post bucket hook by @kallies in https://github.com/seaweedfs/seaweedfs/pull/10471
  - helm: label the hook Job pods so selectors can reach them by @kreativmonkey in https://github.com/seaweedfs/seaweedfs/pull/10478
  - helm: optional NetworkPolicy per component by @kreativmonkey in https://github.com/seaweedfs/seaweedfs/pull/10479
  - helm: pass extraEnvironmentVars and security.toml to the bucket-creation hook by @kreativmonkey in https://github.com/seaweedfs/seaweedfs/pull/10477

- Telemetry

  - telemetry: tidy server module after prometheus bumps by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10380
  - telemetry: fix empty over-time charts on the built-in dashboard by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10396
  - telemetry: key per-cluster value gauges by cluster_id only by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10397
  - ci: fix Deploy Telemetry Server build (nested telemetry/server module) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10398
  - telemetry: persist server state across restarts by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10399
  - telemetry: per-cluster usage history on the built-in dashboard by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10400
  - telemetry: validate reports on the collect endpoint by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10401
  - telemetry: confirmed-cluster stats (2+ distinct days) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10402
  - telemetry: per-cluster size over time on the dashboard by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10417
  - telemetry: fix total disk usage over time by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10476
  - telemetry: report anonymous cluster stats by default by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10488
  - telemetry: build the over-time charts from confirmed clusters by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10489
  - telemetry: stack volume servers per cluster, drop the total disk usage chart by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10550
  - telemetry: sync the server module with the client_golang bump by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10551

- Tests

  - test(s3): aim collection force-delete at the master the suite actually runs by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10404
  - plugin: fix flaky scheduler lock test by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10432
  - test: stop comparing two JWTs minted a second apart by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10495
  - test: pin that a .vif replication outranks the superblock by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10499
  - test: cover delete idempotency on versioned object-locked buckets by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10512
  - test: pin that an unusable version id is refused, never resolved by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10513
  - test: pin verb parity on lock-arbitration keys through acquire and release by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10514
  - test: compare ListObjects and ListObjectVersions over the same namespace by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10515
  - test: cover listings spanning a run of retracted keys by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10517
  - s3: cover three untested STS paths by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10521
  - test: random needles always carry at least one byte by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10523
  - test: wait for async write-budget release after pipeline shutdown by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10530
  - test: wait for every queued flush before deleting the log files by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10546
  - Stop the filer test helpers from pinning gigabytes of log buffers by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10560
  - test: cover delete-on-close on the windows mount by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10561
  - test(s3): give the copying suite room for a collection per bucket by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10590

- CI

  - Add codespell support with configuration and typo fixes by @yarikoptic in https://github.com/seaweedfs/seaweedfs/pull/10393
  - ci: read branch names from env instead of interpolating them into the shell by @kobihikri in https://github.com/seaweedfs/seaweedfs/pull/10470
  - ci: fix FUSE mounts against the new runner image by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10484
  - ci: harden the fusermount3 repair by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10485
  - ci: run WinFsp's conformance suite against the windows mount by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10555
  - ci: run each conformance test on its own by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10564
  - ci: key the Rust cargo cache on the toolchain that built it by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10568
  - ci: cross-compile each target in its own job by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10575
  - ci: deal volume server tests across shards instead of bucketing by letter by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/10576
## New Contributors
* @yarikoptic made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/10393
* @TJDawson10 made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/10412
* @kobihikri made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/10470
* @kreativmonkey made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/10478
* @SuperMohit made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/10557
* @timolow made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/10588

**Full Changelog**: https://github.com/seaweedfs/seaweedfs/compare/4.40...4.41