mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-14 17:13:13 +00:00
8d34b4d101
StdBackend opened, stat'd, and access-checked the shard file on every positioned read, so each small-object GET paid N x (open + access + fstat) syscalls even for hot shards. UringBackend already caches descriptors behind a generation-guarded, rlimit-bounded moka cache with full rename/delete/heal invalidation; StdBackend had no equivalent. Port that cache to the default backend: - StdBackend gains an `fd_cache: Option<FdCache>` (Linux only, mirroring UringBackend), built in `new()` behind `RUSTFS_LOCAL_FD_CACHE` (default on) and the same `rlimit_allows_fd_cache` guard. - pread_bytes consults the cache on the buffered path: a hit reuses the descriptor via `dup` (one syscall, no path resolution or permission re-check) and skips volume access; a miss opens as before, snapshots the invalidation generation, and hands the freshly opened descriptor back for `insert_if_fresh`, which refuses to cache if a heal/delete bumped the generation mid-open (rustfs/backlog#1176). O_DIRECT reads keep opening their own aligned descriptors. - The DirectReadCopy branch switches from seek+read_exact to `FileExt::read_exact_at`: a `dup`'d cached descriptor shares the source descriptor's open-file offset, so a positioned read (like the mmap path's offset argument) keeps concurrent cache hits on the same shard correct. - The four `LocalIoBackend` invalidation methods now drop stale entries on StdBackend. LocalDisk already calls them on rename_data/rename_file/ delete/delete_volume/close, so no new call sites are needed. - Two tests mirror the io_uring ones: a heal rename must be hidden until invalidate_cached_fds_under runs, and a repeated read caches exactly one descriptor that prefix invalidation drops. Behavior is byte-for-byte unchanged on a miss and on non-Linux; the cache is auto-disabled only when RLIMIT_NOFILE is too low. macOS cargo check --lib and --tests pass; Linux compile deferred to CI. Co-authored-by: heihutu <heihutu@gmail.com>