10 lines
2.7 KiB
Markdown
10 lines
2.7 KiB
Markdown
FAIL
|
||
|
||
crates/ely-files/src/recovery.rs:107 — [P1] 加密容量预检遗漏第 143 行新增的 1 字节光标存在标志,上轮容量缺陷仍可导致全部恢复点丢失。隔离实测:容量设为 40 字节,先写入 `old!`,再写入 `12345678`,第二点实际占 41 字节;清理删除两点,`write_once` 却返回 `Ok(Some(path))`,`last_ok` 更新到第二次时间,`points()` 为空。现有 76 项测试全部通过,新增容量边界断言失败。修复方向:统一按完整序列化结果核算容量,提交前拒绝超限点并保留旧点,确认新点仍存在后更新成功状态;补加密容量边界回归。
|
||
|
||
crates/ely-files/src/recovery.rs:436 — [P1] 密钥创建仍使用会覆盖已有凭据的 `set_secret`,随后重读无法消除上轮初始化竞态。通过 keyring 可注入凭据后端与屏障复验:两个调用先同时读到 `NoEntry`,A 写入并重读返回后,B 再写入并重读;两次均成功,返回密钥不同,持久凭据只保留 B 的密钥。A 生成的恢复点使用持久密钥重开时返回 `InvalidData`。macOS 后端明确采用覆盖已有项的语义;拒绝读取时覆盖旧密钥的分支已修复。修复方向:对跨进程初始化采用排他创建或锁内重查,保证成功返回的密钥持续有效;补上述交错顺序与跨实例解密回归。
|
||
|
||
crates/ely-files/src/task.rs:69 — [P1] `RecoveryTask::drop` 只记录日志,后台线程被分离后继续持有恢复状态和快照闭包,能够撤销用户的显式放弃。隔离实测:首点写入后暂停下一次快照,销毁任务句柄,再对同一目录调用 `Recovery::discard()`;此时标记存在、恢复列表为空。释放快照后,遗留线程重新生成恢复点并清除 `.discarded`,实测得到 `discarded_marker=false`、`points_after_discard=1`,违反 §6.2。修复方向:任务销毁时可靠取消并结束工作线程,正在生成快照的任务在提交前复查取消状态,保证销毁完成后再无写入;补销毁、显式放弃和延迟快照的回归。
|
||
|
||
crates/ely-files/src/task.rs:57 — [P2] `last_ok()` 与整次同步写入、清理共用同一互斥锁;后台 I/O 阻塞期间,调用方也无法取得上一份成功恢复时间,违反 §6.2 对大文件未完成时显示该时间的要求。临时副本仅在 `save_atomic` 注入 800 毫秒 I/O 延迟,已有成功恢复点时查询 `last_ok()` 仍阻塞约 817 毫秒,直到新写入完成才返回;真实慢盘或挂起写入会同样阻塞状态查询线程。修复方向:让已完成状态的读取独立于进行中的磁盘 I/O,写入完成后发布新状态;补延迟写入期间可立即读取旧成功时间的回归。
|