Flake bisektieren
Instabile Tests werden in einem separaten Schritt auf den Bots gemeldet (Beispiel-Build).
Jedes Testprotokoll bietet eine vorab ausgefüllte Befehlszeile zum Auslösen eines automatisierten Flake-Bisects wie:
Flake bisektieren über die Befehlszeile auslösen:
bb add v8/try.triggered/v8_flako -p 'to_revision="deadbeef"' -p 'test_name="MyTest"' ...
Bevor Benutzer zum ersten Mal Flake-Bisects auslösen, müssen sie sich mit einem google.com-Konto anmelden:
bb auth-login
Führen Sie dann den bereitgestellten Befehl aus, der eine Build-URL zurückgibt, die ein Flake-Bisect ausführt (Beispiel).
Wenn Sie Glück haben, weist die Bisektion auf einen Verdächtigen hin. Wenn nicht, könnten Sie weiter lesen wollen…
Detaillierte Beschreibung
Technische Details finden Sie auch im Implementierungs-Tracker-Bug. Der Flake-Bisect-Ansatz hat die gleichen Absichten wie findit, verwendet jedoch eine andere Implementierung.
Wie funktioniert es?
Ein Bisect-Job hat 3 Phasen: Kalibrierung, rückwärts und eingehende Bisektion. Während der Kalibrierung wird der Test wiederholt, wobei das Gesamttimeout (oder die Anzahl der Wiederholungen) verdoppelt wird, bis genug Flakes in einem Durchlauf erkannt werden. Anschließend verdoppelt die rückwärtige Bisektion den Git-Bereich, bis eine Revision ohne Flakes gefunden wird. Schließlich bisektieren wir den Bereich der guten Revision und der ältesten schlechten. Beachten Sie, dass die Bisektion keine neuen Build-Produkte erzeugt, sondern ausschließlich auf zuvor von der kontinuierlichen Infrastruktur von V8 erstellten Builds basiert.
Bisektion schlägt fehl, wenn…
- Während der Kalibrierung keine Sicherheit erreicht werden kann. Dies ist typisch für ein-in-einer-Million-Flakes oder instabiles Verhalten, das nur sichtbar ist, wenn andere Tests parallel laufen (z. B. speicherintensive Tests).
- Der Schuldige zu alt ist. Die Bisektion bricht nach einer bestimmten Anzahl von Schritten ab oder wenn ältere Builds auf dem Isolate-Server nicht mehr verfügbar sind.
- Der gesamte Bisect-Job times out. In diesem Fall könnte es möglich sein, ihn mit einer älteren bekannten schlechten Revision neu zu starten.
Eigenschaften zur Anpassung von Flake-Bisects
extra_args
: Zusätzliche Argumente, die an V8srun-tests.py
-Skript übergeben werden.- repetitions: Anfangsanzahl der Testwiederholungen (übergeben an die Option
--random-seed-stress-count
vonrun-tests.py
; ungenutzt, wenntotal_timeout_sec
verwendet wird). timeout_sec
: Timeout-Parameter, der anrun-tests.py
übergeben wird.to_revision
: Revision, die als schlecht bekannt ist. Hier beginnt die Bisektion.total_timeout_sec
: Anfangs-Gesamttimeout für einen gesamten Bisect-Schritt. Während der Kalibrierung wird diese Zeit bei Bedarf mehrmals verdoppelt. Auf 0 setzen, um zu deaktivieren und stattdessen die Eigenschaftrepetitions
zu verwenden.variant
: Name der Testvariante, die anrun-tests.py
übergeben wird.
Eigenschaften, die Sie nicht ändern müssen
bisect_buildername
: Mastername des Builders, der die Builds für die Bisektion erzeugt hat.bisect_mastername
: Name des Builders, der die Builds für die Bisektion erzeugt hat.build_config
: Build-Konfiguration, die an V8srun-tests.py
-Skript übergeben wird (dort heißt der Parameter--mode
, Beispiel:Release
oderDebug
).isolated_name
: Name der isolierten Datei (z. B.bot_default
,mjsunit
).swarming_dimensions
: Swarming-Dimensionen, die die Art des Bots klassifizieren, auf dem die Tests ausgeführt werden sollen. Übergeben als Liste von Zeichenfolgen, jede im Formatname:value
.test_name
: Vollständig qualifizierter Testname, der anrun-tests.py
übergeben wird. Z. B.mjsunit/foobar
.
Tipps und Tricks
Bisektion eines blockierenden Tests (z. B. Deadlock)
Wenn ein fehlerhafter Durchlauf timeouts hat, während ein erfolgreicher Durchlauf sehr schnell läuft, ist es sinnvoll, den Parameter timeout_sec anzupassen, damit die Bisektion nicht verzögert wird, während auf die blockierenden Durchläufe gewartet wird, bis sie timeouts. Z. B. wenn der erfolgreiche Durchlauf normalerweise in <1 Sekunde erreicht wird, setzen Sie das Timeout auf etwas Kleines, z. B. 5 Sekunden.
Mehr Vertrauen in einen Verdächtigen gewinnen
In einigen Durchläufen ist das Vertrauen sehr gering. Z. B. wird die Kalibrierung erfüllt, wenn vier Flakes in einem Durchlauf gesehen werden. Während der Bisektion gilt jeder Durchlauf mit einem oder mehreren Flakes als schlecht. In solchen Fällen könnte es nützlich sein, den Bisect-Job neu zu starten, den Parameter to_revision
auf den Schuldigen zu setzen und eine höhere Anzahl von Wiederholungen oder ein höheres Gesamttimeout als der ursprüngliche Job zu verwenden, um zu bestätigen, dass dieselbe Schlussfolgerung erneut erreicht wird.
Umgang mit Timeout-Problemen
Falls die Option für das Gesamttimeout dazu führt, dass Builds hängen bleiben, ist es am besten, eine passende Anzahl von Wiederholungen zu schätzen und total_timeout_sec
auf 0
zu setzen.