From: Brady J. Garvin Date: Sat, 30 Jan 2021 16:01:54 +0000 (-0600) Subject: validate:launcher: Ensure a positive job count. X-Git-Tag: 1.19.3~491^2~24 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2b8eef30e7192869bdb607fa0c0f9f856af94ace;p=platform%2Fupstream%2Fgstreamer.git validate:launcher: Ensure a positive job count. The default number of jobs to use is half of the available cores rounded down, but in situations where only one core is available (such as under some VMs), this means that `gst-validate-launcher` defaults to using zero jobs, a case that the test-running code is not prepared to handle. This change makes the code match the documentation for the `--jobs` option, guards against negative values both in the default setting and in argument parsing, and introduces some defensive programming to prevent other situations where the code might try to use zero jobs. Part-of: --- diff --git a/validate/launcher/apps/gstcheck.py b/validate/launcher/apps/gstcheck.py index 7cd5a94..8b29fb8 100644 --- a/validate/launcher/apps/gstcheck.py +++ b/validate/launcher/apps/gstcheck.py @@ -372,6 +372,7 @@ class GstCheckTestsManager(MesonTestsManager): to_inspect.append(test) if to_inspect: + assert self.options.num_jobs >= 0 executor = conc.ThreadPoolExecutor( max_workers=self.options.num_jobs) tmp = [] diff --git a/validate/launcher/baseclasses.py b/validate/launcher/baseclasses.py index 67c4842..00832bc 100644 --- a/validate/launcher/baseclasses.py +++ b/validate/launcher/baseclasses.py @@ -2091,7 +2091,8 @@ class _TestsLauncher(Loggable): else: alone_tests.append(test) - max_num_jobs = min(self.options.num_jobs, len(tests)) + # use max to defend against the case where all tests are alone_tests + max_num_jobs = max(min(self.options.num_jobs, len(tests)), 1) jobs_running = 0 if self.options.forever and len(tests) < self.options.num_jobs and len(tests): diff --git a/validate/launcher/main.py b/validate/launcher/main.py index 9214b80..745a774 100644 --- a/validate/launcher/main.py +++ b/validate/launcher/main.py @@ -181,6 +181,13 @@ class PrintUsage(argparse.Action): parser.exit() +def _positive_integer_type(value): + cast = int(value) + if cast <= 0: + raise argparse.ArgumentTypeError(f'`{value}\' is not a positive integer') + return cast + + class LauncherConfig(Loggable): def __init__(self): @@ -210,7 +217,7 @@ class LauncherConfig(Loggable): self.logsdir = None self.privatedir = None self.redirect_logs = False - self.num_jobs = int(multiprocessing.cpu_count() / 2) + self.num_jobs = max(multiprocessing.cpu_count(), 1) self.dest = None self._using_default_paths = False # paths passed with --media-path, and not defined by a testsuite @@ -543,8 +550,8 @@ class LauncherConfig(Loggable): help="Redirect logs to stdout.") dir_group.add_argument("-j", "--jobs", dest="num_jobs", help="Number of tests to execute simultaneously" - " (Defaults to number of cores of the processor)", - type=int) + " (Defaults to the number of cores of the processor)", + type=_positive_integer_type) dir_group.add_argument("--ignore-numfailures", dest="ignore_numfailures", help="Ignore the number of failed test in exit code", default=False, action='store_true')