🟡 [M3] read_cache 零长度读取命中空缓存槽 #13
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
文件:
core/io/read_cache.rs:76-84分类: 缓存边界
问题:
get(file, 0, 0)会命中空的缓存槽(因为block_offset==0, len==0),返回Ok(&[])而不实际读文件。建议修复: 特殊处理
len==0,或要求slot.len > 0才算命中。修复方案
根因
缓存命中条件
slot.block_offset == aligned_key && request_end <= slot.block_offset + slot.len未检查slot.len > 0,导致初始化状态的空槽(block_offset=0, len=0)被get(file, 0, 0)误判为命中,返回Ok(&[])而跳过read_at和错误检查。改动(commit d37ed6d)
get()顶部加if len == 0 { return Ok(&[]) }slot.len > 0request_end改用checked_addblock_end/bytes_end改用saturating_addclear()完全重置槽位pub mod read_cache新增回归测试(4 个)
zero_len_read_is_noop_on_fresh_cache— 新缓存 + 空文件,get(0,0) 不触发 read_atzero_len_read_is_noop_on_populated_cache— 已缓存后 get(0,0) 不改变 LRU 状态zero_len_read_at_max_offset_is_ok— get(u64::MAX, 0) 不溢出nonzero_read_range_overflow_returns_invalid_input— get(u64::MAX, 1) 返回 InvalidInput测试结果
18 passed, 0 failed(14 原有 + 4 新增)