houseme
27468ebfa9
feat(get): consolidate GET performance optimization ( #3972 )
...
* feat(get): consolidate GET performance optimization
Consolidated implementation of all GET performance optimizations into
a single, well-organized commit replacing the previous patch-on-patch
approach.
## Changes
### Configuration (set_disk/mod.rs)
- Consolidated all GET optimization flags into a single organized section
- Enabled by default: codec streaming, metadata early-stop, page cache reclaim
- Added codec streaming multipart flag (default: disabled)
- Added version-aware early-stop flag (default: disabled)
- Added adaptive duplex buffer sizing based on object size
- All flags use OnceLock caching with rollout percentage support
### Metadata Early-Stop (set_disk/read.rs)
- Delete marker early-stop when quorum agrees
- Version-aware early-stop for versioned GET requests
- MetadataQuorumAccumulator enhanced with:
- delete_marker_votes tracking
- requested_version_id and matching_version_votes tracking
- version_early_stop_decision() method
- 6 new tests for version early-stop scenarios
### Codec Streaming (erasure/coding/decode_reader.rs)
- DualInFlight (2-stripe lookahead) enabled by default
### Decode Pipeline (erasure/coding/decode.rs)
- Stripe prefetch count configuration
- Bitrot-decode overlap configuration
### Disk Layer (disk/local.rs)
- O_DIRECT read configuration constants (preparation)
### Metrics (io-metrics/lib.rs)
- BytesPool acquisition/return metrics
- Metadata phase duration with early-stop label
- Total duration with reader_path label
### Diagnostics (diagnostics/)
- Early-stop reason constants
- Pool tier/outcome label constants
### Observability (.docker/observability/)
- 3 Grafana dashboards for GET optimization monitoring
- Prometheus alert rules (6 alerts: 3 critical, 3 warning)
- Updated README.md and README_ZH.md with usage docs
### Config (config/src/constants/runtime.rs)
- Page cache reclaim read enabled by default
## Environment Variables
| Variable | Default | Description |
|----------|---------|-------------|
| RUSTFS_GET_CODEC_STREAMING_ENABLE | true | Codec streaming base flag |
| RUSTFS_GET_CODEC_STREAMING_ROLLOUT_PCT | 100 | Codec streaming rollout % |
| RUSTFS_GET_CODEC_STREAMING_MULTIPART_ENABLE | false | Multipart codec streaming |
| RUSTFS_GET_METADATA_EARLY_STOP_ENABLE | true | Early-stop base flag |
| RUSTFS_GET_METADATA_EARLY_STOP_ROLLOUT_PCT | 100 | Early-stop rollout % |
| RUSTFS_GET_METADATA_VERSION_EARLY_STOP_ENABLE | false | Version-aware early-stop |
| RUSTFS_OBJECT_FILE_CACHE_RECLAIM_READ_ENABLE | true | Page cache reclaim |
| RUSTFS_OBJECT_DIRECT_IO_READ_ENABLE | false | O_DIRECT (preparation) |
| RUSTFS_GET_DECODE_STRIPE_PREFETCH_COUNT | 1 | Stripe prefetch |
| RUSTFS_GET_BITROT_DECODE_OVERLAP_ENABLE | false | Bitrot-decode overlap |
| RUSTFS_GET_CODEC_STREAMING_MAX_INFLIGHT | 2 | DualInFlight stripes |
## Rollback
All optimizations can be disabled via environment variables:
RUSTFS_GET_CODEC_STREAMING_ENABLE=false
RUSTFS_GET_METADATA_EARLY_STOP_ENABLE=false
RUSTFS_OBJECT_FILE_CACHE_RECLAIM_READ_ENABLE=false
Co-Authored-By: heihutu <heihutu@gmail.com >
* test(get): add stress test scripts for GET optimization validation
- quick-validate-get-optimization.sh: Quick 5-minute validation
- stress-test-get-optimization.sh: Full 30+ minute stress test
- README-stress-test.md: Usage documentation
Co-Authored-By: heihutu <heihutu@gmail.com >
* test(ecstore): align file cache reclaim defaults
* chore(deps): update redis and erasure codec
* test(ecstore): align decode fill policy default
* test(ecstore): align metadata early-stop default
* fix(ecstore): keep metadata early stop opt-in
---------
Co-authored-by: heihutu <heihutu@gmail.com >
2026-06-28 07:14:07 +08:00
Zhengchao An
512418cda9
fix(ecstore): replace unbounded metadata cache with moka ( #743 ) ( #3970 )
...
fix(ecstore): replace unbounded metadata cache with moka
Replace the manual Arc<RwLock<HashMap>> metadata cache with
moka::future::Cache, which provides:
- Built-in LRU eviction when max_capacity is reached
- Automatic TTL expiry via time_to_live (250ms)
- Lock-free concurrent reads
- Non-blocking invalidation
Fixes the memory leak risk from unbounded HashMap and the
all-or-nothing eviction logic that cleared all entries at once.
Closes #743
Co-authored-by: houseme <housemecn@gmail.com >
2026-06-28 03:01:32 +08:00
houseme
bf03ff2869
feat(get): add limited opt-in rollout gates ( #3963 )
...
* feat(bench): harden cooled get ab harness
* feat(get): add limited opt-in rollout gates
* fix(get): tighten rollout gate fallbacks
2026-06-27 23:13:02 +08:00
houseme
de86025f2c
feat(get): overlap read verify decode ( #3945 )
2026-06-27 15:14:44 +08:00
houseme
58b76a3d45
feat(get): add codec engine ab matrix ( #3940 )
...
* upgrade version
* feat(get): add codec engine ab matrix
* chore(get): drop unrelated dependency drift
* upgrade version
* upgrade version
* fix cargo deny
2026-06-27 13:27:16 +08:00
GatewayJ
675597ec16
fix(ecstore): handle stalled recovery reads and listings ( #3790 )
...
* fix(ecstore): handle stalled recovery reads and listings
* fix(rio): start HTTP stall timeout on read
* fix(ecstore): handle stalled reads and partial lists
* fix(ecstore): retire stalled shards and list errors
* fix(ecstore): preserve list merge lookahead entries
* fix(ecstore): bound zero-copy shard reads
* fix(ecstore): hedge stalled shard reads
* fix(ecstore): retire abandoned shard reads
* fix(ecstore): include part identity in metadata quorum
* fix(ecstore): validate heal shard sources
* fix(ecstore): verify reconstructed read shards
* chore(ecstore): log slow object read stages
* fix(heal): throttle auto heal during recovery
* fix(scanner): yield to foreground reads
* fix(scanner): track streaming object reads
* fix(ecstore): avoid false read heal fanout
* fix(ecstore): verify codec streaming reconstruction sources
* fix(ecstore): preserve quorum progress on slow shards
* fix(storage): restore read timeout facade
* fix(ecstore): retain fallback readers after quorum
* chore: allow decode helper argument lists
---------
Co-authored-by: overtrue <anzhengchao@gmail.com >
2026-06-27 10:21:09 +08:00
Zhengchao An
0a5b1b1b3a
refactor: consolidate ecstore owner module layout ( #3934 )
...
* refactor: shrink ecstore root owner facades
* refactor: remove ecstore core store root shims
* refactor: move ecstore erasure owner modules
* refactor: remove ecstore root rpc facade
* refactor: move ecstore services domain modules
2026-06-27 09:03:20 +08:00
houseme
ae4aa4f5d4
feat(get): add rustfs codec decode engine ( #3928 )
2026-06-27 08:35:38 +08:00
cxymds
688b14b572
fix(ecstore): preserve multipart part quorum errors ( #3920 )
...
* fix(ecstore): preserve multipart part quorum errors
* fix(ecstore): honor confirmed missing part quorum
* fix(ecstore): add multipart quorum diagnostics
2026-06-27 08:33:43 +08:00
houseme
c0ddc14bb8
feat(get): observe shard locality cost ( #3922 )
...
* feat(get): observe shard locality cost
* fix(storage): avoid request counter underflow panic
* fix(storage): import put guard in concurrency tests
2026-06-26 23:50:37 +08:00
houseme
2c04807f05
feat(get): add guarded metadata early stop ( #3916 )
...
* feat(get): add v2 metrics compatibility harness
* feat(get): observe metadata fanout quorum (#3915 )
* feat(get): observe metadata fanout quorum
* fix(app): use storage ECStore type in app boundary
* feat(get): add guarded metadata early stop
2026-06-26 21:56:23 +08:00
houseme
5a78a9c416
feat(get): add v2 metrics compatibility harness ( #3913 )
...
* feat(get): add v2 metrics compatibility harness
* feat(get): observe metadata fanout quorum (#3915 )
* feat(get): observe metadata fanout quorum
* fix(app): use storage ECStore type in app boundary
----
Co-Authored-By: heihutu <heihutu@gmail.com >
2026-06-26 20:09:09 +08:00
houseme
0321e4c6ca
perf(get): reduce metrics and streaming handoff overhead ( #3907 )
2026-06-26 18:12:51 +08:00
Zhengchao An
72ae43cb90
refactor: segment external storage contract imports ( #3908 )
2026-06-26 16:44:59 +08:00
cxymds
90638bfc19
fix(heal): add backpressure to repair admission ( #3900 )
2026-06-26 15:19:37 +08:00
houseme
7bf411f465
obs(get): add GET read pipeline metrics ( #3868 )
2026-06-26 04:02:02 +08:00
Zhengchao An
94034ef406
refactor: centralize ecstore batch sources and aliases ( #3817 )
2026-06-24 14:12:48 +08:00
cxymds
2f25cf606e
fix(storage): harden rebalance decommission state ( #3515 )
2026-06-22 12:03:13 +08:00
houseme
e69e32285b
fix(ecstore): harden multipart part metadata visibility ( #3042 )
...
* fix(ecstore): harden multipart part metadata visibility
* fix(ecstore): address PR3042 review follow-ups
2026-05-21 14:47:52 +00:00
houseme
2953558f41
fix(lifecycle): prevent eager date-expiry deletion on config update ( #2708 )
2026-04-28 10:26:14 +00:00
安正超
6d476ae9a1
revert: remove BlockReadable trait and chunk-based I/O from rio, ecstore, disk layers ( #2533 )
2026-04-14 19:09:02 +08:00
安正超
458086dc80
fix(get): remove GET chunk fast path ( #2507 )
2026-04-12 23:12:23 +08:00
Mohamed Zenadi
c8c71e34b6
fix(storage): fix critical bug in range calculation ( #2493 )
...
Signed-off-by: Mohamed Zenadi <zeapo@users.noreply.github.com >
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com >
2026-04-12 00:20:15 +08:00
houseme
32bf8f5bf3
feat(storage): add direct chunk GET fast path ( #2351 )
...
Signed-off-by: houseme <housemecn@gmail.com >
Co-authored-by: heihutu <heihutu@gmail.com >
Co-authored-by: cxymds <Cxymds@qq.com >
2026-04-07 08:33:46 +08:00
houseme
7172e151de
fix: address correctness, safety, and concurrency issues ( #2327 )
...
Co-authored-by: heihutu <heihutu@gmail.com >
Co-authored-by: houseme <housemecn@gmail.com >
2026-03-30 00:30:57 +08:00
weisd
41dcebda44
fix(tier): sweep transitioned copies from delete handlers ( #2287 )
2026-03-25 16:06:36 +08:00
weisd
b9b7d86ae4
feat: improve legacy metadata and admin compatibility ( #2202 )
2026-03-18 21:05:09 +08:00
evan slack
4b480727d6
feat(perf): Add configurable bitrot skip for reads ( #2110 )
...
Co-authored-by: houseme <housemecn@gmail.com >
Co-authored-by: 安正超 <anzhengchao@gmail.com >
2026-03-11 10:59:00 +08:00
安正超
7f132a290c
refactor(ecstore): split set_disk.rs into submodules ( #1945 )
2026-02-25 07:41:08 +08:00