4.42
itszeeshan/subdomainx4.42Aug 17, 2026by chrislusf
AI Summary
A major overhaul of the master topology and heartbeat protocol for better efficiency, coupled with robust fixes for Erasure Coding operations and storage corruption.
Key Highlights
- Master topology and heartbeat protocol optimized to reduce copy operations and improve volume registration.
- Storage fix for corrupted LevelDB detection in DoOffsetLoading.
- Erasure Coding operations now roll back or resume into a consistent state to prevent orphan shards.
- Filer directory listing optimized to stop decoding chunk lists.
- TUS extension improvements including configurable max upload size and concatenation support.
New Features
- Configurable TUS max upload size and session expiry.
- TUS concatenation extension for file uploads.
- Redis store improvements including orphaned index member cleanup.
Full Release Notes
## What's Changed ## Master and topology Heartbeat protocol, volume registration, and a long series of allocation/copy removals on the master's hot paths. - topology: digest the volumes a master believes each node holds ([#10619](https://github.com/seaweedfs/seaweedfs/pull/10619)) - heartbeat: carry a volume digest and verify it ([#10627](https://github.com/seaweedfs/seaweedfs/pull/10627)) - heartbeat: send only the volumes that changed ([#10640](https://github.com/seaweedfs/seaweedfs/pull/10640)) - heartbeat: keep the master current through collection churn ([#10657](https://github.com/seaweedfs/seaweedfs/pull/10657)) - topology: follow a volume that moved between a server's disks ([#10628](https://github.com/seaweedfs/seaweedfs/pull/10628)) - master: keep disk_id when registering volumes from incremental heartbeats ([#10686](https://github.com/seaweedfs/seaweedfs/pull/10686)) - topology: provisional volume update must not erase the reported disk id ([#10687](https://github.com/seaweedfs/seaweedfs/pull/10687)) - topology: keep per-node volume state with the location it describes ([#10654](https://github.com/seaweedfs/seaweedfs/pull/10654)) - topology: mark a volume crowded only if it can take writes ([#10655](https://github.com/seaweedfs/seaweedfs/pull/10655)) - topology: track volume size only where writes can land ([#10653](https://github.com/seaweedfs/seaweedfs/pull/10653)) - topology: clamp the deleted-vs-total subtractions in volume stats ([#10633](https://github.com/seaweedfs/seaweedfs/pull/10633)) - master: keep a racing registration out of a dying collection ([#10677](https://github.com/seaweedfs/seaweedfs/pull/10677)) - master: align default volume size with EC rows ([#10761](https://github.com/seaweedfs/seaweedfs/pull/10761)) - master: let VolumeList ask for the volumes it wants ([#10674](https://github.com/seaweedfs/seaweedfs/pull/10674)) - master: stream volume listings ([#10676](https://github.com/seaweedfs/seaweedfs/pull/10676)) - master: stop copying the cluster to name it ([#10700](https://github.com/seaweedfs/seaweedfs/pull/10700)) - topology: keep the volume map's values out of its slots ([#10680](https://github.com/seaweedfs/seaweedfs/pull/10680)) - topology: build the volume list without copying the volume map first ([#10668](https://github.com/seaweedfs/seaweedfs/pull/10668)) - topology: diff a heartbeat without copying the volume map ([#10608](https://github.com/seaweedfs/seaweedfs/pull/10608)) - topology: preallocate the heartbeat volume conversion slice ([#10607](https://github.com/seaweedfs/seaweedfs/pull/10607)) - topology: preallocate the disk volume snapshot ([#10609](https://github.com/seaweedfs/seaweedfs/pull/10609)) - topology: size the new-volume list from the actual delta ([#10613](https://github.com/seaweedfs/seaweedfs/pull/10613)) - topology: preallocate the per-disk VolumeList payload ([#10614](https://github.com/seaweedfs/seaweedfs/pull/10614)) - topology: preallocate the client-facing topology snapshots ([#10615](https://github.com/seaweedfs/seaweedfs/pull/10615)) - topology: gather a node's volumes into one slice ([#10617](https://github.com/seaweedfs/seaweedfs/pull/10617)) - topology: log writable-state changes, not every check ([#10612](https://github.com/seaweedfs/seaweedfs/pull/10612)) - topology: drop the unused DataNode volume id listing ([#10618](https://github.com/seaweedfs/seaweedfs/pull/10618)) ## Volume server and storage - storage: fix corrupted leveldb detection in DoOffsetLoading ([#10650](https://github.com/seaweedfs/seaweedfs/pull/10650)) - storage: count a volume's needles in uint32 ([#10718](https://github.com/seaweedfs/seaweedfs/pull/10718)) - storage: share the volume strings a cluster repeats ([#10665](https://github.com/seaweedfs/seaweedfs/pull/10665)) - storage: stop keeping the remote storage key on the master ([#10672](https://github.com/seaweedfs/seaweedfs/pull/10672)) - storage: order VolumeInfo by alignment ([#10669](https://github.com/seaweedfs/seaweedfs/pull/10669)) - needle: intern the stored ttl values ([#10611](https://github.com/seaweedfs/seaweedfs/pull/10611)) - super_block: intern the byte-encoded replica placements ([#10610](https://github.com/seaweedfs/seaweedfs/pull/10610)) - throughput limits for replicate, EC shard, and worker-driven moves ([#10749](https://github.com/seaweedfs/seaweedfs/pull/10749)) ## Erasure coding Interrupted-operation cleanup is the theme: encode, decode, and shard moves now roll back or resume into a consistent state, and a chaos harness exercises it. - refactor: extract EC orchestration into a shared weed/ec package ([#10760](https://github.com/seaweedfs/seaweedfs/pull/10760)) - refactor: share volume and EC shard move logic between shell and workers ([#10727](https://github.com/seaweedfs/seaweedfs/pull/10727)) - erasure_coding: share the EC shard teardown primitive ([#10740](https://github.com/seaweedfs/seaweedfs/pull/10740)) - ec.encode: roll back a failed encode instead of leaving readonly volumes and orphan shards ([#10741](https://github.com/seaweedfs/seaweedfs/pull/10741)) - ec.encode: require the shards to agree on size before deleting the volume ([#10769](https://github.com/seaweedfs/seaweedfs/pull/10769)) - ec.decode: finish the cleanup an interrupted decode left behind ([#10767](https://github.com/seaweedfs/seaweedfs/pull/10767)) - ec.decode: check the rebuilt .dat is complete before the shards can be deleted ([#10768](https://github.com/seaweedfs/seaweedfs/pull/10768)) - EC worker: clear stale/interrupted shards at task start and on failure ([#10738](https://github.com/seaweedfs/seaweedfs/pull/10738)) - ec: confirm a surviving copy before deleting a duplicate EC shard ([#10719](https://github.com/seaweedfs/seaweedfs/pull/10719)) - EC: handle zero-sized shard files uniformly across moves, rebuilds, and startup cleanup ([#10753](https://github.com/seaweedfs/seaweedfs/pull/10753)) - ec.balance: add a -volumeIds filter ([#10667](https://github.com/seaweedfs/seaweedfs/pull/10667)) ## Filer - filer: list directories without decoding chunk lists ([#10616](https://github.com/seaweedfs/seaweedfs/pull/10616)) - filer: do not sweep children when deleting a folder non-recursively ([#10782](https://github.com/seaweedfs/seaweedfs/pull/10782)) - filer: restore a folder that received an entry while it was deleted ([#10783](https://github.com/seaweedfs/seaweedfs/pull/10783)) - filer: rebuild peer metadata subscriptions after a master reconnect ([#10648](https://github.com/seaweedfs/seaweedfs/pull/10648)) - filer: retry and surface metadata replay failures from peers ([#10714](https://github.com/seaweedfs/seaweedfs/pull/10714)) - filer: drain pending log chunk refs when the metadata stream ends ([#10647](https://github.com/seaweedfs/seaweedfs/pull/10647)) - filer: add filer.meta.scan to audit one directory's change history ([#10645](https://github.com/seaweedfs/seaweedfs/pull/10645)) - reload filer config on local metadata updates ([#10622](https://github.com/seaweedfs/seaweedfs/pull/10622)) - log_buffer: end bounded reads that find the buffer empty ([#10750](https://github.com/seaweedfs/seaweedfs/pull/10750)) ### TUS - configurable TUS max upload size and session expiry ([#10638](https://github.com/seaweedfs/seaweedfs/pull/10638)) - TUS concatenation extension ([#10702](https://github.com/seaweedfs/seaweedfs/pull/10702)) ### Filer stores (redis) - redis2: remove orphaned directory index members on listing ([#10735](https://github.com/seaweedfs/seaweedfs/pull/10735)) - redis: remove orphaned directory index members on listing ([#10742](https://github.com/seaweedfs/seaweedfs/pull/10742)) - redis2: harden the orphaned index member cleanup ([#10743](https://github.com/seaweedfs/seaweedfs/pull/10743)) - redis2: expire entries without destroying a concurrent recreate ([#10744](https://github.com/seaweedfs/seaweedfs/pull/10744)) - redis2: orphan cleanup existence checks must not read replicas ([#10745](https://github.com/seaweedfs/seaweedfs/pull/10745)) ## Mount - mount: stop churning the inode table on every readdir ([#10606](https://github.com/seaweedfs/seaweedfs/pull/10606)) - mount: fix four readdir pagination bugs ([#10624](https://github.com/seaweedfs/seaweedfs/pull/10624)) - mount: read oversized directories through instead of caching them ([#10631](https://github.com/seaweedfs/seaweedfs/pull/10631)) - mount: let the kernel cache directory listings ([#10634](https://github.com/seaweedfs/seaweedfs/pull/10634)) - mount: invalidate hot directory listings by section ([#10712](https://github.com/seaweedfs/seaweedfs/pull/10712)) - windows mount: cache file data, resolved paths and attributes ([#10703](https://github.com/seaweedfs/seaweedfs/pull/10703)) ## S3 API - s3: add the RenameObject endpoint ([#10659](https://github.com/seaweedfs/seaweedfs/pull/10659)) - s3api: fix ListObjectsV2 dropping objects under a partial prefix ([#10656](https://github.com/seaweedfs/seaweedfs/pull/10656)) - s3: a key deleted after enabling versioning must leave the listing ([#10684](https://github.com/seaweedfs/seaweedfs/pull/10684)) - s3: take bucket sizes from the master's summary ([#10664](https://github.com/seaweedfs/seaweedfs/pull/10664)) - s3: option to disable bucket auto-creation on upload ([#10759](https://github.com/seaweedfs/seaweedfs/pull/10759)) - s3api/policy_engine: prune dead code ([#10599](https://github.com/seaweedfs/seaweedfs/pull/10599)) ## Iceberg and S3 Tables - iceberg: make a table commit a compare-and-swap ([#10775](https://github.com/seaweedfs/seaweedfs/pull/10775)) - iceberg: add view rename, scan-report and snapshots=refs to the catalog ([#10776](https://github.com/seaweedfs/seaweedfs/pull/10776)) - iceberg: vend table-scoped credentials to clients that ask for delegation ([#10777](https://github.com/seaweedfs/seaweedfs/pull/10777)) - iceberg: repair non-compliant manifests at commit ([#10641](https://github.com/seaweedfs/seaweedfs/pull/10641)) - iceberg: route unprefixed requests to the first table bucket ([#10675](https://github.com/seaweedfs/seaweedfs/pull/10675)) - iceberg maintenance: keep the snapshots that branches and tags pin ([#10774](https://github.com/seaweedfs/seaweedfs/pull/10774)) - iceberg: let table properties override the worker config ([#10772](https://github.com/seaweedfs/seaweedfs/pull/10772)) - iceberg: accept lowercase parquet file format when planning compaction ([#10751](https://github.com/seaweedfs/seaweedfs/pull/10751)) - s3tables: add the maintenance configuration APIs ([#10773](https://github.com/seaweedfs/seaweedfs/pull/10773)) - iceberg maintenance: fix the test build master merged broken ([#10780](https://github.com/seaweedfs/seaweedfs/pull/10780)) ## Shell - shell: volume.delete and volume.move accept a -timeout ([#10701](https://github.com/seaweedfs/seaweedfs/pull/10701)) - shell: volume.move cleans up when aborted after the copy phase ([#10704](https://github.com/seaweedfs/seaweedfs/pull/10704)) - shell: keep the source readonly when the incomplete target copy cannot be deleted ([#10705](https://github.com/seaweedfs/seaweedfs/pull/10705)) - shell: multi-target fs.mergeVolumes and volume.mark -readonlyCanDelete ([#10706](https://github.com/seaweedfs/seaweedfs/pull/10706)) - shell: parallelize volume balance moves ([#10737](https://github.com/seaweedfs/seaweedfs/pull/10737)) - shell: send read jwt when downloading chunks in fs.mergeVolumes and fs.distributeChunks ([#10717](https://github.com/seaweedfs/seaweedfs/pull/10717)) ## Admin and workers - admin: dashboard counts chunks, not files ([#10598](https://github.com/seaweedfs/seaweedfs/pull/10598)) - admin: show capacity per storage tier and stop counting remote-tiered bytes as local disk usage ([#10766](https://github.com/seaweedfs/seaweedfs/pull/10766)) - admin: make paths relative ([#10709](https://github.com/seaweedfs/seaweedfs/pull/10709)) - plugin scheduler: drain started jobs past the window close instead of killing them ([#10728](https://github.com/seaweedfs/seaweedfs/pull/10728)) ## Remote storage and tiering - read cold remote objects straight from the origin while caching ([#10731](https://github.com/seaweedfs/seaweedfs/pull/10731)) - remote_storage: build all S3-compatible clients through one constructor ([#10720](https://github.com/seaweedfs/seaweedfs/pull/10720)) ## Security - master: gate raft membership RPCs behind the admin whitelist ([#10649](https://github.com/seaweedfs/seaweedfs/pull/10649)) - volume: validate the file extension in CopyFile and ReceiveFile ([#10644](https://github.com/seaweedfs/seaweedfs/pull/10644)) - volume: decode IPv6 transition addresses in the remote-endpoint guard ([#10683](https://github.com/seaweedfs/seaweedfs/pull/10683)) - volume: extend the remote-endpoint guard to the azure backend ([#10754](https://github.com/seaweedfs/seaweedfs/pull/10754)) - volume: validate replica targets and restrict gcs credentials in FetchAndWriteNeedle ([#10755](https://github.com/seaweedfs/seaweedfs/pull/10755)) - sftp: url-encode the upload path ([#10758](https://github.com/seaweedfs/seaweedfs/pull/10758)) - grpc: optional client_cert/client_key for outgoing mTLS connections ([#10747](https://github.com/seaweedfs/seaweedfs/pull/10747)) - rust volume: mirror Go volume server logic to gate the admin RPCs ([#10748](https://github.com/seaweedfs/seaweedfs/pull/10748)) ## Rust volume server - rust: stop quarantining v2 volumes, load a disk's volumes concurrently ([#10602](https://github.com/seaweedfs/seaweedfs/pull/10602)) - rust volume: mirror the VolumeConsolidateIndex RPC from Go ([#10752](https://github.com/seaweedfs/seaweedfs/pull/10752)) - rust volume: mirror Go volume server logic to gate the admin RPCs ([#10748](https://github.com/seaweedfs/seaweedfs/pull/10748)) ## Clients - wdclient: keep the location of a volume reported added and removed at once ([#10635](https://github.com/seaweedfs/seaweedfs/pull/10635)) - clients: stream the volume listings that ask for everything ([#10679](https://github.com/seaweedfs/seaweedfs/pull/10679)) ## Telemetry - telemetry: version distribution over time ([#10625](https://github.com/seaweedfs/seaweedfs/pull/10625)) - telemetry: put the version pie back beside the stacked chart ([#10626](https://github.com/seaweedfs/seaweedfs/pull/10626)) - telemetry: count erasure-coded volumes in the reported totals ([#10632](https://github.com/seaweedfs/seaweedfs/pull/10632)) ## Helm and deployment - helm: mark filer db-init ConfigMap volume optional ([#10596](https://github.com/seaweedfs/seaweedfs/pull/10596)) - helm: enterprise license Secret, and a persistent-claim option for master data ([#10601](https://github.com/seaweedfs/seaweedfs/pull/10601)) - helm: add support for schedulerName ([#10716](https://github.com/seaweedfs/seaweedfs/pull/10716)) ## Tests and CI - test: EC lifecycle chaos harness, with four fixes it found ([#10763](https://github.com/seaweedfs/seaweedfs/pull/10763)) - test: systematic EC interruption verification, exhaustive model check plus deterministic kill matrix ([#10764](https://github.com/seaweedfs/seaweedfs/pull/10764)) - test: re-lock and retry every chaos command, not just the balance ([#10770](https://github.com/seaweedfs/seaweedfs/pull/10770)) - test: walk an EC volume through a multi-disk node's whole life ([#10721](https://github.com/seaweedfs/seaweedfs/pull/10721)) - test: drive ec.encode/balance/rebuild E2E with a byte-identical payload check ([#10722](https://github.com/seaweedfs/seaweedfs/pull/10722)) - test: assert EC shard identity and empty-view in multi-disk lifecycle tests ([#10723](https://github.com/seaweedfs/seaweedfs/pull/10723)) - s3tables: add ClickHouse iceberg catalog integration test ([#10637](https://github.com/seaweedfs/seaweedfs/pull/10637)) - clickhouse catalog test: cover latest ClickHouse and catalog-side CREATE TABLE ([#10707](https://github.com/seaweedfs/seaweedfs/pull/10707)) - ci: run the gated redis store tests ([#10746](https://github.com/seaweedfs/seaweedfs/pull/10746)) - test: let the vacuum shell session outlive the vacuum ([#10682](https://github.com/seaweedfs/seaweedfs/pull/10682)) - mount: absorb the WinFsp metadata cache window in the concurrent-reader test ([#10636](https://github.com/seaweedfs/seaweedfs/pull/10636)) - skiplist: fix TestFindGreaterOrEqual flake, compare against largest key, not value ([#10757](https://github.com/seaweedfs/seaweedfs/pull/10757)) ## Docs - docs: update example link ([#10725](https://github.com/seaweedfs/seaweedfs/pull/10725)) ## Dependencies - bump github/codeql-action from 4.37.4 to 4.37.6 ([#10699](https://github.com/seaweedfs/seaweedfs/pull/10699)) - bump github.com/aws/aws-sdk-go-v2/credentials from 1.19.32 to 1.19.34 ([#10698](https://github.com/seaweedfs/seaweedfs/pull/10698)) - bump cloud.google.com/go/kms from 1.31.0 to 1.33.0 ([#10697](https://github.com/seaweedfs/seaweedfs/pull/10697)) - bump modernc.org/sqlite from 1.53.0 to 1.56.0 ([#10696](https://github.com/seaweedfs/seaweedfs/pull/10696)) - bump github.com/pierrec/lz4/v4 from 4.1.27 to 4.1.28 ([#10695](https://github.com/seaweedfs/seaweedfs/pull/10695)) - bump github.com/ydb-platform/ydb-go-sdk/v3 from 3.146.3 to 3.147.1 ([#10694](https://github.com/seaweedfs/seaweedfs/pull/10694)) ## New Contributors * @andrei-brindas97 made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/10596 * @hsdfat made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/10656 * @ruriww made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/10709 * @cavus700 made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/10716 * @aleksandr4842 made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/10725 * @rooseveltlai made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/10761 **Full Changelog**: https://github.com/seaweedfs/seaweedfs/compare/4.41...4.42