You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by al...@apache.org on 2016/12/29 15:08:33 UTC
incubator-airflow git commit: [AIRFLOW-721] Descendant process can
disappear before termination
Repository: incubator-airflow
Updated Branches:
refs/heads/master ed8e15be9 -> f048e94c8
[AIRFLOW-721] Descendant process can disappear before termination
There is a race condition in helpers.py's
kill_descendant_processes
that checks for running processes and then tries
to terminate them.
This is not done atomically allowing for a small
window where a PID
can disappear before termination.
Closes #1963 from bolkedebruin/AIRFLOW-721
Project: http://git-wip-us.apache.org/repos/asf/incubator-airflow/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-airflow/commit/f048e94c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-airflow/tree/f048e94c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-airflow/diff/f048e94c
Branch: refs/heads/master
Commit: f048e94c8019564e3ce2d24c97e3a7b41c5e54ba
Parents: ed8e15b
Author: Bolke de Bruin <bo...@xs4all.nl>
Authored: Thu Dec 29 16:08:03 2016 +0100
Committer: Alex Van Boxel <al...@vanboxel.be>
Committed: Thu Dec 29 16:08:03 2016 +0100
----------------------------------------------------------------------
airflow/utils/helpers.py | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-airflow/blob/f048e94c/airflow/utils/helpers.py
----------------------------------------------------------------------
diff --git a/airflow/utils/helpers.py b/airflow/utils/helpers.py
index 24fc310..23fda03 100644
--- a/airflow/utils/helpers.py
+++ b/airflow/utils/helpers.py
@@ -205,10 +205,16 @@ def kill_descendant_processes(logger, pids_to_kill=None):
logger.warn("Terminating descendant processes of {} PID: {}"
.format(this_process.cmdline(),
this_process.pid))
- for descendant in descendant_processes:
+
+ temp_processes = descendant_processes[:]
+ for descendant in temp_processes:
logger.warn("Terminating descendant process {} PID: {}"
.format(descendant.cmdline(), descendant.pid))
- descendant.terminate()
+ try:
+ descendant.terminate()
+ except psutil.NoSuchProcess:
+ descendant_processes.remove(descendant)
+
logger.warn("Waiting up to {}s for processes to exit..."
.format(TIME_TO_WAIT_AFTER_SIGTERM))
try:
@@ -228,8 +234,11 @@ def kill_descendant_processes(logger, pids_to_kill=None):
for descendant in descendant_processes:
logger.warn("Killing descendant process {} PID: {}"
.format(descendant.cmdline(), descendant.pid))
- descendant.kill()
- descendant.wait()
+ try:
+ descendant.kill()
+ descendant.wait()
+ except psutil.NoSuchProcess:
+ pass
logger.warn("Killed all descendant processes of {} PID: {}"
.format(this_process.cmdline(),
this_process.pid))