# HG changeset patch # User Kim Alvefur # Date 1634824756 -7200 # Node ID 59557bc3c4b8a0a92952e41013ac5ba2e14946a2 # Parent 0f786c4a2cb2fa4cadbad9dca70f80fe4462520b net.server_epoll: Process all queued events from epoll before timers Should call timers less frequently when many sockets are waiting for processing. May help under heavy load. Requested by Ge0rG Backport of 2bcd84123eba requested by Roi diff -r 0f786c4a2cb2 -r 59557bc3c4b8 net/server_epoll.lua --- a/net/server_epoll.lua Tue Oct 12 14:53:45 2021 +0200 +++ b/net/server_epoll.lua Thu Oct 21 15:59:16 2021 +0200 @@ -771,7 +771,7 @@ repeat local t = runtimers(cfg.max_wait, cfg.min_wait); local fd, r, w = poll:wait(t); - if fd then + while fd do local conn = fds[fd]; if conn then if r then @@ -784,7 +784,9 @@ log("debug", "Removing unknown fd %d", fd); poll:del(fd); end - elseif r ~= "timeout" and r ~= "signal" then + fd, r, w = poll:wait(0); + end + if r ~= "timeout" and r ~= "signal" then log("debug", "epoll_wait error: %s[%d]", r, w); end until once or (quitting and next(fds) == nil);