Fix double ctrl-c kill (#2634)

This commit is contained in:
Adam Hopkins 2022-12-18 14:40:38 +02:00 committed by GitHub
parent f7040ccec8
commit 4744a89c33
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 6 deletions

View File

@ -40,7 +40,7 @@ class WorkerManager:
self.monitor_publisher, self.monitor_subscriber = monitor_pubsub self.monitor_publisher, self.monitor_subscriber = monitor_pubsub
self.worker_state = worker_state self.worker_state = worker_state
self.worker_state[self.MAIN_IDENT] = {"pid": self.pid} self.worker_state[self.MAIN_IDENT] = {"pid": self.pid}
self.terminated = False self._shutting_down = False
self._serve = serve self._serve = serve
self._server_settings = server_settings self._server_settings = server_settings
self._server_count = count() self._server_count = count()
@ -116,10 +116,9 @@ class WorkerManager:
self.join() self.join()
def terminate(self): def terminate(self):
if not self.terminated: if not self._shutting_down:
for process in self.processes: for process in self.processes:
process.terminate() process.terminate()
self.terminated = True
def restart( def restart(
self, self,
@ -257,7 +256,7 @@ class WorkerManager:
raise ServerKilled raise ServerKilled
def shutdown_signal(self, signal, frame): def shutdown_signal(self, signal, frame):
if self.terminated: if self._shutting_down:
logger.info("Shutdown interrupted. Killing.") logger.info("Shutdown interrupted. Killing.")
with suppress(ServerKilled): with suppress(ServerKilled):
self.kill() self.kill()
@ -270,6 +269,7 @@ class WorkerManager:
for process in self.processes: for process in self.processes:
if process.is_alive(): if process.is_alive():
process.terminate() process.terminate()
self._shutting_down = True
@property @property
def pid(self): def pid(self):

View File

@ -33,9 +33,7 @@ def test_terminate(os_mock: Mock):
context = Mock() context = Mock()
context.Process.return_value = process context.Process.return_value = process
manager = WorkerManager(1, fake_serve, {}, context, (Mock(), Mock()), {}) manager = WorkerManager(1, fake_serve, {}, context, (Mock(), Mock()), {})
assert manager.terminated is False
manager.terminate() manager.terminate()
assert manager.terminated is True
os_mock.kill.assert_called_once_with(1234, SIGINT) os_mock.kill.assert_called_once_with(1234, SIGINT)
@ -63,6 +61,24 @@ def test_kill(os_mock: Mock):
os_mock.kill.assert_called_once_with(1234, SIGKILL) os_mock.kill.assert_called_once_with(1234, SIGKILL)
@patch("sanic.worker.process.os")
@patch("sanic.worker.manager.os")
def test_shutdown_signal_send_kill(
manager_os_mock: Mock, process_os_mock: Mock
):
process = Mock()
process.pid = 1234
context = Mock()
context.Process.return_value = process
manager = WorkerManager(1, fake_serve, {}, context, (Mock(), Mock()), {})
assert manager._shutting_down is False
manager.shutdown_signal(SIGINT, None)
assert manager._shutting_down is True
process_os_mock.kill.assert_called_once_with(1234, SIGINT)
manager.shutdown_signal(SIGINT, None)
manager_os_mock.kill.assert_called_once_with(1234, SIGKILL)
def test_restart_all(): def test_restart_all():
p1 = Mock() p1 = Mock()
p2 = Mock() p2 = Mock()