From 92e74637217b31a26c0f2001dfb81dbd517ff1b6 Mon Sep 17 00:00:00 2001 From: Adam Hopkins Date: Sun, 11 Dec 2022 11:33:42 +0200 Subject: [PATCH] Add a restart mechanism to all workers in the multiplexer (#2622) --- sanic/worker/multiplexer.py | 9 +++++++-- tests/worker/test_multiplexer.py | 25 ++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/sanic/worker/multiplexer.py b/sanic/worker/multiplexer.py index f92e7e08..91030fe6 100644 --- a/sanic/worker/multiplexer.py +++ b/sanic/worker/multiplexer.py @@ -21,9 +21,14 @@ class WorkerMultiplexer: "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 338d3294..5047ef77 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)