sidekiq-unique-jobs 7.0.0.beta25 → 7.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of sidekiq-unique-jobs might be problematic. Click here for more details.

Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +99 -15
  3. data/README.md +192 -55
  4. data/lib/sidekiq-unique-jobs.rb +0 -2
  5. data/lib/sidekiq_unique_jobs/batch_delete.rb +1 -1
  6. data/lib/sidekiq_unique_jobs/changelog.rb +2 -2
  7. data/lib/sidekiq_unique_jobs/cli.rb +1 -1
  8. data/lib/sidekiq_unique_jobs/config.rb +2 -2
  9. data/lib/sidekiq_unique_jobs/connection.rb +1 -1
  10. data/lib/sidekiq_unique_jobs/constants.rb +5 -1
  11. data/lib/sidekiq_unique_jobs/digests.rb +2 -2
  12. data/lib/sidekiq_unique_jobs/exceptions.rb +9 -9
  13. data/lib/sidekiq_unique_jobs/job.rb +2 -2
  14. data/lib/sidekiq_unique_jobs/json.rb +1 -1
  15. data/lib/sidekiq_unique_jobs/key.rb +1 -1
  16. data/lib/sidekiq_unique_jobs/lock.rb +1 -1
  17. data/lib/sidekiq_unique_jobs/lock/base_lock.rb +1 -1
  18. data/lib/sidekiq_unique_jobs/lock/client_validator.rb +1 -1
  19. data/lib/sidekiq_unique_jobs/lock/server_validator.rb +1 -1
  20. data/lib/sidekiq_unique_jobs/lock/until_and_while_executing.rb +1 -1
  21. data/lib/sidekiq_unique_jobs/lock/until_executed.rb +1 -1
  22. data/lib/sidekiq_unique_jobs/lock/until_executing.rb +1 -1
  23. data/lib/sidekiq_unique_jobs/lock/until_expired.rb +1 -1
  24. data/lib/sidekiq_unique_jobs/lock/validator.rb +3 -2
  25. data/lib/sidekiq_unique_jobs/lock/while_executing.rb +2 -2
  26. data/lib/sidekiq_unique_jobs/lock/while_executing_reject.rb +1 -1
  27. data/lib/sidekiq_unique_jobs/lock_args.rb +5 -5
  28. data/lib/sidekiq_unique_jobs/lock_config.rb +3 -1
  29. data/lib/sidekiq_unique_jobs/lock_digest.rb +1 -1
  30. data/lib/sidekiq_unique_jobs/lock_info.rb +1 -1
  31. data/lib/sidekiq_unique_jobs/lock_timeout.rb +1 -1
  32. data/lib/sidekiq_unique_jobs/lock_ttl.rb +1 -1
  33. data/lib/sidekiq_unique_jobs/locksmith.rb +2 -2
  34. data/lib/sidekiq_unique_jobs/logging.rb +1 -1
  35. data/lib/sidekiq_unique_jobs/logging/middleware_context.rb +2 -2
  36. data/lib/sidekiq_unique_jobs/lua/delete_by_digest.lua +1 -1
  37. data/lib/sidekiq_unique_jobs/lua/lock.lua +1 -2
  38. data/lib/sidekiq_unique_jobs/lua/reap_orphans.lua +8 -7
  39. data/lib/sidekiq_unique_jobs/lua/shared/_find_digest_in_process_set.lua +9 -2
  40. data/lib/sidekiq_unique_jobs/middleware.rb +1 -58
  41. data/lib/sidekiq_unique_jobs/middleware/client.rb +1 -1
  42. data/lib/sidekiq_unique_jobs/middleware/server.rb +1 -1
  43. data/lib/sidekiq_unique_jobs/normalizer.rb +1 -1
  44. data/lib/sidekiq_unique_jobs/on_conflict.rb +1 -1
  45. data/lib/sidekiq_unique_jobs/on_conflict/log.rb +1 -1
  46. data/lib/sidekiq_unique_jobs/on_conflict/null_strategy.rb +1 -1
  47. data/lib/sidekiq_unique_jobs/on_conflict/raise.rb +1 -1
  48. data/lib/sidekiq_unique_jobs/on_conflict/reject.rb +1 -1
  49. data/lib/sidekiq_unique_jobs/on_conflict/replace.rb +10 -9
  50. data/lib/sidekiq_unique_jobs/on_conflict/reschedule.rb +2 -2
  51. data/lib/sidekiq_unique_jobs/on_conflict/strategy.rb +1 -1
  52. data/lib/sidekiq_unique_jobs/options_with_fallback.rb +1 -1
  53. data/lib/sidekiq_unique_jobs/orphans/lua_reaper.rb +2 -2
  54. data/lib/sidekiq_unique_jobs/orphans/manager.rb +41 -5
  55. data/lib/sidekiq_unique_jobs/orphans/null_reaper.rb +24 -0
  56. data/lib/sidekiq_unique_jobs/orphans/observer.rb +2 -2
  57. data/lib/sidekiq_unique_jobs/orphans/reaper.rb +15 -1
  58. data/lib/sidekiq_unique_jobs/orphans/ruby_reaper.rb +10 -3
  59. data/lib/sidekiq_unique_jobs/redis.rb +1 -1
  60. data/lib/sidekiq_unique_jobs/redis/entity.rb +10 -4
  61. data/lib/sidekiq_unique_jobs/redis/hash.rb +1 -1
  62. data/lib/sidekiq_unique_jobs/redis/list.rb +1 -1
  63. data/lib/sidekiq_unique_jobs/redis/set.rb +1 -1
  64. data/lib/sidekiq_unique_jobs/redis/sorted_set.rb +1 -1
  65. data/lib/sidekiq_unique_jobs/redis/string.rb +1 -1
  66. data/lib/sidekiq_unique_jobs/rspec/matchers.rb +2 -2
  67. data/lib/sidekiq_unique_jobs/rspec/matchers/have_valid_sidekiq_options.rb +2 -2
  68. data/lib/sidekiq_unique_jobs/script.rb +1 -1
  69. data/lib/sidekiq_unique_jobs/script/caller.rb +2 -2
  70. data/lib/sidekiq_unique_jobs/sidekiq_unique_ext.rb +5 -5
  71. data/lib/sidekiq_unique_jobs/sidekiq_unique_jobs.rb +2 -2
  72. data/lib/sidekiq_unique_jobs/sidekiq_worker_methods.rb +2 -2
  73. data/lib/sidekiq_unique_jobs/testing.rb +2 -1
  74. data/lib/sidekiq_unique_jobs/timing.rb +1 -1
  75. data/lib/sidekiq_unique_jobs/unlockable.rb +1 -1
  76. data/lib/sidekiq_unique_jobs/update_version.rb +1 -1
  77. data/lib/sidekiq_unique_jobs/upgrade_locks.rb +1 -1
  78. data/lib/sidekiq_unique_jobs/version.rb +1 -1
  79. data/lib/sidekiq_unique_jobs/version_check.rb +1 -1
  80. data/lib/sidekiq_unique_jobs/web.rb +8 -9
  81. data/lib/sidekiq_unique_jobs/web/helpers.rb +1 -1
  82. metadata +26 -11
  83. data/lib/sidekiq_unique_jobs/profiler.rb +0 -55
@@ -3,7 +3,7 @@
3
3
  module SidekiqUniqueJobs
4
4
  # Calculates timeout and expiration
5
5
  #
6
- # @author Mikael Henriksson <mikael@zoolutions.se>
6
+ # @author Mikael Henriksson <mikael@mhenrixon.com>
7
7
  class LockTTL
8
8
  # includes "SidekiqUniqueJobs::SidekiqWorkerMethods"
9
9
  # @!parse include SidekiqUniqueJobs::SidekiqWorkerMethods
@@ -3,7 +3,7 @@
3
3
  module SidekiqUniqueJobs
4
4
  # Lock manager class that handles all the various locks
5
5
  #
6
- # @author Mikael Henriksson <mikael@zoolutions.se>
6
+ # @author Mikael Henriksson <mikael@mhenrixon.com>
7
7
  class Locksmith # rubocop:disable Metrics/ClassLength
8
8
  # includes "SidekiqUniqueJobs::Connection"
9
9
  # @!parse include SidekiqUniqueJobs::Connection
@@ -87,7 +87,7 @@ module SidekiqUniqueJobs
87
87
  #
88
88
  def lock(&block)
89
89
  redis(redis_pool) do |conn|
90
- return lock_async(conn, &block) if block_given?
90
+ return lock_async(conn, &block) if block
91
91
 
92
92
  lock_sync(conn) do
93
93
  return job_id
@@ -3,7 +3,7 @@
3
3
  module SidekiqUniqueJobs
4
4
  # Utility module for reducing the number of uses of logger.
5
5
  #
6
- # @author Mikael Henriksson <mikael@zoolutions.se>
6
+ # @author Mikael Henriksson <mikael@mhenrixon.com>
7
7
  module Logging
8
8
  def self.included(base)
9
9
  base.send(:extend, self)
@@ -4,13 +4,13 @@ module SidekiqUniqueJobs
4
4
  #
5
5
  # Provides the sidekiq middleware that makes the gem work
6
6
  #
7
- # @author Mikael Henriksson <mikael@zoolutions.se>
7
+ # @author Mikael Henriksson <mikael@mhenrixon.com>
8
8
  #
9
9
  module Logging
10
10
  #
11
11
  # Context aware logging for Sidekiq Middlewares
12
12
  #
13
- # @author Mikael Henriksson <mikael@zoolutions.se>
13
+ # @author Mikael Henriksson <mikael@mhenrixon.com>
14
14
  #
15
15
  module Middleware
16
16
  include Logging
@@ -25,7 +25,7 @@ local redisversion = tostring(ARGV[5])
25
25
  -------- BEGIN delete_by_digest.lua --------
26
26
  local counter = 0
27
27
  local redis_version = toversion(redisversion)
28
- local del_cmd = "DEL"
28
+ local del_cmd = "DEL"
29
29
 
30
30
  log_debug("BEGIN delete_by_digest:", digest)
31
31
 
@@ -69,8 +69,7 @@ redis.call("LREM", queued, -1, job_id)
69
69
  log_debug("LREM", primed, 1, job_id)
70
70
  redis.call("LREM", primed, 1, job_id)
71
71
 
72
- -- The Sidekiq client should only set pttl for until_expired
73
- -- The Sidekiq server should set pttl for all other jobs
72
+ -- The Sidekiq client sets pttl
74
73
  if pttl and pttl > 0 then
75
74
  log_debug("PEXPIRE", digest, pttl)
76
75
  redis.call("PEXPIRE", digest, pttl)
@@ -7,15 +7,16 @@ local retry_set = KEYS[3]
7
7
  -------- END keys ---------
8
8
 
9
9
  -------- BEGIN argv ---------
10
- local reaper_count = tonumber(ARGV[1])
10
+ local reaper_count = tonumber(ARGV[1])
11
+ local threshold = tonumber(ARGV[2])
11
12
  -------- END argv ---------
12
13
 
13
14
  -------- BEGIN injected arguments --------
14
- local current_time = tonumber(ARGV[2])
15
- local debug_lua = ARGV[3] == "true"
16
- local max_history = tonumber(ARGV[4])
17
- local script_name = ARGV[5] .. ".lua"
18
- local redisversion = ARGV[6]
15
+ local current_time = tonumber(ARGV[3])
16
+ local debug_lua = ARGV[4] == "true"
17
+ local max_history = tonumber(ARGV[5])
18
+ local script_name = ARGV[6] .. ".lua"
19
+ local redisversion = ARGV[7]
19
20
  --------- END injected arguments ---------
20
21
 
21
22
 
@@ -65,7 +66,7 @@ repeat
65
66
  -- TODO: Add check for jobs checked out by process
66
67
  if found ~= true then
67
68
  log_debug("Searching for digest:", digest, "in process sets")
68
- found = find_digest_in_process_set(digest)
69
+ found = find_digest_in_process_set(digest, threshold)
69
70
  end
70
71
 
71
72
  if found ~= true then
@@ -1,4 +1,4 @@
1
- local function find_digest_in_process_set(digest)
1
+ local function find_digest_in_process_set(digest, threshold)
2
2
  local process_cursor = 0
3
3
  local job_cursor = 0
4
4
  local pattern = "*" .. digest .. "*"
@@ -26,11 +26,18 @@ local function find_digest_in_process_set(digest)
26
26
  log_debug("No entries in:", workers_key)
27
27
  else
28
28
  for i = 1, #jobs, 2 do
29
- if string.find(jobs[i +1], digest) then
29
+ local jobstr = jobs[i +1]
30
+ if string.find(jobstr, digest) then
30
31
  log_debug("Found digest", digest, "in:", workers_key)
31
32
  found = true
32
33
  break
33
34
  end
35
+
36
+ local job = cjson.decode(jobstr)
37
+ if job.created_at > threshold then
38
+ found = true
39
+ break
40
+ end
34
41
  end
35
42
  end
36
43
 
@@ -4,70 +4,13 @@ module SidekiqUniqueJobs
4
4
  #
5
5
  # Provides the sidekiq middleware that makes the gem work
6
6
  #
7
- # @author Mikael Henriksson <mikael@zoolutions.se>
7
+ # @author Mikael Henriksson <mikael@mhenrixon.com>
8
8
  #
9
9
  module Middleware
10
10
  include SidekiqUniqueJobs::Logging::Middleware
11
11
  include SidekiqUniqueJobs::OptionsWithFallback
12
12
  include SidekiqUniqueJobs::JSON
13
13
 
14
- #
15
- # Configure both server and client
16
- #
17
- def self.configure
18
- configure_server
19
- configure_client
20
- end
21
-
22
- #
23
- # Configures the Sidekiq server
24
- #
25
- def self.configure_server # rubocop:disable Metrics/MethodLength
26
- Sidekiq.configure_server do |config|
27
- config.client_middleware do |chain|
28
- if defined?(Apartment::Sidekiq::Middleware::Client)
29
- chain.insert_after Apartment::Sidekiq::Middleware::Client, SidekiqUniqueJobs::Middleware::Client
30
- else
31
- chain.add SidekiqUniqueJobs::Middleware::Client
32
- end
33
- end
34
-
35
- config.server_middleware do |chain|
36
- if defined?(Apartment::Sidekiq::Middleware::Server)
37
- chain.insert_after Apartment::Sidekiq::Middleware::Server, SidekiqUniqueJobs::Middleware::Server
38
- else
39
- chain.add SidekiqUniqueJobs::Middleware::Server
40
- end
41
- end
42
-
43
- config.on(:startup) do
44
- SidekiqUniqueJobs::UpdateVersion.call
45
- SidekiqUniqueJobs::UpgradeLocks.call
46
-
47
- SidekiqUniqueJobs::Orphans::Manager.start
48
- end
49
-
50
- config.on(:shutdown) do
51
- SidekiqUniqueJobs::Orphans::Manager.stop
52
- end
53
- end
54
- end
55
-
56
- #
57
- # Configures the Sidekiq client
58
- #
59
- def self.configure_client
60
- Sidekiq.configure_client do |config|
61
- config.client_middleware do |chain|
62
- if defined?(Apartment::Sidekiq::Middleware::Client)
63
- chain.insert_after Apartment::Sidekiq::Middleware::Client, SidekiqUniqueJobs::Middleware::Client
64
- else
65
- chain.add SidekiqUniqueJobs::Middleware::Client
66
- end
67
- end
68
- end
69
- end
70
-
71
14
  # The sidekiq job hash
72
15
  # @return [Hash] the Sidekiq job hash
73
16
  attr_reader :item
@@ -4,7 +4,7 @@ module SidekiqUniqueJobs
4
4
  module Middleware
5
5
  # The unique sidekiq middleware for the client push
6
6
  #
7
- # @author Mikael Henriksson <mikael@zoolutions.se>
7
+ # @author Mikael Henriksson <mikael@mhenrixon.com>
8
8
  class Client
9
9
  prepend SidekiqUniqueJobs::Middleware
10
10
 
@@ -4,7 +4,7 @@ module SidekiqUniqueJobs
4
4
  module Middleware
5
5
  # The unique sidekiq middleware for the server processor
6
6
  #
7
- # @author Mikael Henriksson <mikael@zoolutions.se>
7
+ # @author Mikael Henriksson <mikael@mhenrixon.com>
8
8
  class Server
9
9
  prepend SidekiqUniqueJobs::Middleware
10
10
 
@@ -3,7 +3,7 @@
3
3
  module SidekiqUniqueJobs
4
4
  # Normalizes hashes by dumping them to json and loading them from json
5
5
  #
6
- # @author Mikael Henriksson <mikael@zoolutions.se>
6
+ # @author Mikael Henriksson <mikael@mhenrixon.com>
7
7
  module Normalizer
8
8
  extend SidekiqUniqueJobs::JSON
9
9
 
@@ -12,7 +12,7 @@ module SidekiqUniqueJobs
12
12
  #
13
13
  # Provides lock conflict resolutions
14
14
  #
15
- # @author Mikael Henriksson <mikael@zoolutions.se>
15
+ # @author Mikael Henriksson <mikael@mhenrixon.com>
16
16
  #
17
17
  module OnConflict
18
18
  # A convenience method for using the configured strategies
@@ -4,7 +4,7 @@ module SidekiqUniqueJobs
4
4
  module OnConflict
5
5
  # Strategy to log information about conflict
6
6
  #
7
- # @author Mikael Henriksson <mikael@zoolutions.se>
7
+ # @author Mikael Henriksson <mikael@mhenrixon.com>
8
8
  class Log < OnConflict::Strategy
9
9
  include SidekiqUniqueJobs::Logging
10
10
 
@@ -4,7 +4,7 @@ module SidekiqUniqueJobs
4
4
  module OnConflict
5
5
  # Default conflict strategy class that does nothing
6
6
  #
7
- # @author Mikael Henriksson <mikael@zoolutions.se>
7
+ # @author Mikael Henriksson <mikael@mhenrixon.com>
8
8
  class NullStrategy < OnConflict::Strategy
9
9
  # Do nothing on conflict
10
10
  # @return [nil]
@@ -4,7 +4,7 @@ module SidekiqUniqueJobs
4
4
  module OnConflict
5
5
  # Strategy to raise an error on conflict
6
6
  #
7
- # @author Mikael Henriksson <mikael@zoolutions.se>
7
+ # @author Mikael Henriksson <mikael@mhenrixon.com>
8
8
  class Raise < OnConflict::Strategy
9
9
  # Raise an error on conflict.
10
10
  # This will cause Sidekiq to retry the job
@@ -4,7 +4,7 @@ module SidekiqUniqueJobs
4
4
  module OnConflict
5
5
  # Strategy to send jobs to dead queue
6
6
  #
7
- # @author Mikael Henriksson <mikael@zoolutions.se>
7
+ # @author Mikael Henriksson <mikael@mhenrixon.com>
8
8
  class Reject < OnConflict::Strategy
9
9
  include SidekiqUniqueJobs::Timing
10
10
 
@@ -4,16 +4,16 @@ module SidekiqUniqueJobs
4
4
  module OnConflict
5
5
  # Strategy to replace the job on conflict
6
6
  #
7
- # @author Mikael Henriksson <mikael@zoolutions.se>
7
+ # @author Mikael Henriksson <mikael@mhenrixon.com>
8
8
  class Replace < OnConflict::Strategy
9
9
  #
10
10
  # @!attribute [r] queue
11
11
  # @return [String] rthe sidekiq queue this job belongs to
12
12
  attr_reader :queue
13
13
  #
14
- # @!attribute [r] unique_digest
14
+ # @!attribute [r] lock_digest
15
15
  # @return [String] the unique digest to use for locking
16
- attr_reader :unique_digest
16
+ attr_reader :lock_digest
17
17
 
18
18
  #
19
19
  # Initialize a new Replace strategy
@@ -22,8 +22,8 @@ module SidekiqUniqueJobs
22
22
  #
23
23
  def initialize(item, redis_pool = nil)
24
24
  super(item, redis_pool)
25
- @queue = item[QUEUE]
26
- @unique_digest = item[LOCK_DIGEST]
25
+ @queue = item[QUEUE]
26
+ @lock_digest = item[LOCK_DIGEST]
27
27
  end
28
28
 
29
29
  #
@@ -37,10 +37,11 @@ module SidekiqUniqueJobs
37
37
  def call(&block)
38
38
  return unless (deleted_job = delete_job_by_digest)
39
39
 
40
- log_info("Deleting job: #{deleted_job}")
40
+ log_info("Deleted job: #{deleted_job}")
41
41
  if (del_count = delete_lock)
42
- log_info("Deleted `#{del_count}` keys for #{unique_digest}")
42
+ log_info("Deleted `#{del_count}` keys for #{lock_digest}")
43
43
  end
44
+
44
45
  block&.call
45
46
  end
46
47
 
@@ -54,7 +55,7 @@ module SidekiqUniqueJobs
54
55
  def delete_job_by_digest
55
56
  call_script(:delete_job_by_digest,
56
57
  keys: ["#{QUEUE}:#{queue}", SCHEDULE, RETRY],
57
- argv: [unique_digest])
58
+ argv: [lock_digest])
58
59
  end
59
60
 
60
61
  #
@@ -64,7 +65,7 @@ module SidekiqUniqueJobs
64
65
  # @return [Integer] the number of keys deleted
65
66
  #
66
67
  def delete_lock
67
- digests.delete_by_digest(unique_digest)
68
+ digests.delete_by_digest(lock_digest)
68
69
  end
69
70
 
70
71
  #
@@ -4,7 +4,7 @@ module SidekiqUniqueJobs
4
4
  module OnConflict
5
5
  # Strategy to reschedule job on conflict
6
6
  #
7
- # @author Mikael Henriksson <mikael@zoolutions.se>
7
+ # @author Mikael Henriksson <mikael@mhenrixon.com>
8
8
  class Reschedule < OnConflict::Strategy
9
9
  include SidekiqUniqueJobs::SidekiqWorkerMethods
10
10
  include SidekiqUniqueJobs::Logging
@@ -21,7 +21,7 @@ module SidekiqUniqueJobs
21
21
  def call
22
22
  if sidekiq_worker_class?
23
23
  log_info("Rescheduling #{item[LOCK_DIGEST]}")
24
- worker_class&.perform_in(5, *item[ARGS])
24
+ worker_class.perform_in(5, *item[ARGS])
25
25
  else
26
26
  log_warn("Skip rescheduling of #{item[LOCK_DIGEST]} because #{worker_class} is not a Sidekiq::Worker")
27
27
  end
@@ -5,7 +5,7 @@ module SidekiqUniqueJobs
5
5
  # Abstract conflict strategy class
6
6
  #
7
7
  # @abstract
8
- # @author Mikael Henriksson <mikael@zoolutions.se>
8
+ # @author Mikael Henriksson <mikael@mhenrixon.com>
9
9
  class Strategy
10
10
  include SidekiqUniqueJobs::JSON
11
11
  include SidekiqUniqueJobs::Logging
@@ -7,7 +7,7 @@ module SidekiqUniqueJobs
7
7
  # 1. item (required)
8
8
  # 2. options (can be nil)
9
9
  # 3. worker_class (required, can be anything)
10
- # @author Mikael Henriksson <mikael@zoolutions.se>
10
+ # @author Mikael Henriksson <mikael@mhenrixon.com>
11
11
  module OptionsWithFallback
12
12
  def self.included(base)
13
13
  base.send(:include, SidekiqUniqueJobs::SidekiqWorkerMethods)
@@ -7,7 +7,7 @@ module SidekiqUniqueJobs
7
7
  #
8
8
  # @note this is a much slower version of the lua script but does not crash redis
9
9
  #
10
- # @author Mikael Henriksson <mikael@zoolutions.se>
10
+ # @author Mikael Henriksson <mikael@mhenrixon.com>
11
11
  #
12
12
  class LuaReaper < Reaper
13
13
  #
@@ -21,7 +21,7 @@ module SidekiqUniqueJobs
21
21
  :reap_orphans,
22
22
  conn,
23
23
  keys: [DIGESTS, SCHEDULE, RETRY, PROCESSES],
24
- argv: [reaper_count],
24
+ argv: [reaper_count, (Time.now - reaper_timeout).to_f],
25
25
  )
26
26
  end
27
27
  end
@@ -5,12 +5,13 @@ module SidekiqUniqueJobs
5
5
  #
6
6
  # Manages the orphan reaper
7
7
  #
8
- # @author Mikael Henriksson <mikael@zoolutions.se>
8
+ # @author Mikael Henriksson <mikael@mhenrixon.com>
9
9
  #
10
10
  module Manager
11
11
  module_function
12
12
 
13
13
  DRIFT_FACTOR = 0.02
14
+ REAPERS = [:ruby, :lua].freeze
14
15
 
15
16
  include SidekiqUniqueJobs::Connection
16
17
  include SidekiqUniqueJobs::Logging
@@ -22,8 +23,8 @@ module SidekiqUniqueJobs
22
23
  # @return [Concurrent::TimerTask] the task that was started
23
24
  #
24
25
  def start # rubocop:disable
25
- return if registered?
26
26
  return if disabled?
27
+ return if registered?
27
28
 
28
29
  with_logging_context do
29
30
  register_reaper_process
@@ -41,6 +42,9 @@ module SidekiqUniqueJobs
41
42
  # @return [Boolean]
42
43
  #
43
44
  def stop
45
+ return if disabled?
46
+ return if unregistered?
47
+
44
48
  with_logging_context do
45
49
  log_info("Stopping Reaper")
46
50
  unregister_reaper_process
@@ -55,7 +59,12 @@ module SidekiqUniqueJobs
55
59
  # @return [<type>] <description>
56
60
  #
57
61
  def task
58
- @task ||= Concurrent::TimerTask.new(timer_task_options) do
62
+ @task ||= Concurrent::TimerTask.new(timer_task_options, &task_body)
63
+ end
64
+
65
+ # @private
66
+ def task_body
67
+ @task_body ||= lambda do
59
68
  with_logging_context do
60
69
  redis do |conn|
61
70
  refresh_reaper_mutex
@@ -114,7 +123,7 @@ module SidekiqUniqueJobs
114
123
  end
115
124
 
116
125
  #
117
- # Checks if a reaper is already registered
126
+ # Checks if a reaper is registered
118
127
  #
119
128
  #
120
129
  # @return [true, false]
@@ -125,8 +134,35 @@ module SidekiqUniqueJobs
125
134
  end
126
135
  end
127
136
 
137
+ #
138
+ # Checks if that reapers are not registerd
139
+ #
140
+ # @see registered?
141
+ #
142
+ # @return [true, false]
143
+ #
144
+ def unregistered?
145
+ !registered?
146
+ end
147
+
148
+ #
149
+ # Checks if reaping is disabled
150
+ #
151
+ # @see enabled?
152
+ #
153
+ # @return [true, false]
154
+ #
128
155
  def disabled?
129
- reaper == :none
156
+ !enabled?
157
+ end
158
+
159
+ #
160
+ # Checks if reaping is enabled
161
+ #
162
+ # @return [true, false]
163
+ #
164
+ def enabled?
165
+ REAPERS.include?(reaper)
130
166
  end
131
167
 
132
168
  #