4.48
bytedance/flowgram.ai4.48Sep 28, 2026by chrislusf
Upgrading?
AI Summary
A maintenance release for SeaweedFS featuring dependency updates, Windows build fixes, and improvements to S3 API, Object Lock, and volume handling.
Key Highlights
- Fixed Windows build of rust-volume
- Added configurable trusted-proxy allowlist for S3 API
- Updated Rust components to use standard APIs (tonic 0.14, prost 0.14)
- Improved S3 multipart upload and Object Lock configuration
- Fixed volume corruption and needle size validation
New Features
- Configurable trusted-proxy allowlist for aws:SourceIp
- Configurable multipart upload/download concurrency
- Snowflake s3compat API integration tests
- Preserve versions for POST policy uploads
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
openclaw/openclaw★ 392,706
The AI that really does things. Any OS. Any Platform. The lobster way. 🦞
nilbuild/developer-roadmap★ 370,075
Interactive roadmaps, guides and other educational content to help developers grow in their careers.
morluto/rea★ 358,411
Reverse engineer anything with agents, from app behavior down to native binaries.
anomalyco/opencode★ 219,729
The open source coding agent.
n8n-io/n8n★ 208,261
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.