]> git.ipfire.org Git - thirdparty/public-inbox.git/commitdiff
watch: reset HUP + USR1 signal handlers in children
authorEric Wong <e@80x24.org>
Fri, 8 Sep 2023 10:51:15 +0000 (10:51 +0000)
committerEric Wong <e@80x24.org>
Fri, 8 Sep 2023 20:43:18 +0000 (20:43 +0000)
Child processes handling IMAP/NNTP aren't going to want
to handle config reloads nor forced rescans, those are
exclusively for the parent.  We'll leave a note that
QUIT/TERM/INT can safely use the same callback for both
parent and children, as I nearly made the mistake of
resetting those to their default values in the child.

lib/PublicInbox/Watch.pm
script/public-inbox-watch

index a2dc125f2e9bc40321a5b34fa7922673e5b1fc73..cf0720e3283b36ffbf92851a8c9d5dc5aff4327a 100644 (file)
@@ -250,7 +250,7 @@ sub quit_done ($) {
        $live == 0;
 }
 
-sub quit {
+sub quit { # may be called in IMAP/NNTP children
        my ($self) = @_;
        $self->{quit} = 1;
        %{$self->{opendirs}} = ();
@@ -260,7 +260,7 @@ sub quit {
                my $di = $PublicInbox::DS::DescriptorMap{$fd};
                $di->close if $di && $di->can('add_watches');
        }
-       if (my $idle_mic = delete $self->{idle_mic}) {
+       if (my $idle_mic = delete $self->{idle_mic}) { # IMAP child
                return unless $idle_mic->IsConnected && $idle_mic->Socket;
                eval { $idle_mic->done };
                if ($@ && $idle_mic->IsConnected && $idle_mic->Socket) {
@@ -387,7 +387,8 @@ sub watch_atfork_child ($) {
        delete $self->{opendirs};
        PublicInbox::DS->Reset;
        my $sig = delete $self->{sig};
-       $sig->{CHLD} = 'DEFAULT';
+       $sig->{CHLD} = $sig->{HUP} = $sig->{USR1} = 'DEFAULT';
+       # TERM/QUIT/INT call ->quit, which works in both parent+child
        @SIG{keys %$sig} = values %$sig;
        PublicInbox::DS::sig_setmask(PublicInbox::DS::allowset($sig));
 }
index 870cd31babc6fdc120eb0a4ad9a3412daa7992a5..d9215de98cf90d5ddda2580bcec8c9217da1cc69 100755 (executable)
@@ -41,7 +41,7 @@ if ($watch) {
                warn "# scanning\n";
                $watch->trigger_scan('full');
        };
-       my $quit = sub {
+       my $quit = sub { # may be called in IMAP/NNTP children
                $watch->quit if $watch;
                $watch = undef;
                $0 .= ' quitting';