Skip to content

Release history

seaweedfs releases

SeaweedFS is a distributed storage system for object storage (S3), file systems, and Iceberg tables, designed to handle billions of files with O(1) disk access and effortless horizontal scaling.

All releases

23 shown

No immediate action
4.31 New feature

S3, Admin, Terraform, Volume, EC, Shell, Filer, Master, Rust

Review required
4.30 Mixed
Auth Breaking upgrade

S3 security + health probes + module fixes

No immediate action
4.29 New feature

Admin, S3, Fuse, Misc

No immediate action
4.28 Bug fix

S3 API, EC shards, Filer, Samba/FUSE, Helm

Review required
4.27 Mixed
Auth RBAC

Mount, S3 API, Volume, Admin, Filer

Config change
4.26 Bug fix
Auth

EC blanket-clean

Review required
4.25 Bug fix
Auth

Admin UI fix

Upgrade now
4.24 Breaking risk
Breaking upgrade

EC planning + admin auth

4.23 New feature
Notable features
  • Add -bucket flag to pre‑create an S3 bucket on startup
Full changelog

What's Changed

  • Shell

    • fix(shell): correct volume.list -writable filter unit and comparison by @qzhello in https://github.com/seaweedfs/seaweedfs/pull/9231
    • shell: expand ~ in local file path arguments by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9265
    • fix(shell): use exact match for volume.balance -racks/-nodes filter by @qzhello in https://github.com/seaweedfs/seaweedfs/pull/9279
  • S3 API

    • fix(s3api): return 503 + Retry-After when remote object not cached yet by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9233
    • fix(s3api): fix uint16 overflow in doListFilerEntries Limit calculation by @chenshi5012 in https://github.com/seaweedfs/seaweedfs/pull/9271
    • fix(s3api): clear stale latest-version pointer when .versions dir cleanup is blocked by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9269
    • test(s3): force-drop collection after deleteBucket in tagging/versioning/cors/copying by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9270
    • fix(s3api): re-encrypt UploadPartCopy bytes for the destination's SSE config (#8908) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9280
    • fix(s3api): cross-SSE copy operations and bring them back into CI (#9281) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9282
    • ci: bring previously-uncovered integration tests into CI (#9281 follow-up) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9283
    • fix(s3): honor X-Forwarded-For in audit log remote_ip by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9295
    • fix(s3api,iamapi): avoid full SaveConfiguration when creating a single IAM user by @ykatchou in https://github.com/seaweedfs/seaweedfs/pull/9261
    • fix(s3): cache remote-only source before CopyObject (#9304) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9305
  • Filer

    • fix(filer): return 503 + Retry-After when remote object not cached yet by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9236
    • filer(mysql): TLS hostname/SNI knobs + MariaDB upsert documentation by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9260
    • feat(filer.sync): add -verifySync mode to filer.sync for cross-cluster file comparison by @kisow in https://github.com/seaweedfs/seaweedfs/pull/9284
  • Misc

    • fix(kafka): evict expired group members on rejoin to unblock fast restart by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9243
    • Export file_read_invalid_needles metric for REST read requests on invalid file IDs. by @plisandro in https://github.com/seaweedfs/seaweedfs/pull/9241
    • chore(weed/topology): prune unused functions by @alrs in https://github.com/seaweedfs/seaweedfs/pull/9249
    • fix(grpc): require host match before routing dials to local Unix socket (#9254) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9257
    • Export Prometheus metrics for scrubbing operations. by @plisandro in https://github.com/seaweedfs/seaweedfs/pull/9264
    • chore(shell): fix typo in EC shard helper param names by @qzhello in https://github.com/seaweedfs/seaweedfs/pull/9277
    • chore(weed/mq/kafka/protocol): prune dead code by @alrs in https://github.com/seaweedfs/seaweedfs/pull/9288
    • chore(weed/mq/kafka/protocol): prune no-op test by @alrs in https://github.com/seaweedfs/seaweedfs/pull/9287
    • refactor(weed/storage): log volume file removal failures by @alrs in https://github.com/seaweedfs/seaweedfs/pull/9297
    • refactor(command): expand "~" in all path-style CLI flags by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9306
  • Volume Server

    • fix(volume_server): pin EC shard auto-select to the .ecx-owning disk (#9212) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9245
    • fix(volume_server): load orphan EC shards across disks on startup (#9212) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9244
    • fix(storage): fix verifyDeletedNeedleIntegrity using wrong offset by @chenshi5012 in https://github.com/seaweedfs/seaweedfs/pull/9273
  • Table Buckets and Iceberg Catalog

    • fix(iceberg): default namespace location so fresh CTAS does not race metadata write (#9074) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9246
    • test(iceberg): cross-engine regression coverage for deterministic table locations (#9074) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9253
    • test(s3tables): add Dremio Iceberg catalog integration tests by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9299
    • test(s3tables): expand Dremio Iceberg catalog test coverage by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9303
  • Docker

    • feat(docker): default CMD to mini -dir=/data for service-container use by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9255
  • Admin Server and Workers

    • fix(admin): use protocol-relative URLs for component links so HTTPS clusters don't break clicks by @pmiriyev in https://github.com/seaweedfs/seaweedfs/pull/9256
    • feat(admin): prefer stored S3 Content-Type metadata over key-extension MIME inference by @baracudaz in https://github.com/seaweedfs/seaweedfs/pull/9286
    • fix(admin/view): define basePath in plugin IIFE scopes by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9298
    • refactor(worker): co-locate plugin handlers with their task packages by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9301
  • NFS server

    • fix(nfs): reject NFSv4 calls with PROG_MISMATCH so clients fall back to v3 by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9262
    • feat(nfs): UDP MOUNT v3 responder + real-Linux e2e mount harness by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9267
    • fix(nfs): accept dirpath any-where under the export, mirroring rclone by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9291
  • FUSE Mount

    • mount: expose -fuse.maxBackground and -fuse.congestionThreshold flags (closes #9258) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9268
    • fix(mount): copy xattr value bytes to avoid FUSE buffer aliasing by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9278
    • fix(mount): keep async flush when LockOwner has no POSIX locks by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9300
  • Master

    • fix(master): bump seaweedfs/raft to v1.1.8 for Windows syncDir fix by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9296
  • Mini

    • feat(mini): add -bucket flag to pre-create an S3 bucket on startup by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9302
  • Rust Volume Server

    • fix(seaweed-volume): ceil EC shard slots in maybe_adjust_volume_max by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9232
    • fix(seaweed-volume): parse host:port.grpcPort in master address by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9235
    • fix(seaweed-volume): accept redb aliases for --index by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9237
    • fix(seaweed-volume): port EC shard placement fix to Rust (#9212, mirrors #9245) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9250
    • feat(seaweed-volume): auto-load EC shards on startup (#9212) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9251
    • feat(seaweed-volume): cross-disk EC shard reconciliation (#9212) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9252
    • rust(volume): export Prometheus metrics for scrubbing operations by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9266
    • rust(volume): strip grpc-port suffix from master URL before HTTP lookup by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9276

New Contributors

  • @chenshi5012 made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/9271
  • @baracudaz made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/9286
  • @ykatchou made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/9261

Full Changelog: https://github.com/seaweedfs/seaweedfs/compare/4.22...4.23

4.22 Breaking risk
Breaking changes
  • Removed -mount.p2p flag; registry is always on
Notable features
  • Hot-reload HTTPS certs without restart (k8s cert-manager)
  • Postgres credential support with inline policies, mTLS, pgbouncer
  • fs.mergeVolumes deletes source needles after filer update
Full changelog

Comments

For clusters with multiple volume servers with multiple disks, and if Erasure Coding is used, please upgrade!
https://github.com/seaweedfs/seaweedfs/pull/9219 fixed a problem when the volume server is restarted, some EC shards may be reported as missing while actually they are still on disks.

What's Changed

  • Shell

    • fix(shell): volume.fsck keeps going past a single broken chunk manifest by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9140
    • feat(shell): fs.mergeVolumes deletes source needles after filer update by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9160
    • fix(shell): error on missing volume id in fsck, mergeVolumes, vacuum by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9158
    • refactor(shell): run volume.fsck purge once per volume, after all replicas by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9159
    • fix(shell): ec.encode health-check key mismatch on K8s deployments by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9164
    • fix(shell): mergeVolumes hard-link safety and cleaner cleanup logging by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9163
  • Mount

    • fix(mount): retry saveEntry on transient filer errors; stop mismapping Canceled to EIO by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9141
    • fix(mount): flush dirty handles on Release when kernel skipped Flush by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9165
    • fix(mount): sanitize non-UTF-8 filenames; keep marshal errors per-request by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9207
  • Misc

    • fix(kafka): make consumer-group rebalancing work end-to-end by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9143
    • chore(weed/s3api/policy): prune unused test functions by @alrs in https://github.com/seaweedfs/seaweedfs/pull/9150
    • fix(kafka): close late-joiner orphan race in consumer-group rebalance by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9162
    • chore(upload): log offset/bytes-read context on chunk ReadFrom errors by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9169
    • fix(tests): make tests pass on 32-bit architectures (#9168) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9170
    • feat(security): hot-reload HTTPS certs without restart (k8s cert-manager) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9181
    • chore(filer): remove -mount.p2p flag; registry is always on by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9183
    • fix(filer.meta.tail): fail fast when -es is used without elastic build tag by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9191
    • fix(filer.meta.tail): include extended metadata in Elasticsearch docs by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9200
    • chore(weed/filer/redis3): prune unused test functions by @alrs in https://github.com/seaweedfs/seaweedfs/pull/9192
    • fix(weed/command) address unhandled errors by @alrs in https://github.com/seaweedfs/seaweedfs/pull/9208
    • Export REST file_{read,write}_failures metrics on volume servers by @plisandro in https://github.com/seaweedfs/seaweedfs/pull/9215
  • Filer

    • fix(log_buffer): back off disk-poll cadence when caught up to disk head by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9161
    • perf(filer): parallelize StreamMutateEntry with path-keyed scheduler by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9171
    • fix(remote-storage/azure): fix re-cache of large remote blobs (#9174) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9179
    • fix(filer/remote): keep re-cache work alive past caller cancellation (#9174) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9193
  • Master

    • fix(topology): drop per-disk task-type conflict map (#9147) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9166
    • fix(master): register EC shards per physical disk on full heartbeat sync (#9212) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9219
  • Volume Server

    • fix(volume): write state.pb into a real dir when -dir.idx is unset by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9178
    • fix(ec): honor disk_id in ReceiveFile so EC shards respect admin placement (#9184) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9185
    • Export gRPC file_{read,write}_failures metrics on volume servers. in https://github.com/seaweedfs/seaweedfs/pull/9177
    • fix(volume_server): refuse ReceiveFile overwrite of mounted EC shard (#9184) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9186
    • fix(upload): keep Content-MD5 on 204 unchanged writes by @CodeRusher in https://github.com/seaweedfs/seaweedfs/pull/9198
    • fix(storage): use ceil division for EC shard slots in maxVolumeCount by @FQHSLycopene in https://github.com/seaweedfs/seaweedfs/pull/9196
    • fix(volume): cap leveldb OpenFilesCacheCapacity per index DB (#9139) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9223
    • fix(upload): rewind request body when retrying on connection reset (#9139) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9222
  • S3 API

    • fix(s3api): route STS GetFederationToken to STS handler (#9157) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9167
    • fix(s3/shell): factor EC volumes into bucket size metrics and collection.list by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9182
    • feat(iam): allow caller-supplied AccessKeyId and SecretAccessKey in CreateAccessKey by @JonNesvold in https://github.com/seaweedfs/seaweedfs/pull/9172
    • fix(iam): accept bare "*" resource in PutUserPolicy (#9209) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9210
    • fix(s3api): correct SSE-S3 decryption key handling in multipart uploads by @os-pradipbabar in https://github.com/seaweedfs/seaweedfs/pull/9211
    • fix(iam): substitute dynamic jwt:/saml:/oidc: claim variables in policies by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9217
    • fix(s3api): validate SSE-S3 chunk IV length; add multipart direct reader tests by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9218
    • fix(s3api): backfill multipart SSE-S3 metadata at completion by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9224
    • feat(credential/postgres): inline policies, mTLS and pgbouncer connection support by @JonNesvold in https://github.com/seaweedfs/seaweedfs/pull/9226
    • fix(s3api): stream multipart-SSE chunks lazily to avoid truncated GETs (#8908) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9228
    • fix(credential/postgres,s3api/iam): rename safety + pgxutil follow-ups to #9226 by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9230
  • Admin Server and Workers

    • fix(erasure_coding): surface replica delete failures from EC task (#9184) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9187
    • fix(admin): use basePath for API fetches when urlPrefix is set by @faspix in https://github.com/seaweedfs/seaweedfs/pull/9197
    • fix(admin): S3 Tables CSRF token + non-empty 409 status by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9221
    • fix(admin): use TLS-aware HTTP client for /dir/status fetch by @pmiriyev in https://github.com/seaweedfs/seaweedfs/pull/9227
  • NFS Server

    • fix(nfs): make Linux mount -t nfs work without client workaround (#9199) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9201
  • Helm Charts

    • fix(helm): gate S3 TLS cert args on httpsPort to stop probe failures (#9202) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9206

New Contributors

  • @JonNesvold made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/9172
  • @faspix made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/9197
  • @plisandro made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/9215
  • @pmiriyev made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/9227

Full Changelog: https://github.com/seaweedfs/seaweedfs/compare/4.21...4.22

4.21 Security relevant
Security fixes
  • CVE-2026-28390: libcrypto3/libssl3 dependency upgrade
  • S3 API: reject unsigned x-amz-* headers in SigV4 requests
Notable features
  • FUSE mount 100% POSIX compliant
  • FUSE mount peer-to-peer file chunk sharing
  • NFS Server implementation
Full changelog

What's Changed

This is a packed release with many fixes and some new features!

  • FUSE Mount now is 100% POSIX Compliant
  • FUSE Mount added Peer-to-peer file chunk sharing!
  • For AI Use case, added optimization for all-to-all parallel downloading from volume server for loading Large Language Models.
  • S3 reading performance is improved for large files. Welcome to report actual performance improvements.
  • And one more thing: A NFS Server is added !!!

Change logs

  • FUSE Mount

    • fix(mount): propagate hard-link nlink changes to sibling cache entries by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9062
    • fix(mount): stop double-applying umask in Mkdir by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9063
    • fix(mount): serialize hard-link mutations on HardLinkId by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9064
    • feat(mount): cap write buffer with -writeBufferSizeMB by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9066
    • fix(mount): evict writable chunks when writeBufferSizeMB cap is reached by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9091
    • feat(mount): proactive flush of idle writable chunks by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9094
    • fix(mount): reduce chunk fragmentation from random writes by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9096
    • fix(mount): count manifest sizes in merge condition to prevent accumulation by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9101
    • perf(cache): drop OS page cache after disk cache reads by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9098
    • feat(mount): singleflight dedup for concurrent chunk reads by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9100
    • perf(mount): add graduated write backpressure by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9099
    • feat(mount): set FOPEN_KEEP_CACHE on re-open of unchanged files by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9097
    • ci(pjdfstest): cache docker layers via GHA to avoid apt mirror flakes by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9106
    • fix(mount): avoid self-notify deadlock in Link and CopyFileRange handlers by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9110
    • fix(mount): remove fid pool to stop master over-allocating volumes by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9111
    • fix(mount): close inodeLocks cleanup race that let two flock holders coexist by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9128
    • peer chunk sharing 1/8: proto definitions by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9130
    • peer chunk sharing 2/8: filer mount registry by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9131
    • peer chunk sharing 3/8: mount peer-serve HTTP endpoint by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9132
    • peer chunk sharing 4/8: mount registrar + HRW owner selection by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9133
    • peer chunk sharing 5/8: mount chunk-directory shard by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9134
    • peer chunk sharing 6/8: announce queue + batched flush by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9135
    • peer chunk sharing 7/8: tryPeerRead read-path hook by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9136
  • S3 API

    • perf(s3): route GET through ChunkReadAt + per-request ReaderCache by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9068
    • perf(s3): add optional shared in-memory chunk cache for GET by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9069
    • fix(s3): allow anonymous ListBuckets with prefix-scoped List action by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9073
    • fix(s3): honor ChecksumAlgorithm on presigned URL uploads by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9076
    • fix(s3): strip client-supplied X-SeaweedFS-Principal/Session-Token in AuthSignatureOnly by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9120
    • fix(s3): return 403 on POST policy violation instead of 307 redirect by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9122
    • fix(s3): propagate validated POST form fields to upload headers by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9123
    • fix(s3): reject unknown POST policy conditions and extra x-amz form fields by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9124
    • fix(s3api): self-heal stale .versions latest-version pointer on read by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9125
  • Table Buckets and Iceberg Catalog

    • fix(iceberg): clean stale data before creating a table (#9074) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9077
    • fix(iceberg): route catalog clients to the right bucket and vend S3 endpoint by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9109
  • NFS Server

    • [nfs] Add NFS by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9067
  • Admin Server and Worker

    • admin: include EC volumes in bucket size reporting by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9058
    • fix(weed/worker/tasks): log dropped errors by @alrs in https://github.com/seaweedfs/seaweedfs/pull/9057
    • admin: report file and delete counts for EC volumes by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9060
    • fix(balance): guard against destination overshoot and oscillation by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9090
    • fix(admin): list all masters and dedupe EC file counts in dashboard by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9093
    • fix(plugin): remove Min Volume Age field from vacuum plugin worker config by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9095
  • Filer Sync and Backup

    • perf(filer.sync): don't serialize descendants behind dir attribute updates by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9079
    • feat(filer.backup): -initialSnapshot seeds destination from live tree by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9126
  • Helm Chart

    • fix(helm): skip s3 ServiceMonitor when only filer.s3 is enabled by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9081
  • Filer

    • fix(wdclient,volume): compare master leader with ServerAddress.Equals by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9089
    • fix(filer): drop stale master gRPC cache on stream death (#9102) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9107
  • Master

    • fix(master): do not re-enter warmup when a fresh cluster grows its first volume by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9092
    • fix(master): eagerly remove volume from writable when assign hits limit by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9108
  • Volume Server

    • fix(volume): keep vacuum running past dangling .idx entries by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9115
    • Export master_disconnections metrics on volume servers. by @proton-lisandro-pin in https://github.com/seaweedfs/seaweedfs/pull/9104
  • Shell

    • feat(shell): add fs.distributeChunks command for even chunk distribution by @kisow in https://github.com/seaweedfs/seaweedfs/pull/9117
    • fix(shell): fs.mergeVolumes now rewrites manifest chunks for large files by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9127
  • Misc

    • docker: upgrade libcrypto3/libssl3 to clear Trivy HIGH (CVE-2026-28390) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9059
    • test(vacuum): fix flaky TestVacuumIntegration across multiple volumes by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9061
    • chore(weed/mq/kafka/schema): remove unused functions by @alrs in https://github.com/seaweedfs/seaweedfs/pull/9088
    • test(kafka): retry ConsumeWithGroup on failed initial join by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9105
    • fix(mini): shut down admin/s3/webdav/filer before volume/master on Ctrl+C by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9112
    • fix(weed/query/engine): check for nil pointers by @alrs in https://github.com/seaweedfs/seaweedfs/pull/9114
    • ci(kafka-loadtest): switch off Ubuntu/Debian base images to avoid apt mirror flakes by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9119
    • security(s3api): reject unsigned x-amz-* headers in SigV4 requests by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9121
    • fix kafka gateway and consumer group e2e flakes by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9129

Full Changelog: https://github.com/seaweedfs/seaweedfs/compare/4.20...4.21

4.20 New feature
Notable features
  • FUSE mount nanosecond timestamp precision support
  • IAM ListUserPolicies API and group inline policy actions
  • Size-aware volume assignment with weighted selection
4.19 Security relevant
⚠ Upgrade required
  • Critical fix for erasure coding: off-by-one error in nLargeBlockRows caused data read corruption
  • Default master resumeState changed to true
  • WEED_S3_SSE_KEY environment variable now available for SSE-S3 key encryption
Security fixes
  • SSE-C customer encryption keys no longer logged in debug output
  • Dashboard and service account secret keys now use URL-safe encoding
  • Replication of SSE-encrypted objects now preserves ciphertext
Notable features
  • STS GetCallerIdentity and GetFederationToken support
  • Concurrent chunk prefetch for faster large file downloads
  • Expanded S3 shell commands for IAM, policy, user, and service account management
Full changelog

What's Changed

  • Table Bucket and Iceberg Catalog

    • fix(iceberg): use dot separator for namespace paths instead of unit separator by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8960
  • S3 API

    • fix(s3): remove customer encryption key from SSE-C debug log by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8875
    • S3: map canned ACL to file permissions and add configurable default file mode by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8886
    • fix(s3): use recursive delete for .versions directory cleanup by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8887
    • fix(test): address flaky S3 distributed lock integration test by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8888
    • STS: add GetCallerIdentity support by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8893
    • fix(s3): skip directories before marker in ListObjectVersions pagination by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8890
    • feat(s3): add STS GetFederationToken support by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8891
    • fix(s3): use URL-safe secret keys for dashboard users and service accounts by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8902
    • feat(s3): support WEED_S3_SSE_KEY env var for SSE-S3 KEK by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8904
    • fix: Prevent orphaned metadata from cancelled S3 operations (Issue #8908) by @os-pradipbabar in https://github.com/seaweedfs/seaweedfs/pull/8909
    • feat(s3): store and return checksum headers for additional checksum algorithms by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8914
    • feat(s3): add concurrent chunk prefetch for large file downloads by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8917
    • fix(s3): include static identities in listing operations by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8903
    • fix: S3 sink puts all entry.Extended into Tagging header instead of only object tags by @Mmx233 in https://github.com/seaweedfs/seaweedfs/pull/8930
    • fix(s3): apply PutObject multipart expansion to STS session policies by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8932
    • fix(s3): s3:PutObject bucket policy now implicitly allows multipart uploads by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8968
    • S3: delay empty folder cleanup to prevent Spark write failures by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8970
    • fix(s3): populate s3:prefix from query param for ListObjects policy conditions by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8971
    • fix(s3): handle empty URL path in forwarded prefix signature verification by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8973
  • Admin UI and Workers

    • fix(admin): respect urlPrefix in S3 bucket and S3Tables navigation links by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8885
    • fix(weed/worker/tasks/ec_balance): non-recursive reportProgress by @alrs in https://github.com/seaweedfs/seaweedfs/pull/8892
    • feat(admin): add profiling options for debugging high memory/CPU usage by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8923
    • fix(admin): fix master leader link showing incorrect port in Admin UI by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8924
    • fix(admin): reduce memory usage and verbose logging for large clusters by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8927
    • fix: prevent stack overflow in ECBalanceTask.reportProgress by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8949
    • fix(admin): respect urlPrefix for root redirect and JS API calls by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8975
  • Filer Sync, Backup

    • filer.sync: show active chunk transfers when sync progress stalls by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8889
    • fix(filer.backup): local sink readonly permission by @kisow in https://github.com/seaweedfs/seaweedfs/pull/8907
    • fix(azuresink): delete freshly created blob on write failure by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8934
    • fix(gcssink): prevent empty object finalization on write failure by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8933
    • fix: replication sinks upload ciphertext for SSE-encrypted objects by @Mmx233 in https://github.com/seaweedfs/seaweedfs/pull/8931
    • fix(sync): use per-cluster TLS for HTTP volume connections in filer.sync by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8974
  • Filer

    • fix(filer): remove cancellation guard from RollbackTransaction and clean up #8909 by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8916
    • fix(kafka): resolve consumer group resumption timeout in e2e tests by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8935
    • fix(weed/filer/redis2): fix dropped error by @alrs in https://github.com/seaweedfs/seaweedfs/pull/8952
    • fix(weed/filer/redis): dropped error by @alrs in https://github.com/seaweedfs/seaweedfs/pull/8895
    • filer: bootstrap pre-existing metadata when a new filer joins by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8979
  • Master

    • fix(master): fast resume state and default resumeState to true by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8925
  • Shell

    • volume.tier.move: fulfill target replication before deleting old replicas by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8950
    • shell: add s3.accesskey., s3.anonymous., s3.serviceaccount.* commands by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8955
    • shell: add s3.user.* and s3.policy.attach|detach commands by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8954
    • shell: add s3.iam.*, s3.config.show, s3.user.provision; hide legacy commands by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8956
    • shell: s3.* commands always output JSON, connection messages to stderr by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8976
  • Volume Server

    • fix(ec): off-by-one in nLargeBlockRows causes EC read corruption by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8957
    • test: add integration tests for volume and EC scrubbing by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8977
    • fix(test): remove flaky shard ID assertion in EC scrub test by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8978
    • fix(ec): generate .ecx before EC shards to prevent data inconsistency by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8972
  • Misc

    • Add manual trigger to Rust volume server release build workflow by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8873
    • fix(volume-rust): fix volume balance between Go and Rust servers by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8915
    • fix(stats): fix build on openbsd, solaris, and windows by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/8951

New Contributors

  • @os-pradipbabar made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/8909

Full Changelog: https://github.com/seaweedfs/seaweedfs/compare/4.18...4.19

4.18 Maintenance
Notable features
  • Resilient distributed locks via consistent hashing
  • JSON structured logging
  • Log rotation with gzip compression
4.17 Bug fix

Stability improvements addressing nil pointer crashes during concurrent vacuum compaction, dynamic timeout handling, S3 metrics persistence, and trust policy validation fixes for AWS principals.

4.16 New feature
Notable features
  • S3 Table Bucket Iceberg maintenance plugin worker
  • OpenShift Helm Chart support with data replication
  • IAM group management (CreateGroup, DeleteGroup, AddUserToGroup)
4.15 Breaking risk
Breaking changes
  • Maintenance scripts auto-migrated to Admin Script plugin worker (requires migration for custom scripts)
Notable features
  • Plugin worker system supporting non-Go workers
  • S3 IAM policy attachment/detachment APIs
  • Managed policy storage implementation
4.13 New feature
Notable features
  • Iceberg multi-level namespace support with persistence
  • IAM session policy support for STS
  • UpdateAccessKey and access key status management
4.12 Maintenance
Notable features
  • volume.scrub and ec.scrub commands
  • Iceberg REST Catalog server
  • Linux ACL support for FUSE
4.09 New feature
Notable features
  • S3 Tables support for Iceberg tabular data
  • Iceberg REST Catalog server
  • IAM policy management via gRPC
4.07 New feature
Notable features
  • S3 policy variables for dynamic access control
  • AssumeRole and AssumeRoleWithLDAPIdentity STS actions
  • Persistent ClusterID for split-brain prevention
4.06 Security relevant
Security fixes
  • s3api: fix authentication bypass and potential SIGSEGV (Issue #7912)
  • Fix AWS SDK Signature V4 with STS credentials
Notable features
  • S3 storage class support in extended attributes
  • Bucket metrics with logical and physical size
  • Policy attachment for object store users
4.05 New feature
Security fixes
  • Fix critical authentication bypass vulnerability (#7912)
Notable features
  • S3 volume encryption with -s3.encryptVolumeData flag
  • Service account support for IAM
  • Admin UI service account management

Beta — feedback welcome: [email protected]