forked from mojolicious/minion
-
Notifications
You must be signed in to change notification settings - Fork 0
/
pg_minion_lock_stress.t
56 lines (39 loc) · 1.48 KB
/
pg_minion_lock_stress.t
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
use Mojo::Base -strict;
use Test::More;
plan skip_all => 'set TEST_ONLINE to enable this test' unless $ENV{TEST_ONLINE};
use Minion;
use Mojo::IOLoop::ReadWriteProcess qw(queue process);
require Mojo::Pg;
use Data::Dumper;
my $iterations = 100;
my $pg = Mojo::Pg->new($ENV{TEST_ONLINE});
$pg->db->query('drop schema if exists minion_worker_test cascade');
$pg->db->query('create schema minion_worker_test');
my $minion = Minion->new(Pg => $ENV{TEST_ONLINE});
$minion->backend->pg->search_path(['minion_worker_test']);
my $q = queue;
$q->pool->maximum_processes(16); # Max processes in parallel
$q->queue->maximum_processes($iterations); # Max queue
my $fired;
$q->add( process sub {
my $res = $minion->lock('test_lock', 3600, {limit => 16});
$minion->unlock('test_lock') if $res;
} ) for 1..$iterations;
$q->once(stop => sub { $fired++; });
my $locks = $minion->backend->pg->db->query(
"select count(*) as cnt
from minion_worker_test.minion_locks where name='test_lock'"
)->hash->{cnt};
is($locks, 0, 'No locks should exist');
# Consume the queue
$q->consume();
my $all = $q->done;
is($fired, $iterations, 'Number of executed events matches planned');
print Dumper('Events not fired: ', $all) unless $fired == $iterations;
$locks = $minion->backend->pg->db->query(
"select count(*) as cnt
from minion_worker_test.minion_locks where name='test_lock'"
)->hash->{cnt};
is($locks, 0, 'No locks should remain');
$pg->db->query('drop schema minion_worker_test cascade');
done_testing();