用途:parallel-workload 是 Materialize 的并发压力测试框架,通过多线程并发执行随机 SQL 动作,捕获 panic 和本应成功(或优雅失败)的查询却报错的情况,以及特定 DDL/DML 组合引发的崩溃或连接中断。它不验证查询结果正确性。
主要能力:编排器按配置的 Complexity 启动 N 个 worker 线程,每个线程分配动作列表(read、fetch、write、dml_nontrans、ddl),用加权随机选择动作循环执行直到运行时间结束。动作抛出 QueryError 时,若匹配 errors_to_ignore(exe) 则记录并忽略,否则测试失败。所有线程共享 Database 对象,以线程安全锁跟踪已创建的表、视图、集群等对象。
使用方式:新增动作需在 action.py 中继承 Action 并实现 run(),必要时重写 errors_to_ignore(),再把动作类与权重注册到对应动作列表(read_action_list、fetch_action_list、write_action_list、dml_nontrans_action_list、ddl_action_list)。也可扩展现有动作,例如向 expression.py 添加表达式、向 FlipFlagsAction.flags 添加系统标志。运行命令:bin/mzcompose --find parallel-workload run default,可加 --complexity、--scenario、--runtime、--seed 等参数。
适用场景:为并发操作下的 panic、意外查询错误、特定 DDL/DML 组合导致的崩溃或连接丢失补充覆盖。
限制与设计规则:尽量少加锁,短暂持有 exe.db.lock 选对象后改用对象级锁;前置条件不满足时返回 False 而非抛异常;处理 rng.choice 的 IndexError;创建或删除对象时同步维护 exe.db 列表;始终使用动作自带的 self.rng 以保证 --seed 可复现。对象数量上限定义在 database.py(如 MAX_TABLES=5、MAX_VIEWS=15 等)。