tests: Add option to limit the number of workers

Also, increase the minimum ammount of workers from 1 to
2 when the core count can not be determined.
pull/8859/head
Daniel Mensinger 4 years ago
parent 098e3f9994
commit 0aa8843fb2
  1. 47
      run_project_tests.py

@ -70,6 +70,7 @@ if T.TYPE_CHECKING:
extra_args: T.List[str]
backend: str
num_workers: int
failfast: bool
no_unittests: bool
only: T.List[str]
@ -1074,11 +1075,14 @@ def detect_tests_to_run(only: T.Dict[str, T.List[str]], use_tmp: bool) -> T.List
return gathered_tests
def run_tests(all_tests: T.List[T.Tuple[str, T.List[TestDef], bool]],
log_name_base: str, failfast: bool,
extra_args: T.List[str], use_tmp: bool) -> T.Tuple[int, int, int]:
log_name_base: str,
failfast: bool,
extra_args: T.List[str],
use_tmp: bool,
num_workers: int) -> T.Tuple[int, int, int]:
txtname = log_name_base + '.txt'
with open(txtname, 'w', encoding='utf-8', errors='ignore') as lf:
return _run_tests(all_tests, log_name_base, failfast, extra_args, use_tmp, lf)
return _run_tests(all_tests, log_name_base, failfast, extra_args, use_tmp, num_workers, lf)
class TestStatus(Enum):
OK = normal_green(' [SUCCESS] ')
@ -1135,6 +1139,7 @@ def _run_tests(all_tests: T.List[T.Tuple[str, T.List[TestDef], bool]],
failfast: bool,
extra_args: T.List[str],
use_tmp: bool,
num_workers: int,
logfile: T.TextIO) -> T.Tuple[int, int, int]:
global stop, host_c_compiler
xmlname = log_name_base + '.xml'
@ -1146,20 +1151,7 @@ def _run_tests(all_tests: T.List[T.Tuple[str, T.List[TestDef], bool]],
failing_tests = 0
skipped_tests = 0
try:
# This fails in some CI environments for unknown reasons.
num_workers = multiprocessing.cpu_count()
except Exception as e:
print('Could not determine number of CPUs due to the following reason:' + str(e))
print('Defaulting to using only one process')
num_workers = 1
# Due to Ninja deficiency, almost 50% of build time
# is spent waiting. Do something useful instead.
#
# Remove this once the following issue has been resolved:
# https://github.com/mesonbuild/meson/pull/2082
if not mesonlib.is_windows(): # twice as fast on Windows by *not* multiplying by 2.
num_workers *= 2
print(f'\nRunning tests with {num_workers} workers')
executor = ProcessPoolExecutor(max_workers=num_workers)
futures: T.List[RunFutureUnion] = []
@ -1489,10 +1481,28 @@ def clear_transitive_files() -> None:
if __name__ == '__main__':
setup_vsenv()
try:
# This fails in some CI environments for unknown reasons.
num_workers = multiprocessing.cpu_count()
except Exception as e:
print('Could not determine number of CPUs due to the following reason:' + str(e))
print('Defaulting to using only two processes')
num_workers = 2
# Due to Ninja deficiency, almost 50% of build time
# is spent waiting. Do something useful instead.
#
# Remove this once the following issue has been resolved:
# https://github.com/mesonbuild/meson/pull/2082
if not mesonlib.is_windows(): # twice as fast on Windows by *not* multiplying by 2.
num_workers *= 2
parser = argparse.ArgumentParser(description="Run the test suite of Meson.")
parser.add_argument('extra_args', nargs='*',
help='arguments that are passed directly to Meson (remember to have -- before these).')
parser.add_argument('--backend', dest='backend', choices=backendlist)
parser.add_argument('-j', dest='num_workers', type=int, default=num_workers,
help=f'Maximum number of parallel tests (default {num_workers})')
parser.add_argument('--failfast', action='store_true',
help='Stop running if test case fails')
parser.add_argument('--no-unittests', action='store_true',
@ -1532,7 +1542,8 @@ if __name__ == '__main__':
only[i].append('')
try:
all_tests = detect_tests_to_run(only, options.use_tmpdir)
(passing_tests, failing_tests, skipped_tests) = run_tests(all_tests, 'meson-test-run', options.failfast, options.extra_args, options.use_tmpdir)
res = run_tests(all_tests, 'meson-test-run', options.failfast, options.extra_args, options.use_tmpdir, options.num_workers)
(passing_tests, failing_tests, skipped_tests) = res
except StopException:
pass
print()

Loading…
Cancel
Save