sidekiq-unique-jobs 7.0.0.beta21 → 7.0.0.beta26
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/CHANGELOG.md +99 -3
- data/README.md +48 -23
- data/lib/sidekiq_unique_jobs.rb +0 -1
- data/lib/sidekiq_unique_jobs/batch_delete.rb +1 -1
- data/lib/sidekiq_unique_jobs/changelog.rb +1 -1
- data/lib/sidekiq_unique_jobs/cli.rb +4 -2
- data/lib/sidekiq_unique_jobs/connection.rb +1 -1
- data/lib/sidekiq_unique_jobs/constants.rb +2 -1
- data/lib/sidekiq_unique_jobs/digests.rb +1 -1
- data/lib/sidekiq_unique_jobs/exceptions.rb +9 -9
- data/lib/sidekiq_unique_jobs/job.rb +5 -5
- data/lib/sidekiq_unique_jobs/json.rb +1 -1
- data/lib/sidekiq_unique_jobs/key.rb +1 -1
- data/lib/sidekiq_unique_jobs/lock.rb +1 -1
- data/lib/sidekiq_unique_jobs/lock/base_lock.rb +1 -1
- data/lib/sidekiq_unique_jobs/lock/client_validator.rb +1 -1
- data/lib/sidekiq_unique_jobs/lock/server_validator.rb +1 -1
- data/lib/sidekiq_unique_jobs/lock/until_and_while_executing.rb +1 -1
- data/lib/sidekiq_unique_jobs/lock/until_executed.rb +1 -1
- data/lib/sidekiq_unique_jobs/lock/until_executing.rb +1 -1
- data/lib/sidekiq_unique_jobs/lock/until_expired.rb +1 -1
- data/lib/sidekiq_unique_jobs/lock/validator.rb +1 -1
- data/lib/sidekiq_unique_jobs/lock/while_executing.rb +1 -1
- data/lib/sidekiq_unique_jobs/lock/while_executing_reject.rb +1 -1
- data/lib/sidekiq_unique_jobs/lock_args.rb +2 -2
- data/lib/sidekiq_unique_jobs/lock_config.rb +5 -5
- data/lib/sidekiq_unique_jobs/lock_digest.rb +2 -2
- data/lib/sidekiq_unique_jobs/lock_info.rb +1 -1
- data/lib/sidekiq_unique_jobs/lock_timeout.rb +1 -1
- data/lib/sidekiq_unique_jobs/lock_ttl.rb +1 -1
- data/lib/sidekiq_unique_jobs/locksmith.rb +1 -1
- data/lib/sidekiq_unique_jobs/logging.rb +3 -3
- data/lib/sidekiq_unique_jobs/logging/middleware_context.rb +2 -2
- data/lib/sidekiq_unique_jobs/lua/reap_orphans.lua +1 -5
- data/lib/sidekiq_unique_jobs/lua/shared/_delete_from_queue.lua +3 -0
- data/lib/sidekiq_unique_jobs/lua/shared/_find_digest_in_process_set.lua +16 -5
- data/lib/sidekiq_unique_jobs/middleware.rb +16 -4
- data/lib/sidekiq_unique_jobs/middleware/client.rb +5 -5
- data/lib/sidekiq_unique_jobs/middleware/server.rb +3 -3
- data/lib/sidekiq_unique_jobs/normalizer.rb +1 -1
- data/lib/sidekiq_unique_jobs/on_conflict.rb +1 -1
- data/lib/sidekiq_unique_jobs/on_conflict/log.rb +1 -1
- data/lib/sidekiq_unique_jobs/on_conflict/null_strategy.rb +1 -1
- data/lib/sidekiq_unique_jobs/on_conflict/raise.rb +1 -1
- data/lib/sidekiq_unique_jobs/on_conflict/reject.rb +2 -2
- data/lib/sidekiq_unique_jobs/on_conflict/replace.rb +1 -1
- data/lib/sidekiq_unique_jobs/on_conflict/reschedule.rb +1 -1
- data/lib/sidekiq_unique_jobs/on_conflict/strategy.rb +1 -1
- data/lib/sidekiq_unique_jobs/options_with_fallback.rb +1 -1
- data/lib/sidekiq_unique_jobs/orphans/lua_reaper.rb +1 -1
- data/lib/sidekiq_unique_jobs/orphans/manager.rb +35 -4
- data/lib/sidekiq_unique_jobs/orphans/null_reaper.rb +24 -0
- data/lib/sidekiq_unique_jobs/orphans/observer.rb +2 -2
- data/lib/sidekiq_unique_jobs/orphans/reaper.rb +5 -1
- data/lib/sidekiq_unique_jobs/orphans/ruby_reaper.rb +18 -11
- data/lib/sidekiq_unique_jobs/profiler.rb +1 -1
- data/lib/sidekiq_unique_jobs/redis.rb +1 -1
- data/lib/sidekiq_unique_jobs/redis/entity.rb +1 -1
- data/lib/sidekiq_unique_jobs/redis/hash.rb +1 -1
- data/lib/sidekiq_unique_jobs/redis/list.rb +1 -1
- data/lib/sidekiq_unique_jobs/redis/set.rb +1 -1
- data/lib/sidekiq_unique_jobs/redis/sorted_set.rb +1 -1
- data/lib/sidekiq_unique_jobs/redis/string.rb +1 -1
- data/lib/sidekiq_unique_jobs/rspec/matchers.rb +2 -2
- data/lib/sidekiq_unique_jobs/rspec/matchers/have_valid_sidekiq_options.rb +2 -2
- data/lib/sidekiq_unique_jobs/script.rb +1 -1
- data/lib/sidekiq_unique_jobs/script/caller.rb +2 -2
- data/lib/sidekiq_unique_jobs/sidekiq_unique_ext.rb +5 -5
- data/lib/sidekiq_unique_jobs/sidekiq_unique_jobs.rb +1 -1
- data/lib/sidekiq_unique_jobs/sidekiq_worker_methods.rb +8 -2
- data/lib/sidekiq_unique_jobs/timing.rb +1 -1
- data/lib/sidekiq_unique_jobs/unlockable.rb +1 -1
- data/lib/sidekiq_unique_jobs/update_version.rb +1 -1
- data/lib/sidekiq_unique_jobs/upgrade_locks.rb +1 -1
- data/lib/sidekiq_unique_jobs/version.rb +1 -1
- data/lib/sidekiq_unique_jobs/version_check.rb +23 -4
- data/lib/sidekiq_unique_jobs/web.rb +1 -1
- data/lib/sidekiq_unique_jobs/web/helpers.rb +1 -1
- metadata +6 -5
@@ -12,7 +12,7 @@ module SidekiqUniqueJobs
|
|
12
12
|
#
|
13
13
|
# Provides lock conflict resolutions
|
14
14
|
#
|
15
|
-
# @author Mikael Henriksson <mikael@
|
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@
|
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@
|
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@
|
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@
|
7
|
+
# @author Mikael Henriksson <mikael@mhenrixon.com>
|
8
8
|
class Reject < OnConflict::Strategy
|
9
9
|
include SidekiqUniqueJobs::Timing
|
10
10
|
|
@@ -111,7 +111,7 @@ module SidekiqUniqueJobs
|
|
111
111
|
# @return [String] a JSON formatted string
|
112
112
|
#
|
113
113
|
def payload
|
114
|
-
@payload ||=
|
114
|
+
@payload ||= dump_json(item)
|
115
115
|
end
|
116
116
|
end
|
117
117
|
end
|
@@ -4,7 +4,7 @@ module SidekiqUniqueJobs
|
|
4
4
|
module OnConflict
|
5
5
|
# Strategy to replace the job on conflict
|
6
6
|
#
|
7
|
-
# @author Mikael Henriksson <mikael@
|
7
|
+
# @author Mikael Henriksson <mikael@mhenrixon.com>
|
8
8
|
class Replace < OnConflict::Strategy
|
9
9
|
#
|
10
10
|
# @!attribute [r] queue
|
@@ -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@
|
7
|
+
# @author Mikael Henriksson <mikael@mhenrixon.com>
|
8
8
|
class Reschedule < OnConflict::Strategy
|
9
9
|
include SidekiqUniqueJobs::SidekiqWorkerMethods
|
10
10
|
include SidekiqUniqueJobs::Logging
|
@@ -5,7 +5,7 @@ module SidekiqUniqueJobs
|
|
5
5
|
# Abstract conflict strategy class
|
6
6
|
#
|
7
7
|
# @abstract
|
8
|
-
# @author Mikael Henriksson <mikael@
|
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@
|
10
|
+
# @author Mikael Henriksson <mikael@mhenrixon.com>
|
11
11
|
module OptionsWithFallback
|
12
12
|
def self.included(base)
|
13
13
|
base.send(:include, SidekiqUniqueJobs::SidekiqWorkerMethods)
|
@@ -5,12 +5,13 @@ module SidekiqUniqueJobs
|
|
5
5
|
#
|
6
6
|
# Manages the orphan reaper
|
7
7
|
#
|
8
|
-
# @author Mikael Henriksson <mikael@
|
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
|
@@ -114,7 +118,7 @@ module SidekiqUniqueJobs
|
|
114
118
|
end
|
115
119
|
|
116
120
|
#
|
117
|
-
# Checks if a reaper is
|
121
|
+
# Checks if a reaper is registered
|
118
122
|
#
|
119
123
|
#
|
120
124
|
# @return [true, false]
|
@@ -125,8 +129,35 @@ module SidekiqUniqueJobs
|
|
125
129
|
end
|
126
130
|
end
|
127
131
|
|
132
|
+
#
|
133
|
+
# Checks if that reapers are not registerd
|
134
|
+
#
|
135
|
+
# @see registered?
|
136
|
+
#
|
137
|
+
# @return [true, false]
|
138
|
+
#
|
139
|
+
def unregistered?
|
140
|
+
!registered?
|
141
|
+
end
|
142
|
+
|
143
|
+
#
|
144
|
+
# Checks if reaping is disabled
|
145
|
+
#
|
146
|
+
# @see enabled?
|
147
|
+
#
|
148
|
+
# @return [true, false]
|
149
|
+
#
|
128
150
|
def disabled?
|
129
|
-
|
151
|
+
!enabled?
|
152
|
+
end
|
153
|
+
|
154
|
+
#
|
155
|
+
# Checks if reaping is enabled
|
156
|
+
#
|
157
|
+
# @return [true, false]
|
158
|
+
#
|
159
|
+
def enabled?
|
160
|
+
REAPERS.include?(reaper)
|
130
161
|
end
|
131
162
|
|
132
163
|
#
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SidekiqUniqueJobs
|
4
|
+
module Orphans
|
5
|
+
#
|
6
|
+
# Class DeleteOrphans provides deletion of orphaned digests
|
7
|
+
#
|
8
|
+
# @note this is a much slower version of the lua script but does not crash redis
|
9
|
+
#
|
10
|
+
# @author Mikael Henriksson <mikael@mhenrixon.com>
|
11
|
+
#
|
12
|
+
class NullReaper < Reaper
|
13
|
+
#
|
14
|
+
# Delete orphaned digests
|
15
|
+
#
|
16
|
+
#
|
17
|
+
# @return [Integer] the number of reaped locks
|
18
|
+
#
|
19
|
+
def call
|
20
|
+
# NO OP
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -6,13 +6,13 @@ module SidekiqUniqueJobs
|
|
6
6
|
#
|
7
7
|
# @note this is a much slower version of the lua script but does not crash redis
|
8
8
|
#
|
9
|
-
# @author Mikael Henriksson <mikael@
|
9
|
+
# @author Mikael Henriksson <mikael@mhenrixon.com>
|
10
10
|
#
|
11
11
|
module Orphans
|
12
12
|
#
|
13
13
|
# Observes the Orphan::Manager and provides information about each execution
|
14
14
|
#
|
15
|
-
# @author Mikael Henriksson <mikael@
|
15
|
+
# @author Mikael Henriksson <mikael@mhenrixon.com>
|
16
16
|
#
|
17
17
|
class Observer
|
18
18
|
include SidekiqUniqueJobs::Logging
|
@@ -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@
|
10
|
+
# @author Mikael Henriksson <mikael@mhenrixon.com>
|
11
11
|
#
|
12
12
|
class Reaper
|
13
13
|
include SidekiqUniqueJobs::Connection
|
@@ -17,12 +17,16 @@ module SidekiqUniqueJobs
|
|
17
17
|
|
18
18
|
require_relative "lua_reaper"
|
19
19
|
require_relative "ruby_reaper"
|
20
|
+
require_relative "null_reaper"
|
20
21
|
|
21
22
|
#
|
22
23
|
# @return [Hash<Symbol, SidekiqUniqueJobs::Orphans::Reaper] the current implementation of reapers
|
23
24
|
REAPERS = {
|
24
25
|
lua: SidekiqUniqueJobs::Orphans::LuaReaper,
|
25
26
|
ruby: SidekiqUniqueJobs::Orphans::RubyReaper,
|
27
|
+
none: SidekiqUniqueJobs::Orphans::NullReaper,
|
28
|
+
nil => SidekiqUniqueJobs::Orphans::NullReaper,
|
29
|
+
false => SidekiqUniqueJobs::Orphans::NullReaper,
|
26
30
|
}.freeze
|
27
31
|
|
28
32
|
#
|
@@ -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@
|
10
|
+
# @author Mikael Henriksson <mikael@mhenrixon.com>
|
11
11
|
#
|
12
12
|
class RubyReaper < Reaper
|
13
13
|
#
|
@@ -117,17 +117,26 @@ module SidekiqUniqueJobs
|
|
117
117
|
end
|
118
118
|
end
|
119
119
|
|
120
|
-
def active?(digest)
|
120
|
+
def active?(digest) # rubocop:disable Metrics/MethodLength
|
121
121
|
Sidekiq.redis do |conn|
|
122
|
-
procs = conn.sscan_each("processes").to_a
|
122
|
+
procs = conn.sscan_each("processes").to_a
|
123
|
+
return false if procs.empty?
|
123
124
|
|
124
|
-
|
125
|
-
|
126
|
-
conn.
|
125
|
+
procs.sort.each do |key|
|
126
|
+
valid, workers = conn.pipelined do
|
127
|
+
conn.exists(key)
|
128
|
+
conn.hgetall("#{key}:workers")
|
129
|
+
end
|
130
|
+
|
131
|
+
next unless valid
|
132
|
+
next unless workers.any?
|
133
|
+
|
134
|
+
workers.each_pair do |_tid, job|
|
135
|
+
return true if load_json(job)[LOCK_DIGEST] == digest
|
127
136
|
end
|
128
137
|
end
|
129
138
|
|
130
|
-
|
139
|
+
false
|
131
140
|
end
|
132
141
|
end
|
133
142
|
|
@@ -144,7 +153,7 @@ module SidekiqUniqueJobs
|
|
144
153
|
conn.sscan_each("queues", &block)
|
145
154
|
end
|
146
155
|
|
147
|
-
def entries(conn, queue) # rubocop:disable Metrics/MethodLength
|
156
|
+
def entries(conn, queue, &block) # rubocop:disable Metrics/MethodLength
|
148
157
|
queue_key = "queue:#{queue}"
|
149
158
|
initial_size = conn.llen(queue_key)
|
150
159
|
deleted_size = 0
|
@@ -159,9 +168,7 @@ module SidekiqUniqueJobs
|
|
159
168
|
|
160
169
|
break if entries.empty?
|
161
170
|
|
162
|
-
entries.each
|
163
|
-
yield entry
|
164
|
-
end
|
171
|
+
entries.each(&block)
|
165
172
|
|
166
173
|
deleted_size = initial_size - conn.llen(queue_key)
|
167
174
|
end
|
@@ -4,7 +4,7 @@ module SidekiqUniqueJobs
|
|
4
4
|
#
|
5
5
|
# Class MethodProfiler provides method level profiling
|
6
6
|
#
|
7
|
-
# @author Mikael Henriksson <mikael@
|
7
|
+
# @author Mikael Henriksson <mikael@mhenrixon.com>
|
8
8
|
#
|
9
9
|
class Profiler
|
10
10
|
def self.patch(klass, methods, name) # rubocop:disable Metrics/MethodLength
|
@@ -4,13 +4,13 @@ module SidekiqUniqueJobs
|
|
4
4
|
#
|
5
5
|
# We all know what the hell RSpec is no?
|
6
6
|
#
|
7
|
-
# @author Mikael Henriksson <mikael@
|
7
|
+
# @author Mikael Henriksson <mikael@mhenrixon.com>
|
8
8
|
#
|
9
9
|
module RSpec
|
10
10
|
#
|
11
11
|
# Module Matchers provides RSpec matcher for your workers
|
12
12
|
#
|
13
|
-
# @author Mikael Henriksson <mikael@
|
13
|
+
# @author Mikael Henriksson <mikael@mhenrixon.com>
|
14
14
|
#
|
15
15
|
module Matchers
|
16
16
|
end
|
@@ -5,13 +5,13 @@ module SidekiqUniqueJobs
|
|
5
5
|
#
|
6
6
|
# Module Matchers provides RSpec matcher for your workers
|
7
7
|
#
|
8
|
-
# @author Mikael Henriksson <mikael@
|
8
|
+
# @author Mikael Henriksson <mikael@mhenrixon.com>
|
9
9
|
#
|
10
10
|
module Matchers
|
11
11
|
#
|
12
12
|
# Class HaveValidSidekiqOptions validates the unique/lock configuration for a worker.
|
13
13
|
#
|
14
|
-
# @author Mikael Henriksson <mikael@
|
14
|
+
# @author Mikael Henriksson <mikael@mhenrixon.com>
|
15
15
|
#
|
16
16
|
class HaveValidSidekiqOptions
|
17
17
|
attr_reader :worker, :lock_config, :sidekiq_options
|