Maildir scanning still happens in the main process.  Scanning
dozens of Maildirs is still time-consuming and monopolizes the
event loop during WatchMaildir::event_step.  This can cause
cause zombies to accumulate before Sigfd::event_step triggers
DS::reap_pids.
---
 lib/PublicInbox/WatchMaildir.pm | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/lib/PublicInbox/WatchMaildir.pm b/lib/PublicInbox/WatchMaildir.pm
index 288f64d1e6c..d147962994e 100644
--- a/lib/PublicInbox/WatchMaildir.pm
+++ b/lib/PublicInbox/WatchMaildir.pm
@@ -123,9 +123,9 @@ sub new {
 
 sub _done_for_now {
        my ($self) = @_;
-       my $importers = $self->{importers};
-       foreach my $im (values %$importers) {
-               $im->done;
+       local $PublicInbox::DS::in_loop = 0; # waitpid() synchronlusly
+       for (values %{$self->{importers}}) {
+               $_->done if $_; # $_ may be undef during cleanup
        }
 }
 
@@ -936,6 +936,7 @@ sub fs_scan_step {
        my ($self) = @_;
        return if $self->{quit};
        my $op = shift @{$self->{ops}};
+       local $PublicInbox::DS::in_loop = 0; # waitpid() synchronlusly
 
        # continue existing scan
        my $max = 10;
--
unsubscribe: one-click, see List-Unsubscribe header
archive: https://public-inbox.org/meta/

Reply via email to