diff options
author | Eric Wong <e@80x24.org> | 2019-06-30 22:19:39 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2019-06-30 22:25:25 +0000 |
commit | 8472ccddd410a136b5aaa8bb886c7cf0dc302411 (patch) | |
tree | c5f33963c285a1e027ac8c89c8497c67df1e1e80 /t | |
parent | 3eb26fe04dae68612c841e749abd2848ce78ae59 (diff) | |
download | public-inbox-8472ccddd410a136b5aaa8bb886c7cf0dc302411.tar.gz |
For users relying on socket activation via service manager (e.g. systemd) and running multiple service instances (@1, @2), we need to ensure configuration of the socket is NonBlocking. Otherwise, service managers such as systemd may clear the O_NONBLOCK flag for a small window where accept/accept4 blocks: public-inbox-nntpd@1 |systemd |public-inbox-nntpd@2 --------------------------+----------------+-------------------- F_SETFL,O_NONBLOCK|O_RDWR | | (not running, yet) |F_SETFL, O_RDWR | |fork+exec @2... | accept(...) # blocks! | |(started by systemd) | |F_SETFL,O_NONBLOCK|O_RDWR | |accept(...) non-blocking It's a very small window where O_NONBLOCK can be cleared, but it exists, and I finally hit it after many years.
Diffstat (limited to 't')
-rw-r--r-- | t/common.perl | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/t/common.perl b/t/common.perl index 3f05b68a..91d65c5f 100644 --- a/t/common.perl +++ b/t/common.perl @@ -24,15 +24,18 @@ sub tcp_server () { Proto => 'tcp', Type => Socket::SOCK_STREAM(), Listen => 1024, + Blocking => 0, ) } sub unix_server ($) { - IO::Socket::UNIX->new( + my $s = IO::Socket::UNIX->new( Listen => 1024, Type => Socket::SOCK_STREAM(), Local => $_[0], - ) + ); + $s->blocking(0); + $s; } sub spawn_listener { |