Skip to content

Unify prolly txn stress: cursor merge + savepoint matrix - #1782

Merged
timsehn merged 2 commits into
masterfrom
test/savepoint-txn-matrix
Jul 23, 2026
Merged

Unify prolly txn stress: cursor merge + savepoint matrix#1782
timsehn merged 2 commits into
masterfrom
test/savepoint-txn-matrix

Conversation

@timsehn

@timsehn timsehn commented Jul 23, 2026

Copy link
Copy Markdown
Collaborator

Summary

Combine the P0-1 and P0-2 stress suites into one binary:

prolly_txn_stress_test — prolly storage txn stress:

  1. btree cursor merge (TREE + in-txn mutmap)
  2. nested SAVEPOINT × mutmap × DDL/catalog × VC ops

Includes

  • All former cursor_merge_stress_test cases (6)
  • All former savepoint_txn_matrix_test cases (11)

Wiring

  • Replaces both old targets in main.mk / run_c_tests.sh
  • Single CI job prolly-txn-stress (was two jobs), still ~5 min loop with DOLTLITE_PROLLY_CHECK=1
  • Deletes cursor_merge_stress_test.c and savepoint_txn_matrix_test.c

Test plan

  • make prolly_txn_stress_test && ./prolly_txn_stress_test1577 passed, 0 failed (~0.2s)
  • CI prolly-txn-stress + build-test c-tests

Note: supersedes the separate suite names from #1779 if that PR already landed; this PR removes cursor_merge_stress_test in favor of the unified name.

Tim added 2 commits July 23, 2026 16:22
Buff combinatorial coverage of nested SAVEPOINT interactions with
mutmap DML, DDL/catalog reloads, prepared statements, indexes, views,
and VC ops (dolt_commit seals savepoints; dolt_add + ROLLBACK TO).

Wired into make c-tests / run_c_tests.sh gating and a CI loop job under
DOLTLITE_PROLLY_CHECK=1 (same shape as cursor_merge_stress).
Fold cursor_merge_stress_test and savepoint_txn_matrix_test into a
single gating binary that covers TREE+MUT cursor merge and the nested
SAVEPOINT × mutmap × DDL × VC matrix. One CI loop job
(prolly-txn-stress) under DOLTLITE_PROLLY_CHECK=1.
@timsehn timsehn changed the title Add savepoint_txn_matrix_test for SAVEPOINT × mutmap × catalog Unify prolly txn stress: cursor merge + savepoint matrix Jul 23, 2026
@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 80 200 PASS
status_dirty_many_tables 84 200 PASS
diff_regular_working_one_table 76 150 PASS
diff_regular_working_many_tables 88 200 PASS
diff_stat_working_many_tables 89 200 PASS
diff_schema_working_many_tables 90 200 PASS
branch_list_many_branches 22 100 PASS
branch_create_delete 24 100 PASS
checkout_branch_clean 54 200 PASS
merge_data_no_conflicts 28 150 PASS
merge_schema_no_conflicts 21 100 PASS
merge_data_conflicts 125 250 PASS
merge_data_conflicts_with_resolve 126 250 PASS

@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 26,427 30,743 1.16
oltp_range_select 10,862 14,356 1.32
oltp_sum_range 10,059 13,315 1.32
oltp_order_range 2,609 2,988 1.15
oltp_distinct_range 3,619 4,171 1.15
oltp_index_scan 4,115 5,724 1.39
select_random_points 11,449 12,085 1.06
select_random_ranges 3,113 4,169 1.34
covering_index_scan 4,234 4,686 1.11
groupby_scan 29,773 34,716 1.17
index_join 6,234 9,060 1.45
index_join_scan 3,578 5,023 1.40
types_table_scan 1,126,094 1,445,010 1.28
table_scan 1,299,192 1,540,535 1.19
oltp_read_only 110,211 129,050 1.17
Average 1.24

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 175,970 252,850 1.44
oltp_insert 15,680 29,636 1.89
oltp_update_index 53,167 97,652 1.84
oltp_update_non_index 35,454 61,174 1.73
oltp_delete_insert 46,694 76,714 1.64
oltp_write_only 23,272 48,605 2.09
types_delete_insert 26,008 42,160 1.62
oltp_read_write 74,806 118,153 1.58
Average 1.73

File-Backed

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 93,462 54,345 0.58
oltp_range_select 18,198 16,760 0.92
oltp_sum_range 17,220 15,353 0.89
oltp_order_range 3,418 3,244 0.95
oltp_distinct_range 4,449 4,472 1.01
oltp_index_scan 11,411 8,233 0.72
select_random_points 19,602 14,767 0.75
select_random_ranges 10,070 6,523 0.65
covering_index_scan 11,716 7,134 0.61
groupby_scan 30,746 35,380 1.15
index_join 10,331 10,763 1.04
index_join_scan 4,420 5,415 1.23
types_table_scan 1,128,962 1,423,791 1.26
table_scan 1,252,599 1,532,592 1.22
oltp_read_only 209,374 163,275 0.78
Average 0.92

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 192,107 272,086 1.42
oltp_insert 25,557 36,756 1.44
oltp_update_index 80,485 118,351 1.47
oltp_update_non_index 63,173 82,037 1.30
oltp_delete_insert 74,030 99,015 1.34
oltp_write_only 51,624 65,563 1.27
types_delete_insert 41,399 55,329 1.34
oltp_read_write 101,953 134,252 1.32
Average 1.36

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 47,391 53,364 1.13
oltp_range_select 12,947 16,554 1.28
oltp_sum_range 12,331 15,245 1.24
oltp_order_range 2,923 3,241 1.11
oltp_distinct_range 3,968 4,498 1.13
oltp_index_scan 6,676 8,227 1.23
select_random_points 13,447 14,326 1.07
select_random_ranges 5,502 6,531 1.19
covering_index_scan 6,960 7,102 1.02
groupby_scan 29,671 35,081 1.18
index_join 7,901 10,314 1.31
index_join_scan 3,813 5,135 1.35
types_table_scan 1,106,548 1,414,969 1.28
table_scan 1,238,387 1,509,842 1.22
oltp_read_only 138,868 163,705 1.18
Average 1.19

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert_ac 34,244 120,793 3.53
oltp_insert_ac 38,224 153,431 4.01
oltp_update_index_ac 39,588 162,487 4.10
oltp_update_non_index_ac 27,764 148,566 5.35
oltp_delete_insert_ac 42,477 153,846 3.62
oltp_write_only_ac 39,901 158,868 3.98
types_delete_insert_ac 40,738 156,416 3.84
oltp_read_write_ac 47,416 159,405 3.36
Average 3.98

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 (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 32,767 42,336 1.29
oltp_range_select 19,957 22,327 1.12
oltp_sum_range 18,759 21,692 1.16
oltp_order_range 3,611 3,996 1.11
oltp_distinct_range 4,667 5,222 1.12
oltp_index_scan 4,723 6,307 1.34
select_random_points 28,416 32,736 1.15
select_random_ranges 7,863 9,259 1.18
covering_index_scan 4,172 4,313 1.03
groupby_scan 35,769 40,837 1.14
index_join 8,278 10,717 1.29
index_join_scan 4,093 5,903 1.44
types_table_scan 1,074,264 1,363,441 1.27
table_scan 1,283,878 1,450,618 1.13
oltp_read_only 151,731 175,596 1.16
Average 1.20

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 245,582 356,492 1.45
oltp_insert 19,151 36,920 1.93
oltp_update_index 67,975 119,914 1.76
oltp_update_non_index 50,446 86,130 1.71
oltp_delete_insert 50,617 97,474 1.93
oltp_write_only 26,841 58,709 2.19
types_delete_insert 32,756 55,766 1.70
oltp_read_write 101,101 160,606 1.59
Average 1.78

File-Backed

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 104,517 64,999 0.62
oltp_range_select 26,949 24,935 0.93
oltp_sum_range 25,433 24,197 0.95
oltp_order_range 4,250 4,304 1.01
oltp_distinct_range 5,542 5,556 1.00
oltp_index_scan 11,547 9,158 0.79
select_random_points 36,722 36,261 0.99
select_random_ranges 14,994 11,828 0.79
covering_index_scan 11,239 7,184 0.64
groupby_scan 36,064 41,524 1.15
index_join 12,310 13,066 1.06
index_join_scan 5,071 6,265 1.24
types_table_scan 1,042,681 1,335,341 1.28
table_scan 1,236,398 1,470,230 1.19
oltp_read_only 255,200 214,418 0.84
Average 0.97

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 257,843 380,741 1.48
oltp_insert 29,523 46,780 1.58
oltp_update_index 97,569 143,738 1.47
oltp_update_non_index 78,398 104,392 1.33
oltp_delete_insert 79,879 120,467 1.51
oltp_write_only 56,043 78,752 1.41
types_delete_insert 51,103 70,605 1.38
oltp_read_write 135,884 176,742 1.30
Average 1.43

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,220 65,403 1.16
oltp_range_select 21,524 24,964 1.16
oltp_sum_range 20,516 24,428 1.19
oltp_order_range 3,984 4,310 1.08
oltp_distinct_range 5,054 5,550 1.10
oltp_index_scan 7,273 9,110 1.25
select_random_points 31,177 36,279 1.16
select_random_ranges 10,357 11,880 1.15
covering_index_scan 6,777 7,234 1.07
groupby_scan 35,703 41,514 1.16
index_join 9,796 13,174 1.34
index_join_scan 4,607 6,181 1.34
types_table_scan 1,095,149 1,345,043 1.23
table_scan 1,261,070 1,451,384 1.15
oltp_read_only 186,698 213,020 1.14
Average 1.18

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert_ac 40,122 126,043 3.14
oltp_insert_ac 39,043 143,270 3.67
oltp_update_index_ac 37,011 156,981 4.24
oltp_update_non_index_ac 39,823 141,796 3.56
oltp_delete_insert_ac 37,796 131,335 3.47
oltp_write_only_ac 46,736 153,194 3.28
types_delete_insert_ac 43,639 149,507 3.43
oltp_read_write_ac 52,743 169,321 3.21
Average 3.50

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 31,032 39,095 1.26
oltp_range_select 13,870 15,478 1.12
oltp_sum_range 12,459 14,760 1.18
oltp_order_range 3,083 3,253 1.06
oltp_distinct_range 4,098 4,449 1.09
oltp_index_scan 4,785 6,741 1.41
select_random_points 18,929 21,594 1.14
select_random_ranges 4,155 5,416 1.30
covering_index_scan 4,881 4,891 1.00
groupby_scan 32,413 35,779 1.10
index_join 7,232 10,134 1.40
index_join_scan 4,638 5,742 1.24
types_table_scan 1,187,610 1,393,387 1.17
table_scan 1,504,443 1,484,471 0.99
oltp_read_only 127,044 146,469 1.15
Average 1.17

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 232,169 362,023 1.56
oltp_insert 22,471 40,813 1.82
oltp_update_index 77,334 140,157 1.81
oltp_update_non_index 50,905 89,754 1.76
oltp_delete_insert 55,836 109,877 1.97
oltp_write_only 31,248 64,180 2.05
types_delete_insert 34,409 57,453 1.67
oltp_read_write 93,807 145,536 1.55
Average 1.77

File-Backed

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 101,218 63,878 0.63
oltp_range_select 21,903 18,011 0.82
oltp_sum_range 20,371 17,432 0.86
oltp_order_range 3,967 3,754 0.95
oltp_distinct_range 5,063 4,800 0.95
oltp_index_scan 12,063 9,232 0.77
select_random_points 27,797 24,941 0.90
select_random_ranges 11,278 7,788 0.69
covering_index_scan 12,932 7,461 0.58
groupby_scan 33,650 36,425 1.08
index_join 11,633 11,603 1.00
index_join_scan 5,717 6,173 1.08
types_table_scan 1,165,357 1,367,593 1.17
table_scan 1,484,786 1,487,430 1.00
oltp_read_only 230,788 181,128 0.78
Average 0.88

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 249,051 391,616 1.57
oltp_insert 47,741 53,627 1.12
oltp_update_index 116,809 173,470 1.49
oltp_update_non_index 88,289 114,711 1.30
oltp_delete_insert 94,460 138,035 1.46
oltp_write_only 91,607 86,686 0.95
types_delete_insert 56,283 79,432 1.41
oltp_read_write 146,511 173,674 1.19
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 56,530 64,731 1.15
oltp_range_select 17,615 17,957 1.02
oltp_sum_range 15,999 17,727 1.11
oltp_order_range 3,508 3,588 1.02
oltp_distinct_range 4,620 4,816 1.04
oltp_index_scan 7,704 9,310 1.21
select_random_points 22,478 25,433 1.13
select_random_ranges 6,829 7,936 1.16
covering_index_scan 8,842 7,448 0.84
groupby_scan 33,285 36,792 1.11
index_join 9,830 12,063 1.23
index_join_scan 5,320 6,376 1.20
types_table_scan 1,272,872 1,385,150 1.09
table_scan 1,583,919 1,520,599 0.96
oltp_read_only 167,318 181,645 1.09
Average 1.09

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert_ac 24,393 85,593 3.51
oltp_insert_ac 25,067 98,836 3.94
oltp_update_index_ac 29,074 119,004 4.09
oltp_update_non_index_ac 23,950 93,818 3.92
oltp_delete_insert_ac 26,232 108,990 4.15
oltp_write_only_ac 26,201 106,333 4.06
types_delete_insert_ac 24,325 96,889 3.98
oltp_read_write_ac 32,502 111,510 3.43
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 (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 32,649 37,431 1.15
oltp_range_select 14,454 14,990 1.04
oltp_sum_range 12,564 14,457 1.15
oltp_order_range 3,205 3,358 1.05
oltp_distinct_range 4,174 4,514 1.08
oltp_index_scan 4,646 6,519 1.40
select_random_points 18,693 20,425 1.09
select_random_ranges 4,269 5,510 1.29
covering_index_scan 4,619 4,908 1.06
groupby_scan 34,575 37,042 1.07
index_join 6,986 9,858 1.41
index_join_scan 4,305 6,077 1.41
types_table_scan 1,248,351 1,374,804 1.10
table_scan 1,550,855 1,496,948 0.97
oltp_read_only 123,128 138,258 1.12
Average 1.16

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 240,039 340,991 1.42
oltp_insert 20,570 40,612 1.97
oltp_update_index 73,330 139,876 1.91
oltp_update_non_index 52,986 88,272 1.67
oltp_delete_insert 51,396 108,479 2.11
oltp_write_only 29,632 66,042 2.23
types_delete_insert 34,139 54,897 1.61
oltp_read_write 85,699 141,589 1.65
Average 1.82

File-Backed

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 114,562 63,934 0.56
oltp_range_select 22,826 17,421 0.76
oltp_sum_range 21,645 17,315 0.80
oltp_order_range 4,074 3,648 0.90
oltp_distinct_range 5,167 4,877 0.94
oltp_index_scan 13,338 9,108 0.68
select_random_points 27,289 23,740 0.87
select_random_ranges 12,727 8,251 0.65
covering_index_scan 13,765 7,778 0.57
groupby_scan 35,294 37,352 1.06
index_join 12,003 11,461 0.95
index_join_scan 5,391 6,294 1.17
types_table_scan 1,227,077 1,365,087 1.11
table_scan 1,542,320 1,499,911 0.97
oltp_read_only 246,202 180,014 0.73
Average 0.85

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 257,622 368,895 1.43
oltp_insert 32,031 53,624 1.67
oltp_update_index 108,129 171,468 1.59
oltp_update_non_index 79,378 111,943 1.41
oltp_delete_insert 85,219 135,753 1.59
oltp_write_only 55,704 89,898 1.61
types_delete_insert 52,764 75,096 1.42
oltp_read_write 114,535 166,762 1.46
Average 1.52

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 58,231 65,057 1.12
oltp_range_select 17,910 17,795 0.99
oltp_sum_range 15,733 17,250 1.10
oltp_order_range 3,611 3,682 1.02
oltp_distinct_range 4,612 4,817 1.04
oltp_index_scan 7,943 9,344 1.18
select_random_points 22,784 24,802 1.09
select_random_ranges 7,327 8,350 1.14
covering_index_scan 8,407 7,882 0.94
groupby_scan 35,182 37,478 1.07
index_join 9,329 11,681 1.25
index_join_scan 4,963 6,418 1.29
types_table_scan 1,287,013 1,386,508 1.08
table_scan 1,622,305 1,525,803 0.94
oltp_read_only 167,573 181,087 1.08
Average 1.09

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert_ac 16,087 62,747 3.90
oltp_insert_ac 18,503 85,488 4.62
oltp_update_index_ac 20,324 95,685 4.71
oltp_update_non_index_ac 16,875 73,000 4.33
oltp_delete_insert_ac 18,522 88,193 4.76
oltp_write_only_ac 18,619 84,883 4.56
types_delete_insert_ac 15,881 79,621 5.01
oltp_read_write_ac 24,470 97,415 3.98
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.

@timsehn
timsehn merged commit 0caf21f into master Jul 23, 2026
29 checks passed
@itoqa

itoqa Bot commented Jul 24, 2026

Copy link
Copy Markdown

Ito QA test results
Commit: 0194655: 15 test cases ran, 15 passed ✅.

Summary

Coverage spans core transaction behavior and data durability, including inserts, updates, deletes, cursor scans, savepoints, schema changes, views, version history, and reopening persisted data. It also exercises edge and failure-recovery paths such as uniqueness violations, nested rollback, stale temporary state, repeated runs, and detection of later workflow failures, with healthy results throughout.

Safe to merge — the exercised application behaviors completed successfully with no PR-attributable regressions or unresolved failures. An earlier intermittent assertion was not reproducible on repeated clean runs and is a flag for later rather than a merge blocker.

Tests run by Ito

View full run

Result Severity Type Description
Build The configured build produced the prolly_txn_stress_test executable with invariant checking enabled, and the native stress suite ran successfully with 1577 passed assertions and 0 failed assertions.
Build The C runner includes prolly_txn_stress_test, invoked it from the selected build directory, and the executable completed with 1577 passed and 0 failed. The runner correctly returned a nonzero aggregate status because 23 other listed gating binaries were not built.
Build The invariant-enabled stress executable built successfully and completed 1,228 real workflow-loop runs without failure. A disposable controlled fixture then failed on iteration 3, printed its captured diagnostic output, stopped immediately, and returned a nonzero status as expected.
Cursor The invariant-enabled prolly_txn_stress_test built and ran successfully. The mixed TREE/MUT scenario exercised deletes, updates, reinsertion, appends, aggregate and ordering checks before and after commit, and the suite reported 1577 passed with 0 failed.
Cursor The invariant-enabled stress executable prepared and partially stepped two cursors, applied deletes and appended rows, then completed the model checks before and after commit. The run exited successfully with 1,577 passed assertions and zero failures.
Cursor The invariant-enabled stress executable created the composite WITHOUT ROWID fixture, applied delete, update, and insert mutations, verified ordered key presence, and completed with 1577 passed and 0 failed.
Cursor The native stress test rejected the duplicate UNIQUE insert, preserved the surrounding transaction, accepted the later valid write, and completed with 1577 passed and 0 failed.
Savepoint The invariant-enabled prolly_txn_stress_test completed the nested SAVEPOINT DDL/catalog scenario successfully. Rollbacks restored table u, removed table v, removed the index and altered column, and the prepared statement did not return a false row after schema removal; the suite reported 1577 passed, 0 failed and exited 0.
Savepoint The nested savepoint cursor scenario released the inner savepoint, rolled back the parent, committed, and verified the reopened rows against the baseline model with 1,577 assertions passing.
Savepoint The invariant-enabled native stress suite verified that the multi-table view tracked its base tables before changes, after inner savepoint rollback, and after outer savepoint rollback. The run completed with 1577 passed assertions, 0 failed, and exit code 0.
Suite A clean invariant-enabled build ran all cursor and SAVEPOINT/DDL/view/VC groups, reporting 1577 passed and 0 failed with exit status 0. Three immediate repeat runs produced the same result, so the earlier flushAllPending assertion was not reproducible and is treated as an intermittent or stale-build execution artifact.
Suite The renamed prolly_txn_stress_test target built successfully and the C gate executed it with exit 0. Make wiring, test/run_c_tests.sh, and the stress workflow consistently select prolly_txn_stress_test, with no cursor_merge_stress_test invocation remaining; the focused binary reported 1577 passed and 0 failed.
Suite The invariant-enabled unified stress binary completed its baseline, interrupted-run attempt, and three stale-sidecar reruns with exit code 0 and 1577 passed assertions. Temporary WAL and SHM sidecars were cleaned up, with no unexplained open failures.
Version The native prolly transaction stress suite completed successfully with 1,577 assertions passing and no failures. The mid-savepoint commit produced the expected durable rows and history behavior, including savepoint invalidation and persistence after reopening.
Version The native prolly transaction stress suite verified that version-control history and table rows remain available after committing during a savepoint and reopening the database. The executable exited successfully with 1577 passed and 0 failed.

Tip

Reply with @itoqa to send us feedback on this test run.

@timsehn
timsehn deleted the test/savepoint-txn-matrix 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