WIP: perf: keep idle storage accounting asleep #753
Closed
kayg
wants to merge 2 commits from
perf/idle-honest into dev
pull from: perf/idle-honest
merge into: kayg:dev
kayg:main
kayg:feat/contrast
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: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-d-scale
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!753
Loading…
Reference in a new issue
No description provided.
Delete branch "perf/idle-honest"
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?
The storage usage counter walked every Home once a minute while idle. At 100k notes it used 0.61% CPU and left about 22 MiB of free heap resident after a recount. Native filesystem events now update changed paths; directory changes and lost events repair the snapshot. Polling remains a fallback when watching fails.
Updates and snapshots share file keys for directory aliases and concurrent moves. Recount history is kept only while a walk is active, and the existing memory module returns freed recount maps after a quiet burst.
Validation on
7c2e78cc33: formatting, strict workspace clippy, release build and workspace tests passed (1163 passed, 0 failed, 20 ignored). Three full reports used 10k/100k Homes, five warm runs, three cold runs, 300-second idle windows and 51 verified internal cache drops. Idle CPU and wakeups were zero in all six windows; 100k idle RSS was 73.4102 / 75.8906 / 69.8086 MiB, below the unchanged 100 MiB budget.The overall server reports remain red for note opening, tag paging and latency outliers. All gate output is retained on issue #686. The unchanged baseline also exceeded long-note and startup budgets in follow-up checks. No budget was changed. The configured data root is assumed stable; replacement of its users subtree is tested. Measurements are Linux/XFS Homes with separate ext4 app state.
Complete evidence and commands. Archive SHA-256: 8aef16e0b0a61916ae816a0af6794781ddec1d7059d8f85801235eaf080aa239. Refs #686.
Independent review of
7c2e78cc33against devd83e54dbe5: fix first.crates/fsio/src/usage/watch.rs:188, healthy wait at :60). Create two hard-linked names with 3 bytes each in one Home, start the counter, then outside-overwrite one name with 10 bytes. After native batch delivery, cached usage is 13; a fresh walk is 20. Writing via a link outside the watched tree produces cached 3 versus fresh 10. No error/overflow occurs, so healthy mode has no scheduled repair. Drift persisted beyond 65 seconds in a 100,000-file fixture. Track aliases or provide guaranteed recovery for changes directory events cannot describe.watch.rs:127-133,176-188). Use prepare_new_directory for one 7-byte attachment, publish it, and immediately outside-rename the new folder to data/exported in the publication callback. Wait for an unrelated marker event. Real native delivery leaves cached 7 versus fresh walk 0. Pending discards directory event kind; the new, now-absent folder is not in the last directory snapshot, so apply refreshes it as a file and retains its child keys. Preserve folder event information and repair even when the folder is absent from both cache and disk.watch.rs:210-211). Exact-head fsio tests fail 43 passed / 1 failed at gathering_stops_at_its_deadline_even_with_queued_events (Err(Empty) versus Ok(())). It passed in isolation. Consecutive Instant readings can be equal on this host (6,872/10,000 probe iterations), allowing recv_timeout(0) to drain the queued item. Use a definitely past deadline without sleeping or define the equality boundary.Passing independent checks: 1,200 mixed operations with 80 per-person fresh-walk comparisons; folder moves across Homes, Trash/restore and deletes; stopped-server changes; 100,000-file repair with concurrent writes and history capacity returning to zero; actual kernel IN_Q_OVERFLOW triggering repair and failed=true. Inspection confirms failed=true enables 60-second fallback with no automatic native watcher restart. Silent event loss in healthy mode has no bounded recovery.
Counter-only measurement on 10by32-01-std under perf-lock.sh: 65.006 seconds, 0.002003 CPU seconds (0.003081%), one voluntary context switch from the main measurement timeout and no extra background wakeups. Allocator-retained bytes stayed about 19.2 MB across five repairs and fell to 0.25 MB after dropping the counter. This does not claim a full-server performance gate pass.
Exact-head gates through build-slot.sh: formatting and targeted clippy with -D warnings passed; fsio library tests exited 101 due to the flaky test. Independent reproductions fail as described. Detailed reproductions, recovery limits and verbatim gate output are on issue #686; local findings.md and review scratch evidence are uncommitted. Product files are unchanged. No push, merge or deployment was made.
The storage-usage findings from review of #753 are fixed in 754 on
perf/idle-honest-2, head81e6141a2e. This new branch and PR follow the job's Forgejo rule.The VM run also caught a transient watch-install error that enabled polling and a large per-file watch memory cost. The final Linux adapter pins inode identity during installation, shares names, handles disappearing files as transient, and stops under continuous writes without an idle timer. Native and randomized tests cover these paths.
Formatting, workspace clippy, and workspace tests passed (1176 passed, 0 failed, 20 ignored). All 100 counter repetitions passed, with 28 tests each, 1,000,000 operation sequences, and 2,000,000 per-Home comparisons against fresh full walks.
All three server gates passed. Idle windows stayed 300 seconds, and the binary, harness and budget hashes matched before and after.
Report 1, gate output verbatim:
Report 2, gate output verbatim:
Report 3, gate output verbatim:
These reports ran on 10by32-01-std, ARM64, same-root btrfs. Cache drops are unavailable on that VM; the unindexed starts have no controlled cache drop. The full failed preliminary report, final reports and gate logs are preserved on issue #686 and in the evidence archive, SHA-256
ae082d6ca8ee71b37c69d52e5792ca3d2bb62902c016581ce6df11df9d10331d.No merge, deployment, issue closure or update to the reviewed #753 branch was performed.
Started the approved whole-Home recount redesign on perf/quota-simple, based on
a6b1fa14d2(fetched origin/perf/idle-honest-2 and verified it matches). Existing crates/fsio/src/usage.rs plus usage/*.rs: 5,987 lines. First checking generation acceptance against delayed native notifications and mount operations, then implementation and gates if that acceptance rule holds.Finding: unchanged callback generations do not prove containment. A real native inotify queue can retain events until after the counter accepts its walk. This is ordinary callback scheduling delay; there is no overflow and no lost event. I opened a child directory fd, moved that child outside Home, and created a new 1,009-byte file only outside Home. Before releasing the event consumer, the required before/after rule accepted 1,013 bytes although the quiescent Home oracle was zero. The counter would be marked counted at generation 1. Three native events were delivered afterward. The current descriptor location validation addresses this case; deleting it requires a synchronous native event fence, not merely an atomic in the callback. A timeout, debounce, or three attempts does not help: the first attempt sees unchanged generations and succeeds.
Command: python3 generation-race.py
Output:
This reproduces the specified replacement acceptance rule with real kernel events; it does not claim that the existing chain-verifying scanner accepted these bytes. Reproduction source follows.
Finding: same-device bind mounts do not produce the native notification that generation acceptance needs. I verified this in an isolated user and mount namespace on this host; no host mount changed. Every existing Home file and directory was watched for every inotify event. After opening a child directory fd, a bind mount covered that child. The mount returned with zero bytes pending in the native event queue. The opened child fd still had the Home root mount ID and yielded seven now-hidden bytes, while the current path had a different mount ID and the required mount-excluding oracle was zero. Comparing st_dev and mount IDs on each object being walked does not detect a mount placed over a directory already opened. This needs mount-namespace change detection or renewed path validation; inotify overflow handling cannot detect an operation that produces no event.
Command: unshare --user --map-root-user --mount python3 mount-race.py
Output:
Reproduction source follows.
Finding: admission can use a stale total even with counted_gen equal to dirty_gen. With a cached four-byte Home and a ten-byte quota, an external write grew its file to 100 bytes. While its native notification was queued, both generations remained 1. The specified freshness condition did not request a recount and admitted another byte. The native queue contained a modification event, so this does not depend on an event being lost. Admission needs the same synchronous event fence before checking freshness, including when no recount would otherwise run.
Output:
Reproduction source follows.
Blocked finish for this unattended job. The three executable counterexamples above show that the specified acceptance and admission rules do not satisfy the required outside-byte, mount, and no-stale-admission assertions. I have not replaced safe containment validation with a rule demonstrated to accept invalid counts. The needed refinement is a synchronous native event fence at admission and recount acceptance, plus mount-namespace change detection (or retaining path validation for this case). Sleeping to allow callbacks to catch up is not a correctness bound.
Branch: perf/quota-simple. Base and current head:
a6b1fa14d2. Fetched origin/perf/idle-honest-2 before inspection. Product diff is empty and the worktree is clean. No tests were removed. usage* line count before: 5,987; after: 5,987. Reproduction source and exact output are retained in issue comments, and the temporary local scripts were removed.Gate commands were not run, so there is no gate output to quote. fmt --check: NOT RUN. clippy -D warnings: NOT RUN. cargo test -j3 -p calternal-fsio: NOT RUN. 50,000-case property test: NOT RUN. Full workspace tests and #757 rerun: NOT RUN. Recount timing and strace measurements: NOT RUN because no replacement was implemented. These are uncompleted gates, not passes.
No commit, push, draft PR, merge, or deploy was made. A draft replacement PR would have no changes to review. Evidence and this blocked status have been posted on both #754 and #753. The requested redesign remains unfinished.
Starting the continuation on perf/quota-simple at
bb36381dd1(base from the previous job). I will commit docs/plans/0754-quota.md before more code, cover the review findings through 754g and comment 69219, then run the required gates. No merge or deployment.Gate output verbatim for
798f1bbe91; fmt; part 1/1; exit 0.Command:
cargo fmt --all -- --checkGate output verbatim for
798f1bbe91; clippy; part 1/1; exit 0.Command:
cargo clippy -j3 --workspace --all-targets --locked -- -D warningsGate output verbatim for
798f1bbe91; fsio; part 1/1; exit 0.Command:
cargo test -j3 -p calternal-fsioGate output verbatim for
798f1bbe91; property; part 1/1; exit 0.Command:
QUOTA_PROPERTY_CASES=50000 cargo test -j3 -p calternal-fsio -p calternal-auth --lib seeded_whole_home_property -- --nocaptureGate output verbatim for
798f1bbe91; workspace; part 1/3; exit 0.Command:
cargo test -j3 --workspace --locked --no-fail-fastGate output verbatim for
798f1bbe91; workspace; part 2/3; exit 0.Command:
cargo test -j3 --workspace --locked --no-fail-fastGate output verbatim for
798f1bbe91; workspace; part 3/3; exit 0.Command:
cargo test -j3 --workspace --locked --no-fail-fastFinished on perf/quota-simple at
798f1bbe91. Draft PR: #764. The plan was committed first in3f7eb017. All required gates passed; their complete output is in the preceding comments. Both 50,000-case properties passed on the final code. The Tasks kill-9 test passed; #757 did not reproduce, so no flake rerun was needed. Local measurements are explicitly not perf VM results; initial 100k traces timed out and were excluded. Test inventory and measurement evidence are linked in the PR. No merge, deployment, issue closure, or push to main/dev. The own-branch update used an exact lease on the previous WIP SHA, and the published history contains no job artifacts.Closing per #931: the quota and tiering stack in #764 replaces idle accounting here.
Pull request closed