aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2022-05-15 22:41:17 +0200
committerKim Alvefur <zash@zash.se>2022-05-15 22:41:17 +0200
commitd33b858436ddfce5a3364ee35debb7988e6dda0c (patch)
tree4fbd239b389e13c60456e724657c50cfeb9b9e87
parent3b6565c77ba7bb4107bc00d1004bf8db6eaa1fe4 (diff)
downloadprosody-d33b858436ddfce5a3364ee35debb7988e6dda0c.tar.gz
prosody-d33b858436ddfce5a3364ee35debb7988e6dda0c.zip
net.server_epoll: Add option to defer accept() until data available
This is a Linux(?) socket option that delays the accept signal until there is data available to read. E.g. with HTTP this might mean that a whole request can be handled without going back trough another turn of the main loop, and an initial client <stream> can be responded to. This may have effects on latency and resource use, as the server does not need to allocate resources until really needed.
-rw-r--r--CHANGES1
-rw-r--r--net/server_epoll.lua6
2 files changed, 7 insertions, 0 deletions
diff --git a/CHANGES b/CHANGES
index f47dc1a9..e34ea88e 100644
--- a/CHANGES
+++ b/CHANGES
@@ -12,6 +12,7 @@ TRUNK
- Honour 'weight' parameter during SRV record selection
- Support for RFC 8305 "Happy Eyeballs" to improve IPv4/IPv6 connectivity
- Support for TCP Fast Open in server_epoll (pending LuaSocket support)
+- Support for deferred accept in server_epoll (pending LuaSocket support)
0.12.0
======
diff --git a/net/server_epoll.lua b/net/server_epoll.lua
index 0d04f6ee..d0ca3125 100644
--- a/net/server_epoll.lua
+++ b/net/server_epoll.lua
@@ -95,6 +95,9 @@ local default_config = { __index = {
-- TCP Fast Open
tcp_fastopen = false;
+
+ -- Defer accept until incoming data is available
+ tcp_defer_accept = false;
}};
local cfg = default_config.__index;
@@ -912,6 +915,9 @@ local function wrapserver(conn, addr, port, listeners, config)
if cfg.tcp_fastopen then
server:setoption("tcp-fastopen", cfg.tcp_fastopen);
end
+ if type(cfg.tcp_defer_accept) == "number" then
+ server:setoption("tcp-defer-accept", cfg.tcp_defer_accept);
+ end
server:add(true, false);
return server;
end