sidekiq-unique-jobs 6.0.16 → 6.0.19

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f068a7aab06c3cfd05f160b1c62075f5ad69d54e6f8868eec7724d402063b8d3
4
- data.tar.gz: 816085f3c9e851d0666f1df0ce4b99f520fdfd7217d22bb3b0875859500bfc1e
3
+ metadata.gz: 5e7339c3de1638fdd81aa8d3b90d0d09a6a18caa35fc0452efb97464853b4d3f
4
+ data.tar.gz: 40a8a95a053e13b2bee8fc34ecd7d684d24e9b109f00412bc0f72952d71c6386
5
5
  SHA512:
6
- metadata.gz: 28be9aadb717ba765bee3ac940571756da6b6acf08381cb4174a67b5b255715e60c25db310938adaa3879993ead802b693f89886d69aaaa45c2ba83d5bd9ad5c
7
- data.tar.gz: 391913c288892d8753d9b3ebb8da9220e4a1cad981297c7a401eb57ce2439b0257a4ee9b0f4b015b2386d3e65bbb86dc6a3e351323e13e2cebc902306f11019d
6
+ metadata.gz: 2c2c01161c61bf276964c68d637352769e31d02c10bcc7ae378731797c5729ef6f72c9dcfc0eaebc670143e3355703aa2869e13bda222a0251e2149e614d27c6
7
+ data.tar.gz: ed733e7b12b9411ace00f2c5161e3c7c84ca039988dade9cff4900cdf01c45e42a99d565b4abcd76ce6302ba26e1818bf4fb954ec357f9d98229e4bb37098a48
data/README.md CHANGED
@@ -32,6 +32,8 @@
32
32
  - [After Unlock Callback](#after-unlock-callback)
33
33
  - [Logging](#logging)
34
34
  - [Cleanup Dead Locks](#cleanup-dead-locks)
35
+ - [Other Sidekiq gems](#other-sidekiq-gems)
36
+ - [sidekiq-global_id](#sidekiq-global_id)
35
37
  - [Debugging](#debugging)
36
38
  - [Sidekiq Web](#sidekiq-web)
37
39
  - [Show Unique Digests](#show-unique-digests)
@@ -376,7 +378,7 @@ For sidekiq versions before 5.1 a `sidekiq_retries_exhausted` block is required
376
378
  ```ruby
377
379
  class MyWorker
378
380
  sidekiq_retries_exhausted do |msg, _ex|
379
- SidekiqUniqueJobs::Digests.del(digest: msg['unique_digest']) if msg['unique_digest']
381
+ SidekiqUniqueJobs::Digests.delete_by_digest(msg['unique_digest']) if msg['unique_digest']
380
382
  end
381
383
  end
382
384
  ```
@@ -387,11 +389,29 @@ Starting in v5.1, Sidekiq can also fire a global callback when a job dies:
387
389
  # this goes in your initializer
388
390
  Sidekiq.configure_server do |config|
389
391
  config.death_handlers << ->(job, _ex) do
390
- SidekiqUniqueJobs::Digests.del(digest: job['unique_digest']) if job['unique_digest']
392
+ SidekiqUniqueJobs::Digests.delete_by_digest(job['unique_digest']) if job['unique_digest']
391
393
  end
392
394
  end
393
395
  ```
394
396
 
397
+ ### Other Sidekiq gems
398
+
399
+ #### sidekiq-global_id
400
+
401
+ It was reported in [#235](https://github.com/mhenrixon/sidekiq-unique-jobs/issues/235) that the order of the Sidekiq middleware needs to be as follows.
402
+
403
+ ```ruby
404
+ Sidekiq.client_middleware do |chain|
405
+ chain.add Sidekiq::GlobalId::ClientMiddleware
406
+ chain.add SidekiqUniqueJobs::Client::Middleware
407
+ end
408
+
409
+ Sidekiq.server_middleware do |chain|
410
+ chain.add SidekiqUniqueJobs::Server::Middleware
411
+ chain.add Sidekiq::GlobalId::ServerMiddleware
412
+ end
413
+ ```
414
+
395
415
  ## Debugging
396
416
 
397
417
  There are several ways of removing keys that are stuck. The prefered way is by using the unique extension to `Sidekiq::Web`. The old console and command line versions still work but might be deprecated in the future. It is better to search for the digest itself and delete the keys matching that digest.
@@ -46,7 +46,10 @@ module SidekiqUniqueJobs
46
46
 
47
47
  no_commands do
48
48
  def console_class
49
- return IRB if RUBY_PLATFORM == JAVA
49
+ if RUBY_PLATFORM == "JAVA"
50
+ require "irb"
51
+ return IRB
52
+ end
50
53
 
51
54
  require "pry"
52
55
  Pry
@@ -55,13 +55,39 @@ module SidekiqUniqueJobs
55
55
  # @raise [ArgumentError] when both pattern and digest are nil
56
56
  # @return [Array<String>] with unique digests
57
57
  def del(digest: nil, pattern: nil, count: DEFAULT_COUNT)
58
+ warn("#{self}.#{__method__} has been deprecated and will be removed in a future version")
59
+
58
60
  return delete_by_pattern(pattern, count: count) if pattern
59
61
  return delete_by_digest(digest) if digest
60
62
 
61
63
  raise ArgumentError, "either digest or pattern need to be provided"
62
64
  end
63
65
 
64
- private
66
+ # Deletes unique digest either by a digest or pattern
67
+ #
68
+ # @param [String] digest the full digest to delete
69
+ def delete_by_digest(digest) # rubocop:disable Metrics/MethodLength
70
+ result, elapsed = timed do
71
+ Scripts.call(:delete_by_digest, nil, keys: [
72
+ UNIQUE_SET,
73
+ digest,
74
+ "#{digest}:EXISTS",
75
+ "#{digest}:GRABBED",
76
+ "#{digest}:AVAILABLE",
77
+ "#{digest}:VERSION",
78
+ "#{digest}:RUN:EXISTS",
79
+ "#{digest}:RUN:GRABBED",
80
+ "#{digest}:RUN:AVAILABLE",
81
+ "#{digest}:RUN:VERSION",
82
+ ])
83
+
84
+ count
85
+ end
86
+
87
+ log_info("#{__method__}(#{digest}) completed in #{elapsed}ms")
88
+
89
+ result
90
+ end
65
91
 
66
92
  # Deletes unique digests by pattern
67
93
  #
@@ -80,19 +106,7 @@ module SidekiqUniqueJobs
80
106
  result
81
107
  end
82
108
 
83
- # Get a total count of unique digests
84
- #
85
- # @param [String] digest a key pattern to match with
86
- def delete_by_digest(digest)
87
- result, elapsed = timed do
88
- Scripts.call(:delete_by_digest, nil, keys: [UNIQUE_SET, digest])
89
- count
90
- end
91
-
92
- log_info("#{__method__}(#{digest}) completed in #{elapsed}ms")
93
-
94
- result
95
- end
109
+ private
96
110
 
97
111
  def batch_delete(digests) # rubocop:disable Metrics/MethodLength
98
112
  redis do |conn|
@@ -118,11 +118,11 @@ module SidekiqUniqueJobs
118
118
  return log_warn("might need to be unlocked manually") unless unlock
119
119
 
120
120
  callback_safely
121
- item[JID_KEY]
122
121
  end
123
122
 
124
123
  def callback_safely
125
124
  callback&.call
125
+ item[JID_KEY]
126
126
  rescue StandardError
127
127
  log_warn("unlocked successfully but the #after_unlock callback failed!")
128
128
  raise
@@ -33,14 +33,13 @@ module SidekiqUniqueJobs
33
33
  # These jobs are locked in the server process not from the client
34
34
  # @yield to the worker class perform method
35
35
  def execute
36
- return strategy.call unless locksmith.lock(item[LOCK_TIMEOUT_KEY])
36
+ return strategy&.call unless locksmith.lock(item[LOCK_TIMEOUT_KEY])
37
37
 
38
38
  yield
39
+ unlock_with_callback
39
40
  rescue Exception # rubocop:disable Lint/RescueException
40
41
  delete!
41
42
  raise
42
- else
43
- unlock_with_callback
44
43
  end
45
44
 
46
45
  private
@@ -18,7 +18,7 @@ module SidekiqUniqueJobs
18
18
  @ttl = item[LOCK_EXPIRATION_KEY]
19
19
  @jid = item[JID_KEY]
20
20
  @unique_digest = item[UNIQUE_DIGEST_KEY]
21
- @lock_type = item[LOCK_KEY]
21
+ @lock_type = item[LOCK_KEY] || item[UNIQUE_KEY]
22
22
  @lock_type &&= @lock_type.to_sym
23
23
  @redis_pool = redis_pool
24
24
  end
@@ -35,7 +35,7 @@ module SidekiqUniqueJobs
35
35
 
36
36
  # Delete the keys belonging to the job
37
37
  def delete_lock
38
- Scripts.call(:delete_by_digest, nil, keys: [UNIQUE_SET, unique_digest])
38
+ SidekiqUniqueJobs::Digests.delete_by_digest(unique_digest)
39
39
  end
40
40
  end
41
41
  end
@@ -29,7 +29,7 @@ module SidekiqUniqueJobs
29
29
  # The Sidekiq::Worker implementation
30
30
  # @return [Sidekiq::Worker]
31
31
  def worker_class
32
- @_worker_class ||= worker_class_constantize # rubocop:disable Naming/MemoizedInstanceVariableName
32
+ @_worker_class ||= worker_class_constantize(@worker_class) # rubocop:disable Naming/MemoizedInstanceVariableName
33
33
  end
34
34
 
35
35
  # The hook to call after a successful unlock
@@ -42,8 +42,9 @@ module SidekiqUniqueJobs
42
42
  # failing back to the original argument when the constant can't be found
43
43
  #
44
44
  # @return [Sidekiq::Worker]
45
- def worker_class_constantize(klazz = @worker_class)
46
- return klazz unless klazz.is_a?(String)
45
+ def worker_class_constantize(klazz)
46
+ return klazz.class if klazz.is_a?(Sidekiq::Worker) # sidekiq v6.x
47
+ return klazz unless klazz.is_a?(String)
47
48
 
48
49
  Object.const_get(klazz)
49
50
  rescue NameError => ex
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SidekiqUniqueJobs
4
- VERSION = "6.0.16"
4
+ VERSION = "6.0.19"
5
5
  end
@@ -7,7 +7,7 @@ module SidekiqUniqueJobs
7
7
  # @author Mikael Henriksson <mikael@zoolutions.se>
8
8
  #
9
9
  class VersionCheck
10
- PATTERN = /(?<operator1>[<>=]+)?\s?(?<version1>(\d+.?)+)(\s+&&\s+)?(?<operator2>[<>=]+)?\s?(?<version2>(\d+.?)+)?/m.freeze # rubocop:disable Metrics/LineLength
10
+ PATTERN = /(?<operator1>[<>=]+)?\s?(?<version1>(\d+.?)+)(\s+&&\s+)?(?<operator2>[<>=]+)?\s?(?<version2>(\d+.?)+)?/m.freeze # rubocop:disable Layout/LineLength
11
11
 
12
12
  #
13
13
  # Checks if a version is consrtaint is satisfied
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  begin
4
+ require "delegate"
5
+ require "rack"
4
6
  require "sidekiq/web"
5
- rescue LoadError # rubocop:disable Lint/HandleExceptions
7
+ rescue LoadError # rubocop:disable Lint/SuppressedException
6
8
  # client-only usage
7
9
  end
8
10
 
@@ -32,7 +34,7 @@ module SidekiqUniqueJobs
32
34
  end
33
35
 
34
36
  app.get "/unique_digests/delete_all" do
35
- SidekiqUniqueJobs::Digests.del(pattern: "*", count: SidekiqUniqueJobs::Digests.count)
37
+ SidekiqUniqueJobs::Digests.delete_by_pattern("*", count: SidekiqUniqueJobs::Digests.count)
36
38
  redirect_to :unique_digests
37
39
  end
38
40
 
@@ -44,7 +46,7 @@ module SidekiqUniqueJobs
44
46
  end
45
47
 
46
48
  app.get "/unique_digests/:digest/delete" do
47
- SidekiqUniqueJobs::Digests.del(digest: params[:digest])
49
+ SidekiqUniqueJobs::Digests.delete_by_digest(params[:digest])
48
50
  redirect_to :unique_digests
49
51
  end
50
52
  end
@@ -1,15 +1,14 @@
1
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'
2
+ local unique_keys = KEYS[1]
3
+ local unique_digest = KEYS[2]
4
+ local exists_key = KEYS[3]
5
+ local grabbed_key = KEYS[4]
6
+ local available_key = KEYS[5]
7
+ local version_key = KEYS[6]
8
+ local run_exists_key = KEYS[7]
9
+ local run_grabbed_key = KEYS[8]
10
+ local run_available_key = KEYS[9]
11
+ local run_version_key = KEYS[10]
13
12
 
14
13
  local count = redis.call('SREM', unique_keys, unique_digest)
15
14
  redis.call('DEL', exists_key)
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.16
4
+ version: 6.0.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mikael Henriksson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-22 00:00:00.000000000 Z
11
+ date: 2020-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -296,13 +296,7 @@ metadata:
296
296
  documentation_uri: https://mhenrixon.github.io/sidekiq-unique-jobs
297
297
  source_code_uri: https://github.com/mhenrixon/sidekiq-unique-jobs
298
298
  changelog_uri: https://github.com/mhenrixon/sidekiq-unique-jobs/CHANGELOG.md
299
- post_install_message: |
300
- Please either install v6.0.19 or change your `unique: :lock_type` to `lock: :lock_type`
301
- This version will not unlock otherwise.
302
-
303
- See: https://github.com/mhenrixon/sidekiq-unique-jobs/issues/471
304
- And: https://github.com/mhenrixon/sidekiq-unique-jobs/pull/435
305
- And: https://github.com/mhenrixon/sidekiq-unique-jobs/issues/471
299
+ post_install_message:
306
300
  rdoc_options: []
307
301
  require_paths:
308
302
  - lib