sidekiq-throttled 0.6.6 → 0.6.7

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: 533d15834069284a6d4a781438724390ae8c185e
4
- data.tar.gz: e7ef6171c7d1d50f4e73ca2d856ada94a861cd93
3
+ metadata.gz: ec534fed2e493758df139b6245cf1f9e657c2e18
4
+ data.tar.gz: 3de82b6c63e63e59a7c14c47683b9a9bff3dd912
5
5
  SHA512:
6
- metadata.gz: eb0e8c60fa207fc0c79b051640ee6d0c4312e91f5b5fe327a48a383ff8c21cc706c57de346c71aa5c750e4b19339da3d700858c26574717a130393d20957ae69
7
- data.tar.gz: 0d4c82ed8ff3e7af23e4adfeec283c40d4fe200de4342fad333b174e8b9f64ae6fb22641c916fea0aed9bc0a4dbe0611936a350ad691c2b360ded39a3769b6c7
6
+ metadata.gz: cb31fced1ceae5050599471b39cbe8eedd7285bab72b77923fc471e4104eb1fdb85b7631622917ce423d3440abf06953123f289ce9d1917d1a33446beb39f3d2
7
+ data.tar.gz: eb34237d9b64bb9c3cc4b6a9d33dc79d439b7990e84a59d63a999361eed857eda4cdf100831fd6e1e1f944d118d7dda504c98980d7bc33aaeafe0c01af3bcefd
data/.rubocop.todo.yml ADDED
@@ -0,0 +1,25 @@
1
+ # need to review if it's possible to slim down methods down to 10 LOCs
2
+ # and if not, either disable this cop inline or bump up limits. in any
3
+ # case once we're clear on max allowed LOCs per method - it should be
4
+ # fixed in rubocop config (as rubocop constantly changing "best practices"
5
+ # according to moon's phase and wind's direction).
6
+ Metrics/MethodLength:
7
+ Exclude:
8
+ - lib/sidekiq/throttled/strategy.rb
9
+ - lib/sidekiq/throttled/queues_pauser.rb
10
+ - lib/sidekiq/throttled/communicator/callbacks.rb
11
+ - lib/sidekiq/throttled/communicator/listener.rb
12
+
13
+ # i have no strong feeling one way or the other, but probably using JSON for
14
+ # serializatino will be a bit more secure indeed.
15
+ Security/MarshalLoad:
16
+ Exclude:
17
+ - lib/sidekiq/throttled/communicator/listener.rb
18
+
19
+ # Enable this cop once we drop Ruby 2.2.x support.
20
+ Style/SafeNavigation:
21
+ Enabled: false
22
+
23
+ # Enable this cop once we drop Ruby 2.2.x support.
24
+ Style/NumericPredicate:
25
+ Enabled: false
data/.rubocop.yml CHANGED
@@ -1,32 +1,35 @@
1
+ inherit_from: .rubocop.todo.yml
2
+
3
+ ################################################################################
4
+
1
5
  AllCops:
2
6
  DisplayCopNames: true
7
+ TargetRubyVersion: 2.4
8
+
9
+ ## Metrics #####################################################################
10
+
11
+ Metrics/BlockLength:
12
+ Exclude:
13
+ - "Guardfile"
14
+ - "spec/**/*"
3
15
 
4
16
  ## Styles ######################################################################
5
17
 
18
+ Style/AlignHash:
19
+ EnforcedHashRocketStyle: table
20
+
6
21
  Style/AlignParameters:
7
22
  EnforcedStyle: with_fixed_indentation
8
23
 
9
24
  Style/BracesAroundHashParameters:
10
25
  Enabled: false
11
26
 
12
- # Broken (2014-12-15). Use `yardstick` gem instead.
13
- # See: https://github.com/bbatsov/rubocop/issues/947
14
- # TODO: Enable back once cop is fixed.
15
27
  Style/Documentation:
16
28
  Enabled: false
17
29
 
18
- Style/EmptyCaseCondition:
19
- Enabled: false
20
-
21
- Style/EmptyLineBetweenDefs:
22
- AllowAdjacentOneLineDefs: true
23
-
24
30
  Style/Encoding:
25
31
  EnforcedStyle: when_needed
26
32
 
27
- Style/FrozenStringLiteralComment:
28
- EnforcedStyle: always
29
-
30
33
  Style/HashSyntax:
31
34
  EnforcedStyle: hash_rockets
32
35
 
@@ -36,48 +39,24 @@ Style/IndentArray:
36
39
  Style/IndentHash:
37
40
  EnforcedStyle: consistent
38
41
 
39
- # New lambda syntax is as ugly to me as new syntax of Hash.
42
+ # Follow your heart where it makes sense to use lambda or lambda literal.
43
+ # Enforcing it makes some pieces of code look REALLY terrible, e.g. in
44
+ # case of empty (noop) lambdas: `lambda { |_| }`.
40
45
  Style/Lambda:
41
46
  Enabled: false
42
47
 
43
- Style/MultilineOperationIndentation:
48
+ Style/MultilineMethodCallIndentation:
44
49
  EnforcedStyle: indented
45
50
 
46
- # IMHO `%r{foo/bar}` looks way more cleaner than `/foo\/bar/`.
47
- # Enabling this cop also makes Guardfile (which is full of pathname regexps)
48
- # look absolutley (style) inconsistent and terrible. Thus it should be on
49
- # developer's choice whenever to user `%r` or not.
51
+ # Enabling this cop makes Guardfile (which is full of pathname regexps)
52
+ # look absolutley style-inconsistent and terrible. In any case, this should
53
+ # be on developer's choice whenever to use `%r` or not. Just like we don't
54
+ # enforce to use `["foo"]` over `%w(foo)` and so on.
50
55
  Style/RegexpLiteral:
51
56
  Enabled: false
52
57
 
53
- # A bit useless restriction, that makes impossible aligning code like this:
54
- #
55
- # redis do |conn|
56
- # conn.hset :k1, now
57
- # conn.hincrby :k2, 123
58
- # end
59
- Style/SpaceBeforeFirstArg:
60
- Enabled: false
58
+ Style/SpaceInLambdaLiteral:
59
+ EnforcedStyle: require_space
61
60
 
62
61
  Style/StringLiterals:
63
62
  EnforcedStyle: double_quotes
64
-
65
- # Not all trivial readers/writers can be defined with attr_* methods
66
- #
67
- # class Example < SimpleDelegator
68
- # def __getobj__
69
- # @obj
70
- # end
71
- #
72
- # def __setobj__(obj)
73
- # @obj = obj
74
- # end
75
- # end
76
- Style/TrivialAccessors:
77
- Enabled: false
78
-
79
- ## Metrics #####################################################################
80
-
81
- Metrics/MethodLength:
82
- CountComments: false
83
- Max: 15
data/.travis.yml CHANGED
@@ -1,27 +1,48 @@
1
1
  language: ruby
2
+ sudo: false
3
+
4
+ services:
5
+ - redis-server
6
+
7
+ cache: bundler
8
+
9
+ before_install:
10
+ - gem update --system
11
+ - gem --version
12
+ - gem install bundler --no-rdoc --no-ri
13
+ - bundle --version
14
+
15
+ install: bundle install --without development
16
+
17
+ env:
18
+ - WITH_REDIS_NAMESPACE="false"
19
+ - WITH_REDIS_NAMESPACE="true"
20
+
2
21
  rvm:
3
- - 2.2.5
4
- - 2.3.1
5
- - ruby-head
6
- - jruby-9.0.5.0
7
- - jruby-head
8
- - rbx-2
22
+ - 2.2.6
23
+ - 2.3.3
24
+ - 2.4.0
25
+
9
26
  matrix:
10
- allow_failures:
11
- - rvm: ruby-head
12
- - rvm: jruby-9.0.5.0
13
- - rvm: jruby-head
14
- - rvm: rbx-2
15
27
  fast_finish: true
28
+ include:
29
+ -
30
+ rvm: 2.4.0
31
+ env: SUITE="rubocop"
32
+ gemfile: Gemfile
33
+ -
34
+ rvm: jruby-9.1.8.0
35
+ env: JRUBY_OPTS="$JRUBY_OPTS --debug" WITH_REDIS_NAMESPACE="false"
36
+ gemfile: Gemfile
37
+ -
38
+ rvm: jruby-9.1.8.0
39
+ env: JRUBY_OPTS="$JRUBY_OPTS --debug" WITH_REDIS_NAMESPACE="true"
40
+ gemfile: Gemfile
41
+ allow_failures:
42
+ -
43
+ rvm: jruby-9.1.8.0
44
+
16
45
  gemfile:
17
46
  - gemfiles/sidekiq_4.0.gemfile
18
47
  - gemfiles/sidekiq_4.1.gemfile
19
- - gemfiles/sidekiq_latest.gemfile
20
- env:
21
- - WITH_REDIS_NAMESPACE=0
22
- - WITH_REDIS_NAMESPACE=1
23
- before_install:
24
- - gem install bundler -v 1.10.6
25
- services:
26
- - redis-server
27
- sudo: false
48
+ - gemfiles/sidekiq_4.2.gemfile
data/Appraisals CHANGED
@@ -6,6 +6,6 @@ appraise "sidekiq-4.1" do
6
6
  gem "sidekiq", "~> 4.1.0"
7
7
  end
8
8
 
9
- appraise "sidekiq-latest" do
10
- gem "sidekiq"
9
+ appraise "sidekiq-4.2" do
10
+ gem "sidekiq", "~> 4.2.0"
11
11
  end
data/CHANGES.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 0.6.7 (2017-03-21)
2
+
3
+ * Fix fetcher causing workers starvation upon low concurrency thresholds.
4
+ ([@ixti])
5
+
6
+
1
7
  ## 0.6.6 (2016-10-16)
2
8
 
3
9
  * [#24](https://github.com/sensortower/sidekiq-throttled/pull/24)
data/Gemfile CHANGED
@@ -4,9 +4,16 @@ source "https://rubygems.org"
4
4
 
5
5
  gem "appraisal"
6
6
  gem "rake"
7
- gem "rspec"
8
- gem "rubocop", "~> 0.42.0", :require => false
9
7
  gem "redis-namespace", :require => false
8
+ gem "rspec"
9
+ gem "rubocop", "~> 0.47.0", :require => false
10
+ gem "sidekiq"
11
+
12
+ group :development do
13
+ gem "guard", :require => false
14
+ gem "guard-rspec", :require => false
15
+ gem "guard-rubocop", :require => false
16
+ end
10
17
 
11
18
  group :test do
12
19
  gem "coveralls", :require => false
data/Guardfile ADDED
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ group :red_green_refactor, :halt_on_fail => true do
4
+ guard :rspec, :cmd => "bundle exec rspec --no-profile" do
5
+ require "guard/rspec/dsl"
6
+ dsl = Guard::RSpec::Dsl.new(self)
7
+
8
+ # Feel free to open issues for suggestions and improvements
9
+
10
+ # RSpec files
11
+ rspec = dsl.rspec
12
+ watch(rspec.spec_helper) { rspec.spec_dir }
13
+ watch(rspec.spec_support) { rspec.spec_dir }
14
+ watch(rspec.spec_files)
15
+
16
+ # Ruby files
17
+ ruby = dsl.ruby
18
+ dsl.watch_spec_files_for(ruby.lib_files)
19
+ end
20
+
21
+ guard :rubocop, :all_on_start => false do
22
+ watch(%r{.+\.rb$})
23
+ watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
24
+ end
25
+ end
data/LICENSE.md CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2015-2016 SensorTower Inc.
3
+ Copyright (c) 2015-2017 SensorTower Inc.
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  [![Gem Version](https://badge.fury.io/rb/sidekiq-throttled.svg)](http://rubygems.org/gems/sidekiq-throttled)
4
4
  [![Build Status](https://travis-ci.org/sensortower/sidekiq-throttled.svg?branch=master)](https://travis-ci.org/sensortower/sidekiq-throttled)
5
5
  [![Code Climate](https://codeclimate.com/github/sensortower/sidekiq-throttled.svg?branch=master)](https://codeclimate.com/github/sensortower/sidekiq-throttled)
6
- [![Coverage Status](https://coveralls.io/repos/sensortower/sidekiq-throttled/badge.svg?branch=master&service=github)](https://coveralls.io/github/sensortower/sidekiq-throttled?branch=master)
6
+ [![Coverage Status](https://coveralls.io/repos/github/sensortower/sidekiq-throttled/badge.svg?branch=master)](https://coveralls.io/github/sensortower/sidekiq-throttled?branch=master)
7
7
  [![API Docs](http://inch-ci.org/github/sensortower/sidekiq-throttled.svg?branch=master)](http://inch-ci.org/github/sensortower/sidekiq-throttled)
8
8
 
9
9
  Concurrency and threshold throttling for [Sidekiq][sidekiq].
@@ -122,8 +122,22 @@ some trouble.
122
122
  This library aims to support and is [tested against][travis] the following Ruby
123
123
  versions:
124
124
 
125
- * Ruby 2.2.x
125
+ * Ruby 2.2.6+
126
126
  * Ruby 2.3.x
127
+ * Ruby 2.4.x
128
+
129
+ If something doesn't work on one of these versions, it's a bug.
130
+
131
+ This library may inadvertently work (or seem to work) on other Ruby versions,
132
+ however support will only be provided for the versions listed above.
133
+
134
+ If you would like this library to support another Ruby version or
135
+ implementation, you may volunteer to be a maintainer. Being a maintainer
136
+ entails making sure all tests run and pass on that implementation. When
137
+ something breaks on your implementation, you will be responsible for providing
138
+ patches in a timely fashion. If critical issues for a particular implementation
139
+ exist at the time of a major release, support for that Ruby version may be
140
+ dropped.
127
141
 
128
142
 
129
143
  ## Supported Sidekiq Versions
@@ -132,6 +146,7 @@ This library aims to support work with following [Sidekiq][sidekiq] versions:
132
146
 
133
147
  * Sidekiq 4.0.x
134
148
  * Sidekiq 4.1.x
149
+ * Sidekiq 4.2.x
135
150
 
136
151
 
137
152
  ## Contributing
@@ -144,9 +159,22 @@ This library aims to support work with following [Sidekiq][sidekiq] versions:
144
159
  * If we've accepted a patch, feel free to ask for commit access!
145
160
 
146
161
 
162
+ ## Development
163
+
164
+ ```
165
+ bundle update
166
+ appraisal install # install dependencies for all gemfiles
167
+ appraisal update # update dependencies for all gemfiles
168
+ appraisal rspec # run rspec against each gemfile
169
+ bundle exec rubocop # run static code analysis
170
+ ```
171
+
172
+ Don't forget to run `appraisal update` after any changes to `Gemfile`.
173
+
174
+
147
175
  ## Copyright
148
176
 
149
- Copyright (c) 2015-2016 SensorTower Inc.
177
+ Copyright (c) 2015-2017 SensorTower Inc.
150
178
  See LICENSE.md for further details.
151
179
 
152
180
 
data/Rakefile CHANGED
@@ -4,7 +4,23 @@ require "bundler/gem_tasks"
4
4
  require "rspec/core/rake_task"
5
5
  RSpec::Core::RakeTask.new(:spec)
6
6
 
7
- require "rubocop/rake_task"
8
- RuboCop::RakeTask.new
7
+ desc "Run RuboCop"
8
+ task :rubocop do
9
+ require "rubocop"
10
+ result = RuboCop::CLI.new.run([])
11
+ abort("RuboCop failed!") if result.nonzero?
12
+ end
9
13
 
10
- task :default => [:spec, :rubocop]
14
+ namespace :rubocop do
15
+ desc "Auto-correct RuboCop offenses"
16
+ task :autocorrect do
17
+ require "rubocop"
18
+ result = RuboCop::CLI.new.run(["--auto-correct"])
19
+ abort("RuboCop failed!") if result.nonzero?
20
+ end
21
+ end
22
+
23
+ default_suite = ENV["CI"] ? :spec : %i(spec rubocop)
24
+ named_suites = { "rubocop" => :rubocop, "rspec" => :spec }
25
+
26
+ task :default => named_suites.fetch(ENV["SUITE"], default_suite)
@@ -4,11 +4,17 @@ source "https://rubygems.org"
4
4
 
5
5
  gem "appraisal"
6
6
  gem "rake"
7
- gem "rspec"
8
- gem "rubocop", "~> 0.42.0", :require => false
9
7
  gem "redis-namespace", :require => false
8
+ gem "rspec"
9
+ gem "rubocop", "~> 0.47.0", :require => false
10
10
  gem "sidekiq", "~> 4.0.0"
11
11
 
12
+ group :development do
13
+ gem "guard", :require => false
14
+ gem "guard-rspec", :require => false
15
+ gem "guard-rubocop", :require => false
16
+ end
17
+
12
18
  group :test do
13
19
  gem "coveralls", :require => false
14
20
  gem "rack-test"
@@ -4,11 +4,17 @@ source "https://rubygems.org"
4
4
 
5
5
  gem "appraisal"
6
6
  gem "rake"
7
- gem "rspec"
8
- gem "rubocop", "~> 0.42.0", :require => false
9
7
  gem "redis-namespace", :require => false
8
+ gem "rspec"
9
+ gem "rubocop", "~> 0.47.0", :require => false
10
10
  gem "sidekiq", "~> 4.1.0"
11
11
 
12
+ group :development do
13
+ gem "guard", :require => false
14
+ gem "guard-rspec", :require => false
15
+ gem "guard-rubocop", :require => false
16
+ end
17
+
12
18
  group :test do
13
19
  gem "coveralls", :require => false
14
20
  gem "rack-test"
@@ -4,10 +4,16 @@ source "https://rubygems.org"
4
4
 
5
5
  gem "appraisal"
6
6
  gem "rake"
7
- gem "rspec"
8
- gem "rubocop", "~> 0.42.0", :require => false
9
7
  gem "redis-namespace", :require => false
10
- gem "sidekiq"
8
+ gem "rspec"
9
+ gem "rubocop", "~> 0.47.0", :require => false
10
+ gem "sidekiq", "~> 4.2.0"
11
+
12
+ group :development do
13
+ gem "guard", :require => false
14
+ gem "guard-rspec", :require => false
15
+ gem "guard-rubocop", :require => false
16
+ end
11
17
 
12
18
  group :test do
13
19
  gem "coveralls", :require => false
@@ -79,8 +79,8 @@ module Sidekiq
79
79
  # @return [Boolean]
80
80
  def throttled?(message)
81
81
  message = JSON.parse message
82
- job = message.fetch("class".freeze) { return false }
83
- jid = message.fetch("jid".freeze) { return false }
82
+ job = message.fetch("class") { return false }
83
+ jid = message.fetch("jid") { return false }
84
84
 
85
85
  Registry.get job do |strategy|
86
86
  return strategy.throttled?(jid, *message["args"])
@@ -30,7 +30,7 @@ module Sidekiq
30
30
  # Redis PUB/SUB channel name
31
31
  #
32
32
  # @see http://redis.io/topics/pubsub
33
- CHANNEL_NAME = "sidekiq:throttled".freeze
33
+ CHANNEL_NAME = "sidekiq:throttled"
34
34
  private_constant :CHANNEL_NAME
35
35
 
36
36
  # Initializes singleton instance.
@@ -61,7 +61,7 @@ module Sidekiq
61
61
  callback.call(payload)
62
62
  rescue => e
63
63
  handle_exception(e, {
64
- :context => "sidekiq:throttled".freeze
64
+ :context => "sidekiq:throttled"
65
65
  })
66
66
  end
67
67
  end
@@ -69,12 +69,12 @@ module Sidekiq
69
69
  @subscribed = false
70
70
  rescue StandardError => e
71
71
  @subscribed = false
72
- handle_exception(e, { :context => "sidekiq:throttled".freeze })
72
+ handle_exception(e, { :context => "sidekiq:throttled" })
73
73
  sleep 1
74
74
  rescue Exception => e # rubocop:disable Lint/RescueException
75
75
  @terminated = true
76
76
  @subscribed = false
77
- handle_exception(e, { :context => "sidekiq:throttled".freeze })
77
+ handle_exception(e, { :context => "sidekiq:throttled" })
78
78
  raise
79
79
  end
80
80
 
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "monitor"
4
+
5
+ module Sidekiq
6
+ module Throttled
7
+ # List that tracks when elements were added and enumerates over those not
8
+ # older than `ttl` seconds ago.
9
+ #
10
+ # ## Implementation
11
+ #
12
+ # Internally list holds an array of arrays. Thus ecah element is a tuple of
13
+ # timestamp (when element was added) and element itself:
14
+ #
15
+ # [
16
+ # [ 1234567890.12345, "default" ],
17
+ # [ 1234567890.34567, "urgent" ],
18
+ # [ 1234579621.56789, "urgent" ],
19
+ # ...
20
+ # ]
21
+ #
22
+ # It does not deduplicates elements. Eviction happens only upon elements
23
+ # retrieval (see {#each}).
24
+ #
25
+ # @private
26
+ class ExpirableList
27
+ include Enumerable
28
+
29
+ # @param ttl [Float] elements time-to-live in seconds
30
+ def initialize(ttl)
31
+ @ttl = ttl.to_f
32
+ @arr = []
33
+ @mon = Monitor.new
34
+ end
35
+
36
+ # Pushes given element into the list.
37
+ #
38
+ # @params element [Object]
39
+ # @return [ExpirableList] self
40
+ def <<(element)
41
+ @mon.synchronize { @arr << [Time.now.to_f, element] }
42
+ self
43
+ end
44
+
45
+ # Evicts expired elements and calls the given block once for each element
46
+ # left, passing that element as a parameter.
47
+ #
48
+ # @yield [element]
49
+ # @return [Enumerator] if no block given
50
+ # @return [ExpirableList] self if block given
51
+ def each
52
+ return to_enum __method__ unless block_given?
53
+
54
+ @mon.synchronize do
55
+ horizon = Time.now.to_f - @ttl
56
+
57
+ # drop all elements older than horizon
58
+ @arr.shift while @arr[0] && @arr[0][0] < horizon
59
+
60
+ @arr.each { |x| yield x[1] }
61
+ end
62
+
63
+ self
64
+ end
65
+ end
66
+ end
67
+ end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "sidekiq"
4
+ require "sidekiq/throttled/expirable_list"
4
5
  require "sidekiq/throttled/fetch/unit_of_work"
5
6
  require "sidekiq/throttled/queues_pauser"
6
7
  require "sidekiq/throttled/queue_name"
@@ -11,11 +12,14 @@ module Sidekiq
11
12
  #
12
13
  # @private
13
14
  class Fetch
15
+ # Timeout to sleep between fetch retries in case of no job received,
16
+ # as well as timeout to wait for redis to give us something to work.
14
17
  TIMEOUT = 2
15
- private_constant :TIMEOUT
16
18
 
17
19
  # Initializes fetcher instance.
18
20
  def initialize(options)
21
+ @paused = ExpirableList.new(TIMEOUT)
22
+
19
23
  @strict = options[:strict]
20
24
  @queues = options[:queues].map { |q| QueueName.expand q }
21
25
 
@@ -33,7 +37,7 @@ module Sidekiq
33
37
  return work unless work.throttled?
34
38
 
35
39
  work.requeue_throttled
36
- sleep TIMEOUT
40
+ @paused << QueueName.expand(work.queue_name)
37
41
 
38
42
  nil
39
43
  end
@@ -78,7 +82,7 @@ module Sidekiq
78
82
  # @param [Array<String>] queues
79
83
  # @return [Array<String>]
80
84
  def filter_queues(queues)
81
- QueuesPauser.instance.filter(queues)
85
+ QueuesPauser.instance.filter(queues) - @paused.to_a
82
86
  end
83
87
  end
84
88
  end
@@ -12,8 +12,8 @@ module Sidekiq
12
12
  def call(_worker, msg, _queue)
13
13
  yield
14
14
  ensure
15
- Registry.get msg["class".freeze] do |strategy|
16
- strategy.finalize!(msg["jid".freeze], *msg["args"])
15
+ Registry.get msg["class"] do |strategy|
16
+ strategy.finalize!(msg["jid"], *msg["args"])
17
17
  end
18
18
  end
19
19
  end
@@ -27,7 +27,7 @@ module Sidekiq
27
27
  # @param [String]
28
28
  # @return [String]
29
29
  def normalize(queue)
30
- queue.sub(QUEUE_NAME_PREFIX_RE, "".freeze)
30
+ queue.sub(QUEUE_NAME_PREFIX_RE, "")
31
31
  end
32
32
 
33
33
  # Prepends `queue:` prefix to given `queue` name.
@@ -38,7 +38,7 @@ module Sidekiq
38
38
  # @param [String] queue Queue name
39
39
  # @return [String]
40
40
  def expand(queue)
41
- "queue:#{queue}".freeze
41
+ "queue:#{queue}"
42
42
  end
43
43
  end
44
44
  end
@@ -19,19 +19,19 @@ module Sidekiq
19
19
  # Redis key of Set with paused queues.
20
20
  #
21
21
  # @return [String]
22
- PAUSED_QUEUES = "throttled:X:paused_queues".freeze
22
+ PAUSED_QUEUES = "throttled:X:paused_queues"
23
23
  private_constant :PAUSED_QUEUES
24
24
 
25
25
  # {Communicator} message used to notify that queue needs to be paused.
26
26
  #
27
27
  # @return [String]
28
- PAUSE_MESSAGE = "pause".freeze
28
+ PAUSE_MESSAGE = "pause"
29
29
  private_constant :PAUSE_MESSAGE
30
30
 
31
31
  # {Communicator} message used to notify that queue needs to be resumed.
32
32
  #
33
33
  # @return [String]
34
- RESUME_MESSAGE = "resume".freeze
34
+ RESUME_MESSAGE = "resume"
35
35
  private_constant :RESUME_MESSAGE
36
36
 
37
37
  # Initializes singleton instance.
@@ -23,7 +23,7 @@ module Sidekiq
23
23
  # @param [#to_i] ttl Concurrency lock TTL in seconds.
24
24
  # @param [Proc] key_suffix Dynamic key suffix generator.
25
25
  def initialize(strategy_key, limit:, ttl: 900, key_suffix: nil)
26
- @base_key = "#{strategy_key}:concurrency".freeze
26
+ @base_key = "#{strategy_key}:concurrency"
27
27
  @limit = limit
28
28
  @ttl = ttl.to_i
29
29
  @key_suffix = key_suffix
@@ -15,11 +15,11 @@ module Sidekiq
15
15
  # @private
16
16
  class Script
17
17
  # Script load command
18
- LOAD = "load".freeze
18
+ LOAD = "load"
19
19
  private_constant :LOAD
20
20
 
21
21
  # Redis error fired when script ID is unkown
22
- NOSCRIPT = "NOSCRIPT".freeze
22
+ NOSCRIPT = "NOSCRIPT"
23
23
  private_constant :NOSCRIPT
24
24
 
25
25
  # LUA script source.
@@ -48,8 +48,7 @@ module Sidekiq
48
48
  # changed in redis, which is not likely gonna happen.
49
49
  unless @digest == digest
50
50
  if @logger
51
- @logger.warn \
52
- "Unexpected script SHA1 digest: " \
51
+ @logger.warn "Unexpected script SHA1 digest: " \
53
52
  "#{digest.inspect} (expected: #{@digest.inspect})"
54
53
  end
55
54
 
@@ -35,7 +35,7 @@ module Sidekiq
35
35
  # @param [#to_f, #call] :period Period in seconds.
36
36
  # @param [Proc] key_suffix Dynamic key suffix generator.
37
37
  def initialize(strategy_key, limit:, period:, key_suffix: nil)
38
- @base_key = "#{strategy_key}:threshold".freeze
38
+ @base_key = "#{strategy_key}:threshold"
39
39
  @limit = limit
40
40
  @period = period
41
41
  @key_suffix = key_suffix
@@ -3,6 +3,6 @@
3
3
  module Sidekiq
4
4
  module Throttled
5
5
  # Gem version
6
- VERSION = "0.6.6".freeze
6
+ VERSION = "0.6.7"
7
7
  end
8
8
  end
@@ -37,10 +37,9 @@ module Sidekiq
37
37
  # @return [String]
38
38
  def colorize_count(int, max)
39
39
  percentile = 100.00 * int / max
40
- lvl = case
41
- when 80 <= percentile then "danger"
42
- when 60 <= percentile then "warning"
43
- else "success"
40
+ lvl = if 80 <= percentile then "danger"
41
+ elsif 60 <= percentile then "warning"
42
+ else "success"
44
43
  end
45
44
 
46
45
  %(<span class="label label-#{lvl}">#{int}</span>)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-throttled
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.6
4
+ version: 0.6.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexey V Zapparov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-10-16 00:00:00.000000000 Z
11
+ date: 2017-03-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sidekiq
@@ -48,23 +48,26 @@ files:
48
48
  - ".coveralls.yml"
49
49
  - ".gitignore"
50
50
  - ".rspec"
51
+ - ".rubocop.todo.yml"
51
52
  - ".rubocop.yml"
52
53
  - ".travis.yml"
53
54
  - ".yardopts"
54
55
  - Appraisals
55
56
  - CHANGES.md
56
57
  - Gemfile
58
+ - Guardfile
57
59
  - LICENSE.md
58
60
  - README.md
59
61
  - Rakefile
60
62
  - gemfiles/sidekiq_4.0.gemfile
61
63
  - gemfiles/sidekiq_4.1.gemfile
62
- - gemfiles/sidekiq_latest.gemfile
64
+ - gemfiles/sidekiq_4.2.gemfile
63
65
  - lib/sidekiq/throttled.rb
64
66
  - lib/sidekiq/throttled/communicator.rb
65
67
  - lib/sidekiq/throttled/communicator/callbacks.rb
66
68
  - lib/sidekiq/throttled/communicator/listener.rb
67
69
  - lib/sidekiq/throttled/errors.rb
70
+ - lib/sidekiq/throttled/expirable_list.rb
68
71
  - lib/sidekiq/throttled/fetch.rb
69
72
  - lib/sidekiq/throttled/fetch/unit_of_work.rb
70
73
  - lib/sidekiq/throttled/middleware.rb
@@ -104,7 +107,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
104
107
  version: '0'
105
108
  requirements: []
106
109
  rubyforge_project:
107
- rubygems_version: 2.5.1
110
+ rubygems_version: 2.4.5.2
108
111
  signing_key:
109
112
  specification_version: 4
110
113
  summary: Concurrency and threshold throttling for Sidekiq.