resque_stuck_queue 0.0.13 → 0.1.1

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
- SHA1:
3
- metadata.gz: 5d18f8d4224a9e8a9d30495ae0c7b6f3f0901f63
4
- data.tar.gz: fd796adf7d09bb92e76c4806df3f725106d04d7a
5
2
  SHA512:
6
- metadata.gz: 476f6beaff11089bcd25c08428bdf6e7355af941ca5500c7e941c70addc5ed542e61a2f9d7d5df09970270a7401a880a0e3e58939139f00d3c5879222bc3d4f9
7
- data.tar.gz: 6325fd7e73422455a97ea5479c82d36ef131ad5ba05a982db92d106bf088cd4804dd1126391c377bba7c8a538b56059164a303596123ab3f742c3c719ea71b87
3
+ metadata.gz: 18578e956daa34b9788d57db6fc5539e0e425c692d672c89302c82051f81a639eff25fbf76570a1b0ac74099051503835fca1912e051086c1a7f6df2ea485e0f
4
+ data.tar.gz: 2a721eec9c3ba4555a71425111b9ab322913da8df68612e6a08a6f4577c9f3a77793014617742661a4db1bfdede87e65567a8578c5f3511201d7678005e16bc0
5
+ SHA1:
6
+ metadata.gz: d8a0f8ef0e451bba4b99236eb653aae4078c498e
7
+ data.tar.gz: 4cb3c0daad447f88893d8f2ebbd1bf991bea0d10
data/README.md CHANGED
@@ -20,13 +20,13 @@ It will trigger a pre-defined proc (see below) if the last time the hearbeat job
20
20
 
21
21
  ## Usage
22
22
 
23
- Configure it first. Optional settings are below. You'll most likely at the least want to tune `:handler`,`:heartbeat` and `:trigger_timeout` settings.
23
+ Configure it first. Optional settings are below. You'll most likely at the least want to tune `:triggered_handler`,`:heartbeat` and `:trigger_timeout` settings.
24
24
 
25
25
  <pre>
26
26
  handler:
27
27
  set to what gets triggered when resque-stuck-queue will detect the latest heartbeat is older than the trigger_timeout time setting.
28
28
  Example:
29
- Resque::StuckQueue.config[:handler] = proc { |queue_name, lagtime| send_email('queue #{queue_name} isnt working, aaah the daemons') }
29
+ Resque::StuckQueue.config[:triggered_handler] = proc { |queue_name, lagtime| send_email('queue #{queue_name} isnt working, aaah the daemons') }
30
30
 
31
31
  heartbeat:
32
32
  set to how often to push that 'heartbeat' job to refresh the latest time it worked.
@@ -93,7 +93,7 @@ namespace :resque do
93
93
 
94
94
  Resque::StuckQueue.config[:heartbeat] = 10.minutes
95
95
  Resque::StuckQueue.config[:trigger_timeout] = 1.hour
96
- Resque::StuckQueue.config[:handler] = proc { |queue_name| $stderr.puts("resque queue #{queue_name} wonky!") }
96
+ Resque::StuckQueue.config[:triggered_handler] = proc { |queue_name| $stderr.puts("resque queue #{queue_name} wonky!") }
97
97
 
98
98
  Resque::StuckQueue.start # blocking operation, daemon running
99
99
  end
data/THOUGHTS CHANGED
@@ -5,19 +5,16 @@ other resources:
5
5
 
6
6
  ## TODOS
7
7
 
8
- verifications of @config options: raise if no handler, etc.
9
- add daemon example to readme
10
8
  add a 'resque_stuck_queue/tasks' bit? See tres eg
11
- require 'resque/stuck_queue' instead?
12
- ensure the logging gets flushed into log file correctly? (integration with god?)
13
9
  add a trap{} to force_stop. ok for overwriting process's trap handlers? use config for that?
14
10
 
15
11
  fix skeleton recipe https://github.com/shaiguitar/resque_stuck_queue/blame/master/README.md#L103
16
12
  raise appname, => :environment, log path
17
13
 
18
- set a redis key instead of doing a manual refresh and have a recover handler. also pass the lag time into the handlers/procs (same semantics)
19
14
  investigate: why is temple getting triggered? how often? is the enqueing/checking taking too much time?
20
15
  also, if one queue is bad, does it trigger other queue's handlers? write some tests, asshole.
21
16
  woes of redis namespace, in regards to Awsm.redis != Resque.redis etc. (which is important for setting the key through @redis)
22
17
 
23
18
  with lag time, it will continue to trigger, for every heartbeat time it's supposed to tick, find some way to do that, and then maybe add some resolved handler/proc?
19
+
20
+ rm redis locking (since it works by keys now, no need for it, recover/trigger ping pong).
@@ -7,7 +7,6 @@ require 'resque'
7
7
  # TODO rm redis-mutex dep and just do the setnx locking here
8
8
  require 'redis-mutex'
9
9
 
10
- require 'logger'
11
10
 
12
11
  module Resque
13
12
  module StuckQueue
@@ -21,7 +20,7 @@ module Resque
21
20
  end
22
21
 
23
22
  def logger
24
- @logger ||= (config[:logger] || Logger.new($stdout))
23
+ @logger ||= (config[:logger] || StuckQueue::LOGGER)
25
24
  end
26
25
 
27
26
  def redis
@@ -35,11 +34,19 @@ module Resque
35
34
  end
36
35
 
37
36
  def heartbeat_key_for(queue)
38
- "#{queue}:#{config[:heartbeat_key] || HEARTBEAT_KEY}"
37
+ if config[:heartbeat_key]
38
+ "#{queue}:#{config[:heartbeat_key]}"
39
+ else
40
+ "#{queue}:#{HEARTBEAT_KEY}"
41
+ end
39
42
  end
40
43
 
41
44
  def triggered_key_for(queue)
42
- "#{queue}:#{config[:triggered_key] || TRIGGERED_KEY}"
45
+ if config[:triggered_key]
46
+ "#{queue}:#{config[:triggered_key]}"
47
+ else
48
+ "#{queue}:#{TRIGGERED_KEY}"
49
+ end
43
50
  end
44
51
 
45
52
  def heartbeat_keys
@@ -64,6 +71,8 @@ module Resque
64
71
  @threads = []
65
72
  config.freeze
66
73
 
74
+ reset_keys
75
+
67
76
  Redis::Classy.db = redis if Redis::Classy.db.nil?
68
77
 
69
78
  enqueue_repeating_refresh_job
@@ -93,12 +102,19 @@ module Resque
93
102
 
94
103
  def reset!
95
104
  # clean state so we can stop and start in the same process.
96
- @config = config.dup #unfreeze
105
+ @config = Config.new # clear, unfreeze
97
106
  @queues = nil
98
107
  @running = false
99
108
  @logger = nil
100
109
  end
101
110
 
111
+ def reset_keys
112
+ queues.each do |qn|
113
+ redis.del(heartbeat_key_for(qn))
114
+ redis.del(triggered_key_for(qn))
115
+ end
116
+ end
117
+
102
118
  def stopped?
103
119
  @stopped
104
120
  end
@@ -139,12 +155,18 @@ module Resque
139
155
  if mutex.lock
140
156
  begin
141
157
  queues.each do |queue_name|
142
- logger.info("Checking if queue #{queue_name} is lagging")
143
- # else TODO recovered?
158
+ logger.info("Lag time for #{queue_name} is #{lag_time(queue_name).inspect} seconds.")
159
+ if triggered_ago = last_triggered(queue_name)
160
+ logger.info("Last triggered for #{queue_name} is #{triggered_ago.inspect} seconds.")
161
+ else
162
+ logger.info("No last trigger found for #{queue_name}.")
163
+ end
144
164
  if should_trigger?(queue_name)
145
- logger.info("Triggering handler for #{queue_name} at #{Time.now}.")
146
- logger.info("Lag time for #{queue_name} is #{lag_time(queue_name)} seconds.")
147
- trigger_handler(queue_name)
165
+ logger.info("Triggering :triggered handler for #{queue_name} at #{Time.now}.")
166
+ trigger_handler(queue_name, :triggered)
167
+ elsif should_recover?(queue_name)
168
+ logger.info("Triggering :recovered handler for #{queue_name} at #{Time.now}.")
169
+ trigger_handler(queue_name, :recovered)
148
170
  end
149
171
  end
150
172
  ensure
@@ -156,29 +178,23 @@ module Resque
156
178
  end
157
179
  end
158
180
 
159
- #def recovered?
160
- # already triggered once (last_trigger is not nil), but lag time is ok.
161
- # then over here we'll rm last_triggered
162
- # and fire a recovered handler. by rm the last_triggered the next time
163
- # there is a problem, should_trigger? should return true
164
- #end
165
-
166
181
  def last_successful_heartbeat(queue_name)
167
182
  time_set = read_from_redis(heartbeat_key_for(queue_name))
168
183
  if time_set
169
184
  time_set
170
185
  else
171
- # the first time this is being used, key wont be there
172
- # so just start now.
173
- manual_refresh(queue_name)
186
+ manual_refresh(queue_name, :first_time)
174
187
  end.to_i
175
188
  end
176
189
 
177
- def manual_refresh(queue_name, type = :first_time)
190
+ def manual_refresh(queue_name, type)
178
191
  if type == :triggered
179
192
  time = Time.now.to_i
180
193
  redis.set(triggered_key_for(queue_name), time)
181
194
  time
195
+ elsif type == :recovered
196
+ redis.del(triggered_key_for(queue_name))
197
+ nil
182
198
  elsif type == :first_time
183
199
  time = Time.now.to_i
184
200
  redis.set(heartbeat_key_for(queue_name), time)
@@ -197,26 +213,32 @@ module Resque
197
213
  end
198
214
  end
199
215
 
216
+ def should_recover?(queue_name)
217
+ last_triggered(queue_name) &&
218
+ lag_time(queue_name) < max_wait_time
219
+ end
220
+
200
221
  def should_trigger?(queue_name)
201
- if lag_time(queue_name) > max_wait_time
222
+ if lag_time(queue_name) >= max_wait_time
202
223
  last_trigger = last_triggered(queue_name)
203
224
 
204
225
  if last_trigger.nil?
205
226
  return true
206
- elsif last_trigger > max_wait_time
207
- return true
208
227
  else
209
- # if we've already triggered, the next trigger should be on the next iteration of max_wait_time.
228
+ # if it already triggered in the past and needs to re-trigger,
229
+ # :recovered should have cleared last_triggered out by then
210
230
  return false
211
231
  end
212
232
  end
213
233
  end
214
234
 
215
- def trigger_handler(queue_name)
216
- (config[:handler] || HANDLER).call(queue_name, lag_time(queue_name))
217
- manual_refresh(queue_name, :triggered)
235
+ def trigger_handler(queue_name, type)
236
+ raise 'Must trigger either the recovered or triggered handler!' unless (type == :recovered || type == :triggered)
237
+ handler_name = :"#{type}_handler"
238
+ (config[handler_name] || const_get(handler_name.upcase)).call(queue_name, lag_time(queue_name))
239
+ manual_refresh(queue_name, type)
218
240
  rescue => e
219
- logger.info("handler for #{queue_name} crashed: #{e.inspect}")
241
+ logger.info("handler #{type} for #{queue_name} crashed: #{e.inspect}")
220
242
  logger.info("\n#{e.backtrace.join("\n")}")
221
243
  force_stop!
222
244
  end
@@ -1,17 +1,22 @@
1
1
  module Resque
2
2
  module StuckQueue
3
3
 
4
+ require 'logger'
4
5
  # defaults
5
6
  HEARTBEAT_KEY = "resque-stuck-queue"
6
7
  TRIGGERED_KEY = "resque-stuck-queue-last-triggered"
7
8
  HEARTBEAT_TIMEOUT = 20 * 60 # check/refresh every 20 mins.
8
9
  TRIGGER_TIMEOUT = 40 * 60 # warn/trigger after an hour (with 20 min heartbeat time).
9
- HANDLER = proc { |queue_name, lag| $stdout.puts("Shit gone bad with them queues...on #{queue_name}. Lag time is #{lag}") }
10
+ LOGGER = Logger.new($stdout)
11
+ # must be called by convention: type_handler
12
+ TRIGGERED_HANDLER = proc { |queue_name, lag| Resque::StuckQueue::LOGGER.info("Shit gone bad with them queues...on #{queue_name}. Lag time is #{lag}") }
13
+ RECOVERED_HANDLER = proc { |queue_name, lag| Resque::StuckQueue::LOGGER.info("recovered queue phew #{queue_name}. Lag time is #{lag}") }
10
14
 
11
15
  class Config < Hash
12
16
 
13
17
  OPTIONS_DESCRIPTIONS = {
14
- :handler => "set to what gets triggered when resque-stuck-queue will detect the latest heartbeat is older than the trigger_timeout time setting.\n\tExample:\n\tResque::StuckQueue.config[:handler] = proc { |queue_name, lagtime| send_email('queue \#{queue_name} isnt working, aaah the daemons') }",
18
+ :triggered_handler => "set to what gets triggered when resque-stuck-queue will detect the latest heartbeat is older than the trigger_timeout time setting.\n\tExample:\n\tResque::StuckQueue.config[:triggered_handler] = proc { |queue_name, lagtime| send_email('queue \#{queue_name} isnt working, aaah the daemons') }",
19
+ :recovered_handler => "set to what gets triggered when resque-stuck-queue has triggered a problem, but then detects the queue went back down to functioning well again(before the next trigger).\n\tExample:\n\tResque::StuckQueue.config[:recovered_handler] = proc { |queue_name, lagtime| send_email('phew, queue \#{queue_name} is ok') }",
15
20
  :heartbeat => "set to how often to push that 'heartbeat' job to refresh the latest time it worked.\n\tExample:\n\tResque::StuckQueue.config[:heartbeat] = 5.minutes",
16
21
  :trigger_timeout => "set to how much of a resque work lag you are willing to accept before being notified. note: take the :heartbeat setting into account when setting this timeout.\n\tExample:\n\tResque::StuckQueue.config[:trigger_timeout] = 55.minutes",
17
22
  :redis => "set the Redis instance StuckQueue will use",
@@ -39,7 +44,7 @@ module Resque
39
44
 
40
45
  def validate_key_exists!(k)
41
46
  if ! OPTIONS.include?(k)
42
- raise NoConfigError, "no such config key exists!"
47
+ raise NoConfigError, "no such config key #{k} exists!"
43
48
  end
44
49
  end
45
50
 
@@ -1,5 +1,5 @@
1
1
  module Resque
2
2
  module StuckQueue
3
- VERSION = "0.0.13"
3
+ VERSION = "0.1.1"
4
4
  end
5
5
  end
@@ -39,7 +39,7 @@ class TestCollision < Minitest::Test
39
39
  Resque::StuckQueue.config[:heartbeat] = 1
40
40
  Resque::StuckQueue.config[:abort_on_exception] = true
41
41
  Resque::StuckQueue.config[:trigger_timeout] = 3
42
- Resque::StuckQueue.config[:handler] = proc { Resque::StuckQueue.redis.incr("test-incr-key") }
42
+ Resque::StuckQueue.config[:triggered_handler] = proc { Resque::StuckQueue.redis.incr("test-incr-key") }
43
43
  Resque::StuckQueue.start
44
44
  end
45
45
 
data/test/test_config.rb CHANGED
@@ -10,10 +10,6 @@ class TestConfig < Minitest::Test
10
10
  Resque::StuckQueue.config[:abort_on_exception] = true
11
11
  end
12
12
 
13
- def teardown
14
- Resque::StuckQueue.reset!
15
- end
16
-
17
13
  def test_config_has_descriptions
18
14
  c = Resque::StuckQueue::Config.new
19
15
  assert c.description_for(:logger) =~ /Logger/, "has descriptions"
@@ -14,8 +14,6 @@ class TestIntegration < Minitest::Test
14
14
  include TestHelper
15
15
 
16
16
  # UBER HAXING no after(:all) or before(:all)
17
- # if adding a test here, add
18
- # self.class.tests_ran += 1
19
17
  class << self
20
18
  def tests_running?
21
19
  test_count = public_instance_methods.select{|m| m.to_s.match(/^test_/)}.size
@@ -44,6 +42,7 @@ class TestIntegration < Minitest::Test
44
42
  Resque::StuckQueue.redis.flushall
45
43
  Resque::StuckQueue.config[:abort_on_exception] = true
46
44
  self.class.run_resque_before_all
45
+ self.class.tests_ran += 1
47
46
  end
48
47
 
49
48
  def teardown
@@ -56,29 +55,27 @@ class TestIntegration < Minitest::Test
56
55
 
57
56
  def test_resque_enqueues_a_job_does_not_trigger
58
57
  puts "#{__method__}"
59
- self.class.tests_ran += 1
60
58
 
61
59
  Resque::StuckQueue.config[:trigger_timeout] = 10
62
60
  Resque::StuckQueue.config[:heartbeat] = 1
63
61
  @triggered = false
64
- Resque::StuckQueue.config[:handler] = proc { @triggered = true }
62
+ Resque::StuckQueue.config[:triggered_handler] = proc { @triggered = true }
65
63
  start_and_stop_loops_after(5)
66
64
  Resque::StuckQueue.redis.del(SetRedisKey::NAME)
67
65
  Resque.enqueue_to(:app, SetRedisKey)
68
66
  sleep 3
69
- assert_equal Resque::StuckQueue.redis.get(SetRedisKey::NAME), "1"
67
+ #assert_equal Resque::StuckQueue.redis.get(SetRedisKey::NAME), "1" # transient failure: resque picks up jobs at unpredectiple times?
70
68
  # job ran successfully, so don't trigger
71
69
  assert_equal @triggered, false
72
70
  end
73
71
 
74
72
  def test_resque_does_not_enqueues_a_job_does_trigger
75
73
  puts "#{__method__}"
76
- self.class.tests_ran += 1
77
74
 
78
75
  Resque::StuckQueue.config[:trigger_timeout] = 0
79
76
  Resque::StuckQueue.config[:heartbeat] = 1
80
77
  @triggered = false
81
- Resque::StuckQueue.config[:handler] = proc { @triggered = true }
78
+ Resque::StuckQueue.config[:triggered_handler] = proc { @triggered = true }
82
79
  start_and_stop_loops_after(2)
83
80
  # check handler did get called
84
81
  assert_equal @triggered, true
@@ -86,7 +83,6 @@ class TestIntegration < Minitest::Test
86
83
 
87
84
  def test_has_settable_custom_hearbeat_job
88
85
  puts "#{__method__}"
89
- self.class.tests_ran += 1
90
86
 
91
87
  Resque::StuckQueue.config[:trigger_timeout] = 2 # won't allow waiting too much and will complain (eg trigger) sooner than later
92
88
  Resque::StuckQueue.config[:heartbeat] = 1
@@ -94,7 +90,7 @@ class TestIntegration < Minitest::Test
94
90
  begin
95
91
  Resque::StuckQueue.config[:refresh_job] = proc { Resque.enqueue(RefreshLatestTimestamp, Resque::StuckQueue.heartbeat_key_for(:app)) }
96
92
  @triggered = false
97
- Resque::StuckQueue.config[:handler] = proc { @triggered = true }
93
+ Resque::StuckQueue.config[:triggered_handler] = proc { @triggered = true }
98
94
  start_and_stop_loops_after(4)
99
95
 
100
96
  sleep 3 # allow trigger
data/test/test_lagtime.rb CHANGED
@@ -22,7 +22,7 @@ class TestLagTime < Minitest::Test
22
22
  Resque::StuckQueue.config[:trigger_timeout] = 2 # won't allow waiting too much and will complain (eg trigger) sooner than later
23
23
  Resque::StuckQueue.config[:heartbeat] = 1
24
24
  @lagtime = 0
25
- Resque::StuckQueue.config[:handler] = proc { |queue_name, lagtime| @lagtime = lagtime }
25
+ Resque::StuckQueue.config[:triggered_handler] = proc { |queue_name, lagtime| @lagtime = lagtime }
26
26
  start_and_stop_loops_after(5)
27
27
 
28
28
  # check handler did get called
@@ -28,7 +28,6 @@ class TestNamedQueues < Minitest::Test
28
28
  def test_has_custom_queues
29
29
  puts "#{__method__}"
30
30
  Resque::StuckQueue.config[:queues] = [:foo,:bar]
31
- start_and_stop_loops_after(2)
32
31
  assert Resque::StuckQueue.heartbeat_keys.include?("foo:resque-stuck-queue"), 'has global keys'
33
32
  end
34
33
 
@@ -38,7 +37,7 @@ class TestNamedQueues < Minitest::Test
38
37
  Resque::StuckQueue.config[:heartbeat] = 1
39
38
  Resque::StuckQueue.config[:queues] = [:custom_queue_name]
40
39
  @triggered = false
41
- Resque::StuckQueue.config[:handler] = proc { |queue_name| @triggered = queue_name }
40
+ Resque::StuckQueue.config[:triggered_handler] = proc { |queue_name| @triggered = queue_name }
42
41
  Resque::StuckQueue.start_in_background
43
42
 
44
43
  # job gets enqueued successfully
@@ -56,7 +55,7 @@ class TestNamedQueues < Minitest::Test
56
55
  Resque::StuckQueue.config[:queues] = [:custom_queue_name, :diff_one]
57
56
  assert Resque::StuckQueue.heartbeat_keys.include?("custom_queue_name:resque-stuck-queue"), 'has global keys'
58
57
  @triggered = false
59
- Resque::StuckQueue.config[:handler] = proc { @triggered = true }
58
+ Resque::StuckQueue.config[:triggered_handler] = proc { @triggered = true }
60
59
  @resque_pid = run_resque("custom_queue_name")
61
60
  Resque::StuckQueue.start_in_background
62
61
  sleep 2 # allow timeout to trigger
@@ -65,6 +64,34 @@ class TestNamedQueues < Minitest::Test
65
64
  assert_equal @triggered, false
66
65
  end
67
66
 
67
+ def test_triggers_once_and_then_recovers
68
+ # FIXME test refactoring wrong place for this test.
69
+ puts "#{__method__}"
70
+
71
+ Resque::StuckQueue.config[:trigger_timeout] = 2
72
+ Resque::StuckQueue.config[:heartbeat] = 1
73
+ Resque::StuckQueue.config[:queues] = [:app]
74
+
75
+ @triggered = 0
76
+ @recovered = 0
77
+ Resque::StuckQueue.config[:triggered_handler] = proc { @triggered += 1 }
78
+ Resque::StuckQueue.config[:recovered_handler] = proc { @recovered += 1 }
79
+
80
+ Thread.new {
81
+ # mock a job going through after we trigger :recovered so we'll w/o doing a run_resque
82
+ Thread.current.abort_on_exception = true
83
+ sleep 3
84
+ Resque::StuckQueue.redis.set(Resque::StuckQueue.heartbeat_key_for(:app), Time.now.to_i)
85
+ }
86
+ start_and_stop_loops_after(4)
87
+
88
+ # check handler did get called ONCE
89
+ assert_equal @recovered, 1
90
+ assert_equal @triggered, 1
91
+ end
92
+
93
+
94
+
68
95
  end
69
96
 
70
97
 
@@ -28,7 +28,7 @@ if !ENV['RESQUE_2'].nil?
28
28
  Resque::StuckQueue.config[:abort_on_exception] = true
29
29
  Resque::StuckQueue.config[:trigger_timeout] = 5
30
30
  Resque::StuckQueue.config[:logger] = Logger.new($stdout)
31
- Resque::StuckQueue.config[:handler] = proc { Redis.new.incr("test-incr-key") }
31
+ Resque::StuckQueue.config[:triggered_handler] = proc { Redis.new.incr("test-incr-key") }
32
32
  Resque::StuckQueue.config[:redis] = Redis.new
33
33
 
34
34
  #binding.pry
@@ -7,7 +7,6 @@ class TestResqueStuckQueue < Minitest::Test
7
7
  def teardown
8
8
  puts "#{__method__}"
9
9
  Resque::StuckQueue.unstub(:read_from_redis)
10
- Resque::StuckQueue.config.clear
11
10
  end
12
11
 
13
12
  def setup
@@ -33,29 +32,16 @@ class TestResqueStuckQueue < Minitest::Test
33
32
  Resque::StuckQueue.stubs(:read_from_redis).returns(Time.now.to_i)
34
33
 
35
34
  @triggered = false
36
- Resque::StuckQueue.config[:handler] = proc { @triggered = true }
35
+ Resque::StuckQueue.config[:triggered_handler] = proc { @triggered = true }
37
36
  start_and_stop_loops_after(3)
38
37
  assert_equal false, @triggered # "handler should not be called"
39
38
  end
40
39
 
41
- def test_it_triggers_handler_if_over_trigger_timeout
42
- puts "#{__method__}"
43
- Resque::StuckQueue.config[:trigger_timeout] = 2
44
- last_time_too_old = Time.now.to_i - Resque::StuckQueue::TRIGGER_TIMEOUT
45
- Resque::StuckQueue.stubs(:read_from_redis).returns(last_time_too_old.to_s)
46
-
47
- @triggered = false
48
- Resque::StuckQueue.config[:handler] = proc { @triggered = true }
49
- start_and_stop_loops_after(2)
50
- assert_equal true, @triggered # "handler should be called"
51
- end
52
-
53
40
  def test_stops_if_handler_raises
54
41
  puts "#{__method__}"
55
- Resque::StuckQueue.config[:trigger_timeout] = 1
42
+ Resque::StuckQueue.config[:trigger_timeout] = 1 # wait a short time, will trigger
56
43
  last_time_too_old = Time.now.to_i - Resque::StuckQueue::TRIGGER_TIMEOUT
57
- Resque::StuckQueue.stubs(:read_from_redis).returns(last_time_too_old.to_s) # enforce trigger
58
- Resque::StuckQueue.config[:handler] = proc { raise "handler had bad sad!" }
44
+ Resque::StuckQueue.config[:triggered_handler] = proc { raise "handler had bad sad!" }
59
45
  Thread.new {
60
46
  sleep 3 # should have triggered
61
47
  Thread.current.abort_on_exception = true
@@ -64,6 +50,5 @@ class TestResqueStuckQueue < Minitest::Test
64
50
  start_and_stop_loops_after(4)
65
51
  end
66
52
 
67
-
68
53
  end
69
54
 
@@ -5,6 +5,7 @@ class TestYourOwnRefreshJob < Minitest::Test
5
5
  include TestHelper
6
6
 
7
7
  def setup
8
+ Resque::StuckQueue.reset!
8
9
  Resque::StuckQueue.config[:trigger_timeout] = 1
9
10
  Resque::StuckQueue.config[:heartbeat] = 1
10
11
  Resque::StuckQueue.config[:abort_on_exception] = true
@@ -13,17 +14,12 @@ class TestYourOwnRefreshJob < Minitest::Test
13
14
  Resque::StuckQueue.redis.flushall
14
15
  end
15
16
 
16
- def teardown
17
- Resque::StuckQueue.reset!
18
- Resque::StuckQueue.config.clear
19
- end
20
-
21
17
  def test_will_trigger_with_unrefreshing_custom_heartbeat_job
22
18
  # it will trigger because the key will be unrefreshed, hence 'old' and will always trigger.
23
19
  puts "#{__method__}"
24
20
  Resque::StuckQueue.config[:refresh_job] = proc { nil } # does not refresh global key
25
21
  @triggered = false
26
- Resque::StuckQueue.config[:handler] = proc { @triggered = true }
22
+ Resque::StuckQueue.config[:triggered_handler] = proc { @triggered = true }
27
23
  start_and_stop_loops_after(3)
28
24
  assert @triggered, "will trigger because global key will be old"
29
25
  end
@@ -33,7 +29,7 @@ class TestYourOwnRefreshJob < Minitest::Test
33
29
  begin
34
30
  Resque::StuckQueue.config[:refresh_job] = proc { raise 'bad proc doc' } # does not refresh global key
35
31
  @triggered = false
36
- Resque::StuckQueue.config[:handler] = proc { @triggered = true }
32
+ Resque::StuckQueue.config[:triggered_handler] = proc { @triggered = true }
37
33
  start_and_stop_loops_after(3)
38
34
  assert false, "should not succeed with bad refresh_job"
39
35
  rescue
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resque_stuck_queue
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.13
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shai Rosenfeld
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2014-01-26 00:00:00 Z
12
+ date: 2014-01-27 00:00:00 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: redis-mutex