From d214bcfb4f4995bcb9a66b17893a6d32a5e138ca Mon Sep 17 00:00:00 2001 From: Eugene Kabanov Date: Mon, 31 Jul 2023 22:40:00 +0300 Subject: [PATCH] Increase backlog defaults to maximum possible values. (#428) --- chronos/apps/http/httpserver.nim | 2 +- chronos/apps/http/shttpserver.nim | 2 +- chronos/transports/stream.nim | 34 +++++++++++++++++++++++++------ 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/chronos/apps/http/httpserver.nim b/chronos/apps/http/httpserver.nim index b86c0b3..c1e45c0 100644 --- a/chronos/apps/http/httpserver.nim +++ b/chronos/apps/http/httpserver.nim @@ -187,7 +187,7 @@ proc new*(htype: typedesc[HttpServerRef], serverIdent = "", maxConnections: int = -1, bufferSize: int = 4096, - backlogSize: int = 100, + backlogSize: int = DefaultBacklogSize, httpHeadersTimeout = 10.seconds, maxHeadersSize: int = 8192, maxRequestBodySize: int = 1_048_576): HttpResult[HttpServerRef] {. diff --git a/chronos/apps/http/shttpserver.nim b/chronos/apps/http/shttpserver.nim index 927ca62..b993cb5 100644 --- a/chronos/apps/http/shttpserver.nim +++ b/chronos/apps/http/shttpserver.nim @@ -90,7 +90,7 @@ proc new*(htype: typedesc[SecureHttpServerRef], secureFlags: set[TLSFlags] = {}, maxConnections: int = -1, bufferSize: int = 4096, - backlogSize: int = 100, + backlogSize: int = DefaultBacklogSize, httpHeadersTimeout = 10.seconds, maxHeadersSize: int = 8192, maxRequestBodySize: int = 1_048_576 diff --git a/chronos/transports/stream.nim b/chronos/transports/stream.nim index 257c475..45e4054 100644 --- a/chronos/transports/stream.nim +++ b/chronos/transports/stream.nim @@ -61,6 +61,7 @@ type const StreamTransportTrackerName* = "stream.transport" StreamServerTrackerName* = "stream.server" + DefaultBacklogSize* = high(int32) when defined(windows): type @@ -1819,11 +1820,32 @@ proc closeWait*(server: StreamServer): Future[void] = server.close() server.join() +proc getBacklogSize(backlog: int): cint = + doAssert(backlog >= 0 and backlog <= high(int32)) + when defined(windows): + # The maximum length of the queue of pending connections. If set to + # SOMAXCONN, the underlying service provider responsible for + # socket s will set the backlog to a maximum reasonable value. If set to + # SOMAXCONN_HINT(N) (where N is a number), the backlog value will be N, + # adjusted to be within the range (200, 65535). Note that SOMAXCONN_HINT + # can be used to set the backlog to a larger value than possible with + # SOMAXCONN. + # + # Microsoft SDK values are + # #define SOMAXCONN 0x7fffffff + # #define SOMAXCONN_HINT(b) (-(b)) + if backlog != high(int32): + cint(-backlog) + else: + cint(backlog) + else: + cint(backlog) + proc createStreamServer*(host: TransportAddress, cbproc: StreamCallback, flags: set[ServerFlags] = {}, sock: AsyncFD = asyncInvalidSocket, - backlog: int = 100, + backlog: int = DefaultBacklogSize, bufferSize: int = DefaultStreamBufferSize, child: StreamServer = nil, init: TransportInitCallback = nil, @@ -1906,7 +1928,7 @@ proc createStreamServer*(host: TransportAddress, raiseTransportOsError(err) fromSAddr(addr saddr, slen, localAddress) - if listen(SocketHandle(serverSocket), cint(backlog)) != 0: + if listen(SocketHandle(serverSocket), getBacklogSize(backlog)) != 0: let err = osLastError() if sock == asyncInvalidSocket: discard closeFd(SocketHandle(serverSocket)) @@ -1980,7 +2002,7 @@ proc createStreamServer*(host: TransportAddress, raiseTransportOsError(err) fromSAddr(addr saddr, slen, localAddress) - if listen(SocketHandle(serverSocket), cint(backlog)) != 0: + if listen(SocketHandle(serverSocket), getBacklogSize(backlog)) != 0: let err = osLastError() if sock == asyncInvalidSocket: discard unregisterAndCloseFd(serverSocket) @@ -2031,7 +2053,7 @@ proc createStreamServer*(host: TransportAddress, proc createStreamServer*(host: TransportAddress, flags: set[ServerFlags] = {}, sock: AsyncFD = asyncInvalidSocket, - backlog: int = 100, + backlog: int = DefaultBacklogSize, bufferSize: int = DefaultStreamBufferSize, child: StreamServer = nil, init: TransportInitCallback = nil, @@ -2045,7 +2067,7 @@ proc createStreamServer*[T](host: TransportAddress, flags: set[ServerFlags] = {}, udata: ref T, sock: AsyncFD = asyncInvalidSocket, - backlog: int = 100, + backlog: int = DefaultBacklogSize, bufferSize: int = DefaultStreamBufferSize, child: StreamServer = nil, init: TransportInitCallback = nil): StreamServer {. @@ -2059,7 +2081,7 @@ proc createStreamServer*[T](host: TransportAddress, flags: set[ServerFlags] = {}, udata: ref T, sock: AsyncFD = asyncInvalidSocket, - backlog: int = 100, + backlog: int = DefaultBacklogSize, bufferSize: int = DefaultStreamBufferSize, child: StreamServer = nil, init: TransportInitCallback = nil): StreamServer {.