jiggler 0.1.0.rc4 → 0.1.0.rc6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +38 -200
- data/bin/jiggler +1 -1
- data/lib/jiggler/at_least_once/acknowledger.rb +43 -0
- data/lib/jiggler/at_least_once/fetcher.rb +93 -0
- data/lib/jiggler/at_most_once/acknowledger.rb +21 -0
- data/lib/jiggler/at_most_once/fetcher.rb +46 -0
- data/lib/jiggler/base_acknowledger.rb +11 -0
- data/lib/jiggler/base_fetcher.rb +14 -0
- data/lib/jiggler/cleaner.rb +14 -5
- data/lib/jiggler/cli.rb +3 -2
- data/lib/jiggler/config.rb +48 -4
- data/lib/jiggler/launcher.rb +9 -3
- data/lib/jiggler/manager.rb +26 -2
- data/lib/jiggler/retrier.rb +8 -10
- data/lib/jiggler/scheduled/enqueuer.rb +1 -1
- data/lib/jiggler/scheduled/poller.rb +38 -26
- data/lib/jiggler/scheduled/requeuer.rb +57 -0
- data/lib/jiggler/server.rb +7 -0
- data/lib/jiggler/stats/collection.rb +3 -2
- data/lib/jiggler/stats/monitor.rb +2 -2
- data/lib/jiggler/summary.rb +8 -1
- data/lib/jiggler/support/helper.rb +17 -3
- data/lib/jiggler/version.rb +1 -1
- data/lib/jiggler/web.rb +0 -2
- data/lib/jiggler/worker.rb +21 -36
- data/spec/examples.txt +96 -79
- data/spec/fixtures/config/jiggler.yml +2 -2
- data/spec/jiggler/at_least_once/acknowledger_spec.rb +30 -0
- data/spec/jiggler/at_least_once/fetcher_spec.rb +69 -0
- data/spec/jiggler/at_most_once/fetcher_spec.rb +33 -0
- data/spec/jiggler/cleaner_spec.rb +11 -1
- data/spec/jiggler/cli_spec.rb +5 -7
- data/spec/jiggler/config_spec.rb +45 -3
- data/spec/jiggler/core_spec.rb +2 -0
- data/spec/jiggler/job_spec.rb +4 -4
- data/spec/jiggler/launcher_spec.rb +60 -54
- data/spec/jiggler/manager_spec.rb +50 -41
- data/spec/jiggler/retrier_spec.rb +3 -1
- data/spec/jiggler/scheduled/requeuer_spec.rb +57 -0
- data/spec/jiggler/stats/monitor_spec.rb +3 -2
- data/spec/jiggler/summary_spec.rb +19 -5
- data/spec/jiggler/worker_spec.rb +11 -15
- data/spec/spec_helper.rb +7 -0
- metadata +38 -9
data/spec/examples.txt
CHANGED
@@ -1,79 +1,96 @@
|
|
1
|
-
example_id
|
2
|
-
|
3
|
-
./spec/jiggler/
|
4
|
-
./spec/jiggler/
|
5
|
-
./spec/jiggler/
|
6
|
-
./spec/jiggler/
|
7
|
-
./spec/jiggler/cleaner_spec.rb[1:
|
8
|
-
./spec/jiggler/cleaner_spec.rb[1:
|
9
|
-
./spec/jiggler/cleaner_spec.rb[1:
|
10
|
-
./spec/jiggler/cleaner_spec.rb[1:
|
11
|
-
./spec/jiggler/cleaner_spec.rb[1:
|
12
|
-
./spec/jiggler/cleaner_spec.rb[1:
|
13
|
-
./spec/jiggler/cleaner_spec.rb[1:
|
14
|
-
./spec/jiggler/
|
15
|
-
./spec/jiggler/
|
16
|
-
./spec/jiggler/
|
17
|
-
./spec/jiggler/
|
18
|
-
./spec/jiggler/
|
19
|
-
./spec/jiggler/cli_spec.rb[1:1:
|
20
|
-
./spec/jiggler/cli_spec.rb[1:1:2:
|
21
|
-
./spec/jiggler/cli_spec.rb[1:1:2:
|
22
|
-
./spec/jiggler/cli_spec.rb[1:1:2:
|
23
|
-
./spec/jiggler/cli_spec.rb[1:1:2:
|
24
|
-
./spec/jiggler/cli_spec.rb[1:1:
|
25
|
-
./spec/jiggler/cli_spec.rb[1:1:
|
26
|
-
./spec/jiggler/cli_spec.rb[1:1:
|
27
|
-
./spec/jiggler/cli_spec.rb[1:1:
|
28
|
-
./spec/jiggler/cli_spec.rb[1:1:
|
29
|
-
./spec/jiggler/
|
30
|
-
./spec/jiggler/
|
31
|
-
./spec/jiggler/
|
32
|
-
./spec/jiggler/
|
33
|
-
./spec/jiggler/
|
34
|
-
./spec/jiggler/
|
35
|
-
./spec/jiggler/
|
36
|
-
./spec/jiggler/
|
37
|
-
./spec/jiggler/
|
38
|
-
./spec/jiggler/
|
39
|
-
./spec/jiggler/
|
40
|
-
./spec/jiggler/
|
41
|
-
./spec/jiggler/
|
42
|
-
./spec/jiggler/
|
43
|
-
./spec/jiggler/
|
44
|
-
./spec/jiggler/
|
45
|
-
./spec/jiggler/
|
46
|
-
./spec/jiggler/
|
47
|
-
./spec/jiggler/
|
48
|
-
./spec/jiggler/
|
49
|
-
./spec/jiggler/
|
50
|
-
./spec/jiggler/
|
51
|
-
./spec/jiggler/
|
52
|
-
./spec/jiggler/
|
53
|
-
./spec/jiggler/
|
54
|
-
./spec/jiggler/
|
55
|
-
./spec/jiggler/
|
56
|
-
./spec/jiggler/
|
57
|
-
./spec/jiggler/
|
58
|
-
./spec/jiggler/
|
59
|
-
./spec/jiggler/
|
60
|
-
./spec/jiggler/
|
61
|
-
./spec/jiggler/
|
62
|
-
./spec/jiggler/
|
63
|
-
./spec/jiggler/
|
64
|
-
./spec/jiggler/
|
65
|
-
./spec/jiggler/
|
66
|
-
./spec/jiggler/
|
67
|
-
./spec/jiggler/
|
68
|
-
./spec/jiggler/
|
69
|
-
./spec/jiggler/
|
70
|
-
./spec/jiggler/
|
71
|
-
./spec/jiggler/
|
72
|
-
./spec/jiggler/
|
73
|
-
./spec/jiggler/
|
74
|
-
./spec/jiggler/
|
75
|
-
./spec/jiggler/
|
76
|
-
./spec/jiggler/
|
77
|
-
./spec/jiggler/
|
78
|
-
./spec/jiggler/
|
79
|
-
./spec/jiggler/
|
1
|
+
example_id | status | run_time |
|
2
|
+
-------------------------------------------------------- | ------ | --------------- |
|
3
|
+
./spec/jiggler/at_least_once/acknowledger_spec.rb[1:1:1] | passed | 0.50773 seconds |
|
4
|
+
./spec/jiggler/at_least_once/fetcher_spec.rb[1:1:1] | passed | 2.57 seconds |
|
5
|
+
./spec/jiggler/at_least_once/fetcher_spec.rb[1:1:2] | passed | 2.57 seconds |
|
6
|
+
./spec/jiggler/at_most_once/fetcher_spec.rb[1:1:1] | passed | 0.00698 seconds |
|
7
|
+
./spec/jiggler/cleaner_spec.rb[1:1:1] | passed | 0.001 seconds |
|
8
|
+
./spec/jiggler/cleaner_spec.rb[1:2:1] | passed | 0.00234 seconds |
|
9
|
+
./spec/jiggler/cleaner_spec.rb[1:3:1] | passed | 0.00152 seconds |
|
10
|
+
./spec/jiggler/cleaner_spec.rb[1:4:1] | passed | 0.00101 seconds |
|
11
|
+
./spec/jiggler/cleaner_spec.rb[1:5:1] | passed | 0.00129 seconds |
|
12
|
+
./spec/jiggler/cleaner_spec.rb[1:6:1] | passed | 0.00148 seconds |
|
13
|
+
./spec/jiggler/cleaner_spec.rb[1:7:1] | passed | 0.00127 seconds |
|
14
|
+
./spec/jiggler/cleaner_spec.rb[1:8:1] | passed | 0.00112 seconds |
|
15
|
+
./spec/jiggler/cleaner_spec.rb[1:9:1] | passed | 0.00112 seconds |
|
16
|
+
./spec/jiggler/cleaner_spec.rb[1:9:2] | passed | 0.00136 seconds |
|
17
|
+
./spec/jiggler/cleaner_spec.rb[1:10:1] | passed | 0.00169 seconds |
|
18
|
+
./spec/jiggler/cleaner_spec.rb[1:11:1] | passed | 0.00218 seconds |
|
19
|
+
./spec/jiggler/cli_spec.rb[1:1:1:1] | passed | 0.00053 seconds |
|
20
|
+
./spec/jiggler/cli_spec.rb[1:1:2:1] | passed | 0.01037 seconds |
|
21
|
+
./spec/jiggler/cli_spec.rb[1:1:2:2] | passed | 0.00119 seconds |
|
22
|
+
./spec/jiggler/cli_spec.rb[1:1:2:3] | passed | 0.00048 seconds |
|
23
|
+
./spec/jiggler/cli_spec.rb[1:1:2:4] | passed | 0.00109 seconds |
|
24
|
+
./spec/jiggler/cli_spec.rb[1:1:2:5] | passed | 0.00049 seconds |
|
25
|
+
./spec/jiggler/cli_spec.rb[1:1:2:6] | passed | 0.00053 seconds |
|
26
|
+
./spec/jiggler/cli_spec.rb[1:1:2:7] | passed | 0.00046 seconds |
|
27
|
+
./spec/jiggler/cli_spec.rb[1:1:2:8] | passed | 0.00313 seconds |
|
28
|
+
./spec/jiggler/cli_spec.rb[1:1:2:9] | passed | 0.00137 seconds |
|
29
|
+
./spec/jiggler/cli_spec.rb[1:1:3:1] | passed | 0.0004 seconds |
|
30
|
+
./spec/jiggler/cli_spec.rb[1:1:3:2] | passed | 0.00049 seconds |
|
31
|
+
./spec/jiggler/cli_spec.rb[1:1:3:3] | passed | 0.0007 seconds |
|
32
|
+
./spec/jiggler/cli_spec.rb[1:1:3:4] | passed | 0.001 seconds |
|
33
|
+
./spec/jiggler/cli_spec.rb[1:1:3:5] | passed | 0.00044 seconds |
|
34
|
+
./spec/jiggler/config_spec.rb[1:1:1] | passed | 0.00056 seconds |
|
35
|
+
./spec/jiggler/config_spec.rb[1:1:2:1] | passed | 0.00026 seconds |
|
36
|
+
./spec/jiggler/config_spec.rb[1:1:2:2:1] | passed | 0.00046 seconds |
|
37
|
+
./spec/jiggler/config_spec.rb[1:1:2:3:1] | passed | 0.0004 seconds |
|
38
|
+
./spec/jiggler/config_spec.rb[1:1:3] | passed | 0.00029 seconds |
|
39
|
+
./spec/jiggler/config_spec.rb[1:1:4] | passed | 0.00026 seconds |
|
40
|
+
./spec/jiggler/core_spec.rb[1:1:1] | passed | 0.00057 seconds |
|
41
|
+
./spec/jiggler/job_spec.rb[1:1:1:1] | passed | 0.00009 seconds |
|
42
|
+
./spec/jiggler/job_spec.rb[1:1:2:1] | passed | 0.00009 seconds |
|
43
|
+
./spec/jiggler/job_spec.rb[1:2:1] | passed | 0.00056 seconds |
|
44
|
+
./spec/jiggler/job_spec.rb[1:3:1] | passed | 0.00106 seconds |
|
45
|
+
./spec/jiggler/job_spec.rb[1:4:1] | passed | 0.00049 seconds |
|
46
|
+
./spec/jiggler/job_spec.rb[1:4:2] | passed | 0.0005 seconds |
|
47
|
+
./spec/jiggler/job_spec.rb[1:5:1] | passed | 0.00054 seconds |
|
48
|
+
./spec/jiggler/launcher_spec.rb[1:1:1:1] | passed | 0.00018 seconds |
|
49
|
+
./spec/jiggler/launcher_spec.rb[1:1:2:1] | passed | 2.02 seconds |
|
50
|
+
./spec/jiggler/launcher_spec.rb[1:1:3:1] | passed | 2.03 seconds |
|
51
|
+
./spec/jiggler/launcher_spec.rb[1:1:4:1] | passed | 2.04 seconds |
|
52
|
+
./spec/jiggler/launcher_spec.rb[1:2:1:1] | passed | 0.00274 seconds |
|
53
|
+
./spec/jiggler/launcher_spec.rb[1:2:2:1] | passed | 2.1 seconds |
|
54
|
+
./spec/jiggler/launcher_spec.rb[1:2:3:1] | passed | 2.03 seconds |
|
55
|
+
./spec/jiggler/launcher_spec.rb[1:2:4:1] | passed | 2.03 seconds |
|
56
|
+
./spec/jiggler/manager_spec.rb[1:1:1] | passed | 0.00041 seconds |
|
57
|
+
./spec/jiggler/manager_spec.rb[1:1:2:1] | passed | 0.50391 seconds |
|
58
|
+
./spec/jiggler/manager_spec.rb[1:1:3:1] | passed | 1.51 seconds |
|
59
|
+
./spec/jiggler/manager_spec.rb[1:1:4:1] | passed | 3.51 seconds |
|
60
|
+
./spec/jiggler/manager_spec.rb[1:2:1] | passed | 0.00178 seconds |
|
61
|
+
./spec/jiggler/manager_spec.rb[1:2:2:1] | passed | 0.50337 seconds |
|
62
|
+
./spec/jiggler/manager_spec.rb[1:2:3:1] | passed | 2.02 seconds |
|
63
|
+
./spec/jiggler/manager_spec.rb[1:2:4:1] | passed | 2.5 seconds |
|
64
|
+
./spec/jiggler/redis_store_spec.rb[1:1:1] | passed | 0.00024 seconds |
|
65
|
+
./spec/jiggler/redis_store_spec.rb[1:1:2:1] | passed | 0.00017 seconds |
|
66
|
+
./spec/jiggler/retrier_spec.rb[1:1:1:1] | passed | 0.00332 seconds |
|
67
|
+
./spec/jiggler/retrier_spec.rb[1:1:1:2] | passed | 0.00339 seconds |
|
68
|
+
./spec/jiggler/retrier_spec.rb[1:1:2:1] | passed | 0.00062 seconds |
|
69
|
+
./spec/jiggler/scheduled/enqueuer_spec.rb[1:1:1] | passed | 0.00562 seconds |
|
70
|
+
./spec/jiggler/scheduled/enqueuer_spec.rb[1:1:2] | passed | 0.00476 seconds |
|
71
|
+
./spec/jiggler/scheduled/enqueuer_spec.rb[1:1:3] | passed | 0.00294 seconds |
|
72
|
+
./spec/jiggler/scheduled/enqueuer_spec.rb[1:2:1] | passed | 0.03586 seconds |
|
73
|
+
./spec/jiggler/scheduled/poller_spec.rb[1:1:1] | passed | 1.02 seconds |
|
74
|
+
./spec/jiggler/scheduled/poller_spec.rb[1:2:1] | passed | 1 second |
|
75
|
+
./spec/jiggler/scheduled/requeuer_spec.rb[1:1:1] | passed | 0.00526 seconds |
|
76
|
+
./spec/jiggler/scheduled/requeuer_spec.rb[1:2:1] | passed | 0.00699 seconds |
|
77
|
+
./spec/jiggler/scheduled/requeuer_spec.rb[1:3:1] | passed | 0.00995 seconds |
|
78
|
+
./spec/jiggler/stats/monitor_spec.rb[1:1:1] | passed | 1.03 seconds |
|
79
|
+
./spec/jiggler/stats/monitor_spec.rb[1:2:1] | passed | 1.08 seconds |
|
80
|
+
./spec/jiggler/summary_spec.rb[1:1:1] | passed | 0.01425 seconds |
|
81
|
+
./spec/jiggler/summary_spec.rb[1:1:2] | passed | 2.04 seconds |
|
82
|
+
./spec/jiggler/summary_spec.rb[1:1:3:1] | passed | 0.00683 seconds |
|
83
|
+
./spec/jiggler/summary_spec.rb[1:2:1] | passed | 1.01 seconds |
|
84
|
+
./spec/jiggler/summary_spec.rb[1:3:1] | passed | 1.01 seconds |
|
85
|
+
./spec/jiggler/summary_spec.rb[1:4:1] | passed | 0.00434 seconds |
|
86
|
+
./spec/jiggler/web_spec.rb[1:1:1] | passed | 0.00015 seconds |
|
87
|
+
./spec/jiggler/web_spec.rb[1:1:2] | passed | 0.00016 seconds |
|
88
|
+
./spec/jiggler/web_spec.rb[1:2:1] | passed | 0.00011 seconds |
|
89
|
+
./spec/jiggler/web_spec.rb[1:2:2] | passed | 0.0001 seconds |
|
90
|
+
./spec/jiggler/web_spec.rb[1:3:1] | passed | 0.00182 seconds |
|
91
|
+
./spec/jiggler/web_spec.rb[1:3:2] | passed | 0.00015 seconds |
|
92
|
+
./spec/jiggler/worker_spec.rb[1:1:1] | passed | 1 second |
|
93
|
+
./spec/jiggler/worker_spec.rb[1:1:2] | passed | 1.02 seconds |
|
94
|
+
./spec/jiggler/worker_spec.rb[1:1:3] | passed | 1.01 seconds |
|
95
|
+
./spec/jiggler/worker_spec.rb[1:2:1] | passed | 0.00751 seconds |
|
96
|
+
./spec/jiggler/worker_spec.rb[1:3:1:1] | passed | 0.50368 seconds |
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RSpec.describe Jiggler::AtLeastOnce::Acknowledger do
|
4
|
+
let(:config) do
|
5
|
+
Jiggler::Config.new(
|
6
|
+
concurrency: 1,
|
7
|
+
timeout: 1,
|
8
|
+
poller_enabled: false,
|
9
|
+
queues: ['fetcher_queue'],
|
10
|
+
mode: :at_least_once
|
11
|
+
)
|
12
|
+
end
|
13
|
+
let(:acknowledger) { Jiggler::AtLeastOnce::Acknowledger.new(config) }
|
14
|
+
let(:job) { Jiggler::AtLeastOnce::Fetcher::CurrentJob.new(args: 'args', reserve_queue: 'ack_queue') }
|
15
|
+
|
16
|
+
describe '#start' do
|
17
|
+
it 'acks the job' do
|
18
|
+
acknowledger.ack(job)
|
19
|
+
expect(job).to receive(:ack)
|
20
|
+
task = Async do
|
21
|
+
Async do
|
22
|
+
acknowledger.start
|
23
|
+
end
|
24
|
+
sleep(0.5)
|
25
|
+
acknowledger.terminate
|
26
|
+
end
|
27
|
+
task.wait
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RSpec.describe Jiggler::AtLeastOnce::Fetcher do
|
4
|
+
describe '#fetch' do
|
5
|
+
let(:config) do
|
6
|
+
Jiggler::Config.new(
|
7
|
+
concurrency: 1,
|
8
|
+
timeout: 1,
|
9
|
+
poller_enabled: false,
|
10
|
+
queues: ['fetcher_queue'],
|
11
|
+
mode: :at_least_once
|
12
|
+
)
|
13
|
+
end
|
14
|
+
let(:uuid) { "#{SecureRandom.hex(3)}-test" }
|
15
|
+
let(:reserve_queue) { 'jiggler:list:fetcher_queue:in_progress:' + uuid }
|
16
|
+
let(:collection) { Jiggler::Stats::Collection.new(uuid, uuid) }
|
17
|
+
let(:fetcher) { Jiggler::AtLeastOnce::Fetcher.new(config, collection) }
|
18
|
+
|
19
|
+
after { config.cleaner.prune_all }
|
20
|
+
|
21
|
+
it 'fetches current job' do
|
22
|
+
MyJob.with_options(queue: 'fetcher_queue').enqueue
|
23
|
+
job = nil
|
24
|
+
task = Async do
|
25
|
+
Async do
|
26
|
+
fetcher.start
|
27
|
+
end
|
28
|
+
sleep(0.5)
|
29
|
+
job = fetcher.fetch
|
30
|
+
fetcher.suspend
|
31
|
+
end
|
32
|
+
task.wait
|
33
|
+
args = Oj.load(job.args)
|
34
|
+
|
35
|
+
expect(job.queue).to eq('jiggler:list:fetcher_queue')
|
36
|
+
expect(job.reserve_queue).to eq(reserve_queue)
|
37
|
+
|
38
|
+
expect(args['name']).to eq('MyJob')
|
39
|
+
expect(args['jid']).to be_a(String)
|
40
|
+
expect(args['retries']).to be 0
|
41
|
+
expect(args['args']).to eq([])
|
42
|
+
config.with_sync_redis do |conn|
|
43
|
+
expect(conn.call('LLEN', reserve_queue)).to eq(1)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'ack removes the job from reserve queue' do
|
48
|
+
MyJob.with_options(queue: 'fetcher_queue').enqueue
|
49
|
+
job = nil
|
50
|
+
task = Async do
|
51
|
+
Async do
|
52
|
+
fetcher.start
|
53
|
+
end
|
54
|
+
sleep(0.5)
|
55
|
+
job = fetcher.fetch
|
56
|
+
fetcher.suspend
|
57
|
+
end
|
58
|
+
task.wait
|
59
|
+
|
60
|
+
config.with_sync_redis do |conn|
|
61
|
+
expect(conn.call('LLEN', reserve_queue)).to eq(1)
|
62
|
+
end
|
63
|
+
job.ack
|
64
|
+
config.with_sync_redis do |conn|
|
65
|
+
expect(conn.call('LLEN', reserve_queue)).to eq(0)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RSpec.describe Jiggler::AtMostOnce::Fetcher do
|
4
|
+
describe '#fetch' do
|
5
|
+
let(:config) do
|
6
|
+
Jiggler::Config.new(
|
7
|
+
concurrency: 1,
|
8
|
+
timeout: 1,
|
9
|
+
poller_enabled: false,
|
10
|
+
queues: ['fetcher_queue'],
|
11
|
+
mode: :at_most_once
|
12
|
+
)
|
13
|
+
end
|
14
|
+
let(:uuid) { "#{SecureRandom.hex(3)}-test" }
|
15
|
+
let(:collection) { Jiggler::Stats::Collection.new(uuid, uuid) }
|
16
|
+
let(:fetcher) { Jiggler::AtMostOnce::Fetcher.new(config, collection) }
|
17
|
+
|
18
|
+
after { config.cleaner.prune_all }
|
19
|
+
|
20
|
+
it 'fetches current job' do
|
21
|
+
MyJob.with_options(queue: 'fetcher_queue').enqueue
|
22
|
+
|
23
|
+
job = Sync { fetcher.fetch }
|
24
|
+
args = Oj.load(job.args)
|
25
|
+
|
26
|
+
expect(job.queue).to eq('jiggler:list:fetcher_queue')
|
27
|
+
expect(args['name']).to eq('MyJob')
|
28
|
+
expect(args['jid']).to be_a(String)
|
29
|
+
expect(args['retries']).to be 0
|
30
|
+
expect(args['args']).to eq([])
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -9,7 +9,6 @@ RSpec.describe Jiggler::Cleaner do
|
|
9
9
|
)
|
10
10
|
end
|
11
11
|
let(:cleaner) { described_class.new(config) }
|
12
|
-
after(:all) { Jiggler.config.cleaner.prune_all }
|
13
12
|
|
14
13
|
describe '#prune_failures_counter' do
|
15
14
|
it 'prunes the failures counter' do
|
@@ -138,6 +137,16 @@ RSpec.describe Jiggler::Cleaner do
|
|
138
137
|
expect(conn.call('LRANGE', 'jiggler:list:cleaner-test-0', 0, -1)).to be_empty
|
139
138
|
end
|
140
139
|
end
|
140
|
+
|
141
|
+
it 'prunes in_progress queues' do
|
142
|
+
config.client_redis_pool.acquire do |conn|
|
143
|
+
conn.call('LPUSH', 'jiggler:list:cleaner-test-0:in-progress:1', '{}')
|
144
|
+
end
|
145
|
+
cleaner.prune_all_queues
|
146
|
+
config.client_redis_pool.acquire do |conn|
|
147
|
+
expect(conn.call('LRANGE', 'jiggler:list:cleaner-test-0:in-progress:1', 0, -1)).to be_empty
|
148
|
+
end
|
149
|
+
end
|
141
150
|
end
|
142
151
|
|
143
152
|
describe '#prune_queue' do
|
@@ -151,6 +160,7 @@ RSpec.describe Jiggler::Cleaner do
|
|
151
160
|
expect(conn.call('LRANGE', 'jiggler:list:cleaner-test-1', 0, -1)).to be_empty
|
152
161
|
expect(conn.call('LRANGE', 'jiggler:list:cleaner-test-2', 0, -1)).to eq(['{}'])
|
153
162
|
end
|
163
|
+
config.cleaner.prune_all
|
154
164
|
end
|
155
165
|
end
|
156
166
|
|
data/spec/jiggler/cli_spec.rb
CHANGED
@@ -20,12 +20,13 @@ RSpec.describe Jiggler::CLI do
|
|
20
20
|
before { cli.instance_variable_set(:@config, Jiggler::Config.new(verbose: true)) }
|
21
21
|
after { cli.instance_variable_set(:@config, Jiggler::Config.new) }
|
22
22
|
let(:path) { './spec/fixtures/config/jiggler.yml' }
|
23
|
+
let(:jobs_file) { './spec/fixtures/jobs' }
|
23
24
|
|
24
25
|
it 'fetches config file' do
|
25
26
|
cli.parse_and_init(['-C', path])
|
26
27
|
expect(cli.config[:config_file]).to eq(path)
|
27
28
|
expect(cli.config[:concurrency]).to be 1
|
28
|
-
expect(cli.config[:queues]).to eq(['users', 'blep'])
|
29
|
+
expect(cli.config[:queues]).to eq([['users', 0], ['blep', 3]])
|
29
30
|
end
|
30
31
|
|
31
32
|
it 'fetches concurrency' do
|
@@ -39,8 +40,8 @@ RSpec.describe Jiggler::CLI do
|
|
39
40
|
end
|
40
41
|
|
41
42
|
it 'fetches require' do
|
42
|
-
cli.parse_and_init(['-r',
|
43
|
-
expect(cli.config[:require]).to eq(
|
43
|
+
cli.parse_and_init(['-r', jobs_file])
|
44
|
+
expect(cli.config[:require]).to eq(jobs_file)
|
44
45
|
end
|
45
46
|
|
46
47
|
it 'fetches timeout' do
|
@@ -77,10 +78,7 @@ RSpec.describe Jiggler::CLI do
|
|
77
78
|
it { expect { cli.parse_and_init(['-c', 'invalid']) }.to raise_error(ArgumentError) }
|
78
79
|
it { expect { cli.parse_and_init(['-c', '-1']) }.to raise_error(ArgumentError) }
|
79
80
|
it { expect { cli.parse_and_init(['-t', 'yo']) }.to raise_error(ArgumentError) }
|
80
|
-
it
|
81
|
-
cli.parse_and_init(['-r', 'test.rb'])
|
82
|
-
expect { cli.send(:load_app) }.to raise_error(SystemExit)
|
83
|
-
end
|
81
|
+
it { expect { cli.parse_and_init(['-r', 'test.rb']) }.to raise_error(SystemExit) }
|
84
82
|
it { expect { cli.parse_and_init(['-q', 'in:va:lid']) }.to raise_error(ArgumentError) }
|
85
83
|
end
|
86
84
|
end
|
data/spec/jiggler/config_spec.rb
CHANGED
@@ -31,14 +31,56 @@ RSpec.describe Jiggler::Config do
|
|
31
31
|
expect(config[:poll_interval]).to be 5
|
32
32
|
expect(config[:client_async]).to be false
|
33
33
|
end
|
34
|
+
|
35
|
+
context 'for internal lists' do
|
36
|
+
it 'generates prefixes' do
|
37
|
+
expect(config.queues_data).to eq ({
|
38
|
+
'test' => {
|
39
|
+
priority: 0,
|
40
|
+
list: 'jiggler:list:test'
|
41
|
+
},
|
42
|
+
'test2' => {
|
43
|
+
priority: 0,
|
44
|
+
list: 'jiggler:list:test2'
|
45
|
+
}
|
46
|
+
})
|
47
|
+
expect(config.sorted_lists).to eq ['jiggler:list:test', 'jiggler:list:test2']
|
48
|
+
end
|
34
49
|
|
35
|
-
|
36
|
-
|
50
|
+
context 'when queues are not specified' do
|
51
|
+
let(:config) { Jiggler::Config.new }
|
52
|
+
it 'sets default queue' do
|
53
|
+
expect(config.queues_data).to eq ({
|
54
|
+
'default' => {
|
55
|
+
priority: 0,
|
56
|
+
list: 'jiggler:list:default'
|
57
|
+
}
|
58
|
+
})
|
59
|
+
expect(config.sorted_lists).to eq ['jiggler:list:default']
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context 'when quesues are specified with priorities' do
|
64
|
+
let(:config) { Jiggler::Config.new(queues: [['test',1],['test2',4]]) }
|
65
|
+
it 'respects priority' do
|
66
|
+
expect(config.queues_data).to eq ({
|
67
|
+
'test' => {
|
68
|
+
priority: 1,
|
69
|
+
list: 'jiggler:list:test'
|
70
|
+
},
|
71
|
+
'test2' => {
|
72
|
+
priority: 4,
|
73
|
+
list: 'jiggler:list:test2'
|
74
|
+
}
|
75
|
+
})
|
76
|
+
expect(config.sorted_lists).to eq ['jiggler:list:test2', 'jiggler:list:test']
|
77
|
+
end
|
78
|
+
end
|
37
79
|
end
|
38
80
|
|
39
81
|
it 'gets redis options for server' do
|
40
82
|
expect(config.redis_options).to eq(
|
41
|
-
concurrency:
|
83
|
+
concurrency: 8,
|
42
84
|
async: true,
|
43
85
|
redis_url: 'redis://localhost:6379'
|
44
86
|
)
|
data/spec/jiggler/core_spec.rb
CHANGED
@@ -29,6 +29,8 @@ RSpec.describe 'Core' do
|
|
29
29
|
expect(Jiggler.config[:queues]).to eq %w[foo bar]
|
30
30
|
expect(Jiggler.config[:require]).to eq 'foo'
|
31
31
|
expect(Jiggler.config[:environment]).to eq 'bar'
|
32
|
+
# reset config
|
33
|
+
Jiggler.instance_variable_set(:@config, nil)
|
32
34
|
end
|
33
35
|
end
|
34
36
|
end
|
data/spec/jiggler/job_spec.rb
CHANGED
@@ -17,10 +17,6 @@ RSpec.describe Jiggler::Job do
|
|
17
17
|
context 'on default' do
|
18
18
|
let(:job) { MyJob.new }
|
19
19
|
|
20
|
-
before do
|
21
|
-
MyJob.job_options # reset to default
|
22
|
-
end
|
23
|
-
|
24
20
|
it 'has correct attrs' do
|
25
21
|
expect(job.class.queue).to eq 'default'
|
26
22
|
expect(job.class.retries).to be 0
|
@@ -36,6 +32,10 @@ RSpec.describe Jiggler::Job do
|
|
36
32
|
MyJob.job_options(queue: 'custom', retries: 3, retry_queue: 'custom_retry')
|
37
33
|
end
|
38
34
|
|
35
|
+
after do
|
36
|
+
MyJob.job_options # reset to default
|
37
|
+
end
|
38
|
+
|
39
39
|
it 'has correct attrs' do
|
40
40
|
expect(job.class.queue).to eq 'custom'
|
41
41
|
expect(job.class.retries).to be 3
|
@@ -1,66 +1,72 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
RSpec.describe Jiggler::Launcher do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
describe '#start' do
|
20
|
-
it 'starts the launcher' do
|
21
|
-
task = Async do
|
22
|
-
Async do
|
23
|
-
expect(launcher.send(:manager)).to receive(:start).and_call_original
|
24
|
-
expect(launcher.send(:poller)).to receive(:start).and_call_original
|
25
|
-
expect(launcher.send(:monitor)).to receive(:start).and_call_original
|
26
|
-
launcher.start
|
4
|
+
[:at_most_once, :at_least_once].each do |mode|
|
5
|
+
context "with #{mode} mode" do
|
6
|
+
let(:config) do
|
7
|
+
Jiggler::Config.new(
|
8
|
+
concurrency: 1,
|
9
|
+
timeout: 1,
|
10
|
+
server_mode: true,
|
11
|
+
mode: mode
|
12
|
+
)
|
13
|
+
end
|
14
|
+
let(:launcher) { described_class.new(config) }
|
15
|
+
|
16
|
+
describe '#initialize' do
|
17
|
+
it 'sets correct attrs' do
|
18
|
+
expect(launcher.config).to eq config
|
27
19
|
end
|
28
|
-
sleep(1)
|
29
|
-
launcher.stop
|
30
20
|
end
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
21
|
+
|
22
|
+
describe '#start' do
|
23
|
+
it 'starts the launcher' do
|
24
|
+
task = Async do
|
25
|
+
Async do
|
26
|
+
expect(launcher.send(:manager)).to receive(:start).and_call_original
|
27
|
+
expect(launcher.send(:poller)).to receive(:start).and_call_original
|
28
|
+
expect(launcher.send(:monitor)).to receive(:start).and_call_original
|
29
|
+
launcher.start
|
30
|
+
end
|
31
|
+
sleep(1)
|
32
|
+
launcher.stop
|
33
|
+
end
|
34
|
+
task.wait
|
43
35
|
end
|
44
|
-
sleep(1)
|
45
|
-
launcher.suspend
|
46
36
|
end
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
37
|
+
|
38
|
+
describe '#suspend' do
|
39
|
+
it 'suspends the launcher' do
|
40
|
+
task = Async do
|
41
|
+
Async do
|
42
|
+
expect(launcher.send(:manager)).to receive(:suspend).twice.and_call_original
|
43
|
+
expect(launcher.send(:poller)).to receive(:terminate).and_call_original
|
44
|
+
expect(launcher.send(:monitor)).to receive(:terminate).and_call_original
|
45
|
+
launcher.start
|
46
|
+
end
|
47
|
+
sleep(1)
|
48
|
+
launcher.suspend
|
49
|
+
launcher.stop
|
50
|
+
end
|
51
|
+
task.wait
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe '#stop' do
|
56
|
+
it 'stops the launcher' do
|
57
|
+
task = Async do
|
58
|
+
Async do
|
59
|
+
expect(launcher.send(:manager)).to receive(:terminate).and_call_original
|
60
|
+
expect(launcher.send(:poller)).to receive(:terminate).and_call_original
|
61
|
+
expect(launcher.send(:monitor)).to receive(:terminate).and_call_original
|
62
|
+
launcher.start
|
63
|
+
end
|
64
|
+
sleep(1)
|
65
|
+
launcher.stop
|
66
|
+
end
|
67
|
+
task.wait
|
59
68
|
end
|
60
|
-
sleep(1)
|
61
|
-
launcher.stop
|
62
69
|
end
|
63
|
-
task.wait
|
64
70
|
end
|
65
71
|
end
|
66
72
|
end
|