From ef5080642c80c65c10bb2832f1477afebe0f6c44 Mon Sep 17 00:00:00 2001 From: Vito Sansevero Date: Tue, 27 Oct 2026 07:18:32 -0700 Subject: [PATCH] test(history): give waits that span a database restore their own ceiling The merge queue's Windows py3.12 job failed test_restore_or_generation_rotation_between_transactions_discards_evidence (restore=True): the restore it waits for, a full verify/migrate/backup/ replace cycle, took over the 10 s BLOCK_SECONDS on a busy runner. The two waits that span a restore now use RESTORE_SECONDS (90 s), which stays under the suite's 120 s hang watchdog, so a real hang still fails with its thread dump. Behavioral waits keep BLOCK_SECONDS. --- tests/test_execution_output_writer.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/tests/test_execution_output_writer.py b/tests/test_execution_output_writer.py index c9f89d47..02292c44 100644 --- a/tests/test_execution_output_writer.py +++ b/tests/test_execution_output_writer.py @@ -28,6 +28,11 @@ except ImportError: # Upper bound a blocked fake write waits for its release. Tests prove ordering # with events, so this only caps a failing run and never decides a pass. BLOCK_SECONDS = 10 +# A restore is a full verify/migrate/backup/replace cycle and is bound by the +# disk: a busy Windows runner took over 10 s (merge queue, #382). Waits that +# span a restore use this ceiling, which stays under the runner's 120 s hang +# watchdog, so a real hang still fails with the thread dump. +RESTORE_SECONDS = 90 class OutputWriterTests(fixtures.unittest.TestCase): @@ -317,8 +322,8 @@ class OutputWriterTests(fixtures.unittest.TestCase): Returns the patch and an event set once that rotation has returned on the worker. A restore is a full verify/migrate/backup/replace cycle, so - the handoff waits on this event with the generous ``BLOCK_SECONDS`` - ceiling instead of the short worker-behavior deadline (TESTING.md, + the handoff waits on this event with the ``RESTORE_SECONDS`` ceiling + instead of the short worker-behavior deadline (TESTING.md, Windows portability preflight). """ backup = os.path.join(self.directory.name, f"restore-{start.run_id}.db") @@ -361,7 +366,7 @@ class OutputWriterTests(fixtures.unittest.TestCase): ) with rotation: self.finalization(writer, start) - self.assertTrue(rotated.wait(BLOCK_SECONDS)) + self.assertTrue(rotated.wait(RESTORE_SECONDS)) self.wait_for(lambda: writer.status().pending == 0) self.assertEqual( self.db.get_execution_outputs(start.run_id)["state"], @@ -403,7 +408,7 @@ class OutputWriterTests(fixtures.unittest.TestCase): self.assertEqual(writer.status().pending, 1) self.assertEqual(writer.context_budget.charged_bytes, charge) release.set() - self.assertTrue(rotated.wait(BLOCK_SECONDS)) + self.assertTrue(rotated.wait(RESTORE_SECONDS)) self.wait_for(lambda: writer.status().pending == 0) self.assertEqual(writer.context_budget.charged_bytes, 0) self.assertFalse(writer.status().accepting)