|
34 | 34 |
|
35 | 35 | logger = logging.getLogger(__name__) |
36 | 36 |
|
| 37 | +# Fraction of the plottable benchmark set a revision must have legacy results |
| 38 | +# for before gethistoricaldata() will render it as the 'latest' column. Runs |
| 39 | +# glitch and drop individual benchmarks, so this is deliberately below 1.0. |
| 40 | +LATEST_MIN_COVERAGE = 0.8 |
| 41 | + |
37 | 42 |
|
38 | 43 | def no_environment_error(request): |
39 | 44 | admin_url = reverse('admin:codespeed_environment_changelist') |
@@ -190,16 +195,33 @@ def gethistoricaldata(request): |
190 | 195 | project=default_exe.project) |
191 | 196 | revs = Revision.objects.filter( |
192 | 197 | branch=default_branch).order_by('-date')[:100] |
193 | | - default_lastrev = None |
| 198 | + # The benchmarks the plots can actually use: those the baseline and every |
| 199 | + # tagged revision all have legacy results for. A benchmark missing from any |
| 200 | + # of them is dropped client side, so it cannot count towards coverage. |
| 201 | + plottable = {res.benchmark.name for res in baseline_results[0][1]} |
| 202 | + for tag in data['tagged_revs']: |
| 203 | + plottable &= {res.benchmark.name for res in default_results[tag]} |
| 204 | + required = len(plottable) * LATEST_MIN_COVERAGE |
| 205 | + |
| 206 | + # Accept a revision as 'latest' only once its legacy run has covered enough |
| 207 | + # of that set, otherwise fall back to the previous one that has. |
194 | 208 | for rev in revs: |
195 | | - default_lastrev = rev |
196 | | - if default_lastrev.results.filter(executable=default_exe, environment=env): |
197 | | - break |
198 | | - default_lastrev = None |
199 | | - if default_lastrev is not None: |
200 | | - default_results['latest'] = Result.objects.filter( |
201 | | - executable=default_exe, revision=default_lastrev, environment=env, |
| 209 | + latest_results = Result.objects.filter( |
| 210 | + executable=default_exe, revision=rev, environment=env, |
202 | 211 | benchmark__source='legacy') |
| 212 | + covered = plottable & {res.benchmark.name for res in latest_results} |
| 213 | + if covered and len(covered) >= required: |
| 214 | + default_results['latest'] = latest_results |
| 215 | + break |
| 216 | + logger.info( |
| 217 | + "skipping '%s' as 'latest': %d of %d plottable benchmarks have " |
| 218 | + "legacy results for '%s'" % ( |
| 219 | + str(rev), len(covered), len(plottable), str(env))) |
| 220 | + else: |
| 221 | + logger.error( |
| 222 | + "no revision covers %.0f%% of the %d plottable benchmarks for " |
| 223 | + "'%s' '%s'" % (LATEST_MIN_COVERAGE * 100, len(plottable), |
| 224 | + str(default_exe), str(env))) |
203 | 225 |
|
204 | 226 | # Collect data |
205 | 227 | benchmarks = [] |
|
0 commit comments