From 03da1606bcee38acddaf77028108122170ecfdea Mon Sep 17 00:00:00 2001 From: ethernet Date: Mon, 10 Aug 2026 11:14:19 -0400 Subject: [PATCH] fix(ci): merge all duration slices, not one Each test slice uploads an artifact with the same file name, test_durations.json. The save-durations job downloaded the 12 artifacts with merge-multiple, so all extractions wrote to one path in parallel. This caused two faults: - A race between two extractions wrote two JSON documents into one file. The merge step then failed with 'JSONDecodeError: Extra data' (run 31382130252). - On green runs, the last write erased the other 11 slices. The merged cache held ~230 of ~2760 file durations. Remove merge-multiple so each artifact extracts into its own directory, and point the glob at durations/*/test_durations.json. A local merge of the 12 real artifacts from the failed run gives 2761 durations. --- .github/workflows/tests.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 3888e8d44f..a79bf08563 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -155,18 +155,22 @@ jobs: timeout-minutes: 10 steps: - name: Download all slice durations + # Each slice uploads the same file name (test_durations.json). + # With merge-multiple, the parallel downloads write to one path. + # This causes two problems: a race can write two JSON documents + # into one file, and the last write erases the other slices. + # Without merge-multiple, each artifact gets its own directory. uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: pattern: test-durations-slice-* path: durations - merge-multiple: true - name: Merge into single durations file run: | python3 -c " import json, glob, os merged = {} - for f in glob.glob('durations/*test_durations.json'): + for f in glob.glob('durations/*/test_durations.json'): with open(f) as fh: merged.update(json.load(fh)) with open('test_durations.json', 'w') as fh: