SQLite index, content-addressed originals, rebuildable FTS5 search, schema versions with a backup before each upgrade and read-only on failure, and size reporting. Three review rounds; the round 3 fixes are checked by tests, not reviewed again. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
3.2 KiB
FAIL
-
crates/ely-mail-engine/src/store/search.rs:54 — 损坏的全文索引没有真正重建。存入一封邮件后,以
UPDATE search_data SET block = X'00' WHERE id > 10损坏一个 FTS 段;搜索报SQLITE_CORRUPT_VTAB,但rebuild_search()返回Ok(1),关闭、重开后搜索仍报同一损坏错误,原文读取正常。这违反 §18.1 的全文索引可重建要求;现有测试只清空健康索引,覆盖不到此场景。修复方向:重建时清除并重新建立底层 FTS 数据,而非逐行删除后插入;增加实际损坏索引、重建并重新搜索的回归测试。证据:.work/C12.3-r1/probes.log、.work/C12.3-r1/sizes.log。 -
crates/ely-mail-engine/src/store/messages.rs:221 — 原文路径存在即直接认定保存成功,没有核对已有文件。先存入整封邮件,再把对应内容文件改成
damaged,随后重新put同一封完整原文,得到Ok(MessageId(1)),但original仍报原文损坏;新身份引用相同原文也会关联到坏文件。修复方向:复用已有内容文件前验证完整性,损坏时明确报错或以本次收到的正确字节原子修复,并测试重新收取与跨消息去重。证据:.work/C12.3-r1/probes.log。 -
crates/ely-mail-engine/src/store/messages.rs:95 — 数据库写入失败后,之前由
keep写入的原文永久遗留。对不存在的MailboxId(999)存入 80 字节整封邮件,数据库正确报外键错误,但sizes().originals变为 80;没有消息行引用该文件,也没有回收路径,反复失败会累积不可清理的缓存。修复方向:协调原文发布与数据库事务,失败时清理本次新增且无人引用的内容,保留其他消息共用的文件,并覆盖写入失败的回归测试。证据:.work/C12.3-r1/probes.log。 -
crates/ely-mail-engine/src/store.rs:99 — 容量统计遗漏 WAL 与共享内存文件,把逻辑页大小当成磁盘占用。存入一封邮件并交替设置标记 600 次后,
index + search仍仅报 65,536 字节,实际mail.db、mail.db-wal、mail.db-shm合计 4,222,456 字节;WAL 在连接运行期间持续占用磁盘,容量管理会明显低估缓存。修复方向:将数据库附属文件的实际占用计入统计,并测试未关闭连接、重复写入后的占用。证据:.work/C12.3-r1/sizes.log。 -
crates/ely-mail-engine/src/store/search.rs:157 — HTML 取文字没有遵守 HTML 元素的解析状态,导致正文漏索引和脚本被索引。
<script/>trackingpixel()</script>中的斜杠不会关闭 HTML 的 script 元素,但此处以self_closing跳过隐藏,搜索能命中trackingpixel;<textarea><script>ordinarycontent</script></textarea>中应显示的普通文字反而被当脚本丢弃,搜索无结果。修复方向:按 HTML 解析语义处理非空元素及 RCDATA/raw-text 状态,覆盖这两种输入与重建后的搜索结果。证据:.work/C12.3-r1/probes.log。 -
crates/ely-mail-engine/src/store/schema.rs:1、crates/ely-mail-engine/src/store/messages.rs:68 — 两条新增注释均为 12 个空白分隔词,超过
agents.md的注释十词上限。修复方向:将这两条注释各缩至十词以内。