SuperAPI AI 工具集

yield-injections

通用与其它

查看项目

更新于 10-16 02:27

技能介绍

用途:yield injection 是仅用于测试的基础设施,用于在可恢复状态机中强制协作式让出(cooperative-yield)或失败边界。实现位于 core/mvcc/ 下,但机制本身不属于 MVCC 语义。所有钩子都在 cfg(any(test, injected_yields)) 之后,injected_yields 指 test_helper 或模拟器。

主要能力:YieldPoint { ordinal, point_count } 标识某个点族中的一个钩子;点族是 #[repr(u8)] 枚举并实现 YieldPointMarker,ordinal 为源码顺序的 self as u8,point_count 来自 EnumCount。每个可让出对象有 instance_id、selection_key 以及连接级 yield_injector() 与 failure_injector()。提供宏 inject_transition_yield!、inject_io_yield!、inject_transition_failure!;目前没有 inject_io_failure!,失败注入仅适用于 TransitionResult 状态机。注入的让出返回 Completion::new_yield(),VDBE 会将其呈现为 StepResult::Yield。

使用方式:新增可让出类型需在 cfg 下加 yield_instance_id,从 connection.next_yield_instance_id() 初始化,实现 ProvidesYieldContext,并添加族专属 *_yield_key(...) -> u64 辅助函数,混合稳定逻辑标识与族标签。新增让出点必须追加到枚举末尾,不得重排已有变体,因为 ordinal 是确定性调度的一部分,重排会改变 CI 种子与二分定位的可复现性。单元测试可用 FixedYieldInjector 与 FixedFailureInjector,例如 conn.set_yield_injector(Some(FixedYieldInjector::new([CommitYieldPoint::LogRecordPrepared.point()]))); 复用连接时用 conn.set_yield_injector(None); conn.set_failure_injector(None); 清除。并发模拟器自行管理随机确定性注入,不要从模拟器代码安装 FixedYieldInjector;计划以 (instance_id, selection_key, point_count) 为键,MAX_YIELDS = 20。

适用场景:提交、检查点、游标等状态机的重入、交错、放弃与清理不变量测试。

限制:添加钩子前必须证明重入安全,需先进入可恢复状态再让出;不要在 push、insert、计数递增、加锁或清理动作之前放置钩子,除非重复无害或由状态显式保护;持有锁跨越让出时需测试恢复与让出时丢弃两条路径;不要在借用 &mut self.state 时调用宏。模拟器可复现性要求相同顶层种子与 fiber 数量,重排变体、新增变体、改变钩子位置或 fiber 分配都会改变调度。不要依赖 SimulatorYieldInjector 测试之外的确切让出次数。