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 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: