Skip to content

Continuous-testing failure-issue primitive + nightly fuzz job - #1783

Merged
timsehn merged 1 commit into
masterfrom
ci/nightly-fuzz
Jul 24, 2026
Merged

Continuous-testing failure-issue primitive + nightly fuzz job#1783
timsehn merged 1 commit into
masterfrom
ci/nightly-fuzz

Conversation

@timsehn

@timsehn timsehn commented Jul 23, 2026

Copy link
Copy Markdown
Collaborator

What

Sets up a reusable pattern for continuous (scheduled) test jobs that stay silent when they pass and cut a GitHub issue when they fail — no email infra required (GitHub's watcher notifications are the email path). Two pieces:

1. .github/actions/report-failure-issue (the reusable primitive)

A composite action that keeps one open tracking issue per label: it creates the issue if none is open, otherwise comments on it, so repeated failures append to a single triage thread instead of spamming. It auto-stamps the run URL, commit, ref, and workflow name into the body. It never auto-closes — a human closes after fixing.

Any future continuous job wires it up in one step:

- name: Report failure
  if: failure()          # or an explicit failure condition
  uses: ./.github/actions/report-failure-issue
  with:
    label: my-check
    title: "my-check failed"
    body-file: ${{ runner.temp }}/report.md
    token: ${{ secrets.GITHUB_TOKEN }}

This is the sqlite-upstream-drift issue handling, factored out and generalized.

2. .github/workflows/nightly-fuzz.yml (first consumer)

Runs the five on-disk-format libFuzzer harnesses — WAL replay, prolly node, refs blob, chunk index, catalog — for 10 min each nightly (07:00 UTC; duration configurable via workflow_dispatch). This is the "make fuzzing continuous" item: the harnesses already existed and ran 1 min/target per-PR in smoke.yml; this gives them sustained nightly runtime.

  • Continues past a crash so one run reports every crashing target.
  • On any crash: uploads reproducers as the fuzz-crashes artifact, files a fuzz-crash issue (with per-target ASan logs + base64 reproducers, and the bash test/run_fuzz.sh <target> <file> repro command), then fails the job.
  • Build/run steps are identical to the proven smoke.yml fuzz job.

Testing

  • Both YAML files parse.
  • The novel logic was simulated locally with stub fuzzers: continue-on-crash loop produces the correct failed list, per-target reproducers land via -artifact_prefix, and the issue body composes correctly (made base64 portable via stdin redirect so it works on any runner).
  • libFuzzer itself couldn't link locally (this machine's CLT clang lacks the fuzzer runtime), but the build/run steps are copied verbatim from smoke.yml, which passes on the Linux CI runners.

Note: the schedule only starts running once this is on the default branch; use the Run workflow button (workflow_dispatch) to trigger it on demand.

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Version-Control Performance Ceilings

Runs: median of 3 executions per benchmark, excluding fixture setup. The
working-set fixtures use 800 committed tables with 125 rows each
(100000 rows total); data-dirty cases update 1 row in 40
tables, and schema-dirty cases update 1 row plus add a column in 20 tables.
Branch tests use 300 branches, checkout uses a clean 400-table
branch switch over 100000 rows, and merge
tests use 100000-row tables with 2000 changed or conflicting
rows per side.

Benchmark Median ms Ceiling ms Result
status_clean_many_tables 59 200 PASS
status_dirty_many_tables 62 200 PASS
diff_regular_working_one_table 55 150 PASS
diff_regular_working_many_tables 64 200 PASS
diff_stat_working_many_tables 65 200 PASS
diff_schema_working_many_tables 64 200 PASS
branch_list_many_branches 18 100 PASS
branch_create_delete 30 100 PASS
checkout_branch_clean 107 200 PASS
merge_data_no_conflicts 38 150 PASS
merge_schema_no_conflicts 19 100 PASS
merge_data_conflicts 68 250 PASS
merge_data_conflicts_with_resolve 68 250 PASS

Introduce a reusable pattern for scheduled test jobs that should be
silent when they pass and cut a GitHub issue when they fail:

- .github/actions/report-failure-issue: a composite action that, given a
  label/title/body, keeps one open tracking issue per label -- creates it
  if none is open, otherwise comments -- and stamps in the run URL, commit,
  and workflow. Callers invoke it from an `if: failure()` step. GitHub's
  own watcher notifications are the email path, so no mail infra is needed.
  Mirrors the existing sqlite-upstream-drift issue handling, factored out
  so future continuous jobs reuse it in one step.

- .github/workflows/nightly-fuzz: first consumer. Fans the five on-disk
  deserializer libFuzzer harnesses out into a parallel matrix so each gets
  its own multi-hour budget (a single job caps at GitHub's 6h limit, so
  they can't be serialized), running 4h per target by default (configurable
  via dispatch). The discovered corpus is cached per target so each night
  compounds on earlier runs instead of restarting from the committed seeds.
  On a crash it uploads the reproducers and files a per-target
  fuzz-crash-<target> issue via the action, then fails that leg. Build/run
  steps match the per-PR smoke job.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Sysbench-Style Benchmark (composite PK): Doltlite vs SQLite

Companion to the classic Sysbench-Style Benchmark. Every workload here
runs against tables with a 2-column INTEGER PRIMARY KEY(a, b) WITHOUT ROWID.

Individual ratios gated at 2.5×; section averages gated at 2×. Autocommit writes use 10× / 5×.

In-Memory

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 34,835 42,343 1.22
oltp_range_select 20,463 22,634 1.11
oltp_sum_range 18,959 21,922 1.16
oltp_order_range 3,665 3,986 1.09
oltp_distinct_range 4,720 5,240 1.11
oltp_index_scan 4,866 6,775 1.39
select_random_points 29,430 34,234 1.16
select_random_ranges 8,181 9,390 1.15
covering_index_scan 4,370 4,822 1.10
groupby_scan 37,224 41,749 1.12
index_join 8,447 11,698 1.38
index_join_scan 4,149 5,843 1.41
types_table_scan 1,171,025 1,385,367 1.18
table_scan 1,413,949 1,496,318 1.06
oltp_read_only 160,041 179,721 1.12
Average 1.18

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 244,099 363,260 1.49
oltp_insert 19,375 37,842 1.95
oltp_update_index 72,552 128,777 1.77
oltp_update_non_index 54,018 87,060 1.61
oltp_delete_insert 52,066 102,909 1.98
oltp_write_only 28,847 60,683 2.10
types_delete_insert 34,902 58,425 1.67
oltp_read_write 115,312 168,606 1.46
Average 1.76

File-Backed

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 105,192 66,934 0.64
oltp_range_select 28,266 25,151 0.89
oltp_sum_range 26,810 24,673 0.92
oltp_order_range 4,463 4,299 0.96
oltp_distinct_range 5,637 5,613 1.00
oltp_index_scan 12,125 9,492 0.78
select_random_points 40,397 38,548 0.95
select_random_ranges 15,420 11,793 0.76
covering_index_scan 11,642 7,209 0.62
groupby_scan 37,423 42,123 1.13
index_join 12,611 13,512 1.07
index_join_scan 5,231 6,465 1.24
types_table_scan 1,161,563 1,378,050 1.19
table_scan 1,426,961 1,491,140 1.04
oltp_read_only 265,883 223,085 0.84
Average 0.94

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 265,216 388,766 1.47
oltp_insert 27,064 47,979 1.77
oltp_update_index 104,790 157,413 1.50
oltp_update_non_index 78,988 109,567 1.39
oltp_delete_insert 83,301 124,963 1.50
oltp_write_only 55,088 81,877 1.49
types_delete_insert 52,352 73,563 1.41
oltp_read_write 144,365 189,415 1.31
Average 1.48

File-Backed (autocommit)

Each statement runs as its own transaction — exposes per-commit
fixed costs that the wrapped-in-BEGIN/COMMIT tests amortize away.
SQLite uses WAL mode with synchronous=FULL in this section so
the comparison uses SQLite's durable WAL autocommit path.

Reads

Reads have no commit cost; these are the same SQL files as the
File-Backed Reads section, included here for symmetry and to
catch any per-statement overhead doltlite pays on the read path.

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 59,465 67,686 1.14
oltp_range_select 23,580 25,645 1.09
oltp_sum_range 22,049 24,859 1.13
oltp_order_range 4,065 4,391 1.08
oltp_distinct_range 5,103 5,521 1.08
oltp_index_scan 7,575 9,478 1.25
select_random_points 33,199 38,561 1.16
select_random_ranges 10,815 11,876 1.10
covering_index_scan 7,094 7,404 1.04
groupby_scan 36,720 42,480 1.16
index_join 10,216 13,694 1.34
index_join_scan 4,836 6,507 1.35
types_table_scan 1,160,346 1,376,178 1.19
table_scan 1,442,768 1,493,710 1.04
oltp_read_only 195,797 221,008 1.13
Average 1.15

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert_ac 26,029 85,581 3.29
oltp_insert_ac 26,972 104,556 3.88
oltp_update_index_ac 29,284 119,570 4.08
oltp_update_non_index_ac 25,538 97,920 3.83
oltp_delete_insert_ac 25,929 111,139 4.29
oltp_write_only_ac 27,098 108,269 4.00
types_delete_insert_ac 22,061 96,100 4.36
oltp_read_write_ac 33,610 114,340 3.40
Average 3.89

100000 rows, median of 5 invocations per test; autocommit writes use 9, workload-only timing via host monotonic clock when available.

Performance Ceiling Check (2.5x individual, 2x average; autocommit writes: 10x / 5x)

All tests within ceilings.

@github-actions

github-actions Bot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Sysbench-Style Benchmark: Doltlite vs SQLite

In-Memory

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 23,818 27,931 1.17
oltp_range_select 10,347 12,896 1.25
oltp_sum_range 9,136 12,325 1.35
oltp_order_range 2,615 3,016 1.15
oltp_distinct_range 3,625 4,183 1.15
oltp_index_scan 3,863 4,948 1.28
select_random_points 10,329 11,026 1.07
select_random_ranges 2,975 4,077 1.37
covering_index_scan 4,235 4,155 0.98
groupby_scan 31,496 35,922 1.14
index_join 5,813 7,783 1.34
index_join_scan 3,326 4,670 1.40
types_table_scan 1,107,182 1,326,303 1.20
table_scan 1,258,704 1,442,890 1.15
oltp_read_only 103,395 120,891 1.17
Average 1.21

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 184,238 248,208 1.35
oltp_insert 15,784 28,149 1.78
oltp_update_index 51,085 92,117 1.80
oltp_update_non_index 35,792 59,254 1.66
oltp_delete_insert 45,327 71,278 1.57
oltp_write_only 21,793 44,695 2.05
types_delete_insert 24,864 39,565 1.59
oltp_read_write 63,384 105,869 1.67
Average 1.68

File-Backed

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 107,550 56,636 0.53
oltp_range_select 19,229 15,756 0.82
oltp_sum_range 18,175 15,485 0.85
oltp_order_range 3,585 3,375 0.94
oltp_distinct_range 4,631 4,584 0.99
oltp_index_scan 12,593 8,290 0.66
select_random_points 19,106 14,788 0.77
select_random_ranges 11,430 7,083 0.62
covering_index_scan 13,039 7,522 0.58
groupby_scan 32,537 36,641 1.13
index_join 10,479 9,810 0.94
index_join_scan 4,295 5,126 1.19
types_table_scan 1,106,261 1,332,089 1.20
table_scan 1,269,313 1,442,881 1.14
oltp_read_only 220,229 163,543 0.74
Average 0.87

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 200,412 266,376 1.33
oltp_insert 22,176 35,254 1.59
oltp_update_index 75,617 113,911 1.51
oltp_update_non_index 56,927 79,688 1.40
oltp_delete_insert 64,188 93,099 1.45
oltp_write_only 42,393 64,246 1.52
types_delete_insert 39,772 52,827 1.33
oltp_read_write 84,792 125,746 1.48
Average 1.45

File-Backed (autocommit)

Each statement runs as its own transaction — exposes per-commit
fixed costs that the wrapped-in-BEGIN/COMMIT tests amortize away.
SQLite uses WAL mode with synchronous=FULL in this section so
the comparison uses SQLite's durable WAL autocommit path.

Reads

Reads have no commit cost; these are the same SQL files as the
File-Backed Reads section, included here for symmetry and to
catch any per-statement overhead doltlite pays on the read path.

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 51,047 56,529 1.11
oltp_range_select 13,357 15,745 1.18
oltp_sum_range 12,111 15,372 1.27
oltp_order_range 3,070 3,383 1.10
oltp_distinct_range 4,102 4,599 1.12
oltp_index_scan 6,865 8,429 1.23
select_random_points 13,562 14,690 1.08
select_random_ranges 5,784 7,109 1.23
covering_index_scan 7,146 7,442 1.04
groupby_scan 31,865 36,536 1.15
index_join 7,635 10,239 1.34
index_join_scan 3,824 5,285 1.38
types_table_scan 1,109,402 1,320,992 1.19
table_scan 1,267,171 1,439,982 1.14
oltp_read_only 141,420 163,542 1.16
Average 1.18

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert_ac 16,425 64,984 3.96
oltp_insert_ac 18,244 84,068 4.61
oltp_update_index_ac 21,624 100,197 4.63
oltp_update_non_index_ac 17,017 76,812 4.51
oltp_delete_insert_ac 18,926 87,650 4.63
oltp_write_only_ac 18,800 85,961 4.57
types_delete_insert_ac 16,168 76,234 4.72
oltp_read_write_ac 22,511 94,270 4.19
Average 4.48

100000 rows, median of 5 invocations per test; autocommit writes use 9, workload-only timing via host monotonic clock when available.

Performance Ceiling Check (2.5x individual, 2x average; autocommit writes: 10x / 5x)

All tests within ceilings.

@github-actions

github-actions Bot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Sysbench-Style Benchmark (BLOB PK): Doltlite vs SQLite

Companion to the classic Sysbench-Style Benchmark. Every workload here
runs against tables with a 16-byte big-endian BLOB PRIMARY KEY.

Individual ratios gated at 2.5×; section averages gated at 2×. Autocommit writes use 10× / 5×.

In-Memory

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 30,597 37,431 1.22
oltp_range_select 12,555 14,936 1.19
oltp_sum_range 11,532 14,432 1.25
oltp_order_range 2,840 3,176 1.12
oltp_distinct_range 3,991 4,407 1.10
oltp_index_scan 4,540 6,451 1.42
select_random_points 18,004 21,173 1.18
select_random_ranges 4,148 5,440 1.31
covering_index_scan 4,393 4,764 1.08
groupby_scan 31,767 35,148 1.11
index_join 6,789 9,775 1.44
index_join_scan 4,244 5,851 1.38
types_table_scan 1,151,966 1,379,238 1.20
table_scan 1,376,470 1,477,919 1.07
oltp_read_only 129,622 139,808 1.08
Average 1.21

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 244,545 362,091 1.48
oltp_insert 19,885 40,506 2.04
oltp_update_index 73,097 132,426 1.81
oltp_update_non_index 49,730 86,309 1.74
oltp_delete_insert 50,521 106,258 2.10
oltp_write_only 29,210 64,956 2.22
types_delete_insert 33,439 57,351 1.72
oltp_read_write 91,528 145,246 1.59
Average 1.84

File-Backed

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 102,082 62,709 0.61
oltp_range_select 21,637 17,895 0.83
oltp_sum_range 20,482 17,446 0.85
oltp_order_range 3,893 3,595 0.92
oltp_distinct_range 4,959 4,798 0.97
oltp_index_scan 12,167 9,231 0.76
select_random_points 27,637 24,629 0.89
select_random_ranges 11,430 7,832 0.69
covering_index_scan 12,268 7,371 0.60
groupby_scan 32,998 35,926 1.09
index_join 11,008 11,765 1.07
index_join_scan 5,211 6,090 1.17
types_table_scan 1,142,959 1,362,680 1.19
table_scan 1,431,406 1,503,959 1.05
oltp_read_only 231,966 181,848 0.78
Average 0.90

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 258,946 381,161 1.47
oltp_insert 32,587 53,300 1.64
oltp_update_index 111,637 171,984 1.54
oltp_update_non_index 81,189 111,987 1.38
oltp_delete_insert 85,493 135,650 1.59
oltp_write_only 57,503 87,285 1.52
types_delete_insert 54,058 75,575 1.40
oltp_read_write 125,359 169,790 1.35
Average 1.49

File-Backed (autocommit)

Each statement runs as its own transaction — exposes per-commit
fixed costs that the wrapped-in-BEGIN/COMMIT tests amortize away.
SQLite uses WAL mode with synchronous=FULL in this section so
the comparison uses SQLite's durable WAL autocommit path.

Reads

Reads have no commit cost; these are the same SQL files as the
File-Backed Reads section, included here for symmetry and to
catch any per-statement overhead doltlite pays on the read path.

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 56,683 63,523 1.12
oltp_range_select 16,102 17,972 1.12
oltp_sum_range 15,658 17,520 1.12
oltp_order_range 3,366 3,524 1.05
oltp_distinct_range 4,456 4,765 1.07
oltp_index_scan 7,405 9,132 1.23
select_random_points 22,600 24,504 1.08
select_random_ranges 6,809 7,784 1.14
covering_index_scan 7,778 7,520 0.97
groupby_scan 32,225 35,906 1.11
index_join 9,292 11,601 1.25
index_join_scan 4,932 6,276 1.27
types_table_scan 1,155,950 1,377,707 1.19
table_scan 1,386,541 1,500,668 1.08
oltp_read_only 166,604 182,760 1.10
Average 1.13

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert_ac 21,736 76,591 3.52
oltp_insert_ac 24,893 99,949 4.02
oltp_update_index_ac 29,347 111,023 3.78
oltp_update_non_index_ac 23,072 90,792 3.94
oltp_delete_insert_ac 24,506 102,274 4.17
oltp_write_only_ac 25,128 99,715 3.97
types_delete_insert_ac 22,501 96,940 4.31
oltp_read_write_ac 28,787 104,544 3.63
Average 3.92

100000 rows, median of 5 invocations per test; autocommit writes use 9, workload-only timing via host monotonic clock when available.

Performance Ceiling Check (2.5x individual, 2x average; autocommit writes: 10x / 5x)

All tests within ceilings.

@github-actions

github-actions Bot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Sysbench-Style Benchmark (TEXT PK): Doltlite vs SQLite

Companion to the classic Sysbench-Style Benchmark. Every workload here
runs against tables with a 32-char hex TEXT PRIMARY KEY (UUID-shaped).

Individual ratios gated at 2.5×; section averages gated at 2×. Autocommit writes use 10× / 5×.

In-Memory

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 29,675 38,478 1.30
oltp_range_select 13,525 14,992 1.11
oltp_sum_range 12,125 14,585 1.20
oltp_order_range 3,035 3,202 1.06
oltp_distinct_range 4,108 4,359 1.06
oltp_index_scan 4,624 6,405 1.39
select_random_points 18,122 21,385 1.18
select_random_ranges 4,074 5,403 1.33
covering_index_scan 4,630 4,667 1.01
groupby_scan 31,897 35,672 1.12
index_join 7,168 9,681 1.35
index_join_scan 4,580 5,595 1.22
types_table_scan 1,143,989 1,377,567 1.20
table_scan 1,351,029 1,457,518 1.08
oltp_read_only 123,647 141,976 1.15
Average 1.18

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 233,506 361,726 1.55
oltp_insert 21,838 40,215 1.84
oltp_update_index 73,114 135,639 1.86
oltp_update_non_index 49,557 88,713 1.79
oltp_delete_insert 52,149 107,463 2.06
oltp_write_only 30,196 62,444 2.07
types_delete_insert 33,439 55,932 1.67
oltp_read_write 89,018 143,883 1.62
Average 1.81

File-Backed

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 100,073 63,139 0.63
oltp_range_select 21,133 17,753 0.84
oltp_sum_range 20,184 17,258 0.86
oltp_order_range 3,932 3,514 0.89
oltp_distinct_range 5,015 4,720 0.94
oltp_index_scan 12,044 9,189 0.76
select_random_points 27,345 25,015 0.91
select_random_ranges 11,328 7,794 0.69
covering_index_scan 12,732 7,507 0.59
groupby_scan 33,370 36,145 1.08
index_join 11,724 11,581 0.99
index_join_scan 5,620 6,165 1.10
types_table_scan 1,094,478 1,343,353 1.23
table_scan 1,408,633 1,461,807 1.04
oltp_read_only 225,591 179,544 0.80
Average 0.89

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 250,797 389,757 1.55
oltp_insert 42,791 52,982 1.24
oltp_update_index 115,003 169,847 1.48
oltp_update_non_index 94,858 112,744 1.19
oltp_delete_insert 91,098 136,648 1.50
oltp_write_only 87,508 86,447 0.99
types_delete_insert 56,988 75,862 1.33
oltp_read_write 139,856 165,605 1.18
Average 1.31

File-Backed (autocommit)

Each statement runs as its own transaction — exposes per-commit
fixed costs that the wrapped-in-BEGIN/COMMIT tests amortize away.
SQLite uses WAL mode with synchronous=FULL in this section so
the comparison uses SQLite's durable WAL autocommit path.

Reads

Reads have no commit cost; these are the same SQL files as the
File-Backed Reads section, included here for symmetry and to
catch any per-statement overhead doltlite pays on the read path.

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 53,657 63,086 1.18
oltp_range_select 16,437 17,724 1.08
oltp_sum_range 15,079 17,695 1.17
oltp_order_range 3,426 3,507 1.02
oltp_distinct_range 4,494 4,692 1.04
oltp_index_scan 7,333 9,035 1.23
select_random_points 21,434 24,907 1.16
select_random_ranges 6,751 7,905 1.17
covering_index_scan 8,174 7,361 0.90
groupby_scan 32,817 35,996 1.10
index_join 9,299 11,536 1.24
index_join_scan 5,082 6,059 1.19
types_table_scan 1,122,443 1,342,568 1.20
table_scan 1,396,780 1,468,787 1.05
oltp_read_only 155,490 178,868 1.15
Average 1.13

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert_ac 22,280 82,558 3.71
oltp_insert_ac 25,759 97,297 3.78
oltp_update_index_ac 27,509 113,580 4.13
oltp_update_non_index_ac 23,039 96,123 4.17
oltp_delete_insert_ac 26,066 105,948 4.06
oltp_write_only_ac 26,678 105,486 3.95
types_delete_insert_ac 22,450 92,232 4.11
oltp_read_write_ac 33,543 112,858 3.36
Average 3.91

100000 rows, median of 5 invocations per test; autocommit writes use 9, workload-only timing via host monotonic clock when available.

Performance Ceiling Check (2.5x individual, 2x average; autocommit writes: 10x / 5x)

All tests within ceilings.

@timsehn
timsehn merged commit f955409 into master Jul 24, 2026
34 of 35 checks passed
@timsehn
timsehn deleted the ci/nightly-fuzz branch July 24, 2026 23:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant