sidekiq-unique-jobs 7.1.8 → 8.0.3

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 (74) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +331 -2
  3. data/README.md +28 -25
  4. data/lib/sidekiq_unique_jobs/batch_delete.rb +7 -10
  5. data/lib/sidekiq_unique_jobs/changelog.rb +7 -17
  6. data/lib/sidekiq_unique_jobs/cli.rb +33 -8
  7. data/lib/sidekiq_unique_jobs/config.rb +5 -0
  8. data/lib/sidekiq_unique_jobs/connection.rb +4 -7
  9. data/lib/sidekiq_unique_jobs/constants.rb +1 -0
  10. data/lib/sidekiq_unique_jobs/core_ext.rb +1 -1
  11. data/lib/sidekiq_unique_jobs/digests.rb +7 -17
  12. data/lib/sidekiq_unique_jobs/exceptions.rb +3 -3
  13. data/lib/sidekiq_unique_jobs/expiring_digests.rb +14 -0
  14. data/lib/sidekiq_unique_jobs/job.rb +6 -1
  15. data/lib/sidekiq_unique_jobs/key.rb +13 -8
  16. data/lib/sidekiq_unique_jobs/lock/until_executed.rb +6 -1
  17. data/lib/sidekiq_unique_jobs/lock/until_executing.rb +4 -0
  18. data/lib/sidekiq_unique_jobs/lock/until_expired.rb +3 -1
  19. data/lib/sidekiq_unique_jobs/lock/while_executing.rb +5 -3
  20. data/lib/sidekiq_unique_jobs/lock.rb +32 -12
  21. data/lib/sidekiq_unique_jobs/lock_args.rb +19 -15
  22. data/lib/sidekiq_unique_jobs/lock_config.rb +6 -6
  23. data/lib/sidekiq_unique_jobs/lock_digest.rb +7 -7
  24. data/lib/sidekiq_unique_jobs/lock_info.rb +2 -2
  25. data/lib/sidekiq_unique_jobs/lock_timeout.rb +4 -4
  26. data/lib/sidekiq_unique_jobs/lock_ttl.rb +4 -4
  27. data/lib/sidekiq_unique_jobs/lock_type.rb +37 -0
  28. data/lib/sidekiq_unique_jobs/locksmith.rb +36 -13
  29. data/lib/sidekiq_unique_jobs/logging.rb +14 -0
  30. data/lib/sidekiq_unique_jobs/lua/delete.lua +3 -6
  31. data/lib/sidekiq_unique_jobs/lua/delete_by_digest.lua +3 -6
  32. data/lib/sidekiq_unique_jobs/lua/delete_job_by_digest.lua +1 -1
  33. data/lib/sidekiq_unique_jobs/lua/find_digest_in_queues.lua +1 -1
  34. data/lib/sidekiq_unique_jobs/lua/lock.lua +16 -10
  35. data/lib/sidekiq_unique_jobs/lua/lock_until_expired.lua +92 -0
  36. data/lib/sidekiq_unique_jobs/lua/locked.lua +1 -1
  37. data/lib/sidekiq_unique_jobs/lua/queue.lua +1 -1
  38. data/lib/sidekiq_unique_jobs/lua/reap_orphans.lua +33 -8
  39. data/lib/sidekiq_unique_jobs/lua/shared/_common.lua +1 -6
  40. data/lib/sidekiq_unique_jobs/lua/shared/_delete_from_sorted_set.lua +1 -0
  41. data/lib/sidekiq_unique_jobs/lua/shared/_find_digest_in_process_set.lua +1 -1
  42. data/lib/sidekiq_unique_jobs/lua/unlock.lua +16 -15
  43. data/lib/sidekiq_unique_jobs/lua/update_version.lua +1 -1
  44. data/lib/sidekiq_unique_jobs/lua/upgrade.lua +1 -3
  45. data/lib/sidekiq_unique_jobs/middleware/client.rb +2 -0
  46. data/lib/sidekiq_unique_jobs/middleware/server.rb +2 -0
  47. data/lib/sidekiq_unique_jobs/middleware.rb +4 -4
  48. data/lib/sidekiq_unique_jobs/on_conflict/reject.rb +0 -43
  49. data/lib/sidekiq_unique_jobs/on_conflict/reschedule.rb +3 -3
  50. data/lib/sidekiq_unique_jobs/options_with_fallback.rb +4 -4
  51. data/lib/sidekiq_unique_jobs/orphans/lua_reaper.rb +1 -1
  52. data/lib/sidekiq_unique_jobs/orphans/manager.rb +6 -13
  53. data/lib/sidekiq_unique_jobs/orphans/ruby_reaper.rb +95 -16
  54. data/lib/sidekiq_unique_jobs/redis/sorted_set.rb +9 -2
  55. data/lib/sidekiq_unique_jobs/redis/string.rb +3 -1
  56. data/lib/sidekiq_unique_jobs/reflections.rb +1 -1
  57. data/lib/sidekiq_unique_jobs/script/caller.rb +14 -8
  58. data/lib/sidekiq_unique_jobs/server.rb +0 -1
  59. data/lib/sidekiq_unique_jobs/sidekiq_unique_ext.rb +1 -1
  60. data/lib/sidekiq_unique_jobs/sidekiq_unique_jobs.rb +14 -4
  61. data/lib/sidekiq_unique_jobs/sidekiq_worker_methods.rb +40 -21
  62. data/lib/sidekiq_unique_jobs/testing.rb +53 -21
  63. data/lib/sidekiq_unique_jobs/timer_task.rb +266 -45
  64. data/lib/sidekiq_unique_jobs/timing.rb +1 -1
  65. data/lib/sidekiq_unique_jobs/upgrade_locks.rb +11 -14
  66. data/lib/sidekiq_unique_jobs/version.rb +1 -1
  67. data/lib/sidekiq_unique_jobs/web/helpers.rb +15 -3
  68. data/lib/sidekiq_unique_jobs/web/views/changelogs.erb +44 -38
  69. data/lib/sidekiq_unique_jobs/web/views/lock.erb +5 -3
  70. data/lib/sidekiq_unique_jobs/web/views/locks.erb +42 -37
  71. data/lib/sidekiq_unique_jobs/web.rb +26 -8
  72. data/lib/sidekiq_unique_jobs.rb +2 -0
  73. data/lib/tasks/changelog.rake +1 -1
  74. metadata +16 -43
@@ -7,9 +7,11 @@
7
7
  <div class="col-sm-7 table-responsive">
8
8
  <% if @lock.info.none? %>
9
9
  <h3>No Lock Information Available</h3>
10
- <p>To use it turn the following setting on:
11
- <code>SidekiqUniqueJobs.config.lock_info = true</code>
12
- </p>
10
+ <% unless SidekiqUniqueJobs.config.lock_info %>
11
+ <p>To use it turn the following setting on:
12
+ <code>SidekiqUniqueJobs.config.lock_info = true</code>
13
+ </p>
14
+ <% end %>
13
15
  <% else %>
14
16
  <table class="table table-striped table-bordered table-white table-hover">
15
17
  <caption>Information about lock</caption>
@@ -7,48 +7,53 @@
7
7
  <form action="<%= root_path %>locks" class="form form-inline" method="get">
8
8
  <%= csrf_tag %>
9
9
  <input name="filter" class="form-control" type="text" value="<%= @filter %>" />
10
+
10
11
  <button class="btn btn-default" type="submit">
11
- <%= t('Filter') %>
12
+ <%= t('Filter') %>
12
13
  </button>
14
+
13
15
  </form>
16
+
14
17
  <% if @locks.any? && @total_size > @count %>
15
- <div class="col-sm-4">
16
- <%= erb unique_template(:_paging), locals: { url: "#{root_path}locks" } %>
17
- </div>
18
+ <div class="col-sm-4">
19
+ <%= erb unique_template(:_paging), locals: { url: "#{root_path}locks" } %>
20
+ </div>
18
21
  <% end %>
19
22
  </header>
23
+
20
24
  <% if @locks.any? %>
21
- <div class="table_container">
22
- <table class="table table-striped table-bordered table-hover">
23
- <thead>
24
- <tr>
25
- <th><%= t('Delete') %></th>
26
- <th><%= t('Digest') %></th>
27
- <th><%= t('Lock') %></th>
28
- <th><%= t('Locks') %></th>
29
- <th><%= t('Since') %></th>
30
- </tr>
31
- </thead>
32
- <% @locks.each do |lock| %>
33
- <tbody>
34
- <tr class="lock-row">
35
- <td>
36
- <form action="<%= root_path %>locks/<%= lock.key %>/delete" method="get">
37
- <%= csrf_tag %>
38
- <input name="lock" value="<%= h lock.key %>" type="hidden" />
39
- <input class="btn btn-danger btn-xs" type="submit" name="delete" value="<%= t('Delete') %>" data-confirm="<%= t('AreYouSure') %>" />
40
- </form>
41
- </td>
42
- <td><a href="<%= root_path %>locks/<%= lock.key %>"><%= lock.key %></a></td>
43
- <td><%= lock.info["lock"] %></td>
44
- <td><%= lock.locked.count %></td>
45
- <td><%= safe_relative_time(lock.created_at) %></td>
46
- </tr>
47
- </tbody>
48
- <% end %>
49
- </table>
50
- <form action="<%= root_path %>locks/delete_all" method="get">
51
- <input class="btn btn-danger btn-xs" type="submit" name="delete_all" value="<%= t('DeleteAll') %>" data-confirm="<%= t('AreYouSure') %>" />
52
- </form>
53
- </div>
25
+ <div class="table_container">
26
+ <table class="table table-striped table-bordered table-hover">
27
+ <thead>
28
+ <tr>
29
+ <th><%= t('Delete') %></th>
30
+ <th><%= t('Digest') %></th>
31
+ <th><%= t('Lock') %></th>
32
+ <th><%= t('Locks') %></th>
33
+ <th><%= t('Since') %></th>
34
+ </tr>
35
+ </thead>
36
+ <% @locks.each do |lock| %>
37
+ <tbody>
38
+ <tr class="lock-row">
39
+ <td>
40
+ <form action="<%= root_path %>locks/<%= lock.key %>/delete" method="get">
41
+ <%= csrf_tag %>
42
+ <input name="lock" value="<%= h lock.key %>" type="hidden" />
43
+ <input class="btn btn-danger btn-xs" type="submit" name="delete" value="<%= t('Delete') %>" data-confirm="<%= t('AreYouSure') %>" />
44
+ </form>
45
+ </td>
46
+ <td><a href="<%= root_path %>locks/<%= lock.key %>"><%= lock.key %></a></td>
47
+ <td><%= lock.info["lock"] %></td>
48
+ <td><%= lock.locked.count %></td>
49
+ <td><%= safe_relative_time(lock.created_at) %></td>
50
+ </tr>
51
+ </tbody>
52
+ <% end %>
53
+ </table>
54
+
55
+ <form action="<%= root_path %>locks/delete_all" method="get">
56
+ <input class="btn btn-danger btn-xs" type="submit" name="delete_all" value="<%= t('DeleteAll') %>" data-confirm="<%= t('AreYouSure') %>" />
57
+ </form>
58
+ </div>
54
59
  <% end %>
@@ -5,10 +5,9 @@ require_relative "web/helpers"
5
5
  module SidekiqUniqueJobs
6
6
  # Utility module to help manage unique keys in redis.
7
7
  # Useful for deleting keys that for whatever reason wasn't deleted
8
- #
9
8
  # @author Mikael Henriksson <mikael@mhenrixon.com>
10
9
  module Web
11
- def self.registered(app) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
10
+ def self.registered(app) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
12
11
  app.helpers do
13
12
  include Web::Helpers
14
13
  end
@@ -17,8 +16,8 @@ module SidekiqUniqueJobs
17
16
  @filter = params[:filter] || "*"
18
17
  @filter = "*" if @filter == ""
19
18
  @count = (params[:count] || 100).to_i
20
- @current_cursor = params[:cursor]
21
- @prev_cursor = params[:prev_cursor]
19
+ @current_cursor = params[:cursor].to_i
20
+ @prev_cursor = params[:prev_cursor].to_i
22
21
  @total_size, @next_cursor, @changelogs = changelog.page(
23
22
  cursor: @current_cursor,
24
23
  pattern: @filter,
@@ -37,8 +36,8 @@ module SidekiqUniqueJobs
37
36
  @filter = params[:filter] || "*"
38
37
  @filter = "*" if @filter == ""
39
38
  @count = (params[:count] || 100).to_i
40
- @current_cursor = params[:cursor]
41
- @prev_cursor = params[:prev_cursor]
39
+ @current_cursor = params[:cursor].to_i
40
+ @prev_cursor = params[:prev_cursor].to_i
42
41
 
43
42
  @total_size, @next_cursor, @locks = digests.page(
44
43
  cursor: @current_cursor,
@@ -49,8 +48,25 @@ module SidekiqUniqueJobs
49
48
  erb(unique_template(:locks))
50
49
  end
51
50
 
51
+ app.get "/expiring_locks" do
52
+ @filter = params[:filter] || "*"
53
+ @filter = "*" if @filter == ""
54
+ @count = (params[:count] || 100).to_i
55
+ @current_cursor = params[:cursor].to_i
56
+ @prev_cursor = params[:prev_cursor].to_i
57
+
58
+ @total_size, @next_cursor, @locks = expiring_digests.page(
59
+ cursor: @current_cursor,
60
+ pattern: @filter,
61
+ page_size: @count,
62
+ )
63
+
64
+ erb(unique_template(:locks))
65
+ end
66
+
52
67
  app.get "/locks/delete_all" do
53
68
  digests.delete_by_pattern("*", count: digests.count)
69
+ expiring_digests.delete_by_pattern("*", count: digests.count)
54
70
  redirect_to :locks
55
71
  end
56
72
 
@@ -63,6 +79,7 @@ module SidekiqUniqueJobs
63
79
 
64
80
  app.get "/locks/:digest/delete" do
65
81
  digests.delete_by_digest(params[:digest])
82
+ expiring_digests.delete_by_digest(params[:digest])
66
83
  redirect_to :locks
67
84
  end
68
85
 
@@ -82,8 +99,9 @@ begin
82
99
  require "sidekiq/web" unless defined?(Sidekiq::Web)
83
100
 
84
101
  Sidekiq::Web.register(SidekiqUniqueJobs::Web)
85
- Sidekiq::Web.tabs["Locks"] = "locks"
86
- Sidekiq::Web.tabs["Changelogs"] = "changelogs"
102
+ Sidekiq::Web.tabs["Locks"] = "locks"
103
+ Sidekiq::Web.tabs["Expiring Locks"] = "expiring_locks"
104
+ Sidekiq::Web.tabs["Changelogs"] = "changelogs"
87
105
  Sidekiq::Web.settings.locales << File.join(File.dirname(__FILE__), "locales")
88
106
  rescue NameError, LoadError => ex
89
107
  SidekiqUniqueJobs.logger.error(ex)
@@ -49,6 +49,7 @@ require "sidekiq_unique_jobs/cli"
49
49
  require "sidekiq_unique_jobs/core_ext"
50
50
  require "sidekiq_unique_jobs/lock_timeout"
51
51
  require "sidekiq_unique_jobs/lock_ttl"
52
+ require "sidekiq_unique_jobs/lock_type"
52
53
  require "sidekiq_unique_jobs/lock_args"
53
54
  require "sidekiq_unique_jobs/lock_digest"
54
55
  require "sidekiq_unique_jobs/unlockable"
@@ -72,6 +73,7 @@ require "sidekiq_unique_jobs/sidekiq_unique_ext"
72
73
  require "sidekiq_unique_jobs/on_conflict"
73
74
  require "sidekiq_unique_jobs/changelog"
74
75
  require "sidekiq_unique_jobs/digests"
76
+ require "sidekiq_unique_jobs/expiring_digests"
75
77
 
76
78
  require "sidekiq_unique_jobs/config"
77
79
  require "sidekiq_unique_jobs/sidekiq_unique_jobs"
@@ -17,7 +17,7 @@ COMMIT_CHANGELOG_CMD = "git commit -a -m 'Update changelog'"
17
17
  desc "Generate a Changelog"
18
18
  task :changelog do
19
19
  sh("git checkout main")
20
- sh(*CHANGELOG_CMD.push(ENV["CHANGELOG_GITHUB_TOKEN"]))
20
+ sh(*CHANGELOG_CMD.push(ENV.fetch("CHANGELOG_GITHUB_TOKEN", nil)))
21
21
  sh(ADD_CHANGELOG_CMD)
22
22
  sh(COMMIT_CHANGELOG_CMD)
23
23
  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: 7.1.8
4
+ version: 8.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mikael Henriksson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-08 00:00:00.000000000 Z
11
+ date: 2023-07-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: brpoplpush-redis_script
@@ -56,27 +56,27 @@ dependencies:
56
56
  requirements:
57
57
  - - ">="
58
58
  - !ruby/object:Gem::Version
59
- version: '5.0'
59
+ version: 7.0.0
60
60
  - - "<"
61
61
  - !ruby/object:Gem::Version
62
- version: '8.0'
62
+ version: 8.0.0
63
63
  type: :runtime
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - ">="
68
68
  - !ruby/object:Gem::Version
69
- version: '5.0'
69
+ version: 7.0.0
70
70
  - - "<"
71
71
  - !ruby/object:Gem::Version
72
- version: '8.0'
72
+ version: 8.0.0
73
73
  - !ruby/object:Gem::Dependency
74
74
  name: thor
75
75
  requirement: !ruby/object:Gem::Requirement
76
76
  requirements:
77
77
  - - ">="
78
78
  - !ruby/object:Gem::Version
79
- version: '0.20'
79
+ version: '1.0'
80
80
  - - "<"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '3.0'
@@ -86,7 +86,7 @@ dependencies:
86
86
  requirements:
87
87
  - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: '0.20'
89
+ version: '1.0'
90
90
  - - "<"
91
91
  - !ruby/object:Gem::Version
92
92
  version: '3.0'
@@ -116,6 +116,7 @@ files:
116
116
  - lib/sidekiq_unique_jobs/deprecation.rb
117
117
  - lib/sidekiq_unique_jobs/digests.rb
118
118
  - lib/sidekiq_unique_jobs/exceptions.rb
119
+ - lib/sidekiq_unique_jobs/expiring_digests.rb
119
120
  - lib/sidekiq_unique_jobs/job.rb
120
121
  - lib/sidekiq_unique_jobs/json.rb
121
122
  - lib/sidekiq_unique_jobs/key.rb
@@ -136,6 +137,7 @@ files:
136
137
  - lib/sidekiq_unique_jobs/lock_info.rb
137
138
  - lib/sidekiq_unique_jobs/lock_timeout.rb
138
139
  - lib/sidekiq_unique_jobs/lock_ttl.rb
140
+ - lib/sidekiq_unique_jobs/lock_type.rb
139
141
  - lib/sidekiq_unique_jobs/locksmith.rb
140
142
  - lib/sidekiq_unique_jobs/logging.rb
141
143
  - lib/sidekiq_unique_jobs/logging/middleware_context.rb
@@ -144,6 +146,7 @@ files:
144
146
  - lib/sidekiq_unique_jobs/lua/delete_job_by_digest.lua
145
147
  - lib/sidekiq_unique_jobs/lua/find_digest_in_queues.lua
146
148
  - lib/sidekiq_unique_jobs/lua/lock.lua
149
+ - lib/sidekiq_unique_jobs/lua/lock_until_expired.lua
147
150
  - lib/sidekiq_unique_jobs/lua/locked.lua
148
151
  - lib/sidekiq_unique_jobs/lua/queue.lua
149
152
  - lib/sidekiq_unique_jobs/lua/reap_orphans.lua
@@ -211,42 +214,12 @@ files:
211
214
  - lib/sidekiq_unique_jobs/web/views/lock.erb
212
215
  - lib/sidekiq_unique_jobs/web/views/locks.erb
213
216
  - lib/tasks/changelog.rake
214
- homepage: https://mhenrixon.github.io/sidekiq-unique-jobs
217
+ homepage: https://github.com/mhenrixon/sidekiq-unique-jobs
215
218
  licenses:
216
219
  - MIT
217
220
  metadata:
218
- homepage_uri: https://mhenrixon.github.io/sidekiq-unique-jobs
219
- bug_tracker_uri: https://github.com/mhenrixon/sidekiq-unique-jobs/issues
220
- documentation_uri: https://mhenrixon.github.io/sidekiq-unique-jobs
221
- source_code_uri: https://github.com/mhenrixon/sidekiq-unique-jobs
222
- changelog_uri: https://github.com/mhenrixon/sidekiq-unique-jobs/blob/master/CHANGELOG.md
223
- post_install_message: |
224
- IMPORTANT!
225
-
226
- Automatic configuration of the sidekiq middleware is no longer done.
227
- Please see: https://github.com/mhenrixon/sidekiq-unique-jobs/blob/master/README.md#add-the-middleware
228
-
229
- This version deprecated the following sidekiq_options
230
-
231
- - sidekiq_options lock_args: :method_name
232
-
233
- It is now configured with:
234
-
235
- - sidekiq_options lock_args_method: :method_name
236
-
237
- This is also true for `Sidekiq.default_worker_options`
238
-
239
- We also deprecated the global configuration options:
240
- - default_lock_ttl
241
- - default_lock_ttl=
242
- - default_lock_timeout
243
- - default_lock_timeout=
244
-
245
- The new methods to use are:
246
- - lock_ttl
247
- - lock_ttl=
248
- - lock_timeout
249
- - lock_timeout=
221
+ rubygems_mfa_required: 'true'
222
+ post_install_message:
250
223
  rdoc_options: []
251
224
  require_paths:
252
225
  - lib
@@ -254,14 +227,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
254
227
  requirements:
255
228
  - - ">="
256
229
  - !ruby/object:Gem::Version
257
- version: '2.5'
230
+ version: '2.7'
258
231
  required_rubygems_version: !ruby/object:Gem::Requirement
259
232
  requirements:
260
233
  - - ">="
261
234
  - !ruby/object:Gem::Version
262
235
  version: '0'
263
236
  requirements: []
264
- rubygems_version: 3.2.28
237
+ rubygems_version: 3.4.15
265
238
  signing_key:
266
239
  specification_version: 4
267
240
  summary: Sidekiq middleware that prevents duplicates jobs