Patch CI statistics

Pipeline reads CI wall-clock time. Corpus reads today's patchsets laid out over PostgreSQL's history.

Runs
10,919
terminal, in range
Success rate
84.7%
9,247 of 10,919
Median build
2m 52s
successful and failed alike
Median test
5m 18s
successful and failed alike
Median queue wait
0m 00s
queued to started
Infra errors
0.1%
7 runs
GitHub re-attempts
0
attempt > 1 on one run id

Runs by result

terminal runs only; timeouts fold into their failure band

Show data
WhenResultRuns
11 Aug 00:00build failed1
11 Aug 00:00success27
11 Aug 00:00tests failed5
12 Aug 00:00build failed65
12 Aug 00:00cancelled3
12 Aug 00:00infra error5
12 Aug 00:00success1,298
12 Aug 00:00tests failed165
13 Aug 00:00build failed65
13 Aug 00:00cancelled1
13 Aug 00:00success1,293
13 Aug 00:00tests failed166
14 Aug 00:00build failed65
14 Aug 00:00cancelled1
14 Aug 00:00infra error1
14 Aug 00:00success1,275
14 Aug 00:00tests failed165
15 Aug 00:00build failed66
15 Aug 00:00cancelled1
15 Aug 00:00infra error1
15 Aug 00:00success1,288
15 Aug 00:00tests failed173
16 Aug 00:00build failed65
16 Aug 00:00success1,284
16 Aug 00:00tests failed169
17 Aug 00:00build failed67
17 Aug 00:00success1,313
17 Aug 00:00tests failed171
18 Aug 00:00build failed74
18 Aug 00:00success1,469
18 Aug 00:00tests failed177

Success rate

hollow points sit below 5 terminal runs in the bucket

Show data
WhenSuccess rateTerminal runs
11 Aug 00:0081.8%33
12 Aug 00:0084.5%1,536
13 Aug 00:0084.8%1,525
14 Aug 00:0084.6%1,507
15 Aug 00:0084.2%1,529
16 Aug 00:0084.6%1,518
17 Aug 00:0084.7%1,551
18 Aug 00:0085.4%1,720

Build and test duration by era

median seconds; successful runs only

Show data
WhenEraBuild medianTest medianBuild p25-p75
18 Aug 00:00bookworm2m 54s3m 35s2m 50s - 3m 07s
11 Aug 00:00trixie2m 53s5m 25s2m 48s - 2m 55s
12 Aug 00:00trixie2m 52s5m 21s2m 46s - 2m 55s
13 Aug 00:00trixie2m 52s5m 21s2m 47s - 2m 55s
14 Aug 00:00trixie2m 52s5m 22s2m 47s - 2m 55s
15 Aug 00:00trixie2m 53s5m 22s2m 47s - 2m 56s
16 Aug 00:00trixie2m 53s5m 19s2m 47s - 2m 55s
17 Aug 00:00trixie2m 53s5m 19s2m 47s - 2m 55s
18 Aug 00:00trixie2m 51s5m 18s2m 45s - 2m 55s

ccache hit rate

median per bucket; the image's warm cache was baked against one reference commit, so a patch on a different base misses most of it

Show data
WhenHit rateRuns
11 Aug 00:002.5%27
12 Aug 00:002.5%1,298
13 Aug 00:002.5%1,293
14 Aug 00:002.5%1,275
15 Aug 00:001.5%1,288
16 Aug 00:001.5%1,284
17 Aug 00:001.5%1,313
18 Aug 00:001.5%1,469

Build time against ccache hit rate

one point per successful run; table shows the first 50

Show data
Hit rateBuild
1.5%2m 47s
1.5%2m 48s
4.7%2m 51s
4.7%2m 50s
1.5%2m 55s
4.7%2m 54s
4.7%2m 51s
4.7%3m 04s
1.5%2m 41s
4.7%2m 52s
4.7%2m 52s
1.5%2m 48s
4.7%1m 53s
10.5%2m 48s
1.5%2m 56s
1.5%1m 58s
34.7%0m 43s
1.7%3m 08s
17.2%2m 22s
1.5%2m 55s
1.6%2m 20s
1.6%2m 55s
1.6%3m 11s
1.6%3m 09s
1.6%3m 10s
1.6%3m 07s
1.6%2m 59s
1.5%2m 25s
1.5%2m 53s
1.6%3m 07s
1.6%2m 54s
1.6%3m 09s
1.5%3m 02s
1.2%2m 39s
1.2%2m 40s
1.5%2m 48s
1.2%2m 37s
1.5%2m 21s
1.2%2m 48s
1.5%2m 54s
1.3%2m 49s
1.3%2m 49s
1.3%2m 50s
1.3%1m 45s
1.3%1m 49s
1.5%2m 55s
1.3%2m 37s
1.3%2m 38s
1.5%2m 56s
1.5%2m 46s

Queue latency

median seconds

Show data
WhenPush to queuedQueued to started
11 Aug 00:00-8661m 09s0m 00s
12 Aug 00:00-8651m 16s0m 00s
13 Aug 00:00-7209m 15s0m 00s
14 Aug 00:00-5768m 47s0m 00s
15 Aug 00:00-4326m 10s0m 00s
16 Aug 00:00-2885m 39s0m 00s
17 Aug 00:00-1442m 36s0m 00s
18 Aug 00:000m 01s0m 00s

Average concurrency

time-weighted average of runs in flight per bucket, against the 30-slot budget

Show data
WhenAvg concurrency
11 Aug 00:0013.6
12 Aug 00:0013.2
13 Aug 00:0013.4
14 Aug 00:0012.6
15 Aug 00:0012.7
16 Aug 00:0012.1
17 Aug 00:0013.9
18 Aug 00:0014.8

Push lag

time from the patch being posted to CI queueing it

Show data
WhenLagRuns
11 Aug 00:00same day8
11 Aug 00:00days5
11 Aug 00:00weeks1
11 Aug 00:00months11
11 Aug 00:00older8
12 Aug 00:00same day30
12 Aug 00:00days82
12 Aug 00:00weeks155
12 Aug 00:00months576
12 Aug 00:00older693
13 Aug 00:00same day33
13 Aug 00:00days75
13 Aug 00:00weeks156
13 Aug 00:00months570
13 Aug 00:00older691
14 Aug 00:00same day14
14 Aug 00:00days81
14 Aug 00:00weeks152
14 Aug 00:00months572
14 Aug 00:00older688
15 Aug 00:00same day21
15 Aug 00:00days77
15 Aug 00:00weeks157
15 Aug 00:00months581
15 Aug 00:00older693
16 Aug 00:00same day18
16 Aug 00:00days58
16 Aug 00:00weeks161
16 Aug 00:00months588
16 Aug 00:00older693
17 Aug 00:00same day33
17 Aug 00:00days71
17 Aug 00:00weeks162
17 Aug 00:00months591
17 Aug 00:00older694
18 Aug 00:00same day27
18 Aug 00:00days61
18 Aug 00:00weeks172
18 Aug 00:00months674
18 Aug 00:00older786

Push kind

first push, a re-push on a newer master, or a retry of the same head

Show data
WhenKindRuns
11 Aug 00:00first push8
11 Aug 00:00rebase re-push25
12 Aug 00:00first push30
12 Aug 00:00rebase re-push1,503
12 Aug 00:00retry3
13 Aug 00:00first push35
13 Aug 00:00rebase re-push1,490
14 Aug 00:00first push14
14 Aug 00:00rebase re-push1,493
15 Aug 00:00first push21
15 Aug 00:00rebase re-push1,507
15 Aug 00:00retry1
16 Aug 00:00first push18
16 Aug 00:00rebase re-push1,500
17 Aug 00:00first push33
17 Aug 00:00rebase re-push1,518
18 Aug 00:00first push228
18 Aug 00:00rebase re-push1,492

Suites failed per failing run

one suite is usually a patch bug; dozens is usually one crash cascading

Show data
Suites failedRuns
1399
257
327
4348
574
618
746
817
96
107
1113
1211
134
217
311
337
551
561
586
597
627
681
767
837
1023
1074
1111
1226
1231
1296
1313
1321
1331
1401
1553
1561
1572
1582
2003

Top failing suites

total failures, and in brackets the number of distinct patchsets - many failures on few patchsets means one broken patch retried; roughly one per patchset means either a flaky suite or a suite that reruns others and inherits their failures

recovery/027_stream_regress
562 (91 branches)
test_plan_advice/001_replan_regress
520 (80 branches)
pg_upgrade/002_pg_upgrade
514 (85 branches)
regress/collate.icu.utf8
69 (15 branches)
regress/subselect
68 (14 branches)
regress/partition_join
62 (15 branches)
postgres_fdw/postgres_fdw
60 (9 branches)
regress/alter_table
60 (12 branches)
regress/copy2
60 (12 branches)
regress/join
58 (12 branches)
regress/partition_split
58 (10 branches)
isolation/horizons
57 (9 branches)
regress/generated_virtual
55 (11 branches)
regress/stats
54 (12 branches)
regress/plpgsql
52 (10 branches)
regress/predicate
52 (10 branches)
regress/with
52 (10 branches)
isolation/eval-plan-qual
50 (8 branches)
regress/aggregates
49 (10 branches)
regress/foreign_key
46 (10 branches)

Infra health

Everything here should be zero. Non-zero is worth a look, not a panic.

ConditionCount
infra errors7
in flight past 48h0
branches with a failed push2
payloads we could not parse0
runs with no payload6
built but pushed no image46
Retried heads
4
same head_sha pushed again, new run id
Verdict changed
100.0%
4 of 4 - meaningless until this denominator grows
discussionsallactive only
Tracked patchsets
5,630
current, not superseded, all patchsets
Median base age
860 days
behind master, all patchsets
On recent master
34.2%
base 30 days or newer, all patchsets
Has a verdict
89.2%
terminal CI status, all patchsets
Has a runnable image
85.7%
counted by digest, all patchsets
recent
1,926
base age tier, all patchsets
stale
398
base age tier, all patchsets
ancient
3,228
base age tier, all patchsets
unknown
78
base age tier, all patchsets

Master re-check recency

when each patchset was last tried against master; overdue is past 26h with master moved since. Unlike the base age tiles above, this follows the discussions control.

current
5
behind
381
overdue
109
never
16

Base age distribution

all current patchsets against those in active discussions

Show data
Base ageAllActive discussions
<1d1,616318
1-7d6555
7-30d24599
30-90d6216
90d-1y33610
1-2y3632
2-5y9390
>5y1,9261
unknown7810

Outcome by base commit year

current patchsets, by the year of the master commit they apply to

Show data
Base yearOutcomePatchsets
unknownnever applied10
2021success1
2025success2
2025tests failed1
2026success422
2026cancelled1
2026tests failed31
2026build failed6
2026infra error1
2026no verdict6
2026never applied30

Success rate by base commit year

of patchsets carrying a verdict

Show data
Base yearSuccess rateWith a verdict
2021100.0%1
202566.7%3
202691.6%463

Apply failures by base commit year

patchsets that would not apply even to their own detected base - a patch-extraction / base-detection signal, not a staleness measure; the rate is in the table

Show data
Base yearPatchsetsFailed to applyFailure rate
unknown1010100.0%
2021100.0%
2025300.0%
2026497306.0%

Build and test time over PostgreSQL history

median seconds of successful runs, by the base commit's year

Show data
Base yearBuild medianTest median
20212m 17s3m 02s
20252m 32s5m 43s
20262m 53s5m 21s

Test suites over PostgreSQL history

median executed suites of successful runs, by the base commit's year

Show data
Base yearSuites median
2021623
2025905
20261019

Per PostgreSQL major

A major whose era image is still a disabled stub is marked - those patchsets sit in won't-retry until the image exists.

PGEraPatchsetsRunsSuccessBuild medianTest medianSuitesImages
15bullseye11100.0%2m 17s3m 02s6231
19trixie161580.0%2m 47s4m 45s99714
20trixie4834,43091.0%2m 52s5m 21s1019438

Files the corpus conflicts on

from apply-stage failures; in brackets the number of distinct patchsets

src/backend/utils/adt/float.c
3 (3 branches)
src/include/utils/float.h
3 (3 branches)
doc/src/sgml/release-18.sgml
2 (2 branches)
doc/src/sgml/release-19.sgml
2 (2 branches)
src/backend/commands/publicationcmds.c
2 (2 branches)
contrib/pg_buffercache/pg_buffercache_pages.c
1 (1 branches)
doc/src/sgml/perform.sgml
1 (1 branches)
doc/src/sgml/protocol.sgml
1 (1 branches)
doc/src/sgml/ref/explain.sgml
1 (1 branches)
src/backend/access/common/reloptions.c
1 (1 branches)
src/backend/access/common/toast_internals.c
1 (1 branches)
src/backend/access/heap/heapam.c
1 (1 branches)
src/backend/access/table/toast_helper.c
1 (1 branches)
src/backend/optimizer/path/allpaths.c
1 (1 branches)
src/backend/optimizer/path/joinpath.c
1 (1 branches)
src/backend/optimizer/plan/subselect.c
1 (1 branches)
src/backend/optimizer/prep/prepjointree.c
1 (1 branches)
src/backend/optimizer/util/pathnode.c
1 (1 branches)
src/backend/postmaster/checkpointer.c
1 (1 branches)
src/backend/replication/logical/relation.c
1 (1 branches)

Verdict coverage in active discussions

patchsets in threads with a message in the last 30 days

Show data
EraWith a verdictNo verdict
bullseye10
trixie46633
unknown011

Patch size against outcome

files touched per patchset, from the recorded submission paths

Show data
Files touchedOutcomePatchsets
unknownsuccess425
unknowncancelled1
unknowntests failed32
unknownbuild failed6
unknowninfra error1
unknownno verdict6
unknownnever applied40

Patchset versions per topic

every version, superseded included; split by whether the topic was committed

Show data
VersionsTopicTopics
1not committed4,980
1committed337
2not committed157
2committed36
3not committed46
3committed8
4not committed14
4committed5
5committed2
5not committed8
6committed1
6not committed5
7not committed4
8not committed2
10committed1
11not committed1

Why the orchestrator won't retry

The dashboard shows the top three of this same breakdown.

ReasonPatchsets
base too old3,118
committed118
patchset touches .github/11