Skip to content

FlashDir v3.5.1

Choose a tag to compare

@BlkSword BlkSword released this 26 Sep 02:17
· 27 commits to main since this release

FlashDir v3.5.1 Release Notes

三部分:检索正确性修复、低内存稳定性、索引新鲜度(USN 增量同步)。

升级后建议点一次「重建索引」(数秒):建立检查点后索引会自动增量跟随,
右下角卡片会提示当前是否"可能不完整"。

修复

检索正确性

  • 含路径分隔符的查询恒为 0 条:C:\project\...\x.md 这类查询此前落到
    key:value 分支或只与文件名比较,粘贴完整路径永远搜不到。现按"整条路径包含"
    匹配,dir: 的值也接受反斜杠写法。
  • 包含匹配被首字符分桶截断:超过 2 个字符的查询此前只扫描"查询首字符"那个桶,
    于是搜 qm1-methodology.md 找不到 EQM1-METHODOLOGY.md(首字符 E ≠ Q)。
    现只有正向 前缀* 条件才走分桶快路径(eqm1* 33 条 / 1.4ms),
    其余全量并行过滤(75 万条目 6-30ms)。
  • 索引路径脏数据:旧版把反斜杠形式的扫描根与已是绝对路径的条目直接拼接,
    产生 C:\Users\me/C:/Users/me/xxx 这类损坏路径(历史上一度占索引 33%,
    制造重复项与错误路径)。写入侧已规范化;存量提供一次性修复(按第一个
    /<盘符>:/ 截出真实路径,已有正确行则合并,否则按原元数据补写——其中约
    11 万条没有对应的正确行),桌面端启动自动执行,另有 --repair-index 入口。

稳定性(低内存机器闪退)

  • 现象:内存紧张时进程无提示消失。原因是 release 使用 panic = "abort",
    panic 与分配失败都会直接终止进程,且没有任何日志可查。
  • 新增 ~/.flashdir/diag.log 崩溃日志:panic 消息与位置、最近的重活记录、完整回溯;
    分配失败时用"不允许任何分配"的方式先落盘一条 ALLOC-FAIL bytes=N 再终止。
    flashdir.exe --selftest-crash 可验证该链路。
  • 低内存守卫:索引重建前先释放内存扫描缓存(上限 200MB),可用内存低于 500MB
    直接提示取消;索引载入低于 300MB 时跳过载入(显示"未就绪",而不是启动即闪退)。
  • 峰值内存下降:MFT 扫描改为流式,不再一次性持有全盘文件列表(百万级约 170MB)。

界面

  • 当前目录过滤框明确"不递归 / 回车搜全盘",0 命中时给出提示。
  • 新增右下角索引卡片:构建中显示当前盘与已扫描条目数;"可能不完整"时提供
    重建 / 立即同步两个动作。

新增功能

索引新鲜度:USN 增量同步

  • 检查点按盘持久化(卷序列号 / Journal ID / 下一个 USN),构建完成后自动跟随
    新建、改名、删除与体积变化;目录改名按旧前缀整体重挂子树,目录删除按前缀整体移除。
  • 触发点:构建开始时播种检查点、启动后后台线程周期同步(默认 300 秒,
    FLASHDIR_USN_SYNC_SECS 可调、最小 5 秒)、界面「立即同步」。
  • 窗口失效(Journal 重置 / 卷变化 / 校验点过期)或历史积压超过 2000 条时标记该盘
    并提示重建——增量约 1.67ms/条,而全盘重建只要数秒。
  • 实测:新建文件约 6 秒内可搜到;追加数据后体积同步更新;删除后消失;
    改名后旧名消失、新名可搜到。

索引构建互斥

  • 进程内原子标志 + 跨进程锁文件(~/.flashdir/index-build.lock,含 pid,
    残留锁自动接管):构建未完成时重复触发会被拒绝,多实例不会同时重建。

性能

项目 改进前 改进后
单次 USN 同步耗时 22s 1.5–3.3s(1400–2000 条/轮)
目录删除的索引移除 每条 O(全量 75 万条) 一次扫描批量收集 + 逐条 O(1)
磁盘侧按前缀删除 每个前缀一次 LIKE 全表扫描 确切路径批量删除
全盘索引构建峰值内存 一次性持有文件列表 流式分批(约 -170MB)

验证

  • cargo test --release --lib:36 passed / 0 failed(新增搜索正确性、构建锁、
    USN 检查点与路径、崩溃日志格式化等回归测试)。
  • --selftest / --selftest-endpoint / --selftest-bridge 全部通过。
  • --selftest-crash 产出的日志包含 panic 消息、最近操作与回溯。
  • C: 全盘 MFT 流式扫描:752,575 条 / 3.16s(与旧路径一致,无性能损失)。