diff options
author | Eric Wong <e@80x24.org> | 2021-01-31 22:28:32 -1000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2021-02-01 11:38:29 +0000 |
commit | 6d50cd33d0186edfb395a9015a7246ef94537909 (patch) | |
tree | fd93f3f8babc3ba271dca3b20a37de8b469636eb | |
parent | 1d34aa20424c96fa99de27bc02c160e1de56c0a6 (diff) | |
download | public-inbox-6d50cd33d0186edfb395a9015a7246ef94537909.tar.gz |
As with PublicInbox::IPC, we'll attempt to bump RLIMIT_NOFILE and transparently workaround ETOOMANYREFS. If that fails, we'll give the user a hint to bump RLIMIT_NOFILE since ETOOMANYREFS is an uncommon error which users may be unfamiliar with. Found while stress testing for segfaults.
-rwxr-xr-x | script/lei | 29 |
1 files changed, 20 insertions, 9 deletions
@@ -4,10 +4,9 @@ use strict; use v5.10.1; use Socket qw(AF_UNIX SOCK_SEQPACKET MSG_EOR pack_sockaddr_un); -use Errno qw(EINTR ECONNRESET); use PublicInbox::CmdIPC4; my $narg = 5; -my ($sock, $pwd); +my $sock; my $recv_cmd = PublicInbox::CmdIPC4->can('recv_cmd4'); my $send_cmd = PublicInbox::CmdIPC4->can('send_cmd4') // do { require PublicInbox::Spawn; # takes ~50ms even if built *sigh* @@ -73,20 +72,32 @@ connect($path): $! (after attempted daemon start) Falling back to (slow) one-shot mode } - 1; -}) { # (Socket::MsgHdr|Inline::C), $sock, $pwd are all available: + # (Socket::MsgHdr|Inline::C), $sock are all available: open my $dh, '<', '.' or die "open(.) $!"; my $buf = join("\0", scalar(@ARGV), @ARGV); while (my ($k, $v) = each %ENV) { $buf .= "\0$k=$v" } $buf .= "\0\0"; - $send_cmd->($sock, [ 0, 1, 2, fileno($dh) ], $buf, MSG_EOR) or - die "sendmsg: $!"; + my $n = $send_cmd->($sock, [0, 1, 2, fileno($dh)], $buf, MSG_EOR); + if (!$n && $!{ETOOMANYREFS} && eval { require BSD::Resource }) { + my $NOFILE = BSD::Resource::RLIMIT_NOFILE(); + my ($s, $h) = BSD::Resource::getrlimit($NOFILE); + if ($s < $h && BSD::Resource::setrlimit($NOFILE, $h, $h)) { + $n = $send_cmd->($sock, [0, 1, 2, fileno($dh)], + $buf, MSG_EOR); + } + } + if (!$n) { + die "sendmsg: $! (check RLIMIT_NOFILE)\n" if $!{ETOOMANYREFS}; + die "sendmsg: $!\n"; + } + 1; +}) { # connected and request sent to lei-daemon, wait for responses or EOF my $x_it_code = 0; while (1) { - my (@fds) = $recv_cmd->($sock, $buf, 4096 * 33); + my (@fds) = $recv_cmd->($sock, my $buf, 4096 * 33); if (scalar(@fds) == 1 && !defined($fds[0])) { - last if $! == ECONNRESET; - next if $! == EINTR; + next if $!{EINTR}; + last if $!{ECONNRESET}; die "recvmsg: $!"; } last if $buf eq ''; |