Commit Graph

688 Commits

Author SHA1 Message Date
Zhengchao An 77e45896ba refactor(runtime): remove unused node names global (#4093) 2026-06-30 04:44:17 +08:00
Zhengchao An c279d34af6 refactor(runtime): batch owner boundary guards (#4092) 2026-06-30 04:34:54 +08:00
Zhengchao An 47b12972ad refactor(lifecycle): add object lock boundary (#4084) 2026-06-30 04:11:03 +08:00
houseme 3d868cb6e8 perf: add list objects quorum tuning knob (#4072) 2026-06-30 03:41:29 +08:00
Zhengchao An f99429f2f2 refactor(lifecycle): add tagging boundary (#4082) 2026-06-30 03:39:32 +08:00
Zhengchao An fb7bcfb541 refactor(replication): add tagging boundary (#4081) 2026-06-30 03:39:17 +08:00
Zhengchao An 4f335889c1 refactor(lifecycle): add config persistence boundary (#4080) 2026-06-30 02:10:12 +08:00
Zhengchao An 35d7d6bf23 refactor(ecstore): wrap background cancel token access (#4078) 2026-06-30 02:09:39 +08:00
Zhengchao An d3a84395dc refactor(replication): add msgp boundary (#4076) 2026-06-30 02:09:14 +08:00
Zhengchao An f401a4388e fix(ecstore): tolerate OnceLock re-initialization in tests (#4074) 2026-06-30 00:18:28 +08:00
Zhengchao An c17df6e3d3 refactor(replication): add lock boundary (#4075) 2026-06-30 00:18:08 +08:00
Zhengchao An 50ca1c2cbe refactor(replication): add config store boundary (#4073) 2026-06-30 00:03:45 +08:00
Zhengchao An f8c70e017d refactor(replication): add versioning boundary (#4071) 2026-06-29 23:52:36 +08:00
Zhengchao An 04e8c1bb6b refactor(replication): add metadata boundary (#4070) 2026-06-29 23:24:39 +08:00
Zhengchao An f1ec0bd765 refactor(replication): add target boundary (#4069) 2026-06-29 22:59:10 +08:00
Zhengchao An c94f2981d7 refactor(replication): add event sink boundary (#4068) 2026-06-29 22:46:06 +08:00
Zhengchao An 13474ec1de refactor(replication): add runtime boundary (#4067) 2026-06-29 22:34:10 +08:00
Zhengchao An e9a89e13ae refactor(lifecycle): route events through audit sink (#4066) 2026-06-29 22:21:23 +08:00
Zhengchao An 7c2789e75a refactor(runtime): guard endpoint port source (#4064) 2026-06-29 21:56:57 +08:00
Zhengchao An a7dd9603e9 refactor(ecstore): add mmap copy disk read name (#4061) 2026-06-29 21:18:41 +08:00
GatewayJ 14e9fa2c8d fix(ecstore): avoid startup pool meta locks (#4056) 2026-06-29 20:19:38 +08:00
Zhengchao An 27a491a730 refactor(runtime): guard replication stats globals (#4058) 2026-06-29 19:55:38 +08:00
Zhengchao An 35077c033c refactor(runtime): guard endpoint erasure globals (#4055) 2026-06-29 19:26:05 +08:00
Zhengchao An 0cd08eae1c refactor(runtime): remove stale lifecycle state comments (#4051) 2026-06-29 17:29:57 +08:00
Zhengchao An 726bf142e0 refactor(runtime): remove stale tier transport comments (#4050) 2026-06-29 17:29:46 +08:00
Zhengchao An 2b04bf3a19 refactor(runtime): remove stale lifecycle global comment (#4048) 2026-06-29 16:33:49 +08:00
Zhengchao An ecbc5385d3 refactor(runtime): hide local disk id global (#4047) 2026-06-29 16:33:36 +08:00
Zhengchao An ad6be6a167 refactor(runtime): hide local disk map global (#4046) 2026-06-29 14:57:14 +08:00
Zhengchao An 4111ce1547 refactor(runtime): wrap tier config global (#4045) 2026-06-29 14:38:36 +08:00
Zhengchao An e012d1e799 refactor(runtime): wrap boot time global (#4044) 2026-06-29 14:21:31 +08:00
Zhengchao An 4567f6f521 refactor(runtime): guard rpc secret global (#4043) 2026-06-29 14:02:03 +08:00
Zhengchao An 6093eb0c9c refactor(runtime): wrap local node name global (#4041) 2026-06-29 13:13:54 +08:00
Zhengchao An 9414d645f4 refactor(runtime): wrap rustfs address globals (#4037) 2026-06-29 11:18:30 +08:00
Zhengchao An 9165de3241 refactor(runtime): wrap internode connection cache (#4036) 2026-06-29 10:43:13 +08:00
Zhengchao An 801838fdbd test(ecstore): guard replication facade boundary (#4035) 2026-06-29 10:32:09 +08:00
Zhengchao An 319497446b refactor(ecstore): add lifecycle runtime boundary (#4034)
Co-authored-by: houseme <housemecn@gmail.com>
2026-06-29 10:31:49 +08:00
Zhengchao An 1e6f20912a test(ecstore): cover SetDisks storage contracts (#4033) 2026-06-29 10:01:42 +08:00
Zhengchao An ea88f5b67b refactor(obs): use lifecycle runtime facades (#4031) 2026-06-29 09:29:50 +08:00
Zhengchao An 51d44f20c7 docs(ecstore): inventory replication split blockers (#4027) 2026-06-29 07:57:48 +08:00
Zhengchao An 763cbdd5b7 docs(ecstore): inventory lifecycle split blockers (#4026) 2026-06-29 07:57:22 +08:00
Zhengchao An aaef31d4dd docs(ecstore): inventory api facade boundaries (#4025) 2026-06-29 07:57:01 +08:00
Zhengchao An 8284e6a75c config: add mmap read env alias (#4021) 2026-06-28 23:24:24 +08:00
houseme 0485e5adf0 feat(get): Small-file GET performance optimization for 1KiB-1MiB objects (#4016)
* feat(get): SF01 - bucket validation cache

Add 5s TTL cache for bucket validation to avoid repeated stat_volume()
calls on every GET request.

Changes:
- Add BUCKET_VALIDATED_CACHE (OnceLock + RwLock + HashMap)
- Add invalidate_bucket_validation_cache() for cache invalidation
- Add invalidate_all_bucket_validation_cache() for bulk invalidation
- Update get_validated_store() to use cache
- Add cache invalidation in execute_delete_bucket()

Expected impact: 3-5x improvement for small file GET latency.

Closes rustfs/backlog#766

Co-Authored-By: heihutu <heihutu@gmail.com>

* feat(get): SF03 - metadata cache TTL increase

Increase metadata cache TTL from 250ms to 2s and capacity from 1024
to 4096 entries.

Changes:
- GET_OBJECT_METADATA_CACHE_TTL: 250ms -> 2s
- GET_OBJECT_METADATA_CACHE_MAX_ENTRIES: 1024 -> 4096

All mutation paths already call invalidate_get_object_metadata_cache,
so the longer TTL is safe.

Expected impact: 10-50x improvement for hot objects.

Closes rustfs/backlog#768

Co-Authored-By: heihutu <heihutu@gmail.com>

* feat(get): SF04 - remove unnecessary tokio::spawn in metadata fanout

Replace tokio::spawn with direct async future in read_all_fileinfo_full_wait.
join_all already provides concurrency, so tokio::spawn adds unnecessary
task creation and scheduling overhead.

Changes:
- Remove tokio::spawn from metadata fanout futures
- Update result handling for direct future results

Expected impact: 16-32us reduction per GET request.

Closes rustfs/backlog#769

Co-Authored-By: heihutu <heihutu@gmail.com>

* feat(get): SF06 - conditional lifecycle check

Only call resolve_put_object_expiration when the object has an
x-amz-expiration metadata marker. This avoids unnecessary lifecycle
configuration reads on every GET request.

Expected impact: 50-100us reduction per GET request.

Closes rustfs/backlog#771

Co-Authored-By: heihutu <heihutu@gmail.com>

* feat(get): SF07 - conditional metrics recording

Gate hot path metrics behind get_stage_metrics_enabled() to reduce
overhead when metrics are not needed.

Changes:
- Conditional record_zero_copy_read
- Conditional manager.record_disk_operation
- Conditional manager.record_access
- Conditional manager.record_transfer

Expected impact: 20-50us reduction per GET request.

Closes rustfs/backlog#772

Co-Authored-By: heihutu <heihutu@gmail.com>

* refactor(get): SF01 - use moka instead of dashmap for bucket cache

Replace OnceLock + RwLock + HashMap with moka::sync::Cache for bucket
validation cache. moka provides built-in TTL support and is already
available in the workspace.

Changes:
- Add moka dependency to rustfs crate
- Replace manual TTL management with moka's time_to_live
- Simplify cache operations

Closes rustfs/backlog#766

Co-Authored-By: heihutu <heihutu@gmail.com>

* feat(get): SF02 - inline data fast path

Add fast path for small inline objects that bypasses duplex pipe,
tokio::spawn, and bitrot reader creation when data is already in memory.

Changes:
- Add inline data detection before codec streaming gate
- Direct in-memory erasure decode for inline objects <= 128KB
- Add GET_OBJECT_PATH_INLINE_DIRECT metric path
- Skip duplex pipe and background task for inline data

Conditions for fast path:
- Single part object
- Inline data available
- Size <= 128KB
- Not encrypted/compressed/remote
- No range request

Expected impact: 2-3x improvement for small file GET latency.

Closes rustfs/backlog#767

Co-Authored-By: heihutu <heihutu@gmail.com>

* refactor: translate Chinese comments to English

Translate all Chinese comments to English in modified files:
- rustfs/src/storage/ecfs_extend.rs
- rustfs/src/app/bucket_usecase.rs

Co-Authored-By: heihutu <heihutu@gmail.com>

* fix

* add

* fmt and improve import

* fmt

* feat(get): SF05 skip IO planning + refactor inline detection + adaptive bucket cache

SF05: Skip disk I/O semaphore for inline data fast path
- Reorder prepare_get_object_read_execution: read first, then decide semaphore
- Inline objects skip acquire_disk_read_permit() entirely (saves 100-200us)
- Add is_inline_fast_path field to GetObjectReadSetup

Refactor: Unify inline detection logic
- Add ObjectInfo::is_inline_fast_path_eligible() as single source of truth
- Version-aware thresholds: non-versioned 128KB, versioned 16KB (matches PUT)
- Eliminates divergent conditions between set_disk/mod.rs and object_usecase.rs

Refactor: Restore fault tolerance in metadata fanout
- Restore tokio::spawn + JoinError handling in read_all_fileinfo_full_wait
- Prevents single disk read panic from unwinding the entire operation

Refactor: Restore lifecycle check correctness
- Remove incorrect SF06 conditional that skipped lifecycle for most objects
- Always call resolve_put_object_expiration (original behavior)

Fix: make_bucket cache invalidation
- Invalidate bucket validation cache on create_bucket

Fix: erasure decode written validation
- Check decode() return value; error if 0 bytes written for non-empty object

Adaptive bucket cache
- Default: RwLock<HashMap> for < 100 buckets (low overhead)
- Opt-in: starshard::ShardedHashMap via RUSTFS_BUCKET_CACHE_STARSHARD=1
- 5s TTL with manual timestamp checking

Benchmark results (warp get, concurrency 32, 10s, 3 rounds):
- 10KiB: 25.10 MiB/s (+28.2% vs SF01-07)
- 100KiB: 221.81 MiB/s
- 1MiB: 1972.78 MiB/s
- vs main: -10% to -12% (inline path not triggered by warp)

Co-Authored-By: heihutu <heihutu@gmail.com>

* fix(versioning): use read lock for versioning config query + five-expert analysis

P0 fix: BucketVersioningSys::get() was using write lock on
GLOBAL_BucketMetadataSys for a pure read operation. This serialized
all concurrent GET requests (3 write-lock acquisitions per request).

Changed to read lock — get_versioning_config() handles its own
internal locking via metadata_map RwLock.

Five-expert analysis identified top bottlenecks:
1. Versioning write lock (P0, fixed)
2. Inline fast path not triggered (P0, needs verification)
3. Metadata fanout no early-stop (P1, early-stop has bug, reverted)
4. Request-level versioning cache (P1, pending)
5. Duplex pipe for small objects (P2, pending)

Benchmark (read-lock fix, warp concurrency 32):
- 1KiB: 2.29 MiB/s (vs 2.53 before, within variance)
- 10KiB: 25.00 MiB/s (same as before)
- 100KiB: 246.72 MiB/s (+11% vs 221.81)
- 1MiB: 2039.95 MiB/s (+3% vs 1972.78)

Co-Authored-By: heihutu <heihutu@gmail.com>

* chore: remove benchmark results from git, keep locally only

Remove docs/benchmark/*.md from version control.
Files remain on disk but are no longer tracked by git.
Added docs/benchmark/*.md to .gitignore.

Co-Authored-By: heihutu <heihutu@gmail.com>

* fix(get): decode inline fast path through bitrot readers

---------

Co-authored-by: heihutu <heihutu@gmail.com>
2026-06-28 22:35:42 +08:00
Zhengchao An f5d7fea7a4 fix(ecstore): remove unused mirror fields (#4019) 2026-06-28 22:31:37 +08:00
Zhengchao An ed0f191e1a docs: document global singleton migration plan (#730) (#4015)
docs: document global singleton migration plan

Add comments documenting the Tier A/B classification and migration
plan for global singletons in ecstore runtime.

Refs #730
2026-06-28 21:25:42 +08:00
Zhengchao An 710ae74cde perf: add S3 operations benchmark framework (#738) (#4005) 2026-06-28 18:02:41 +08:00
Zhengchao An ee82d6c026 test: add insta snapshot test for storage error display format (#740) (#4001)
test: add insta snapshot test for storage error display format

Add snapshot test to detect unexpected changes in StorageError
display format. This catches output format regressions that
traditional assert tests might miss.

Refs #740
2026-06-28 16:10:07 +08:00
Zhengchao An c475d03b48 fix: replace unwrap() with expect() in more files (#729 batch 14) (#3994) 2026-06-28 11:45:23 +08:00
Zhengchao An 05d201679c fix: replace unwrap() with expect() in more files (#729 batch 13) (#3993) 2026-06-28 11:45:13 +08:00
Zhengchao An f0ab812213 fix: replace unwrap() with expect() in remaining files (#729 batch 12) (#3992) 2026-06-28 11:45:03 +08:00