jiggler 0.1.0.rc4 → 0.1.0.rc5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +37 -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 +18 -3
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