You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@spamassassin.apache.org by Michael Storz <Mi...@lrz.de> on 2022/05/07 17:41:00 UTC

OneLineBodyRuleType.pm with rule_ready

Hi Henrik,

you added a rule_ready to OneLineBodyRuleType.pm

+    $sub .= '
+      $self->rule_ready(q{'.$rulename.'});
+    ';
+

Why? I thought OneLineBodyRuleType.pm does not have asynchronous calls? 
And if rule_ready is used, should'n there be a call to rule_pending 
first?

A similar case exists with Reuse.pm: call of rule_ready, no call of 
rule_pending.

Regards,
Michael

Re: OneLineBodyRuleType.pm with rule_ready

Posted by Henrik K <he...@hege.li>.
On Sat, May 07, 2022 at 07:41:00PM +0200, Michael Storz wrote:
> Hi Henrik,
> 
> you added a rule_ready to OneLineBodyRuleType.pm
> 
> +    $sub .= '
> +      $self->rule_ready(q{'.$rulename.'});
> +    ';
> +
> 
> Why? I thought OneLineBodyRuleType.pm does not have asynchronous calls? And
> if rule_ready is used, should'n there be a call to rule_pending first?
> 
> A similar case exists with Reuse.pm: call of rule_ready, no call of
> rule_pending.

I think what you are missing is that _any_ rule must be internally declared
as run when it's finished, for the meta pending check to work.  This is
tracked by $pms->{tests_already_hit}->{$rulename} existing or not existing.

In Check.pm, you can see these in several places:

    if ($scoresptr->{q{'.$rulename.'}}) {
      $hitsptr->{q{'.$rulename.'}} ||= 0;
      ...then it does it's checks and maybe calls got_hit()

So the hitsptr forces $pms->{tests_already_hit}->{$rulename} exist - and
when it exists, do_meta_tests() knows it's ready.

I'm not exactly sure why I used $self->rule_ready(q{'.$rulename.'}); in
OneLineBodyRuleType.pm instead of the more direct $hitsptr->{q{'.$rulename.'}} ||= 0;
... rule_ready() is marginally more expensive call, so changing tests_already_hit directly
is safe when we know rule has nothing to do with DNS.

Hopefully this clears up things?

Cheers,
Henrik