From 3a73320bb0c4b7e864f76f35483b7ab57d16a96a Mon Sep 17 00:00:00 2001 From: Jarek Potiuk Date: Wed, 27 Apr 2022 00:06:20 +0200 Subject: [PATCH] Remove custom signal handling in Triggerer There is a bug in CPython (fixed in March 2022 but not yet released) that makes async.io handle SIGTERM improperly by using async unsafe functions and hanging the triggerer receive SIGPIPE while handling SIGTERN/SIGINT and deadlocking itself. Until the bug is handled we should rather rely on standard handling of the signals rather than adding our own signal handlers. Seems that even if our signal handler just run exit(0) - it caused a race condition that led to the hanging. More details: * https://bugs.python.org/issue39622 * https://github.com/python/cpython/issues/83803 Fixes: #19260 --- airflow/cli/commands/triggerer_command.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/airflow/cli/commands/triggerer_command.py b/airflow/cli/commands/triggerer_command.py index 82e7fde129698..8bf419268059b 100644 --- a/airflow/cli/commands/triggerer_command.py +++ b/airflow/cli/commands/triggerer_command.py @@ -24,7 +24,7 @@ from airflow import settings from airflow.jobs.triggerer_job import TriggererJob from airflow.utils import cli as cli_utils -from airflow.utils.cli import setup_locations, setup_logging, sigint_handler, sigquit_handler +from airflow.utils.cli import setup_locations, setup_logging, sigquit_handler @cli_utils.action_cli @@ -50,7 +50,19 @@ def triggerer(args): job.run() else: - signal.signal(signal.SIGINT, sigint_handler) - signal.signal(signal.SIGTERM, sigint_handler) + # There is a bug in CPython (fixed in March 2022 but not yet released) that + # makes async.io handle SIGTERM improperly by using async unsafe + # functions and hanging the triggerer receive SIGPIPE while handling + # SIGTERN/SIGINT and deadlocking itself. Until the bug is handled + # we should rather rely on standard handling of the signals rather than + # adding our own signal handlers. Seems that even if our signal handler + # just run exit(0) - it caused a race condition that led to the hanging. + # + # More details: + # * https://bugs.python.org/issue39622 + # * https://github.com/python/cpython/issues/83803 + # + # signal.signal(signal.SIGINT, sigint_handler) + # signal.signal(signal.SIGTERM, sigint_handler) signal.signal(signal.SIGQUIT, sigquit_handler) job.run()