diff --git a/sanic/worker/multiplexer.py b/sanic/worker/multiplexer.py index f92e7e08cc..91030fe628 100644 --- a/sanic/worker/multiplexer.py +++ b/sanic/worker/multiplexer.py @@ -21,9 +21,14 @@ def ack(self): "state": ProcessState.ACKED.name, } - def restart(self, name: str = ""): + def restart(self, name: str = "", all_workers: bool = False): + if name and all_workers: + raise ValueError( + "Ambiguous restart with both a named process and" + " all_workers=True" + ) if not name: - name = self.name + name = "__ALL_PROCESSES__:" if all_workers else self.name self._monitor_publisher.send(name) reload = restart # no cov diff --git a/tests/worker/test_multiplexer.py b/tests/worker/test_multiplexer.py index 338d329472..5047ef7731 100644 --- a/tests/worker/test_multiplexer.py +++ b/tests/worker/test_multiplexer.py @@ -1,6 +1,6 @@ from multiprocessing import Event from os import environ, getpid -from typing import Any, Dict +from typing import Any, Dict, Type, Union from unittest.mock import Mock import pytest @@ -117,3 +117,26 @@ def test_properties( assert m.workers == worker_state assert m.state == worker_state["Test"] assert isinstance(m.state, WorkerState) + + +@pytest.mark.parametrize( + "params,expected", + ( + ({}, "Test"), + ({"name": "foo"}, "foo"), + ({"all_workers": True}, "__ALL_PROCESSES__:"), + ({"name": "foo", "all_workers": True}, ValueError), + ), +) +def test_restart_params( + monitor_publisher: Mock, + m: WorkerMultiplexer, + params: Dict[str, Any], + expected: Union[str, Type[Exception]], +): + if isinstance(expected, str): + m.restart(**params) + monitor_publisher.send.assert_called_once_with(expected) + else: + with pytest.raises(expected): + m.restart(**params)