conformance: phase 2 once saw a subscribed payload without the edited row #52
Labels
No labels
area:defold
area:docs
area:infra
area:protocol
area:testing
kind:bug
kind:chore
phase:breadth
phase:core
phase:hardening
phase:slice
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
yuris/spacetimedb-defold#52
Loading…
Add table
Add a link
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?
Split out of #39, which was retitled and closed on what was actually proven (the
restartgate returned before the module database had begun opening). This issue carries the part that is still unexplained, named from the symptom rather than from a theory.The symptom
One conformance run had phase 2 observe a
subscribedpayload that did not contain the edited row, preceded by a second1001disconnect. The original failing log is in #39.#39's stated mechanism was wrong — this is the most important thing here
#39 said "phase 2 asserts the row is restored within its budget, and the extra round trip can push it past that". There is no phase-2 budget.
dev/example/main/smoke.script:218-227runs the assertion insideevt.type == "subscribed" and self.phase == 2and checks the cache immediately. The only clock is the 90 s globalTIMEOUTat:481-483, which emits a different message.So the reported failure requires a
subscribedpayload that lacked the edited row — not a slow one. Anyone chasing a timing budget here is chasing something that does not exist.Ruled out, with evidence
Recorded so the next occurrence is not re-investigated from zero. Each of these was actively disproved, not merely unobserved.
subscribeatsmoke.script:105; phase 3'ssubscribe_queryat:251comes strictly after PHASE2 OK.06:08:03.0423, last 200 on attempt 24, first connection refusal on attempt 25 at.0502(7.9 ms, one curl iteration), process gone.0539, five further pings all refused. There is no half-open window.InitialSubscriptionwithnum_rows=1carrying the correct row, 1–2 ms afteronopen. Zero1001frames, zeroSubscriptionError.stdb/init.lua:140). Three orders of magnitude apart, so #50 cannot have been the cause even though it was a real defect worth fixing.Status
Not reproducible on demand. 70 unpatched runs green (50 idle, 10 idle, 10 with the client's backoff cut to 20 ms so it retried 28 times per run), plus 26 + 6 green post-#50. One occurrence, one log.
Left open deliberately rather than closed as fixed: #50 did not fix this, and saying otherwise would bury the one real observation under a change that provably cannot explain it.
If it recurs
Capture the raw frames, not just the verdict. The single most diagnostic output is the
subscribedpayload'snum_rowsand row contents beside the preceding close frame's code — that distinguishes a server that answered wrongly from a client that read the wrong reply, and nothing in the ruled-out list above covers the former.Not blocking
Not a v1.0 blocker.
dev/is export-ignored, so this is harness reliability, not shipped behaviour. It is also the reason #16'scontinue-on-errorshould stay on the HTML5 CI step until a run has actually passed there.A possible recurrence during the v1.1.0 release gate — but I cannot attribute it
Recording it because this issue exists so the next occurrence is not investigated
from zero, and because leaving it out would be the same mistake as burying it.
dev/tools/html5-conformance.shreturned[html5] FAILonce on the v1.1.0release branch. Immediately re-run on the same tree it passed, and three further
back-to-back runs passed. So: 1 failure in 5 runs.
I did not capture the raw frames, which this issue explicitly asks for, so I
cannot say whether it is this bug. Stating that plainly rather than claiming a
match. What I have:
FAIL; I had filtered the output and lost the detailbefore realising it mattered.
HTML5_TIMEOUT, so roughly 4× headroom.That last point matters for one hypothesis worth ruling out explicitly: #66 added
PHASE6 (a 10,000-row bulk subscription, ~127ms of apply on the wasm tier) to the
phase sequence, and
html5-conformance.mjsnotes the budget is per load ratherthan per run. It is not a budget problem — 28s against 120s, and the failing
run was not near the limit either, since a timeout emits its own distinct message
rather than a bare
FAIL.So PHASE6 does not appear to have introduced this, and the ruled-out list above
stands untouched.
Not blocking v1.1.0, for the same reason as before:
dev/is export-ignored,so this is harness reliability rather than shipped behaviour. It remains the
reason #16's
continue-on-errorshould stay on the HTML5 CI step.For the next person, including me: the harness output must be captured whole, not
tailed or grepped, or the diagnostic this issue asks for is gone by the time you
notice you need it. Same lesson as the unit runner printing a crash before its
oklines.yuris referenced this issue2026-08-21 02:17:41 +00:00