kill off remaining kgio uses
commitb652fa51c1342496bdcdecca8e567f1fb46c41c9
authorEric Wong <bofh@yhbt.net>
Tue, 5 Sep 2023 06:43:20 +0000 (5 06:43 +0000)
committerEric Wong <bofh@yhbt.net>
Mon, 15 Jan 2024 01:45:45 +0000 (15 01:45 +0000)
treeb10a1dd61bdf0c4b253600ab38dbfbc311da93ed
parent31d0539878b0e2247a4f98bc0241e05d4738e500
kill off remaining kgio uses

kgio is an extra download and shared object which costs users
bandwidth, disk space, startup time and memory.  Ruby 2.3+
provides `Socket#accept_nonblock(exception: false)' support
in addition to `exception: false' support in IO#*_nonblock
methods from Ruby 2.1.

We no longer distinguish between TCPServer and UNIXServer as
separate classes internally; instead favoring the `Socket' class
of Ruby for both.  This allows us to use `Socket#accept_nonblock'
and get a populated `Addrinfo' object off accept4(2)/accept(2)
without resorting to a getpeername(2) syscall (kgio avoided
getpeername(2) in the same way).

The downside is there's more Ruby-level argument passing and
stack usage on our end with HttpRequest#read_headers (formerly
HttpRequest#read).  I chose this tradeoff since advancements in
Ruby itself can theoretically mitigate the cost of argument
passing, while syscalls are a high fixed cost given modern CPU
vulnerability mitigations.

Note: no benchmarks have been run since I don't have a suitable
system.
13 files changed:
lib/unicorn.rb
lib/unicorn/http_request.rb
lib/unicorn/http_server.rb
lib/unicorn/oob_gc.rb
lib/unicorn/socket_helper.rb
lib/unicorn/worker.rb
t/oob_gc.ru
t/oob_gc_path.ru
test/unit/test_request.rb
test/unit/test_socket_helper.rb
test/unit/test_stream_input.rb
test/unit/test_tee_input.rb
unicorn.gemspec