don't set listen(2) backlog on inherited socketsmaster
authorEric Wong <[email protected]>
Sat, 22 Mar 2025 02:49:38 +0000 (22 02:49 +0000)
committerEric Wong <[email protected]>
Wed, 2 Apr 2025 21:55:57 +0000 (2 21:55 +0000)
By using the listen(2) backlog as-is when inheriting (from
systemd or similar), we can give the sysadmin more control on
controlling overload on a per-listener basis.  For systemd
users, this means the `Backlog=' parameter in systemd.socket(5)
can be respected and configured to give certain sockets a
smaller backlog (perhaps combined with with per-listener
`multi-accept' parameter on sockets with the standard (huge)
backlog).

For sockets we create, just use a giant number and let the
kernel clamp it to whatever system-wide limit there is
(e.g. `net.core.somaxconn' sysctl on Linux).

lib/yahns/socket_helper.rb

index 02f2d15..399cb24 100644 (file)
@@ -18,7 +18,6 @@ module Yahns::SocketHelper # :nodoc:
   end
 
   def set_server_sockopt(sock, opt)
-    opt = {backlog: 1024}.merge!(opt)
     sock.close_on_exec = true # needed for inherited sockets
 
     TCPSocket === sock and sock.setsockopt(:IPPROTO_TCP, :TCP_NODELAY, 1)
@@ -31,7 +30,7 @@ module Yahns::SocketHelper # :nodoc:
       end
       log_buffer_sizes(sock, " after: ")
     end
-    sock.listen(opt[:backlog])
+    sock.listen(opt[:backlog]) if opt[:backlog]
   rescue => e
     Yahns::Log.exception(@logger, "#{sock_name(sock)} #{opt.inspect}", e)
   end
@@ -48,7 +47,6 @@ module Yahns::SocketHelper # :nodoc:
   # object in which case it is immediately returned
   def bind_listen(address, opt)
     return address unless String === address
-    opt ||= {}
 
     sock = if address[0] == ?/
       if File.exist?(address)
@@ -80,6 +78,7 @@ module Yahns::SocketHelper # :nodoc:
       raise ArgumentError, "Don't know how to bind: #{address}"
     end
     sock.nonblock = opt[:nonblock] || false
+    opt[:backlog] ||= (2 ** 31) - 1 # let the kernel clamp
     set_server_sockopt(sock, opt)
     sock
   end