Repository navigation
FlashDir v3.5.1
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(与旧路径一致,无性能损失)。