sidekiq_lockable_job 0.1.1 → 0.1.2
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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Gemfile.lock +22 -4
- data/README.md +52 -4
- data/Rakefile +18 -0
- data/demo.cast +101 -0
- data/lib/sidekiq/lockable_job.rb +2 -2
- data/lib/sidekiq_lockable_job/version.rb +1 -1
- data/sidekiq_lockable_job.gemspec +1 -0
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5ce3896784973f4d6fab5917fc1dc383e12d8cb9bff157bcb5d91f3f2eaa755f
|
4
|
+
data.tar.gz: 5d44e4d73e36875421feaa8140e5deb888a23a4de95964f7638c0c23df93cc1c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 26f1401accb8cd4b0b592472e2f99edd78db38079884034ce2acac0823d27af14b86fe8daa997f58a09d9e573a356946497628001d0256cd66284ce5aa70019f
|
7
|
+
data.tar.gz: ec29d4842da09003a7951367b80c03bf5e694e5601103375bed90f67308bcc691f651a812a31fefa90b336848d8fad529c6758888f41c1ec476cc706cf66ae1c
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,20 +1,25 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
sidekiq_lockable_job (0.1.
|
4
|
+
sidekiq_lockable_job (0.1.2)
|
5
5
|
redis (= 4.0.1)
|
6
6
|
sidekiq (= 5.0.5)
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
|
-
concurrent-ruby (1.1.
|
11
|
+
concurrent-ruby (1.1.6)
|
12
12
|
connection_pool (2.2.2)
|
13
13
|
diff-lcs (1.3)
|
14
|
+
equatable (0.6.1)
|
14
15
|
fakeredis (0.7.0)
|
15
16
|
redis (>= 3.2, < 5.0)
|
16
|
-
|
17
|
-
|
17
|
+
necromancer (0.5.1)
|
18
|
+
pastel (0.7.3)
|
19
|
+
equatable (~> 0.6)
|
20
|
+
tty-color (~> 0.5)
|
21
|
+
rack (2.2.2)
|
22
|
+
rack-protection (2.0.8.1)
|
18
23
|
rack
|
19
24
|
rake (12.3.3)
|
20
25
|
redis (4.0.1)
|
@@ -36,6 +41,18 @@ GEM
|
|
36
41
|
connection_pool (~> 2.2, >= 2.2.0)
|
37
42
|
rack-protection (>= 1.5.0)
|
38
43
|
redis (>= 3.3.4, < 5)
|
44
|
+
tty-color (0.5.1)
|
45
|
+
tty-cursor (0.7.1)
|
46
|
+
tty-prompt (0.19.0)
|
47
|
+
necromancer (~> 0.5.0)
|
48
|
+
pastel (~> 0.7.0)
|
49
|
+
tty-reader (~> 0.6.0)
|
50
|
+
tty-reader (0.6.0)
|
51
|
+
tty-cursor (~> 0.7)
|
52
|
+
tty-screen (~> 0.7)
|
53
|
+
wisper (~> 2.0.0)
|
54
|
+
tty-screen (0.7.1)
|
55
|
+
wisper (2.0.1)
|
39
56
|
|
40
57
|
PLATFORMS
|
41
58
|
ruby
|
@@ -46,6 +63,7 @@ DEPENDENCIES
|
|
46
63
|
rake (~> 12.3.3)
|
47
64
|
rspec (~> 3.0)
|
48
65
|
sidekiq_lockable_job!
|
66
|
+
tty-prompt (= 0.19.0)
|
49
67
|
|
50
68
|
BUNDLED WITH
|
51
69
|
2.0.2
|
data/README.md
CHANGED
@@ -38,6 +38,15 @@ Or install it yourself as:
|
|
38
38
|
|
39
39
|
$ gem install sidekiq_lockable_job
|
40
40
|
|
41
|
+
|
42
|
+
## Demo
|
43
|
+
|
44
|
+
Thanks to [Asciinema](https://asciinema.org)!
|
45
|
+
|
46
|
+
$ rake demo
|
47
|
+
|
48
|
+
[](https://asciinema.org/a/324095)
|
49
|
+
|
41
50
|
## Usage
|
42
51
|
|
43
52
|
The gem is compose of four parts:
|
@@ -219,7 +228,9 @@ end
|
|
219
228
|
## Specs
|
220
229
|
|
221
230
|
```
|
222
|
-
Sidekiq::LockableJob
|
231
|
+
Sidekiq::LockableJob::LockService
|
232
|
+
REDIS_PREFIX_KEY
|
233
|
+
has a prefix
|
223
234
|
.lock
|
224
235
|
lock
|
225
236
|
.unlock
|
@@ -230,9 +241,9 @@ Sidekiq::LockableJob
|
|
230
241
|
.handle_locked_by
|
231
242
|
raise if locked by any key
|
232
243
|
raise if locked by single key
|
233
|
-
|
234
|
-
|
235
|
-
|
244
|
+
when not locked
|
245
|
+
DOT NOT raise if not locked by
|
246
|
+
return false
|
236
247
|
|
237
248
|
Sidekiq::LockableJob::Middleware::Client::SetLocks
|
238
249
|
LockableJob
|
@@ -261,6 +272,8 @@ Sidekiq::LockableJob::Middleware::Server::HandleLockedBy
|
|
261
272
|
with a non lock key
|
262
273
|
behaves like perform the job
|
263
274
|
example at ./spec/sidekiq/lockable_job/middleware/server/shared.rb:13
|
275
|
+
behaves like it yield
|
276
|
+
is expected to eq true
|
264
277
|
with single lock key
|
265
278
|
behaves like raise an error
|
266
279
|
is expected to raise Sidekiq::LockableJob::LockedJobError
|
@@ -299,8 +312,43 @@ Sidekiq::LockableJob::Middleware::Server::UnsetLocks
|
|
299
312
|
for another job
|
300
313
|
DOES NOT remove the lock
|
301
314
|
|
315
|
+
Sidekiq::LockableJob::MultiLockService
|
316
|
+
REDIS_PREFIX_KEY
|
317
|
+
has a prefix
|
318
|
+
.lock
|
319
|
+
lock
|
320
|
+
.unlock
|
321
|
+
unlock
|
322
|
+
with multiple lock
|
323
|
+
don't unlock at first
|
324
|
+
unlock
|
325
|
+
.locked?
|
326
|
+
true if locked
|
327
|
+
false if NOT locked
|
328
|
+
.handle_locked_by
|
329
|
+
raise if locked by any key
|
330
|
+
raise if locked by single key
|
331
|
+
when not locked
|
332
|
+
DOT NOT raise if not locked by
|
333
|
+
return false
|
334
|
+
|
335
|
+
Sidekiq::LockableJob
|
336
|
+
.current_lockable_job_lock_service
|
337
|
+
has lock_service by default
|
338
|
+
.lockable_job_lock_service
|
339
|
+
set a custom lock service
|
340
|
+
.included
|
341
|
+
include client middleware
|
342
|
+
include server middleware (PENDING: Temporarily skipped with xit)
|
343
|
+
|
302
344
|
SidekiqLockableJob
|
303
345
|
has a version number
|
346
|
+
|
347
|
+
Pending: (Failures listed here are expected and do not affect your suite's status)
|
348
|
+
|
349
|
+
1) Sidekiq::LockableJob.included include server middleware
|
350
|
+
# Temporarily skipped with xit
|
351
|
+
# ./spec/sidekiq/lockable_job_spec.rb:37
|
304
352
|
```
|
305
353
|
|
306
354
|
## Development
|
data/Rakefile
CHANGED
@@ -1,6 +1,24 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
2
|
require "rspec/core/rake_task"
|
3
|
+
require 'tty-prompt'
|
3
4
|
|
4
5
|
RSpec::Core::RakeTask.new(:spec)
|
5
6
|
|
6
7
|
task :default => :spec
|
8
|
+
|
9
|
+
|
10
|
+
desc "Play a demo of contextualized_logs"
|
11
|
+
task :demo do
|
12
|
+
prompt = TTY::Prompt.new
|
13
|
+
if `which asciinema`.empty?
|
14
|
+
if `which brew`.empty
|
15
|
+
return unless prompt.yes?('Install brew')
|
16
|
+
`/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"`
|
17
|
+
|
18
|
+
return unless prompt.yes?('Install asciinema using brew?')
|
19
|
+
`brew install asciinema`
|
20
|
+
end
|
21
|
+
end
|
22
|
+
prompt.warn('press [space] continuesly to play demo line by line, or just press [space] to play')
|
23
|
+
exec('asciinema play -i 1 -s 1 demo.cast')
|
24
|
+
end
|
data/demo.cast
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
{"version": 2, "width": 237, "height": 44, "timestamp": 1587897100, "idle_time_limit": 1.0, "env": {"SHELL": "/bin/bash", "TERM": "xterm-256color"}}
|
2
|
+
[0.037941, "o", "\u001b(B\u001b[m"]
|
3
|
+
[1.429049, "o", "\u001b[?1034h\u001b]0;~/Developer/sidekiq_lockable_job/demo\u0007\u001b[1m\r\r\n\u001b[38;5;166mhugues\u001b[97m at \u001b[38;5;136mme\u001b[97m in \u001b[38;5;64m~/Developer/sidekiq_lockable_job/demo\u001b[97m on \u001b[38;5;61mmaster\u001b[38;5;33m [?]\r\r\n\u001b[97m$ \u001b(B\u001b[m"]
|
4
|
+
[2.693711, "o", "b"]
|
5
|
+
[2.861477, "o", "i"]
|
6
|
+
[2.909667, "o", "n"]
|
7
|
+
[3.15756, "o", "/"]
|
8
|
+
[4.181652, "o", "r"]
|
9
|
+
[4.229672, "o", "a"]
|
10
|
+
[4.373526, "o", "i"]
|
11
|
+
[4.581437, "o", "l"]
|
12
|
+
[4.669993, "o", "s"]
|
13
|
+
[4.765497, "o", " "]
|
14
|
+
[4.869453, "o", "c"]
|
15
|
+
[4.982059, "o", "o"]
|
16
|
+
[5.133435, "o", "n"]
|
17
|
+
[5.277517, "o", "s"]
|
18
|
+
[5.373362, "o", "o"]
|
19
|
+
[5.549523, "o", "l"]
|
20
|
+
[5.661744, "o", "e"]
|
21
|
+
[6.144158, "o", "\r\n"]
|
22
|
+
[6.372237, "o", "Running via Spring preloader in process 79961\r\n"]
|
23
|
+
[6.462458, "o", "Loading development environment (Rails 5.2.4.2)\r\n"]
|
24
|
+
[6.534371, "o", "2.5.1 :001 > "]
|
25
|
+
[10.866142, "o", "require 'sidekiq/api'"]
|
26
|
+
[11.197897, "o", "\r\n"]
|
27
|
+
[11.213634, "o", " => true \r\n"]
|
28
|
+
[11.214044, "o", "2.5.1 :002 > "]
|
29
|
+
[13.522775, "o", "# enqueuing a worker (which will lock"]
|
30
|
+
[13.710313, "o", " key 123)"]
|
31
|
+
[13.933963, "o", "\r\n"]
|
32
|
+
[13.934892, "o", " => nil \r\n"]
|
33
|
+
[13.935192, "o", "2.5.1 :003 > "]
|
34
|
+
[16.434577, "o", "LockingWorker.perform_async(order: {i"]
|
35
|
+
[16.622436, "o", "d: 123, some_data: {}})"]
|
36
|
+
[16.710056, "o", "\r\n"]
|
37
|
+
[16.721799, "o", " => \"1acd47fe45dd661540527a34\" \r\n"]
|
38
|
+
[16.722121, "o", "2.5.1 :004 > "]
|
39
|
+
[19.818816, "o", "# enqueuing a worker (locked by key 1"]
|
40
|
+
[20.007121, "o", "23)"]
|
41
|
+
[20.040845, "o", "\r\n"]
|
42
|
+
[20.041415, "o", " => nil \r\n"]
|
43
|
+
[20.04179, "o", "2.5.1 :005 > "]
|
44
|
+
[22.538638, "o", "LockedWorker.perform_async(order: {id"]
|
45
|
+
[22.726702, "o", ": 123, some_data: {}})"]
|
46
|
+
[22.845971, "o", "\r\n"]
|
47
|
+
[22.853816, "o", " => \"a06584cb5b431210acb01115\" \r\n"]
|
48
|
+
[22.854692, "o", "2.5.1 :006 > "]
|
49
|
+
[25.546689, "o", "# Job failed and is in retry queue"]
|
50
|
+
[25.766154, "o", "\r\n"]
|
51
|
+
[25.767462, "o", " => nil \r\n"]
|
52
|
+
[25.767944, "o", "2.5.1 :007 > "]
|
53
|
+
[27.954316, "o", "Sidekiq::RetrySet.new.size"]
|
54
|
+
[28.188546, "o", "\r\n"]
|
55
|
+
[28.190567, "o", " => 1 \r\n"]
|
56
|
+
[28.190903, "o", "2.5.1 :008 > "]
|
57
|
+
[30.571693, "o", "Sidekiq::RetrySet.new.map { |job| JSO"]
|
58
|
+
[30.75931, "o", "N.parse(job.value) }"]
|
59
|
+
[32.053652, "o", "\r\n"]
|
60
|
+
[32.058581, "o", " => [{\"class\"=>\"LockedWorker\", \"args\"=>[{\"order\"=>{\"id\"=>123, \"some_data\"=>{}}}], \"retry\"=>true, \"queue\"=>\"default\", \"jid\"=>\"a06584cb5b431210acb01115\", \"created_at\"=>1587897123.6782131, \"enqueued_at\"=>1587897123.6784651, \"error_message\"=>\"Locked by prefix:123\", \"error_class\"=>\"Sidekiq::LockableJob::LockedJobError\", \"failed_at\"=>1587897123.68101, \"retry_count\"=>0}] \r\n"]
|
61
|
+
[32.058966, "o", "2.5.1 :009 > "]
|
62
|
+
[37.106931, "o", "# enqueuing a worker (which will unlo"]
|
63
|
+
[37.294755, "o", "ck key 123)"]
|
64
|
+
[37.405951, "o", "\r\n"]
|
65
|
+
[37.406885, "o", " => nil \r\n"]
|
66
|
+
[37.40748, "o", "2.5.1 :010 > "]
|
67
|
+
[40.314847, "o", "UnlockingWorker.perform_async(order: "]
|
68
|
+
[40.502682, "o", "{id: 123, some_data: {}})"]
|
69
|
+
[40.645814, "o", "\r\n"]
|
70
|
+
[40.661027, "o", " => \"5ec6b9561a009212ee4e5dd5\" \r\n"]
|
71
|
+
[40.661627, "o", "2.5.1 :011 > "]
|
72
|
+
[43.184041, "o", "# will retry after x, but retrying no"]
|
73
|
+
[43.372291, "o", "w"]
|
74
|
+
[43.397571, "o", "\r\n"]
|
75
|
+
[43.398466, "o", " => nil \r\n"]
|
76
|
+
[43.399082, "o", "2.5.1 :012 > "]
|
77
|
+
[45.463978, "o", "Sidekiq::RetrySet.new.each { |job| jo"]
|
78
|
+
[45.652289, "o", "b.retry }"]
|
79
|
+
[45.790045, "o", "\r\n"]
|
80
|
+
[45.796951, "o", " => nil \r\n"]
|
81
|
+
[45.797289, "o", "2.5.1 :013 > "]
|
82
|
+
[48.43503, "o", "# Job succeed (retry queue empty)"]
|
83
|
+
[48.653806, "o", "\r\n"]
|
84
|
+
[48.655128, "o", " => nil \r\n"]
|
85
|
+
[48.655888, "o", "2.5.1 :014 > "]
|
86
|
+
[51.330909, "o", "Sidekiq::RetrySet.new.size"]
|
87
|
+
[51.670463, "o", "\r\n"]
|
88
|
+
[51.674847, "o", " => 0 \r\n"]
|
89
|
+
[51.675462, "o", "2.5.1 :015 > "]
|
90
|
+
[52.878169, "o", "e"]
|
91
|
+
[53.09376, "o", "x"]
|
92
|
+
[53.317689, "o", "i"]
|
93
|
+
[53.469703, "o", "t"]
|
94
|
+
[53.694002, "o", "\r\n"]
|
95
|
+
[53.806103, "o", "\u001b]0;~/Developer/sidekiq_lockable_job/demo\u0007\u001b[1m\r\r\n\u001b[38;5;166mhugues\u001b[97m at \u001b[38;5;136mme\u001b[97m in \u001b[38;5;64m~/Developer/sidekiq_lockable_job/demo\u001b[97m on \u001b[38;5;61mmaster\u001b[38;5;33m [?]\r\r\n\u001b[97m$ \u001b(B\u001b[m"]
|
96
|
+
[54.237871, "o", "e"]
|
97
|
+
[54.453613, "o", "x"]
|
98
|
+
[54.589842, "o", "i"]
|
99
|
+
[54.701678, "o", "t"]
|
100
|
+
[54.895101, "o", "\r\n"]
|
101
|
+
[54.895568, "o", "exit\r\n"]
|
data/lib/sidekiq/lockable_job.rb
CHANGED
@@ -25,8 +25,8 @@ module Sidekiq
|
|
25
25
|
# chain is invoked so we're all good.
|
26
26
|
#
|
27
27
|
Sidekiq.configure_server do |config|
|
28
|
-
unless config.
|
29
|
-
config.
|
28
|
+
unless config.server_middleware.exists? Sidekiq::LockableJob::Middleware::Server::SetLocks
|
29
|
+
config.server_middleware.add Sidekiq::LockableJob::Middleware::Server::SetLocks
|
30
30
|
end
|
31
31
|
unless config.server_middleware.exists? Sidekiq::LockableJob::Middleware::Server::HandleLockedBy
|
32
32
|
config.server_middleware.add Sidekiq::LockableJob::Middleware::Server::HandleLockedBy
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq_lockable_job
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hugues Bernet-Rollande
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-04-
|
11
|
+
date: 2020-04-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sidekiq
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - '='
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: 0.7.0
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: tty-prompt
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 0.19.0
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 0.19.0
|
97
111
|
description: |
|
98
112
|
Sidekiq includes a jobs dependencies mechanism to prevent a job from running before another one when enqueued.
|
99
113
|
|
@@ -118,6 +132,7 @@ files:
|
|
118
132
|
- bin/console
|
119
133
|
- bin/rspec
|
120
134
|
- bin/setup
|
135
|
+
- demo.cast
|
121
136
|
- lib/sidekiq/lockable_job.rb
|
122
137
|
- lib/sidekiq/lockable_job/lock_service.rb
|
123
138
|
- lib/sidekiq/lockable_job/middleware/client/set_locks.rb
|