sidekiq-unique-jobs 5.0.0 → 5.0.1
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.
- checksums.yaml +4 -4
- data/.codeclimate.yml +2 -31
- data/.editorconfig +2 -2
- data/.rubocop.yml +1 -1
- data/.travis.yml +4 -4
- data/CHANGELOG.md +7 -0
- data/README.md +2 -6
- data/lib/sidekiq-unique-jobs.rb +5 -1
- data/lib/sidekiq/simulator.rb +3 -4
- data/lib/sidekiq_unique_jobs/cli.rb +27 -5
- data/lib/sidekiq_unique_jobs/lock/until_executed.rb +6 -14
- data/lib/sidekiq_unique_jobs/scripts.rb +8 -6
- data/lib/sidekiq_unique_jobs/scripts/acquire_lock.rb +45 -0
- data/lib/sidekiq_unique_jobs/scripts/release_lock.rb +47 -0
- data/lib/sidekiq_unique_jobs/testing.rb +1 -1
- data/lib/sidekiq_unique_jobs/unique_args.rb +3 -3
- data/lib/sidekiq_unique_jobs/unlockable.rb +4 -18
- data/lib/sidekiq_unique_jobs/util.rb +21 -2
- data/lib/sidekiq_unique_jobs/version.rb +1 -1
- data/rails_example/.env +1 -1
- data/rails_example/Gemfile +1 -0
- data/rails_example/Procfile +1 -1
- data/rails_example/app/workers/simple_worker.rb +1 -1
- data/rails_example/app/workers/slow_until_executing_worker.rb +1 -1
- data/rails_example/app/workers/spawn_simple_worker.rb +1 -1
- data/rails_example/app/workers/while_executing_worker.rb +12 -0
- data/rails_example/app/workers/without_argument_worker.rb +1 -1
- data/sidekiq-unique-jobs.gemspec +1 -0
- data/spec/jobs/another_unique_job.rb +1 -1
- data/spec/jobs/my_job.rb +1 -1
- data/spec/jobs/unique_job_with_filter_method.rb +1 -1
- data/spec/jobs/unique_on_all_queues_job.rb +1 -1
- data/spec/jobs/until_executed_job.rb +1 -1
- data/spec/jobs/while_executing_job.rb +1 -1
- data/spec/lib/sidekiq_unique_jobs/cli_spec.rb +183 -0
- data/spec/lib/sidekiq_unique_jobs/client/middleware_spec.rb +1 -9
- data/spec/lib/sidekiq_unique_jobs/lock/until_and_while_executing_spec.rb +0 -2
- data/spec/lib/sidekiq_unique_jobs/script_mock_spec.rb +1 -3
- data/spec/lib/sidekiq_unique_jobs/scripts/acquire_lock_spec.rb +50 -0
- data/spec/lib/sidekiq_unique_jobs/scripts/release_lock_spec.rb +41 -0
- data/spec/lib/sidekiq_unique_jobs/scripts_spec.rb +4 -8
- data/spec/lib/sidekiq_unique_jobs/server/middleware_spec.rb +0 -5
- data/spec/lib/sidekiq_unique_jobs/sidekiq_testing_enabled_spec.rb +0 -19
- data/spec/lib/sidekiq_unique_jobs/sidekiq_unique_ext_spec.rb +0 -5
- data/spec/lib/sidekiq_unique_jobs/unlockable_spec.rb +0 -1
- data/spec/lib/sidekiq_unique_jobs/util_spec.rb +54 -26
- data/spec/spec_helper.rb +40 -2
- data/spec/support/matchers/redis_matchers.rb +16 -6
- metadata +22 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 54089588f5279692be7686eca3e9b4987c9cb706
|
4
|
+
data.tar.gz: 2ce8320f727817419868df6ddc877d143c9318cf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fe2abbb06c27ef94b8266d1bcc1727b1385e7d6897c35731986d90306ce218b16b7d22336facbfff95b43e294abf5dbe4b894ce4d6629d4373e272cb20285502
|
7
|
+
data.tar.gz: eba5e89015ec74852a4a6e0615e3793ede42dee32a22e59ccd019de3a22e14b27ea27dbb757c5a4cf6cc3eab2bf80d2a6801928bb8a4030c6c3dfb45e31df593
|
data/.codeclimate.yml
CHANGED
@@ -1,36 +1,7 @@
|
|
1
1
|
---
|
2
|
-
engines:
|
3
|
-
csslint:
|
4
|
-
enabled: true
|
5
|
-
duplication:
|
6
|
-
enabled: true
|
7
|
-
config:
|
8
|
-
languages:
|
9
|
-
- ruby
|
10
|
-
- javascript
|
11
|
-
- python
|
12
|
-
- php
|
13
|
-
eslint:
|
14
|
-
enabled: true
|
15
|
-
fixme:
|
16
|
-
enabled: true
|
17
|
-
rubocop:
|
18
|
-
enabled: true
|
19
|
-
ratings:
|
20
|
-
paths:
|
21
|
-
- "**.css"
|
22
|
-
- "**.inc"
|
23
|
-
- "**.js"
|
24
|
-
- "**.jsx"
|
25
|
-
- "**.module"
|
26
|
-
- "**.php"
|
27
|
-
- "**.py"
|
28
|
-
- "**.rb"
|
29
|
-
exclude_paths:
|
30
|
-
- spec/
|
31
2
|
engines:
|
32
3
|
bundler-audit:
|
33
|
-
enabled:
|
4
|
+
enabled: false
|
34
5
|
fixme:
|
35
6
|
enabled: true
|
36
7
|
duplication:
|
@@ -47,7 +18,7 @@ ratings:
|
|
47
18
|
- "**.rb"
|
48
19
|
exclude_paths:
|
49
20
|
- Gemfile
|
50
|
-
- *.gemspec
|
21
|
+
- "*.gemspec"
|
51
22
|
- Appraisals
|
52
23
|
- spec/**/*.rb
|
53
24
|
- gemfiles/**/*
|
data/.editorconfig
CHANGED
data/.rubocop.yml
CHANGED
data/.travis.yml
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
sudo: false
|
2
2
|
language: ruby
|
3
3
|
cache: bundler
|
4
|
-
before_install:
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
# before_install:
|
5
|
+
# - rvm get head
|
6
|
+
# - gem update --system
|
7
|
+
# - gem install bundler
|
8
8
|
services:
|
9
9
|
- redis-server
|
10
10
|
script:
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,13 @@
|
|
1
|
+
## v5.0.1
|
2
|
+
|
3
|
+
- Added a command line util for cleaning out expired keys
|
4
|
+
- Use `SidekiqUniqueJobs.logger` instead of spreading out `Sidekiq.logger` everywhere.
|
5
|
+
|
1
6
|
## v5.0.0
|
2
7
|
|
3
8
|
- Only support Sidekiq >= 4
|
9
|
+
- Removed overrides and support for older Sidekiq testing
|
10
|
+
- Added coverage
|
4
11
|
|
5
12
|
## v4.0.18
|
6
13
|
|
data/README.md
CHANGED
@@ -5,15 +5,11 @@ The missing unique jobs for sidekiq
|
|
5
5
|
## Requirements
|
6
6
|
|
7
7
|
|
8
|
-
See https://github.com/mperham/sidekiq#requirements for what is required. Starting from
|
8
|
+
See https://github.com/mperham/sidekiq#requirements for what is required. Starting from 5.0.0 only sidekiq >= 4 is supported and support for MRI <= 2.1 is dropped.
|
9
9
|
|
10
10
|
### Version 4 Upgrade instructions
|
11
11
|
|
12
|
-
Version
|
13
|
-
|
14
|
-
Easy path - Drop all your unique jobs before upgrading the gem!
|
15
|
-
|
16
|
-
Hard path - See below... Start with a clean slate :)
|
12
|
+
Version 5 requires redis >= 3
|
17
13
|
|
18
14
|
## Installation
|
19
15
|
|
data/lib/sidekiq-unique-jobs.rb
CHANGED
@@ -26,10 +26,14 @@ module SidekiqUniqueJobs
|
|
26
26
|
default_queue_lock_expiration: 30 * 60,
|
27
27
|
default_run_lock_expiration: 60,
|
28
28
|
default_lock: :while_executing,
|
29
|
-
redis_test_mode: :redis # :mock
|
29
|
+
redis_test_mode: :redis, # :mock
|
30
30
|
)
|
31
31
|
end
|
32
32
|
|
33
|
+
def logger
|
34
|
+
Sidekiq.logger
|
35
|
+
end
|
36
|
+
|
33
37
|
def default_lock
|
34
38
|
config.default_lock
|
35
39
|
end
|
data/lib/sidekiq/simulator.rb
CHANGED
@@ -3,6 +3,9 @@ require 'timeout'
|
|
3
3
|
|
4
4
|
module Sidekiq
|
5
5
|
class Simulator
|
6
|
+
extend Forwardable
|
7
|
+
def_delegator SidekiqUniqueJobs, :logger
|
8
|
+
|
6
9
|
attr_reader :queues, :launcher
|
7
10
|
|
8
11
|
def self.process_queue(queue)
|
@@ -67,9 +70,5 @@ module Sidekiq
|
|
67
70
|
verbose: false,
|
68
71
|
logfile: './tmp/sidekiq.log' }
|
69
72
|
end
|
70
|
-
|
71
|
-
def logger
|
72
|
-
@logger ||= Sidekiq.logger
|
73
|
-
end
|
74
73
|
end
|
75
74
|
end
|
@@ -2,30 +2,52 @@ require 'thor'
|
|
2
2
|
|
3
3
|
module SidekiqUniqueJobs
|
4
4
|
class Cli < Thor
|
5
|
+
# def initialize(argv, stdin = STDIN, stdout = STDOUT, stderr = STDERR, kernel = Kernel)
|
6
|
+
# @argv, @stdin, @stdout, @stderr, @kernel = argv, stdin, stdout, stderr, kernel
|
7
|
+
# end
|
8
|
+
|
9
|
+
def self.banner(command, _namespace = nil, _subcommand = false)
|
10
|
+
"jobs #{@package_name} #{command.usage}"
|
11
|
+
end
|
12
|
+
|
5
13
|
desc 'keys PATTERN', 'list all unique keys and their expiry time'
|
6
14
|
option :count, aliases: :c, type: :numeric, default: 1000, desc: 'The max number of keys to return'
|
7
15
|
def keys(pattern)
|
8
|
-
Util.keys(pattern, options[:count])
|
16
|
+
keys = Util.keys(pattern, options[:count])
|
17
|
+
say "Found #{keys.size} keys matching '#{pattern}':"
|
18
|
+
print_in_columns(keys.sort) if keys.any?
|
9
19
|
end
|
10
20
|
|
11
21
|
desc 'del PATTERN', 'deletes unique keys from redis by pattern'
|
12
22
|
option :dry_run, aliases: :d, type: :boolean, desc: 'set to false to perform deletion'
|
13
23
|
option :count, aliases: :c, type: :numeric, default: 1000, desc: 'The max number of keys to return'
|
14
24
|
def del(pattern)
|
15
|
-
Util.del(pattern, options[:count], options[:dry_run])
|
25
|
+
deleted_count = Util.del(pattern, options[:count], options[:dry_run])
|
26
|
+
say "Deleted #{deleted_count} keys matching '#{pattern}'"
|
27
|
+
end
|
28
|
+
|
29
|
+
desc 'expire', 'removes all expired unique keys from the hash in redis'
|
30
|
+
def expire
|
31
|
+
expired = Util.expire
|
32
|
+
say "Removed #{expired.values.size} left overs from redis."
|
33
|
+
print_in_columns(expired.values)
|
16
34
|
end
|
17
35
|
|
18
36
|
desc 'console', 'drop into a console with easy access to helper methods'
|
19
37
|
def console
|
20
|
-
|
21
|
-
|
22
|
-
|
38
|
+
say "Use `keys '*', 1000 to display the first 1000 unique keys matching '*'"
|
39
|
+
say "Use `del '*', 1000, true (default) to see how many keys would be deleted for the pattern '*'"
|
40
|
+
say "Use `del '*', 1000, false to delete the first 1000 keys matching '*'"
|
23
41
|
Object.include SidekiqUniqueJobs::Util
|
24
42
|
console_class.start
|
25
43
|
end
|
26
44
|
|
27
45
|
private
|
28
46
|
|
47
|
+
def logger
|
48
|
+
SidekiqUniqueJobs.logger
|
49
|
+
end
|
50
|
+
|
29
51
|
def console_class
|
30
52
|
require 'pry'
|
31
53
|
Pry
|
@@ -35,25 +35,17 @@ module SidekiqUniqueJobs
|
|
35
35
|
unlock_by_key(unique_key, item[JID_KEY], redis_pool)
|
36
36
|
end
|
37
37
|
|
38
|
-
# rubocop:disable MethodLength
|
39
38
|
def lock(scope)
|
40
39
|
if scope.to_sym != :client
|
41
40
|
raise ArgumentError, "#{scope} middleware can't #{__method__} #{unique_key}"
|
42
41
|
end
|
43
42
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
true
|
51
|
-
when 0
|
52
|
-
logger.debug { "failed to acquire lock for #{unique_key}" }
|
53
|
-
false
|
54
|
-
else
|
55
|
-
raise "#{__method__} returned an unexpected value (#{result})"
|
56
|
-
end
|
43
|
+
Scripts::AcquireLock.execute(
|
44
|
+
redis_pool,
|
45
|
+
unique_key,
|
46
|
+
item[JID_KEY],
|
47
|
+
max_lock_time
|
48
|
+
)
|
57
49
|
end
|
58
50
|
# rubocop:enable MethodLength
|
59
51
|
|
@@ -1,9 +1,15 @@
|
|
1
1
|
require 'pathname'
|
2
2
|
require 'digest/sha1'
|
3
3
|
require 'concurrent/map'
|
4
|
+
require 'sidekiq_unique_jobs/scripts/acquire_lock'
|
5
|
+
require 'sidekiq_unique_jobs/scripts/release_lock'
|
4
6
|
|
5
7
|
module SidekiqUniqueJobs
|
6
|
-
ScriptError
|
8
|
+
ScriptError = Class.new(StandardError)
|
9
|
+
UniqueKeyMissing = Class.new(ArgumentError)
|
10
|
+
JidMissing = Class.new(ArgumentError)
|
11
|
+
MaxLockTimeMissing = Class.new(ArgumentError)
|
12
|
+
UnexpectedValue = Class.new(StandardError)
|
7
13
|
|
8
14
|
module Scripts
|
9
15
|
LUA_PATHNAME ||= Pathname.new(__FILE__).dirname.join('../../redis').freeze
|
@@ -14,11 +20,7 @@ module SidekiqUniqueJobs
|
|
14
20
|
module_function
|
15
21
|
|
16
22
|
extend SingleForwardable
|
17
|
-
|
18
|
-
|
19
|
-
def logger
|
20
|
-
Sidekiq.logger
|
21
|
-
end
|
23
|
+
def_delegators :SidekiqUniqueJobs, :connection, :logger
|
22
24
|
|
23
25
|
def call(file_name, redis_pool, options = {}) # rubocop:disable MethodLength
|
24
26
|
connection(redis_pool) do |redis|
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module SidekiqUniqueJobs
|
2
|
+
module Scripts
|
3
|
+
class AcquireLock
|
4
|
+
extend Forwardable
|
5
|
+
def_delegator SidekiqUniqueJobs, :logger
|
6
|
+
|
7
|
+
def self.execute(redis_pool, unique_key, jid, max_lock_time)
|
8
|
+
new(redis_pool, unique_key, jid, max_lock_time).execute
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_reader :redis_pool, :unique_key, :jid, :max_lock_time
|
12
|
+
|
13
|
+
def initialize(_redis_pool, unique_key, jid, max_lock_time)
|
14
|
+
raise UniqueKeyMissing, 'unique_key is required' if unique_key.nil?
|
15
|
+
raise JidMissing, 'jid is required' if jid.nil?
|
16
|
+
raise MaxLockTimeMissing, 'max_lock_time is required' if max_lock_time.nil?
|
17
|
+
|
18
|
+
@unique_key = unique_key
|
19
|
+
@jid = jid
|
20
|
+
@max_lock_time = max_lock_time
|
21
|
+
end
|
22
|
+
|
23
|
+
def execute
|
24
|
+
result = Scripts.call(:acquire_lock, redis_pool,
|
25
|
+
keys: [unique_key],
|
26
|
+
argv: [jid, max_lock_time])
|
27
|
+
|
28
|
+
handle_result(result)
|
29
|
+
end
|
30
|
+
|
31
|
+
def handle_result(result)
|
32
|
+
case result
|
33
|
+
when 1
|
34
|
+
logger.debug { "successfully acquired lock #{unique_key} for #{max_lock_time} seconds" }
|
35
|
+
true
|
36
|
+
when 0
|
37
|
+
logger.debug { "failed to acquire lock for #{unique_key}" }
|
38
|
+
false
|
39
|
+
else
|
40
|
+
raise UnexpectedValue, "failed to acquire lock : unexpected return value (#{result})"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module SidekiqUniqueJobs
|
2
|
+
module Scripts
|
3
|
+
class ReleaseLock
|
4
|
+
extend Forwardable
|
5
|
+
def_delegator SidekiqUniqueJobs, :logger
|
6
|
+
|
7
|
+
def self.execute(redis_pool, unique_key, jid)
|
8
|
+
new(redis_pool, unique_key, jid).execute
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_reader :redis_pool, :unique_key, :jid
|
12
|
+
|
13
|
+
def initialize(redis_pool, unique_key, jid)
|
14
|
+
raise UniqueKeyMissing, 'unique_key is required' if unique_key.nil?
|
15
|
+
raise JidMissing, 'jid is required' if jid.nil?
|
16
|
+
|
17
|
+
@redis_pool = redis_pool
|
18
|
+
@unique_key = unique_key
|
19
|
+
@jid = jid
|
20
|
+
end
|
21
|
+
|
22
|
+
def execute
|
23
|
+
result = Scripts.call(:release_lock, redis_pool,
|
24
|
+
keys: [unique_key],
|
25
|
+
argv: [jid])
|
26
|
+
|
27
|
+
handle_result(result)
|
28
|
+
end
|
29
|
+
|
30
|
+
def handle_result(result)
|
31
|
+
case result
|
32
|
+
when 1
|
33
|
+
logger.debug { "successfully unlocked #{unique_key}" }
|
34
|
+
true
|
35
|
+
when 0
|
36
|
+
logger.debug { "expiring lock #{unique_key} is not owned by #{jid}" }
|
37
|
+
false
|
38
|
+
when -1
|
39
|
+
logger.debug { "#{unique_key} is not a known key" }
|
40
|
+
false
|
41
|
+
else
|
42
|
+
raise UnexpectedValue, "failed to release lock : unexpected return value (#{result})"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -25,7 +25,7 @@ module SidekiqUniqueJobs
|
|
25
25
|
|
26
26
|
module Testing
|
27
27
|
def call_ext(file_name, redis_pool, options = {})
|
28
|
-
if SidekiqUniqueJobs.
|
28
|
+
if SidekiqUniqueJobs.mocked?
|
29
29
|
SidekiqUniqueJobs::ScriptMock.call(file_name, redis_pool, options)
|
30
30
|
else
|
31
31
|
call_orig(file_name, redis_pool, options)
|
@@ -19,10 +19,10 @@ module SidekiqUniqueJobs
|
|
19
19
|
def initialize(job)
|
20
20
|
Sidekiq::Logging.with_context(CLASS_NAME) do
|
21
21
|
@item = job
|
22
|
-
@worker_class
|
22
|
+
@worker_class ||= worker_class_constantize(@item[CLASS_KEY])
|
23
23
|
@item[UNIQUE_PREFIX_KEY] ||= unique_prefix
|
24
|
-
@item[UNIQUE_ARGS_KEY]
|
25
|
-
@item[UNIQUE_DIGEST_KEY]
|
24
|
+
@item[UNIQUE_ARGS_KEY] = unique_args(@item[ARGS_KEY])
|
25
|
+
@item[UNIQUE_DIGEST_KEY] = unique_digest
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
@@ -7,26 +7,12 @@ module SidekiqUniqueJobs
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def unlock_by_key(unique_key, jid, redis_pool = nil)
|
10
|
-
|
11
|
-
after_unlock(
|
10
|
+
return false unless Scripts::ReleaseLock.execute(redis_pool, unique_key, jid)
|
11
|
+
after_unlock(jid)
|
12
12
|
end
|
13
13
|
|
14
|
-
def after_unlock(
|
14
|
+
def after_unlock(jid)
|
15
15
|
ensure_job_id_removed(jid)
|
16
|
-
|
17
|
-
case result
|
18
|
-
when 1
|
19
|
-
logger.debug { "successfully unlocked #{unique_key}" }
|
20
|
-
true
|
21
|
-
when 0
|
22
|
-
logger.debug { "expiring lock #{unique_key} is not owned by #{jid}" }
|
23
|
-
false
|
24
|
-
when -1
|
25
|
-
logger.debug { "#{unique_key} is not a known key" }
|
26
|
-
false
|
27
|
-
else
|
28
|
-
raise "#{calling_method} returned an unexpected value (#{result})"
|
29
|
-
end
|
30
16
|
end
|
31
17
|
|
32
18
|
def ensure_job_id_removed(jid)
|
@@ -34,7 +20,7 @@ module SidekiqUniqueJobs
|
|
34
20
|
end
|
35
21
|
|
36
22
|
def logger
|
37
|
-
|
23
|
+
SidekiqUniqueJobs.logger
|
38
24
|
end
|
39
25
|
end
|
40
26
|
end
|
@@ -18,7 +18,7 @@ module SidekiqUniqueJobs
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def del(pattern = SCAN_PATTERN, count = 0, dry_run = true)
|
21
|
-
raise 'Please provide a number of keys to delete greater than zero' if count.zero?
|
21
|
+
raise ArgumentError, 'Please provide a number of keys to delete greater than zero' if count.zero?
|
22
22
|
logger.debug { "Deleting keys by: #{pattern}" }
|
23
23
|
keys, time = timed { keys(pattern, count) }
|
24
24
|
logger.debug { "#{keys.size} matching keys found in #{time} sec." }
|
@@ -32,6 +32,24 @@ module SidekiqUniqueJobs
|
|
32
32
|
keys.size
|
33
33
|
end
|
34
34
|
|
35
|
+
def unique_hash
|
36
|
+
connection do |conn|
|
37
|
+
conn.hgetall(SidekiqUniqueJobs::HASH_KEY)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def expire
|
42
|
+
removed_keys = {}
|
43
|
+
connection do |conn|
|
44
|
+
conn.hgetall(SidekiqUniqueJobs::HASH_KEY).each do |jid, unique_key|
|
45
|
+
next if conn.get(unique_key)
|
46
|
+
conn.hdel(SidekiqUniqueJobs::HASH_KEY, jid)
|
47
|
+
removed_keys[jid] = unique_key
|
48
|
+
end
|
49
|
+
end
|
50
|
+
removed_keys
|
51
|
+
end
|
52
|
+
|
35
53
|
def keys_by_scan(pattern, count)
|
36
54
|
connection { |conn| conn.scan_each(match: prefix(pattern), count: count).to_a }
|
37
55
|
end
|
@@ -72,6 +90,7 @@ module SidekiqUniqueJobs
|
|
72
90
|
|
73
91
|
def prefix(key)
|
74
92
|
return key if unique_prefix.nil?
|
93
|
+
return key if key.start_with?("#{unique_prefix}:")
|
75
94
|
"#{unique_prefix}:#{key}"
|
76
95
|
end
|
77
96
|
|
@@ -92,7 +111,7 @@ module SidekiqUniqueJobs
|
|
92
111
|
end
|
93
112
|
|
94
113
|
def logger
|
95
|
-
|
114
|
+
SidekiqUniqueJobs.logger
|
96
115
|
end
|
97
116
|
end
|
98
117
|
end
|