Skip to content

Add HTTP remote force push tests#1649

Merged
timsehn merged 1 commit into
masterfrom
test/http-remote-force-push
Jul 16, 2026
Merged

Add HTTP remote force push tests#1649
timsehn merged 1 commit into
masterfrom
test/http-remote-force-push

Conversation

@timsehn

@timsehn timsehn commented Jul 15, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • add HTTP remotesrv coverage for stale push rejection followed by --force rewrite on main
  • verify fresh clones and fetched tracking refs see the forced tip, not the displaced branch head
  • add non-main branch force-push coverage over HTTP
  • run the new script in non-Windows CI with the other HTTP remote tests

Test

  • bash test/remotesrv_http_force_push_test.sh build/doltlite build/doltlite-remotesrv
  • bash test/remotesrv_http_test.sh build/doltlite build/doltlite-remotesrv
  • bash test/remotesrv_http_concurrency_test.sh build/doltlite build/doltlite-remotesrv
  • bash test/remotesrv_http_partial_failure_test.sh build/doltlite build/doltlite-remotesrv

@github-actions

Copy link
Copy Markdown

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 90 200 PASS
status_dirty_many_tables 91 200 PASS
diff_regular_working_one_table 85 150 PASS
diff_regular_working_many_tables 91 200 PASS
diff_stat_working_many_tables 91 200 PASS
diff_schema_working_many_tables 92 200 PASS
branch_list_many_branches 23 100 PASS
branch_create_delete 26 100 PASS
checkout_branch_clean 58 200 PASS
merge_data_no_conflicts 29 150 PASS
merge_schema_no_conflicts 22 100 PASS
merge_data_conflicts 128 250 PASS
merge_data_conflicts_with_resolve 127 250 PASS

@github-actions

Copy link
Copy Markdown

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 6× / 5×.

In-Memory

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 25,696 31,513 1.23
oltp_range_select 11,621 12,327 1.06
oltp_sum_range 11,298 12,260 1.09
oltp_order_range 2,634 2,831 1.07
oltp_distinct_range 3,368 3,665 1.09
oltp_index_scan 3,888 5,510 1.42
select_random_points 16,323 19,784 1.21
select_random_ranges 3,412 4,548 1.33
covering_index_scan 4,147 4,104 0.99
groupby_scan 28,868 30,310 1.05
index_join 6,099 8,738 1.43
index_join_scan 3,814 5,009 1.31
types_table_scan 1,050,740 1,166,619 1.11
table_scan 1,242,306 1,255,248 1.01
oltp_read_only 104,681 119,713 1.14
Average 1.17

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 198,840 292,844 1.47
oltp_insert 18,794 33,257 1.77
oltp_update_index 62,301 119,254 1.91
oltp_update_non_index 43,067 72,720 1.69
oltp_delete_insert 44,177 88,554 2.00
oltp_write_only 24,613 51,372 2.09
types_delete_insert 28,104 46,548 1.66
oltp_read_write 73,610 118,540 1.61
Average 1.78

File-Backed

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 55,519 43,373 0.78
oltp_range_select 14,505 13,600 0.94
oltp_sum_range 14,712 13,666 0.93
oltp_order_range 3,053 3,017 0.99
oltp_distinct_range 3,776 3,822 1.01
oltp_index_scan 7,071 6,678 0.94
select_random_points 19,179 21,329 1.11
select_random_ranges 6,457 5,672 0.88
covering_index_scan 7,625 5,298 0.69
groupby_scan 29,174 30,480 1.04
index_join 7,965 9,595 1.20
index_join_scan 4,288 5,265 1.23
types_table_scan 1,017,923 1,164,284 1.14
table_scan 1,341,292 1,278,237 0.95
oltp_read_only 156,673 138,629 0.88
Average 0.98

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 211,833 310,858 1.47
oltp_insert 55,075 43,086 0.78
oltp_update_index 85,295 141,451 1.66
oltp_update_non_index 96,954 89,041 0.92
oltp_delete_insert 65,559 107,221 1.64
oltp_write_only 52,365 67,426 1.29
types_delete_insert 40,480 59,783 1.48
oltp_read_write 102,561 137,333 1.34
Average 1.32

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 35,276 43,620 1.24
oltp_range_select 12,651 13,806 1.09
oltp_sum_range 12,433 13,732 1.10
oltp_order_range 2,799 2,984 1.07
oltp_distinct_range 3,522 3,831 1.09
oltp_index_scan 5,251 6,794 1.29
select_random_points 17,780 21,203 1.19
select_random_ranges 4,433 5,715 1.29
covering_index_scan 5,631 5,359 0.95
groupby_scan 29,176 30,566 1.05
index_join 7,502 9,515 1.27
index_join_scan 4,162 5,249 1.26
types_table_scan 1,026,242 1,153,292 1.12
table_scan 1,267,304 1,259,298 0.99
oltp_read_only 120,019 137,708 1.15
Average 1.14

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert_ac 15,145 55,433 3.66
oltp_insert_ac 17,642 68,899 3.91
oltp_update_index_ac 19,226 80,680 4.20
oltp_update_non_index_ac 15,260 66,195 4.34
oltp_delete_insert_ac 18,360 72,744 3.96
oltp_write_only_ac 17,033 74,135 4.35
types_delete_insert_ac 14,694 63,051 4.29
oltp_read_write_ac 21,934 78,799 3.59
Average 4.04

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: 6x / 5x)

All tests within ceilings.

@github-actions

Copy link
Copy Markdown

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 6× / 5×.

In-Memory

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 34,235 38,208 1.12
oltp_range_select 19,929 21,303 1.07
oltp_sum_range 17,701 20,433 1.15
oltp_order_range 3,673 3,929 1.07
oltp_distinct_range 4,676 4,990 1.07
oltp_index_scan 4,641 5,957 1.28
select_random_points 28,165 31,097 1.10
select_random_ranges 7,546 8,350 1.11
covering_index_scan 4,302 4,383 1.02
groupby_scan 38,205 41,052 1.07
index_join 8,013 10,499 1.31
index_join_scan 4,169 5,736 1.38
types_table_scan 1,181,827 1,273,090 1.08
table_scan 1,456,697 1,423,114 0.98
oltp_read_only 155,503 166,062 1.07
Average 1.12

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 245,293 340,018 1.39
oltp_insert 19,351 36,389 1.88
oltp_update_index 71,611 121,108 1.69
oltp_update_non_index 53,197 84,343 1.59
oltp_delete_insert 51,355 97,905 1.91
oltp_write_only 27,948 60,597 2.17
types_delete_insert 33,007 54,334 1.65
oltp_read_write 102,478 151,298 1.48
Average 1.72

File-Backed

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 111,202 67,551 0.61
oltp_range_select 28,480 24,185 0.85
oltp_sum_range 26,255 23,307 0.89
oltp_order_range 4,467 4,276 0.96
oltp_distinct_range 5,563 5,376 0.97
oltp_index_scan 13,045 9,102 0.70
select_random_points 36,847 33,777 0.92
select_random_ranges 15,904 11,442 0.72
covering_index_scan 12,742 7,482 0.59
groupby_scan 39,091 41,731 1.07
index_join 12,269 12,508 1.02
index_join_scan 5,126 6,104 1.19
types_table_scan 1,165,380 1,271,316 1.09
table_scan 1,414,736 1,387,311 0.98
oltp_read_only 271,810 208,655 0.77
Average 0.89

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 257,171 362,051 1.41
oltp_insert 26,027 46,190 1.77
oltp_update_index 98,827 148,166 1.50
oltp_update_non_index 76,325 106,015 1.39
oltp_delete_insert 76,942 120,363 1.56
oltp_write_only 49,523 80,601 1.63
types_delete_insert 48,998 68,104 1.39
oltp_read_write 121,514 171,926 1.41
Average 1.51

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 60,448 67,768 1.12
oltp_range_select 22,873 24,482 1.07
oltp_sum_range 20,494 23,243 1.13
oltp_order_range 4,130 4,273 1.03
oltp_distinct_range 5,140 5,325 1.04
oltp_index_scan 7,742 9,118 1.18
select_random_points 31,186 34,398 1.10
select_random_ranges 10,377 11,434 1.10
covering_index_scan 7,602 7,535 0.99
groupby_scan 38,509 41,842 1.09
index_join 10,054 12,623 1.26
index_join_scan 4,720 6,115 1.30
types_table_scan 1,154,577 1,261,243 1.09
table_scan 1,428,695 1,397,080 0.98
oltp_read_only 191,834 209,072 1.09
Average 1.10

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert_ac 16,609 61,462 3.70
oltp_insert_ac 18,785 89,877 4.78
oltp_update_index_ac 20,697 97,972 4.73
oltp_update_non_index_ac 17,394 77,576 4.46
oltp_delete_insert_ac 18,794 85,177 4.53
oltp_write_only_ac 18,180 83,278 4.58
types_delete_insert_ac 16,124 73,609 4.57
oltp_read_write_ac 24,663 92,696 3.76
Average 4.39

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: 6x / 5x)

All tests within ceilings.

@github-actions

github-actions Bot commented Jul 16, 2026

Copy link
Copy Markdown

Sysbench-Style Benchmark: Doltlite vs SQLite

In-Memory

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 20,501 23,041 1.12
oltp_range_select 8,917 10,862 1.22
oltp_sum_range 8,266 10,127 1.23
oltp_order_range 2,383 2,715 1.14
oltp_distinct_range 3,272 3,625 1.11
oltp_index_scan 3,476 4,198 1.21
select_random_points 9,645 10,208 1.06
select_random_ranges 2,586 3,338 1.29
covering_index_scan 3,404 3,374 0.99
groupby_scan 28,158 30,455 1.08
index_join 5,149 7,050 1.37
index_join_scan 2,792 4,102 1.47
types_table_scan 1,016,159 1,165,298 1.15
table_scan 1,150,881 1,282,484 1.11
oltp_read_only 89,198 104,342 1.17
Average 1.18

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 140,517 189,826 1.35
oltp_insert 12,477 22,364 1.79
oltp_update_index 42,705 75,415 1.77
oltp_update_non_index 28,055 48,133 1.72
oltp_delete_insert 39,807 57,986 1.46
oltp_write_only 18,459 36,156 1.96
types_delete_insert 20,419 32,567 1.59
oltp_read_write 55,054 87,758 1.59
Average 1.65

File-Backed

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 50,010 33,557 0.67
oltp_range_select 12,388 12,364 1.00
oltp_sum_range 11,935 11,653 0.98
oltp_order_range 2,769 2,896 1.05
oltp_distinct_range 3,651 3,807 1.04
oltp_index_scan 6,747 5,712 0.85
select_random_points 13,390 11,956 0.89
select_random_ranges 5,791 4,479 0.77
covering_index_scan 6,633 4,834 0.73
groupby_scan 28,449 30,573 1.07
index_join 6,953 8,288 1.19
index_join_scan 3,247 4,363 1.34
types_table_scan 1,001,122 1,165,243 1.16
table_scan 1,157,998 1,285,077 1.11
oltp_read_only 133,153 120,044 0.90
Average 0.98

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 191,142 252,457 1.32
oltp_insert 26,760 40,071 1.50
oltp_update_index 147,514 152,126 1.03
oltp_update_non_index 119,286 105,603 0.89
oltp_delete_insert 128,809 119,445 0.93
oltp_write_only 94,415 87,337 0.93
types_delete_insert 80,803 81,024 1.00
oltp_read_write 131,311 138,865 1.06
Average 1.08

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 29,450 33,654 1.14
oltp_range_select 10,507 12,340 1.17
oltp_sum_range 9,946 11,857 1.19
oltp_order_range 2,556 2,912 1.14
oltp_distinct_range 3,541 3,820 1.08
oltp_index_scan 4,615 5,707 1.24
select_random_points 11,406 12,034 1.06
select_random_ranges 3,678 4,552 1.24
covering_index_scan 4,492 4,885 1.09
groupby_scan 28,516 30,666 1.08
index_join 6,007 8,244 1.37
index_join_scan 3,051 4,348 1.43
types_table_scan 1,000,723 1,167,215 1.17
table_scan 1,150,568 1,297,311 1.13
oltp_read_only 103,945 120,435 1.16
Average 1.18

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert_ac 23,577 86,663 3.68
oltp_insert_ac 26,864 99,914 3.72
oltp_update_index_ac 26,685 115,192 4.32
oltp_update_non_index_ac 22,835 89,795 3.93
oltp_delete_insert_ac 24,176 101,474 4.20
oltp_write_only_ac 24,521 110,339 4.50
types_delete_insert_ac 23,044 94,286 4.09
oltp_read_write_ac 27,705 112,335 4.05
Average 4.06

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: 6x / 5x)

All tests within ceilings.

@github-actions

Copy link
Copy Markdown

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 6× / 5×.

In-Memory

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 30,491 36,578 1.20
oltp_range_select 12,758 14,836 1.16
oltp_sum_range 12,052 13,934 1.16
oltp_order_range 2,956 3,157 1.07
oltp_distinct_range 3,968 4,271 1.08
oltp_index_scan 4,572 6,282 1.37
select_random_points 18,565 20,183 1.09
select_random_ranges 4,152 5,292 1.27
covering_index_scan 4,322 4,649 1.08
groupby_scan 31,359 33,439 1.07
index_join 6,872 9,478 1.38
index_join_scan 4,330 5,530 1.28
types_table_scan 1,103,627 1,323,378 1.20
table_scan 1,340,310 1,455,300 1.09
oltp_read_only 123,531 136,361 1.10
Average 1.17

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 237,358 351,431 1.48
oltp_insert 19,728 38,957 1.97
oltp_update_index 70,885 130,428 1.84
oltp_update_non_index 49,339 84,671 1.72
oltp_delete_insert 50,112 102,851 2.05
oltp_write_only 27,737 61,898 2.23
types_delete_insert 32,519 53,932 1.66
oltp_read_write 86,089 139,469 1.62
Average 1.82

File-Backed

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 100,128 60,461 0.60
oltp_range_select 20,052 17,349 0.87
oltp_sum_range 19,496 16,648 0.85
oltp_order_range 3,804 3,615 0.95
oltp_distinct_range 4,851 4,640 0.96
oltp_index_scan 11,575 8,770 0.76
select_random_points 26,189 23,506 0.90
select_random_ranges 10,805 7,477 0.69
covering_index_scan 11,741 7,138 0.61
groupby_scan 32,770 33,865 1.03
index_join 10,812 11,154 1.03
index_join_scan 5,310 5,799 1.09
types_table_scan 1,075,791 1,317,763 1.22
table_scan 1,269,922 1,442,491 1.14
oltp_read_only 224,293 172,778 0.77
Average 0.90

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 250,921 369,943 1.47
oltp_insert 36,296 50,748 1.40
oltp_update_index 104,240 161,028 1.54
oltp_update_non_index 82,768 106,760 1.29
oltp_delete_insert 85,163 127,961 1.50
oltp_write_only 61,969 82,751 1.34
types_delete_insert 54,467 71,605 1.31
oltp_read_write 122,046 161,576 1.32
Average 1.40

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,271 61,373 1.15
oltp_range_select 15,603 17,359 1.11
oltp_sum_range 15,323 16,572 1.08
oltp_order_range 3,504 3,634 1.04
oltp_distinct_range 4,446 4,683 1.05
oltp_index_scan 7,214 8,854 1.23
select_random_points 21,424 24,211 1.13
select_random_ranges 6,757 7,705 1.14
covering_index_scan 7,875 7,293 0.93
groupby_scan 32,818 34,100 1.04
index_join 9,234 11,322 1.23
index_join_scan 4,976 5,898 1.19
types_table_scan 1,075,330 1,335,806 1.24
table_scan 1,387,797 1,454,125 1.05
oltp_read_only 156,769 173,060 1.10
Average 1.11

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert_ac 27,825 88,779 3.19
oltp_insert_ac 30,082 108,099 3.59
oltp_update_index_ac 31,542 126,260 4.00
oltp_update_non_index_ac 27,024 98,478 3.64
oltp_delete_insert_ac 28,723 108,818 3.79
oltp_write_only_ac 30,823 117,116 3.80
types_delete_insert_ac 26,405 103,941 3.94
oltp_read_write_ac 34,054 122,818 3.61
Average 3.70

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: 6x / 5x)

All tests within ceilings.

@timsehn
timsehn merged commit 709927e into master Jul 16, 2026
31 of 32 checks passed
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