Tiering v3 slice 2: indexed tag pages and counts #1008

Open
kayg wants to merge 7 commits from feat/tiering-v3-s2-tags into feat/tiering-v3-s1-namespace
Owner

Depends on #970 and is stacked on feat/tiering-v3-s1-namespace.

Implements Slice 2 of docs/plans/tiering-v3.md:

  • schema v6 adds per-tag order rows and updated, created, and title indexes;
  • counts and order rows follow note insert, update, and removal in the metadata transaction;
  • version-five rows backfill without file reads;
  • tag pages seek the requested order index and use maintained counts;
  • the perf harness samples the three tag orders at each fixture size.

RED/GREEN evidence is in the branch commits. Full slice gates and perf qualification will be posted here before the PR is marked ready. The required perf session must start after the 14:16 IST epoch with both locks held. Nothing is merged by this PR.

Depends on #970 and is stacked on feat/tiering-v3-s1-namespace. Implements Slice 2 of docs/plans/tiering-v3.md: - schema v6 adds per-tag order rows and updated, created, and title indexes; - counts and order rows follow note insert, update, and removal in the metadata transaction; - version-five rows backfill without file reads; - tag pages seek the requested order index and use maintained counts; - the perf harness samples the three tag orders at each fixture size. RED/GREEN evidence is in the branch commits. Full slice gates and perf qualification will be posted here before the PR is marked ready. The required perf session must start after the 14:16 IST epoch with both locks held. Nothing is merged by this PR.
perf: sample tag pages in every order
Some checks failed
CI / server (pull_request) Has been cancelled
CI / rust (pull_request) Has been cancelled
CI / web (pull_request) Has been cancelled
Markdown extraction contract / markdown-native-contract (pull_request) Has been cancelled
Markdown extraction contract / markdown-editor-contract (pull_request) Has been cancelled
6b10538d2a
Author
Owner

Synced, Rust gates: head eaeb417e72544a7c0aadcc906d8526f6ebb2de94

Merges slice 1 381ce6750 (now on dev 2fa9e18fb) cleanly.

  • cargo fmt --all --check: PASS
  • cargo clippy -j4 --workspace --all-targets --locked -- -D warnings: PASS
  • cargo test -j4 --workspace --locked --no-fail-fast -- --test-threads=2: PASS, 1,660 passed, 0 failed, 22 ignored

The first run failed once in counter_concurrent_mutations_drift_and_restart (one extra 137-byte file). It passed 10/10 here and 10/10 on dev, so it's not blocking: #1021.

Release calternal sha256 f7e5ad0f…e810d0, calternal-perf b3682687…e4a2. Perf: see #970. Nothing measured at this head yet.

## Synced, Rust gates: head `eaeb417e72544a7c0aadcc906d8526f6ebb2de94` Merges slice 1 `381ce6750` (now on dev `2fa9e18fb`) cleanly. - `cargo fmt --all --check`: PASS - `cargo clippy -j4 --workspace --all-targets --locked -- -D warnings`: PASS - `cargo test -j4 --workspace --locked --no-fail-fast -- --test-threads=2`: PASS, 1,660 passed, 0 failed, 22 ignored The first run failed once in `counter_concurrent_mutations_drift_and_restart` (one extra 137-byte file). It passed 10/10 here and 10/10 on dev, so it's not blocking: #1021. Release `calternal` sha256 `f7e5ad0f…e810d0`, `calternal-perf` `b3682687…e4a2`. Perf: see #970. Nothing measured at this head yet.
Author
Owner

Fresh session H1 (1k/10k/100k): s2 vs dev, a severe regression, now fixed

Session H1: perf-01, 11-09 11:07–11:37 CET (15:37–16:07 IST). Both locks were held: perf-01 through perf-turn, perf-02 through perf-lock. Binaries (sha256): dev d4b32af94 b99ace57…6859, s1 381ce6750 8b5292d6…bf0e, s2 eaeb417e7 f7e5ad0f…10d0, perf harness b3682687…e4a2. Each Home had its own setup. Every pair ran in the order control-a, s1, control-b, s2 (--hot-only --reuse-indexed, offset = pair). The gate reading is the one in the earlier comment: changed paths need a 95% upper bound below 1.00; unchanged paths need the point ratio no higher than the control's upper bound (or 1.00 if higher). Before H1, I deleted the predecessor's stale fixtures (96 GB work-head841, 18 GB of abab-20261107 Homes; reports kept). That took 7 min at the start of the turn.

At eaeb417e7, s2 was much slower than dev, and it got worse with Home size:

p50 v3/dev 1k 10k 100k
notes.append 1.51× 3.18× 52.7×
open.note 4.29× 17.4× 35.5×
open.api_get 1.06× 2.33× 37.5×

Root cause. The notes_tag_order_refresh trigger runs on every update of a note's updated, created or title_key, which every append or metadata refresh does. It ran UPDATE tag_order … WHERE id = NEW.id. tag_order's key is (tag, id) and nothing indexes id alone, so each note write scanned every order row: 446k at 100k notes.

Fix, two commits:

  • 6addfc4ea (RED): tag_order_refresh_cost_does_not_grow_with_other_notes counts the SQLite VM steps of one note's update with 1 and with 3,000 other tagged notes. On dev-01: refresh steps grew from 206 to 42192.
  • ee00d638c (GREEN): the trigger now matches WHERE tag IN (SELECT tag FROM tags WHERE id = NEW.id) AND id = NEW.id. That goes through tags_by_id and the (tag, id) key, with no new index and so no extra write cost. The trigger is dropped and recreated on open, so v7 stores made before this fix pick it up. The test passes.

Gates at ee00d638c (dev-01, nix develop, ~/bin/slot): cargo fmt --all --check PASS; cargo clippy -j4 --workspace --all-targets --locked -- -D warnings PASS; cargo test -j4 --workspace --locked --no-fail-fast -- --test-threads=2 PASS, 1,661 passed, 0 failed, 22 ignored. Release calternal sha256 84e5efcb…17d6, staged on perf-01. A re-run turn (control-a, s2fix, control-b; 1k/10k/100k) is queued in perf-turn.

Full gate table at the old head eaeb417e7 (s2)
size path kind s2/dev p50 [CI] s2/dev p95 [CI] control UCB p50/p95 verdict
1000 home.first_page changed 0.785 [0.479, 1.286] 0.785 [0.479, 1.286] 1.392/1.392 FAIL
1000 home.page unchanged 0.985 [0.799, 1.214] 1.025 [0.537, 1.960] 1.088/2.375 PASS
1000 home.page_big unchanged 1.100 [0.935, 1.295] 1.100 [0.935, 1.295] 1.111/1.111 PASS
1000 home.page_next unchanged 1.106 [0.902, 1.356] 1.202 [0.712, 2.027] 1.214/1.568 PASS
1000 home.page_tag changed 0.587 [0.476, 0.725] 0.564 [0.391, 0.814] 1.253/1.489 PASS
1000 home.page_tag_created changed 0.570 [0.458, 0.709] 0.693 [0.401, 1.196] 1.205/1.755 FAIL
1000 home.page_tag_title changed 0.664 [0.554, 0.795] 0.660 [0.520, 0.838] 1.154/1.275 PASS
1000 home.page_title unchanged 0.984 [0.843, 1.148] 1.022 [0.589, 1.771] 1.136/1.082 PASS
1000 mem.after_first_page memory 0.991 [0.966, 1.017] 0.991 [0.966, 1.017] 1.050/1.050 PASS
1000 mem.after_opens memory 0.999 [0.981, 1.017] 0.999 [0.981, 1.017] 1.009/1.009 PASS
1000 mem.after_search memory 1.026 [0.972, 1.083] 1.026 [0.972, 1.083] 1.058/1.058 PASS
1000 mem.idle memory 1.038 [0.985, 1.093] 1.038 [0.985, 1.093] 1.034/1.034 FAIL
1000 notes.append changed 1.506 [1.048, 2.165] 1.246 [0.671, 2.313] 1.296/1.572 FAIL
1000 notes.append.first changed 1.043 [0.511, 2.129] 1.043 [0.511, 2.129] 1.584/1.584 FAIL
1000 open.api_get changed 1.062 [0.501, 2.253] 1.245 [0.704, 2.202] 1.525/2.480 FAIL
1000 open.api_get.warm changed 1.161 [0.875, 1.539] 1.189 [0.756, 1.870] 1.530/2.529 FAIL
1000 open.long_note changed 1.554 [0.425, 5.681] 1.554 [0.425, 5.681] 1.737/1.737 FAIL
1000 open.note changed 4.291 [3.140, 5.865] 17.183 [11.249, 26.246] 1.311/1.217 FAIL
1000 search.catch_up unchanged 0.295 [0.010, 8.726] 0.295 [0.010, 8.726] 11.489/11.489 PASS
1000 search.first_query unchanged 0.818 [0.309, 2.165] 0.818 [0.309, 2.165] 1.495/1.495 PASS
1000 search.query unchanged 0.981 [0.904, 1.065] 1.015 [0.956, 1.078] 1.163/1.367 PASS
10000 home.first_page changed 1.125 [0.203, 6.215] 1.125 [0.203, 6.215] 3.002/3.002 FAIL
10000 home.page unchanged 1.116 [0.917, 1.358] 1.193 [0.312, 4.570] 1.053/2.822 FAIL
10000 home.page_big unchanged 0.990 [0.867, 1.130] 0.998 [0.801, 1.245] 1.056/1.106 PASS
10000 home.page_next unchanged 1.065 [0.935, 1.214] 1.072 [0.775, 1.482] 1.179/1.388 PASS
10000 home.page_tag changed 0.298 [0.267, 0.333] 0.257 [0.188, 0.351] 1.033/1.162 PASS
10000 home.page_tag_created changed 0.223 [0.207, 0.241] 0.273 [0.219, 0.341] 1.082/1.119 PASS
10000 home.page_tag_title changed 0.446 [0.412, 0.482] 0.560 [0.417, 0.752] 1.095/1.961 PASS
10000 home.page_title unchanged 1.042 [0.851, 1.277] 1.685 [0.552, 5.147] 1.051/1.194 FAIL
10000 mem.after_first_page memory 0.983 [0.955, 1.011] 0.983 [0.955, 1.011] 1.052/1.052 PASS
10000 mem.after_opens memory 1.012 [0.980, 1.045] 1.012 [0.980, 1.045] 1.031/1.031 PASS
10000 mem.after_search memory 1.005 [0.964, 1.048] 1.005 [0.964, 1.048] 1.064/1.064 PASS
10000 mem.idle memory 0.976 [0.932, 1.022] 0.976 [0.932, 1.022] 1.021/1.021 PASS
10000 notes.append changed 3.180 [2.305, 4.385] 2.498 [1.956, 3.189] 1.397/1.271 FAIL
10000 notes.append.first changed 2.457 [1.800, 3.354] 2.457 [1.800, 3.354] 1.623/1.623 FAIL
10000 open.api_get changed 2.334 [1.492, 3.651] 1.329 [0.652, 2.708] 1.171/1.602 FAIL
10000 open.api_get.warm changed 1.051 [0.893, 1.236] 0.985 [0.858, 1.131] 1.261/2.003 FAIL
10000 open.long_note changed 1.816 [0.712, 4.635] 1.816 [0.712, 4.635] 2.555/2.555 FAIL
10000 open.note changed 17.442 [12.263, 24.809] 7.373 [2.007, 27.094] 3.427/3.254 FAIL
10000 search.catch_up unchanged 0.998 [0.992, 1.004] 0.998 [0.992, 1.004] 1.002/1.002 PASS
10000 search.first_query unchanged 0.504 [0.138, 1.839] 0.504 [0.138, 1.839] 2.707/2.707 PASS
10000 search.query unchanged 1.046 [0.927, 1.180] 0.762 [0.339, 1.713] 1.295/1.872 PASS
100000 home.first_page changed 0.403 [0.293, 0.555] 0.403 [0.293, 0.555] 1.262/1.262 PASS
100000 home.page unchanged 0.863 [0.708, 1.053] 0.714 [0.356, 1.429] 1.136/4.568 PASS
100000 home.page_big unchanged 1.271 [1.104, 1.463] 1.497 [1.298, 1.727] 0.975/1.009 FAIL
100000 home.page_next unchanged 1.191 [1.096, 1.294] 1.617 [1.141, 2.291] 1.105/1.730 FAIL
100000 home.page_tag changed 0.280 [0.256, 0.307] 0.334 [0.285, 0.392] 1.012/1.063 PASS
100000 home.page_tag_created changed 0.199 [0.184, 0.214] 0.222 [0.194, 0.254] 0.934/0.934 PASS
100000 home.page_tag_title changed 0.296 [0.270, 0.325] 0.310 [0.256, 0.374] 1.024/0.992 PASS
100000 home.page_title unchanged 1.091 [1.032, 1.153] 1.438 [1.175, 1.760] 1.101/1.083 FAIL
100000 mem.after_first_page memory 0.859 [0.815, 0.905] 0.859 [0.815, 0.905] 1.036/1.036 PASS
100000 mem.after_opens memory 0.901 [0.790, 1.029] 0.901 [0.790, 1.029] 0.981/0.981 PASS
100000 mem.after_search memory 0.955 [0.899, 1.014] 0.955 [0.899, 1.014] 1.111/1.111 PASS
100000 mem.idle memory 1.012 [0.986, 1.039] 1.012 [0.986, 1.039] 1.148/1.148 PASS
100000 notes.append changed 52.664 [48.676, 56.979] 33.681 [31.518, 35.993] 1.094/1.135 FAIL
100000 notes.append.first changed 40.423 [36.131, 45.226] 40.423 [36.131, 45.226] 1.203/1.203 FAIL
100000 open.api_get changed 37.502 [30.086, 46.745] 14.887 [7.970, 27.808] 1.093/1.141 FAIL
100000 open.api_get.warm changed 0.941 [0.859, 1.031] 0.967 [0.826, 1.132] 0.982/1.111 FAIL
100000 open.long_note changed 2.293 [1.931, 2.722] 2.293 [1.931, 2.722] 1.090/1.090 FAIL
100000 open.note changed 35.508 [29.504, 42.733] 15.599 [8.924, 27.267] 1.143/1.188 FAIL
100000 search.catch_up unchanged 0.872 [0.517, 1.471] 0.872 [0.517, 1.471] 1.194/1.194 PASS
100000 search.first_query unchanged 0.959 [0.741, 1.240] 0.959 [0.741, 1.240] 1.132/1.132 PASS
100000 search.query unchanged 1.000 [0.897, 1.115] 0.922 [0.821, 1.036] 1.027/0.996 PASS

OVERALL FAIL

## Fresh session H1 (1k/10k/100k): s2 vs dev, a severe regression, now fixed Session H1: perf-01, 11-09 11:07–11:37 CET (15:37–16:07 IST). Both locks were held: perf-01 through `perf-turn`, perf-02 through `perf-lock`. Binaries (sha256): dev `d4b32af94` `b99ace57…6859`, s1 `381ce6750` `8b5292d6…bf0e`, s2 `eaeb417e7` `f7e5ad0f…10d0`, perf harness `b3682687…e4a2`. Each Home had its own setup. Every pair ran in the order control-a, s1, control-b, s2 (`--hot-only --reuse-indexed`, offset = pair). The gate reading is the one in the earlier comment: changed paths need a 95% upper bound below 1.00; unchanged paths need the point ratio no higher than the control's upper bound (or 1.00 if higher). Before H1, I deleted the predecessor's stale fixtures (96 GB `work-head841`, 18 GB of `abab-20261107` Homes; reports kept). That took 7 min at the start of the turn. **At `eaeb417e7`, s2 was much slower than dev, and it got worse with Home size:** | p50 v3/dev | 1k | 10k | 100k | |---|---:|---:|---:| | notes.append | 1.51× | 3.18× | **52.7×** | | open.note | 4.29× | 17.4× | **35.5×** | | open.api_get | 1.06× | 2.33× | **37.5×** | **Root cause.** The `notes_tag_order_refresh` trigger runs on every update of a note's `updated`, `created` or `title_key`, which every append or metadata refresh does. It ran `UPDATE tag_order … WHERE id = NEW.id`. `tag_order`'s key is `(tag, id)` and nothing indexes `id` alone, so each note write scanned every order row: 446k at 100k notes. **Fix**, two commits: - `6addfc4ea` (RED): `tag_order_refresh_cost_does_not_grow_with_other_notes` counts the SQLite VM steps of one note's update with 1 and with 3,000 other tagged notes. On dev-01: *refresh steps grew from 206 to 42192*. - `ee00d638c` (GREEN): the trigger now matches `WHERE tag IN (SELECT tag FROM tags WHERE id = NEW.id) AND id = NEW.id`. That goes through `tags_by_id` and the `(tag, id)` key, with no new index and so no extra write cost. The trigger is dropped and recreated on open, so v7 stores made before this fix pick it up. The test passes. Gates at `ee00d638c` (dev-01, `nix develop`, `~/bin/slot`): `cargo fmt --all --check` PASS; `cargo clippy -j4 --workspace --all-targets --locked -- -D warnings` PASS; `cargo test -j4 --workspace --locked --no-fail-fast -- --test-threads=2` PASS, 1,661 passed, 0 failed, 22 ignored. Release `calternal` sha256 `84e5efcb…17d6`, staged on perf-01. A re-run turn (control-a, s2fix, control-b; 1k/10k/100k) is queued in `perf-turn`. <details><summary>Full gate table at the old head eaeb417e7 (s2)</summary> | size | path | kind | s2/dev p50 [CI] | s2/dev p95 [CI] | control UCB p50/p95 | verdict | |---|---|---|---|---|---|---| | 1000 | home.first_page | changed | 0.785 [0.479, 1.286] | 0.785 [0.479, 1.286] | 1.392/1.392 | **FAIL** | | 1000 | home.page | unchanged | 0.985 [0.799, 1.214] | 1.025 [0.537, 1.960] | 1.088/2.375 | PASS | | 1000 | home.page_big | unchanged | 1.100 [0.935, 1.295] | 1.100 [0.935, 1.295] | 1.111/1.111 | PASS | | 1000 | home.page_next | unchanged | 1.106 [0.902, 1.356] | 1.202 [0.712, 2.027] | 1.214/1.568 | PASS | | 1000 | home.page_tag | changed | 0.587 [0.476, 0.725] | 0.564 [0.391, 0.814] | 1.253/1.489 | PASS | | 1000 | home.page_tag_created | changed | 0.570 [0.458, 0.709] | 0.693 [0.401, 1.196] | 1.205/1.755 | **FAIL** | | 1000 | home.page_tag_title | changed | 0.664 [0.554, 0.795] | 0.660 [0.520, 0.838] | 1.154/1.275 | PASS | | 1000 | home.page_title | unchanged | 0.984 [0.843, 1.148] | 1.022 [0.589, 1.771] | 1.136/1.082 | PASS | | 1000 | mem.after_first_page | memory | 0.991 [0.966, 1.017] | 0.991 [0.966, 1.017] | 1.050/1.050 | PASS | | 1000 | mem.after_opens | memory | 0.999 [0.981, 1.017] | 0.999 [0.981, 1.017] | 1.009/1.009 | PASS | | 1000 | mem.after_search | memory | 1.026 [0.972, 1.083] | 1.026 [0.972, 1.083] | 1.058/1.058 | PASS | | 1000 | mem.idle | memory | 1.038 [0.985, 1.093] | 1.038 [0.985, 1.093] | 1.034/1.034 | **FAIL** | | 1000 | notes.append | changed | 1.506 [1.048, 2.165] | 1.246 [0.671, 2.313] | 1.296/1.572 | **FAIL** | | 1000 | notes.append.first | changed | 1.043 [0.511, 2.129] | 1.043 [0.511, 2.129] | 1.584/1.584 | **FAIL** | | 1000 | open.api_get | changed | 1.062 [0.501, 2.253] | 1.245 [0.704, 2.202] | 1.525/2.480 | **FAIL** | | 1000 | open.api_get.warm | changed | 1.161 [0.875, 1.539] | 1.189 [0.756, 1.870] | 1.530/2.529 | **FAIL** | | 1000 | open.long_note | changed | 1.554 [0.425, 5.681] | 1.554 [0.425, 5.681] | 1.737/1.737 | **FAIL** | | 1000 | open.note | changed | 4.291 [3.140, 5.865] | 17.183 [11.249, 26.246] | 1.311/1.217 | **FAIL** | | 1000 | search.catch_up | unchanged | 0.295 [0.010, 8.726] | 0.295 [0.010, 8.726] | 11.489/11.489 | PASS | | 1000 | search.first_query | unchanged | 0.818 [0.309, 2.165] | 0.818 [0.309, 2.165] | 1.495/1.495 | PASS | | 1000 | search.query | unchanged | 0.981 [0.904, 1.065] | 1.015 [0.956, 1.078] | 1.163/1.367 | PASS | | 10000 | home.first_page | changed | 1.125 [0.203, 6.215] | 1.125 [0.203, 6.215] | 3.002/3.002 | **FAIL** | | 10000 | home.page | unchanged | 1.116 [0.917, 1.358] | 1.193 [0.312, 4.570] | 1.053/2.822 | **FAIL** | | 10000 | home.page_big | unchanged | 0.990 [0.867, 1.130] | 0.998 [0.801, 1.245] | 1.056/1.106 | PASS | | 10000 | home.page_next | unchanged | 1.065 [0.935, 1.214] | 1.072 [0.775, 1.482] | 1.179/1.388 | PASS | | 10000 | home.page_tag | changed | 0.298 [0.267, 0.333] | 0.257 [0.188, 0.351] | 1.033/1.162 | PASS | | 10000 | home.page_tag_created | changed | 0.223 [0.207, 0.241] | 0.273 [0.219, 0.341] | 1.082/1.119 | PASS | | 10000 | home.page_tag_title | changed | 0.446 [0.412, 0.482] | 0.560 [0.417, 0.752] | 1.095/1.961 | PASS | | 10000 | home.page_title | unchanged | 1.042 [0.851, 1.277] | 1.685 [0.552, 5.147] | 1.051/1.194 | **FAIL** | | 10000 | mem.after_first_page | memory | 0.983 [0.955, 1.011] | 0.983 [0.955, 1.011] | 1.052/1.052 | PASS | | 10000 | mem.after_opens | memory | 1.012 [0.980, 1.045] | 1.012 [0.980, 1.045] | 1.031/1.031 | PASS | | 10000 | mem.after_search | memory | 1.005 [0.964, 1.048] | 1.005 [0.964, 1.048] | 1.064/1.064 | PASS | | 10000 | mem.idle | memory | 0.976 [0.932, 1.022] | 0.976 [0.932, 1.022] | 1.021/1.021 | PASS | | 10000 | notes.append | changed | 3.180 [2.305, 4.385] | 2.498 [1.956, 3.189] | 1.397/1.271 | **FAIL** | | 10000 | notes.append.first | changed | 2.457 [1.800, 3.354] | 2.457 [1.800, 3.354] | 1.623/1.623 | **FAIL** | | 10000 | open.api_get | changed | 2.334 [1.492, 3.651] | 1.329 [0.652, 2.708] | 1.171/1.602 | **FAIL** | | 10000 | open.api_get.warm | changed | 1.051 [0.893, 1.236] | 0.985 [0.858, 1.131] | 1.261/2.003 | **FAIL** | | 10000 | open.long_note | changed | 1.816 [0.712, 4.635] | 1.816 [0.712, 4.635] | 2.555/2.555 | **FAIL** | | 10000 | open.note | changed | 17.442 [12.263, 24.809] | 7.373 [2.007, 27.094] | 3.427/3.254 | **FAIL** | | 10000 | search.catch_up | unchanged | 0.998 [0.992, 1.004] | 0.998 [0.992, 1.004] | 1.002/1.002 | PASS | | 10000 | search.first_query | unchanged | 0.504 [0.138, 1.839] | 0.504 [0.138, 1.839] | 2.707/2.707 | PASS | | 10000 | search.query | unchanged | 1.046 [0.927, 1.180] | 0.762 [0.339, 1.713] | 1.295/1.872 | PASS | | 100000 | home.first_page | changed | 0.403 [0.293, 0.555] | 0.403 [0.293, 0.555] | 1.262/1.262 | PASS | | 100000 | home.page | unchanged | 0.863 [0.708, 1.053] | 0.714 [0.356, 1.429] | 1.136/4.568 | PASS | | 100000 | home.page_big | unchanged | 1.271 [1.104, 1.463] | 1.497 [1.298, 1.727] | 0.975/1.009 | **FAIL** | | 100000 | home.page_next | unchanged | 1.191 [1.096, 1.294] | 1.617 [1.141, 2.291] | 1.105/1.730 | **FAIL** | | 100000 | home.page_tag | changed | 0.280 [0.256, 0.307] | 0.334 [0.285, 0.392] | 1.012/1.063 | PASS | | 100000 | home.page_tag_created | changed | 0.199 [0.184, 0.214] | 0.222 [0.194, 0.254] | 0.934/0.934 | PASS | | 100000 | home.page_tag_title | changed | 0.296 [0.270, 0.325] | 0.310 [0.256, 0.374] | 1.024/0.992 | PASS | | 100000 | home.page_title | unchanged | 1.091 [1.032, 1.153] | 1.438 [1.175, 1.760] | 1.101/1.083 | **FAIL** | | 100000 | mem.after_first_page | memory | 0.859 [0.815, 0.905] | 0.859 [0.815, 0.905] | 1.036/1.036 | PASS | | 100000 | mem.after_opens | memory | 0.901 [0.790, 1.029] | 0.901 [0.790, 1.029] | 0.981/0.981 | PASS | | 100000 | mem.after_search | memory | 0.955 [0.899, 1.014] | 0.955 [0.899, 1.014] | 1.111/1.111 | PASS | | 100000 | mem.idle | memory | 1.012 [0.986, 1.039] | 1.012 [0.986, 1.039] | 1.148/1.148 | PASS | | 100000 | notes.append | changed | 52.664 [48.676, 56.979] | 33.681 [31.518, 35.993] | 1.094/1.135 | **FAIL** | | 100000 | notes.append.first | changed | 40.423 [36.131, 45.226] | 40.423 [36.131, 45.226] | 1.203/1.203 | **FAIL** | | 100000 | open.api_get | changed | 37.502 [30.086, 46.745] | 14.887 [7.970, 27.808] | 1.093/1.141 | **FAIL** | | 100000 | open.api_get.warm | changed | 0.941 [0.859, 1.031] | 0.967 [0.826, 1.132] | 0.982/1.111 | **FAIL** | | 100000 | open.long_note | changed | 2.293 [1.931, 2.722] | 2.293 [1.931, 2.722] | 1.090/1.090 | **FAIL** | | 100000 | open.note | changed | 35.508 [29.504, 42.733] | 15.599 [8.924, 27.267] | 1.143/1.188 | **FAIL** | | 100000 | search.catch_up | unchanged | 0.872 [0.517, 1.471] | 0.872 [0.517, 1.471] | 1.194/1.194 | PASS | | 100000 | search.first_query | unchanged | 0.959 [0.741, 1.240] | 0.959 [0.741, 1.240] | 1.132/1.132 | PASS | | 100000 | search.query | unchanged | 1.000 [0.897, 1.115] | 0.922 [0.821, 1.036] | 1.027/0.996 | PASS | OVERALL FAIL </details>
Author
Owner

H1b: the append scan is fixed; open-time schema rewrite found and fixed

Session H1b: perf-01, 11-09 16:48–16:54 CET (21:18–21:24 IST). Both locks were held: perf-01 through perf-turn, perf-02 through perf-lock. The Homes from H1 were reused (no new setups). Pairs ran in the order control-a, s1, control-b, s2fix (ee00d638c, sha256 84e5efcb…17d6), at offsets 0–4.

At ee00d638c the notes.append scan is gone (100k p50 1.048, was 52.7×). Two problems remained:

p50 s2/dev 1k 10k 100k
home.first_page 5.05 4.23 1.95
open.note 1.30 1.57 1.97
open.api_get 1.22 1.35 1.65
home.page_big (untagged) — 1.08 5.36

Cause of the first-request and open slowdowns: the ee00d638c fix ran DROP TRIGGER + CREATE TRIGGER on every store open. Each open rewrote the schema, which bumps schema_version and makes every connection re-prepare right after start.

  • 5dd3419bb (RED): reopening_a_current_store_leaves_its_schema_untouched. On dev-01: left: 24, right: 22.
  • 29cb41838 (GREEN): the fixed trigger has a new name, notes_tag_order_refresh_by_tag, created only if missing. Dropping the old name is a no-op once it's gone, so later opens never write the schema.

Gates at 29cb41838 (dev-01): fmt PASS, clippy -D warnings PASS, cargo test --workspace --no-fail-fast 1,662 passed, 0 failed, 22 ignored. Release sha256 e651f991….

Untagged page_big 5.36× at 100k: the perf-01 s2 Home had been built and then put through 20 append runs by the old binary. On fresh 100k Homes on dev-01 (5 pairs, s2 vs s1, both v3 layouts, loaded host, direction only), at 29cb41838:

Path @100k s2/s1 p50 [95% CI]
home.page_tag 0.275 [0.205, 0.368]
home.page_tag_created 0.239 [0.162, 0.354]
home.page_tag_title 0.479 [0.327, 0.701]
home.first_page 0.979 [0.299, 3.202]
open.note 0.478 [0.330, 0.691]
home.page_big 1.679 [1.188, 2.373]
notes.append (p95) 1.232 [1.034, 1.470]

The page_big query plan is identical on both Homes (SCAN n USING INDEX notes_updated), and the raw query takes 22 ms on the s2 store vs 106 ms on the s1 store. The s2 meta.db is 14 % larger (236,746 vs 206,921 pages, from tag_order and its three indexes), so cache pressure is the likely cause; that's unconfirmed. Next turn (H1c, queued) builds a fresh s2 Home on perf-01 with 29cb41838 and measures control-a, s2, control-b at 1k/10k/100k.

Gate table (s2fix `ee00d638c`, H1b)
size path kind s2/dev p50 [CI] s2/dev p95 [CI] control UCB p50/p95 verdict
1000 home.first_page changed 5.046 [1.946, 13.082] 5.046 [1.946, 13.082] 1.121/1.121 FAIL
1000 home.page unchanged 0.960 [0.854, 1.080] 0.920 [0.713, 1.187] 1.109/2.003 PASS
1000 home.page_big unchanged 0.960 [0.925, 0.997] 0.960 [0.925, 0.997] 1.185/1.185 PASS
1000 home.page_next unchanged 0.994 [0.949, 1.041] 1.028 [0.747, 1.413] 1.031/1.213 PASS
1000 home.page_tag changed 0.681 [0.612, 0.758] 0.771 [0.464, 1.284] 1.127/1.497 FAIL
1000 home.page_tag_created changed 0.575 [0.508, 0.650] 0.777 [0.402, 1.503] 1.062/1.124 FAIL
1000 home.page_tag_title changed 0.651 [0.615, 0.689] 0.646 [0.598, 0.698] 1.085/1.166 PASS
1000 home.page_title unchanged 1.013 [0.962, 1.066] 0.996 [0.919, 1.080] 1.198/1.384 PASS
1000 mem.after_first_page memory 0.951 [0.937, 0.964] 0.951 [0.937, 0.964] 1.024/1.024 PASS
1000 mem.after_opens memory 0.999 [0.976, 1.023] 0.999 [0.976, 1.023] 1.014/1.014 PASS
1000 mem.after_search memory 1.003 [0.971, 1.035] 1.003 [0.971, 1.035] 1.072/1.072 PASS
1000 mem.idle memory 0.990 [0.939, 1.043] 0.990 [0.939, 1.043] 1.042/1.042 PASS
1000 notes.append changed 1.059 [0.964, 1.164] 1.267 [0.873, 1.838] 1.047/1.089 FAIL
1000 notes.append.first changed 1.257 [0.451, 3.499] 1.257 [0.451, 3.499] 2.589/2.589 FAIL
1000 open.api_get changed 1.216 [1.107, 1.336] 0.963 [0.710, 1.305] 1.093/1.235 FAIL
1000 open.api_get.warm changed 0.965 [0.870, 1.071] 0.964 [0.840, 1.107] 1.104/1.224 FAIL
1000 open.long_note changed 1.217 [0.470, 3.153] 1.217 [0.470, 3.153] 1.339/1.339 FAIL
1000 open.note changed 1.302 [1.097, 1.545] 1.957 [1.309, 2.927] 1.225/1.166 FAIL
1000 search.catch_up unchanged 1.000 [0.999, 1.000] 1.000 [0.999, 1.000] 1.001/1.001 PASS
1000 search.first_query unchanged 0.971 [0.738, 1.277] 0.971 [0.738, 1.277] 1.423/1.423 PASS
1000 search.query unchanged 0.972 [0.908, 1.041] 1.023 [0.842, 1.242] 1.106/1.102 PASS
10000 home.first_page changed 4.232 [2.065, 8.675] 4.232 [2.065, 8.675] 1.574/1.574 FAIL
10000 home.page unchanged 1.087 [0.874, 1.351] 0.997 [0.366, 2.715] 1.162/1.723 PASS
10000 home.page_big unchanged 1.076 [0.964, 1.200] 1.883 [1.179, 3.010] 1.044/1.150 FAIL
10000 home.page_next unchanged 1.373 [1.231, 1.531] 2.078 [1.532, 2.818] 1.157/1.257 FAIL
10000 home.page_tag changed 0.325 [0.306, 0.345] 0.319 [0.275, 0.370] 1.060/1.130 PASS
10000 home.page_tag_created changed 0.215 [0.196, 0.236] 0.241 [0.200, 0.290] 1.047/1.116 PASS
10000 home.page_tag_title changed 0.401 [0.371, 0.434] 0.499 [0.457, 0.544] 1.093/1.449 PASS
10000 home.page_title unchanged 1.199 [1.105, 1.302] 1.104 [0.673, 1.813] 1.116/3.605 FAIL
10000 mem.after_first_page memory 0.992 [0.960, 1.024] 0.992 [0.960, 1.024] 1.028/1.028 PASS
10000 mem.after_opens memory 1.010 [0.926, 1.101] 1.010 [0.926, 1.101] 1.088/1.088 PASS
10000 mem.after_search memory 1.019 [0.974, 1.065] 1.019 [0.974, 1.065] 1.051/1.051 PASS
10000 mem.idle memory 0.999 [0.954, 1.046] 0.999 [0.954, 1.046] 1.024/1.024 PASS
10000 notes.append changed 1.021 [0.943, 1.104] 1.135 [0.715, 1.800] 1.061/1.286 FAIL
10000 notes.append.first changed 1.217 [0.673, 2.201] 1.217 [0.673, 2.201] 1.804/1.804 FAIL
10000 open.api_get changed 1.347 [1.080, 1.681] 1.324 [0.863, 2.031] 1.176/1.229 FAIL
10000 open.api_get.warm changed 1.032 [0.966, 1.101] 0.983 [0.882, 1.094] 1.060/1.020 FAIL
10000 open.long_note changed 1.132 [0.765, 1.674] 1.132 [0.765, 1.674] 1.128/1.128 FAIL
10000 open.note changed 1.571 [1.185, 2.082] 1.853 [1.048, 3.274] 1.178/1.120 FAIL
10000 search.catch_up unchanged 1.000 [0.999, 1.001] 1.000 [0.999, 1.001] 1.000/1.000 FAIL
10000 search.first_query unchanged 0.921 [0.708, 1.198] 0.921 [0.708, 1.198] 1.150/1.150 PASS
10000 search.query unchanged 1.004 [0.950, 1.061] 0.882 [0.696, 1.117] 1.117/1.311 PASS
100000 home.first_page changed 1.948 [0.940, 4.036] 1.948 [0.940, 4.036] 1.034/1.034 FAIL
100000 home.page unchanged 0.864 [0.674, 1.108] 0.636 [0.264, 1.534] 1.226/1.287 PASS
100000 home.page_big unchanged 5.362 [4.283, 6.711] 7.008 [5.654, 8.687] 0.999/0.861 FAIL
100000 home.page_next unchanged 1.461 [1.134, 1.883] 1.578 [1.134, 2.196] 1.040/1.189 FAIL
100000 home.page_tag changed 0.282 [0.266, 0.299] 0.338 [0.297, 0.385] 1.027/1.150 PASS
100000 home.page_tag_created changed 0.201 [0.189, 0.213] 0.211 [0.197, 0.227] 0.967/0.994 PASS
100000 home.page_tag_title changed 0.301 [0.289, 0.315] 0.319 [0.278, 0.365] 1.021/1.005 PASS
100000 home.page_title unchanged 0.934 [0.667, 1.308] 1.089 [0.295, 4.028] 1.286/1.684 PASS
100000 mem.after_first_page memory 0.935 [0.812, 1.077] 0.935 [0.812, 1.077] 1.041/1.041 PASS
100000 mem.after_opens memory 0.953 [0.890, 1.021] 0.953 [0.890, 1.021] 1.020/1.020 PASS
100000 mem.after_search memory 0.924 [0.842, 1.014] 0.924 [0.842, 1.014] 1.238/1.238 PASS
100000 mem.idle memory 0.997 [0.958, 1.038] 0.997 [0.958, 1.038] 1.121/1.121 PASS
100000 notes.append changed 1.048 [0.996, 1.102] 1.000 [0.792, 1.262] 1.064/1.017 FAIL
100000 notes.append.first changed 1.096 [1.019, 1.179] 1.096 [1.019, 1.179] 1.672/1.672 FAIL
100000 open.api_get changed 1.648 [1.325, 2.050] 1.583 [0.617, 4.066] 0.939/1.270 FAIL
100000 open.api_get.warm changed 0.988 [0.872, 1.119] 1.012 [0.856, 1.197] 1.166/1.183 FAIL
100000 open.long_note changed 1.085 [0.960, 1.226] 1.085 [0.960, 1.226] 1.055/1.055 FAIL
100000 open.note changed 1.969 [1.626, 2.384] 2.943 [1.484, 5.835] 0.941/1.033 FAIL
100000 search.catch_up unchanged 0.998 [0.994, 1.002] 0.998 [0.994, 1.002] 0.844/0.844 PASS
100000 search.first_query unchanged 1.151 [0.555, 2.384] 1.151 [0.555, 2.384] 1.996/1.996 PASS
100000 search.query unchanged 0.984 [0.969, 0.999] 0.953 [0.832, 1.091] 1.125/1.179 PASS

OVERALL FAIL

## H1b: the append scan is fixed; open-time schema rewrite found and fixed Session H1b: perf-01, 11-09 16:48–16:54 CET (21:18–21:24 IST). Both locks were held: perf-01 through `perf-turn`, perf-02 through `perf-lock`. The Homes from H1 were reused (no new setups). Pairs ran in the order control-a, s1, control-b, s2fix (`ee00d638c`, sha256 `84e5efcb…17d6`), at offsets 0–4. At `ee00d638c` the `notes.append` scan is gone (100k p50 1.048, was 52.7×). Two problems remained: | p50 s2/dev | 1k | 10k | 100k | |---|---:|---:|---:| | home.first_page | 5.05 | 4.23 | 1.95 | | open.note | 1.30 | 1.57 | 1.97 | | open.api_get | 1.22 | 1.35 | 1.65 | | home.page_big (untagged) | — | 1.08 | 5.36 | **Cause of the first-request and open slowdowns:** the `ee00d638c` fix ran `DROP TRIGGER` + `CREATE TRIGGER` on every store open. Each open rewrote the schema, which bumps `schema_version` and makes every connection re-prepare right after start. - `5dd3419bb` (RED): `reopening_a_current_store_leaves_its_schema_untouched`. On dev-01: `left: 24, right: 22`. - `29cb41838` (GREEN): the fixed trigger has a new name, `notes_tag_order_refresh_by_tag`, created only if missing. Dropping the old name is a no-op once it's gone, so later opens never write the schema. Gates at `29cb41838` (dev-01): fmt PASS, clippy `-D warnings` PASS, `cargo test --workspace --no-fail-fast` 1,662 passed, 0 failed, 22 ignored. Release sha256 `e651f991…`. **Untagged `page_big` 5.36× at 100k:** the perf-01 s2 Home had been built and then put through 20 append runs by the old binary. On fresh 100k Homes on dev-01 (5 pairs, s2 vs s1, both v3 layouts, loaded host, direction only), at `29cb41838`: | Path @100k | s2/s1 p50 [95% CI] | |---|---| | home.page_tag | 0.275 [0.205, 0.368] | | home.page_tag_created | 0.239 [0.162, 0.354] | | home.page_tag_title | 0.479 [0.327, 0.701] | | home.first_page | 0.979 [0.299, 3.202] | | open.note | 0.478 [0.330, 0.691] | | home.page_big | 1.679 [1.188, 2.373] | | notes.append (p95) | 1.232 [1.034, 1.470] | The `page_big` query plan is identical on both Homes (`SCAN n USING INDEX notes_updated`), and the raw query takes 22 ms on the s2 store vs 106 ms on the s1 store. The s2 `meta.db` is 14 % larger (236,746 vs 206,921 pages, from `tag_order` and its three indexes), so cache pressure is the likely cause; that's unconfirmed. Next turn (H1c, queued) builds a **fresh** s2 Home on perf-01 with `29cb41838` and measures control-a, s2, control-b at 1k/10k/100k. <details><summary>Gate table (s2fix `ee00d638c`, H1b)</summary> | size | path | kind | s2/dev p50 [CI] | s2/dev p95 [CI] | control UCB p50/p95 | verdict | |---|---|---|---|---|---|---| | 1000 | home.first_page | changed | 5.046 [1.946, 13.082] | 5.046 [1.946, 13.082] | 1.121/1.121 | **FAIL** | | 1000 | home.page | unchanged | 0.960 [0.854, 1.080] | 0.920 [0.713, 1.187] | 1.109/2.003 | PASS | | 1000 | home.page_big | unchanged | 0.960 [0.925, 0.997] | 0.960 [0.925, 0.997] | 1.185/1.185 | PASS | | 1000 | home.page_next | unchanged | 0.994 [0.949, 1.041] | 1.028 [0.747, 1.413] | 1.031/1.213 | PASS | | 1000 | home.page_tag | changed | 0.681 [0.612, 0.758] | 0.771 [0.464, 1.284] | 1.127/1.497 | **FAIL** | | 1000 | home.page_tag_created | changed | 0.575 [0.508, 0.650] | 0.777 [0.402, 1.503] | 1.062/1.124 | **FAIL** | | 1000 | home.page_tag_title | changed | 0.651 [0.615, 0.689] | 0.646 [0.598, 0.698] | 1.085/1.166 | PASS | | 1000 | home.page_title | unchanged | 1.013 [0.962, 1.066] | 0.996 [0.919, 1.080] | 1.198/1.384 | PASS | | 1000 | mem.after_first_page | memory | 0.951 [0.937, 0.964] | 0.951 [0.937, 0.964] | 1.024/1.024 | PASS | | 1000 | mem.after_opens | memory | 0.999 [0.976, 1.023] | 0.999 [0.976, 1.023] | 1.014/1.014 | PASS | | 1000 | mem.after_search | memory | 1.003 [0.971, 1.035] | 1.003 [0.971, 1.035] | 1.072/1.072 | PASS | | 1000 | mem.idle | memory | 0.990 [0.939, 1.043] | 0.990 [0.939, 1.043] | 1.042/1.042 | PASS | | 1000 | notes.append | changed | 1.059 [0.964, 1.164] | 1.267 [0.873, 1.838] | 1.047/1.089 | **FAIL** | | 1000 | notes.append.first | changed | 1.257 [0.451, 3.499] | 1.257 [0.451, 3.499] | 2.589/2.589 | **FAIL** | | 1000 | open.api_get | changed | 1.216 [1.107, 1.336] | 0.963 [0.710, 1.305] | 1.093/1.235 | **FAIL** | | 1000 | open.api_get.warm | changed | 0.965 [0.870, 1.071] | 0.964 [0.840, 1.107] | 1.104/1.224 | **FAIL** | | 1000 | open.long_note | changed | 1.217 [0.470, 3.153] | 1.217 [0.470, 3.153] | 1.339/1.339 | **FAIL** | | 1000 | open.note | changed | 1.302 [1.097, 1.545] | 1.957 [1.309, 2.927] | 1.225/1.166 | **FAIL** | | 1000 | search.catch_up | unchanged | 1.000 [0.999, 1.000] | 1.000 [0.999, 1.000] | 1.001/1.001 | PASS | | 1000 | search.first_query | unchanged | 0.971 [0.738, 1.277] | 0.971 [0.738, 1.277] | 1.423/1.423 | PASS | | 1000 | search.query | unchanged | 0.972 [0.908, 1.041] | 1.023 [0.842, 1.242] | 1.106/1.102 | PASS | | 10000 | home.first_page | changed | 4.232 [2.065, 8.675] | 4.232 [2.065, 8.675] | 1.574/1.574 | **FAIL** | | 10000 | home.page | unchanged | 1.087 [0.874, 1.351] | 0.997 [0.366, 2.715] | 1.162/1.723 | PASS | | 10000 | home.page_big | unchanged | 1.076 [0.964, 1.200] | 1.883 [1.179, 3.010] | 1.044/1.150 | **FAIL** | | 10000 | home.page_next | unchanged | 1.373 [1.231, 1.531] | 2.078 [1.532, 2.818] | 1.157/1.257 | **FAIL** | | 10000 | home.page_tag | changed | 0.325 [0.306, 0.345] | 0.319 [0.275, 0.370] | 1.060/1.130 | PASS | | 10000 | home.page_tag_created | changed | 0.215 [0.196, 0.236] | 0.241 [0.200, 0.290] | 1.047/1.116 | PASS | | 10000 | home.page_tag_title | changed | 0.401 [0.371, 0.434] | 0.499 [0.457, 0.544] | 1.093/1.449 | PASS | | 10000 | home.page_title | unchanged | 1.199 [1.105, 1.302] | 1.104 [0.673, 1.813] | 1.116/3.605 | **FAIL** | | 10000 | mem.after_first_page | memory | 0.992 [0.960, 1.024] | 0.992 [0.960, 1.024] | 1.028/1.028 | PASS | | 10000 | mem.after_opens | memory | 1.010 [0.926, 1.101] | 1.010 [0.926, 1.101] | 1.088/1.088 | PASS | | 10000 | mem.after_search | memory | 1.019 [0.974, 1.065] | 1.019 [0.974, 1.065] | 1.051/1.051 | PASS | | 10000 | mem.idle | memory | 0.999 [0.954, 1.046] | 0.999 [0.954, 1.046] | 1.024/1.024 | PASS | | 10000 | notes.append | changed | 1.021 [0.943, 1.104] | 1.135 [0.715, 1.800] | 1.061/1.286 | **FAIL** | | 10000 | notes.append.first | changed | 1.217 [0.673, 2.201] | 1.217 [0.673, 2.201] | 1.804/1.804 | **FAIL** | | 10000 | open.api_get | changed | 1.347 [1.080, 1.681] | 1.324 [0.863, 2.031] | 1.176/1.229 | **FAIL** | | 10000 | open.api_get.warm | changed | 1.032 [0.966, 1.101] | 0.983 [0.882, 1.094] | 1.060/1.020 | **FAIL** | | 10000 | open.long_note | changed | 1.132 [0.765, 1.674] | 1.132 [0.765, 1.674] | 1.128/1.128 | **FAIL** | | 10000 | open.note | changed | 1.571 [1.185, 2.082] | 1.853 [1.048, 3.274] | 1.178/1.120 | **FAIL** | | 10000 | search.catch_up | unchanged | 1.000 [0.999, 1.001] | 1.000 [0.999, 1.001] | 1.000/1.000 | **FAIL** | | 10000 | search.first_query | unchanged | 0.921 [0.708, 1.198] | 0.921 [0.708, 1.198] | 1.150/1.150 | PASS | | 10000 | search.query | unchanged | 1.004 [0.950, 1.061] | 0.882 [0.696, 1.117] | 1.117/1.311 | PASS | | 100000 | home.first_page | changed | 1.948 [0.940, 4.036] | 1.948 [0.940, 4.036] | 1.034/1.034 | **FAIL** | | 100000 | home.page | unchanged | 0.864 [0.674, 1.108] | 0.636 [0.264, 1.534] | 1.226/1.287 | PASS | | 100000 | home.page_big | unchanged | 5.362 [4.283, 6.711] | 7.008 [5.654, 8.687] | 0.999/0.861 | **FAIL** | | 100000 | home.page_next | unchanged | 1.461 [1.134, 1.883] | 1.578 [1.134, 2.196] | 1.040/1.189 | **FAIL** | | 100000 | home.page_tag | changed | 0.282 [0.266, 0.299] | 0.338 [0.297, 0.385] | 1.027/1.150 | PASS | | 100000 | home.page_tag_created | changed | 0.201 [0.189, 0.213] | 0.211 [0.197, 0.227] | 0.967/0.994 | PASS | | 100000 | home.page_tag_title | changed | 0.301 [0.289, 0.315] | 0.319 [0.278, 0.365] | 1.021/1.005 | PASS | | 100000 | home.page_title | unchanged | 0.934 [0.667, 1.308] | 1.089 [0.295, 4.028] | 1.286/1.684 | PASS | | 100000 | mem.after_first_page | memory | 0.935 [0.812, 1.077] | 0.935 [0.812, 1.077] | 1.041/1.041 | PASS | | 100000 | mem.after_opens | memory | 0.953 [0.890, 1.021] | 0.953 [0.890, 1.021] | 1.020/1.020 | PASS | | 100000 | mem.after_search | memory | 0.924 [0.842, 1.014] | 0.924 [0.842, 1.014] | 1.238/1.238 | PASS | | 100000 | mem.idle | memory | 0.997 [0.958, 1.038] | 0.997 [0.958, 1.038] | 1.121/1.121 | PASS | | 100000 | notes.append | changed | 1.048 [0.996, 1.102] | 1.000 [0.792, 1.262] | 1.064/1.017 | **FAIL** | | 100000 | notes.append.first | changed | 1.096 [1.019, 1.179] | 1.096 [1.019, 1.179] | 1.672/1.672 | **FAIL** | | 100000 | open.api_get | changed | 1.648 [1.325, 2.050] | 1.583 [0.617, 4.066] | 0.939/1.270 | **FAIL** | | 100000 | open.api_get.warm | changed | 0.988 [0.872, 1.119] | 1.012 [0.856, 1.197] | 1.166/1.183 | **FAIL** | | 100000 | open.long_note | changed | 1.085 [0.960, 1.226] | 1.085 [0.960, 1.226] | 1.055/1.055 | **FAIL** | | 100000 | open.note | changed | 1.969 [1.626, 2.384] | 2.943 [1.484, 5.835] | 0.941/1.033 | **FAIL** | | 100000 | search.catch_up | unchanged | 0.998 [0.994, 1.002] | 0.998 [0.994, 1.002] | 0.844/0.844 | PASS | | 100000 | search.first_query | unchanged | 1.151 [0.555, 2.384] | 1.151 [0.555, 2.384] | 1.996/1.996 | PASS | | 100000 | search.query | unchanged | 0.984 [0.969, 0.999] | 0.953 [0.832, 1.091] | 1.125/1.179 | PASS | OVERALL FAIL </details>
Some checks failed
CI / server (pull_request) Has been cancelled
CI / rust (pull_request) Has been cancelled
CI / web (pull_request) Has been cancelled
Markdown extraction contract / markdown-native-contract (pull_request) Has been cancelled
Markdown extraction contract / markdown-editor-contract (pull_request) Has been cancelled
This pull request is broken due to missing fork information.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin feat/tiering-v3-s2-tags:feat/tiering-v3-s2-tags
git switch feat/tiering-v3-s2-tags

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch feat/tiering-v3-s1-namespace
git merge --no-ff feat/tiering-v3-s2-tags
git switch feat/tiering-v3-s2-tags
git rebase feat/tiering-v3-s1-namespace
git switch feat/tiering-v3-s1-namespace
git merge --ff-only feat/tiering-v3-s2-tags
git switch feat/tiering-v3-s2-tags
git rebase feat/tiering-v3-s1-namespace
git switch feat/tiering-v3-s1-namespace
git merge --no-ff feat/tiering-v3-s2-tags
git switch feat/tiering-v3-s1-namespace
git merge --squash feat/tiering-v3-s2-tags
git switch feat/tiering-v3-s1-namespace
git merge --ff-only feat/tiering-v3-s2-tags
git switch feat/tiering-v3-s1-namespace
git merge feat/tiering-v3-s2-tags
git push origin feat/tiering-v3-s1-namespace
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/calternal!1008
No description provided.