4.48

vectorize-io/hindsight4.48Sep 28, 2026by chrislusf

Upgrading?

AI Summary

This release focuses on S3 API improvements, Object Lock configuration, Windows compatibility fixes, and various dependency updates.

Key Highlights

  • Configurable multipart upload/download concurrency.
  • Object Lock configuration permissions separated into dedicated actions.
  • Windows build fixes for volume operations.
  • Configurable trusted-proxy allowlist for AWS S3.
  • S3 API improvements including versioning and object lock handling.

New Features

  • Multipart upload/download concurrency settings
  • Object Lock permission separation
  • Windows build support
  • S3 trusted proxy allowlist
  • S3 API enhanced versioning and lock support

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