sidekiq-ultimate 0.0.1.alpha.16 → 0.0.1.alpha.17

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0a6a20e18e56f28bcbdeb1dcdba03a5978dce973551cd163262ceeb75c567435
4
- data.tar.gz: c909bbef5ec8cbe2675347ad525c99774bcb068208d7d9f4fc091668cf8a6162
3
+ metadata.gz: f6f524ab4f87ba7a8c687046e2ef2893b29a709d35765620df2c212bb5325cc2
4
+ data.tar.gz: 7be36332d763fb27106eb4212a9454aa54b665df630ec27df90c777fc0c7638b
5
5
  SHA512:
6
- metadata.gz: 8eea4a7d75983ab878774639dab1890bf61c233c05aa9572ad7aa69809b6aff002985057188a152b19f3f011e8b23b0468b2ee9d26e46a33f0378ca192773953
7
- data.tar.gz: 1969844b087f9c57cf41dade645649a8c8e64be29e13ac76826a3ac9a6c144bde2231f4e8bd71fb83f9e8b47d6f34a3b77d31c95835dd844b944bd28b6802b32
6
+ metadata.gz: ce2c291e7b34d21adb5c9d1c57fb48208eb385714a9650233519f507d878ecc6efbb6089eb284e149ce262ea5e1b04e5f586628d5143bb42d4617e3e0729f53c
7
+ data.tar.gz: f4aca94bb0798554e6fcfda6617af4c9ec6f905ea31dcdceff1c8fb450523f9c423060630cba0d870b5ef03ad9b1ccf9fb19dda1c8587bfe9f1c35cbad8480c0
@@ -4,8 +4,6 @@ require "monitor"
4
4
 
5
5
  require "concurrent/utility/monotonic_time"
6
6
 
7
- require "sidekiq/ultimate/debugging"
8
-
9
7
  module Sidekiq
10
8
  module Ultimate
11
9
  # List that tracks when elements were added and enumerates over those not
@@ -33,7 +31,6 @@ module Sidekiq
33
31
  # @private
34
32
  class ExpirableSet
35
33
  include Enumerable
36
- include Debugging
37
34
 
38
35
  # Create a new ExpirableSet instance.
39
36
  def initialize
@@ -41,6 +38,11 @@ module Sidekiq
41
38
  @mon = Monitor.new
42
39
  end
43
40
 
41
+ # Allow implicit coercion to Array:
42
+ #
43
+ # ["x"] + ExpirableSet.new.add("y", :ttl => 10) # => ["x", "y"]
44
+ #
45
+ # @return [Array]
44
46
  alias to_ary to_a
45
47
 
46
48
  # Adds given element into the set.
@@ -53,15 +55,9 @@ module Sidekiq
53
55
  expires_at = Concurrent.monotonic_time + ttl
54
56
 
55
57
  # do not allow decrease element's expiry
56
- if @set[element] && @set[element] >= expires_at
57
- debug! do
58
- "#{element}'s expiry kept as is: #{@set[element]}; " \
59
- "proposed expiry was: #{expires_at}"
60
- end
61
- else
62
- @set[element] = expires_at
63
- debug! { "#{element}'s expiry set to: #{expires_at}" }
64
- end
58
+ break if @set.key?(element) && expires_at <= @set[element]
59
+
60
+ @set[element] = expires_at
65
61
  end
66
62
 
67
63
  self
@@ -78,10 +74,7 @@ module Sidekiq
78
74
 
79
75
  @mon.synchronize do
80
76
  horizon = Concurrent.monotonic_time
81
-
82
- debug! { "Yielding elements above #{horizon} horizon" }
83
-
84
- @set.each { |k, v| v < horizon ? @set.delete(k) : yield(k) }
77
+ @set.each { |k, v| yield(k) if horizon <= v }
85
78
  end
86
79
 
87
80
  self
@@ -2,7 +2,6 @@
2
2
 
3
3
  require "sidekiq/throttled"
4
4
 
5
- require "sidekiq/ultimate/debugging"
6
5
  require "sidekiq/ultimate/expirable_set"
7
6
  require "sidekiq/ultimate/queue_name"
8
7
  require "sidekiq/ultimate/resurrector"
@@ -12,33 +11,32 @@ module Sidekiq
12
11
  module Ultimate
13
12
  # Throttled reliable fetcher implementing reliable queue pattern.
14
13
  class Fetch
15
- include Debugging
16
-
17
- # Timeout to sleep between fetch retries in case of no job received.
14
+ # Delay between fetch retries in case of no job received.
18
15
  TIMEOUT = 2
19
16
 
17
+ # Delay between queue poll attempts if last poll returned no jobs for it.
20
18
  QUEUE_TIMEOUT = 5
21
19
 
22
- # Timeout to sleep between queue fetch attempts in case if last job
23
- # of it was throttled.
20
+ # Delay between queue poll attempts if it's last job was throttled.
24
21
  THROTTLE_TIMEOUT = 15
25
22
 
26
23
  def initialize(options)
27
24
  @exhausted = ExpirableSet.new
28
25
 
26
+ @debug = ENV["DEBUG_SIDEKIQ_ULTIMATE"] ? {} : nil
29
27
  @strict = options[:strict] ? true : false
30
28
  @queues = options[:queues].map { |name| QueueName.new(name) }
31
29
 
32
30
  @queues.uniq! if @strict
33
31
  end
34
32
 
33
+ # @return [UnitOfWork] if work can be processed
35
34
  def retrieve_work
36
35
  work = retrieve
37
36
 
38
37
  if work&.throttled?
39
38
  work.requeue_throttled
40
39
 
41
- debug! { "Queue #{work.queue} got throttled job." }
42
40
  @exhausted.add(work.queue, :ttl => THROTTLE_TIMEOUT)
43
41
 
44
42
  return nil
@@ -61,28 +59,26 @@ module Sidekiq
61
59
  def retrieve
62
60
  Sidekiq.redis do |redis|
63
61
  queues.each do |queue|
62
+ debug!(queue)
63
+
64
64
  job = redis.rpoplpush(queue.pending, queue.inproc)
65
65
  return UnitOfWork.new(queue, job) if job
66
66
 
67
- debug! { "Queue #{queue} has no job." }
68
67
  @exhausted.add(queue, :ttl => QUEUE_TIMEOUT)
69
68
  end
70
69
  end
71
70
 
72
- debug! { "No jobs in any queues." }
73
-
74
71
  sleep TIMEOUT
75
72
  nil
76
73
  end
77
74
 
78
75
  def queues
79
- queues = @strict ? @queues : @queues.shuffle.uniq
80
- queues -= @exhausted_queues.to_a
81
- queues -= paused_queues unless queues.empty?
76
+ queues = (@strict ? @queues : @queues.shuffle.uniq) - @exhausted.to_a
82
77
 
83
- debug! { "Queues to poll: #{queues.map(&:to_s).join(', ')}" }
78
+ # Avoid calling heavier `paused_queue` if there's nothing to filter out
79
+ return queues if queues.empty?
84
80
 
85
- queues
81
+ queues - paused_queues
86
82
  end
87
83
 
88
84
  def paused_queues
@@ -90,6 +86,18 @@ module Sidekiq
90
86
  instance_variable_get(:@paused_queues).
91
87
  map { |q| QueueName[q] }
92
88
  end
89
+
90
+ def debug!(queue)
91
+ return unless @debug
92
+
93
+ previous, @debug[queue] = @debug[queue], Concurrent.monotonic_time
94
+
95
+ return unless previous
96
+
97
+ Sidekiq.logger.debug do
98
+ "Queue #{queue} last time polled: #{@debug[queue] - previous} s ago"
99
+ end
100
+ end
93
101
  end
94
102
  end
95
103
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "sidekiq/throttled"
4
+
5
+ require "sidekiq/ultimate/debugging"
6
+ require "sidekiq/ultimate/expirable_set"
7
+ require "sidekiq/ultimate/queue_name"
8
+ require "sidekiq/ultimate/resurrector"
9
+ require "sidekiq/ultimate/unit_of_work"
10
+
11
+ module Sidekiq
12
+ module Ultimate
13
+ # Throttled reliable fetcher implementing reliable queue pattern.
14
+ class Fetch
15
+ class Debug
16
+ def initialize
17
+ @queues_stats = {}
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -3,6 +3,6 @@
3
3
  module Sidekiq
4
4
  module Ultimate
5
5
  # Gem version.
6
- VERSION = "0.0.1.alpha.16"
6
+ VERSION = "0.0.1.alpha.17"
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-ultimate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.alpha.16
4
+ version: 0.0.1.alpha.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexey Zapparov
@@ -112,9 +112,9 @@ files:
112
112
  - README.md
113
113
  - Rakefile
114
114
  - lib/sidekiq/ultimate.rb
115
- - lib/sidekiq/ultimate/debugging.rb
116
115
  - lib/sidekiq/ultimate/expirable_set.rb
117
116
  - lib/sidekiq/ultimate/fetch.rb
117
+ - lib/sidekiq/ultimate/fetch/debug.rb
118
118
  - lib/sidekiq/ultimate/queue_name.rb
119
119
  - lib/sidekiq/ultimate/resurrector.rb
120
120
  - lib/sidekiq/ultimate/resurrector/resurrect.lua
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Sidekiq
4
- module Ultimate
5
- module Debugging
6
- private
7
-
8
- def debug!
9
- Sidekiq.logger.debug { "[#{self.class}] #{yield}" }
10
- end
11
- end
12
- end
13
- end