From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.2 required=3.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id A5AEE1F56B for ; Wed, 4 Oct 2023 03:49:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=80x24.org; s=selector1; t=1696391374; bh=9Yerck9jmMpdoPz0vnfu2ZhzyZeQVUd8V0Q1uB5MjTE=; h=From:To:Subject:Date:In-Reply-To:References:From; b=xwJ7sM6FpB4t86ImDxKs0mrq0XfhYe3FQDIBcCATDoAl3A8f2/czLXHxBZ+VW+kyL 93B5/1mI5AesJqInqr5+Z32Q63x2Z2mXyv1XPAp6DoQw0UFAcMe3ZesS4bv6t9HXWO MM6GU5j47IwI93ItbRqhSAiX5BUGiY7M3baMfRq4= From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 08/21] lei: get rid of l2m_progress PktOp callback Date: Wed, 4 Oct 2023 03:49:20 +0000 Message-ID: <20231004034933.3343930-9-e@80x24.org> In-Reply-To: <20231004034933.3343930-1-e@80x24.org> References: <20231004034933.3343930-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: We already have an ->incr callback we can enhance to support multiple counters with a single request. Furthermore, we can just flatten the object graph by storing counters directly in the $lei object itself to reduce hash lookups. --- lib/PublicInbox/LEI.pm | 13 ++++++------- lib/PublicInbox/LeiConvert.pm | 7 ++++--- lib/PublicInbox/LeiTag.pm | 6 +++--- lib/PublicInbox/LeiToMail.pm | 20 ++++++++++---------- lib/PublicInbox/LeiXSearch.pm | 15 ++++----------- t/lei-tag.t | 3 +++ 6 files changed, 30 insertions(+), 34 deletions(-) diff --git a/lib/PublicInbox/LEI.pm b/lib/PublicInbox/LEI.pm index 3408551b..fba4edf3 100644 --- a/lib/PublicInbox/LEI.pm +++ b/lib/PublicInbox/LEI.pm @@ -628,8 +628,8 @@ sub pkt_op_pair { } sub incr { - my ($self, $field, $nr) = @_; - $self->{counters}->{$field} += $nr; + my $lei = shift; + while (my ($f, $n) = splice(@_, 0, 2)) { $lei->{$f} += $n } } sub pkt_ops { @@ -1418,11 +1418,10 @@ sub busy { 1 } # prevent daemon-shutdown if client is connected # can immediately reread it sub DESTROY { my ($self) = @_; - if (my $counters = delete $self->{counters}) { - for my $k (sort keys %$counters) { - my $nr = $counters->{$k}; - $self->child_error(0, "$nr $k messages"); - } + for my $k (sort(grep(/\A-nr_/, keys %$self))) { + my $nr = $self->{$k}; + substr($k, 0, length('-nr_'), ''); + $self->child_error(0, "$nr $k messages"); } $self->{1}->autoflush(1) if $self->{1}; stop_pager($self); diff --git a/lib/PublicInbox/LeiConvert.pm b/lib/PublicInbox/LeiConvert.pm index 1acd4558..22aba81a 100644 --- a/lib/PublicInbox/LeiConvert.pm +++ b/lib/PublicInbox/LeiConvert.pm @@ -34,9 +34,10 @@ sub process_inputs { # via wq_do $self->SUPER::process_inputs; my $lei = $self->{lei}; delete $lei->{1}; + my $l2m = delete $self->{l2m}; delete $self->{wcb}; # commit - my $nr_w = delete($lei->{-nr_write}) // 0; - my $d = (delete($lei->{-nr_seen}) // 0) - $nr_w; + my $nr_w = delete($l2m->{-nr_write}) // 0; + my $d = (delete($l2m->{-nr_seen}) // 0) - $nr_w; $d = $d ? " ($d duplicates)" : ''; $lei->qerr("# converted $nr_w messages$d"); } @@ -64,7 +65,7 @@ sub ipc_atfork_child { my ($self) = @_; my $lei = $self->{lei}; $lei->_lei_atfork_child; - my $l2m = delete $lei->{l2m}; + my $l2m = $lei->{l2m}; if (my $net = $lei->{net}) { # may prompt user once $net->{mics_cached} = $net->imap_common_init($lei); $net->{nn_cached} = $net->nntp_common_init($lei); diff --git a/lib/PublicInbox/LeiTag.pm b/lib/PublicInbox/LeiTag.pm index 76bd2d70..320b0355 100644 --- a/lib/PublicInbox/LeiTag.pm +++ b/lib/PublicInbox/LeiTag.pm @@ -15,7 +15,7 @@ sub input_eml_cb { # used by PublicInbox::LeiInput::input_fh $self->{lei}->{sto}->wq_do('update_xvmd', $xoids, $eml, $self->{lei}->{vmd_mod}); } else { - ++$self->{unimported}; + ++$self->{-nr_unimported}; } } @@ -40,8 +40,8 @@ sub lei_tag { # the "lei tag" method sub note_unimported { my ($self) = @_; - my $n = $self->{unimported} or return; - $self->{lei}->{pkt_op_p}->pkt_do('incr', 'unimported', $n); + my $n = $self->{-nr_unimported} or return; + $self->{lei}->{pkt_op_p}->pkt_do('incr', -nr_unimported => $n); } sub ipc_atfork_child { diff --git a/lib/PublicInbox/LeiToMail.pm b/lib/PublicInbox/LeiToMail.pm index b9f28ee4..f239da82 100644 --- a/lib/PublicInbox/LeiToMail.pm +++ b/lib/PublicInbox/LeiToMail.pm @@ -195,7 +195,7 @@ sub _mbox_write_cb ($$) { sub { # for git_to_mail my ($buf, $smsg, $eml) = @_; $eml //= PublicInbox::Eml->new($buf); - ++$lei->{-nr_seen}; + ++$self->{-nr_seen}; return if $dedupe->is_dup($eml, $smsg); $lse->xsmsg_vmd($smsg) if $lse; $smsg->{-recent} = 1 if $set_recent; @@ -206,7 +206,7 @@ sub _mbox_write_cb ($$) { my $lk = $ovv->lock_for_scope; $lei->out($$buf); } - ++$lei->{-nr_write}; + ++$self->{-nr_write}; } } @@ -291,7 +291,7 @@ sub _maildir_write_cb ($$) { my ($bref, $smsg, $eml) = @_; $dst // return $lei->fail; # dst may be undef-ed in last run - ++$lei->{-nr_seen}; + ++$self->{-nr_seen}; return if $dedupe && $dedupe->is_dup($eml // PublicInbox::Eml->new($$bref), $smsg); @@ -299,7 +299,7 @@ sub _maildir_write_cb ($$) { my $n = _buf2maildir($dst, $bref // \($eml->as_string), $smsg, $dir); $lms->set_src($smsg->oidbin, $out, $n) if $lms; - ++$lei->{-nr_write}; + ++$self->{-nr_write}; } } @@ -322,7 +322,7 @@ EOM my ($bref, $smsg, $eml) = @_; $mic // return $lei->fail; # mic may be undef-ed in last run - ++$lei->{-nr_seen}; + ++$self->{-nr_seen}; return if $dedupe && $dedupe->is_dup($eml // PublicInbox::Eml->new($$bref), $smsg); @@ -335,7 +335,7 @@ EOM # imap_append returns UID if IMAP server has UIDPLUS extension ($lms && $uid =~ /\A[0-9]+\z/) and $lms->set_src($smsg->oidbin, $$uri, $uid + 0); - ++$lei->{-nr_write}; + ++$self->{-nr_write}; } } @@ -366,10 +366,10 @@ sub _v2_write_cb ($$) { sub { # for git_to_mail my ($bref, $smsg, $eml) = @_; $eml //= PublicInbox::Eml->new($bref); - ++$lei->{-nr_seen}; + ++$self->{-nr_seen}; return if $dedupe && $dedupe->is_dup($eml, $smsg); $lei->{v2w}->wq_do('add', $eml); # V2Writable->add - ++$lei->{-nr_write}; + ++$self->{-nr_write}; } } @@ -796,11 +796,11 @@ sub wq_atexit_child { local $PublicInbox::DS::in_loop = 0; # waitpid synchronously my $lei = $self->{lei}; $lei->{ale}->git->async_wait_all; - my ($nr_w, $nr_s) = delete(@$lei{qw(-nr_write -nr_seen)}); + my ($nr_w, $nr_s) = delete(@$self{qw(-nr_write -nr_seen)}); delete $self->{wcb}; (($nr_w //= 0) + ($nr_s //= 0)) or return; return if $lei->{early_mua} || !$lei->{-progress} || !$lei->{pkt_op_p}; - $lei->{pkt_op_p}->pkt_do('l2m_progress', $nr_w, $nr_s); + $lei->{pkt_op_p}->pkt_do('incr', -nr_write => $nr_w, -nr_seen => $nr_s) } # runs on a 1s timer in lei-daemon diff --git a/lib/PublicInbox/LeiXSearch.pm b/lib/PublicInbox/LeiXSearch.pm index 8f63149e..1caa9d06 100644 --- a/lib/PublicInbox/LeiXSearch.pm +++ b/lib/PublicInbox/LeiXSearch.pm @@ -155,12 +155,6 @@ sub mset_progress { } } -sub l2m_progress { - 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 ($self, $ibxish) = @_; local $0 = "$0 query_one_mset"; @@ -354,7 +348,6 @@ sub query_remote_mboxrd { $self->{import_sto} = $lei->{sto} if $lei->{opt}->{'import-remote'}; for my $uri (@$uris) { $lei->{-current_url} = $uri->as_string; - $lei->{-nr_remote_eml} = 0; my $start = time; my ($q, $key) = fudge_qstr_time($lei, $uri, $qstr); $uri->query_form(@qform, q => $q); @@ -369,9 +362,9 @@ sub query_remote_mboxrd { my $wait = $self->{import_sto}->wq_do('done'); } $reap_curl->join; + my $nr = delete $lei->{-nr_remote_eml} // 0; if ($? == 0) { # don't update if no results, maybe MTA is down - my $nr = $lei->{-nr_remote_eml}; $lei->{lss}->cfg_set($key, $start) if $key && $nr; mset_progress($lei, $lei->{-current_url}, $nr, $nr); next; @@ -433,8 +426,8 @@ Error closing $lei->{ovv}->{dst}: \$!=$! \$?=$? } if ($lei->{-progress}) { my $tot = $lei->{-mset_total} // 0; - my $nr_w = $lei->{-nr_write} // 0; - my $d = ($lei->{-nr_seen} // 0) - $nr_w; + my $nr_w = delete($lei->{-nr_write}) // 0; + my $d = (delete($lei->{-nr_seen}) // 0) - $nr_w; my $x = "$tot matches"; $x .= ", $d duplicates" if $d; if ($l2m) { @@ -532,7 +525,7 @@ sub do_query { incr_post_augment => [ \&incr_post_augment, $lei ], '' => [ \&query_done, $lei ], mset_progress => [ \&mset_progress, $lei ], - l2m_progress => [ \&l2m_progress, $lei ], + incr => [ $lei ], x_it => [ $lei ], child_error => [ $lei ], incr_start_query => [ \&incr_start_query, $lei, $self ], diff --git a/t/lei-tag.t b/t/lei-tag.t index 822677a7..cccf0af6 100644 --- a/t/lei-tag.t +++ b/t/lei-tag.t @@ -101,5 +101,8 @@ test_lei(sub { if (0) { # TODO label+kw search w/ externals lei_ok(qw(q L:qp), "mid:$mid", '--only', "$ro_home/t2"); } + lei_ok qw(tag +L:nope -F eml t/data/binary.patch); + like $lei_err, qr/\b1 unimported messages/, 'noted unimported' + or diag $lei_err; }); done_testing;