sidekiq-limit_fetch 2.1.2 → 2.1.3
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/README.md +3 -1
- data/demo/README.md +1 -1
- data/lib/sidekiq/extensions/queue.rb +2 -1
- data/lib/sidekiq/limit_fetch/global/monitor.rb +22 -15
- data/lib/sidekiq/limit_fetch/global/semaphore.rb +40 -0
- data/sidekiq-limit_fetch.gemspec +2 -1
- metadata +17 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d460d8048f5d1ef64e257f8af49ec1b7274eb966
|
4
|
+
data.tar.gz: 97b99fee5c035683ab9a8658d263190e0c5b2abd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ebe51888c40335c3a8328536f5c3b57351bc856527c1b0acbb2f9e7818c70d911a3334735e123140b5aea04cce7571b564e8a4b74cc27725139337f1290c7169
|
7
|
+
data.tar.gz: b3e054be32248f8200615dc8c3b06e4f6d02c2e209eae5676fd8da44693b508f81c3ff3cf6add2a39a179fe18e963f8dda21136be5a6a9e59b846eefec8bcbb1
|
data/README.md
CHANGED
@@ -21,9 +21,11 @@ redis 2.6 or newer
|
|
21
21
|
```
|
22
22
|
heroku uses redis 2.4 by default
|
23
23
|
to update version you need to contact their support:
|
24
|
-
https://devcenter.heroku.com/articles/redistogo#redis-
|
24
|
+
https://devcenter.heroku.com/articles/redistogo#redis-2-6
|
25
25
|
```
|
26
26
|
|
27
|
+
**Important note:** At this moment, `sidekiq-limit_fetch` is incompatible with Sidekiq Pro's `reliable_fetch`.
|
28
|
+
|
27
29
|
## Usage
|
28
30
|
|
29
31
|
### Limits
|
data/demo/README.md
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
To test effect of limits run: `rake demo:limits`
|
2
|
-
To change simulation see `
|
2
|
+
To change simulation see `Rakefile`
|
@@ -1,5 +1,6 @@
|
|
1
1
|
module Sidekiq::LimitFetch::Global
|
2
2
|
module Monitor
|
3
|
+
include Sidekiq::LimitFetch::Redis
|
3
4
|
extend self
|
4
5
|
|
5
6
|
HEARTBEAT_PREFIX = 'heartbeat:'
|
@@ -17,13 +18,29 @@ module Sidekiq::LimitFetch::Global
|
|
17
18
|
end
|
18
19
|
end
|
19
20
|
|
21
|
+
def all_processes
|
22
|
+
redis {|it| it.smembers PROCESS_SET }
|
23
|
+
end
|
24
|
+
|
25
|
+
def old_processes
|
26
|
+
all_processes.reject do |process|
|
27
|
+
redis {|it| it.get heartbeat_key process }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def remove_old_processes!
|
32
|
+
redis do |it|
|
33
|
+
old_processes.each {|process| it.srem PROCESS_SET, process }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
20
37
|
private
|
21
38
|
|
22
39
|
def update_heartbeat(ttl)
|
23
40
|
Sidekiq.redis do |it|
|
24
41
|
it.pipelined do
|
25
|
-
it.sadd PROCESS_SET, Selector.uuid
|
26
42
|
it.set heartbeat_key, true
|
43
|
+
it.sadd PROCESS_SET, Selector.uuid
|
27
44
|
it.expire heartbeat_key, ttl
|
28
45
|
end
|
29
46
|
end
|
@@ -31,21 +48,11 @@ module Sidekiq::LimitFetch::Global
|
|
31
48
|
|
32
49
|
def invalidate_old_processes
|
33
50
|
Sidekiq.redis do |it|
|
34
|
-
|
35
|
-
processes
|
36
|
-
unless it.get heartbeat_key process
|
37
|
-
processes.delete process
|
38
|
-
it.srem PROCESS_SET, process
|
39
|
-
end
|
40
|
-
end
|
51
|
+
remove_old_processes!
|
52
|
+
processes = all_processes
|
41
53
|
|
42
|
-
Sidekiq::Queue.instances.
|
43
|
-
|
44
|
-
(locks.uniq - processes).each do |dead_process|
|
45
|
-
%w(limit_fetch:probed: limit_fetch:busy:).each do |prefix|
|
46
|
-
it.lrem prefix + queue, 0, dead_process
|
47
|
-
end
|
48
|
-
end
|
54
|
+
Sidekiq::Queue.instances.each do |queue|
|
55
|
+
queue.remove_locks_except! processes
|
49
56
|
end
|
50
57
|
end
|
51
58
|
end
|
@@ -42,6 +42,10 @@ module Sidekiq::LimitFetch::Global
|
|
42
42
|
redis {|it| it.llen "#{PREFIX}:busy:#@name" }
|
43
43
|
end
|
44
44
|
|
45
|
+
def busy_processes
|
46
|
+
redis {|it| it.lrange "#{PREFIX}:busy:#@name", 0, -1 }
|
47
|
+
end
|
48
|
+
|
45
49
|
def increase_busy
|
46
50
|
increase_local_busy
|
47
51
|
redis {|it| it.rpush "#{PREFIX}:busy:#@name", Selector.uuid }
|
@@ -56,6 +60,10 @@ module Sidekiq::LimitFetch::Global
|
|
56
60
|
redis {|it| it.llen "#{PREFIX}:probed:#@name" }
|
57
61
|
end
|
58
62
|
|
63
|
+
def probed_processes
|
64
|
+
redis {|it| it.lrange "#{PREFIX}:probed:#@name", 0, -1 }
|
65
|
+
end
|
66
|
+
|
59
67
|
def pause
|
60
68
|
redis {|it| it.set "#{PREFIX}:pause:#@name", true }
|
61
69
|
end
|
@@ -96,5 +104,37 @@ module Sidekiq::LimitFetch::Global
|
|
96
104
|
def local_busy?
|
97
105
|
@local_busy > 0
|
98
106
|
end
|
107
|
+
|
108
|
+
def explain
|
109
|
+
<<-END.gsub(/^ {8}/, '')
|
110
|
+
Current sidekiq process: #{Selector.uuid}
|
111
|
+
|
112
|
+
All processes:
|
113
|
+
#{Monitor.all_processes.join "\n"}
|
114
|
+
|
115
|
+
Stale processes:
|
116
|
+
#{Monitor.old_processes.join "\n"}
|
117
|
+
|
118
|
+
Locked queue processes:
|
119
|
+
#{probed_processes.sort.join "\n"}
|
120
|
+
|
121
|
+
Busy queue processes:
|
122
|
+
#{busy_processes.sort.join "\n"}
|
123
|
+
END
|
124
|
+
end
|
125
|
+
|
126
|
+
def remove_locks_except!(processes)
|
127
|
+
locked_processes = probed_processes.uniq
|
128
|
+
(locked_processes - processes).each do |dead_process|
|
129
|
+
remove_lock! dead_process
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def remove_lock!(process)
|
134
|
+
redis do |it|
|
135
|
+
it.lrem "#{PREFIX}:probed:#@name", 0, process
|
136
|
+
it.lrem "#{PREFIX}:busy:#@name", 0, process
|
137
|
+
end
|
138
|
+
end
|
99
139
|
end
|
100
140
|
end
|
data/sidekiq-limit_fetch.gemspec
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |gem|
|
2
2
|
gem.name = 'sidekiq-limit_fetch'
|
3
|
-
gem.version = '2.1.
|
3
|
+
gem.version = '2.1.3'
|
4
|
+
gem.license = 'MIT'
|
4
5
|
gem.authors = 'brainopia'
|
5
6
|
gem.email = 'brainopia@evilmartians.com'
|
6
7
|
gem.summary = 'Sidekiq strategy to support queue limits'
|
metadata
CHANGED
@@ -1,61 +1,61 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-limit_fetch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- brainopia
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-02-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sidekiq
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 2.6.5
|
20
|
-
- - <
|
20
|
+
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
22
|
version: '3'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
|
-
- -
|
27
|
+
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: 2.6.5
|
30
|
-
- - <
|
30
|
+
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '3'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: rspec
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
36
36
|
requirements:
|
37
|
-
- -
|
37
|
+
- - ">="
|
38
38
|
- !ruby/object:Gem::Version
|
39
39
|
version: '0'
|
40
40
|
type: :development
|
41
41
|
prerelease: false
|
42
42
|
version_requirements: !ruby/object:Gem::Requirement
|
43
43
|
requirements:
|
44
|
-
- -
|
44
|
+
- - ">="
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: '0'
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rake
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
50
50
|
requirements:
|
51
|
-
- -
|
51
|
+
- - ">="
|
52
52
|
- !ruby/object:Gem::Version
|
53
53
|
version: '0'
|
54
54
|
type: :development
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
57
|
requirements:
|
58
|
-
- -
|
58
|
+
- - ">="
|
59
59
|
- !ruby/object:Gem::Version
|
60
60
|
version: '0'
|
61
61
|
description: |2
|
@@ -66,8 +66,8 @@ executables: []
|
|
66
66
|
extensions: []
|
67
67
|
extra_rdoc_files: []
|
68
68
|
files:
|
69
|
-
- .gitignore
|
70
|
-
- .travis.yml
|
69
|
+
- ".gitignore"
|
70
|
+
- ".travis.yml"
|
71
71
|
- Gemfile
|
72
72
|
- LICENSE.txt
|
73
73
|
- README.md
|
@@ -100,7 +100,8 @@ files:
|
|
100
100
|
- spec/sidekiq/limit_fetch_spec.rb
|
101
101
|
- spec/spec_helper.rb
|
102
102
|
homepage: https://github.com/brainopia/sidekiq-limit_fetch
|
103
|
-
licenses:
|
103
|
+
licenses:
|
104
|
+
- MIT
|
104
105
|
metadata: {}
|
105
106
|
post_install_message:
|
106
107
|
rdoc_options: []
|
@@ -108,17 +109,17 @@ require_paths:
|
|
108
109
|
- lib
|
109
110
|
required_ruby_version: !ruby/object:Gem::Requirement
|
110
111
|
requirements:
|
111
|
-
- -
|
112
|
+
- - ">="
|
112
113
|
- !ruby/object:Gem::Version
|
113
114
|
version: '0'
|
114
115
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
115
116
|
requirements:
|
116
|
-
- -
|
117
|
+
- - ">="
|
117
118
|
- !ruby/object:Gem::Version
|
118
119
|
version: '0'
|
119
120
|
requirements: []
|
120
121
|
rubyforge_project:
|
121
|
-
rubygems_version: 2.
|
122
|
+
rubygems_version: 2.2.1
|
122
123
|
signing_key:
|
123
124
|
specification_version: 4
|
124
125
|
summary: Sidekiq strategy to support queue limits
|
@@ -129,4 +130,3 @@ test_files:
|
|
129
130
|
- spec/sidekiq/limit_fetch/semaphore_spec.rb
|
130
131
|
- spec/sidekiq/limit_fetch_spec.rb
|
131
132
|
- spec/spec_helper.rb
|
132
|
-
has_rdoc:
|