-
Notifications
You must be signed in to change notification settings - Fork 51
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
replace reusePort
by failOnExistingPort
, simpler state (single bool), no TOCTOU for numThreads=1
#53
Conversation
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.
@@ -1,6 +1,6 @@ | |||
# 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.reusePort
ashttpbeast.failOnExistingPort
=not reusePort
failOnExistingPort
inside 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
initSettings2
and deprecatinginitSettings
, or simply defineinitSettings
by 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)