What's Changed
-
Helm Chart
- Fix topologySpreadConstraints key in sftp-deployment.yaml by @mohsek in #8600
- fix(helm): use componentName for all service names to fix truncation mismatch by @chrislusf in #8612
- fix(helm): trim whitespace before s3 TLS args to prevent command breakage by @chrislusf in #8614
- fix(chart): all in one maxVolumes value by @hoppla20 in #8683
- fix(chart): missing resources on volume statefulset initContainer by @hoppla20 in #8678
- fix(chart): bucket hook by @hoppla20 in #8680
- fix(helm): namespace app-specific global values under global.seaweedfs by @chrislusf in #8700
- feat: improve aio support for admin/volume ingress and fix UI links by @jr200 in #8679
- feat(ci): publish helm chart to ghcr by @hoppla20 in #8697
- feat(k8s): added possibility to specify service.type for multiple ser… by @andreasroste in #8372
- ci: add Trivy CVE scan to container release workflow by @chrislusf in #8820
-
Misc
- Reduce task logger glog noise and remove per-write fsync by @chrislusf in #8603
- fix(mount): return dropped error by @alrs in #8623
- deps: upgrade seaweedfs/raft to v1.1.7 by @chrislusf in #8677
- Fix lock table shared wait condition by @chrislusf in #8707
- wdclient/exclusive_locks: replace println with glog in ExclusiveLocker by @basic-system in #8723
- Fix stale admin lock metric when lock expires and is reacquired by @chrislusf in #8859
- dlm: resilient distributed locks via consistent hashing + backup replication by @chrislusf in #8860
- glog: add --log_max_size_mb and --log_max_files runtime flags by @jardelva96 in #8684
- glog: add --log_rotate_hours flag for time-based log rotation by @jardelva96 in #8685
- glog: add gzip compression for rotated log files by @jardelva96 in #8709
- glog: add JSON structured logging mode by @jardelva96 in #8708
- fix: keep metadata subscriptions progressing (#8730) by @chrislusf in #8746
- chore:(weed/worker/tasks/erasure_coding): Prune Unused and Untested Functions by @alrs in #8761
- fix: resolve Kafka gateway response deadlocks causing Sarama client hangs by @chrislusf in #8762
- Add insecure_skip_verify option for HTTPS client in security.toml by @chrislusf in #8781
- fix(weed/filer/store_test): fix dropped errors by @alrs in #8782
- Fix TUS chunked upload and resume failures (#8783) by @chrislusf in #8786
- chore(feed/worker): prune unused registerWorker() by @alrs in #8799
- sftpd: use global TLS-aware HTTP client for filer uploads by @chrislusf in #8795
- Prune Unused Functions from weed/s3api by @alrs in #8815
- notification.kafka: add SASL authentication and TLS support by @chrislusf in #8832
- fix unsupported platform container builds by @chrislusf in #8838
- weed/s3api: prune test-only functions by @alrs in #8840
- Use Unix sockets for gRPC in mini mode by @chrislusf in #8856
- Use Unix sockets for gRPC in weed server mode by @chrislusf in #8858
- Prune wdclient Functions by @alrs in #8855
- Prune Query Engine by @alrs in #8865
- Prune unused functions from weed/admin/dash. by @alrs in #8871
-
Grafana
-
Shell
- fix(shell): set LastLocalSyncTsNs in remote.copy.local so remote.uncache works by @chrislusf in #8604
- feat(shell): add volume.tier.compact command to reclaim cloud storage space by @chrislusf in #8715
- shell: add s3.bucket.access command for anonymous access policy by @chrislusf in #8774
- fix ec.balance failing to rebalance when all nodes share all volumes by @chrislusf in #8796
- fix balance fallback replica placement by @chrislusf in #8824
- fix(shell): avoid marking skipped or unplaced volumes as fixed by @qzhello in #8866
- Process .ecj deletions during EC decode and vacuum decoded volume by @chrislusf in #8863
-
S3 API
- fix(s3api): allow bucket recreation when orphaned collection exists by @chrislusf in #8605
- fix(s3): omit NotResource:null from bucket policy JSON response by @chrislusf in #8658
- fix(s3): return ETag header for directory marker PutObject requests by @chrislusf in #8688
- fix(s3): include directory markers in ListObjects without delimiter by @chrislusf in #8704
- fix(s3): allow deleting the anonymous user from admin webui by @chrislusf in #8706
- Preserve explicit directory markers with octet-stream MIME by @chrislusf in #8726
- fix: extend ignore404Error to match 404 Not Found string from S3 sink… by @Mmx233 in #8741
- Fix S3 delete for non-empty directory markers by @chrislusf in #8740
- S3: fix silent PutObject failure and enforce 1024-byte key limit by @chrislusf in #8764
- S3: add s3: prefix to x-amz-* condition keys for AWS compatibility by @chrislusf in #8765
- S3: reject part uploads after AbortMultipartUpload by @chrislusf in #8768
- fix: serialize SSE-KMS metadata when bucket default encryption applies KMS by @chrislusf in #8780
- s3api: make conditional mutations atomic and AWS-compatible by @chrislusf in #8802
- s3api: preserve lifecycle config responses for Terraform by @chrislusf in #8805
- s3: support s3:x-amz-server-side-encryption policy condition by @chrislusf in #8806
- s3api: accept all supported lifecycle rule types by @chrislusf in #8813
- ci: add S3 mutation regression coverage by @chrislusf in #8804
- fix(s3): preserve explicit directory markers during empty folder cleanup by @chrislusf in #8831
- s3api: skip TTL fast-path for versioned buckets by @chrislusf in #8823
-
Admin and Workers
- feat(admin): support env var and security.toml for credentials by @chrislusf in #8606
- Update admin UI secret example to match by @kallies in #8618
- feat(balance): add volume state filter (ALL/ACTIVE/FULL) by @chrislusf in #8619
- feat(plugin): enhanced collection filtering for volume balance by @chrislusf in #8620
- feat(plugin): DC/rack/node filtering for volume balance by @chrislusf in #8621
- feat(balance): replica placement validation for volume moves by @chrislusf in #8622
- feat: auto-disable master vacuum when plugin worker is active by @chrislusf in #8624
- feat(plugin): make page tabs and sub-tabs addressable by URLs by @chrislusf in #8626
- feat(vacuum): add volume state and location filters to vacuum handler by @chrislusf in #8625
- Fix ec.rebuild failing on unrepairable volumes instead of skipping by @chrislusf in #8632
- fix(ec): gather shards from all disk locations before rebuild by @chrislusf in #8633
- feat(plugin): EC shard balance handler for plugin worker by @chrislusf in #8629
- fix(mini): use "all" job type for plugin worker by @chrislusf in #8634
- feat(admin): add -urlPrefix flag for subdirectory deployment by @chrislusf in #8670
- fix(admin): show anonymous user in Object Store Users UI by @chrislusf in #8671
- admin: fix manual job run to use scheduler dispatch with capacity management and retry by @basic-system in #8720
- admin/plugin: migrate inline job details asynchronously to avoid slow startup by @basic-system in #8721
- admin/plugin: delete job_detail files when jobs are pruned from memory by @basic-system in #8722
- admin UI: add anonymous user creation checkbox by @chrislusf in #8773
- feat: separate scheduler lanes for iceberg, lifecycle, and volume management by @chrislusf in #8787
- Remove min_interval_seconds from plugin workers; vacuum default to 17m by @chrislusf in #8790
- s3lifecycle: add lifecycle rule evaluator package and extend XML types by @chrislusf in #8807
- lifecycle worker: detect buckets via lifecycle XML metadata by @chrislusf in #8808
- lifecycle worker: scan-time rule evaluation for object expiration by @chrislusf in #8809
- lifecycle worker: NoncurrentVersionExpiration support by @chrislusf in #8810
- lifecycle worker: fix ExpiredObjectDeleteMarker to match AWS semantics by @chrislusf in #8811
- lifecycle worker: drive MPU abort from lifecycle rules by @chrislusf in #8812
- lifecycle worker: add integration tests with in-memory filer by @chrislusf in #8818
- plugin scheduler: run iceberg and lifecycle lanes concurrently by @chrislusf in #8821
- fix(worker): pass compaction revision and file sizes in EC volume copy by @chrislusf in #8835
- Fix Admin UI master list showing gRPC port instead of HTTP port by @chrislusf in #8869
-
Filer Sync
- fix(replication): resume partial chunk reads on EOF instead of re-downloading by @chrislusf in #8607
- filer.sync: replace O(n) conflict check with O(depth) index lookups by @chrislusf in #8772
- Add -filerExcludePathPattern flag and fix nil panic in -filerExcludeFileName by @kisow in #8756
- filer.sync: pipelined subscription with adaptive batching for faster catch-up by @chrislusf in #8791
- filer.sync: send log file chunk fids to clients for direct volume server reads by @chrislusf in #8792
- filer.sync: support per-cluster mTLS with -a.security and -b.security by @chrislusf in #8872
-
Filer
- fix(filer): limit concurrent proxy reads per volume server by @chrislusf in #8608
- filer: propagate lazy metadata deletes to remote mounts by @petedodd-pd in #8522
- feat(filer): add lazy directory listing for remote mounts by @chrislusf in #8615
- filer: add conditional update preconditions by @chrislusf in #8647
- fix: resolve CORS cache race condition causing stale 404 responses by @chrislusf in #8748
- filer: add structured error codes to CreateEntryResponse by @chrislusf in #8767
- fix(filer): apply default disk type after location-prefix resolution in gRPC AssignVolume by @chrislusf in #8836
- Client disconnects create context cancelled errors, 500x errors and Filer lookup failures by @m-sementsov in #8845
- Retry uploader on volume full by @chrislusf in #8853
- Adjust rename events metadata format by @chrislusf in #8854
-
Remote Mount
- feat(remote.mount): add -metadataStrategy flag to control metadata caching by @petedodd-pd in #8568
- fix(remote): don't send empty StorageClass in S3 uploads by @chrislusf in #8645
- fix: clean up orphaned needles on remote.cache partial download failure by @chrislusf in #8675
- improve: large file sync throughput for remote.cache and filer.sync by @chrislusf in #8676
- fix(remote_gateway): prevent double-versioning when syncing to versioned central bucket by @chrislusf in #8710
-
S3 Table Buckets for Iceberg
- Add data file compaction to iceberg maintenance (Phase 2) by @chrislusf in #8503
- Change iceberg compaction target file size config from bytes to MB by @chrislusf in #8636
- iceberg: keep split bins within target size by @chrislusf in #8640
- iceberg: validate filer failover targets by @chrislusf in #8637
- iceberg: handle filer-backed compaction inputs by @chrislusf in #8638
- Iceberg table maintenance Phase 3: multi-spec compaction, delete handling, and metrics by @chrislusf in #8643
- iceberg: detect maintenance work per operation by @chrislusf in #8639
- iceberg: add resource-group proposal controls by @chrislusf in #8668
- iceberg: cache detection planning results by @chrislusf in #8667
- iceberg: add delete file rewrite maintenance by @chrislusf in #8664
- iceberg: add sort-aware compaction rewrite by @chrislusf in #8666
- build(deps): upgrade apache/iceberg-go from v0.4.0 to v0.5.0 by @chrislusf in #8713
-
FUSE Mount
- Make
weed-fusecompatible with systemd-based mount by @Victrid in #6814 - mount: async flush on close() when writebackCache is enabled by @chrislusf in #8727
- Use filer-side copy for mounted whole-file copy_file_range by @chrislusf in #8747
- Implement POSIX file locking for FUSE mount by @chrislusf in #8750
- Add FUSE integration tests for POSIX file locking by @chrislusf in #8752
- mount: implement create for rsync temp files by @chrislusf in #8749
- weed/mount: simplify metadata flush retry returns by @chrislusf in #8763
- mount: improve small file write performance by @chrislusf in #8769
- mount: stream all filer mutations over single ordered gRPC stream by @chrislusf in #8770
- fix(fuse-test): recover from FUSE directory loss in git pull test by @chrislusf in #8789
- stabilize FUSE git reset recovery by @chrislusf in #8825
- mount: add option to show system entries by @hexahigh in #8829
- Make
-
Master
- fix: improve raft leader election reliability and failover speed by @chrislusf in #8692
-
Volume Server
- Give the
ScrubVolume()RPC an option to flag found broken volumes as read-only. by @proton-lisandro-pin in #8360
- Give the
-
Rust Volume Server
- Rust volume server implementation with CI by @chrislusf in #8539
- docker: use alpine packages for Rust builder to fix linux/386 builds by @chrislusf in #8837
- fix large_disk container rust build by @chrislusf in #8839
New Contributors
- @moray95 made their first contribution in #8617
- @kallies made their first contribution in #8618
- @mtmn made their first contribution in #8635
- @jardelva96 made their first contribution in #8684
- @hoppla20 made their first contribution in #8683
- @jr200 made their first contribution in #8679
- @Mmx233 made their first contribution in #8741
- @andreasroste made their first contribution in #8372
- @hexahigh made their first contribution in #8829
Full Changelog: 4.17...4.18