storage: tiering qualification fixtures and specification models (#761 D) #793
Closed
kayg
wants to merge 18 commits from
feat/tiering-761-d-scale into feat/tiering-761-c-index
pull from: feat/tiering-761-d-scale
merge into: kayg:feat/tiering-761-c-index
kayg:main
kayg:feat/style-sheet-fixes
kayg:storage/wal-checkpoint-off-save-1051
kayg:t3/paged-search-reconcile-final
kayg:feat/pass8
kayg:review/calendar-2
kayg:fix/shared-row-swipes
kayg:feat/contrast
kayg:dev
kayg:feat/collections-db
kayg:fix/instant-keys-1056
kayg:feat/money-round
kayg:perf/stalls-1054
kayg:wip/tiering-v3-cold4
kayg:wip/tiering-v3-cold5
kayg:port/rows-actions
kayg:port/rows-drop
kayg:port/hidden-blocks
kayg:port/rows
kayg:port/port-tables
kayg:port/port-tables-2
kayg:t3/mail-1011-liveness
kayg:port/devices
kayg:port/port-attachments
kayg:port/port-attachments-2
kayg:port/port-attachments-3
kayg:docs/design-consistency
kayg:docs/engineering-standards
kayg:fix/rusqlite-0.41-rustsec-2026-0459
kayg:feat/iphone-fixes
kayg:shared/restore-and-stale-918-919
kayg:fix/phone-top-band-contrast
kayg:feat/notes-approve
kayg:perf/soak-max-gate
kayg:feat/files-s1-identity
kayg:fix/lifecycle-event-id
kayg:feat/quickfix
kayg:wip/tiering-v3-cold
kayg:perf/web-mockup-frame-fixes
kayg:port/contacts-merge
kayg:port/contacts-edit
kayg:test/shared-room-no-deleted-text
kayg:perf/first-paint-credits
kayg:fix/shared-history-after-grant
kayg:fix/phone-swipe-regressions
kayg:feat/contrast-r1
kayg:review/sharing-pr3-review
kayg:feat/tiering-v3-s2-tags
kayg:feat/folder-drop
kayg:fix/deskpills-lazy-share
kayg:feat/sharing-s1-pr3
kayg:tmp/money-round-before
kayg:fix/phone-pane-backdrop-roots
kayg:fix/palette-preload-chips
kayg:fix/invite-defaults
kayg:port/tasks-matrix
kayg:fix/restore-green-gates
kayg:fix/sharing-fast-path-hardening
kayg:t3/photos-s1
kayg:feat/tiering-v3-s1-namespace
kayg:notes-archive-hide
kayg:feat/tasks-actions
kayg:t3/photos-plan-slice-one
kayg:feat/whiteboard-s1
kayg:t3/paged-search-reconcile
kayg:t3/smooth-pane-transitions
kayg:t3/index-position-startup-scan
kayg:fix/private-staging-759b-r2
kayg:feat/dav-transport
kayg:feat/imap-notes-fetch
kayg:feat/imap-notes-projection
kayg:feat/imap-notes-readonly
kayg:feat/imap-notes-auth
kayg:feat/imap-notes-server-foundation
kayg:docs/undo-block-ids-plan
kayg:fix/undo-768
kayg:proto/block-identity-v7d
kayg:issue/carddav-read-perf-fix-r2
kayg:issue/carddav-read-r2
kayg:docs/imap-766-plan-v2
kayg:docs/imap-notes-plan
kayg:docs/quota-plan-2
kayg:fix/parallel-test-flakes
kayg:feat/contacts-companion-pure
kayg:docs/calendar-backend-v2-plan
kayg:feat/calendar-ical-converter
kayg:docs/tasks-writes-v2-plan
kayg:docs/carddav-writes-v2-plan
kayg:docs/contacts-import-v2-plan
kayg:issue/610-pm-midnight
kayg:feat/calendar-v2-s1-containment
kayg:docs/dav-recorder-v2-plan
kayg:plan/previews-865
kayg:plan/save-log-durable-entry
kayg:fix/e2e-data-on-ram
kayg:feat/appwindow3
kayg:feat/appwindow2
kayg:feat/appwindow
kayg:feat/money-p1
kayg:feat/keys-sheet
kayg:review/calendar-2-themes
kayg:feat/smooth-cursor
kayg:fix/float-style
kayg:review/calendar-2-float
kayg:release/2026-11-06-hotfix
kayg:archive/port/rows-drop-code
kayg:archive/port/rows-actions
kayg:archive/port/rows
kayg:scratch/tasks-894-ui-gates
kayg:review/calendar-2-night-wip
kayg:release/2026-11-05
kayg:archive/feat/tiering-v3-s1-namespace
kayg:archive/flaky/rows-drop-fixed
kayg:archive/flaky/rows-actions
kayg:archive/feat/tiering-v3-reader
kayg:archive/feat/tiering-v3-roots
kayg:archive/flaky/rows
kayg:sim/bm15-final
kayg:sim/bm15-fix
kayg:sim/bm15-bis-932
kayg:sim/bm15-bis-909
kayg:sim/bm15
kayg:sim/bm15-bis-887
kayg:perf/tiering-option-b
kayg:port/style-3
kayg:port/style-2
kayg:port/style
kayg:fix/sw-lazy-precache
kayg:fix/vim-w-waits-for-save
kayg:fix/signout-test-races
kayg:fp-scratch/all
kayg:sim/bm15-first-paint
kayg:archive/bm15/rows-drop
kayg:archive/bm15/rows-actions
kayg:fix/palette-snippet-contrast
kayg:archive/bm15/rows
kayg:archive/bm15/hidden
kayg:archive/plan/save-log-durable-entry
kayg:mock/money-fix2
kayg:archive/fix/e2e-data-on-ram
kayg:mock/appearance-all
kayg:mock/pill-press
kayg:archive/docs/design-consistency
kayg:mock/auto-swipes
kayg:mock/mail-actions
kayg:archive/feat/mail-p1
kayg:mock/money-static
kayg:archive/review/standards-917
kayg:archive/docs/engineering-standards
kayg:perf/tiering-761-fix
kayg:mock/type-audit
kayg:mock/third-pane
kayg:feat/contacts-import-v2-s1
kayg:perf/executor-hot-path
kayg:archive/port/hidden-blocks
kayg:archive/port/devices
kayg:scratch/executor-on-894
kayg:scratch/executor-spans2
kayg:scratch/executor-spans
kayg:train/2026-11-03-bm14c
kayg:archive/port/rows-drop
kayg:feat/tiering-761-c-index
kayg:feat/tiering-761-b-reader
kayg:archive/review/sharing-pr3-review-9fec3d1f
kayg:train/2026-11-03-bm14b
kayg:perf/ports-lazy-budgets
kayg:feat/tiering-761-a-migration
kayg:train/2026-11-03-bm14
kayg:train/2026-11-03-bm12
kayg:archive/review/sharing-pr3-review
kayg:archive/feat/sharing-s1-pr3
kayg:train/2026-11-03-bm11
kayg:archive/feat/imap-notes-fetch
kayg:train/2026-11-03-bm10
kayg:archive/review/sharing-pr3-review-code
kayg:archive/plan/previews-865
kayg:train/2026-11-02-bm9
kayg:archive/port/port-attachments-3
kayg:archive/port/contacts-merge
kayg:fix/motion-audit-859
kayg:train/2026-11-02-bm8
kayg:archive/scratch/bm8-prep
kayg:archive/port/port-pickers
kayg:archive/port/port-tables-2
kayg:archive/port/port-tables
kayg:archive/feat/sharing-s1-pr3-code
kayg:archive/scratch/bm7-fixed
kayg:train/2026-11-02-bm7
kayg:archive/fix/parallel-test-flakes-code-minipc01
kayg:train/2026-11-02-bm6
kayg:docs/imap-766-readonly-slice
kayg:feat/dav-recorder-v3
kayg:research/788-diagnosis
kayg:archive/fix/parallel-test-flakes
kayg:archive/perf/pr792-cold-index-edit
kayg:docs/sharing-slice-1
kayg:archive/docs/imap-766-plan-v2
kayg:feat/dav-recorder-v2
kayg:archive/docs/dav-recorder-v2-plan
kayg:spike/imap-766-s0-cases
kayg:archive/fix/undo-768
kayg:feat/dav-recorder
kayg:archive/docs/contacts-import-v2-plan
kayg:archive/feat/calendar-ical-converter
kayg:feat/contacts-import
kayg:perf/cold-growth-on-764
kayg:perf/cold-growth-on-tiering
kayg:archive/docs/tasks-writes-v2-plan
kayg:archive/docs/calendar-backend-v2-plan
kayg:archive/feat/contacts-companion-pure
kayg:feat/tasks-set-status
kayg:feat/tasks-move-reorder
kayg:archive/docs/carddav-writes-v2-plan
kayg:archive/feat/calendar-v2-s1-containment
kayg:feat/tasks-delete-promote-duplicate
kayg:archive/feat/dav-transport
kayg:archive/fix/carddav-rebuild-r1
kayg:archive/fix/carddav-retention-r1
kayg:feat/carddav-writes
kayg:perf/quota-on-tiering
kayg:perf/quota-simple
kayg:perf/cold-growth-on-quota-stack
kayg:feat/calendar-identity
kayg:feat/calendar-event-parser
kayg:feat/calendar-props-maps
kayg:port/glass-when-ring
kayg:feat/tiering-761-s1
kayg:wip/10by32-01-impl-759b-scratch-20261030
kayg:wip/6by32-01-bm3-webkit-pause-20261030
kayg:wip/10by32-01-bm3-chromium-pause-20261030
kayg:wip/6by32-01-tier-761-s1-pause-20261030
kayg:spike/imap-766-s0
kayg:wip/6by32-02-calternal-pause-20261030
kayg:wip/8by64-01-review-688-pause-20261030
kayg:wip/6by32-01-verify-744-pause-20261030
kayg:wip/6by32-01-verify-742-pause-20261030
kayg:fix/private-staging-759b
kayg:wip/6by32-01-review-748-pause-20261030
kayg:wip/6by32-01-review-733c-pause-20261030
kayg:wip/6by32-01-review-733b-pause-20261030
kayg:wip/6by32-01-perf-idle-8-pause-20261030
kayg:wip/6by32-01-perf767-base-pause-20261030
kayg:wip/6by32-01-perf767b-767-pause-20261030
kayg:wip/6by32-01-perf767b-764-pause-20261030
kayg:wip/6by32-01-perf767-767-pause-20261030
kayg:wip/6by32-01-perf767-764-pause-20261030
kayg:wip/6by32-01-lists-b-pause-20261030
kayg:wip/6by32-01-ids-verify5-pause-20261030
kayg:wip/6by32-01-ids-verify4-pause-20261030
kayg:review/calendar-month
kayg:wip/10by32-02-undo-768-20261030
kayg:test/ids-verify3
kayg:wip/10by32-02-bm3-chromium-20261030
kayg:wip/10by32-01-review-753-20261030
kayg:wip/10by32-01-perf-idle-2-20261030
kayg:wip/10by32-01-bm2-webkit2-20261030
kayg:plan/759b-staging
kayg:train/2026-10-30-bm2
kayg:review/758b-tests
kayg:review/758-tests
kayg:review/764d-tests
kayg:review/767b-tests
kayg:review/preview-2026-10-29
kayg:review/767-tests
kayg:docs/tiering-731-plan
kayg:wip/c6b02-when2
kayg:wip/c6b02-tasks-create-fix5
kayg:wip/c6b02-settings-frost-mock
kayg:wip/c6b02-settings-frost-base
kayg:wip/c6b02-settings-frost
kayg:wip/c6b02-ring
kayg:wip/c6b02-review-733d
kayg:wip/c6b02-bm1-full-a
kayg:wip/compute02-when-field
kayg:wip/compute02-webkit-lists-repro
kayg:wip/compute02-train-bl2-dev
kayg:wip/compute02-dev-green-pw164
kayg:docs/deploy-plan
kayg:review/764c-tests
kayg:review/764b-tests
kayg:review/748g-tests
kayg:review/764-tests
kayg:review/759b-tests
kayg:fix/storage-owner-liveness-642
kayg:fix/storage-fix-7
kayg:wip/compute02-storage-fix-7
kayg:review/759-tests
kayg:feat/tiering-731
kayg:wip/tiering-731-first-attempt
kayg:wip/compute02-storage-fix-1
kayg:review/754g-tests
kayg:perf/idle-honest-2
kayg:review/754f-tests
kayg:review/754e-tests
kayg:review/755-tests
kayg:review/754d-tests
kayg:review/754c-tests
kayg:review/754b-tests
kayg:review/754-tests
kayg:fix/storage-private-tmp-642-dev
kayg:wip/compute02-verify-750
kayg:test/ids-verify5
kayg:test/ids-verify4
kayg:fix/storage-exact-file-quarantine-642
kayg:wip/compute02-verify-740
kayg:perf/one-flush-save
kayg:review/calendar-static
kayg:wip/compute02-verify-737
kayg:review/indexing-ring
kayg:review/when-field-2
kayg:wip/compute02-review-733
kayg:proto/block-identity-2-review
kayg:proto/block-identity-review
kayg:wip/c6b02-tc-design
kayg:review/when-field
kayg:issue/tasks-create-ids
kayg:issue/tasks-create
kayg:review/combined
kayg:wip/compute02-review-combined
kayg:review/task-polish
kayg:review/top-buttons
kayg:review/q1-q5
kayg:train/2026-10-26-bl2
kayg:archive/wt-398h
kayg:archive/train-bm-proptest-seed
kayg:archive/integ325-293
kayg:archive/integ325-ci
kayg:archive/client-auth-review-baseline
kayg:archive/wt-sim-4853
kayg:archive/wt-sim-4811
kayg:archive/wt-448m
kayg:archive/wt-398a-allocator
kayg:issue/calendar-adr
kayg:archive/old/train/2026-10-23bk2
kayg:archive/old/train/2026-10-23bk
kayg:issue/469-mockup-9a
kayg:issue/smart-tasks-mockup
kayg:issue/469-menus
kayg:issue/652-signout-flake
kayg:issue/652-history-fix7
kayg:issue/652-history-fix6
kayg:archive/old/issue/spring-check-perf
kayg:issue/spring-check-perf
kayg:issue/659-rename-fast
kayg:archive/old/train/2026-10-21ar
kayg:issue/search-hardening-3
kayg:issue/652-history-fix5
kayg:issue/660-port-sheets-glass
kayg:issue/652-history-fix4
kayg:issue/652-history-fix3
kayg:issue/652-history-fix2
kayg:issue/652-history-flake
kayg:train/2026-10-21an
kayg:issue/settings-admin-port
kayg:issue/search-port
kayg:train/2026-10-20am
kayg:issue/storage-split-fix2
kayg:issue/storage-split
kayg:archive/old/issue/folder-ids-fix
kayg:train/2026-10-20al
kayg:archive/old/issue/folder-ids
kayg:train/2026-10-20ak
kayg:issue/tables-mockup
kayg:train/2026-10-19aj
kayg:train/2026-10-19ai
kayg:issue/469-merge-fixes
kayg:issue/sidebar-band
kayg:archive/old/issue/608-settings-spec
kayg:train/2026-10-19ah
kayg:issue/swipe-offscreen
kayg:train/2026-10-19ag
kayg:archive/old/issue/590-nlp-adr
kayg:archive/old/issue/587-event-after-write-2
kayg:train/2026-10-19af
kayg:archive/old/issue/587-event-after-write
kayg:issue/469-pill-room-c
kayg:issue/469-pill-room
kayg:train/2026-10-19ae
kayg:issue/469-narrow-handle
kayg:issue/397-ios-swipe-2
kayg:archive/old/issue/adrs-photos-files-tasks
kayg:issue/469-desk-fixes
kayg:archive/old/issue/auto-update-adr
kayg:issue/469-filter-gap
kayg:issue/469-port-1b
kayg:issue/442-opacity-flake
kayg:archive/397-ios-swipe-2
kayg:issue/327-web-fast-3
kayg:archive/old/issue/469-port-1
kayg:issue/469-port-1
kayg:issue/327-web-fast-2
kayg:archive/old/issue/327-web-fast
kayg:archive/old/issue/425-stt-bench-vq1
kayg:archive/old/issue/445-no-bleed
kayg:archive/old/issue/400-swipe-mockup-2
kayg:issue/426-client-review
kayg:issue/426-client-2
kayg:issue/426-client
kayg:archive/old/issue/476-safe-area-lab
kayg:archive/445-top-light-2
kayg:archive/old/issue/445-top-light
kayg:issue/471-blocks-mockup
kayg:archive/old/issue/448-links-app-2
kayg:archive/old/issue/448-links-app
kayg:archive/old/issue/398-cold-links
kayg:issue/434-442-small-2
kayg:issue/434-442-small
kayg:archive/old/issue/398-unload
kayg:archive/old/issue/445-bottom-band
kayg:issue/445-bottom-band
kayg:issue/351-rem-3
kayg:archive/312-views-mockup
kayg:issue/351-rem-2
kayg:issue/351-rem
kayg:archive/old/issue/327-first-note
kayg:issue/395-width-phone
kayg:archive/old/issue/327-typing
kayg:issue/396-ios-edges
kayg:issue/397-ios-swipe
kayg:archive/398-allocator
kayg:archive/old/issue/327-notes-index
kayg:issue/345-347-contrast-empty-2
kayg:archive/old/issue/44-arenas
kayg:issue/44-arenas
kayg:archive/integ325
kayg:archive/old/issue/327-perf-harness
kayg:archive/old/issue/44-thp
kayg:issue/44-thp
kayg:archive/old/issue/285-sticky-pills
kayg:archive/old/issue/44-trim-3
kayg:issue/44-trim-3
kayg:archive/old/issue/165-cards
kayg:archive/old/issue/165-picker-2
kayg:archive/old/issue/212-multi-select
No reviewers
Labels
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
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!793
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/tiering-761-d-scale"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Plan — qualification fixtures and independent tiering models (#761), D of A → B → C → D
Stacked on C, ultimately into
dev. Movetiering-scale, independent specification models, and the validation ledger out of #784's runtime migration/read/index code.Cost: streaming O(entries + generated bytes) fixture work; history replay includes the full expanded CRDT cost. Large aggregate and real-disk campaigns belong on the locked perf VMs, not this shared build host.
Failure → effect → detection → recovery → test
pair_bytes_and_auth_survive_independent_disk_ordersdisplaced_inode_retention_covers_late_fd_mmap_and_alias_writesmixed_root_quota_observations_never_authorize_admissiontiering-scaleworkload checksValidation
Rebased unchanged onto C
9c8c287357240912daf895c4166bf00f2212ce4a. Current D head659b0f4e420f6272e801ea78eba8fe10d66c1ca5. Range-diff confirms both D-only patches are unchanged.PASS: fmt, strict clippy, and full workspace tests on dev-01 through Nix/slot. 1,208 passed, zero failed, 20 ignored, exit 0.
RUST_TEST_THREADS=2; evidence~/tier-d-r2-final6.{log,exit}. C and D ran sequentially.Decisions and remaining risks
These are functional fixtures and independent models, not certification of real paired replay, auth/HEAD protocols, retained-inode mutation recipes or quota admission. History-heavy open, 15 ms successful opens, RSS/FD/watch limits, XFS/ext4 comparisons, SIGKILL and VM power cuts remain unqualified. No production data, merge, deployment, provisioning or cutover was performed. The prior shared-host history fixture attempt is retained as incomplete evidence, not relabeled as passing.
Stack: A #790 → B #791 → C #792 → D #793. Final round-3 review follows completion of the exact-head gates; nothing merged.
Independent review, round 2
Verdict: ready
No actionable P0–P3 findings in D's added qualification fixture, model, and validation ledger. The code and docs distinguish specification models from production protocols, and explicitly leave crash/power-cut, successful-open, RSS, and FO1 latency gates unqualified. The
tiering-scalefixtures check replay and structural counts without claiming production latency qualification. D is ready in its stated scope; the stack remains downstream of C.Independent review, round 3 (final)
Reviewed D at
659b0f4e420f6272e801ea78eba8fe10d66c1ca5, round-2 comment 71075 and the final status table. Verdict: ready in its qualification-fixture/specification-model scope.r2_run: 22 passed, zero failed.New findings, P0–P3: none. The models remain specifications for later protocols; they do not certify production paired recovery, auth/HEAD, retained-inode mutation or quota admission.
Independent command on dev-01, in this exact D checkout inside Nix through
~/bin/slot:Evidence:
~/tier-r3-independent.{log,exit}, exit 0. I inspected the exact-head~/tier-d-r2-final6.logand exit 0; I did not independently rerun the full workspace suite or large fixture workloads. No code pushed or production access.Open gates remain open: C's final isolated 100k latency/RSS run, history-heavy production opens, real disk/crash/power-cut campaigns and FO1 qualification. C's pending performance run is a gate, not a new finding in D. This verdict does not authorize cutover or certify those measurements.
D on dev
41f2efa3: restack, resolutions, qualification fixturesNew head
d422d0ca95499937ef5bbc30fc4ba72cbf91aada(was89989e62). D's own commits were replayed onto C's new head487e0589.0200eb7a(rustfmt module order) was dropped as already upstream, since C now carries it.git diff 89989e62 d422d0cais empty: same tree, so the earlier gates at89989e62apply unchanged.Resolution:
crates/notes/src/lib.rskeeps dev'scapture_testsand this PR'stiering_modeltest modules (one conflict, resolved to the old D head's exact text). D touches no read, executor, watcher or restart code.Qualification fixtures (
tiering-scale, dev-01,~/bin/slot, fixture dirs on disk under$HOME,TMPDIR=~/tiering-tmp)idsinventory --metadata-onlyaggregate --metadata-onlyhistory100k × 64 Bhistory100k × 4 KiBblocksmoves --metadata-onlyThe release
tiering-scalecame from the same tree (cargo build --release -p calternal-perf --binsat89989e62, identical tod422d0ca).history100k × 4 KiB is unqualified. The generation is O(n²): each append names the previous clock as its origin, and yrs merges the appends into one growing block, so every update costs more than the last. Release had written 45,237 of 100,000 updates after 33 min, at ~13 updates/s and falling. Projection: ~1.9 h more to generate, plus a replay of the same cost (~2.4 h), ~5 h in total on one core. The debug run would hit its 3 h unit limit before replay. Neither run could finish, so I stopped both (own units only). No earlier run on dev-01 has ahistory edits=… edit_bytes=4096line either.This is the fixture showing what this PR already lists as unqualified: history-heavy open over 100k-edit histories. It is not a rebase effect, because the D tree is unchanged. Suggested follow-up: make the 4 KiB case a perf-VM job with a measured time budget, or check whether production rooms hit the same per-append cost. I did not change the fixture or any limit.
Stack gate table, perf and the 200-append result: see the gate comment below; the prod-copy dry run is on #790.
Gate table — stack on dev
41f2efa3(takeover after the Codex usage limit)Heads: #790 A
91c034eb→ #791 Befcaaaf7→ #792 C487e0589→ #793 Dd422d0ca. Base: dev41f2efa387b74175971a838f602535089d0d5fb4(what prod runs). Nothing merged.~/bin/slot)91c034ebefcaaaf7487e0589d422d0cacargo fmt --all --checkcargo clippy -j4 --workspace --all-targets --locked -- -D warningscargo test -j4 --workspace --locked -- --test-threads=2¹ Run by the earlier agent at
89989e62;git diff 89989e62 d422d0cais empty (same tree).² Run at
896babb4;487e0589differs only by the order of two#[cfg(test)] modlines (cargo fmt).Perf VMs (binaries built on dev-01 in release at the D tree, relayed through the control host, SHA-256 checked on both perf VMs: C
2006ab8e…, dev724535bd…, harness980045d9…):41f2efa3notes.append, 30 alternating pairs, perf-02, median totalProtocol unchanged from the
fab01191run:~/bin/perf-lock ~/bin/slot run-perf.sh, per samplecalternal-perf --sizes 100k --runs 1 --cold-runs {1,1,1,0} --seed 1 --idle-secs 60 --budgets {"open.note@100000":{"p95":15},"idle.rss@100000":{"p95":100}}, C then dev, same VM, no page-cache drop; all 8 reports have no scenario failures. No limit was changed.Notes:
fab01191run (deva55521f912.6 s → dev41f2efa320.9 s on the same harness and VM), so only the ratio is comparable. The absolute memory numbers are from a different source (harnesscold.mem_peakon perf-01 vs one dev-01 sample earlier); the ratio to dev improved.~/Developer/perf-results/pr792-41f2efa3/. Perf VM binaries and work dirs deleted.yrs squash fix: already fixed upstream, nothing to report.
ItemPtr::try_squashrecounts the merged string (self.len = self.content.len(OffsetKind::Utf16)).mainalready has our one-line fix (self.len += other.len), from PR https://github.com/y-crdt/y-crdt/pull/737 ("an item's UTF-16 length without counting its string", fixes https://github.com/y-crdt/y-crdt/issues/668), merged 2026-11-03 07:54 UTC, merge commit 26cc6ae3b8722682ee477840ac0f3e976db521c6.af4f100b) stays until a yrs release after 0.28.0 ships; then dropvendor/yrs.#793 fixtures and appends after the fixes (branch
perf/tiering-761-fix)History is O(1) per append now
Cause: not this stack. yrs 0.28.0
try_squashcounts the whole merged string again after every append, so a run of appends costs the block so far each time (O(n²)). Fix is upstream (y-crdt#737, merged 2026-11-03, unreleased) and is in its own PR #899 ([patch.crates-io]to the merged commit). This branch carries a vendored one-line copy of the same fix until #899 lands (af4f100b).tiering-scale history(release, dev-01)d422d0ca)completed_replays=1(
TIERING_HISTORY_EDITSand progress lines added to the tool in7e196167, for experiments only.)Every #793 fixture, release build of this branch (tree
2473b998), dev-01idsinventory --metadata-onlyaggregate --metadata-onlyhistoryblocksmoves --metadata-only200 sequential
notes.append, 30 alternating pairs, perf-02,CALTERNAL_NOTES_SAVE_MS=1541f2efa3h6)Not measured / open
Peak RSS at 1M notes, and a 5-pair cold/open.note re-run, need the perf lock (held by other jobs for hours). The cold-index, first-page and open.note gaps are described on #792; they remain.
Option A (secondary indexes after the first fill): implemented, target not met — first page 2.5× dev, cold index 1.16× dev
Branch
perf/tiering-761-fix. New commits (production change isfe04455e; the rest are test/format fixes):fe04455ebuild the projection's secondary indexes after the first fill ·4a5e2dc6rustfmt ·362e6d1b,c0b06fb1clippy fixes in the new tests ·43d81bc1rustfmt. Head43d81bc1. Nothing merged.What changed
entries_foldonly.entries_foldis what the scan'sids_at_folds/id_atread while filling (scan.rsclassify and identify), so it stays.entries_child(children by name) andentries_descendants(watcher,under_after) are left out.scan::runend →Index::fill_done), the writer thread builds each missing index with oneCREATE INDEX IF NOT EXISTS, one per idle slot (only when no append is waiting). A restart finds what is missing and builds it again (index/deferred.rs).PRAGMA integrity_check= ok in the test).Tests (
index/deferred_tests.rs, 7 new)fresh fill keeps only the fill indexes · scan signal builds both, children/descendants answers identical before and after, later
put/removekeep them current,EXPLAIN QUERY PLANusesentries_child· populated projection without the signal builds on restart · empty projection does not build before its first fill · imported log builds all at once · kill mid-build: a child process stops betweenCREATE INDEXandCOMMIT, the parent kills it, checks the index is absent andintegrity_checkok, restarts and checks both indexes plus 3,000 children/descendants/path_ofanswers.Perf-01, 100k Home, 6 reps, rotated order (head / dev / dev copy "devB" as control), no page-cache drop, both perf locks held
Binaries built on dev-01 (release): head tree
4a5e2dc6(later commits change only#[cfg(test)]code and formatting) sha256f6ac38e1…, dev41f2efa301522f72…(devB is a byte copy), harness352d448a….PERF_ONLY=list,query,journal,open,--runs 3 --cold-runs 1 --seed 1 --idle-secs 0. Medians over the 6 reps.notes.append, 30 pairs (CALTERNAL_NOTES_SAVE_MS=15)Per-rep cold.index / first page: head 17.2 s/3.9 s, 17.5/4.3, 18.7/5.5, 16.8/3.9, 17.1/3.9, 17.3/4.2; dev 14.9/1.63, 14.8/1.62, 18.8/1.69, 15.1/1.66, 14.8/1.59, 14.7/1.59; control within ±3% of dev on every rep except one (cold.index 18.8 s).
Note on search: the scenario filter
PERF_ONLY=list,query,journal,opendid not emitsearch.first_query/search.queryrows in these reports; I did not run a separate search pass.Reading
id TEXT PRIMARY KEYrandom-order inserts (two B-trees per row), thetotalstrigger running anUPDATEper inserted row, and onesynchronous=FULLcommit per 4,000-row group. I have not measured any of them (callgrind on a 10k cold start would split it in one pass). Option 2 from the earlier comment (acknowledge after the log fsync) is still the other route.Gates (dev-01,
~/bin/slot, tree43d81bc1)cargo fmt --all --checkcargo clippy -j4 --workspace --all-targets --locked -- -D warningscargo test -j4 --workspace --locked --no-fail-fast -- --test-threads=2tiering-scalerelease: ids, inventory, aggregate, history, blocks, moves)bm14esince 09:30 CEST; my job is queued (tpf-fix). Result follows in a new comment.Perf VM locks on perf-01 and perf-02 released (
tpf4-holdstopped on both). Reports and scripts on the control host:/tmp/tpf/(JSON per run in/tmp/tpf/reports).Correction to the table above:
PERF_ONLY=list,query,journal,open) produced nosearch.*rows (checked in the JSON). The brief asked for search; that is still open. It needs another lock window with the scenario name the harness uses for search.#793 fixtures at
43d81bc1: not run. Trainbm14eheld dev-01's build slots for 2.5 h+ (~/.train.lock), so mytiering-scalerelease build never started; I stopped my queued job (tpf-fix) rather than leave it running. The previous fixture results (tree2473b998, comment above) are the latest. The change here touchesindex.rs/scan.rsonly through the deferred index build; the full workspace suite passed (1,547).Update on the #793 fixtures at
43d81bc1: still not run. My first fixture job (tpf-fix, started 09:21 CEST) ended without output and I do not know why; the second (tpf-fix2, 11:50) waited about 35 min with no~/bin/slotslot while trainbm14eheld~/.train.lock(it had run 2.5 h+), and I stopped it. Runtiering-scale DIR ids|inventory|aggregate|history|blocks|moves(release,--metadata-onlywhere noted in #793) once the train ends; I did not do it, so the last fixture results are still those at2473b998.kayg referenced this pull request2026-11-05 23:21:11 +00:00
housekeeping #1009: needs-decision.
Qualification fixtures depend on the superseded #790–#792 representation. Preserve fixture/model code for the v3 qualification lane; the latest comment also records its fixture rerun as incomplete.
original head:
d422d0ca95499937ef5bbc30fc4ba72cbf91aada. against devcd7f84432febfc63b788fbb9b9f9950452982d74, git cherry reports 71 unmatched and 0 equivalent patches. the landing audit lists each candidate missing commit and stable patch match inpr-793.md; unmatched patches can include superseded behavior.left open, source branch unchanged. no rebase or new test claim for this decision lane.
Superseded by tiering v3 (#968/#970/#1008). The branch and original tips are archived under
archive/(see #1009), so nothing is lost; useful regression vectors are noted there for the active lanes. Closing.Pull request closed