-
Notifications
You must be signed in to change notification settings - Fork 50
replace reusePort by failOnExistingPort, simpler state (single bool), no TOCTOU for numThreads=1
#53
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
dom96
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There is no need to worry about breaking changes for an unreleased piece of software, 0.4.0 was never tagged.
Please don't remove the existing reusePort. Just add the new failOnExisting flag. This PR shouldn't require more than 5 lines of changes.
I've added suggestions for exactly what I have in mind.
| # Package | ||
|
|
||
| version = "0.4.0" | ||
| version = "0.5.0" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| version = "0.5.0" | |
| version = "0.4.0" |
| if settings.failOnExistingPort: | ||
| close(newSocketAux(settings)) # attempt to bind to a temporary socket | ||
| var settings = settings | ||
| settings.failOnExistingPort = false |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| if settings.failOnExistingPort: | |
| close(newSocketAux(settings)) # attempt to bind to a temporary socket | |
| var settings = settings | |
| settings.failOnExistingPort = false | |
| if settings.failOnExistingPort: | |
| bindOnExistingTest(settings) |
| proc newSocketAux(settings: Settings): owned(Socket) = | ||
| result = newSocket(settings.domain) | ||
| result.setSockOpt(OptReuseAddr, true) | ||
| result.setSockOpt(OptReusePort, not settings.failOnExistingPort) | ||
| result.bindAddr(settings.port, settings.bindAddr) | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| proc newSocketAux(settings: Settings): owned(Socket) = | |
| result = newSocket(settings.domain) | |
| result.setSockOpt(OptReuseAddr, true) | |
| result.setSockOpt(OptReusePort, not settings.failOnExistingPort) | |
| result.bindAddr(settings.port, settings.bindAddr) | |
| proc bindOnExistingTest(settings: Settings) = | |
| let sock = newSocket(settings.domain) | |
| sock.setSockOpt(OptReuseAddr, true) | |
| sock.bindAddr(settings.port, settings.bindAddr) |
| let server = newSocket(settings.domain) | ||
| server.setSockOpt(OptReuseAddr, true) | ||
| if compileOption("threads") and not settings.reusePort: | ||
| raise HttpBeastDefect(msg: "--threads:on requires reusePort to be enabled in settings") | ||
| server.setSockOpt(OptReusePort, settings.reusePort) | ||
| server.bindAddr(settings.port, settings.bindAddr) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Revert this.
|
If you're still interested in pursuing this then please rebase and reopen this PR. |
should be followed by dom96/jester#281 in jester
alternative to #50 and #52 that hits all the targets:
jester.reusePortashttpbeast.failOnExistingPort=not reusePortfailOnExistingPortinside httpbeast, it's consistentThe only downside is that this is a breaking change from the previous commit for client code that would've used thew new reusePort flag, but it was introduced very recently (10 days ago), and wasn't the commit I had signed up for, refs #47 (comment)
so I've bumped the version to 0.5.0
(an alternative to this 10 day-window breaking change would be possible by adding a different
initSettings2and deprecatinginitSettings, or simply defineinitSettingsby interpreting the reusePort argument asnot failOnExistingPort; but this software is pre-1.0 and it's only a 10-day window so IMO is acceptable)