From e3944dfcfb3c0d8964d7cd458a9f14bbf503d00f Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 10 Aug 2020 02:11:56 +0000 Subject: index+xcpdb: improve SIG{INT,TERM,HUP,PIPE} behavior -index now invokes ->DESTROY like xcpdb does, which is necessary to cleanup $INBOX_DIR/msgmap-XXXXXXX files. We'll also exit with the expected values for various signals by adding 128 as described in -xcpdb now terminates worker processes and xapian-compact(1) invocations when prematurely killed, too. --- lib/PublicInbox/Admin.pm | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) (limited to 'lib/PublicInbox/Admin.pm') diff --git a/lib/PublicInbox/Admin.pm b/lib/PublicInbox/Admin.pm index e42b01e0..af2b3da9 100644 --- a/lib/PublicInbox/Admin.pm +++ b/lib/PublicInbox/Admin.pm @@ -5,14 +5,28 @@ # Unstable internal API package PublicInbox::Admin; use strict; -use warnings; -use Cwd 'abs_path'; -use base qw(Exporter); -our @EXPORT_OK = qw(resolve_repo_dir); +use parent qw(Exporter); +use Cwd qw(abs_path); +use POSIX (); +our @EXPORT_OK = qw(resolve_repo_dir setup_signals); use PublicInbox::Config; use PublicInbox::Inbox; use PublicInbox::Spawn qw(popen_rd); +sub setup_signals { + my ($cb, $arg) = @_; # optional + + # we call exit() here instead of _exit() so DESTROY methods + # get called (e.g. File::Temp::Dir and PublicInbox::Msgmap) + $SIG{INT} = $SIG{HUP} = $SIG{PIPE} = $SIG{TERM} = sub { + my ($sig) = @_; + # https://www.tldp.org/LDP/abs/html/exitcodes.html + eval { $cb->($sig, $arg) } if $cb; + $sig = 'SIG'.$sig; + exit(128 + POSIX->$sig); + }; +} + sub resolve_repo_dir { my ($cd, $ver) = @_; my $prefix = defined $cd ? $cd : './'; @@ -185,9 +199,16 @@ invalid indexlevel=$indexlevel (must be `basic', `medium', or `full') die missing_mod_msg($err) ." required for indexlevel=$indexlevel\n"; } +sub index_terminate { + my (undef, $ibx) = @_; # $_[0] = signal name + $ibx->git->cleanup; +} + sub index_inbox { my ($ibx, $im, $opt) = @_; my $jobs = delete $opt->{jobs} if $opt; + local %SIG = %SIG; + setup_signals(\&index_terminate, $ibx); if (ref($ibx) && $ibx->version == 2) { eval { require PublicInbox::V2Writable }; die "v2 requirements not met: $@\n" if $@; -- cgit v1.2.3-24-ge0c7