Bound the /__hot-reload__ long-poll duration#1395
Open
richard-to wants to merge 2 commits into
Open
Conversation
The /__hot-reload__ debug endpoint blocked a request thread indefinitely until a code change triggered a reload, and Flask's dev server ran unthreaded, so a single in-flight poll serialized all other requests. Cap the poll at a max duration (client already retries) and run the dev server threaded so one slow/long connection can't starve everyone else. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SH7W9VinxHv8yMEwfW1yXX
The threaded dev server change surfaces an unrelated latent race in MemoryStateSessionBackend (unsynchronized check-then-act on a shared dict) that needs its own fix first. Splitting this out as a separate improvement; the bounded hot-reload poll stands on its own. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SH7W9VinxHv8yMEwfW1yXX
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
/__hot-reload__debug endpoint blocked its request indefinitely until a code change triggered a reload. Combined with Flask's dev server processing one request at a time by default, a single in-flight poll could serialize (or in the worst case, freeze) every other request against the app for as long as that connection stayed open._MAX_POLL_SECONDS = 25inmesop/server/server_debug_routes.py) so no single request can hold a connection open indefinitely. If the counter hasn't changed by the deadline, the endpoint returns the unchanged counter instead of continuing to block.mesop/web/src/services/channel.ts) to only trigger a hot reload when the returned counter actually differs from what it last saw, and to otherwise immediately re-poll. This keeps behavior identical for real reload events while making the timeout-and-retry path a no-op rather than a spurious reload.Not included
threaded=Trueto Mesop's built-in dev-server.run()calls (CLI, Colab/notebook, and themesoppip binary) as a complementary fix. That's been reverted for now: it surfaces a separate, unrelated latent race inMemoryStateSessionBackend(unsynchronized check-then-act on a shared in-memory dict) that needs its own fix first. Tracking that as a follow-up rather than bundling it here.Test plan
_MAX_POLL_SECONDStemporarily shrunk) that an unchanged counter times out and returns the same value after the bounded duration, and that a counter bump mid-poll still returns promptly with the new value.Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01SH7W9VinxHv8yMEwfW1yXX