b0dec1c3 (declared keys through the cache): a rollback to 9faf6c61 cannot start, and five more findings to settle before a promote #61
Open
opened 2026-11-13 18:44:06 +00:00 by xemmerling
·
0 comments
No Branch/Tag specified
main
dev/schema-step-order
t-join-release
t-work-booking
t-ahead-deadlock-wip
t-hotfix-9ae
t-width-work
t-id-token-renew
t-claim-unkept
t-resume-live
t-run-record
t-all-lockfiles
t-relay-offset
t-blame-event
t-freer-links
t-load-tests
t-jobserver2
t-starved-timeout
t-client-pack
t-offline-config
t-test-plan
t-told-resume2
t-jobserver
t-told-resume
t-outbound2
t-crash-open-bench
t-told-once
guest-never-below-given
admit-page-cache-active
pooled-admission
driver-give-back
no-sizes
one-driver-per-check
archive/vm-root-share
archive/build-out-kept
archive/cargo-perf
archive/virtiofs-readdir-alloc
archive/vm-outputs-stream
archive/stable-verify-priority
archive/agents-1
archive/stack-parallel
archive/cpu-admission
archive/narrow-from-every-log
archive/old-t
archive/worker-store-gc
archive/failing-builds-kept
archive/vm-cargo-home
archive/lifecycle
archive/bench-own-cores
archive/place-test-binaries-nocopy
archive/vm-net-upload-stall
archive/booking-current-use
archive/archive-dep-out-dirs
archive/any-arch-shards
archive/prepare-stall-progress-ns20
archive/s2
archive/next-set-20
archive/store-full-waits
archive/fetch-caps-by-node
archive/vm-step-phases
archive/arm-only-for-arm
archive/deploy-all-workers
archive/lifecycle-staging
archive/lifecycle-1-wire
archive/fast-gate
archive/cargo-key-narrow
archive/log-leads-followup
archive/gate-limit
archive/prepare-stall-vm-bytes
archive/lifecycle-2-ends
archive/cache-hits-bind
archive/failing-reused
archive/oci-archive-direct
archive/prepare-stall-progress
archive/test-quarantine
archive/crash-safe-on-18
archive/build-script-etxtbsy
archive/old-release
archive/next-set-19c
archive/wait-reasons
archive/cache-put-best-effort
archive/hang-not-t-time
archive/shard-test-results
archive/vm-carry-on-17
archive/check-test-filter
archive/artifact-path-beneath
archive/stall-room-xfs
archive/build-dir-no-recopy
archive/cache-hits-link
archive/outputs-no-follow-on-copy
archive/outputs-no-follow
archive/next-set-19
archive/hang-detect
archive/stable-verify-stable-plan
archive/freer-target-only
archive/lease-pricing-narrow
archive/vm-outputs-once
archive/queue-place-starved
archive/publish-reads
archive/disk-warning-scratch
archive/outputs-no-copy
archive/wd-probe-3min
archive/watchdog-on-d65
archive/log-leads-with-excerpt
archive/queue-place
archive/prep-watchdog-progress
archive/cache-put-stack-room
archive/cache-put-stack
archive/place-by-pace
archive/nested-sync-helper
archive/next-set-18y
archive/archive-bins-by-env-19
archive/next-set-18
archive/disk-want-held
archive/young-booking-back
archive/flaky-tests-1027b
archive/next-set-17
archive/prep-start-at-close
archive/unpack-error-on-17
archive/server-memory-high
archive/vm-start-held
archive/vm-carry-on-14
archive/space-trim-registry-room
archive/file-cache-ns16
archive/unpack-error-final
archive/crash-safe-worker
archive/server-space-trim
archive/status-big-runs
archive/nested-tmp-volatile
archive/publish-refresh
archive/gc-cache-quiet-reads
archive/next-set-16
archive/vm14-proof
archive/csw-node-kill
archive/unpack-link
archive/vm-tests-15
archive/seccomp-allow-field
archive/flaky-tests-1027-ns15
archive/shard-fail-fast
archive/server-node-check
archive/live-log-restart
archive/unpack-no-orphans
archive/flaky-tests-1027
archive/fetch-share-images
archive/fetch-images-red4
archive/forget-cached
archive/put-file-once-ns15
archive/recheck-rank-15
archive/fetch-images-red3
archive/unpack-no-orphans-red2
archive/fetch-io-pass-followups
archive/sandbox-no-fallback-ns15
archive/unpack-no-orphans-red
archive/archive-bins-by-env-ns15
archive/ns15-proof
archive/next-set-15
archive/archive-bins-by-env
archive/vm-guest-panic-15
archive/sandbox-no-fallback
archive/recheck-rank
archive/placement-ahead-bound
archive/carry-keeps-listing
archive/registry-parallel-pull
archive/sandbox-tests-15
archive/attempt-log-live-15
archive/follow-progress-16
archive/follow-progress-15
archive/ns15-archive-base
archive/fetch-io-max-on-13
archive/fetch-images-red2
archive/transient-build-fail-15
archive/test-ended-early-15
archive/archive-keep-cleanup
archive/main-merge-14
archive/sandbox-clone3-fallback
archive/vm-carry-on-13
archive/fetch-io-sweep-15
archive/vm-root-disk-fixes
archive/vm-guest-panic
archive/follow-progress-14
archive/archive-keep-on-demand
archive/vm-exit-unseen
archive/file-cache-share
archive/bwrap-root-userns
archive/transient-build-fail
archive/fetch-io-max
archive/file-cache-guard-11
archive/fetch-io-sweep
archive/archive-build-dir-skip
archive/next-set-14
archive/wrapper-one-read
archive/archive-tmp-links
archive/attempt-log-live
archive/fetch-share-and-order
archive/vm-hang-io-wait
archive/vm-carry-fixes
archive/image-cancel
archive/test-ended-early
archive/sim-on-train3-bundle
archive/hits-layer-wip
archive/t-old-putfile
archive/archive-links
archive/stall-on-13
archive/carried-prep-completes
archive/put-file-once
archive/preview-14
archive/follow-progress
archive/gc-reads-dont-protect
archive/admission-replay-people
archive/people-pickup
archive/gc-pass-visible
archive/hits-layer
archive/own-build-priced
archive/compact-stamps-followup
archive/prepare-timing
archive/sim-on-train3
archive/next-set-13
archive/next-set-12b
archive/sim-on-next-set-12
archive/deploy-doc-no-kill
archive/next-set-12
archive/attempt-logs-real
archive/sim-tests-green
archive/shard-label-index
archive/young-booking
archive/next-set-11
archive/data-dir-config-env
archive/vm-sync-not-host-store
archive/attempt-logs
archive/wrapper-ro
archive/tests-wait-on-events
archive/blame-git-optional-needs
archive/job-file-headroom-impl
archive/next-set-10
archive/blame-verdict-fresh-parent
archive/compact-touched-stamps
archive/interactive-incremental-off
archive/follow-lost-lines-counted
archive/evict-test
archive/next-set-trial
archive/keys-cover-output-bytes
archive/file-cache-guard
archive/blame-after-parent
archive/test-filter-matching-nothing-fails
archive/s1-on-d96
archive/draining-node-queues
archive/tprev-checks-prod-next
archive/s1-dead
archive/follow-live-run
archive/guard-stopped-setup-text
archive/io-error-cause
archive/source-layer-whole
archive/clippy-groups
archive/worker-silence-grace
archive/price-touched
archive/prod-next
archive/batch1
archive/s1-on-prod-next
archive/vmcache/sandbox-copyup-pin
archive/s1-xfs-store
archive/warm-script-builds
archive/vmcache/setup-tag-digest
archive/vmcache/setup-should-fixes
archive/vmcache/setup-any-arch
archive/guard-livelock
archive/host-budget
archive/wire-format-test
archive/admission-replay
archive/switch-safe
archive/stall-window
archive/upgrade-carries-preparing
archive/static-init
archive/switch-proof-b
archive/carry-tokens
archive/seals-together
archive/switch-safe-storage
archive/switch-safe-worker
archive/batch-b-prev
archive/vmcache/batch-b
archive/carry-vm-helpers
archive/small-llvm-args-failed-log
archive/batch-a
archive/stall-hotfix
archive/prev-pacing
archive/u-try-wip
archive/u-try
archive/u-try-wip2
archive/flatten-verify
archive/poll-free
archive/flatten-tiers
archive/hotfix-cross
archive/pool-stall
archive/disk-pacing
archive/u-builds-from-graph
archive/mac-idle
archive/ship-direct
archive/vmcache/shards
archive/soft-margin
archive/behind-no-target
archive/filtered-binaries
archive/vmcache/setup-layers
archive/direct-off-prev
archive/probe-budget
archive/vm-helper-exit
archive/jobs-soft-bound
archive/vmcache/vm-disks
archive/vmcache/failure-outputs
archive/narrowed-not-verdict
archive/scratch-direct-off
archive/handover-holds
archive/memory-lines
archive/drain-destroys
archive/pool-size
archive/drain-own-frees
archive/test-schema-drop
archive/deploy-disk
archive/deploy-disk-lines
archive/clone-aware-freeing
archive/absolute-headroom
archive/zfs-pool-size
archive/u-int5
archive/u-load
archive/u-warn
archive/u-steer
archive/revert-stall-once
archive/guard-headroom
archive/u-int3
archive/u-readsets
archive/u-hermetic
archive/mem-virtio
archive/u-buildjobs
archive/u-waits
archive/u-three
archive/u-zfs-stall
archive/u-config
archive/u-lean
archive/u-e2e
archive/u-integrate2
archive/u-jobenv
archive/u-cache-blobs
archive/u-observe2
archive/u-sched-nospread
archive/u-node-bound
archive/u-sched-oom
archive/u-review-store
archive/u-observe
archive/u-review-engine
archive/u-review-srv
archive/u-review-node
archive/u-review-sched
archive/preempt-measured
archive/u-integrate
archive/u-eng
archive/lock-off-runtime
archive/u-vm
archive/u-gone
archive/u-offline
archive/ready-starve
archive/u-notices
archive/heads-never-superseded
archive/u-learn
archive/int
archive/u-graph
archive/u-umount
archive/supersede-followed
archive/preparing-booking
archive/u-xdev
archive/u-env
archive/u-poll
archive/u-wrap
archive/u-room
archive/u-wrap-try
archive/u-fixed
archive/unstall
archive/u-fix3
archive/u-cwd
archive/resume-supersedes
archive/server-heap
archive/u-harness
archive/u-macos
archive/u-node
archive/u-eng2
archive/u-leader
archive/u-cutover
archive/u-cache
archive/u-sched
archive/u-engine
archive/chore/agpl-license
archive/note-x86-disk-room
archive/pass-cost
archive/prod-defects
archive/clippy-false-greens
archive/t-pace-variance-prototype
archive/outputs-reattach
archive/fix-retry-needs
archive/no-supersede-uncached
archive/fix/promoted-view-mtime
archive/rb-merge
archive/ft-sched
archive/ft-node
archive/ft-engine
archive/fx-sim
archive/fx2-mem
archive/fx2-store
archive/fx2-ci
archive/fx-work
archive/fx-ci
archive/fx-sched
archive/fx-req
archive/fx-store
archive/fx-cache
archive/rb-storage
archive/rb-scheduling
archive/rb-sweep
archive/rb-tracking
archive/rb-workers
archive/rb-client
archive/rb-profiles
archive/rebuild
archive/batch-deploy
archive/fix-roll
archive/work
archive/fix-busy
archive/fix-perf
archive/fix-suite
archive/fix-spread
archive/fix-sig
archive/fix-wait
archive/fix-init
archive/sizing
archive/fix-drift
archive/delivery
archive/fix-snap
archive/fix-own
archive/fix-rollout
archive/fix-hang
archive/fix-tree
archive/images
archive/fill
archive/sched-gate-preparing-after
archive/takeover-sim
archive/image-d244b22
archive/image-ce8a09e
archive/image-c9ff4f7
archive/image-489bec9
archive/image-7e07ffb
archive/image-583ea93
archive/image-8e1cd2c
archive/image-fbf0a9c
archive/image-6924e11
archive/image-29cabc3
archive/image-97ebb0e
archive/image-d0e23ac
archive/image-319fce9
archive/image-4f689e1
archive/image-feacbcd
archive/image-d5d9446
archive/image-6b86940
archive/fix/dedup-priority-promotion
archive/image-a5b0fe3
archive/image-462afb1
archive/image-f39d42c
archive/image-6e71fb4
archive/image-0c62329
archive/resources
archive/image-112b6a6
archive/image-8b06530
archive/image-5ae7cd8
archive/fmt-fix-in-t-toml
archive/image-arm64
Labels
Clear labels
No items
No 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
tilo/t#61
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Read-only review of
9faf6c61..b0dec1c3(3ee9fee2,1a997f0b,d0867769,b0dec1c3), on main since 18:20Z 11-13 and on testing since 18:26Z. Production serves9faf6c61. Nothing here was run; finding 1 I read end to end myself, the others come from a second reader and are marked.1. A rollback from
b0dec1c3to9faf6c61cannot start while a cargo buildb0dec1c3placed is open. (Verified.)ActionKind::Buildgainsdeclared,alsoandunheld(src/jobs/carried.rs), written intojobs.carriedwhenever they are not empty;declaredis not empty for every build with a declared key. On9faf6c61ActionKindisdeny_unknown_fieldsandBuildhaspackage,on,resolvedonly. ItsJobs::follow(src/jobs/follow.rs:80) answers "job …: what it carries doesn't read" for the first such row and the engine's start propagates it (engine.jobs.follow(out).await?, src/runs/engine.rs:348). So with about 290 runs open the build before never leads. src/db/mod.rs already has the rule for this (a new carried fact gets a column of its own, aspart_ofandunclaimeddid). The forward upgrade is fine (serde(default)).2. Verdicts of packages whose tests start programs (
CargoDef::starts) may be served stale. (Second reader; not verified by me.)Those packages get no resolved slice (src/drivers/cargo/mod.rs:1073), so the verdict's key is the bare check key, and its read set is now the build's outside reads plus
with_build's file names plus the test runs' reads: noCargo.lock, no directory listing. Scenarios: a commit that only moves a dependency inCargo.lock; a newtests/*.rstarget. On9faf6c61the verdict's read set was the build's traced set, which held both.3. No fallback while the warm runs. (Second reader.) A declared key whose row the warm has not reached misses and builds. The ~430 runs re-driven at a restart ask at once, rows are warmed in hash order, so most of the first wave's builds miss. Drivers in flight at the promote hold the old claim keys; new runs claim the declared keys and do not join them.
4. The warm stops for good at its first error. (Second reader.) A row that does not parse (
OutsideRowisdeny_unknown_fields;9faf6c61read such a row as unknown),entry_at,Trust::parseor a database timeout ends it (warm.rs:99, 103, 173-176); the page is not deleted, so every later leadership stops on the same page.5. The warm holds the log's turn and
LOG_LOCKfor a whole page of 100 rows (three statements a row and a DELETE of 100 TOASTed rows), page after page with no pause. (Second reader.) Every put, use, collect and drop waits up to a page; the database has two cores and was throttled in 58 to 76% of periods this morning. Deleting 22.6 GB of TOAST writes WAL of that order on a volume with 27 GB free; the table's space is not given back by DELETE.6. On production the step meets 92,185 rows by value, 3,102 named by ids and 37,007 with neither (18:28Z). On testing it logged
rows=789 warmed=205 mb=10 secs=0.31and leftdeclared_buildsempty. After it, a rollback finds no declared row at all.Smaller: warmed entries whose looked-up names are also opened files get a key1 no live lookup computes (declared.rs:468-472); a flaky mark is not copied (warm.rs:240-257); every warmed entry enters the lookups' in-memory set as
mine, turning both generations over.Tests the range lacks: more than one page; a restart midway; a row that fails; 9faf6c61's types reading b0dec1c3's
carried; a warmed entry found by a real family lookup; astartspackage with a lock-only change.I will not promote this range. If you promote it, 1 means there is no way back while jobs are out, so please settle it first.
Shown on testing, 19:00 to 19:01Z 11-13 (finding 1). Testing served
b0dec1c3with its own forced check set out; as soon as a job row nameddeclaredinjobs.carried(two did: theclippyand thetestdriver) I deployed9faf6c61. Its server never came up: the pod went into CrashLoopBackOff (two restarts within the minute,/v1/ready503), each start ending onI then put
b0dec1c3back on testing (19:01Z), which is what it served before; your run on696e8c5c(r6bcc7805c5) was in flight through this and is driven again. An earlier try at 18:54Z had passed, but only because the driver had ended by then and the rows out were test shards, whose stored form did not change: a rollback proof has to put the old build under the new build's driver jobs.So after a promote of this range there is no rollback by promote while one cargo driver it placed is still out. Findings 2 to 6 are unchanged and still unproven by a run.
32527a94, read 21:15Z 11-13 (finding 1). Read-only; nothing run yet.32527a94aBuildwritespackage,onandresolvedonly, andReadingandCarriedhold the same fields as on9faf6c61, so 9faf6c61'sCarriesreads a row32527a94writes. Outside tests the one reader ofjobs.carriedisJobs::follow(follow.rs:80), which applieskept_by_from_row; the two writers are placing (place.rs:34) andtake_left(follow.rs:250), and both write the column. A rowb0dec1c3wrote (the three incarried, the column NULL) still reads. I found no fault in the change.32527a94adds one, and9faf6c61refuses a database one version ahead of it (src/db/mod.rs:697, "the database's schema is version …"), as your commit message says. So after a promote of32527a94a rollback to9faf6c61by promote does not start at all, whatever is out; withb0dec1c3it started once its drivers had ended. The step is additive (9faf6c61names its columns and reads pastkept_by), so what remains is settingschema_versionback by hand before the old build starts. I will show that on testing (9faf6c61under 32527a94's driver rows, with the version set back) once testing serves32527a94and your run there is through, so the procedure is a proven one.I still will not promote the range.
Rollback shown on testing, 21:27 to 21:31Z 11-13 (
32527a94, then9faf6c61, then32527a94again). Testing served32527a94at schema version 36 and was quiet after your run. My forced check set (r6ebf0642cd) had two driver rows holdingkept_by(clippy, test) and none namingdeclaredincarried.9faf6c61does not start:t: the database's schema is version 36, this t's is 35 and brings on versions from 23; its pod went into CrashLoopBackOff.UPDATE schema_version SET version = 35it starts and leads. It answered 21 s after the statement, drove the run again (a run driven again keeps the checks it told ... kept=5 of=8), followed the clippy driver row32527a94had placed with no "doesn't read" line, and the run's three clippy checks passed under it. So the carried JSON reads under the old build's real code, shown for one driver row.32527a94took the database at 35, ran its step again and left it at 36, with no warning of its own.So the way back from
32527a94is one statement by hand before the old build starts; nothing in the deploy does it. Findings 2 to 6 are as they were; after the warm a rolled-back build still finds no declared row.The run's three test checks ended
errorfor a reason of their own, as they did in main's own run r8011e0413f at 21:11Z: a compile refused as never fitting the node. A separate issue follows.9dedec3b, read 21:50Z 11-13. Read-only; there is no build newer than it to roll back from, so nothing of it is shown by a run.versionwhat the steps make it. It changes nothing for9faf6c61, as your message says: the way back to that build stays the statement by hand shown above, and9faf6c61namesversionalone, so the two new columns do not disturb it.blob_refswhenever its definition's digest differs. So a rolled-back build narrowsblob_refsto its own definition, and the store's collection under it lets go every blob only the newer build's rows name; rolled forward again, those rows name blobs the store lacks. Today refs.sql is the same on9faf6c61and9dedec3b, so nothing is lost now. It bites the first time a step adds a table or column holding hashes together with a line in refs.sql: that step would have to be marked not additive, or the newer-database path would have to leave the view alone.errors: 1: the refused compile of issue #62, so its tests did not run in CI.After your promote of
6ebaa239(22:08Z 11-13): what my findings came to. Readings only, to 22:40Z.rows=135066 warmed=39335 mb=25468 secs=1630.7), the write-ahead log stayed at about 1.0 GB and the volume lost under 150 MB (27.3 GB free). The database was throttled in up to half of the periods for the first minutes of the restart, as at any restart, not by the warm.t_declared_*counters went with3ee9fee2(before the promote they showed 946 and 2,468 served per ten minutes and 0 disagreed). Byt_check_results_total{how}the last ten-minute window has 52% of checks reused, against 56% over the 90 minutes before the promote; the two windows right after the restart are not comparable. Too early to say either way.9faf6c61is still the statement by hand (version 35, across two additive steps).22:58Z: the emptied table's space came back. Autovacuum truncated its TOAST table: 22,573 MB at 22:49Z, 284 MB at 22:58Z, and the volume went from 27.5 to 49.9 GB free. So the point I left open above is settled without a TRUNCATE in the code.