sidekiq-unique-jobs 6.0.0.rc6 → 6.0.0.rc7
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 +6 -7
- data/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
- data/.reek.yml +17 -48
- data/.rubocop.yml +3 -0
- data/.yardopts +7 -0
- data/CHANGELOG.md +2 -0
- data/README.md +65 -23
- data/assets/unique_digests_1.png +0 -0
- data/assets/unique_digests_2.png +0 -0
- data/examples/another_unique_job.rb +4 -2
- data/examples/custom_queue_job_with_filter_method.rb +1 -1
- data/examples/custom_queue_job_with_filter_proc.rb +1 -1
- data/examples/expiring_job.rb +1 -1
- data/examples/inline_worker.rb +1 -1
- data/examples/just_a_worker.rb +1 -1
- data/examples/long_running_job.rb +4 -2
- data/examples/main_job.rb +3 -2
- data/examples/my_unique_job.rb +4 -5
- data/examples/my_unique_job_with_filter_method.rb +3 -3
- data/examples/my_unique_job_with_filter_proc.rb +3 -3
- data/examples/notify_worker.rb +2 -2
- data/examples/simple_worker.rb +2 -2
- data/examples/unique_across_workers_job.rb +1 -1
- data/examples/unique_job_on_conflict_raise.rb +14 -0
- data/examples/unique_job_on_conflict_reject.rb +14 -0
- data/examples/unique_job_on_conflict_reschedule.rb +14 -0
- data/examples/unique_job_with_conditional_parameter.rb +3 -3
- data/examples/unique_job_with_filter_method.rb +5 -2
- data/examples/unique_job_with_nil_unique_args.rb +3 -3
- data/examples/unique_job_with_no_unique_args_method.rb +3 -3
- data/examples/unique_job_withthout_unique_args_parameter.rb +3 -3
- data/examples/unique_on_all_queues_job.rb +1 -1
- data/examples/until_and_while_executing_job.rb +4 -1
- data/examples/until_executed_2_job.rb +5 -5
- data/examples/until_executed_job.rb +5 -5
- data/examples/until_executing_job.rb +1 -1
- data/examples/until_expired_job.rb +1 -1
- data/examples/until_global_expired_job.rb +1 -1
- data/examples/while_executing_job.rb +2 -2
- data/examples/while_executing_reject_job.rb +2 -2
- data/examples/without_argument_job.rb +1 -1
- data/lib/sidekiq_unique_jobs.rb +30 -0
- data/lib/sidekiq_unique_jobs/client/middleware.rb +12 -1
- data/lib/sidekiq_unique_jobs/connection.rb +5 -1
- data/lib/sidekiq_unique_jobs/constants.rb +3 -0
- data/lib/sidekiq_unique_jobs/digests.rb +111 -0
- data/lib/sidekiq_unique_jobs/exceptions.rb +15 -16
- data/lib/sidekiq_unique_jobs/lock/base_lock.rb +44 -3
- data/lib/sidekiq_unique_jobs/lock/until_and_while_executing.rb +13 -3
- data/lib/sidekiq_unique_jobs/lock/until_executed.rb +8 -1
- data/lib/sidekiq_unique_jobs/lock/until_executing.rb +8 -1
- data/lib/sidekiq_unique_jobs/lock/until_expired.rb +14 -2
- data/lib/sidekiq_unique_jobs/lock/while_executing.rb +19 -5
- data/lib/sidekiq_unique_jobs/lock/while_executing_reject.rb +16 -63
- data/lib/sidekiq_unique_jobs/locksmith.rb +36 -13
- data/lib/sidekiq_unique_jobs/logging.rb +24 -1
- data/lib/sidekiq_unique_jobs/normalizer.rb +6 -0
- data/lib/sidekiq_unique_jobs/on_conflict.rb +24 -0
- data/lib/sidekiq_unique_jobs/on_conflict/log.rb +20 -0
- data/lib/sidekiq_unique_jobs/on_conflict/null_strategy.rb +16 -0
- data/lib/sidekiq_unique_jobs/on_conflict/raise.rb +17 -0
- data/lib/sidekiq_unique_jobs/on_conflict/reject.rb +72 -0
- data/lib/sidekiq_unique_jobs/on_conflict/reschedule.rb +24 -0
- data/lib/sidekiq_unique_jobs/on_conflict/strategy.rb +28 -0
- data/lib/sidekiq_unique_jobs/options_with_fallback.rb +19 -4
- data/lib/sidekiq_unique_jobs/scripts.rb +31 -0
- data/lib/sidekiq_unique_jobs/server/middleware.rb +10 -0
- data/lib/sidekiq_unique_jobs/sidekiq_worker_methods.rb +15 -1
- data/lib/sidekiq_unique_jobs/timeout/calculator.rb +17 -4
- data/lib/sidekiq_unique_jobs/unique_args.rb +47 -5
- data/lib/sidekiq_unique_jobs/unlockable.rb +10 -0
- data/lib/sidekiq_unique_jobs/util.rb +12 -7
- data/lib/sidekiq_unique_jobs/version.rb +1 -1
- data/lib/sidekiq_unique_jobs/web.rb +51 -0
- data/lib/sidekiq_unique_jobs/web/helpers.rb +37 -0
- data/lib/sidekiq_unique_jobs/web/views/unique_digest.erb +28 -0
- data/lib/sidekiq_unique_jobs/web/views/unique_digests.erb +42 -0
- data/redis/create.lua +4 -2
- data/redis/delete.lua +3 -1
- data/redis/delete_by_digest.lua +22 -0
- data/redis/signal.lua +3 -1
- data/sidekiq-unique-jobs.gemspec +2 -0
- metadata +49 -3
- data/lib/sidekiq_unique_jobs/lock/while_executing_requeue.rb +0 -21
@@ -1,17 +1,23 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module SidekiqUniqueJobs
|
4
|
+
# Utility module to help manage unique keys in redis.
|
5
|
+
# Useful for deleting keys that for whatever reason wasn't deleted
|
6
|
+
#
|
7
|
+
# @author Mikael Henriksson <mikael@zoolutions.se>
|
4
8
|
module Util
|
5
|
-
COUNT = 'COUNT'
|
6
9
|
DEFAULT_COUNT = 1_000
|
7
|
-
EXPIRE_BATCH_SIZE = 100
|
8
|
-
SCAN_METHOD = 'SCAN'
|
9
10
|
SCAN_PATTERN = '*'
|
10
11
|
|
11
12
|
include SidekiqUniqueJobs::Logging
|
12
13
|
include SidekiqUniqueJobs::Connection
|
13
14
|
extend self # rubocop:disable Style/ModuleFunction
|
14
15
|
|
16
|
+
# Find unique keys in redis
|
17
|
+
#
|
18
|
+
# @param [String] pattern a pattern to scan for in redis
|
19
|
+
# @param [Integer] count the maximum number of keys to delete
|
20
|
+
# @return [Array<String>] an array with active unique keys
|
15
21
|
def keys(pattern = SCAN_PATTERN, count = DEFAULT_COUNT)
|
16
22
|
return redis(&:keys) if pattern.nil?
|
17
23
|
redis { |conn| conn.scan_each(match: prefix(pattern), count: count).to_a }
|
@@ -19,10 +25,9 @@ module SidekiqUniqueJobs
|
|
19
25
|
|
20
26
|
# Deletes unique keys from redis
|
21
27
|
#
|
22
|
-
#
|
23
|
-
# @param
|
24
|
-
# @
|
25
|
-
# @return [Boolean] report success
|
28
|
+
# @param [String] pattern a pattern to scan for in redis
|
29
|
+
# @param [Integer] count the maximum number of keys to delete
|
30
|
+
# @return [Integer] the number of keys deleted
|
26
31
|
def del(pattern = SCAN_PATTERN, count = 0)
|
27
32
|
raise ArgumentError, 'Please provide a number of keys to delete greater than zero' if count.zero?
|
28
33
|
pattern = "#{pattern}:*" unless pattern.end_with?(':*')
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'sidekiq/web'
|
5
|
+
rescue LoadError # rubocop:disable Lint/HandleExceptions
|
6
|
+
# client-only usage
|
7
|
+
end
|
8
|
+
|
9
|
+
require_relative 'web/helpers'
|
10
|
+
|
11
|
+
module SidekiqUniqueJobs
|
12
|
+
# Utility module to help manage unique keys in redis.
|
13
|
+
# Useful for deleting keys that for whatever reason wasn't deleted
|
14
|
+
#
|
15
|
+
# @author Mikael Henriksson <mikael@zoolutions.se>
|
16
|
+
module Web
|
17
|
+
def self.registered(app) # rubocop:disable Metrics/MethodLength
|
18
|
+
app.helpers do
|
19
|
+
include Web::Helpers
|
20
|
+
end
|
21
|
+
|
22
|
+
app.get '/unique_digests' do
|
23
|
+
@total_size = Digests.count
|
24
|
+
@filter = params[:filter] || '*'
|
25
|
+
@filter = '*' if @filter == ''
|
26
|
+
@count = (params[:count] || 100).to_i
|
27
|
+
@unique_digests = Digests.all(pattern: @filter, count: @count)
|
28
|
+
|
29
|
+
erb(unique_template(:unique_digests))
|
30
|
+
end
|
31
|
+
|
32
|
+
app.get '/unique_digests/:digest' do
|
33
|
+
@digest = params[:digest]
|
34
|
+
@unique_keys = Util.keys("#{@digest}*", 1000)
|
35
|
+
|
36
|
+
erb(unique_template(:unique_digest))
|
37
|
+
end
|
38
|
+
|
39
|
+
app.get '/unique_digests/:digest/delete' do
|
40
|
+
Digests.del(digest: params[:digest])
|
41
|
+
redirect_to :unique_digests
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
if defined?(Sidekiq::Web)
|
48
|
+
Sidekiq::Web.register SidekiqUniqueJobs::Web
|
49
|
+
Sidekiq::Web.tabs['Unique Digests'] = 'unique_digests'
|
50
|
+
# Sidekiq::Web.settings.locales << File.join(File.dirname(__FILE__), 'locales')
|
51
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SidekiqUniqueJobs
|
4
|
+
module Web
|
5
|
+
module Helpers
|
6
|
+
VIEW_PATH = File.expand_path('../web/views', __dir__)
|
7
|
+
|
8
|
+
def filtering(pattern, count)
|
9
|
+
SidekiqUniqueJobs::Util.keys(pattern, count)
|
10
|
+
end
|
11
|
+
|
12
|
+
def unique_template(name)
|
13
|
+
File.open(File.join(VIEW_PATH, "#{name}.erb")).read
|
14
|
+
end
|
15
|
+
|
16
|
+
def redirect_to(subpath)
|
17
|
+
if respond_to?(:to)
|
18
|
+
# Sinatra-based web UI
|
19
|
+
redirect to(subpath)
|
20
|
+
else
|
21
|
+
# Non-Sinatra based web UI (Sidekiq 4.2+)
|
22
|
+
redirect "#{root_path}#{subpath}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def safe_relative_time(time)
|
27
|
+
time = if time.is_a?(Numeric)
|
28
|
+
Time.at(time)
|
29
|
+
else
|
30
|
+
Time.parse(time)
|
31
|
+
end
|
32
|
+
|
33
|
+
relative_time(time)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
<header class="row">
|
2
|
+
<div class="col-sm-5">
|
3
|
+
<h3><%= t('Unique Digest') %> - <a class="btn btn-default btn-xs" href="<%= root_path %>unique_digests"><%= t('GoBack') %></a></h3>
|
4
|
+
</div>
|
5
|
+
</header>
|
6
|
+
|
7
|
+
<% if @unique_keys.size.positive? %>
|
8
|
+
<div class="table_container">
|
9
|
+
<table class="table table-striped table-bordered table-hover">
|
10
|
+
<thead>
|
11
|
+
<tr>
|
12
|
+
<th>
|
13
|
+
<%= t('Keys') %>
|
14
|
+
<span class="small text-muted">for (<%= @digest %>)</span>
|
15
|
+
</th>
|
16
|
+
</tr>
|
17
|
+
</thead>
|
18
|
+
<% @unique_keys.each do |key| %>
|
19
|
+
<tr><td colspan="2"><%= key %></td></tr>
|
20
|
+
<% end %>
|
21
|
+
</table>
|
22
|
+
</div>
|
23
|
+
<form action="<%= root_path %>unique_digests/<%= @digest %>/delete" method="get">
|
24
|
+
<%= csrf_tag %>
|
25
|
+
<a class="btn btn-default btn-xs" href="<%= root_path %>unique_digests"><%= t('GoBack') %></a>
|
26
|
+
<input class="btn btn-danger btn-xs flip" type="submit" name="delete" value="<%= t('Delete') %>" data-confirm="<%= t('AreYouSure') %>" />
|
27
|
+
</form>
|
28
|
+
<% end %>
|
@@ -0,0 +1,42 @@
|
|
1
|
+
<header class="row">
|
2
|
+
<div class="col-sm-5">
|
3
|
+
<h3><%= t('Unique Digests') %></h3>
|
4
|
+
</div>
|
5
|
+
<form action="<%= root_path %>unique_digests" class="form form-inline" method="get">
|
6
|
+
<%= csrf_tag %>
|
7
|
+
<input name="filter" class="form-control" type="text" value="<%= @filter %>" />
|
8
|
+
<button class="btn btn-default" type="submit"><%= t('Filter') %></button>
|
9
|
+
</form>
|
10
|
+
<% if @unique_digests.size > 0 && @total_size > @count.to_i %>
|
11
|
+
<div class="col-sm-4">
|
12
|
+
<%= erb :_paging, locals: { url: "#{root_path}unique_digests" } %>
|
13
|
+
</div>
|
14
|
+
<% end %>
|
15
|
+
</header>
|
16
|
+
|
17
|
+
<% if @unique_digests.size.positive? %>
|
18
|
+
<div class="table_container">
|
19
|
+
<table class="table table-striped table-bordered table-hover">
|
20
|
+
<thead>
|
21
|
+
<tr>
|
22
|
+
<th><%= t('Delete') %></th>
|
23
|
+
<th><%= t('Digest') %></th>
|
24
|
+
</tr>
|
25
|
+
</thead>
|
26
|
+
<% @unique_digests.each do |digest| %>
|
27
|
+
<tr>
|
28
|
+
<td>
|
29
|
+
<form action="<%= root_path %>unique_digests/<%= digest %>/delete" method="get">
|
30
|
+
<%= csrf_tag %>
|
31
|
+
<input name="digest" value="<%= h digest %>" type="hidden" />
|
32
|
+
<input class="btn btn-danger btn-xs" type="submit" name="delete" value="<%= t('Delete') %>" data-confirm="<%= t('AreYouSure') %>" />
|
33
|
+
</form>
|
34
|
+
</td>
|
35
|
+
<td>
|
36
|
+
<a href="<%= root_path %>unique_digests/<%= digest %>"><%= digest %></a>
|
37
|
+
</td>
|
38
|
+
</tr>
|
39
|
+
<% end %>
|
40
|
+
</table>
|
41
|
+
</div>
|
42
|
+
<% end %>
|
data/redis/create.lua
CHANGED
@@ -4,7 +4,8 @@ local exists_key = KEYS[1]
|
|
4
4
|
local grabbed_key = KEYS[2]
|
5
5
|
local available_key = KEYS[3]
|
6
6
|
local version_key = KEYS[4]
|
7
|
-
local
|
7
|
+
local unique_keys = KEYS[5]
|
8
|
+
local unique_digest = KEYS[6]
|
8
9
|
|
9
10
|
local job_id = ARGV[1]
|
10
11
|
local expiration = tonumber(ARGV[2])
|
@@ -29,7 +30,8 @@ if old_token then
|
|
29
30
|
end
|
30
31
|
----------------------------------------------------------------
|
31
32
|
|
32
|
-
redis.call('
|
33
|
+
redis.call('SADD', unique_keys, unique_digest)
|
34
|
+
redis.call('EXPIRE', exists_key, 5)
|
33
35
|
redis.call('DEL', grabbed_key)
|
34
36
|
redis.call('DEL', available_key)
|
35
37
|
|
data/redis/delete.lua
CHANGED
@@ -2,9 +2,11 @@ local exists_key = KEYS[1]
|
|
2
2
|
local grabbed_key = KEYS[2]
|
3
3
|
local available_key = KEYS[3]
|
4
4
|
local version_key = KEYS[4]
|
5
|
-
local
|
5
|
+
local unique_keys = KEYS[5]
|
6
|
+
local unique_digest = KEYS[6] -- TODO: Legacy support (Remove in v6.1)
|
6
7
|
|
7
8
|
redis.call('DEL', exists_key)
|
9
|
+
redis.call('SREM', unique_keys, unique_digest)
|
8
10
|
redis.call('DEL', grabbed_key)
|
9
11
|
redis.call('DEL', available_key)
|
10
12
|
redis.call('DEL', version_key)
|
@@ -0,0 +1,22 @@
|
|
1
|
+
-- redis.replicate_commands();
|
2
|
+
local unique_keys = KEYS[1]
|
3
|
+
local unique_digest = KEYS[2]
|
4
|
+
|
5
|
+
local exists_key = unique_digest .. ':EXISTS'
|
6
|
+
local grabbed_key = unique_digest .. ':GRABBED'
|
7
|
+
local available_key = unique_digest .. ':AVAILABLE'
|
8
|
+
local version_key = unique_digest .. ':VERSION'
|
9
|
+
local run_exists_key = unique_digest .. ':RUN:EXISTS'
|
10
|
+
local run_grabbed_key = unique_digest .. ':RUN:GRABBED'
|
11
|
+
local run_available_key = unique_digest .. ':RUN:AVAILABLE'
|
12
|
+
local run_version_key = unique_digest .. ':RUN:VERSION'
|
13
|
+
|
14
|
+
redis.call('SREM', unique_keys, unique_digest)
|
15
|
+
redis.call('DEL', exists_key)
|
16
|
+
redis.call('DEL', grabbed_key)
|
17
|
+
redis.call('DEL', available_key)
|
18
|
+
redis.call('DEL', version_key)
|
19
|
+
redis.call('DEL', run_exists_key)
|
20
|
+
redis.call('DEL', run_grabbed_key)
|
21
|
+
redis.call('DEL', run_available_key)
|
22
|
+
redis.call('DEL', run_version_key)
|
data/redis/signal.lua
CHANGED
@@ -2,12 +2,14 @@ local exists_key = KEYS[1]
|
|
2
2
|
local grabbed_key = KEYS[2]
|
3
3
|
local available_key = KEYS[3]
|
4
4
|
local version_key = KEYS[4]
|
5
|
-
local
|
5
|
+
local unique_keys = KEYS[5]
|
6
|
+
local unique_digest = KEYS[6] -- TODO: Legacy support (Remove in v6.1)
|
6
7
|
|
7
8
|
local token = ARGV[1]
|
8
9
|
local expiration = tonumber(ARGV[2])
|
9
10
|
|
10
11
|
redis.call('HDEL', grabbed_key, token)
|
12
|
+
redis.call('SREM', unique_keys, token)
|
11
13
|
local available_count = redis.call('LPUSH', available_key, token)
|
12
14
|
|
13
15
|
if expiration then
|
data/sidekiq-unique-jobs.gemspec
CHANGED
@@ -37,4 +37,6 @@ Gem::Specification.new do |spec|
|
|
37
37
|
spec.add_development_dependency 'yard', '~> 0.9'
|
38
38
|
spec.add_development_dependency 'gem-release', '~> 1.0'
|
39
39
|
spec.add_development_dependency 'awesome_print', '~> 1.8'
|
40
|
+
spec.add_development_dependency 'rack-test'
|
41
|
+
spec.add_development_dependency 'sinatra'
|
40
42
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-unique-jobs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.0.0.
|
4
|
+
version: 6.0.0.rc7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mikael Henriksson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-07-
|
11
|
+
date: 2018-07-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -162,6 +162,34 @@ dependencies:
|
|
162
162
|
- - "~>"
|
163
163
|
- !ruby/object:Gem::Version
|
164
164
|
version: '1.8'
|
165
|
+
- !ruby/object:Gem::Dependency
|
166
|
+
name: rack-test
|
167
|
+
requirement: !ruby/object:Gem::Requirement
|
168
|
+
requirements:
|
169
|
+
- - ">="
|
170
|
+
- !ruby/object:Gem::Version
|
171
|
+
version: '0'
|
172
|
+
type: :development
|
173
|
+
prerelease: false
|
174
|
+
version_requirements: !ruby/object:Gem::Requirement
|
175
|
+
requirements:
|
176
|
+
- - ">="
|
177
|
+
- !ruby/object:Gem::Version
|
178
|
+
version: '0'
|
179
|
+
- !ruby/object:Gem::Dependency
|
180
|
+
name: sinatra
|
181
|
+
requirement: !ruby/object:Gem::Requirement
|
182
|
+
requirements:
|
183
|
+
- - ">="
|
184
|
+
- !ruby/object:Gem::Version
|
185
|
+
version: '0'
|
186
|
+
type: :development
|
187
|
+
prerelease: false
|
188
|
+
version_requirements: !ruby/object:Gem::Requirement
|
189
|
+
requirements:
|
190
|
+
- - ">="
|
191
|
+
- !ruby/object:Gem::Version
|
192
|
+
version: '0'
|
165
193
|
description: Handles various types of unique jobs for Sidekiq
|
166
194
|
email:
|
167
195
|
- mikael@zoolutions.se
|
@@ -185,6 +213,7 @@ files:
|
|
185
213
|
- ".rubocop.yml"
|
186
214
|
- ".simplecov"
|
187
215
|
- ".travis.yml"
|
216
|
+
- ".yardopts"
|
188
217
|
- Appraisals
|
189
218
|
- CHANGELOG.md
|
190
219
|
- CODE_OF_CONDUCT.md
|
@@ -194,6 +223,8 @@ files:
|
|
194
223
|
- README.md
|
195
224
|
- Rakefile
|
196
225
|
- _config.yml
|
226
|
+
- assets/unique_digests_1.png
|
227
|
+
- assets/unique_digests_2.png
|
197
228
|
- bin/bench
|
198
229
|
- bin/uniquejobs
|
199
230
|
- examples/another_unique_job.rb
|
@@ -215,6 +246,9 @@ files:
|
|
215
246
|
- examples/spawn_simple_worker.rb
|
216
247
|
- examples/test_class.rb
|
217
248
|
- examples/unique_across_workers_job.rb
|
249
|
+
- examples/unique_job_on_conflict_raise.rb
|
250
|
+
- examples/unique_job_on_conflict_reject.rb
|
251
|
+
- examples/unique_job_on_conflict_reschedule.rb
|
218
252
|
- examples/unique_job_with_conditional_parameter.rb
|
219
253
|
- examples/unique_job_with_filter_method.rb
|
220
254
|
- examples/unique_job_with_nil_unique_args.rb
|
@@ -237,6 +271,7 @@ files:
|
|
237
271
|
- lib/sidekiq_unique_jobs/connection.rb
|
238
272
|
- lib/sidekiq_unique_jobs/constants.rb
|
239
273
|
- lib/sidekiq_unique_jobs/core_ext.rb
|
274
|
+
- lib/sidekiq_unique_jobs/digests.rb
|
240
275
|
- lib/sidekiq_unique_jobs/exceptions.rb
|
241
276
|
- lib/sidekiq_unique_jobs/lock/base_lock.rb
|
242
277
|
- lib/sidekiq_unique_jobs/lock/until_and_while_executing.rb
|
@@ -245,11 +280,17 @@ files:
|
|
245
280
|
- lib/sidekiq_unique_jobs/lock/until_expired.rb
|
246
281
|
- lib/sidekiq_unique_jobs/lock/while_executing.rb
|
247
282
|
- lib/sidekiq_unique_jobs/lock/while_executing_reject.rb
|
248
|
-
- lib/sidekiq_unique_jobs/lock/while_executing_requeue.rb
|
249
283
|
- lib/sidekiq_unique_jobs/locksmith.rb
|
250
284
|
- lib/sidekiq_unique_jobs/logging.rb
|
251
285
|
- lib/sidekiq_unique_jobs/middleware.rb
|
252
286
|
- lib/sidekiq_unique_jobs/normalizer.rb
|
287
|
+
- lib/sidekiq_unique_jobs/on_conflict.rb
|
288
|
+
- lib/sidekiq_unique_jobs/on_conflict/log.rb
|
289
|
+
- lib/sidekiq_unique_jobs/on_conflict/null_strategy.rb
|
290
|
+
- lib/sidekiq_unique_jobs/on_conflict/raise.rb
|
291
|
+
- lib/sidekiq_unique_jobs/on_conflict/reject.rb
|
292
|
+
- lib/sidekiq_unique_jobs/on_conflict/reschedule.rb
|
293
|
+
- lib/sidekiq_unique_jobs/on_conflict/strategy.rb
|
253
294
|
- lib/sidekiq_unique_jobs/options_with_fallback.rb
|
254
295
|
- lib/sidekiq_unique_jobs/scripts.rb
|
255
296
|
- lib/sidekiq_unique_jobs/server/middleware.rb
|
@@ -262,9 +303,14 @@ files:
|
|
262
303
|
- lib/sidekiq_unique_jobs/unlockable.rb
|
263
304
|
- lib/sidekiq_unique_jobs/util.rb
|
264
305
|
- lib/sidekiq_unique_jobs/version.rb
|
306
|
+
- lib/sidekiq_unique_jobs/web.rb
|
307
|
+
- lib/sidekiq_unique_jobs/web/helpers.rb
|
308
|
+
- lib/sidekiq_unique_jobs/web/views/unique_digest.erb
|
309
|
+
- lib/sidekiq_unique_jobs/web/views/unique_digests.erb
|
265
310
|
- redis/acquire_lock.lua
|
266
311
|
- redis/create.lua
|
267
312
|
- redis/delete.lua
|
313
|
+
- redis/delete_by_digest.lua
|
268
314
|
- redis/release_lock.lua
|
269
315
|
- redis/release_stale_locks.lua
|
270
316
|
- redis/signal.lua
|
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module SidekiqUniqueJobs
|
4
|
-
class Lock
|
5
|
-
class WhileExecutingRequeue < WhileExecuting
|
6
|
-
def lock
|
7
|
-
true
|
8
|
-
end
|
9
|
-
|
10
|
-
def execute
|
11
|
-
locksmith.lock(item[LOCK_TIMEOUT_KEY], raise: true) do
|
12
|
-
yield if block_given?
|
13
|
-
end
|
14
|
-
|
15
|
-
unlock
|
16
|
-
|
17
|
-
Sidekiq::Client.push(item) unless locksmith.locked?
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|