DiamondLightSource / DiamondLightSource/dodal
Flakey Eiger test
- Dominant language
- Python
- Stars
- 5
- Forks
- 13
- Avg merge
- 3d 2h
- Merged PRs (30d)
- 10
Description
https://github.com/DiamondLightSource/dodal/actions/runs/32121576625/job/95662958956?pr=2121
The following test sometimes fails:
```
=================================== FAILURES ===================================
__________ test_eiger_uses_current_energy_if_expected_energy_is_none ___________
Traceback (most recent call last):
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 353, in from_call
result: TResult | None = func()
~~~~^^
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 245, in
lambda: runtest_hook(item=item, **kwds),
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 512, in __call__
return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 120, in _hookexec
return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
raise exception
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 139, in _multicall
teardown.throw(exception)
~~~~~~~~~~~~~~^^^^^^^^^^^
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call
yield
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 139, in _multicall
teardown.throw(exception)
~~~~~~~~~~~~~~^^^^^^^^^^^
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper
return result.get_result()
~~~~~~~~~~~~~~~~~^^
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/pluggy/_result.py", line 103, in get_result
raise exc.with_traceback(tb)
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper
res = yield
^^^^^
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 139, in _multicall
teardown.throw(exception)
~~~~~~~~~~~~~~^^^^^^^^^^^
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call
return (yield)
^^^^^
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 139, in _multicall
teardown.throw(exception)
~~~~~~~~~~~~~~^^^^^^^^^^^
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper
return result.get_result()
~~~~~~~~~~~~~~~~~^^
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/pluggy/_result.py", line 103, in get_result
raise exc.with_traceback(tb)
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper
res = yield
^^^^^
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 139, in _multicall
teardown.throw(exception)
~~~~~~~~~~~~~~^^^^^^^^^^^
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call
return (yield)
^^^^^
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 121, in _multicall
res = hook_impl.function(*args)
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call
item.runtest()
~~~~~~~~~~~~^^
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/_pytest/python.py", line 1720, in runtest
self.ihook.pytest_pyfunc_call(pyfuncitem=self)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 512, in __call__
return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 120, in _hookexec
return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
raise exception
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 139, in _multicall
teardown.throw(exception)
~~~~~~~~~~~~~~^^^^^^^^^^^
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper
return result.get_result()
~~~~~~~~~~~~~~~~~^^
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/pluggy/_result.py", line 103, in get_result
raise exc.with_traceback(tb)
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper
res = yield
^^^^^
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 121, in _multicall
res = hook_impl.function(*args)
File "/home/runner/work/dodal/dodal/.venv/lib/python3.13/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call
result = testfunction(**testargs)
File "/home/runner/work/dodal/dodal/tests/devices/test_eiger.py", line 759, in test_eiger_uses_current_energy_if_expected_energy_is_none
assert not thread.is_alive()
AssertionError: assert not True
+ where True = is_alive()
+ where is_alive = .is_alive
---------------------------- Captured stderr setup -----------------------------
I 260818 09:28:52.617 beamline_utils:192] Setting global config client to (previously None)
------------------------------ Captured log setup ------------------------------
INFO Dodal:beamline_utils.py:192 Setting global config client to (previously None)
----------------------------- Captured stderr call -----------------------------
I 260818 09:28:52.638 eiger_odin:171] Stopping Odin...
I 260818 09:28:52.639 eiger:422] Disabling dev shm
I 260818 09:28:52.639 eiger:350] Not setting detector threshold as already close to 100.0
I 260818 09:28:52.640 eiger:252] Eiger arming: Setting eiger camera PVs...
I 260818 09:28:52.642 eiger:279] Eiger arming: Setting odin number of frames chunks...
I 260818 09:28:52.642 eiger:309] Eiger arming: Setting mx setting PVs...
I 260818 09:28:52.644 eiger:362] Eiger arming: setting num triggers and captures...
I 260818 09:28:53.088 eiger:429] Eiger arming: Waiting for stale params...
I 260818 09:28:53.089 eiger:433] Eiger arming: Setting cam acquire...
I 260818 09:28:53.089 eiger:410] Eiger arming: Finishing arming
------------------------------ Captured log call -------------------------------
INFO Dodal:eiger_odin.py:171 Stopping Odin...
INFO Dodal:eiger.py:422 Disabling dev shm
INFO Dodal:eiger.py:350 Not setting detector threshold as already close to 100.0
INFO Dodal:eiger.py:252 Eiger arming: Setting eiger camera PVs...
DEBUG Dodal:eiger.py:258 Setting cam acquire_period...
DEBUG Dodal:eiger.py:263 Setting cam num_exposures...
DEBUG Dodal:eiger.py:267 Setting cam image_mode...
DEBUG Dodal:eiger.py:272 Setting cam trigger_mode...
INFO Dodal:eiger.py:279 Eiger arming: Setting odin number of frames chunks...
INFO Dodal:eiger.py:309 Eiger arming: Setting mx setting PVs...
INFO Dodal:eiger.py:362 Eiger arming: setting num triggers and captures...
INFO Dodal:eiger.py:429 Eiger arming: Waiting for stale params...
INFO Dodal:eiger.py:433 Eiger arming: Setting cam acquire...
INFO Dodal:eiger.py:410 Eiger arming: Finishing arming
--------------------------- Captured stderr teardown ---------------------------
I 260818 09:28:53.095 beamline_utils:181] Clearing global path provider: None
I 260818 09:28:53.095 beamline_utils:204] Clearing global config client:
---------------------------- Captured log teardown -----------------------------
INFO Dodal:beamline_utils.py:181 Clearing global path provider: None
INFO Dodal:beamline_utils.py:204 Clearing global config client:
================================ tests coverage ================================
```
Acceptance Criteria:
- The test passes 100% of the time.
Contributor guide
Research direction
Start with tests/devices/test_eiger.py at test_eiger_uses_current_energy_if_expected_energy_is_none, then run that test repeatedly to reproduce the intermittent failure. Trace the wait_on_staging thread and the Eiger arming sequence shown in the logs, and ensure the test completes without the thread remaining alive. Done means the test passes 100% of the time.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- testing-qa
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 68/100