sidekiq_lockable_job 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![asciicast](https://asciinema.org/a/324095.svg)](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
|