Skip to content

Commit 55ecc0a

Browse files
authored
gh-156722, test_dtrace: Terminate tracing processes gracefully on timeout (#156753)
Send SIGTERM to the tracing process group before falling back to SIGKILL.
1 parent 71f6c00 commit 55ecc0a

1 file changed

Lines changed: 19 additions & 7 deletions

File tree

‎Lib/test/test_dtrace.py‎

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -84,21 +84,33 @@ def normalize_trace_output(output):
8484

8585

8686
USE_PROCESS_GROUP = (hasattr(os, "setsid") and hasattr(os, "killpg"))
87+
TERMINATE_TIMEOUT = 10
8788

8889
def create_process_group(*args, **kwargs):
8990
if USE_PROCESS_GROUP:
9091
kwargs['start_new_session'] = True
9192
return subprocess.Popen(*args, **kwargs)
9293

93-
def kill_process_group(proc):
94+
def terminate_process_group(proc):
9495
if USE_PROCESS_GROUP:
9596
try:
96-
os.killpg(proc.pid, signal.SIGKILL)
97+
os.killpg(proc.pid, signal.SIGTERM)
9798
except ProcessLookupError:
9899
pass
99100
else:
100-
proc.kill()
101-
proc.communicate() # Clean up
101+
proc.terminate()
102+
103+
try:
104+
proc.communicate(timeout=TERMINATE_TIMEOUT)
105+
except subprocess.TimeoutExpired:
106+
if USE_PROCESS_GROUP:
107+
try:
108+
os.killpg(proc.pid, signal.SIGKILL)
109+
except ProcessLookupError:
110+
pass
111+
else:
112+
proc.kill()
113+
proc.communicate(timeout=TERMINATE_TIMEOUT) # Clean up
102114

103115

104116
def run_readelf(cmd):
@@ -163,7 +175,7 @@ def trace(self, script_file, subcommand=None, *, timeout=None,
163175
try:
164176
stdout, _ = proc.communicate(timeout=timeout)
165177
except subprocess.TimeoutExpired:
166-
kill_process_group(proc)
178+
terminate_process_group(proc)
167179
raise
168180
if check_returncode and proc.returncode:
169181
raise AssertionError(
@@ -361,7 +373,7 @@ def run_case(self, name, optimize_python=None):
361373
)
362374
stdout, stderr = proc.communicate(timeout=60)
363375
except subprocess.TimeoutExpired:
364-
kill_process_group(proc)
376+
terminate_process_group(proc)
365377
raise AssertionError("bpftrace timed out")
366378
except (FileNotFoundError, PermissionError) as e:
367379
raise unittest.SkipTest(f"bpftrace not available: {e}")
@@ -400,7 +412,7 @@ def assert_usable(self):
400412
)
401413
stdout, stderr = proc.communicate(timeout=10)
402414
except subprocess.TimeoutExpired:
403-
kill_process_group(proc)
415+
terminate_process_group(proc)
404416
raise unittest.SkipTest("bpftrace timed out during usability check")
405417
except OSError as e:
406418
raise unittest.SkipTest(f"bpftrace not available: {e}")

0 commit comments

Comments
 (0)