Skip to content

Commit db379c4

Browse files
[3.15] gh-156722, test_dtrace: Terminate tracing processes gracefully on timeout (GH-156753) (#157985)
Co-authored-by: stratakis <stratakishar@gmail.com>
1 parent b03ea0d commit db379c4

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(
@@ -350,7 +362,7 @@ def run_case(self, name, optimize_python=None):
350362
)
351363
stdout, stderr = proc.communicate(timeout=60)
352364
except subprocess.TimeoutExpired:
353-
kill_process_group(proc)
365+
terminate_process_group(proc)
354366
raise AssertionError("bpftrace timed out")
355367
except (FileNotFoundError, PermissionError) as e:
356368
raise unittest.SkipTest(f"bpftrace not available: {e}")
@@ -389,7 +401,7 @@ def assert_usable(self):
389401
)
390402
stdout, stderr = proc.communicate(timeout=10)
391403
except subprocess.TimeoutExpired:
392-
kill_process_group(proc)
404+
terminate_process_group(proc)
393405
raise unittest.SkipTest("bpftrace timed out during usability check")
394406
except OSError as e:
395407
raise unittest.SkipTest(f"bpftrace not available: {e}")

0 commit comments

Comments
 (0)