Skip to content

Add origin-backed lazy clones - #2552

Open
eric-richardson1 wants to merge 4 commits into
eric/chunk-source-callbackfrom
eric/origin-backed-chunk-source
Open

Add origin-backed lazy clones#2552
eric-richardson1 wants to merge 4 commits into
eric/chunk-source-callbackfrom
eric/origin-backed-chunk-source

Conversation

@eric-richardson1

Copy link
Copy Markdown
Contributor

Depends on #2551 and uses its chunk-source seam as the engine-owned executor.

Summary

  • add a built-in source backed by the recorded origin remote, reusing the existing file and HTTP(S) remote clients
  • add dolt_clone('--lazy', url) to install refs, origin, and tracking refs without transferring the reachable chunk graph
  • enable origin-backed misses per open with file:...?lazy_origin=1, including bootstrap and query in one connection
  • keep origin fetch and fast-forward pull refs-only while demand reads fault verified chunks into the local cache

Phase 0 / design

  • Activation is per-open configuration, not persisted state. lazy_origin=1 is inert until an origin exists, so it activates immediately after dolt_clone('--lazy', ...) records origin. This makes no file-format, manifest, WAL, or version change.
  • A host-registered callback takes precedence. Clearing it restores the built-in origin source for that connection.
  • The source reuses the existing remote client and its 256-hash xGetChunks batches, credential resolution, and TLS behavior. Version 1 opens a client per callback; file remotes are opened read-only.
  • Source callbacks inherit the seam's graph-lock rule, common hash verification, bounded memory cache, and verified write-through path. No network request runs under the graph lock.
  • On an origin-enabled connection, dolt_fetch('origin') updates tracking refs without bulk transfer. Fast-forward pull remains lazy. A divergent pull fails with a materialization requirement because merge would otherwise need source reads while graph-locked.
  • Without lazy_origin=1, cached chunks remain readable and an uncached miss reports NOTFOUND with the requested hash and activation remedy. With activation, unreachable-origin transport reports a hash-named chunk-source I/O error rather than corruption.

Validation

  • ./build/chunk_source_test: 286/286
  • file remote suite: 133/133
  • HTTP remotesrv suite: 42/42 across 156 validated requests
  • regression assertions: 311177/311177
  • amalgamation enabled/disabled probes
  • fresh DOLTLITE_ENABLE_CHUNK_SOURCE=0 build
  • lint and native DoltLite suites

Deferred follow-ups

  • durable lazy activation with an explicit format/version gate before an auto-enabled end-user CLI mode
  • full materialization command
  • remote client and HTTP connection pooling
  • richer prefetch tuning and WASM host plumbing

Co-Authored-By: OpenAI Codex noreply@openai.com

eric-richardson1 and others added 4 commits September 1, 2026 16:25
Implement an owned built-in source on the existing callback seam, with host callback precedence, 256-hash remote batches, the existing credential and TLS client, and read-only file remotes. Keep activation connection-local and inert until an origin remote exists.

Co-Authored-By: OpenAI Codex <noreply@openai.com>
Teach dolt_clone --lazy to install refs, origin, and tracking refs without transferring chunks. Enable origin-backed misses per connection with file:...?lazy_origin=1, including bootstrap and query in one connection, while leaving the on-disk format unchanged.

Co-Authored-By: OpenAI Codex <noreply@openai.com>
Update origin tracking refs without bulk chunk transfer when lazy_origin is active. Fast-forward pulls fault data on demand, while divergent pulls return a clear materialization requirement instead of entering a graph-locked merge.

Co-Authored-By: OpenAI Codex <noreply@openai.com>
Cover file and HTTP refs-only clones, same-connection activation, reopen behavior, refresh, offline cached and uncached reads, host precedence, amalgamation, and compile-out errors. Document URI activation, transport lifecycle, failure semantics, and deferred follow-ups.

Co-Authored-By: OpenAI Codex <noreply@openai.com>
@itoqa

itoqa Bot commented Sep 1, 2026

Copy link
Copy Markdown

Ito QA test results
Commit: 96b1e2d: 19 test cases ran, 1 failed ❌, 18 passed ✅.

Summary

The run broadly covered lazy and normal data access, remote synchronization, branch and revision consistency, offline recovery, integrity validation, authentication, and failure handling across local and network-backed sources. These happy-path, edge-case, and adversarial scenarios were generally healthy, but concurrent access exposed a user-visible reliability problem.

Merge with caution — the PR introduces a medium-severity concurrency failure in origin-backed reads, where overlapping reads can fail and leave data unavailable offline after an interrupted fetch. The remaining covered behaviors passed, so this is not a broad functional failure, but the attributable read-reliability issue warrants resolution before treating the change as fully safe.

Tests run by Ito

View full run

Result Severity Type Description
Medium severity General The row read returned the expected value, but the overlapping table scan stopped with a database-locked error. Once the origin was unavailable, the scan could not recover the chunk whose write had been interrupted.
General The native boundary check passed all 286 checks. The earlier blockage came from missing fixture visibility into exact request counts, not from lost data or a product failure.
General The lazy clone kept its branch refs, catalog, current rows, and historical rows on the same revision before and after reopening.
General The first connection loaded the table rows and binary data, and two later connections returned the same values after the origin was removed.
General The ref publication failure checks passed. A failed update returned an error, kept the database state recoverable, and the next attempt completed without a false success or mismatched refs.
General A cold read reported the missing origin chunk clearly while the origin was unavailable. After the origin returned, retrying and reopening the database returned the correct data.
General Valid HTTPS access returned the expected data, while missing or unauthorized credentials, an untrusted certificate, and plaintext transport were rejected instead of being treated as missing data.
General Fetching and pulling a branch after switching away from it updates that branch correctly. The feature branch included the newest row after the remote was advanced.
Clone The lazy clone succeeded and kept the local store refs-sized before any table data was read. The default branch, origin tracking refs, and origin metadata were present, and the store grew after a table read fetched data on demand.
Clone A normal clone copied its history before any reads. Fetch and fast-forward pull brought in the new row, and a divergent pull kept both changes by creating a merge commit.
Disabled The disabled build handled a missing lazy-read chunk safely. It returned the expected support-disabled error with the requested hash and did not crash.
Fetch The first cold read returned the expected rows and saved the fetched data locally. After the source file was unavailable, reopening the clone returned the same rows without needing the source.
Host A registered host callback served a missing chunk while the origin was unavailable. After the callback was cleared, the same connection successfully fetched another missing chunk from the origin.
Open Opening a lazy copy activates its saved source before setup finishes, so a cold table can be read immediately and again after a fresh reopen.
Remote Fetching a changed remote updated the tracking branch without copying the full data graph. Pull then fast-forwarded the local branch and returned both expected rows.
Rev Authenticated cloning over HTTPS worked, while missing credentials, unauthorized credentials, the wrong certificate authority, and plain HTTP were rejected. The large multi-chunk clone also kept its data intact.
Rev The lazy clone kept the remote's default branch and every branch reference. Switching to the other branch returned its own committed rows with a clean working state.
Rev The integrity check rejected data whose contents did not match the requested hash and kept it out of local storage. A matching chunk was accepted, so the retry path can use valid data.
Source Cold table reads returned the expected data from both local file and HTTP origins. When either origin was unavailable, the read returned an error that named the requested chunk instead of accepting missing data.

Tip

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

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

View All Evidence

Medium severity Concurrent reads fail with a locked database

What failed: The row read returned the expected value, but the overlapping table scan stopped with a database-locked error. Once the origin was unavailable, the scan could not recover the chunk whose write had been interrupted.

Impact · Steps · Stub / mock · Analysis · Why this is likely a bug
  • Severity: Medium Medium severity
  • Impact: A broad read can fail when users read data at the same time, even though a single-row read works. If a fetch is interrupted, a later offline read may also be unable to load that chunk until the source is available again.
  • Steps to Reproduce:
    1. Create a writable lazy clone with a table whose chunks are still at the origin.
    2. Start one process reading a single row and another process scanning the table so both processes fetch overlapping missing chunks.
    3. Observe that the single-row read succeeds while the broad scan reports that the database is locked.
    4. Remove the origin and repeat the broad scan; observe the missing-origin-chunk error for data that was not persisted after the lock failure.
  • Stub / mock content: No stubs, mocks, or bypasses were applied for this test in the recorded run.
  • Code Analysis: The PR changes src/doltlite_chunk_source.c to add the origin-backed source and to use the source persistence flow for fetched origin bytes. In the current implementation, chunkStoreSourceGet at src/doltlite_chunk_source.c:502-527 verifies the fetched bytes and calls csSourcePersistMany before putting them in the connection cache; chunkStoreSourcePrefetchMany at lines 587-627 does the same for a broad scan and returns immediately when persistence fails. csSourcePersistMany at lines 404-435 opens the writer and calls chunkStoreLockAndRefresh at line 406, but has no retry or wait when that call returns SQLITE_BUSY. The shared lock implementation in src/chunk_store_lock.c:272-308 uses sqlite3_mutex_try at lines 277-279 and nonblocking csFileLockNB at lines 288-296, so a second connection contending for the graph lock receives SQLITE_BUSY immediately. That error is returned by csSourcePersistMany, then by prefetch, and finally reaches the scan as the observed database-locked failure. Because cache publication occurs only after csSourcePersistMany succeeds, the failed fetch is not safely available to a later offline read, which explains the subsequent hash-specific missing-origin error. The smallest practical fix is to coordinate or retry the shared lock for this lazy persistence operation, with bounded retry handling that preserves rollback and only reports SQLITE_BUSY after the contention cannot be resolved.
  • Why this is likely a bug: This is not only a browser or setup failure: the recorded result contains a successful demand value, a failed concurrent scan, and a concrete database-locked error, and the source has a matching error path. The PR's new origin-backed lazy reads can therefore turn ordinary concurrent reads into a user-visible failed query. The lock is intentionally nonblocking, but the new persistence caller does not absorb or retry contention, so temporary overlap becomes a hard read failure; a bounded retry or equivalent coordination at this persistence boundary is the targeted remediation.
Relevant code

src/doltlite_chunk_source.c:404-435

rc = csSourceOpenWriter(cs, p, 0);
if( rc!=SQLITE_OK || !p->writerOpen ) return rc;
rc = chunkStoreLockAndRefresh(&p->writer);
...
if( rc!=SQLITE_OK ) chunkStoreRollback(&p->writer);
chunkStoreUnlock(&p->writer);
return rc;

src/doltlite_chunk_source.c:621-637

rc = csSourcePersistMany(cs, p, aMissing, apData, anData, nMissing);
if( rc!=SQLITE_OK ) goto prefetch_done;
for(i=0; i<nMissing; i++){
  if( !apData[i] ) continue;
  rc = csSourceCachePut(p, &aMissing[i], apData[i], anData[i]);
  if( rc!=SQLITE_OK ) goto prefetch_done;
}
...
return rc;

src/chunk_store_lock.c:272-298

if( cs->pLockMutex && sqlite3_mutex_try(cs->pLockMutex)!=SQLITE_OK ){
  return SQLITE_BUSY;
}
...
rc = csFileLockNB(cs->file.pVfs, cs->file.zFilename,
                  &CS_GRAPH_LOCK(cs), &cs->pGraphLockName);
if( rc!=SQLITE_OK ){
  if( cs->pLockMutex ) sqlite3_mutex_leave(cs->pLockMutex);
  return rc;
}
Evidence Package
Copy prompt for an agent
Ito QA identified the following failure during automated PR testing. Please investigate and propose a fix.

**Medium severity — Concurrent reads fail with a locked database**

**What failed:** The row read returned the expected value, but the overlapping table scan stopped with a database-locked error. Once the origin was unavailable, the scan could not recover the chunk whose write had been interrupted.

- **Impact:** A broad read can fail when users read data at the same time, even though a single-row read works. If a fetch is interrupted, a later offline read may also be unable to load that chunk until the source is available again.
- **Steps to reproduce:**
  1. Create a writable lazy clone with a table whose chunks are still at the origin.
  2. Start one process reading a single row and another process scanning the table so both processes fetch overlapping missing chunks.
  3. Observe that the single-row read succeeds while the broad scan reports that the database is locked.
  4. Remove the origin and repeat the broad scan; observe the missing-origin-chunk error for data that was not persisted after the lock failure.
- **Stub / mock content:** No stubs, mocks, or bypasses were applied for this test in the recorded run.
- **Code analysis:** The PR changes src/doltlite_chunk_source.c to add the origin-backed source and to use the source persistence flow for fetched origin bytes. In the current implementation, chunkStoreSourceGet at src/doltlite_chunk_source.c:502-527 verifies the fetched bytes and calls csSourcePersistMany before putting them in the connection cache; chunkStoreSourcePrefetchMany at lines 587-627 does the same for a broad scan and returns immediately when persistence fails. csSourcePersistMany at lines 404-435 opens the writer and calls chunkStoreLockAndRefresh at line 406, but has no retry or wait when that call returns SQLITE_BUSY. The shared lock implementation in src/chunk_store_lock.c:272-308 uses sqlite3_mutex_try at lines 277-279 and nonblocking csFileLockNB at lines 288-296, so a second connection contending for the graph lock receives SQLITE_BUSY immediately. That error is returned by csSourcePersistMany, then by prefetch, and finally reaches the scan as the observed database-locked failure. Because cache publication occurs only after csSourcePersistMany succeeds, the failed fetch is not safely available to a later offline read, which explains the subsequent hash-specific missing-origin error. The smallest practical fix is to coordinate or retry the shared lock for this lazy persistence operation, with bounded retry handling that preserves rollback and only reports SQLITE_BUSY after the contention cannot be resolved.
- **Why this is likely a bug:** This is not only a browser or setup failure: the recorded result contains a successful demand value, a failed concurrent scan, and a concrete database-locked error, and the source has a matching error path. The PR's new origin-backed lazy reads can therefore turn ordinary concurrent reads into a user-visible failed query. The lock is intentionally nonblocking, but the new persistence caller does not absorb or retry contention, so temporary overlap becomes a hard read failure; a bounded retry or equivalent coordination at this persistence boundary is the targeted remediation.

**Relevant code:**

`src/doltlite_chunk_source.c:404-435`

~~~c
rc = csSourceOpenWriter(cs, p, 0);
if( rc!=SQLITE_OK || !p->writerOpen ) return rc;
rc = chunkStoreLockAndRefresh(&p->writer);
...
if( rc!=SQLITE_OK ) chunkStoreRollback(&p->writer);
chunkStoreUnlock(&p->writer);
return rc;
~~~

`src/doltlite_chunk_source.c:621-637`

~~~c
rc = csSourcePersistMany(cs, p, aMissing, apData, anData, nMissing);
if( rc!=SQLITE_OK ) goto prefetch_done;
for(i=0; i<nMissing; i++){
  if( !apData[i] ) continue;
  rc = csSourceCachePut(p, &aMissing[i], apData[i], anData[i]);
  if( rc!=SQLITE_OK ) goto prefetch_done;
}
...
return rc;
~~~

`src/chunk_store_lock.c:272-298`

~~~c
if( cs->pLockMutex && sqlite3_mutex_try(cs->pLockMutex)!=SQLITE_OK ){
  return SQLITE_BUSY;
}
...
rc = csFileLockNB(cs->file.pVfs, cs->file.zFilename,
                  &CS_GRAPH_LOCK(cs), &cs->pGraphLockName);
if( rc!=SQLITE_OK ){
  if( cs->pLockMutex ) sqlite3_mutex_leave(cs->pLockMutex);
  return rc;
}
~~~

@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

DoltLite performance vs PR base

  • Baseline: 449613a632c7c6e59ccaf3aa3e503c229b4d77e5
  • Candidate: 40446064c0097b5eb3b01ccf82500a3dce8e617f
  • Overall ratio: 1.001x
  • 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 10.80s 10.78s 0.998x PASS
compositepk 69 11.73s 11.73s 1.000x PASS
int 69 10.42s 10.42s 1.001x PASS
textpk 69 11.67s 11.71s 1.003x PASS
vc 13 739.45ms 743.00ms 1.005x PASS
blobpk details
Section Test Baseline Candidate Delta Ratio Result
mem_reads oltp_point_select 30.04ms 30.43ms +387us 1.013x PASS
mem_reads oltp_range_select 12.07ms 12.06ms -3us 1.000x PASS
mem_reads oltp_sum_range 11.73ms 11.51ms -216us 0.982x PASS
mem_reads oltp_order_range 2.84ms 2.90ms +66us 1.023x PASS
mem_reads oltp_distinct_range 3.88ms 3.92ms +41us 1.011x PASS
mem_reads oltp_index_scan 4.82ms 4.87ms +54us 1.011x PASS
mem_reads select_random_points 18.61ms 18.70ms +95us 1.005x PASS
mem_reads select_random_ranges 4.41ms 4.53ms +126us 1.029x PASS
mem_reads covering_index_scan 3.66ms 3.62ms -39us 0.989x PASS
mem_reads groupby_scan 32.60ms 32.44ms -163us 0.995x PASS
mem_reads index_join 7.94ms 7.89ms -48us 0.994x PASS
mem_reads index_join_scan 4.95ms 4.92ms -26us 0.995x PASS
mem_reads types_table_scan 1.12s 1.12s -3.04ms 0.997x PASS
mem_reads table_scan 1.23s 1.23s -290us 1.000x PASS
mem_reads oltp_read_only 117.75ms 117.89ms +137us 1.001x PASS
mem_writes oltp_bulk_insert 285.37ms 281.06ms -4.31ms 0.985x PASS
mem_writes oltp_insert 30.35ms 30.52ms +162us 1.005x PASS
mem_writes oltp_update_index 106.67ms 107.88ms +1.20ms 1.011x PASS
mem_writes oltp_update_non_index 61.09ms 61.70ms +606us 1.010x PASS
mem_writes oltp_delete_insert 81.91ms 81.51ms -391us 0.995x PASS
mem_writes oltp_write_only 47.16ms 47.12ms -47us 0.999x PASS
mem_writes types_delete_insert 42.25ms 42.56ms +313us 1.007x PASS
mem_writes oltp_read_write 116.39ms 115.69ms -709us 0.994x PASS
file_reads oltp_point_select 38.28ms 38.20ms -76us 0.998x PASS
file_reads oltp_range_select 13.28ms 13.29ms +14us 1.001x PASS
file_reads oltp_sum_range 12.88ms 12.79ms -94us 0.993x PASS
file_reads oltp_order_range 3.09ms 3.12ms +28us 1.009x PASS
file_reads oltp_distinct_range 4.11ms 4.10ms -7us 0.998x PASS
file_reads oltp_index_scan 6.22ms 6.23ms +11us 1.002x PASS
file_reads select_random_points 20.04ms 20.31ms +270us 1.013x PASS
file_reads select_random_ranges 5.39ms 5.36ms -35us 0.994x PASS
file_reads covering_index_scan 5.11ms 5.01ms -95us 0.981x PASS
file_reads groupby_scan 32.91ms 33.02ms +103us 1.003x PASS
file_reads index_join 9.49ms 9.52ms +33us 1.003x PASS
file_reads index_join_scan 5.46ms 5.35ms -110us 0.980x PASS
file_reads types_table_scan 1.14s 1.13s -6.10ms 0.995x PASS
file_reads table_scan 1.24s 1.24s -5.15ms 0.996x PASS
file_reads oltp_read_only 129.84ms 128.44ms -1.41ms 0.989x PASS
file_writes oltp_bulk_insert 359.07ms 353.17ms -5.90ms 0.984x PASS
file_writes oltp_insert 60.90ms 60.97ms +69us 1.001x PASS
file_writes oltp_update_index 201.67ms 203.60ms +1.93ms 1.010x PASS
file_writes oltp_update_non_index 129.67ms 130.60ms +922us 1.007x PASS
file_writes oltp_delete_insert 162.45ms 162.55ms +102us 1.001x PASS
file_writes oltp_write_only 110.48ms 111.82ms +1.33ms 1.012x PASS
file_writes types_delete_insert 88.85ms 90.42ms +1.58ms 1.018x PASS
file_writes oltp_read_write 175.15ms 177.12ms +1.97ms 1.011x PASS
ac_reads oltp_point_select 37.79ms 37.96ms +171us 1.005x PASS
ac_reads oltp_range_select 13.25ms 13.39ms +140us 1.011x PASS
ac_reads oltp_sum_range 12.79ms 12.61ms -186us 0.985x PASS
ac_reads oltp_order_range 3.04ms 3.06ms +17us 1.006x PASS
ac_reads oltp_distinct_range 4.09ms 4.07ms -19us 0.995x PASS
ac_reads oltp_index_scan 6.19ms 6.20ms +8us 1.001x PASS
ac_reads select_random_points 19.84ms 20.17ms +323us 1.016x PASS
ac_reads select_random_ranges 5.46ms 5.49ms +32us 1.006x PASS
ac_reads covering_index_scan 4.84ms 4.84ms -1us 1.000x PASS
ac_reads groupby_scan 32.87ms 32.77ms -96us 0.997x PASS
ac_reads index_join 9.30ms 9.19ms -105us 0.989x PASS
ac_reads index_join_scan 5.35ms 5.27ms -78us 0.985x PASS
ac_reads types_table_scan 1.14s 1.13s -12.76ms 0.989x PASS
ac_reads table_scan 1.24s 1.25s +1.01ms 1.001x PASS
ac_reads oltp_read_only 130.47ms 129.35ms -1.12ms 0.991x PASS
ac_writes oltp_bulk_insert_ac 83.30ms 97.86ms +14.56ms 1.175x PASS
ac_writes oltp_insert_ac 98.17ms 101.11ms +2.94ms 1.030x PASS
ac_writes oltp_update_index_ac 112.44ms 110.07ms -2.37ms 0.979x PASS
ac_writes oltp_update_non_index_ac 92.76ms 94.80ms +2.03ms 1.022x PASS
ac_writes oltp_delete_insert_ac 105.03ms 99.48ms -5.54ms 0.947x PASS
ac_writes oltp_write_only_ac 103.40ms 102.72ms -675us 0.993x PASS
ac_writes types_delete_insert_ac 90.15ms 88.27ms -1.88ms 0.979x PASS
ac_writes oltp_read_write_ac 105.74ms 105.21ms -527us 0.995x PASS
compositepk details
Section Test Baseline Candidate Delta Ratio Result
mem_reads oltp_point_select 38.88ms 37.62ms -1.26ms 0.968x PASS
mem_reads oltp_range_select 21.36ms 21.49ms +132us 1.006x PASS
mem_reads oltp_sum_range 20.88ms 20.50ms -385us 0.982x PASS
mem_reads oltp_order_range 4.00ms 3.97ms -27us 0.993x PASS
mem_reads oltp_distinct_range 5.19ms 5.09ms -100us 0.981x PASS
mem_reads oltp_index_scan 6.04ms 6.18ms +143us 1.024x PASS
mem_reads select_random_points 31.47ms 31.92ms +444us 1.014x PASS
mem_reads select_random_ranges 8.57ms 8.42ms -152us 0.982x PASS
mem_reads covering_index_scan 4.69ms 4.52ms -177us 0.962x PASS
mem_reads groupby_scan 42.76ms 42.47ms -294us 0.993x PASS
mem_reads index_join 11.12ms 10.54ms -581us 0.948x PASS
mem_reads index_join_scan 5.91ms 6.07ms +159us 1.027x PASS
mem_reads types_table_scan 1.29s 1.30s +12.48ms 1.010x PASS
mem_reads table_scan 1.39s 1.39s -5.80ms 0.996x PASS
mem_reads oltp_read_only 168.57ms 165.84ms -2.74ms 0.984x PASS
mem_writes oltp_bulk_insert 348.88ms 337.75ms -11.13ms 0.968x PASS
mem_writes oltp_insert 35.77ms 35.50ms -276us 0.992x PASS
mem_writes oltp_update_index 121.84ms 121.03ms -810us 0.993x PASS
mem_writes oltp_update_non_index 77.47ms 76.27ms -1.20ms 0.984x PASS
mem_writes oltp_delete_insert 96.92ms 96.42ms -494us 0.995x PASS
mem_writes oltp_write_only 57.95ms 58.12ms +172us 1.003x PASS
mem_writes types_delete_insert 52.95ms 51.97ms -983us 0.981x PASS
mem_writes oltp_read_write 156.94ms 154.12ms -2.82ms 0.982x PASS
file_reads oltp_point_select 59.54ms 59.29ms -248us 0.996x PASS
file_reads oltp_range_select 23.37ms 23.48ms +108us 1.005x PASS
file_reads oltp_sum_range 22.80ms 22.42ms -377us 0.983x PASS
file_reads oltp_order_range 4.23ms 4.22ms -4us 0.999x PASS
file_reads oltp_distinct_range 5.47ms 5.39ms -81us 0.985x PASS
file_reads oltp_index_scan 8.02ms 7.96ms -57us 0.993x PASS
file_reads select_random_points 33.24ms 33.12ms -116us 0.997x PASS
file_reads select_random_ranges 10.82ms 10.80ms -22us 0.998x PASS
file_reads covering_index_scan 6.65ms 6.48ms -166us 0.975x PASS
file_reads groupby_scan 42.26ms 42.22ms -34us 0.999x PASS
file_reads index_join 11.93ms 11.77ms -156us 0.987x PASS
file_reads index_join_scan 6.05ms 5.96ms -85us 0.986x PASS
file_reads types_table_scan 1.23s 1.25s +18.08ms 1.015x PASS
file_reads table_scan 1.36s 1.36s +558us 1.000x PASS
file_reads oltp_read_only 199.60ms 198.51ms -1.09ms 0.995x PASS
file_writes oltp_bulk_insert 359.10ms 352.64ms -6.46ms 0.982x PASS
file_writes oltp_insert 41.95ms 41.08ms -866us 0.979x PASS
file_writes oltp_update_index 134.91ms 133.82ms -1.09ms 0.992x PASS
file_writes oltp_update_non_index 91.10ms 90.91ms -182us 0.998x PASS
file_writes oltp_delete_insert 108.81ms 109.31ms +500us 1.005x PASS
file_writes oltp_write_only 68.67ms 67.75ms -912us 0.987x PASS
file_writes types_delete_insert 58.58ms 58.87ms +292us 1.005x PASS
file_writes oltp_read_write 166.53ms 164.26ms -2.28ms 0.986x PASS
ac_reads oltp_point_select 59.18ms 59.43ms +245us 1.004x PASS
ac_reads oltp_range_select 23.29ms 23.57ms +283us 1.012x PASS
ac_reads oltp_sum_range 23.07ms 22.25ms -815us 0.965x PASS
ac_reads oltp_order_range 4.20ms 4.22ms +22us 1.005x PASS
ac_reads oltp_distinct_range 5.47ms 5.41ms -60us 0.989x PASS
ac_reads oltp_index_scan 8.22ms 8.14ms -74us 0.991x PASS
ac_reads select_random_points 33.41ms 33.09ms -319us 0.990x PASS
ac_reads select_random_ranges 10.75ms 10.70ms -54us 0.995x PASS
ac_reads covering_index_scan 6.88ms 6.74ms -133us 0.981x PASS
ac_reads groupby_scan 42.45ms 41.95ms -495us 0.988x PASS
ac_reads index_join 11.87ms 11.96ms +87us 1.007x PASS
ac_reads index_join_scan 6.06ms 6.04ms -14us 0.998x PASS
ac_reads types_table_scan 1.25s 1.27s +23.84ms 1.019x PASS
ac_reads table_scan 1.38s 1.38s -1.07ms 0.999x PASS
ac_reads oltp_read_only 204.46ms 199.65ms -4.81ms 0.976x PASS
ac_writes oltp_bulk_insert_ac 63.57ms 58.68ms -4.89ms 0.923x PASS
ac_writes oltp_insert_ac 75.76ms 74.96ms -795us 0.990x PASS
ac_writes oltp_update_index_ac 85.42ms 87.19ms +1.77ms 1.021x PASS
ac_writes oltp_update_non_index_ac 67.43ms 67.36ms -75us 0.999x PASS
ac_writes oltp_delete_insert_ac 77.15ms 76.96ms -182us 0.998x PASS
ac_writes oltp_write_only_ac 80.77ms 78.96ms -1.81ms 0.978x PASS
ac_writes types_delete_insert_ac 67.54ms 67.39ms -152us 0.998x PASS
ac_writes oltp_read_write_ac 85.73ms 83.97ms -1.76ms 0.979x PASS
int details
Section Test Baseline Candidate Delta Ratio Result
mem_reads oltp_point_select 28.27ms 27.95ms -324us 0.989x PASS
mem_reads oltp_range_select 11.23ms 11.05ms -186us 0.983x PASS
mem_reads oltp_sum_range 11.10ms 10.81ms -280us 0.975x PASS
mem_reads oltp_order_range 2.91ms 2.90ms -1us 1.000x PASS
mem_reads oltp_distinct_range 4.06ms 4.37ms +309us 1.076x PASS
mem_reads oltp_index_scan 4.78ms 4.74ms -39us 0.992x PASS
mem_reads select_random_points 10.87ms 10.80ms -74us 0.993x PASS
mem_reads select_random_ranges 4.00ms 3.88ms -121us 0.970x PASS
mem_reads covering_index_scan 4.14ms 4.05ms -85us 0.979x PASS
mem_reads groupby_scan 34.75ms 34.92ms +170us 1.005x PASS
mem_reads index_join 7.70ms 7.57ms -126us 0.984x PASS
mem_reads index_join_scan 4.62ms 4.59ms -28us 0.994x PASS
mem_reads types_table_scan 1.19s 1.19s -1.52ms 0.999x PASS
mem_reads table_scan 1.31s 1.31s +2.96ms 1.002x PASS
mem_reads oltp_read_only 116.90ms 117.51ms +615us 1.005x PASS
mem_writes oltp_bulk_insert 252.62ms 248.64ms -3.98ms 0.984x PASS
mem_writes oltp_insert 28.37ms 27.90ms -471us 0.983x PASS
mem_writes oltp_update_index 91.36ms 90.69ms -664us 0.993x PASS
mem_writes oltp_update_non_index 54.96ms 54.35ms -605us 0.989x PASS
mem_writes oltp_delete_insert 73.79ms 73.65ms -143us 0.998x PASS
mem_writes oltp_write_only 48.21ms 48.61ms +402us 1.008x PASS
mem_writes types_delete_insert 37.08ms 36.76ms -320us 0.991x PASS
mem_writes oltp_read_write 109.19ms 107.13ms -2.06ms 0.981x PASS
file_reads oltp_point_select 48.95ms 48.99ms +49us 1.001x PASS
file_reads oltp_range_select 13.30ms 13.19ms -110us 0.992x PASS
file_reads oltp_sum_range 13.12ms 13.06ms -59us 0.996x PASS
file_reads oltp_order_range 3.18ms 3.21ms +30us 1.009x PASS
file_reads oltp_distinct_range 4.35ms 4.30ms -43us 0.990x PASS
file_reads oltp_index_scan 7.24ms 7.14ms -95us 0.987x PASS
file_reads select_random_points 13.13ms 13.26ms +127us 1.010x PASS
file_reads select_random_ranges 6.11ms 6.10ms -14us 0.998x PASS
file_reads covering_index_scan 6.55ms 6.57ms +18us 1.003x PASS
file_reads groupby_scan 35.04ms 35.09ms +49us 1.001x PASS
file_reads index_join 9.35ms 9.25ms -99us 0.989x PASS
file_reads index_join_scan 4.94ms 4.90ms -34us 0.993x PASS
file_reads types_table_scan 1.18s 1.19s +7.86ms 1.007x PASS
file_reads table_scan 1.31s 1.31s -15us 1.000x PASS
file_reads oltp_read_only 145.59ms 148.15ms +2.56ms 1.018x PASS
file_writes oltp_bulk_insert 258.94ms 257.26ms -1.69ms 0.993x PASS
file_writes oltp_insert 32.06ms 31.66ms -401us 0.987x PASS
file_writes oltp_update_index 99.31ms 100.06ms +742us 1.007x PASS
file_writes oltp_update_non_index 67.18ms 66.40ms -776us 0.988x PASS
file_writes oltp_delete_insert 81.20ms 80.26ms -943us 0.988x PASS
file_writes oltp_write_only 54.16ms 54.18ms +19us 1.000x PASS
file_writes types_delete_insert 42.58ms 42.63ms +49us 1.001x PASS
file_writes oltp_read_write 113.74ms 113.33ms -411us 0.996x PASS
ac_reads oltp_point_select 49.21ms 49.24ms +32us 1.001x PASS
ac_reads oltp_range_select 13.35ms 13.31ms -42us 0.997x PASS
ac_reads oltp_sum_range 13.31ms 13.14ms -169us 0.987x PASS
ac_reads oltp_order_range 3.17ms 3.15ms -20us 0.994x PASS
ac_reads oltp_distinct_range 4.34ms 4.25ms -95us 0.978x PASS
ac_reads oltp_index_scan 7.34ms 7.24ms -100us 0.986x PASS
ac_reads select_random_points 13.39ms 13.27ms -126us 0.991x PASS
ac_reads select_random_ranges 6.19ms 6.08ms -110us 0.982x PASS
ac_reads covering_index_scan 6.70ms 6.61ms -92us 0.986x PASS
ac_reads groupby_scan 35.03ms 35.48ms +445us 1.013x PASS
ac_reads index_join 9.43ms 9.16ms -267us 0.972x PASS
ac_reads index_join_scan 4.92ms 4.89ms -27us 0.995x PASS
ac_reads types_table_scan 1.19s 1.20s +2.01ms 1.002x PASS
ac_reads table_scan 1.31s 1.31s +856us 1.001x PASS
ac_reads oltp_read_only 146.46ms 149.68ms +3.22ms 1.022x PASS
ac_writes oltp_bulk_insert_ac 62.51ms 61.68ms -829us 0.987x PASS
ac_writes oltp_insert_ac 73.72ms 74.68ms +966us 1.013x PASS
ac_writes oltp_update_index_ac 88.25ms 88.13ms -118us 0.999x PASS
ac_writes oltp_update_non_index_ac 67.53ms 67.98ms +454us 1.007x PASS
ac_writes oltp_delete_insert_ac 77.69ms 77.36ms -331us 0.996x PASS
ac_writes oltp_write_only_ac 76.72ms 75.47ms -1.25ms 0.984x PASS
ac_writes types_delete_insert_ac 68.11ms 68.74ms +629us 1.009x PASS
ac_writes oltp_read_write_ac 86.42ms 87.67ms +1.25ms 1.014x PASS
textpk details
Section Test Baseline Candidate Delta Ratio Result
mem_reads oltp_point_select 35.88ms 35.21ms -665us 0.981x PASS
mem_reads oltp_range_select 13.64ms 13.80ms +162us 1.012x PASS
mem_reads oltp_sum_range 13.42ms 13.50ms +78us 1.006x PASS
mem_reads oltp_order_range 3.23ms 3.25ms +17us 1.005x PASS
mem_reads oltp_distinct_range 4.35ms 4.34ms -17us 0.996x PASS
mem_reads oltp_index_scan 5.86ms 5.82ms -44us 0.992x PASS
mem_reads select_random_points 20.21ms 20.30ms +91us 1.005x PASS
mem_reads select_random_ranges 5.35ms 5.21ms -141us 0.974x PASS
mem_reads covering_index_scan 4.69ms 4.55ms -141us 0.970x PASS
mem_reads groupby_scan 36.71ms 36.67ms -38us 0.999x PASS
mem_reads index_join 8.97ms 8.96ms -14us 0.998x PASS
mem_reads index_join_scan 5.61ms 5.70ms +89us 1.016x PASS
mem_reads types_table_scan 1.26s 1.27s +10.66ms 1.008x PASS
mem_reads table_scan 1.38s 1.38s +805us 1.001x PASS
mem_reads oltp_read_only 134.24ms 132.78ms -1.46ms 0.989x PASS
mem_writes oltp_bulk_insert 362.74ms 354.24ms -8.51ms 0.977x PASS
mem_writes oltp_insert 40.05ms 39.21ms -838us 0.979x PASS
mem_writes oltp_update_index 141.67ms 141.11ms -557us 0.996x PASS
mem_writes oltp_update_non_index 81.68ms 81.74ms +63us 1.001x PASS
mem_writes oltp_delete_insert 112.23ms 110.28ms -1.96ms 0.983x PASS
mem_writes oltp_write_only 63.91ms 63.88ms -30us 1.000x PASS
mem_writes types_delete_insert 54.16ms 55.25ms +1.09ms 1.020x PASS
mem_writes oltp_read_write 143.36ms 141.96ms -1.40ms 0.990x PASS
file_reads oltp_point_select 57.93ms 57.71ms -216us 0.996x PASS
file_reads oltp_range_select 16.23ms 16.49ms +256us 1.016x PASS
file_reads oltp_sum_range 16.06ms 15.82ms -233us 0.985x PASS
file_reads oltp_order_range 3.49ms 3.51ms +22us 1.006x PASS
file_reads oltp_distinct_range 4.72ms 4.71ms -4us 0.999x PASS
file_reads oltp_index_scan 8.43ms 8.37ms -59us 0.993x PASS
file_reads select_random_points 22.55ms 22.51ms -42us 0.998x PASS
file_reads select_random_ranges 7.61ms 7.51ms -106us 0.986x PASS
file_reads covering_index_scan 7.14ms 7.06ms -79us 0.989x PASS
file_reads groupby_scan 36.90ms 36.93ms +32us 1.001x PASS
file_reads index_join 10.90ms 10.90ms +4us 1.000x PASS
file_reads index_join_scan 6.14ms 6.08ms -57us 0.991x PASS
file_reads types_table_scan 1.26s 1.27s +12.22ms 1.010x PASS
file_reads table_scan 1.39s 1.40s +15.00ms 1.011x PASS
file_reads oltp_read_only 166.06ms 165.13ms -927us 0.994x PASS
file_writes oltp_bulk_insert 376.51ms 370.41ms -6.11ms 0.984x PASS
file_writes oltp_insert 46.38ms 45.60ms -786us 0.983x PASS
file_writes oltp_update_index 158.41ms 157.72ms -692us 0.996x PASS
file_writes oltp_update_non_index 97.03ms 95.84ms -1.20ms 0.988x PASS
file_writes oltp_delete_insert 122.99ms 125.76ms +2.77ms 1.022x PASS
file_writes oltp_write_only 74.58ms 75.93ms +1.35ms 1.018x PASS
file_writes types_delete_insert 63.48ms 63.40ms -85us 0.999x PASS
file_writes oltp_read_write 154.61ms 153.19ms -1.42ms 0.991x PASS
ac_reads oltp_point_select 57.58ms 57.31ms -270us 0.995x PASS
ac_reads oltp_range_select 16.18ms 16.20ms +24us 1.001x PASS
ac_reads oltp_sum_range 15.99ms 15.92ms -79us 0.995x PASS
ac_reads oltp_order_range 3.51ms 3.49ms -21us 0.994x PASS
ac_reads oltp_distinct_range 4.75ms 4.72ms -26us 0.995x PASS
ac_reads oltp_index_scan 8.38ms 8.36ms -20us 0.998x PASS
ac_reads select_random_points 23.02ms 22.76ms -255us 0.989x PASS
ac_reads select_random_ranges 7.64ms 7.45ms -192us 0.975x PASS
ac_reads covering_index_scan 7.12ms 7.03ms -92us 0.987x PASS
ac_reads groupby_scan 37.05ms 37.05ms +4us 1.000x PASS
ac_reads index_join 10.79ms 10.99ms +196us 1.018x PASS
ac_reads index_join_scan 6.07ms 6.05ms -12us 0.998x PASS
ac_reads types_table_scan 1.27s 1.27s +4.16ms 1.003x PASS
ac_reads table_scan 1.40s 1.41s +16.43ms 1.012x PASS
ac_reads oltp_read_only 167.12ms 167.11ms -6us 1.000x PASS
ac_writes oltp_bulk_insert_ac 62.50ms 60.45ms -2.04ms 0.967x PASS
ac_writes oltp_insert_ac 74.68ms 73.11ms -1.57ms 0.979x PASS
ac_writes oltp_update_index_ac 87.33ms 91.66ms +4.32ms 1.050x PASS
ac_writes oltp_update_non_index_ac 70.14ms 70.29ms +147us 1.002x PASS
ac_writes oltp_delete_insert_ac 79.05ms 79.17ms +121us 1.002x PASS
ac_writes oltp_write_only_ac 77.56ms 77.91ms +346us 1.004x PASS
ac_writes types_delete_insert_ac 70.67ms 70.39ms -276us 0.996x PASS
ac_writes oltp_read_write_ac 86.85ms 87.28ms +428us 1.005x PASS
vc details
Section Test Baseline Candidate Delta Ratio Result
vc status_clean_many_tables 83.48ms 83.88ms +403us 1.005x PASS
vc status_dirty_many_tables 87.07ms 87.19ms +120us 1.001x PASS
vc diff_regular_working_one_table 78.56ms 78.89ms +332us 1.004x PASS
vc diff_regular_working_many_tables 91.17ms 92.15ms +977us 1.011x PASS
vc diff_stat_working_many_tables 91.22ms 91.91ms +688us 1.008x PASS
vc diff_schema_working_many_tables 91.72ms 91.89ms +177us 1.002x PASS
vc branch_list_many_branches 21.98ms 21.96ms -19us 0.999x PASS
vc branch_create_delete 24.71ms 24.89ms +177us 1.007x PASS
vc checkout_branch_clean 55.53ms 55.44ms -95us 0.998x PASS
vc merge_data_no_conflicts 28.82ms 28.86ms +41us 1.001x PASS
vc merge_schema_no_conflicts 21.46ms 21.80ms +340us 1.016x PASS
vc merge_data_conflicts 31.82ms 32.29ms +464us 1.015x PASS
vc merge_data_conflicts_with_resolve 31.90ms 31.85ms -51us 0.998x PASS

All relative performance gates passed.

@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

DoltLite source coverage

Metric Covered Total Coverage
Lines 54794 64452 85.02%
Branches 25377 37522 67.63%
Functions 2563 2776 92.33%

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

Per-file coverage (99 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% 69.17% 79.37%
src/chunk_staging.c 93.75% 80.33% 100.00%
src/chunk_store.c 90.65% 74.91% 100.00%
src/chunk_store_commit.c 86.75% 67.23% 100.00%
src/chunk_store_lock.c 88.69% 71.00% 100.00%
src/chunk_store_refs_api.c 91.17% 76.75% 100.00%
src/chunk_wal.c 82.30% 58.24% 87.50%
src/doltlite.c 100.00% 100.00% 100.00%
src/doltlite_add.c 85.95% 69.53% 100.00%
src/doltlite_ancestor.c 86.27% 64.56% 100.00%
src/doltlite_at.c 82.84% 62.37% 100.00%
src/doltlite_blame.c 78.90% 59.82% 96.55%
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.57% 63.03% 96.43%
src/doltlite_cherry_pick.c 76.56% 55.19% 75.00%
src/doltlite_chunk_source.c 88.86% 69.26% 100.00%
src/doltlite_chunk_walk.c 93.78% 67.57% 100.00%
src/doltlite_clean.c 94.23% 68.10% 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 95.15% 71.57% 92.86%
src/doltlite_commit_cmd.c 77.65% 67.34% 100.00%
src/doltlite_config.c 80.47% 71.74% 100.00%
src/doltlite_conflicts.c 84.30% 62.34% 93.75%
src/doltlite_constraint_violations.c 82.46% 57.54% 91.11%
src/doltlite_core.c 91.34% 70.81% 100.00%
src/doltlite_creds.c 84.09% 53.78% 92.00%
src/doltlite_dbpage.c 93.16% 75.00% 92.31%
src/doltlite_diff.c 88.24% 67.91% 96.67%
src/doltlite_diff_stat.c 94.17% 76.01% 95.65%
src/doltlite_diff_table.c 93.66% 70.89% 97.22%
src/doltlite_docs.c 83.94% 71.43% 94.74%
src/doltlite_gc.c 78.48% 58.10% 96.55%
src/doltlite_hashof.c 79.79% 70.05% 100.00%
src/doltlite_history.c 85.96% 73.94% 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 92.86% 68.42% 86.67%
src/doltlite_merge.c 95.93% 70.46% 100.00%
src/doltlite_merge_cmd.c 86.83% 72.15% 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 77.35% 63.04% 100.00%
src/doltlite_merge_constraints_unique.c 85.99% 62.82% 100.00%
src/doltlite_merge_pass1.c 92.94% 74.16% 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 82.93% 64.74% 100.00%
src/doltlite_merge_schema.c 90.95% 71.94% 97.06%
src/doltlite_merge_status.c 91.98% 73.53% 92.31%
src/doltlite_patch.c 94.36% 70.71% 98.15%
src/doltlite_rebase.c 85.56% 59.49% 100.00%
src/doltlite_record.c 78.67% 59.76% 95.24%
src/doltlite_ref.c 95.52% 74.46% 100.00%
src/doltlite_remote.c 86.21% 65.24% 96.23%
src/doltlite_remote_sql.c 65.85% 60.83% 93.55%
src/doltlite_remotesrv.c 75.76% 63.77% 90.77%
src/doltlite_reset.c 87.30% 71.26% 100.00%
src/doltlite_revert.c 76.72% 62.12% 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.45% 72.24% 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 92.09% 70.13% 100.00%
src/pager_shim.c 58.87% 67.46% 34.29%
src/prolly_btree.c 85.65% 67.27% 90.98%
src/prolly_btree_catalog.c 83.35% 69.31% 97.22%
src/prolly_btree_cursor.c 84.15% 62.24% 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 87.89% 68.20% 97.83%
src/prolly_btree_orig.c 93.75% 71.43% 93.15%
src/prolly_btree_state.c 93.28% 66.71% 100.00%
src/prolly_btree_txn.c 81.93% 69.43% 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 88.52% 82.14% 100.00%
src/prolly_diff.c 59.59% 46.05% 71.43%
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.52% 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.16% 81.51% 100.00%

Download HTML and LCOV artifacts from this workflow run.

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