sidekiq-limit_fetch 2.1.2 → 2.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e0a7907ad1ad1e09f8c873c8131ae4f3fa7625b6
4
- data.tar.gz: 24fa5bd726c2a6ca724cc55775b361bb98a5b818
3
+ metadata.gz: d460d8048f5d1ef64e257f8af49ec1b7274eb966
4
+ data.tar.gz: 97b99fee5c035683ab9a8658d263190e0c5b2abd
5
5
  SHA512:
6
- metadata.gz: 7c7f3d96c4e0eafb5c22db40913f6e52b8ca674688d3f7d2a11c20318a06c4752c485c7268e7d643b18817a024e61b2bf3da2ccb8d84833c9a09b3042b06b937
7
- data.tar.gz: 822d2ec33178bbcbbb620c8b699f2429a74c53ed5e66bb3eaa90811badb827f7862176361b59ecab1b584b63baede9e4f290080d9bc36f6227fe3dc29952c621
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-26
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 `lib/tasks/demo.rake`
2
+ To change simulation see `Rakefile`
@@ -13,7 +13,8 @@ module Sidekiq
13
13
  :unblocked, :block_except,
14
14
  :probed, :busy,
15
15
  :increase_busy, :decrease_busy,
16
- :local_busy?
16
+ :local_busy?, :explain,
17
+ :remove_locks_except!
17
18
 
18
19
  def lock
19
20
  @lock ||= LimitFetch::Global::Semaphore.new name
@@ -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
- processes = it.smembers PROCESS_SET
35
- processes.each do |process|
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.map(&:name).uniq.each do |queue|
43
- locks = it.lrange "limit_fetch:probed:#{queue}", 0, -1
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
@@ -1,6 +1,7 @@
1
1
  Gem::Specification.new do |gem|
2
2
  gem.name = 'sidekiq-limit_fetch'
3
- gem.version = '2.1.2'
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.2
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: 2013-10-04 00:00:00.000000000 Z
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.0.3
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: