Skip to content

Advance persists its own catalog when no working catalog is given - #2436

Merged
timsehn merged 1 commit into
masterfrom
fix/merge-race-row-loss
Aug 27, 2026
Merged

Advance persists its own catalog when no working catalog is given#2436
timsehn merged 1 commit into
masterfrom
fix/merge-race-row-loss

Conversation

@timsehn

@timsehn timsehn commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator

Fixes #2433.

Root cause — captured live with instrumented CI soaks

The nightly's merge_race_feat_rows_present flake is silent data loss in a fast-forward merge racing a concurrent commit, cross-process:

  1. The writer's INSERT persists main's working set (base + its row, no feat) bound to the base head — landing between the merger's dirty-check and its head-confirm.
  2. The merger's FF has already switched its live catalog to feat's — but RefreshAndConfirmHead sees the store changed and reloads the live session from disk, silently replacing the merge content with the writer's working set.
  3. The head CAS still passes (tip unmoved), the FF advances main onto feat's commit — and PersistWorkingSetWithHash(NULL) flushes the clobbered live session: the writer's stale content gets bound to the new head. The staleness gate accepts it.
  4. The writer's retry loads that poisoned working set and commits it on top — feat's rows are gone from every subsequent commit while both processes report success.

The instrumented capture shows the poisoned write directly: [ws] br=main cat=2ae6 commit=a9b6 — writer content, feat-head binding — followed by the writer's [cmt] expected=a9b6 cat=2ae6 advancing over it. The preserved store has feat work in main's ancestry with zero feat rows.

Fix

AdvanceBranchWithState with no explicit working catalog now persists the catalog being advanced to instead of the reload-vulnerable live session — advancing with no working catalog means the working set is the new catalog. Covers FF, the merge-commit path, cherry-pick, and rebase finalize. One caller depended on the old live-flush: seed-init keeps a user's pre-seed tables in the working set, and now passes the flushed live catalog explicitly.

Verification

  • Fail-before: unfixed builds reproduced twice in instrumented CI soaks (loop 318 and lane d1), plus the original nightly at run 211. Local macOS never reproduces (1050+ loops) — the window needs Linux timing.
  • Pass-after: three CI soak runs on the fixed build — 12 nightly-warmup lanes, 7,200 total loops — zero failures (unfixed rate predicts ~24).
  • Local: multi-process merge/rebase test 3×46/46, full shell suite 118/118, c-tests 311,071/311,071, stateful fuzz seed clean for 2,563 steps (merge/refs path — fuzz applies), amalgamation compiles, lint clean.
  • The temporary soak rig lives only on soak/mp-merge-race-2433 (never to merge; I'll delete it after this lands). The nightly stress soak remains the ongoing sentinel — the race needs hundreds of Linux runs to fire, so no deterministic CI test can gate it.

🤖 Generated with Claude Code

The head confirm inside CompareAndAdvanceBranch reopens the store when
a peer changed it, and that reload can replace the live session catalog
with the peer's freshly written working set. Persisting the working set
from the live session after that bound the peer's content to the newly
advanced head, so the staleness gate accepted it: a fast-forward merge
racing a concurrent commit could publish a working set missing the
merged rows, and the peer's next commit made the loss permanent.
Advancing with no explicit working catalog means the working set is the
new catalog itself; persist that.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@itoqa

itoqa Bot commented Aug 27, 2026

Copy link
Copy Markdown

Ito QA test results
Commit: 9aff968: 14 test cases ran, 14 passed ✅.

Summary

Coverage spans core repository setup and data durability, including branch creation and advancement, merges, rebases, cherry-picks, reopening, and preservation of working state. It also exercises adversarial concurrency, lock contention, conflicting operations, retries, and injected persistence failures, with healthy behavior across both normal and failure-recovery paths.

Safe to merge — the run found no regressions or PR-attributable failures, and the exercised persistence, branching, conflict handling, concurrency, and recovery behaviors remained consistent. No merge blocker is indicated.

Tests run by Ito

View full run

Result Severity Type Description
General Injected persistence failures left the current session and reopened repository in a coherent state across all tested operations.
General Concurrent database work recovered from lock contention and cleanup races without losing rows or publishing mixed state. All 101 integration checks passed.
General Concurrent merge and rebase operations kept the branch head, working rows, and session state consistent after refreshes and retries.
General Concurrent branch updates completed successfully without losing rows or attaching stale data to the new branch head.
General Two writers repeatedly updated the same branch without losing rows, corrupting history, or attaching stale data to a new branch tip.
Catalog Concurrent branch commits completed successfully, and reopening the repository kept both commits and all rows intact.
Explicit The native persistence checks passed after reopening and refreshing the working state. The supplied working catalog remains authoritative instead of being replaced by the catalog for the new commit.
Rev The feature branch was merged into the main branch, and the merged tables and rows were still available after the database was closed and reopened.
Rev A divergent merge created a merge commit and kept the main and feature catalogs available after reopening the database.
Rev Cherry-picking the feature commit created its table and row on main, and both were still present after the database was reopened.
Rev Tables, the index, and both rows were available after repository initialization and were still present after reopening.
Rev The conflicting merge was rejected, the main branch stayed clean, and reopening the database preserved the last clean row and commit.
Rollback Injected persistence failures did not leave the branch, session, staged data, or live data in a partial state.
Seed Rows created before repository setup are still available after closing and reopening the database. The initial history and default branch are also created correctly.

Tip

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

@github-actions

Copy link
Copy Markdown
Contributor

DoltLite performance vs PR base

  • Baseline: c3053621e014092696a0d1664c15d96e3f80e9a3
  • Candidate: 5edddbf9ad82a5947a6350e639b0ab083746f1cb
  • Overall ratio: 0.997x
  • Gate result: PASS
  • Gates: individual > 1.50x with more than 10.00ms regression; section, suite, or overall > 1.25x with the same minimum delta
  • vc individual gate: > 2.00x with more than 50.00ms regression
  • Confirmed failed gates: none
  • Automatic retries: none
Suite Workloads Baseline total Candidate total Ratio Result
blobpk 69 11.52s 11.50s 0.999x PASS
compositepk 69 11.32s 11.30s 0.998x PASS
int 69 10.29s 10.29s 1.000x PASS
textpk 69 11.67s 11.58s 0.992x PASS
vc 13 947.85ms 948.12ms 1.000x PASS
blobpk details
Section Test Baseline Candidate Delta Ratio Result
mem_reads oltp_point_select 33.86ms 34.68ms +825us 1.024x PASS
mem_reads oltp_range_select 13.28ms 13.47ms +188us 1.014x PASS
mem_reads oltp_sum_range 13.19ms 13.34ms +153us 1.012x PASS
mem_reads oltp_order_range 3.15ms 3.14ms -13us 0.996x PASS
mem_reads oltp_distinct_range 4.26ms 4.22ms -34us 0.992x PASS
mem_reads oltp_index_scan 5.90ms 6.07ms +167us 1.028x PASS
mem_reads select_random_points 20.39ms 20.21ms -179us 0.991x PASS
mem_reads select_random_ranges 5.26ms 5.36ms +96us 1.018x PASS
mem_reads covering_index_scan 4.65ms 4.59ms -56us 0.988x PASS
mem_reads groupby_scan 36.39ms 36.17ms -218us 0.994x PASS
mem_reads index_join 9.52ms 9.37ms -148us 0.984x PASS
mem_reads index_join_scan 5.56ms 5.65ms +90us 1.016x PASS
mem_reads types_table_scan 1.25s 1.24s -4.23ms 0.997x PASS
mem_reads table_scan 1.38s 1.36s -15.03ms 0.989x PASS
mem_reads oltp_read_only 130.75ms 130.38ms -370us 0.997x PASS
mem_writes oltp_bulk_insert 342.25ms 350.97ms +8.71ms 1.025x PASS
mem_writes oltp_insert 38.78ms 38.69ms -95us 0.998x PASS
mem_writes oltp_update_index 134.26ms 135.25ms +985us 1.007x PASS
mem_writes oltp_update_non_index 76.15ms 77.33ms +1.19ms 1.016x PASS
mem_writes oltp_delete_insert 104.93ms 105.71ms +779us 1.007x PASS
mem_writes oltp_write_only 62.55ms 63.16ms +609us 1.010x PASS
mem_writes types_delete_insert 51.74ms 52.61ms +873us 1.017x PASS
mem_writes oltp_read_write 139.90ms 140.35ms +455us 1.003x PASS
file_reads oltp_point_select 55.36ms 56.25ms +887us 1.016x PASS
file_reads oltp_range_select 15.62ms 15.57ms -55us 0.996x PASS
file_reads oltp_sum_range 15.44ms 15.46ms +19us 1.001x PASS
file_reads oltp_order_range 3.40ms 3.47ms +69us 1.020x PASS
file_reads oltp_distinct_range 4.55ms 4.55ms -9us 0.998x PASS
file_reads oltp_index_scan 8.14ms 8.30ms +168us 1.021x PASS
file_reads select_random_points 22.47ms 23.15ms +679us 1.030x PASS
file_reads select_random_ranges 7.40ms 7.50ms +95us 1.013x PASS
file_reads covering_index_scan 6.89ms 6.98ms +87us 1.013x PASS
file_reads groupby_scan 36.82ms 36.46ms -355us 0.990x PASS
file_reads index_join 10.95ms 10.87ms -76us 0.993x PASS
file_reads index_join_scan 5.89ms 6.00ms +107us 1.018x PASS
file_reads types_table_scan 1.22s 1.20s -18.51ms 0.985x PASS
file_reads table_scan 1.38s 1.39s +7.18ms 1.005x PASS
file_reads oltp_read_only 163.09ms 164.30ms +1.21ms 1.007x PASS
file_writes oltp_bulk_insert 353.94ms 359.28ms +5.34ms 1.015x PASS
file_writes oltp_insert 45.89ms 46.23ms +334us 1.007x PASS
file_writes oltp_update_index 155.46ms 155.83ms +377us 1.002x PASS
file_writes oltp_update_non_index 93.73ms 93.53ms -200us 0.998x PASS
file_writes oltp_delete_insert 120.07ms 122.20ms +2.12ms 1.018x PASS
file_writes oltp_write_only 74.25ms 74.43ms +174us 1.002x PASS
file_writes types_delete_insert 61.86ms 62.48ms +618us 1.010x PASS
file_writes oltp_read_write 149.33ms 150.95ms +1.62ms 1.011x PASS
ac_reads oltp_point_select 56.43ms 57.77ms +1.33ms 1.024x PASS
ac_reads oltp_range_select 15.73ms 15.68ms -48us 0.997x PASS
ac_reads oltp_sum_range 15.54ms 15.74ms +199us 1.013x PASS
ac_reads oltp_order_range 3.44ms 3.41ms -29us 0.992x PASS
ac_reads oltp_distinct_range 4.55ms 4.51ms -44us 0.990x PASS
ac_reads oltp_index_scan 8.20ms 8.28ms +79us 1.010x PASS
ac_reads select_random_points 23.15ms 23.26ms +115us 1.005x PASS
ac_reads select_random_ranges 7.38ms 7.45ms +76us 1.010x PASS
ac_reads covering_index_scan 6.92ms 7.06ms +135us 1.019x PASS
ac_reads groupby_scan 36.84ms 36.72ms -116us 0.997x PASS
ac_reads index_join 10.97ms 10.87ms -96us 0.991x PASS
ac_reads index_join_scan 6.00ms 6.01ms +12us 1.002x PASS
ac_reads types_table_scan 1.26s 1.27s +11.35ms 1.009x PASS
ac_reads table_scan 1.42s 1.40s -25.62ms 0.982x PASS
ac_reads oltp_read_only 165.60ms 164.18ms -1.43ms 0.991x PASS
ac_writes oltp_bulk_insert_ac 59.67ms 60.16ms +490us 1.008x PASS
ac_writes oltp_insert_ac 77.71ms 77.62ms -88us 0.999x PASS
ac_writes oltp_update_index_ac 85.60ms 85.28ms -318us 0.996x PASS
ac_writes oltp_update_non_index_ac 67.17ms 69.26ms +2.09ms 1.031x PASS
ac_writes oltp_delete_insert_ac 79.71ms 78.15ms -1.56ms 0.980x PASS
ac_writes oltp_write_only_ac 76.38ms 77.14ms +763us 1.010x PASS
ac_writes types_delete_insert_ac 66.85ms 69.10ms +2.25ms 1.034x PASS
ac_writes oltp_read_write_ac 83.94ms 85.21ms +1.27ms 1.015x PASS
compositepk details
Section Test Baseline Candidate Delta Ratio Result
mem_reads oltp_point_select 35.98ms 36.16ms +178us 1.005x PASS
mem_reads oltp_range_select 20.55ms 20.48ms -67us 0.997x PASS
mem_reads oltp_sum_range 20.27ms 20.25ms -15us 0.999x PASS
mem_reads oltp_order_range 3.88ms 3.84ms -32us 0.992x PASS
mem_reads oltp_distinct_range 5.01ms 5.00ms -7us 0.999x PASS
mem_reads oltp_index_scan 5.39ms 5.44ms +56us 1.010x PASS
mem_reads select_random_points 29.99ms 29.98ms -7us 1.000x PASS
mem_reads select_random_ranges 8.13ms 8.02ms -110us 0.986x PASS
mem_reads covering_index_scan 3.97ms 4.03ms +60us 1.015x PASS
mem_reads groupby_scan 41.74ms 41.66ms -80us 0.998x PASS
mem_reads index_join 9.94ms 9.72ms -215us 0.978x PASS
mem_reads index_join_scan 5.41ms 5.43ms +18us 1.003x PASS
mem_reads types_table_scan 1.21s 1.20s -8.69ms 0.993x PASS
mem_reads table_scan 1.34s 1.33s -6.50ms 0.995x PASS
mem_reads oltp_read_only 162.16ms 162.37ms +217us 1.001x PASS
mem_writes oltp_bulk_insert 327.09ms 335.04ms +7.95ms 1.024x PASS
mem_writes oltp_insert 34.33ms 34.29ms -39us 0.999x PASS
mem_writes oltp_update_index 117.45ms 118.56ms +1.11ms 1.009x PASS
mem_writes oltp_update_non_index 73.59ms 74.55ms +955us 1.013x PASS
mem_writes oltp_delete_insert 93.15ms 93.86ms +710us 1.008x PASS
mem_writes oltp_write_only 56.57ms 56.66ms +95us 1.002x PASS
mem_writes types_delete_insert 50.11ms 50.78ms +664us 1.013x PASS
mem_writes oltp_read_write 150.89ms 150.85ms -40us 1.000x PASS
file_reads oltp_point_select 57.70ms 57.66ms -39us 0.999x PASS
file_reads oltp_range_select 23.16ms 23.13ms -28us 0.999x PASS
file_reads oltp_sum_range 22.66ms 22.81ms +154us 1.007x PASS
file_reads oltp_order_range 4.14ms 4.13ms -19us 0.995x PASS
file_reads oltp_distinct_range 5.29ms 5.24ms -46us 0.991x PASS
file_reads oltp_index_scan 7.78ms 7.79ms +8us 1.001x PASS
file_reads select_random_points 32.59ms 32.84ms +256us 1.008x PASS
file_reads select_random_ranges 10.44ms 10.44ms -2us 1.000x PASS
file_reads covering_index_scan 6.30ms 6.40ms +104us 1.017x PASS
file_reads groupby_scan 42.24ms 42.52ms +273us 1.006x PASS
file_reads index_join 11.72ms 11.74ms +21us 1.002x PASS
file_reads index_join_scan 5.83ms 5.85ms +25us 1.004x PASS
file_reads types_table_scan 1.22s 1.21s -11.37ms 0.991x PASS
file_reads table_scan 1.34s 1.33s -8.30ms 0.994x PASS
file_reads oltp_read_only 194.14ms 193.40ms -734us 0.996x PASS
file_writes oltp_bulk_insert 333.77ms 344.30ms +10.52ms 1.032x PASS
file_writes oltp_insert 39.98ms 40.21ms +234us 1.006x PASS
file_writes oltp_update_index 129.17ms 128.41ms -766us 0.994x PASS
file_writes oltp_update_non_index 89.10ms 89.12ms +16us 1.000x PASS
file_writes oltp_delete_insert 106.67ms 105.50ms -1.17ms 0.989x PASS
file_writes oltp_write_only 66.38ms 66.94ms +561us 1.008x PASS
file_writes types_delete_insert 56.26ms 56.50ms +240us 1.004x PASS
file_writes oltp_read_write 161.29ms 161.84ms +552us 1.003x PASS
ac_reads oltp_point_select 57.86ms 57.80ms -62us 0.999x PASS
ac_reads oltp_range_select 23.06ms 23.35ms +297us 1.013x PASS
ac_reads oltp_sum_range 22.77ms 22.84ms +65us 1.003x PASS
ac_reads oltp_order_range 4.16ms 4.15ms -15us 0.996x PASS
ac_reads oltp_distinct_range 5.32ms 5.32ms +6us 1.001x PASS
ac_reads oltp_index_scan 8.15ms 8.01ms -147us 0.982x PASS
ac_reads select_random_points 32.82ms 33.36ms +537us 1.016x PASS
ac_reads select_random_ranges 10.52ms 10.43ms -85us 0.992x PASS
ac_reads covering_index_scan 6.67ms 6.71ms +40us 1.006x PASS
ac_reads groupby_scan 42.44ms 42.61ms +172us 1.004x PASS
ac_reads index_join 12.07ms 11.98ms -91us 0.992x PASS
ac_reads index_join_scan 5.85ms 5.93ms +80us 1.014x PASS
ac_reads types_table_scan 1.22s 1.22s -2.99ms 0.998x PASS
ac_reads table_scan 1.34s 1.33s -8.00ms 0.994x PASS
ac_reads oltp_read_only 195.02ms 195.26ms +247us 1.001x PASS
ac_writes oltp_bulk_insert_ac 54.05ms 55.01ms +958us 1.018x PASS
ac_writes oltp_insert_ac 71.69ms 72.69ms +993us 1.014x PASS
ac_writes oltp_update_index_ac 79.70ms 81.06ms +1.36ms 1.017x PASS
ac_writes oltp_update_non_index_ac 63.67ms 65.43ms +1.76ms 1.028x PASS
ac_writes oltp_delete_insert_ac 73.73ms 74.74ms +1.02ms 1.014x PASS
ac_writes oltp_write_only_ac 75.31ms 74.32ms -991us 0.987x PASS
ac_writes types_delete_insert_ac 63.62ms 62.98ms -633us 0.990x PASS
ac_writes oltp_read_write_ac 82.42ms 81.10ms -1.32ms 0.984x PASS
int details
Section Test Baseline Candidate Delta Ratio Result
mem_reads oltp_point_select 26.75ms 26.50ms -250us 0.991x PASS
mem_reads oltp_range_select 10.77ms 10.92ms +153us 1.014x PASS
mem_reads oltp_sum_range 10.92ms 10.96ms +41us 1.004x PASS
mem_reads oltp_order_range 2.83ms 2.82ms -5us 0.998x PASS
mem_reads oltp_distinct_range 3.96ms 3.96ms -1us 1.000x PASS
mem_reads oltp_index_scan 4.68ms 4.58ms -98us 0.979x PASS
mem_reads select_random_points 10.59ms 10.72ms +125us 1.012x PASS
mem_reads select_random_ranges 3.82ms 3.86ms +36us 1.009x PASS
mem_reads covering_index_scan 4.03ms 4.03ms +3us 1.001x PASS
mem_reads groupby_scan 34.80ms 34.84ms +41us 1.001x PASS
mem_reads index_join 7.40ms 7.52ms +120us 1.016x PASS
mem_reads index_join_scan 4.48ms 4.58ms +99us 1.022x PASS
mem_reads types_table_scan 1.17s 1.17s +1.37ms 1.001x PASS
mem_reads table_scan 1.31s 1.30s -9.86ms 0.992x PASS
mem_reads oltp_read_only 112.38ms 112.02ms -365us 0.997x PASS
mem_writes oltp_bulk_insert 238.40ms 239.10ms +700us 1.003x PASS
mem_writes oltp_insert 27.09ms 27.33ms +238us 1.009x PASS
mem_writes oltp_update_index 88.81ms 88.75ms -65us 0.999x PASS
mem_writes oltp_update_non_index 52.26ms 52.66ms +398us 1.008x PASS
mem_writes oltp_delete_insert 71.03ms 72.22ms +1.19ms 1.017x PASS
mem_writes oltp_write_only 47.33ms 46.79ms -536us 0.989x PASS
mem_writes types_delete_insert 35.83ms 36.23ms +401us 1.011x PASS
mem_writes oltp_read_write 105.91ms 107.05ms +1.14ms 1.011x PASS
file_reads oltp_point_select 48.78ms 48.44ms -343us 0.993x PASS
file_reads oltp_range_select 13.33ms 13.32ms -12us 0.999x PASS
file_reads oltp_sum_range 13.30ms 13.42ms +119us 1.009x PASS
file_reads oltp_order_range 3.14ms 3.12ms -22us 0.993x PASS
file_reads oltp_distinct_range 4.23ms 4.19ms -39us 0.991x PASS
file_reads oltp_index_scan 7.26ms 7.32ms +54us 1.007x PASS
file_reads select_random_points 13.27ms 12.96ms -308us 0.977x PASS
file_reads select_random_ranges 6.16ms 6.19ms +32us 1.005x PASS
file_reads covering_index_scan 6.55ms 6.58ms +28us 1.004x PASS
file_reads groupby_scan 34.82ms 35.38ms +566us 1.016x PASS
file_reads index_join 9.36ms 9.45ms +88us 1.009x PASS
file_reads index_join_scan 4.89ms 4.94ms +44us 1.009x PASS
file_reads types_table_scan 1.17s 1.16s -5.42ms 0.995x PASS
file_reads table_scan 1.32s 1.31s -3.60ms 0.997x PASS
file_reads oltp_read_only 143.70ms 147.08ms +3.38ms 1.024x PASS
file_writes oltp_bulk_insert 244.18ms 251.81ms +7.63ms 1.031x PASS
file_writes oltp_insert 31.31ms 31.12ms -192us 0.994x PASS
file_writes oltp_update_index 98.03ms 98.91ms +879us 1.009x PASS
file_writes oltp_update_non_index 65.52ms 66.55ms +1.03ms 1.016x PASS
file_writes oltp_delete_insert 79.53ms 79.97ms +430us 1.005x PASS
file_writes oltp_write_only 53.27ms 53.27ms -2us 1.000x PASS
file_writes types_delete_insert 41.62ms 41.64ms +11us 1.000x PASS
file_writes oltp_read_write 112.27ms 113.00ms +727us 1.006x PASS
ac_reads oltp_point_select 48.29ms 49.09ms +799us 1.017x PASS
ac_reads oltp_range_select 13.24ms 13.32ms +79us 1.006x PASS
ac_reads oltp_sum_range 13.25ms 13.34ms +88us 1.007x PASS
ac_reads oltp_order_range 3.12ms 3.13ms +14us 1.004x PASS
ac_reads oltp_distinct_range 4.19ms 4.19ms -1us 1.000x PASS
ac_reads oltp_index_scan 7.29ms 7.32ms +30us 1.004x PASS
ac_reads select_random_points 13.16ms 13.12ms -37us 0.997x PASS
ac_reads select_random_ranges 6.14ms 6.23ms +86us 1.014x PASS
ac_reads covering_index_scan 6.63ms 6.61ms -21us 0.997x PASS
ac_reads groupby_scan 34.86ms 35.38ms +521us 1.015x PASS
ac_reads index_join 9.38ms 9.54ms +156us 1.017x PASS
ac_reads index_join_scan 4.88ms 4.98ms +97us 1.020x PASS
ac_reads types_table_scan 1.17s 1.17s -642us 0.999x PASS
ac_reads table_scan 1.32s 1.32s -2.73ms 0.998x PASS
ac_reads oltp_read_only 144.64ms 145.15ms +506us 1.003x PASS
ac_writes oltp_bulk_insert_ac 57.94ms 58.05ms +111us 1.002x PASS
ac_writes oltp_insert_ac 71.19ms 74.67ms +3.48ms 1.049x PASS
ac_writes oltp_update_index_ac 86.55ms 84.18ms -2.38ms 0.973x PASS
ac_writes oltp_update_non_index_ac 65.25ms 68.70ms +3.45ms 1.053x PASS
ac_writes oltp_delete_insert_ac 78.84ms 79.13ms +294us 1.004x PASS
ac_writes oltp_write_only_ac 79.30ms 79.82ms +520us 1.007x PASS
ac_writes types_delete_insert_ac 66.31ms 66.52ms +209us 1.003x PASS
ac_writes oltp_read_write_ac 81.84ms 80.98ms -866us 0.989x PASS
textpk details
Section Test Baseline Candidate Delta Ratio Result
mem_reads oltp_point_select 35.49ms 34.34ms -1.15ms 0.968x PASS
mem_reads oltp_range_select 13.38ms 13.26ms -128us 0.990x PASS
mem_reads oltp_sum_range 13.40ms 13.22ms -180us 0.987x PASS
mem_reads oltp_order_range 3.18ms 3.14ms -40us 0.987x PASS
mem_reads oltp_distinct_range 4.24ms 4.22ms -19us 0.996x PASS
mem_reads oltp_index_scan 6.03ms 5.87ms -168us 0.972x PASS
mem_reads select_random_points 20.42ms 20.62ms +197us 1.010x PASS
mem_reads select_random_ranges 5.27ms 5.34ms +69us 1.013x PASS
mem_reads covering_index_scan 4.59ms 4.64ms +54us 1.012x PASS
mem_reads groupby_scan 36.52ms 36.81ms +293us 1.008x PASS
mem_reads index_join 9.12ms 9.09ms -30us 0.997x PASS
mem_reads index_join_scan 5.61ms 5.79ms +173us 1.031x PASS
mem_reads types_table_scan 1.28s 1.27s -18.59ms 0.986x PASS
mem_reads table_scan 1.41s 1.37s -41.96ms 0.970x PASS
mem_reads oltp_read_only 137.95ms 137.34ms -604us 0.996x PASS
mem_writes oltp_bulk_insert 351.20ms 352.83ms +1.63ms 1.005x PASS
mem_writes oltp_insert 39.06ms 39.51ms +455us 1.012x PASS
mem_writes oltp_update_index 139.52ms 139.00ms -525us 0.996x PASS
mem_writes oltp_update_non_index 79.22ms 80.33ms +1.11ms 1.014x PASS
mem_writes oltp_delete_insert 105.24ms 106.60ms +1.35ms 1.013x PASS
mem_writes oltp_write_only 62.04ms 62.33ms +286us 1.005x PASS
mem_writes types_delete_insert 52.17ms 53.07ms +904us 1.017x PASS
mem_writes oltp_read_write 138.17ms 138.84ms +671us 1.005x PASS
file_reads oltp_point_select 56.54ms 55.98ms -560us 0.990x PASS
file_reads oltp_range_select 15.84ms 15.81ms -26us 0.998x PASS
file_reads oltp_sum_range 15.81ms 15.86ms +47us 1.003x PASS
file_reads oltp_order_range 3.47ms 3.46ms -13us 0.996x PASS
file_reads oltp_distinct_range 4.58ms 4.54ms -41us 0.991x PASS
file_reads oltp_index_scan 8.41ms 8.35ms -56us 0.993x PASS
file_reads select_random_points 22.59ms 22.32ms -270us 0.988x PASS
file_reads select_random_ranges 7.44ms 7.42ms -21us 0.997x PASS
file_reads covering_index_scan 7.05ms 6.93ms -121us 0.983x PASS
file_reads groupby_scan 36.79ms 37.28ms +491us 1.013x PASS
file_reads index_join 11.19ms 10.97ms -220us 0.980x PASS
file_reads index_join_scan 6.15ms 6.10ms -47us 0.992x PASS
file_reads types_table_scan 1.28s 1.26s -26.67ms 0.979x PASS
file_reads table_scan 1.38s 1.39s +4.73ms 1.003x PASS
file_reads oltp_read_only 166.02ms 164.30ms -1.72ms 0.990x PASS
file_writes oltp_bulk_insert 368.87ms 371.31ms +2.43ms 1.007x PASS
file_writes oltp_insert 46.90ms 45.38ms -1.53ms 0.967x PASS
file_writes oltp_update_index 166.34ms 166.67ms +328us 1.002x PASS
file_writes oltp_update_non_index 96.71ms 98.38ms +1.67ms 1.017x PASS
file_writes oltp_delete_insert 123.85ms 125.64ms +1.79ms 1.014x PASS
file_writes oltp_write_only 74.43ms 74.54ms +109us 1.001x PASS
file_writes types_delete_insert 62.71ms 62.83ms +126us 1.002x PASS
file_writes oltp_read_write 150.49ms 153.54ms +3.04ms 1.020x PASS
ac_reads oltp_point_select 56.59ms 56.08ms -518us 0.991x PASS
ac_reads oltp_range_select 15.78ms 16.02ms +240us 1.015x PASS
ac_reads oltp_sum_range 15.80ms 16.24ms +440us 1.028x PASS
ac_reads oltp_order_range 3.45ms 3.44ms -7us 0.998x PASS
ac_reads oltp_distinct_range 4.57ms 4.55ms -22us 0.995x PASS
ac_reads oltp_index_scan 8.44ms 8.39ms -52us 0.994x PASS
ac_reads select_random_points 22.59ms 22.89ms +303us 1.013x PASS
ac_reads select_random_ranges 7.46ms 7.51ms +43us 1.006x PASS
ac_reads covering_index_scan 7.04ms 7.14ms +97us 1.014x PASS
ac_reads groupby_scan 36.52ms 36.97ms +454us 1.012x PASS
ac_reads index_join 10.82ms 10.76ms -65us 0.994x PASS
ac_reads index_join_scan 5.95ms 6.03ms +77us 1.013x PASS
ac_reads types_table_scan 1.25s 1.23s -23.40ms 0.981x PASS
ac_reads table_scan 1.42s 1.42s +901us 1.001x PASS
ac_reads oltp_read_only 169.31ms 169.53ms +220us 1.001x PASS
ac_writes oltp_bulk_insert_ac 56.80ms 57.19ms +387us 1.007x PASS
ac_writes oltp_insert_ac 67.31ms 67.15ms -155us 0.998x PASS
ac_writes oltp_update_index_ac 81.83ms 81.55ms -281us 0.997x PASS
ac_writes oltp_update_non_index_ac 63.70ms 63.92ms +225us 1.004x PASS
ac_writes oltp_delete_insert_ac 73.08ms 71.63ms -1.45ms 0.980x PASS
ac_writes oltp_write_only_ac 74.38ms 73.14ms -1.25ms 0.983x PASS
ac_writes types_delete_insert_ac 64.24ms 65.24ms +1.01ms 1.016x PASS
ac_writes oltp_read_write_ac 81.08ms 81.07ms -13us 1.000x PASS
vc details
Section Test Baseline Candidate Delta Ratio Result
vc status_clean_many_tables 85.23ms 84.91ms -322us 0.996x PASS
vc status_dirty_many_tables 88.70ms 88.13ms -566us 0.994x PASS
vc diff_regular_working_one_table 79.73ms 79.73ms +0us 1.000x PASS
vc diff_regular_working_many_tables 93.55ms 93.34ms -213us 0.998x PASS
vc diff_stat_working_many_tables 92.51ms 92.95ms +441us 1.005x PASS
vc diff_schema_working_many_tables 93.00ms 93.08ms +81us 1.001x PASS
vc branch_list_many_branches 22.96ms 23.21ms +257us 1.011x PASS
vc branch_create_delete 26.02ms 25.81ms -210us 0.992x PASS
vc checkout_branch_clean 57.16ms 57.52ms +355us 1.006x PASS
vc merge_data_no_conflicts 30.60ms 30.84ms +248us 1.008x PASS
vc merge_schema_no_conflicts 22.96ms 22.55ms -405us 0.982x PASS
vc merge_data_conflicts 127.43ms 128.06ms +628us 1.005x PASS
vc merge_data_conflicts_with_resolve 128.01ms 127.98ms -27us 1.000x PASS

All relative performance gates passed.

@github-actions

Copy link
Copy Markdown
Contributor

DoltLite source coverage

Metric Covered Total Coverage
Lines 52600 61966 84.89%
Branches 24271 35894 67.62%
Functions 2476 2690 92.04%

Merged 200 pooled raw profiles from the distributed Linux correctness jobs.

Per-file coverage (97 files)
File Lines Branches Functions
src/btree_orig_api.c 87.91% 77.27% 89.53%
src/chunk_file.c 100.00% 100.00% 100.00%
src/chunk_index.c 84.27% 66.78% 100.00%
src/chunk_refs.c 84.99% 68.91% 79.37%
src/chunk_staging.c 93.75% 80.33% 100.00%
src/chunk_store.c 91.00% 75.09% 100.00%
src/chunk_store_commit.c 86.75% 67.23% 100.00%
src/chunk_store_lock.c 93.98% 76.36% 100.00%
src/chunk_store_refs_api.c 91.17% 76.75% 100.00%
src/chunk_wal.c 81.88% 58.05% 87.10%
src/doltlite.c 100.00% 100.00% 100.00%
src/doltlite_add.c 85.50% 69.20% 100.00%
src/doltlite_ancestor.c 89.19% 68.92% 100.00%
src/doltlite_at.c 83.39% 64.20% 100.00%
src/doltlite_blame.c 80.86% 61.14% 96.43%
src/doltlite_branch.c 88.30% 80.66% 100.00%
src/doltlite_branches.c 93.75% 75.93% 93.75%
src/doltlite_checkout.c 77.42% 62.46% 96.15%
src/doltlite_cherry_pick.c 77.89% 58.62% 71.43%
src/doltlite_chunk_walk.c 88.60% 64.19% 100.00%
src/doltlite_cmd.c 81.09% 75.19% 100.00%
src/doltlite_commit.c 94.41% 76.87% 100.00%
src/doltlite_commit_ancestors.c 92.09% 72.83% 92.31%
src/doltlite_commit_cmd.c 75.49% 68.21% 100.00%
src/doltlite_config.c 80.00% 71.59% 100.00%
src/doltlite_conflicts.c 84.27% 62.50% 93.75%
src/doltlite_constraint_violations.c 82.46% 57.54% 91.11%
src/doltlite_core.c 90.91% 71.91% 100.00%
src/doltlite_creds.c 84.09% 53.78% 92.00%
src/doltlite_dbpage.c 93.45% 78.33% 91.67%
src/doltlite_diff.c 88.56% 68.99% 96.55%
src/doltlite_diff_stat.c 94.17% 76.01% 95.65%
src/doltlite_diff_table.c 93.96% 69.76% 97.06%
src/doltlite_docs.c 83.94% 71.43% 94.74%
src/doltlite_gc.c 77.37% 57.14% 96.55%
src/doltlite_hashof.c 76.95% 64.97% 94.44%
src/doltlite_history.c 86.93% 76.40% 100.00%
src/doltlite_http_remote.c 82.22% 57.34% 92.31%
src/doltlite_ignore.c 77.57% 62.25% 82.14%
src/doltlite_log.c 96.81% 73.24% 92.86%
src/doltlite_merge.c 95.93% 70.72% 100.00%
src/doltlite_merge_cmd.c 88.81% 72.63% 100.00%
src/doltlite_merge_constraints.c 86.15% 63.64% 95.00%
src/doltlite_merge_constraints_check.c 86.81% 67.79% 100.00%
src/doltlite_merge_constraints_fk.c 78.00% 56.64% 100.00%
src/doltlite_merge_constraints_notnull.c 80.45% 67.92% 100.00%
src/doltlite_merge_constraints_strict.c 75.96% 58.70% 100.00%
src/doltlite_merge_constraints_unique.c 85.99% 62.82% 100.00%
src/doltlite_merge_pass1.c 92.38% 73.59% 100.00%
src/doltlite_merge_pass2.c 83.59% 67.46% 100.00%
src/doltlite_merge_predetect.c 86.38% 71.15% 95.45%
src/doltlite_merge_rebuild.c 99.15% 78.91% 100.00%
src/doltlite_merge_rows.c 80.50% 63.23% 100.00%
src/doltlite_merge_schema.c 91.62% 71.91% 97.06%
src/doltlite_merge_status.c 91.98% 73.53% 92.31%
src/doltlite_patch.c 94.36% 70.80% 98.15%
src/doltlite_rebase.c 85.32% 59.28% 100.00%
src/doltlite_record.c 78.67% 59.36% 95.24%
src/doltlite_ref.c 95.52% 75.36% 100.00%
src/doltlite_remote.c 84.71% 66.04% 96.00%
src/doltlite_remote_sql.c 66.60% 60.73% 93.55%
src/doltlite_remotesrv.c 75.84% 64.26% 90.77%
src/doltlite_reset.c 87.48% 72.76% 100.00%
src/doltlite_revert.c 80.51% 69.44% 100.00%
src/doltlite_schema_diff.c 94.42% 71.13% 96.97%
src/doltlite_schemas.c 70.86% 48.75% 90.91%
src/doltlite_status.c 91.21% 72.41% 97.56%
src/doltlite_tag.c 86.84% 70.31% 94.12%
src/doltlite_tests.c 84.22% 69.61% 91.11%
src/doltlite_tls.c 85.04% 62.73% 92.31%
src/doltlite_verify_constraints.c 79.15% 66.44% 100.00%
src/doltlite_workspace.c 91.84% 70.27% 100.00%
src/pager_shim.c 58.39% 67.07% 34.29%
src/prolly_btree.c 86.00% 66.56% 90.70%
src/prolly_btree_catalog.c 82.81% 69.06% 97.14%
src/prolly_btree_cursor.c 84.15% 62.09% 96.00%
src/prolly_btree_cursor_count.c 80.05% 56.74% 100.00%
src/prolly_btree_cursor_payload.c 75.69% 54.48% 95.65%
src/prolly_btree_cursor_seek.c 76.68% 66.20% 82.35%
src/prolly_btree_mutation.c 88.02% 68.30% 97.83%
src/prolly_btree_orig.c 93.75% 71.43% 93.15%
src/prolly_btree_state.c 93.19% 65.93% 100.00%
src/prolly_btree_txn.c 81.84% 69.30% 98.08%
src/prolly_cache.c 93.27% 69.12% 100.00%
src/prolly_check.c 60.36% 62.96% 100.00%
src/prolly_chunker.c 94.04% 78.38% 100.00%
src/prolly_cursor.c 89.67% 80.47% 100.00%
src/prolly_diff.c 52.79% 39.04% 60.87%
src/prolly_hash.c 93.33% 80.00% 100.00%
src/prolly_hashset.c 90.48% 80.56% 100.00%
src/prolly_mutate.c 80.78% 69.11% 100.00%
src/prolly_mutmap.c 93.87% 80.34% 100.00%
src/prolly_node.c 88.91% 73.81% 100.00%
src/prolly_three_way_diff.c 95.79% 85.37% 100.00%
src/prolly_three_way_merge.c 81.92% 67.41% 91.67%
src/prolly_xxhash.c 100.00% 100.00% 100.00%
src/sortkey.c 93.42% 81.64% 100.00%

Download HTML and LCOV artifacts from this workflow run.

@timsehn
timsehn merged commit 4b53bcc into master Aug 27, 2026
67 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.

Nightly stress failure: multi-process

1 participant