What happened?
When a job's return is not a dictionary, the master's event tagger crashes and logs an error for every such job. The most common trigger is a failing state compilation: state.apply/state.sls return a list of error strings when rendering/compilation fails, and salt.utils.event._fire_ret_load_specific_fun assumes a mapping:
File "salt/utils/event.py", line 941, in _fire_ret_load_specific_fun
for tag, data in ret.items():
AttributeError: 'list' object has no attribute 'items'
The broad except catches it and logs Event iteration failed with exception: 'list' object has no attribute 'items' at ERROR level, so nothing crashes outright -- but the master logs an error for every failed state compile, and the CI integration tests that assert this exact message never appears (tests/pytests/integration/states/test_state_test.py, added to pin an earlier event-iteration bug) fail whenever they share a run with it.
Fresh CI evidence: run 28764048341, job 85297152499 ("Rocky Linux 9 integration tcp" on PR #69729) contains 12 occurrences; test_failing_sls, test_failing_sls_compound and test_issue_62590 fail directly on the logged message, and the adjacent FactoryTimeout failures (state.orchestrate runs timing out at 50 s) are consistent with the event stream misbehaving in the same jobs. This is the second failure cluster noted in #69728 (the first, the leaked-minion-keys cluster, is fixed by #69729 and absent from that run's netapi tests).
Expected behavior
A non-dict return (list of compile errors, or a plain string from some renderers) has no per-state tags to fire sub-events for; _fire_ret_load_specific_fun should skip it quietly instead of raising and logging an error. Dict-shaped returns must keep firing the per-tag failure events exactly as today.
Type of salt install
Official rpm
Major version
3006.x
What supported OS are you seeing the problem on? Can select multiple. (If bug appears on an unsupported OS, please open a GitHub Discussion instead)
rockylinux-9
salt --versions-report output
Observed in CI (3006.x onedir, Python 3.11); the code is identical on 3006.x, 3008.x and master.
What happened?
When a job's return is not a dictionary, the master's event tagger crashes and logs an error for every such job. The most common trigger is a failing state compilation:
state.apply/state.slsreturn a list of error strings when rendering/compilation fails, andsalt.utils.event._fire_ret_load_specific_funassumes a mapping:The broad
exceptcatches it and logsEvent iteration failed with exception: 'list' object has no attribute 'items'at ERROR level, so nothing crashes outright -- but the master logs an error for every failed state compile, and the CI integration tests that assert this exact message never appears (tests/pytests/integration/states/test_state_test.py, added to pin an earlier event-iteration bug) fail whenever they share a run with it.Fresh CI evidence: run 28764048341, job 85297152499 ("Rocky Linux 9 integration tcp" on PR #69729) contains 12 occurrences;
test_failing_sls,test_failing_sls_compoundandtest_issue_62590fail directly on the logged message, and the adjacentFactoryTimeoutfailures (state.orchestrateruns timing out at 50 s) are consistent with the event stream misbehaving in the same jobs. This is the second failure cluster noted in #69728 (the first, the leaked-minion-keys cluster, is fixed by #69729 and absent from that run's netapi tests).Expected behavior
A non-dict return (list of compile errors, or a plain string from some renderers) has no per-state tags to fire sub-events for;
_fire_ret_load_specific_funshould skip it quietly instead of raising and logging an error. Dict-shaped returns must keep firing the per-tag failure events exactly as today.Type of salt install
Official rpm
Major version
3006.x
What supported OS are you seeing the problem on? Can select multiple. (If bug appears on an unsupported OS, please open a GitHub Discussion instead)
rockylinux-9
salt --versions-report output