]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/LeiOverview.pm
lei: reduce FD pressure from lei2mail worker
[public-inbox.git] / lib / PublicInbox / LeiOverview.pm
index 1d62ffe253d19d8100d70c5782962a4ecd761ccd..88034adadaed4e5d9551199964203d4ae0f5d401 100644 (file)
@@ -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 ($$) {
@@ -91,6 +90,8 @@ sub new {
                } else {
                        ovv_out_lk_init($self);
                }
+       } elsif (!$opt->{quiet}) {
+               $lei->{-progress} = 1;
        }
        if ($json) {
                $lei->{dedupe} //= PublicInbox::LeiDedupe->new($lei);
@@ -148,10 +149,8 @@ sub _unbless_smsg {
 
 sub ovv_atexit_child {
        my ($self, $lei) = @_;
-       if (my $l2m = delete $lei->{l2m}) {
-               # gracefully stop lei2mail processes after all
-               # ->write_mail work is complete
-               delete $l2m->{-wq_s1};
+       if (my $l2m = $lei->{l2m}) {
+               # wait for ->write_mail work we submitted to lei2mail
                if (my $rd = delete $l2m->{each_smsg_done}) {
                        read($rd, my $buf, 1); # wait for EOF
                }
@@ -218,13 +217,13 @@ sub ovv_each_smsg_cb { # runs in wq worker usually
                };
        } elsif ($l2m && $l2m->{-wq_s1}) {
                my ($lei_ipc, @io) = $lei->atfork_parent_wq($l2m);
-               # $io[-1] becomes a notification pipe that triggers EOF
+               # $io[0] becomes a notification pipe that triggers EOF
                # in this wq worker when all outstanding ->write_mail
                # calls are complete
-               pipe($l2m->{each_smsg_done}, $io[$#io + 1]) or die "pipe: $!";
-               fcntl($io[-1], 1031, 4096) if $^O eq 'linux'; # F_SETPIPE_SZ
+               $io[0] = undef;
+               pipe($l2m->{each_smsg_done}, $io[0]) or die "pipe: $!";
+               fcntl($io[0], 1031, 4096) if $^O eq 'linux'; # F_SETPIPE_SZ
                delete @$lei_ipc{qw(l2m opt mset_opt cmd)};
-               $lei_ipc->{each_smsg_not_done} = $#io;
                my $git = $ibxish->git; # (LeiXSearch|Inbox|ExtSearch)->git
                $self->{git} = $git;
                my $git_dir = $git->{git_dir};