片狀二分法
在機器人上,會在一個獨立的步驟中報告不穩定的測試 (範例建置)。
每個測試記錄都會提供一個預先填入的命令列,用於觸發自動化片狀二分法,例如
Trigger flake bisect on command line:
bb add v8/try.triggered/v8_flako -p 'to_revision="deadbeef"' -p 'test_name="MyTest"' ...
在第一次觸發片狀二分法之前,使用者必須使用 google.com 帳戶登入
bb auth-login
然後執行提供的命令,這會傳回一個執行片狀二分法的建置網址 (範例)。
如果您運氣好的話,二分法會將您導向一個可疑對象。如果不是,您可能想進一步閱讀…
詳細說明 #
有關技術詳細資訊,請參閱實作 追蹤錯誤。片狀二分法方法與 findit 的用意相同,但使用不同的實作。
它是如何運作的? #
一個二分法工作有 3 個階段:校準、向後和向內二分法。在校準期間,會重複測試,將總計時數(或重複次數)加倍,直到在一次執行中偵測到足夠的片狀。然後,向後二分法會將 git 範圍加倍,直到找到沒有片狀的版本。最後,我們將二分法區分為良好版本和最舊的錯誤版本。請注意,二分法不會產生新的建置產品,它完全基於先前在 V8 的持續基礎架構上建立的建置。
二分法會在下列情況下失敗… #
- 在校準期間無法達到信心。這通常是百萬分之一的片狀或只有在其他測試並行執行(例如,需要大量記憶體的測試)時才會出現的片狀行為。
- 罪魁禍首太舊了。二分法會在一定步驟數後放棄,或如果在隔離伺服器上不再提供較舊的建置。
- 整體二分法工作逾時。在這種情況下,可以使用較舊的已知錯誤版本重新啟動它。
自訂片狀二分法的屬性 #
extra_args
:傳遞給 V8 的run-tests.py
指令碼的額外引數。- 重複:測試重複的初始次數(傳遞給
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"]
。否則,壓力測試執行器會使用不同的隨機種子。但請注意,特定隨機種子可能會在一個版本中重現問題,但在另一個版本中不會。