* [PATCH 1/4] lei q: do not leave temporary files after oneshot exit
@ 2021-02-02 9:39 Eric Wong
2021-02-02 9:39 ` [PATCH 2/4] ipc: wq: switch to SIGQUIT for graceful exit Eric Wong
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Eric Wong @ 2021-02-02 9:39 UTC (permalink / raw)
To: spew
lei: fix formatting
---
lib/PublicInbox/LEI.pm | 20 +++++++++++---------
lib/PublicInbox/LeiOverview.pm | 7 +++----
lib/PublicInbox/LeiQuery.pm | 4 ++--
lib/PublicInbox/LeiXSearch.pm | 5 +++--
xt/lei-sigpipe.t | 27 +++++++++++++++++++++++++--
5 files changed, 44 insertions(+), 19 deletions(-)
diff --git a/lib/PublicInbox/LEI.pm b/lib/PublicInbox/LEI.pm
index d6fa814c..44afced3 100644
--- a/lib/PublicInbox/LEI.pm
+++ b/lib/PublicInbox/LEI.pm
@@ -284,20 +284,22 @@ sub x_it ($$) {
dump_and_clear_log();
if (my $sock = $self->{sock}) {
send($sock, "x_it $code", MSG_EOR);
- } elsif (!$self->{oneshot}) {
- return; # client disconnected, noop
- } elsif (my $signum = ($code & 127)) { # usually SIGPIPE (13)
- $SIG{PIPE} = 'DEFAULT'; # $SIG{$signum} doesn't work
- kill $signum, $$;
- sleep; # wait for signal
- } else {
+ } elsif ($self->{oneshot}) {
# don't want to end up using $? from child processes
for my $f (qw(lxs l2m)) {
my $wq = delete $self->{$f} or next;
$wq->DESTROY;
}
- $quit->($code >> 8);
- }
+ # cleanup anything that has tempfiles
+ delete @$self{qw(ovv dedupe)};
+ if (my $signum = ($code & 127)) { # usually SIGPIPE (13)
+ $SIG{PIPE} = 'DEFAULT'; # $SIG{$signum} doesn't work
+ kill $signum, $$;
+ sleep; # wait for signal
+ } else {
+ $quit->($code >> 8);
+ }
+ } # else ignore if client disconnected
}
sub err ($;@) {
diff --git a/lib/PublicInbox/LeiOverview.pm b/lib/PublicInbox/LeiOverview.pm
index 1d62ffe2..31cc67f1 100644
--- a/lib/PublicInbox/LeiOverview.pm
+++ b/lib/PublicInbox/LeiOverview.pm
@@ -26,16 +26,15 @@ sub _iso8601 ($) { strftime('%Y-%m-%dT%H:%M:%SZ', gmtime($_[0])) }
# we open this in the parent process before ->wq_do handoff
sub ovv_out_lk_init ($) {
my ($self) = @_;
- $self->{tmp_lk_id} = "$self.$$";
my $tmp = File::Temp->new("lei-ovv.dst.$$.lock-XXXXXX",
TMPDIR => 1, UNLINK => 0);
- $self->{lock_path} = $tmp->filename;
+ $self->{"lk_id.$self.$$"} = $self->{lock_path} = $tmp->filename;
}
sub ovv_out_lk_cancel ($) {
my ($self) = @_;
- ($self->{tmp_lk_id}//'') eq "$self.$$" and
- unlink(delete($self->{lock_path}));
+ my $lock_path = delete $self->{"lk_id.$self.$$"} or return;
+ unlink($lock_path);
}
sub detect_fmt ($$) {
diff --git a/lib/PublicInbox/LeiQuery.pm b/lib/PublicInbox/LeiQuery.pm
index 7c1e3606..ca214ca1 100644
--- a/lib/PublicInbox/LeiQuery.pm
+++ b/lib/PublicInbox/LeiQuery.pm
@@ -54,7 +54,7 @@ sub lei_q {
return $self->fail('no local or remote inboxes to search');
}
my $xj = $lxs->concurrency($opt);
- my $ovv = PublicInbox::LeiOverview->new($self) or return;
+ PublicInbox::LeiOverview->new($self) or return;
$self->atfork_prepare_wq($lxs);
$lxs->wq_workers_start('lei_xsearch', $xj, $self->oldset);
delete $lxs->{-ipc_atfork_child_close};
@@ -90,7 +90,7 @@ sub lei_q {
# descending docid order
$mset_opt{relevance} //= -2 if $opt->{thread};
$self->{mset_opt} = \%mset_opt;
- $ovv->ovv_begin($self);
+ $self->{ovv}->ovv_begin($self);
$lxs->do_query($self);
}
diff --git a/lib/PublicInbox/LeiXSearch.pm b/lib/PublicInbox/LeiXSearch.pm
index e997431f..b3cace74 100644
--- a/lib/PublicInbox/LeiXSearch.pm
+++ b/lib/PublicInbox/LeiXSearch.pm
@@ -387,8 +387,9 @@ sub query_prepare { # called by wq_do
sub fail_handler ($;$$) {
my ($lei, $code, $io) = @_;
- if (my $lxs = delete $lei->{lxs}) {
- $lxs->wq_wait_old($lei) if $lxs->wq_kill_old; # lei-daemon
+ for my $f (qw(lxs l2m)) {
+ my $wq = delete $lei->{$f} or next;
+ $wq->wq_wait_old($lei) if $wq->wq_kill_old; # lei-daemon
}
close($io) if $io; # needed to avoid warnings on SIGPIPE
$lei->x_it($code // (1 >> 8));
diff --git a/xt/lei-sigpipe.t b/xt/lei-sigpipe.t
index 1aa9ed07..ba2d23c8 100644
--- a/xt/lei-sigpipe.t
+++ b/xt/lei-sigpipe.t
@@ -29,7 +29,30 @@ my $do_test = sub {
}
};
-$do_test->();
-$do_test->({XDG_RUNTIME_DIR => '/dev/null'});
+my ($tmp, $for_destroy) = tmpdir();
+my $pid;
+my $opt = { run_mode => 0, 1 => \(my $out = '') };
+if (run_script([qw(lei daemon-pid)], undef, $opt)) {
+ chomp($pid = $out);
+ mkdir "$tmp/d" or BAIL_OUT $!;
+ local $ENV{TMPDIR} = "$tmp/d";
+ $do_test->();
+ $out = '';
+ ok(run_script([qw(lei daemon-pid)], undef, $opt), 'daemon-pid again');
+ chomp($out);
+ is($out, $pid, 'daemon-pid unchanged');
+ ok(kill(0, $pid), 'daemon still running');
+ $out = '';
+}
+{
+ mkdir "$tmp/1" or BAIL_OUT $!;
+ local $ENV{TMPDIR} = "$tmp/1";
+ $do_test->({XDG_RUNTIME_DIR => '/dev/null'});
+ is(unlink(glob("$tmp/1/*")), 0, 'nothing left over w/ oneshot');
+}
+
+# the one-shot test should be slow enough that the daemon has cleaned
+# up in the background:
+is_deeply([glob("$tmp/d/*")], [], 'nothing left over with daemon');
done_testing;
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/4] ipc: wq: switch to SIGQUIT for graceful exit
2021-02-02 9:39 [PATCH 1/4] lei q: do not leave temporary files after oneshot exit Eric Wong
@ 2021-02-02 9:39 ` Eric Wong
2021-02-02 9:39 ` [PATCH 3/4] cmd_ipc4: update comments around Socket::Msghdr Eric Wong
2021-02-02 9:39 ` [PATCH 4/4] pktop: fix potential undefined var Eric Wong
2 siblings, 0 replies; 4+ messages in thread
From: Eric Wong @ 2021-02-02 9:39 UTC (permalink / raw)
To: spew
TERM is the default kill(1) signal and may be more likely
sent by users/processes outside our control. We want to
call exit(0) explicitly to trigger ->DESTROY callbacks.
---
lib/PublicInbox/IPC.pm | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/lib/PublicInbox/IPC.pm b/lib/PublicInbox/IPC.pm
index 50de1bed..142c0639 100644
--- a/lib/PublicInbox/IPC.pm
+++ b/lib/PublicInbox/IPC.pm
@@ -142,9 +142,9 @@ sub ipc_worker_spawn {
sub ipc_worker_reap { # dwaitpid callback
my ($args, $pid) = @_;
return if !$?;
- # TERM(15) is our default exit signal, PIPE(13) is likely w/ pager
+ # PIPE(13) is likely w/ pager
my $s = $? & 127;
- warn "PID:$pid died with \$?=$?\n" if $s != 15 && $s != 13;
+ warn "PID:$pid died with \$?=$?\n" if $s != 13;
}
sub wq_wait_old {
@@ -340,7 +340,8 @@ sub _wq_worker_start ($$$) {
delete @$self{qw(-wq_s1 -wq_workers -wq_ppid)};
@$self{keys %$fields} = values(%$fields) if $fields;
$SIG{$_} = 'IGNORE' for (qw(PIPE));
- $SIG{$_} = 'DEFAULT' for (qw(TTOU TTIN TERM QUIT INT CHLD));
+ $SIG{$_} = 'DEFAULT' for (qw(TTOU TTIN TERM INT CHLD));
+ $SIG{QUIT} = sub { exit(0) }; # needed for ->DESTROY
local $0 = $self->{-wq_ident};
PublicInbox::DS::sig_setmask($oldset);
# ensure we properly exit even if warn() dies:
@@ -443,13 +444,13 @@ sub wq_close {
sub wq_kill_old {
my ($self) = @_;
my $pids = $self->{"-wq_old_pids.$$"} or return;
- kill 'TERM', @$pids;
+ kill 'QUIT', @$pids;
}
sub wq_kill {
my ($self, $sig) = @_;
my $workers = $self->{-wq_workers} or return;
- kill($sig // 'TERM', keys %$workers);
+ kill($sig // 'QUIT', keys %$workers);
}
sub WQ_MAX_WORKERS { $WQ_MAX_WORKERS }
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 3/4] cmd_ipc4: update comments around Socket::Msghdr
2021-02-02 9:39 [PATCH 1/4] lei q: do not leave temporary files after oneshot exit Eric Wong
2021-02-02 9:39 ` [PATCH 2/4] ipc: wq: switch to SIGQUIT for graceful exit Eric Wong
@ 2021-02-02 9:39 ` Eric Wong
2021-02-02 9:39 ` [PATCH 4/4] pktop: fix potential undefined var Eric Wong
2 siblings, 0 replies; 4+ messages in thread
From: Eric Wong @ 2021-02-02 9:39 UTC (permalink / raw)
To: spew
---
lib/PublicInbox/CmdIPC4.pm | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/lib/PublicInbox/CmdIPC4.pm b/lib/PublicInbox/CmdIPC4.pm
index c244f6a1..74dbf8a1 100644
--- a/lib/PublicInbox/CmdIPC4.pm
+++ b/lib/PublicInbox/CmdIPC4.pm
@@ -3,7 +3,7 @@
# callers should use PublicInbox::CmdIPC4->can('send_cmd4') (or recv_cmd4)
# first choice for script/lei front-end and 2nd choice for lei backend
-# libsocket-msghdr-perl is in Debian but many other distros as of 2021.
+# libsocket-msghdr-perl is in Debian but not many other distros as of 2021.
package PublicInbox::CmdIPC4;
use strict;
use v5.10.1;
@@ -12,12 +12,11 @@ BEGIN { eval {
require Socket::MsgHdr; # XS
no warnings 'once';
-# 3 FDs per-sendmsg(2) + buffer
+# any number of FDs per-sendmsg(2) + buffer
*send_cmd4 = sub ($$$$) { # (sock, fds, buf, flags) = @_;
my ($sock, $fds, undef, $flags) = @_;
my $mh = Socket::MsgHdr->new(buf => $_[2]);
- $mh->cmsghdr(SOL_SOCKET, SCM_RIGHTS,
- pack('i' x scalar(@$fds), @$fds));
+ $mh->cmsghdr(SOL_SOCKET, SCM_RIGHTS, pack('i' x scalar(@$fds), @$fds));
Socket::MsgHdr::sendmsg($sock, $mh, $flags);
};
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 4/4] pktop: fix potential undefined var
2021-02-02 9:39 [PATCH 1/4] lei q: do not leave temporary files after oneshot exit Eric Wong
2021-02-02 9:39 ` [PATCH 2/4] ipc: wq: switch to SIGQUIT for graceful exit Eric Wong
2021-02-02 9:39 ` [PATCH 3/4] cmd_ipc4: update comments around Socket::Msghdr Eric Wong
@ 2021-02-02 9:39 ` Eric Wong
2 siblings, 0 replies; 4+ messages in thread
From: Eric Wong @ 2021-02-02 9:39 UTC (permalink / raw)
To: spew
---
lib/PublicInbox/PktOp.pm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/PublicInbox/PktOp.pm b/lib/PublicInbox/PktOp.pm
index 12839e71..59b37ff8 100644
--- a/lib/PublicInbox/PktOp.pm
+++ b/lib/PublicInbox/PktOp.pm
@@ -58,7 +58,7 @@ sub event_step {
die "recv: $!";
}
my ($cmd, $pargs) = split(/\0/, $msg, 2);
- my $op = $self->{ops}->{$cmd // $msg};
+ my $op = $self->{ops}->{$cmd //= $msg};
die "BUG: unknown message: `$cmd'" unless $op;
my ($sub, @args) = @$op;
$sub->(@args, $pargs ? ipc_thaw($pargs) : ());
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2021-02-02 9:40 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-02-02 9:39 [PATCH 1/4] lei q: do not leave temporary files after oneshot exit Eric Wong
2021-02-02 9:39 ` [PATCH 2/4] ipc: wq: switch to SIGQUIT for graceful exit Eric Wong
2021-02-02 9:39 ` [PATCH 3/4] cmd_ipc4: update comments around Socket::Msghdr Eric Wong
2021-02-02 9:39 ` [PATCH 4/4] pktop: fix potential undefined var Eric Wong
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).