Fix flaky multi-master test

Run event handlers for all master's in parallel. Otherwise, one handler
could block the other from running in a timely manner.
This commit is contained in:
Daniel A. Wozniak 2025-01-20 17:31:18 -07:00 committed by Daniel Wozniak
parent 6dcb7182b3
commit 05cd683eab
3 changed files with 37 additions and 4 deletions

View file

@ -1072,8 +1072,11 @@ class MinionManager(MinionBase):
@salt.ext.tornado.gen.coroutine
def handle_event(self, package):
for minion in self.minions:
yield minion.handle_event(package)
log.error("Dispatch event to minions")
try:
yield [_.handle_event(package) for _ in self.minions]
except Exception as exc: # pylint: disable=broad-except
log.error("Error dispatching event. %s", exc)
def _create_minion_object(
self,

View file

@ -25,6 +25,12 @@ def salt_mm_master_1(request, salt_factories):
"publish_signing_algorithm": (
"PKCS1v15-SHA224" if FIPS_TESTRUN else "PKCS1v15-SHA1"
),
"log_granular_levels": {
"salt": "info",
"salt.transport": "debug",
"salt.channel": "debug",
"salt.utils.event": "debug",
},
}
factory = salt_factories.salt_master_daemon(
"mm-master-1",
@ -56,6 +62,12 @@ def salt_mm_master_2(salt_factories, salt_mm_master_1):
"publish_signing_algorithm": (
"PKCS1v15-SHA224" if FIPS_TESTRUN else "PKCS1v15-SHA1"
),
"log_granular_levels": {
"salt": "info",
"salt.transport": "debug",
"salt.channel": "debug",
"salt.utils.event": "debug",
},
}
# Use the same ports for both masters, they are binding to different interfaces
@ -106,6 +118,13 @@ def salt_mm_minion_1(salt_mm_master_1, salt_mm_master_2):
"fips_mode": FIPS_TESTRUN,
"encryption_algorithm": "OAEP-SHA224" if FIPS_TESTRUN else "OAEP-SHA1",
"signing_algorithm": "PKCS1v15-SHA224" if FIPS_TESTRUN else "PKCS1v15-SHA1",
"log_granular_levels": {
"salt": "info",
"salt.minion": "debug",
"salt.transport": "debug",
"salt.channel": "debug",
"salt.utils.event": "debug",
},
}
factory = salt_mm_master_1.salt_minion_daemon(
"mm-minion-1",
@ -136,6 +155,13 @@ def salt_mm_minion_2(salt_mm_master_1, salt_mm_master_2):
"fips_mode": FIPS_TESTRUN,
"encryption_algorithm": "OAEP-SHA224" if FIPS_TESTRUN else "OAEP-SHA1",
"signing_algorithm": "PKCS1v15-SHA224" if FIPS_TESTRUN else "PKCS1v15-SHA1",
"log_granular_levels": {
"salt": "info",
"salt.minion": "debug",
"salt.transport": "debug",
"salt.channel": "debug",
"salt.utils.event": "debug",
},
}
factory = salt_mm_master_2.salt_minion_daemon(
"mm-minion-2",

View file

@ -1,6 +1,7 @@
import copy
import logging
import os
import uuid
import pytest
@ -94,12 +95,15 @@ def test_minion_load_grains_default(minion_opts):
],
)
def test_send_req_fires_completion_event(event, minion_opts):
req_id = uuid.uuid4()
event_enter = MagicMock()
event_enter.send.side_effect = event[1]
event = MagicMock()
event.__enter__.return_value = event_enter
with patch("salt.utils.event.get_event", return_value=event):
with patch("salt.utils.event.get_event", return_value=event), patch(
"uuid.uuid4", return_value=req_id
):
minion_opts["random_startup_delay"] = 0
minion_opts["return_retry_tries"] = 30
minion_opts["grains"] = {}
@ -123,7 +127,7 @@ def test_send_req_fires_completion_event(event, minion_opts):
condition_event_tag = (
len(call.args) > 1
and call.args[1]
== f"__master_req_channel_payload/{minion_opts['master']}"
== f"__master_req_channel_payload/{req_id}/{minion_opts['master']}"
)
condition_event_tag_error = "{} != {}; Call(number={}): {}".format(
idx, call, call.args[1], "__master_req_channel_payload"