Flake 二分查找
不稳定的测试在机器人上单独的步骤中报告(示例构建)。
每个测试日志都提供一个预填充的命令行,用于触发自动化的 Flake 二分查找,例如
Trigger flake bisect on command line:
bb add v8/try.triggered/v8_flako -p 'to_revision="deadbeef"' -p 'test_name="MyTest"' ...
在第一次触发 Flake 二分查找之前,用户必须使用 google.com 帐户登录
bb auth-login
然后执行提供的命令,该命令将返回运行 Flake 二分查找的构建 URL(示例)。
如果幸运的话,二分查找会将你指向可疑的代码。如果不是,你可能需要进一步阅读……
详细描述 #
有关技术细节,请参阅实现 跟踪错误。Flake 二分查找方法与 findit 的意图相同,但使用不同的实现。
它是如何工作的? #
二分查找作业包含 3 个阶段:校准、反向二分查找和内向二分查找。在校准期间,测试会重复进行,将总超时时间(或重复次数)加倍,直到在一个运行中检测到足够多的不稳定情况。然后,反向二分查找将 Git 范围加倍,直到找到没有不稳定情况的版本。最后,我们对良好版本和最旧的错误版本之间的范围进行二分查找。请注意,二分查找不会生成新的构建产品,它完全基于之前在 V8 的持续基础设施上创建的构建。
二分查找失败时… #
- 在校准期间无法达到置信度。这对于百万分之一的不稳定情况或仅在其他测试并行运行时(例如内存密集型测试)可见的不稳定行为很常见。
- 罪魁祸首太旧了。二分查找在执行一定数量的步骤后退出,或者如果隔离服务器上不再提供较旧的构建。
- 整体二分查找作业超时。在这种情况下,可以使用已知的较旧的错误版本重新启动它。
用于自定义 Flake 二分查找的属性 #
extra_args
:传递给 V8 的run-tests.py
脚本的额外参数。- repetitions:初始测试重复次数(传递给
run-tests.py
的--random-seed-stress-count
选项;如果使用total_timeout_sec
则未使用)。 timeout_sec
:传递给run-tests.py
的超时参数。to_revision
:已知为错误的版本。二分查找将从此处开始。total_timeout_sec
:整个二分查找步骤的初始总超时时间。在校准期间,如果需要,此时间会加倍几次。设置为 0 以禁用并使用repetitions
属性。variant
:传递给run-tests.py
的测试变体名称。
你无需更改的属性 #
bisect_buildername
:生成用于二分查找的构建的构建器的主名称。bisect_mastername
:生成用于二分查找的构建的构建器的名称。build_config
:传递给 V8 的run-tests.py
脚本的构建配置(在该参数名称为--mode
,例如:Release
或Debug
)。isolated_name
:隔离文件名称(例如bot_default
、mjsunit
)。swarming_dimensions
:对测试应运行的机器人类型进行分类的 Swarming 维度。作为字符串列表传递,每个字符串的格式为name:value
。test_name
:传递给 run-tests.py 的完全限定的测试名称。例如mjsunit/foobar
。
提示和技巧 #
对挂起测试进行二分查找(例如死锁) #
如果失败的运行超时,而通过的运行速度非常快,则调整 timeout_sec
参数很有用,这样二分查找就不会延迟等待挂起的运行超时。例如,如果通过通常在 <1 秒内完成,请将超时设置为较小的值,例如 5 秒。
对可疑代码获得更多置信度 #
在某些运行中,置信度非常低。例如,如果在一个运行中看到四个不稳定情况,则校准就满足了。在二分查找期间,每个出现一个或多个不稳定情况的运行都被计为错误。在这种情况下,可能需要重新启动二分查找作业,将 to_revision
设置为罪魁祸首,并使用比原始作业更高的重复次数或总超时时间,并确认再次得出相同的结论。
解决超时问题 #
如果整体超时选项导致构建挂起,最好估计合适的重复次数并将 total_timeout_sec
设置为 0
。
取决于随机种子的测试行为 #
很少情况下,代码路径仅在使用特定随机种子时才会触发。在这种情况下,可能需要使用 extra_args
修复它,例如 "extra_args": ["--random-seed=123"]
。否则,压力运行程序将在整个过程中使用不同的随机种子。但请注意,特定随机种子可能会在一个版本中重现问题,但在另一个版本中不会。