4.48
OpenMOSS/MOSS-TTS-Nano4.48Sep 28, 2026by chrislusf
Upgrading?
AI Summary
This release focuses on S3 API enhancements, security hardening, and Rust volume engine improvements for SeaweedFS, including dependency updates and bug fixes.
Key Highlights
- Configurable trusted-proxy allowlist for AWS S3
- Security hardening with Go 1.26.6 and vulnerability fixes
- Rust volume engine improvements including stream tail scan
- Filer metadata preservation on shutdown
Breaking Changes
- Requires Go 1.26.6
- Rust library updates (tonic 0.14 / prost 0.14)
New Features
- S3 object lock retention enforcement
- Cloud/remote storage tiering concurrency controls
- S3Tables hiding inaccessible catalog resources
- Filer disableHttp flag
Full Release Notes
## What's Changed * filer: clean up manifest resolve error propagation and add webdav tes… by @giftz in https://github.com/seaweedfs/seaweedfs/pull/11297 * rust-volume: fix Windows build of find_needle_from_ecx by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11298 * test/ec: pin rack in seedAndSpread volume.grow to stop silent no-ops by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11299 * admin: bind worker gRPC listener to -ip instead of wildcard by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11300 * build(deps): bump github/codeql-action from 4.37.9 to 4.38.0 by @dependabot[bot] in https://github.com/seaweedfs/seaweedfs/pull/11311 * build(deps): bump golang.org/x/image from 0.45.0 to 0.46.0 by @dependabot[bot] in https://github.com/seaweedfs/seaweedfs/pull/11304 * build(deps): bump github.com/aws/aws-sdk-go-v2/credentials from 1.20.1 to 1.20.4 by @dependabot[bot] in https://github.com/seaweedfs/seaweedfs/pull/11305 * rust: clippy-clean both crates and adopt the std APIs the 1.91 MSRV allows by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11312 * shell: warn when fs.mergeVolumes source holds only orphan needles by @lucndm in https://github.com/seaweedfs/seaweedfs/pull/11310 * s3api: configurable trusted-proxy allowlist for aws:SourceIp (#11302) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11315 * build(deps): bump github.com/go-sql-driver/mysql from 1.10.0 to 1.10.1 by @dependabot[bot] in https://github.com/seaweedfs/seaweedfs/pull/11308 * admin: default to 0.0.0.0 for authenticated HTTP, keep worker gRPC on loopback by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11314 * build(deps): bump google.golang.org/api from 0.296.0 to 0.297.0 by @dependabot[bot] in https://github.com/seaweedfs/seaweedfs/pull/11307 * s3: populate Initiated timestamp in ListMultipartUploads by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11313 * helm: grant List to the generated read-only S3 identity by @rchenzheng in https://github.com/seaweedfs/seaweedfs/pull/11318 * build(deps): bump github.com/redis/go-redis/v9 from 9.21.0 to 9.22.0 by @dependabot[bot] in https://github.com/seaweedfs/seaweedfs/pull/11306 * s3: preserve versions for POST policy uploads by @davidchrisr in https://github.com/seaweedfs/seaweedfs/pull/11316 * Cloud/remote storage & tiering: configurable multipart upload/download concurrency by @jackusm in https://github.com/seaweedfs/seaweedfs/pull/11319 * rust: tonic 0.14 / prost 0.14, drop the result_large_err allow by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11327 * rust-volume: fold the 8–15-argument functions into parameter structs by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11328 * rust: cargo fmt both crates, with a commented-out fmt --check CI step by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11329 * s3: drain request body before error response by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11334 * s3: cover object lock retention on version deletes by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11335 * helm: roll master pods when master config changes by @banjoh in https://github.com/seaweedfs/seaweedfs/pull/11331 * rust volume: stream the tail scan and release the store lock by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11275 * s3: a list marker that sorts before the prefix excludes nothing by @robfischer1 in https://github.com/seaweedfs/seaweedfs/pull/11322 * shell: fs.verify -pruneEntries deletes entries whose needles are lost by @lucndm in https://github.com/seaweedfs/seaweedfs/pull/11338 * rust volume: parse vid/fid paths once; the proxy redirect drops the extension like Go by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11341 * ci: run seaweed-volume unit tests on Windows by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11349 * fix(volume): reject negative Size, recover poisoned store lock by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11345 * fix(ec): validate ShardId at gRPC boundary, reject >=32 by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11346 * filer: preserve accepted metadata log records on shutdown by @davidchrisr in https://github.com/seaweedfs/seaweedfs/pull/11359 * server: add filer-specific disableHttp flag by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11360 * s3: separate Object Lock configuration permission by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11361 * fix(ec): encode drops tombstoned needles, last-wins replay by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11347 * filer: join shutdown paths before closing metadata store by @davidchrisr in https://github.com/seaweedfs/seaweedfs/pull/11363 * fix(ec): BatchDelete cookie fail-closed via locate_data geometry by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11348 * admin: replace Font Awesome with MIT-licensed icons by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11364 * s3: enforce dedicated Object Lock actions by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11362 * s3tables: hide inaccessible catalog resources by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11365 * rust volume: one positional read helper; never seek a dup'd handle on Windows by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11342 * build(deps): bump go.opentelemetry.io/otel/exporters/otlp/otlptrace from 1.44.0 to 1.45.0 by @dependabot[bot] in https://github.com/seaweedfs/seaweedfs/pull/11372 * security: require go 1.26.6 and bump vulnerable deps by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11374 * build(deps): bump go.opentelemetry.io/otel/exporters/zipkin from 1.36.0 to 1.45.0 by @dependabot[bot] in https://github.com/seaweedfs/seaweedfs/pull/11373 * build(deps): bump go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc from 1.44.0 to 1.45.0 by @dependabot[bot] in https://github.com/seaweedfs/seaweedfs/pull/11371 * s3api: don't delete chunks when CreateEntry outcome is ambiguous by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11376 * ci: make telemetry deploy work on Oracle Linux 7 by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11377 * mount/shell: bucket allow-empty-folders toggle, mount keeps explicit false by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11370 * s3: commit multipart upload and remove .uploads atomically; purge completed uploads metadata-only by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11375 * s3: tighten STS session token handling by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11383 * s3api: unify auth error handling across s3tables, iceberg and lance by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11381 * s3: abort completed multipart uploads metadata-only by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11385 * s3: drop implicit reader cache budget that throttled S3 GETs by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11384 * s3api: delete orphaned chunks only when the entry is confirmed absent by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11389 * volume: validate copy/tail source addresses before dialing by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11390 * fix(volume): return an error instead of panicking on a corrupt needle size by @hsdfat in https://github.com/seaweedfs/seaweedfs/pull/11393 * s3api: add Snowflake s3compat API integration tests by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11394 * fix(volume): derive needle body tail bound from the version layout by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11395 * [Volume] Scrub local deletion tombstones during FULL scrub by @ssshr-66 in https://github.com/seaweedfs/seaweedfs/pull/11396 * fix(volume): return an error instead of 201 when a write lands on no volume by @hsdfat in https://github.com/seaweedfs/seaweedfs/pull/11397 * fix(volume): validate sizes in ReadNeedleBlob and WriteNeedleBlob by @hsdfat in https://github.com/seaweedfs/seaweedfs/pull/11399 * fix(volume): stop ScanVolumeFileFrom at a header it cannot advance past by @hsdfat in https://github.com/seaweedfs/seaweedfs/pull/11398 * s3: multipart upload checksum inheritance and validation by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11403 * helm: let admin.allowInsecureBind satisfy the admin auth render guard by @nevivurn in https://github.com/seaweedfs/seaweedfs/pull/11404 * rust volume: document every unsafe block and stop mutating the process env in tests by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11352 * rust volume: derive has_remote_file instead of mirroring it by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11353 * rust volume: typed errors for store compaction so gRPC can answer NotFound by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11355 * rust volume: keep the EC shard-location map, its refresh time and stale mark under one lock by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11356 * rust volume: one S3 tier registry instead of two kept in sync by hand by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11357 * rust: a seaweed-common crate for the address and TLS helpers both crates carry by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11358 * rust volume: share the I/O-error tracker between Volume and EcVolume by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11351 * rust volume: build outgoing gRPC clients in one place and give every dial a connect timeout by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11354 * volume server: HTTP DELETE on a distributed EC volume by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11405 * volume server: ReceiveFile loses bytes and hides fsync failures by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11407 * volume: load the .ecj deletion journal in chunks, and repair a torn tail by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11408 * volume: fix 5-byte index offset corruption in makeupDiff by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11411 * build(deps): bump cloud.google.com/go/kms from 1.33.0 to 1.34.0 by @dependabot[bot] in https://github.com/seaweedfs/seaweedfs/pull/11418 * build(deps): bump github.com/tarantool/go-tarantool/v3 from 3.0.1 to 3.0.2 by @dependabot[bot] in https://github.com/seaweedfs/seaweedfs/pull/11417 * build(deps): bump go.uber.org/atomic from 1.11.0 to 1.12.0 by @dependabot[bot] in https://github.com/seaweedfs/seaweedfs/pull/11416 * build(deps): bump github.com/aws/aws-sdk-go-v2/service/sts from 1.50.0 to 1.51.0 by @dependabot[bot] in https://github.com/seaweedfs/seaweedfs/pull/11420 * build(deps): bump golang.org/x/crypto from 0.56.0 to 0.57.0 by @dependabot[bot] in https://github.com/seaweedfs/seaweedfs/pull/11419 * build(deps): bump docker/setup-qemu-action from 4.3.0 to 4.4.0 by @dependabot[bot] in https://github.com/seaweedfs/seaweedfs/pull/11421 * build(deps): bump dorny/paths-filter from 3 to 4 by @dependabot[bot] in https://github.com/seaweedfs/seaweedfs/pull/11422 * build(deps): bump github/codeql-action from 4.38.0 to 4.38.1 by @dependabot[bot] in https://github.com/seaweedfs/seaweedfs/pull/11423 * rust volume: regression test for makeup_diff replay across a 32 GiB offset boundary (#11410) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11427 * [Volume] Keep DAT and index state consistent after async batch Sync failure by @ssshr-66 in https://github.com/seaweedfs/seaweedfs/pull/11425 * lance: authenticate the catalog with Bearer tokens and x-api-key by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11431 * volume: walk_index_file keeps row alignment across short reads by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11412 * volume server: the write queue answers uploads with the needle's real ETag by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11414 * volume: an EC volume needs an .ecx to mount, and a 0-byte stub never outranks a real index by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11415 * volume server: sweep stale EC artifacts before VolumeEcShardsGenerate re-encodes by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11413 * ecbalancer: let a non-overflow parity shard leave a data-bearing rack by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11438 * topology: wake the vacuum dispatcher when a worker frees quota by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11436 * filer: resolve the collection a bucket delete drops by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11439 * test(s3tables): add an OLake Iceberg catalog integration test by @pingqiu in https://github.com/seaweedfs/seaweedfs/pull/11441 * filer.remote.sync: stamp entries with IF_CHUNKS_EQUAL so a stale write-back cannot delete live chunks by @jsas in https://github.com/seaweedfs/seaweedfs/pull/11435 * volume server: validate ext and collection in gRPC CopyFile/ReceiveFile (Rust) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11451 * shell: refuse s3.bucket.create on an existing bucket by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11455 * volume server: VolumeMarkReadonly answers NotFound when the volume vanished under the lock by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11443 * filer: keep lazy remote reads from resurrecting deleted paths by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11452 * master,filer: fix lock ring poisoning after leader change by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11453 * s3api: exclude marker part in listObjectParts pagination by @Tyagiquamar in https://github.com/seaweedfs/seaweedfs/pull/11463 * volume: detect S3 not-found by typed SDK errors, not the "service error" string by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11444 * docs: restore the HTTP REST API reference by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11454 * volume: reject invalid -minFreeSpace and duration flags at startup like Go by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11447 * volume server: VolumeEcShardsDelete full teardown unloads every disk and keeps the shard gauge honest by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11446 * volume: one long-lived tokio runtime for blocking tiered S3 reads by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11448 * s3: honor assignment fsync in UploadWithRetry by @ilidemi in https://github.com/seaweedfs/seaweedfs/pull/11449 * shell: let volume.deleteEmpty drop volumes with no live needles by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11437 * volume server: do not finish a GET when the needle CRC mismatches by @Yi-111-a in https://github.com/seaweedfs/seaweedfs/pull/11464 * util: serialize all ViperProxy access so startup cannot hit concurrent map read/write by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11470 * volume: make volume.scrub report a live needle whose stored id is damaged by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11468 * volume: never finish serving a needle whose data fails its CRC by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11467 * s3: evaluate bucket policy before ACL public-read for anonymous requests by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11471 * volume: skip TTL last-write scan when it cannot fit its budget by @Tyagiquamar in https://github.com/seaweedfs/seaweedfs/pull/11472 * filer: honor is_moved only from ring member connections by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11456 * s3: keep dedicated object-lock actions pinned during action resolution by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11475 * s3: honor configured session bounds on AssumeRole and LDAP identity by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11478 * s3: record requester identity before the authz verdict by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11479 * vacuum: let the sweep release volumes that stay empty and quiet by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11477 * volume server: collect heartbeats under the store read lock, off the runtime by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11480 * volume server: stream ReadAllNeedles without holding the store lock by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11481 * volume server: run the vacuum compaction copy without the store lock by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11482 * volume: typed tier errors so a missing remote object answers NotFound by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11484 * fix(volume-rust): reserve a disk before replacing a replica in VolumeCopy, and check record counts by @hsdfat in https://github.com/seaweedfs/seaweedfs/pull/11483 * volume server: split volume_copy into phases and type the delete-after-status gate by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11485 * volume server: read GET/HEAD needles off the store lock, and only once by @franchb in https://github.com/seaweedfs/seaweedfs/pull/11487 * s3: require dedicated object-lock permissions for x-amz-object-lock-* headers by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11492 * s3: ignore empty intermediate directories in bucketHasUserObjects (#11490) by @Yi-111-a in https://github.com/seaweedfs/seaweedfs/pull/11491 * s3: keep a listing's start position inside the requested prefix by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11493 * s3: do not promote ?prefix into the object for non-List actions by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11494 * filer: demote client-cancelled directory listing log from error (#11495) by @Yi-111-a in https://github.com/seaweedfs/seaweedfs/pull/11496 * master: make volume capacity reservation timeout configurable (#11426) by @Yi-111-a in https://github.com/seaweedfs/seaweedfs/pull/11497 * volume: reclaim staged EC shard generations left by the 2PC switch by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11501 * filer: keep shared chunk buffers pinned while another stream reads them by @wzrdtales in https://github.com/seaweedfs/seaweedfs/pull/11502 * filer: pin-aware reader cache eviction and stream release by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/11503 ## Enterprise New Features ### KVCache (LLM inference KV-cache tiering — newest big subsystem) * LMCache-facing KV cache service; blog post went live recently * Remote-mounted entries in cache lifecycle, path-based cleanup of non-hot entries in retired volumes * File path stored in first chunk for direct promotion lookup * Per-collection write concurrency config, bounded cleanup memory * CLI/probes moved into seaweedkv-tools ### Table endpoints + tiering (S3-integrated analytical catalogs) * S3 Tables, Iceberg, and Lance catalog endpoints; unified auth across all three * Lance catalog Bearer/x-api-key auth * Automatic table cache admission (bounded), Lance metadata-range caching * Table placement reconciliation, Snowflake s3compat + OLake Iceberg integration tests ### Remote tiering (volume → S3/remote) * Configurable multipart upload/download concurrency * Typed tier errors (missing remote object → NotFound), S3 object write lock for migrations * One long-lived tokio runtime for blocking tiered reads (Rust) ## New Contributors * @davidchrisr made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/11316 * @jackusm made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/11319 * @banjoh made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/11331 * @robfischer1 made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/11322 * @nevivurn made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/11404 * @jsas made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/11435 * @ilidemi made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/11449 * @Yi-111-a made their first contribution in https://github.com/seaweedfs/seaweedfs/pull/11464 **Full Changelog**: https://github.com/seaweedfs/seaweedfs/compare/4.47...4.48
Related Repositories
public-apis/public-apis★ 491,126
A collective list of free APIs
NousResearch/hermes-agent★ 255,899
The agent that grows with you
yt-dlp/yt-dlp★ 199,996
A feature-rich command-line audio/video downloader
microsoft/markitdown★ 191,480
Python tool for converting files and office documents to Markdown.
Significant-Gravitas/AutoGPT★ 187,700
AutoGPT is the vision of accessible AI for everyone, to use and to build on. Our mission is to provide the tools, so that you can focus on what matters.