文件: core/io/read_cache.rs:76-84 分类: 缓存边界
core/io/read_cache.rs:76-84
问题: get(file, 0, 0) 会命中空的缓存槽(因为 block_offset==0, len==0),返回 Ok(&[]) 而不实际读文件。
get(file, 0, 0)
block_offset==0, len==0
Ok(&[])
建议修复: 特殊处理 len==0,或要求 slot.len > 0 才算命中。
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 和错误检查。
slot.block_offset == aligned_key && request_end <= slot.block_offset + slot.len
block_offset=0, len=0
read_at
get()
if len == 0 { return Ok(&[]) }
request_end
checked_add
block_end
bytes_end
saturating_add
clear()
pub mod read_cache
zero_len_read_is_noop_on_fresh_cache
zero_len_read_is_noop_on_populated_cache
zero_len_read_at_max_offset_is_ok
nonzero_read_range_overflow_returns_invalid_input
18 passed, 0 failed(14 原有 + 4 新增)
No dependencies set.
The note is not visible to the blocked user.
文件:
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 新增)