X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FLEI.pm;h=d05b20dee4873ce57a6e0d9c44bf54d21dbe6c37;hb=HEAD;hp=f3e80113ed7042e7332fb307653825fbd8e3314f;hpb=3a281094eecdc37c5f3efbe0a39ad04ba31a9dab;p=public-inbox.git diff --git a/lib/PublicInbox/LEI.pm b/lib/PublicInbox/LEI.pm index f3e80113..d05b20de 100644 --- a/lib/PublicInbox/LEI.pm +++ b/lib/PublicInbox/LEI.pm @@ -18,7 +18,6 @@ use IO::Handle (); use Fcntl qw(SEEK_SET); use PublicInbox::Config; use PublicInbox::Syscall qw(EPOLLIN); -use PublicInbox::DS qw(dwaitpid); use PublicInbox::Spawn qw(spawn popen_rd); use PublicInbox::Lock; use PublicInbox::Eml; @@ -544,12 +543,11 @@ sub child_error { # passes non-fatal curl exit codes to user local $current_lei = $self; $child_error ||= 1 << 8; warn(substr($msg, -1, 1) eq "\n" ? $msg : "$msg\n") if defined $msg; + $self->{child_error} ||= $child_error; if ($self->{pkt_op_p}) { # to top lei-daemon $self->{pkt_op_p}->pkt_do('child_error', $child_error); } elsif ($self->{sock}) { # to lei(1) client send($self->{sock}, "child_error $child_error", MSG_EOR); - } else { # non-lei admin command - $self->{child_error} ||= $child_error; } # else noop if client disconnected } @@ -563,17 +561,17 @@ sub note_sigpipe { # triggers sigpipe_handler sub _lei_atfork_child { my ($self, $persist) = @_; # we need to explicitly close things which are on stack + my $cfg = $self->{cfg}; if ($persist) { open $self->{3}, '<', '/' or die "open(/) $!"; fchdir($self); close($_) for (grep(defined, delete @$self{qw(0 1 2 sock)})); - if (my $cfg = $self->{cfg}) { - delete @$cfg{qw(-lei_store -watches -lei_note_event)}; - } + delete @$cfg{qw(-lei_store -watches -lei_note_event)}; } else { # worker, Net::NNTP (Net::Cmd) uses STDERR directly open STDERR, '+>&='.fileno($self->{2}) or warn "open $!"; STDERR->autoflush(1); POSIX::setpgid(0, $$) // die "setpgid(0, $$): $!"; + delete @$cfg{qw(-watches -lei_note_event)}; } close($_) for (grep(defined, delete @$self{qw(old_1 au_done)})); delete $self->{-socks}; @@ -645,12 +643,12 @@ sub workers_start { my $end = $lei->pkt_op_pair; my $ident = $wq->{-wq_ident} // "lei-$lei->{cmd} worker"; $flds->{lei} = $lei; - $wq->wq_workers_start($ident, $jobs, $lei->oldset, $flds); + $wq->wq_workers_start($ident, $jobs, $lei->oldset, $flds, + $wq->can('_wq_done_wait') // \&wq_done_wait, $lei); delete $lei->{pkt_op_p}; my $op_c = delete $lei->{pkt_op_c}; @$end = (); $lei->event_step_init; - $wq->wq_wait_async($wq->can('_wq_done_wait') // \&wq_done_wait, $lei); ($op_c, $ops); } @@ -787,7 +785,7 @@ EOM } } -sub lazy_cb ($$$) { +sub lazy_cb ($$$) { # $pfx is _complete_ or lei_ my ($self, $cmd, $pfx) = @_; my $ucmd = $cmd; $ucmd =~ tr/-/_/; @@ -1392,9 +1390,8 @@ sub DESTROY { # preserve $? for ->fail or ->x_it code } -sub wq_done_wait { # dwaitpid callback - my ($arg, $pid) = @_; - my ($wq, $lei) = @$arg; +sub wq_done_wait { # awaitpid cb (via wq_eof) + my ($pid, $wq, $lei) = @_; local $current_lei = $lei; my $err_type = $lei->{-err_type}; $? and $lei->child_error($?,