-# Copyright (C) 2020-2021 all contributors <meta@public-inbox.org>
+# Copyright (C) all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
# Combine any combination of PublicInbox::Search,
delete $lei->{opt}->{verbose};
delete $lei->{-progress};
} else {
- $lei->fail("$$ WTF `$do_augment_done'");
+ die "BUG: do_augment_done=`$do_augment_done'";
}
return;
}
- return $lei->fail("$$ wait_startq: $!") unless $!{EINTR};
+ die "wait_startq: $!" unless $!{EINTR};
}
}
}
sub l2m_progress {
- my ($lei, $nr) = @_;
- $lei->{-nr_write} += $nr;
+ my ($lei, $nr_write, $nr_seen) = @_;
+ $lei->{-nr_write} += $nr_write;
+ $lei->{-nr_seen} += $nr_seen;
}
sub query_one_mset { # for --threads and l2m w/o sort
my $smsg = bless {}, 'PublicInbox::Smsg';
if ($self->{import_sto} && !$xoids) {
my ($res, $kw) = $self->{import_sto}->wq_do('add_eml', $eml);
- $smsg = $res if ref($res) eq ref($smsg); # totally new message
+ if (ref($res) eq ref($smsg)) { # totally new message
+ $smsg = $res;
+ $self->{-sto_imported} = 1;
+ }
$smsg->{kw} = $kw; # short-circuit xsmsg_vmd
}
$smsg->{blob} //= $xoids ? (keys(%$xoids))[0]
: $lei->git_oid($eml)->hexdigest;
_smsg_fill($smsg, $eml);
wait_startq($lei);
+ my $nr = ++$lei->{-nr_remote_eml}; # needed for lss->cfg_set
if ($lei->{-progress}) {
- ++$lei->{-nr_remote_eml};
my $now = now();
my $next = $lei->{-next_progress} //= ($now + 1);
if ($now > $next) {
$lei->{-next_progress} = $now + 1;
- my $nr = $lei->{-nr_remote_eml};
mset_progress($lei, $lei->{-current_url}, $nr, '?');
}
}
local $SIG{TERM} = sub { exit(0) }; # for DESTROY (File::Temp, $reap)
my $lei = $self->{lei};
my $opt = $lei->{opt};
- my $qstr = $lei->{mset_opt}->{qstr};
+ chomp(my $qstr = $lei->{mset_opt}->{qstr});
$qstr =~ s/[ \n\t]+/ /sg; # make URLs less ugly
my @qform = (x => 'm');
push(@qform, t => 1) if $opt->{threads};
$fh = IO::Uncompress::Gunzip->new($fh, MultiStream => 1);
PublicInbox::MboxReader->mboxrd($fh, \&each_remote_eml, $self,
$lei, $each_smsg);
- my $nr = $lei->{-nr_remote_eml};
- my $wait = $lei->{sto}->wq_do('done') if $nr && $lei->{sto};
+ if (delete($self->{-sto_imported})) {
+ my $wait = $self->{import_sto}->wq_do('done');
+ }
$reap_curl->join;
if ($? == 0) {
# don't update if no results, maybe MTA is down
- $key && $nr and
- $lei->{lss}->cfg_set($key, $start);
+ my $nr = $lei->{-nr_remote_eml};
+ $lei->{lss}->cfg_set($key, $start) if $key && $nr;
mset_progress($lei, $lei->{-current_url}, $nr, $nr);
next;
}
sub xsearch_done_wait { # dwaitpid callback
my ($arg, $pid) = @_;
my ($wq, $lei) = @$arg;
- $lei->child_error($?, 'non-fatal error from '.ref($wq)) if $?;
+ return if !$?;
+ my $s = $? & 127;
+ return $lei->child_error($?) if $s == 13 || $s == 15;
+ $lei->child_error($?, 'non-fatal error from '.ref($wq)." \$?=$?");
}
sub query_done { # EOF callback for main daemon
}
if ($lei->{-progress}) {
my $tot = $lei->{-mset_total} // 0;
- my $nr = $lei->{-nr_write} // 0;
+ my $nr_w = $lei->{-nr_write} // 0;
+ my $d = ($lei->{-nr_seen} // 0) - $nr_w;
+ my $x = "$tot matches";
+ $x .= ", $d duplicates" if $d;
if ($l2m) {
- my $m = "# $nr written to " .
- "$lei->{ovv}->{dst} ($tot matches)";
- $nr ? $lei->qfin($m) : $lei->qerr($m);
+ my $m = "# $nr_w written to " .
+ "$lei->{ovv}->{dst} ($x)";
+ $nr_w ? $lei->qfin($m) : $lei->qerr($m);
} else {
- $lei->qerr("# $tot matches");
+ $lei->qerr("# $x");
}
}
$lei->start_mua if $l2m && !$l2m->lock_free;
my ($lei) = @_;
local $PublicInbox::LEI::current_lei = $lei;
my $l2m = $lei->{l2m} or return; # client disconnected
- $lei->fchdir or return;
- my $err;
- eval { $l2m->post_augment($lei) };
- $err = $@;
+ eval {
+ $lei->fchdir;
+ $l2m->post_augment($lei);
+ };
+ my $err = $@;
if ($err) {
if (my $lxs = delete $lei->{lxs}) {
$lxs->wq_kill('-TERM');
$lei->fail("$err");
}
if (!$err && delete $lei->{early_mua}) { # non-augment case
- $lei->start_mua;
+ eval { $lei->start_mua };
+ $lei->fail($@) if $@;
}
close(delete $lei->{au_done}); # triggers wait_startq in lei_xsearch
}
'child_error' => [ $lei ],
'incr_start_query' => [ $self, $lei ],
};
- $lei->{auth}->op_merge($ops, $l2m) if $l2m && $lei->{auth};
+ $lei->{auth}->op_merge($ops, $l2m, $lei) if $l2m && $lei->{auth};
my $end = $lei->pkt_op_pair;
$lei->{1}->autoflush(1);
$lei->start_pager if delete $lei->{need_pager};