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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +38 -200
  3. data/bin/jiggler +1 -1
  4. data/lib/jiggler/at_least_once/acknowledger.rb +43 -0
  5. data/lib/jiggler/at_least_once/fetcher.rb +93 -0
  6. data/lib/jiggler/at_most_once/acknowledger.rb +21 -0
  7. data/lib/jiggler/at_most_once/fetcher.rb +46 -0
  8. data/lib/jiggler/base_acknowledger.rb +11 -0
  9. data/lib/jiggler/base_fetcher.rb +14 -0
  10. data/lib/jiggler/cleaner.rb +14 -5
  11. data/lib/jiggler/cli.rb +3 -2
  12. data/lib/jiggler/config.rb +48 -4
  13. data/lib/jiggler/launcher.rb +9 -3
  14. data/lib/jiggler/manager.rb +26 -2
  15. data/lib/jiggler/retrier.rb +8 -10
  16. data/lib/jiggler/scheduled/enqueuer.rb +1 -1
  17. data/lib/jiggler/scheduled/poller.rb +38 -26
  18. data/lib/jiggler/scheduled/requeuer.rb +57 -0
  19. data/lib/jiggler/server.rb +7 -0
  20. data/lib/jiggler/stats/collection.rb +3 -2
  21. data/lib/jiggler/stats/monitor.rb +2 -2
  22. data/lib/jiggler/summary.rb +8 -1
  23. data/lib/jiggler/support/helper.rb +17 -3
  24. data/lib/jiggler/version.rb +1 -1
  25. data/lib/jiggler/web.rb +0 -2
  26. data/lib/jiggler/worker.rb +21 -36
  27. data/spec/examples.txt +96 -79
  28. data/spec/fixtures/config/jiggler.yml +2 -2
  29. data/spec/jiggler/at_least_once/acknowledger_spec.rb +30 -0
  30. data/spec/jiggler/at_least_once/fetcher_spec.rb +69 -0
  31. data/spec/jiggler/at_most_once/fetcher_spec.rb +33 -0
  32. data/spec/jiggler/cleaner_spec.rb +11 -1
  33. data/spec/jiggler/cli_spec.rb +5 -7
  34. data/spec/jiggler/config_spec.rb +45 -3
  35. data/spec/jiggler/core_spec.rb +2 -0
  36. data/spec/jiggler/job_spec.rb +4 -4
  37. data/spec/jiggler/launcher_spec.rb +60 -54
  38. data/spec/jiggler/manager_spec.rb +50 -41
  39. data/spec/jiggler/retrier_spec.rb +3 -1
  40. data/spec/jiggler/scheduled/requeuer_spec.rb +57 -0
  41. data/spec/jiggler/stats/monitor_spec.rb +3 -2
  42. data/spec/jiggler/summary_spec.rb +19 -5
  43. data/spec/jiggler/worker_spec.rb +11 -15
  44. data/spec/spec_helper.rb +7 -0
  45. metadata +38 -9
data/spec/examples.txt CHANGED
@@ -1,79 +1,96 @@
1
- example_id | status | run_time |
2
- ------------------------------------------------ | ------- | --------------- |
3
- ./spec/jiggler/cleaner_spec.rb[1:1:1] | passed | 0.00079 seconds |
4
- ./spec/jiggler/cleaner_spec.rb[1:2:1] | passed | 0.00104 seconds |
5
- ./spec/jiggler/cleaner_spec.rb[1:3:1] | passed | 0.00427 seconds |
6
- ./spec/jiggler/cleaner_spec.rb[1:4:1] | passed | 0.00071 seconds |
7
- ./spec/jiggler/cleaner_spec.rb[1:5:1] | passed | 0.00079 seconds |
8
- ./spec/jiggler/cleaner_spec.rb[1:6:1] | passed | 0.00071 seconds |
9
- ./spec/jiggler/cleaner_spec.rb[1:7:1] | passed | 0.00063 seconds |
10
- ./spec/jiggler/cleaner_spec.rb[1:8:1] | passed | 0.003 seconds |
11
- ./spec/jiggler/cleaner_spec.rb[1:9:1] | passed | 0.00077 seconds |
12
- ./spec/jiggler/cleaner_spec.rb[1:10:1] | passed | 0.00122 seconds |
13
- ./spec/jiggler/cleaner_spec.rb[1:11:1] | passed | 0.00286 seconds |
14
- ./spec/jiggler/cli_spec.rb[1:1:1:1] | passed | 0.00403 seconds |
15
- ./spec/jiggler/cli_spec.rb[1:1:2:1] | passed | 0.76231 seconds |
16
- ./spec/jiggler/cli_spec.rb[1:1:2:2] | passed | 0.00644 seconds |
17
- ./spec/jiggler/cli_spec.rb[1:1:2:3] | passed | 0.00535 seconds |
18
- ./spec/jiggler/cli_spec.rb[1:1:2:4] | passed | 0.0202 seconds |
19
- ./spec/jiggler/cli_spec.rb[1:1:2:5] | passed | 0.004 seconds |
20
- ./spec/jiggler/cli_spec.rb[1:1:2:6] | passed | 0.00955 seconds |
21
- ./spec/jiggler/cli_spec.rb[1:1:2:7] | passed | 0.02139 seconds |
22
- ./spec/jiggler/cli_spec.rb[1:1:2:8] | passed | 0.00429 seconds |
23
- ./spec/jiggler/cli_spec.rb[1:1:2:9] | passed | 0.00746 seconds |
24
- ./spec/jiggler/cli_spec.rb[1:1:3:1] | passed | 0.00336 seconds |
25
- ./spec/jiggler/cli_spec.rb[1:1:3:2] | passed | 0.00497 seconds |
26
- ./spec/jiggler/cli_spec.rb[1:1:3:3] | passed | 0.00312 seconds |
27
- ./spec/jiggler/cli_spec.rb[1:1:3:4] | passed | 0.0086 seconds |
28
- ./spec/jiggler/cli_spec.rb[1:1:3:5] | unknown | |
29
- ./spec/jiggler/config_spec.rb[1:1:1] | passed | 0.00055 seconds |
30
- ./spec/jiggler/config_spec.rb[1:1:2] | passed | 0.00057 seconds |
31
- ./spec/jiggler/config_spec.rb[1:1:3] | passed | 0.00004 seconds |
32
- ./spec/jiggler/config_spec.rb[1:1:4] | passed | 0.00004 seconds |
33
- ./spec/jiggler/core_spec.rb[1:1:1] | passed | 0.00103 seconds |
34
- ./spec/jiggler/job_spec.rb[1:1:1:1] | passed | 0.00007 seconds |
35
- ./spec/jiggler/job_spec.rb[1:1:2:1] | passed | 0.0009 seconds |
36
- ./spec/jiggler/job_spec.rb[1:2:1] | passed | 0.00064 seconds |
37
- ./spec/jiggler/job_spec.rb[1:3:1] | passed | 0.00341 seconds |
38
- ./spec/jiggler/job_spec.rb[1:4:1] | passed | 0.00051 seconds |
39
- ./spec/jiggler/job_spec.rb[1:4:2] | passed | 0.00073 seconds |
40
- ./spec/jiggler/job_spec.rb[1:5:1] | passed | 0.00051 seconds |
41
- ./spec/jiggler/launcher_spec.rb[1:1:1] | passed | 0.00598 seconds |
42
- ./spec/jiggler/launcher_spec.rb[1:2:1] | passed | 2.02 seconds |
43
- ./spec/jiggler/launcher_spec.rb[1:3:1] | passed | 2.1 seconds |
44
- ./spec/jiggler/launcher_spec.rb[1:4:1] | passed | 2.02 seconds |
45
- ./spec/jiggler/manager_spec.rb[1:1] | passed | 0.00094 seconds |
46
- ./spec/jiggler/manager_spec.rb[1:2:1] | passed | 1.53 seconds |
47
- ./spec/jiggler/manager_spec.rb[1:3:1] | passed | 2.14 seconds |
48
- ./spec/jiggler/manager_spec.rb[1:4:1] | passed | 3.56 seconds |
49
- ./spec/jiggler/redis_store_spec.rb[1:1:1] | passed | 0.00073 seconds |
50
- ./spec/jiggler/redis_store_spec.rb[1:1:2:1] | passed | 0.00071 seconds |
51
- ./spec/jiggler/retrier_spec.rb[1:1:1:1] | passed | 0.02616 seconds |
52
- ./spec/jiggler/retrier_spec.rb[1:1:1:2] | passed | 0.0143 seconds |
53
- ./spec/jiggler/retrier_spec.rb[1:1:2:1] | passed | 0.01566 seconds |
54
- ./spec/jiggler/scheduled/enqueuer_spec.rb[1:1:1] | passed | 0.01203 seconds |
55
- ./spec/jiggler/scheduled/enqueuer_spec.rb[1:1:2] | passed | 0.02395 seconds |
56
- ./spec/jiggler/scheduled/enqueuer_spec.rb[1:1:3] | passed | 0.0107 seconds |
57
- ./spec/jiggler/scheduled/enqueuer_spec.rb[1:2:1] | passed | 0.03692 seconds |
58
- ./spec/jiggler/scheduled/poller_spec.rb[1:1:1] | passed | 1.02 seconds |
59
- ./spec/jiggler/scheduled/poller_spec.rb[1:2:1] | passed | 1.02 seconds |
60
- ./spec/jiggler/stats/monitor_spec.rb[1:1:1] | passed | 2.02 seconds |
61
- ./spec/jiggler/stats/monitor_spec.rb[1:2:1] | passed | 1.03 seconds |
62
- ./spec/jiggler/summary_spec.rb[1:1:1] | passed | 0.00208 seconds |
63
- ./spec/jiggler/summary_spec.rb[1:1:2] | passed | 3.04 seconds |
64
- ./spec/jiggler/summary_spec.rb[1:1:3:1] | passed | 0.0076 seconds |
65
- ./spec/jiggler/summary_spec.rb[1:2:1] | passed | 1.01 seconds |
66
- ./spec/jiggler/summary_spec.rb[1:3:1] | passed | 1.01 seconds |
67
- ./spec/jiggler/summary_spec.rb[1:4:1] | passed | 0.00461 seconds |
68
- ./spec/jiggler/web_spec.rb[1:1:1] | passed | 0.00004 seconds |
69
- ./spec/jiggler/web_spec.rb[1:1:2] | passed | 0.0005 seconds |
70
- ./spec/jiggler/web_spec.rb[1:2:1] | passed | 0.00005 seconds |
71
- ./spec/jiggler/web_spec.rb[1:2:2] | passed | 0.00044 seconds |
72
- ./spec/jiggler/web_spec.rb[1:3:1] | passed | 0.00037 seconds |
73
- ./spec/jiggler/web_spec.rb[1:3:2] | passed | 0.00004 seconds |
74
- ./spec/jiggler/worker_spec.rb[1:1:1] | passed | 1.01 seconds |
75
- ./spec/jiggler/worker_spec.rb[1:1:2] | passed | 1.01 seconds |
76
- ./spec/jiggler/worker_spec.rb[1:1:3] | passed | 1.01 seconds |
77
- ./spec/jiggler/worker_spec.rb[1:2:1] | passed | 0.00527 seconds |
78
- ./spec/jiggler/worker_spec.rb[1:3:1:1] | passed | 2.05 seconds |
79
- ./spec/jiggler/worker_spec.rb[1:3:2:1] | passed | 0.00371 seconds |
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 |
@@ -1,4 +1,4 @@
1
1
  :concurrency: 1
2
2
  :queues:
3
- - users
4
- - blep
3
+ - [users, 0]
4
+ - [blep, 3]
@@ -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
 
@@ -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', path])
43
- expect(cli.config[:require]).to eq(path)
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 do
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
@@ -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
- it 'generates prefixed queues' do
36
- expect(config.prefixed_queues).to eq ['jiggler:list:test', 'jiggler:list:test2']
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: 4,
83
+ concurrency: 8,
42
84
  async: true,
43
85
  redis_url: 'redis://localhost:6379'
44
86
  )
@@ -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
@@ -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
- let(:config) do
5
- Jiggler::Config.new(
6
- concurrency: 1,
7
- timeout: 1,
8
- server_mode: true
9
- )
10
- end
11
- let(:launcher) { described_class.new(config) }
12
-
13
- describe '#initialize' do
14
- it 'sets correct attrs' do
15
- expect(launcher.config).to eq config
16
- end
17
- end
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
- task.wait
32
- end
33
- end
34
-
35
- describe '#suspend' do
36
- it 'suspends the launcher' do
37
- task = Async do
38
- Async do
39
- expect(launcher.send(:manager)).to receive(:suspend).and_call_original
40
- expect(launcher.send(:poller)).to receive(:terminate).and_call_original
41
- expect(launcher.send(:monitor)).to receive(:terminate).and_call_original
42
- launcher.start
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
- task.wait
48
- end
49
- end
50
-
51
- describe '#stop' do
52
- it 'stops the launcher' do
53
- task = Async do
54
- Async do
55
- expect(launcher.send(:manager)).to receive(:terminate).and_call_original
56
- expect(launcher.send(:poller)).to receive(:terminate).and_call_original
57
- expect(launcher.send(:monitor)).to receive(:terminate).and_call_original
58
- launcher.start
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