Skip to content

Commit e08209b

Browse files
committed
ignore reusePort when running with multiple threads for now
1 parent 64310f4 commit e08209b

File tree

1 file changed

+13
-8
lines changed

1 file changed

+13
-8
lines changed

src/httpbeast.nim

+13-8
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,9 @@ type
5454
domain*: Domain
5555
numThreads: int
5656
loggers: seq[Logger]
57-
reusePort*: Option[bool]
58-
# when false, will fail if --threads is passed or if 2
59-
# processes bind to same address/port. We use an Option to avoid
60-
# breaking code that relies on `Settings(port: port)`
57+
reusePort: bool
58+
## controlls whether to fail with "Address already in use".
59+
## This is currently ignored if multiple threads are spawned.
6160

6261
HttpBeastDefect* = ref object of Defect
6362

@@ -67,14 +66,15 @@ const
6766
proc initSettings*(port: Port = Port(8080),
6867
bindAddr: string = "",
6968
numThreads: int = 0,
70-
domain = Domain.AF_INET, reusePort = true): Settings =
69+
domain = Domain.AF_INET,
70+
reusePort = false): Settings =
7171
Settings(
7272
port: port,
7373
bindAddr: bindAddr,
7474
domain: domain,
7575
numThreads: numThreads,
7676
loggers: getHandlers(),
77-
reusePort: some(reusePort),
77+
reusePort: reusePort,
7878
)
7979

8080
proc initData(fdKind: FdKind, ip = ""): Data =
@@ -321,7 +321,7 @@ proc eventLoop(params: (OnRequest, Settings)) =
321321

322322
let server = newSocket(settings.domain)
323323
server.setSockOpt(OptReuseAddr, true)
324-
server.setSockOpt(OptReusePort, settings.reusePort.get(true))
324+
server.setSockOpt(OptReusePort, settings.reusePort)
325325
server.bindAddr(settings.port, settings.bindAddr)
326326
server.listen()
327327
server.getFd().setBlocking(false)
@@ -477,8 +477,13 @@ proc run*(onRequest: OnRequest, settings: Settings) =
477477
when compileOption("threads"):
478478
var threads = newSeq[Thread[(OnRequest, Settings)]](numThreads)
479479
for i in 0 ..< numThreads:
480+
var settings2 = settings
481+
if numThreads > 1: settings2.reusePort = true
482+
# TODO: in future work, we can honor `reusePort = false` by
483+
# attempting to bind to the port, and then on success spawn the threads
484+
# with `reusePort = false`.
480485
createThread[(OnRequest, Settings)](
481-
threads[i], eventLoop, (onRequest, settings)
486+
threads[i], eventLoop, (onRequest, settings2)
482487
)
483488
echo("Listening on port ", settings.port) # This line is used in the tester to signal readiness.
484489
joinThreads(threads)

0 commit comments

Comments
 (0)