崩溃/恢复持久性合规性测试单元
该测试基于#80921中提出的机器检查合规性测试套件的第一阶段,遵循“恢复即意味着真正恢复”(arXiv:2608.03836)这一设计原则:每个测试单元都是对某一持久性契约条款的确定性测试,且不依赖大型语言模型;这些测试会在向独立的操作系统进程发送真实的SIGKILL信号以中断写入操作的情况下,针对**真实的SessionDB**进行执行。
测试单元
| 单元 | 合同条款 | 起源 |
|---|---|---|
1 — test_cell1_prefix_durability | 已确认的追加数据在系统崩溃后依然完好;前缀连续;恢复过程具有确定性 | 改编自跟踪问题中的随机检测用例(原始为29.5K条消息,调整为≥200次追加操作的崩溃场景,并保持相同的断言条件) |
2 — test_cell2_consume_once | N个竞争进程中共有且仅有1个进程能获取到被暂存的手递数据 | 改编自跟踪问题中的随机检测用例(8个进程的文件屏障竞争场景) |
3 — test_cell3_rotation_atomicity | 压缩旋转操作要么完全可见,要么完全不可见——绝不会出现压缩结束后的父节点没有后续数据的情形(即#80337号异常情况;针对旧版本数据的恢复功能已合并到#80487中) | 本测试套件中的新测试项 |
| 4 — 编辑/回退操作的分支确定性 | 分支操作后的恢复过程能精确生成预定的前缀 | 临时实现——与回退/归档功能的重新设计紧密关联(#82956–#82959) |
| 5 — 精确一次投递的交付队列效应 | 在提供者发送数据与持久化记录生成之间若发生崩溃,后续恢复时不得重复投递数据 | 临时实现——需要模拟传输接口;当前正在测试基于cron任务的投递机制(#83197/#83557) |
方法
- 在独立的
tmp_path中运行真实的SessionDB(db_path=...),持久化层不会使用模拟对象。 - 异常为向独立解释器发送的真实
SIGKILL信号,且要求该解释器在信号发送时仍处于运行状态(正常的提前退出无法冒充崩溃测试);确认日志允许存在结尾行缺失的情况(因为信号发送本身就可能中断日志写入过程)。 - 所有等待操作均有时间限制;协调机制采用文件屏障实现,绝不会为保证正确性而进入睡眠状态。
- 日志模式矩阵(第1项和第3项):解析器的默认模式、显式的
DELETE模式以及显式的WAL模式——每种模式都会通过独立的HERMES_HOME配置来引导子解析器的工作,随后在运行结束后检查磁盘上的实际模式,若环境未满足相应要求则跳过该次测试(例如解析器的 WAL 重置降级机制,或相关跟踪问题在 3.50.4 版本中的限制)。以不同模式运行的分支绝不能作为所宣称模式的有效证据。第2项仅基于解析器的默认模式运行(“一次性消费”特性与日志模式无关:它依赖于单次条件触发的更新操作)。
含义说明
这些属于一致性验证项:在主测试环境中,它们应显示为绿色状态(第1项和第2项用于复现该跟踪问题中的通过性测试;第3项则基于 #80337 号问题的分析结果来验证原子性)。出现故障的项即视为异常:需在 #80921 票据中附上该项的故障证据进行报告——不得将其忽略,也不得为该测试套件添加修复方案。