fix: add SO_REUSEADDR to find_free_port to handle TIME_WAIT state #4573
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.
PR type
PR information
The
find_free_port()
function exhibits inconsistent behavior when trying to bind to recently used ports. Specifically:swift deploy --port 8001
process on port 8001,find_free_port(8001)
sometimes returns 8002 (I actually believe it would be better to throw an exception if a port was explicitly specified)When a process using a TCP port is terminated, the port enters TCP's TIME_WAIT state for 30-120 seconds (OS-dependent). During this period,
socket.bind()
fails even though the port is effectively available. AddingSO_REUSEADDR
socket option to allow binding to ports in TIME_WAIT state. In fact, this is what has been done withinuvicorn
as well before launching the server: https://github.com/encode/uvicorn/blob/5e33d430f13622c8363fe74d97963ab37f3df3c2/uvicorn/config.py#L513