From 32c3f288b010838ecc9844f296085ee75a9c08a0 Mon Sep 17 00:00:00 2001 From: Iain Lane <iain@orangesquash.org.uk> Date: Fri, 21 May 2021 13:36:05 +0100 Subject: [PATCH] autopkgtest: Check for kernel-triggered tests when migrating kernels We currently skip the ALWAYSFAIL/REGRESSION handling for kernels. This can lead to us missing genuine regressions in kernel uploads. The idea is that results from one kernel flavour shouldn't influence another. We can keep this idea but do better and actually check for regressions: when looking at results, if we're considering a kernel, only look at results which were triggered by this kernel. --- britney2/policies/autopkgtest.py | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/britney2/policies/autopkgtest.py b/britney2/policies/autopkgtest.py index 40ab279..20452bf 100644 --- a/britney2/policies/autopkgtest.py +++ b/britney2/policies/autopkgtest.py @@ -1164,7 +1164,18 @@ class AutopkgtestPolicy(BasePolicy): # determine current test result status until = self.find_max_lower_force_reset_test(src, ver, arch) - ever_passed = self.check_ever_passed_before(src, ver, arch, until) + + # Special-case triggers from linux-meta*: we cannot compare results + # against different kernels, as e. g. a DKMS module might work against + # the default kernel but fail against a different flavor; so for those, + # filter the considered results to only those against our kernel + if trigger.startswith('linux-meta'): + only_trigger = trigger.split('/', 1)[0] + self.logger.info('This is a kernel; we will only look for results triggered by %s when considering regressions', + trigger) + else: + only_trigger = None + ever_passed = self.check_ever_passed_before(src, ver, arch, until, only_trigger=only_trigger) fail_result = 'REGRESSION' if ever_passed else 'ALWAYSFAIL' @@ -1176,15 +1187,6 @@ class AutopkgtestPolicy(BasePolicy): run_id = r[2] if r[0] in {Result.FAIL, Result.OLD_FAIL}: - # Special-case triggers from linux-meta*: we cannot compare - # results against different kernels, as e. g. a DKMS module - # might work against the default kernel but fail against a - # different flavor; so for those, ignore the "ever - # passed" check; FIXME: check against trigsrc only - if self.options.adt_baseline != 'reference' and \ - (trigger.startswith('linux-meta') or trigger.startswith('linux/')): - baseline_result = Result.FAIL - if baseline_result == Result.FAIL: result = 'ALWAYSFAIL' elif baseline_result in {Result.NONE, Result.OLD_FAIL}: @@ -1256,7 +1258,7 @@ class AutopkgtestPolicy(BasePolicy): return (result, ver, run_id, url) - def check_ever_passed_before(self, src, max_ver, arch, min_ver=None): + def check_ever_passed_before(self, src, max_ver, arch, min_ver=None, only_trigger=None): '''Check if tests for src ever passed on arch for specified range If min_ver is specified, it checks that all versions in @@ -1264,7 +1266,11 @@ class AutopkgtestPolicy(BasePolicy): [min_ver, inf) have passed.''' # FIXME: add caching - for srcmap in self.test_results.values(): + for (trigger, srcmap) in self.test_results.items(): + if only_trigger: + trig = trigger.split('/', 1)[0] + if only_trigger != trig: + continue try: too_high = apt_pkg.version_compare(srcmap[src][arch][1], max_ver) > 0 too_low = apt_pkg.version_compare(srcmap[src][arch][1], min_ver) <= 0 if min_ver else False