Commit f59ac68b authored by Victor Stinner's avatar Victor Stinner

regrtest: add timeout to main process when using -jN

libregrtest: add a watchdog to run_tests_multiprocess() using
faulthandler.dump_traceback_later().
parent cb6aab12
import faulthandler
import json import json
import os import os
import queue import queue
...@@ -151,6 +152,8 @@ class MultiprocessThread(threading.Thread): ...@@ -151,6 +152,8 @@ class MultiprocessThread(threading.Thread):
def run_tests_multiprocess(regrtest): def run_tests_multiprocess(regrtest):
output = queue.Queue() output = queue.Queue()
pending = MultiprocessIterator(regrtest.tests) pending = MultiprocessIterator(regrtest.tests)
test_timeout = regrtest.ns.timeout
use_timeout = (test_timeout is not None)
workers = [MultiprocessThread(pending, output, regrtest.ns) workers = [MultiprocessThread(pending, output, regrtest.ns)
for i in range(regrtest.ns.use_mp)] for i in range(regrtest.ns.use_mp)]
...@@ -170,11 +173,14 @@ def run_tests_multiprocess(regrtest): ...@@ -170,11 +173,14 @@ def run_tests_multiprocess(regrtest):
finished = 0 finished = 0
test_index = 1 test_index = 1
timeout = max(PROGRESS_UPDATE, PROGRESS_MIN_TIME) get_timeout = max(PROGRESS_UPDATE, PROGRESS_MIN_TIME)
try: try:
while finished < regrtest.ns.use_mp: while finished < regrtest.ns.use_mp:
if use_timeout:
faulthandler.dump_traceback_later(test_timeout, exit=True)
try: try:
item = output.get(timeout=timeout) item = output.get(timeout=get_timeout)
except queue.Empty: except queue.Empty:
running = get_running(workers) running = get_running(workers)
if running and not regrtest.ns.pgo: if running and not regrtest.ns.pgo:
...@@ -215,6 +221,9 @@ def run_tests_multiprocess(regrtest): ...@@ -215,6 +221,9 @@ def run_tests_multiprocess(regrtest):
regrtest.interrupted = True regrtest.interrupted = True
pending.interrupted = True pending.interrupted = True
print() print()
finally:
if use_timeout:
faulthandler.cancel_dump_traceback_later()
running = [worker.current_test for worker in workers] running = [worker.current_test for worker in workers]
running = list(filter(bool, running)) running = list(filter(bool, running))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment