]> git.ipfire.org Git - thirdparty/public-inbox.git/commitdiff
lei: don't exit lei-daemon on ovv_begin failure
authorEric Wong <e@80x24.org>
Fri, 27 Oct 2023 01:14:35 +0000 (01:14 +0000)
committerEric Wong <e@80x24.org>
Fri, 27 Oct 2023 09:14:35 +0000 (09:14 +0000)
When ->ovv_begin is called in LeiXSearch->do_query in the top-level
lei-daemon process, $lei->{pkt_op_p} still exists.  We must make
sure we're exiting the correct process since lei->out can call
lei->fail and lei->fail calls lei->x_it.

As to avoiding how I caused ->ovv_begin failures to begin with,
that's for a much bigger change...

lib/PublicInbox/LEI.pm

index 7bc7b2dcf87fde2bb3aa536b8572a11f4f4a8531..e060bcbe35de93047911710a4e59ded167a37be8 100644 (file)
@@ -40,6 +40,7 @@ $GLP_PASS->configure(qw(gnu_getopt no_ignore_case auto_abbrev pass_through));
 our (%PATH2CFG, # persistent for socket daemon
 $MDIR2CFGPATH, # /path/to/maildir => { /path/to/config => [ ino watches ] }
 $OPT, # shared between optparse and opt_dash callback (for Getopt::Long)
+$daemon_pid
 );
 
 # TBD: this is a documentation mechanism to show a subcommand
@@ -486,7 +487,7 @@ sub x_it ($$) {
        stop_pager($self);
        if ($self->{pkt_op_p}) { # worker => lei-daemon
                $self->{pkt_op_p}->pkt_do('x_it', $code);
-               exit($code >> 8);
+               exit($code >> 8) if $$ != $daemon_pid;
        } elsif ($self->{sock}) { # lei->daemon => lei(1) client
                send($self->{sock}, "x_it $code", 0);
        } elsif ($quit == \&CORE::exit) { # an admin (one-shot) command
@@ -1341,8 +1342,8 @@ sub lazy_start {
        my $pid = fork;
        return if $pid;
        $0 = "lei-daemon $path";
-       local %PATH2CFG;
-       local $MDIR2CFGPATH;
+       local (%PATH2CFG, $MDIR2CFGPATH);
+       local $daemon_pid = $$;
        $listener->blocking(0);
        my $exit_code;
        my $pil = PublicInbox::Listener->new($listener, \&accept_dispatch);