Mail-SpamAssassin-Plugin-RedisAWL
view release on metacpan or search on metacpan
contrib/perftest-awl view on Meta::CPAN
has '_module_name' => ( is => 'ro', isa => 'Str', lazy => 1,
default => sub {
my $self = shift;
return( $self->module_prefix.$self->module );
}
);
has '_addrlist' => ( is => 'ro', isa => 'Mail::SpamAssassin::PersistentAddrList', lazy => 1,
default => sub {
my $self = shift;
my $code = "require ".$self->_module_name;
eval $code;
if( $@ ) {
die('could not load AWL AddrList module '.$@);
}
my $module = $self->_module_name;
my $list = "$module"->new;
return( $list );
},
);
has '_sa' => (
is => 'ro', lazy => 1,
default => sub {
my $self = shift;
my $sa = Mail::SpamAssassin->new;
$sa->init(1);
return $sa;
},
);
has 'processes' => (
is => 'ro', isa => 'Int', default => 5,
documentation => 'number of parallel processes to use',
cmd_aliases => 'p',
traits => [ 'Getopt' ],
);
has 'num_entries' => (
is => 'ro', isa => 'Int', default => 10000,
documentation => 'number of entries to add scores',
cmd_aliases => 'n',
traits => [ 'Getopt' ],
);
has 'repeat' => (
is => 'ro', isa => 'Int', default => 10,
documentation => 'how often to repeat the test',
cmd_aliases => 'r',
traits => [ 'Getopt' ],
);
has 'score' => (
is => 'ro', isa => 'Int', default => 1,
documentation => 'score added to each entry',
cmd_aliases => 's',
traits => [ 'Getopt' ],
);
has '_addr' => ( is => 'ro', isa => 'ArrayRef[Str]', lazy => 1,
default => sub {
my $self = shift;
my @e;
for( my $i = 0 ; $i < $self->num_entries ; $i++ ) {
push( @e, 'preftest-awl-'.$i)
}
return \@e;
},
);
has '_queue' => (
is => 'ro', isa => 'IPC::QWorker', lazy => 1,
default => sub {
my $self = shift;
my $q = IPC::QWorker->new;
print "starting ".$self->processes." workers...\n";
$q->create_workers( $self->processes,
_init => sub {
my $ctx = shift;
$ctx->{'checker'} = $self->_addrlist->new_checker($self->_sa);
return;
},
'add_score' => sub {
my $ctx = shift;
my $addr = shift;
my $entry = $ctx->{'checker'}->get_addr_entry( $addr );
$ctx->{'checker'}->add_score($entry, $self->score );
return;
},
'cleanup' => sub {
my $ctx = shift;
my $addr = shift;
my $entry = $ctx->{'checker'}->get_addr_entry( $addr );
$ctx->{'checker'}->remove_entry($entry);
},
);
return $q;
},
);
sub add_all_scores {
my $self = shift;
foreach my $addr ( @{$self->_addr} ) {
$self->_queue->push_queue( IPC::QWorker::WorkUnit->new(
cmd => 'add_score',
params => $addr,
) );
}
my $start_add = [gettimeofday];
print "updating scores..";
$self->_queue->process_queue;
$self->_queue->flush_queue;
my $finished_add = [gettimeofday];
print ". ".$self->_interval_stats( $self->num_entries, $start_add, $finished_add)."\n";
return;
( run in 2.373 seconds using v1.01-cache-2.11-cpan-98e64b0badf )