Latest Results
fix: release the dev backend socket when no worker can serve it
The dev supervisor binds the listening socket itself (#7114) so requests
made while a worker is being replaced wait in the accept backlog instead of
being refused. When no worker is alive at all -- the app module raises on
import after a save, or the supervisor is shutting down -- the kernel kept
accepting into that backlog with nobody to answer, so every request hung for
the client's full timeout. 0.9.11.post1, which has no supervisor-owned
socket, refused instantly.
ParentBoundGranian now closes the listening socket when a worker that the
supervisor did not stop leaves no live worker behind, and re-creates it for
the next spawn, so the port refuses connections only while nothing can serve
them. Shutdown closes it as well, rather than granian's detach, which leaks
the descriptor for the lifetime of the process. Workers stopped by the
supervisor (hot reload, rolling respawn) keep the socket bound, so #7114's
behaviour is unchanged: 543 pings at 20 Hz across two hot reloads, 0
refused.
Fixes #7213
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NeyxWsuC9hqSKq8YcEwZyYclaude/fix-finding-017-supervisor-socket fix: only record an uncached var as sent once its delta is delivered
`BaseState.get_delta` recorded the value of every `@rx.var(cache=False)` it
computed as "sent to this client" while the delta was still being built, via
`ComputedVar._record_delta_value`, which wrote `__last_delta_<js_expr>` on the
instance immediately. A downstream `get_delta` override -- the documented
pattern, used by reflex-enterprise's auth delta filter -- that drops such an
entry from the delta, or replaces it with an anonymous placeholder, therefore
left the memo claiming the client had a value it never received. The next
recomputation produced the same value, the #6946 dedupe omitted it, and the
client stayed stale until the value changed again.
Gather the records while the delta is built instead, and commit them in
`_get_resolved_delta` -- the single point every delivery path goes through, and
the one that sees the delta as it comes back out of the override chain, with
its coroutines resolved. A record is stored only where the delivered delta
still holds the very object that was computed for it, so a dropped or replaced
entry is simply owed to the client again. A delta that is built but never
delivered (a bare `get_delta()` call, or one under `_suppress_delta_recording`)
now records nothing, which is the safe direction: the value is re-sent rather
than silently withheld forever.
The dedupe and its wire savings are unchanged for values that are delivered:
the `/uncached` probe of the campaign app sends the same 24 delta frames with
the same keys as 0.9.12a1 (15331 B vs 15274 B inbound, against 26059 B on
0.9.11.post1).
Fixes #7212
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NeyxWsuC9hqSKq8YcEwZyYclaude/fix-finding-003-delta-memo Latest Branches
0%
harsh21234i:fix/7196-json-worker-errors 0%
claude/fix-finding-012-badge-portal 0%
claude/fix-finding-017-supervisor-socket © 2026 CodSpeed Technology