From 283f3b8fdf21c188d0c54ad5d340920925fe1be4 Mon Sep 17 00:00:00 2001 From: krassowski <5832902+krassowski@users.noreply.github.com> Date: Fri, 28 Nov 2025 12:47:59 +0000 Subject: [PATCH 1/4] Re-run `test_execution_state` up to three times --- tests/services/kernels/test_execution_state.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/services/kernels/test_execution_state.py b/tests/services/kernels/test_execution_state.py index 7625a1660..47286780c 100644 --- a/tests/services/kernels/test_execution_state.py +++ b/tests/services/kernels/test_execution_state.py @@ -17,7 +17,7 @@ MINIMUM_CONSISTENT_COUNT = 4 -@pytest.mark.flaky +@pytest.mark.flaky(max_runs=3) async def test_execution_state(jp_fetch, jp_ws_fetch): r = await jp_fetch("api", "kernels", method="POST", allow_nonstandard_methods=True) kernel = json.loads(r.body.decode()) From 724a133901675d1dd328ec42d028ca57dc0ec67a Mon Sep 17 00:00:00 2001 From: krassowski <5832902+krassowski@users.noreply.github.com> Date: Fri, 28 Nov 2025 13:00:46 +0000 Subject: [PATCH 2/4] Is five times enough? --- tests/services/kernels/test_execution_state.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/services/kernels/test_execution_state.py b/tests/services/kernels/test_execution_state.py index 47286780c..bf1fa01a3 100644 --- a/tests/services/kernels/test_execution_state.py +++ b/tests/services/kernels/test_execution_state.py @@ -17,7 +17,7 @@ MINIMUM_CONSISTENT_COUNT = 4 -@pytest.mark.flaky(max_runs=3) +@pytest.mark.flaky(max_runs=5) async def test_execution_state(jp_fetch, jp_ws_fetch): r = await jp_fetch("api", "kernels", method="POST", allow_nonstandard_methods=True) kernel = json.loads(r.body.decode()) From b22c33cf8b2a70eeb78b7f696372ee5d83a877ae Mon Sep 17 00:00:00 2001 From: krassowski <5832902+krassowski@users.noreply.github.com> Date: Fri, 28 Nov 2025 15:29:22 +0000 Subject: [PATCH 3/4] Run only the flaky test on Windows on CI for debugging --- .github/workflows/python-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-tests.yml b/.github/workflows/python-tests.yml index fb571e1e1..235e03e5b 100644 --- a/.github/workflows/python-tests.yml +++ b/.github/workflows/python-tests.yml @@ -49,7 +49,7 @@ jobs: run: hatch run test:nowarn || hatch -v run test:nowarn --lf - name: Run the tests on windows if: ${{ startsWith(matrix.os, 'windows') }} - run: hatch run cov:nowarn -s || hatch -v run cov:nowarn --lf + run: hatch run cov:nowarn -s -k test_execution_state || hatch -v run cov:nowarn --lf - uses: jupyterlab/maintainer-tools/.github/actions/upload-coverage@v1 test_docs: From 5b4993073fd1b4332fc13bdd72352a2778f12e1a Mon Sep 17 00:00:00 2001 From: krassowski <5832902+krassowski@users.noreply.github.com> Date: Fri, 28 Nov 2025 15:52:25 +0000 Subject: [PATCH 4/4] Do not re-run, just wait for startup to fininsh --- tests/services/kernels/test_execution_state.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tests/services/kernels/test_execution_state.py b/tests/services/kernels/test_execution_state.py index bf1fa01a3..ebe3a6c55 100644 --- a/tests/services/kernels/test_execution_state.py +++ b/tests/services/kernels/test_execution_state.py @@ -17,7 +17,7 @@ MINIMUM_CONSISTENT_COUNT = 4 -@pytest.mark.flaky(max_runs=5) +@pytest.mark.flaky async def test_execution_state(jp_fetch, jp_ws_fetch): r = await jp_fetch("api", "kernels", method="POST", allow_nonstandard_methods=True) kernel = json.loads(r.body.decode()) @@ -53,6 +53,17 @@ async def test_execution_state(jp_fetch, jp_ws_fetch): ) await poll_for_parent_message_status(kid, message_id, "busy", ws) es = await get_execution_state(kid, jp_fetch) + + # kernels start slowly on Windows + max_startup_time = 60 + started = time.time() + while es == "starting": + await asyncio.sleep(1) + elapsed = time.time() - started + if elapsed > max_startup_time: + raise ValueError(f"Kernel did not start up in {max_startup_time} seconds") + es = await get_execution_state(kid, jp_fetch) + assert es == "busy" message_id_2 = uuid.uuid1().hex