hysteria2: bind UDP socket before spawning, return bind errors instead of panicking#143
Open
zytakeshi wants to merge 1 commit into
Open
hysteria2: bind UDP socket before spawning, return bind errors instead of panicking#143zytakeshi wants to merge 1 commit into
zytakeshi wants to merge 1 commit into
Conversation
start_hysteria2_server unwrapped the UDP socket bind inside the spawned per-endpoint task, but the function returns Ok to the caller before the task runs. A bind failure (e.g. EADDRINUSE on restart) therefore panicked a worker thread while the caller saw a successful start. Hoist the bind ahead of tokio::spawn (kept inside the per-endpoint loop to preserve SO_REUSEPORT) and propagate the error via ? so callers can handle it; log-and-return on in-task endpoint creation failure instead of unwrapping.
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.
start_hysteria2_server returns io::Result<Vec<JoinHandle<()>>>, but the per-endpoint loop did the UDP socket bind and the quinn endpoint creation inside tokio::spawn(async move { ... }) and .unwrap()d both.
The function pushes the join handles and returns Ok to its caller before any spawned task body runs. So a bind failure -- e.g. EADDRINUSE during a restart or migration -- did not surface as the io::Error the signature already allows; it panicked a worker thread while the caller had already observed a successful start.
Fix:
No config or protocol change; pure robustness. The bind -- the hard failure case -- is now surfaced synchronously to the caller.