resque_stuck_queue 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- Y2RiMWFkM2ZmMGJmOWI1YzcwYzg5MWUyNjU3MTEzNWQwYmZiOWQ1YQ==
4
+ MWE1YzA3NjU4NjE1NGQ3ZjQ4OGMwNzRlZDE3Nzk4ZDhlOTc2YjM4YQ==
5
5
  data.tar.gz: !binary |-
6
- NjQ2ODNlOTNmMDMzZWU1MDU2NWE1NTc4YmQ1NzAwOGFlYzNlOTU5Nw==
6
+ YTBiNGVhN2U5ZjYzMzkwOWJkNDc4Y2ViZTcyOTFjOWNlMjJmZDdiNQ==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- Mzc4ZTI4NjM2ZjlhY2ExNDM3NDhmMjU1NTA0ODE2Y2I3MzkwYzMxNDE3NTNk
10
- YThjNjQ2ZDhkZjY5Nzk2YzAwMWZhZjgxOWNjMThiYzFhNGJlZWVjZjMzY2Rj
11
- ZTZjZThlOGQyMzMwMzFlZmE1NTFmNDE4NzY4NmQ3ZTU1MDAwNDI=
9
+ ZmMxMzgzYTRhM2QyNDg4YTAyYjcxMTE4Y2RmYmNhMWJjNTBlZGVmOGMxNWRk
10
+ MTYxZTEyN2MyODc1NTNiODljYWRlZWUxZDgzZGExZjM5NzFkZjAzYTU5Y2M2
11
+ YmQyMDc0ZGFjOTlhYWFlNTM4YzFmY2M3NTI2ZTliYjcyZTA2NzY=
12
12
  data.tar.gz: !binary |-
13
- YzIzYWMxYWVkZGRiYjdhY2Y3ZDNlYzQ1NzcyYzQ2ZTcxZjM1NTE5NDgyMDU1
14
- OTFkMmZjNWM5NjJiZmNkM2MyNDIyMWY5Y2Q4NTk4MDZkMTViMDY2ZDlhNDgz
15
- NjQ0NGJiNzEwNDIyN2Y4NTJjZTYwODI0ZTRiYjgwYWM5OGI1MGU=
13
+ YWY2ODg5NGEwN2Q2ZGI3ODcyMWRmZjk5OGU3NTA0ZDgyMDkxNmQ1NzIzZTM3
14
+ M2ExODE3NDA4NjNiMTE0ZDE5ZDdiNWEyMDE3ZjFhNDYyZTgzYTEzNTM0M2I3
15
+ YWEzMjc0MjFmMDFlZGNkOTk3M2YwNWY3ZjBlZjY4MWQzMzQzOTI=
@@ -1,5 +1,5 @@
1
1
  module Resque
2
2
  module StuckQueue
3
- VERSION = "0.0.3"
3
+ VERSION = "0.0.4"
4
4
  end
5
5
  end
@@ -46,12 +46,14 @@ module Resque
46
46
 
47
47
  def start_in_background
48
48
  Thread.new do
49
+ Thread.current.abort_on_exception = config[:abort_on_exception]
49
50
  self.start
50
51
  end
51
52
  end
52
53
 
53
54
  def stop_in_background
54
55
  Thread.new do
56
+ Thread.current.abort_on_exception = config[:abort_on_exception]
55
57
  self.start
56
58
  end
57
59
  end
@@ -63,7 +65,6 @@ module Resque
63
65
  @threads = []
64
66
  config.freeze
65
67
 
66
- Thread.abort_on_exception = config[:abort_on_exception]
67
68
 
68
69
  enqueue_repeating_refresh_job
69
70
  setup_checker_thread
@@ -85,40 +86,45 @@ module Resque
85
86
  end
86
87
 
87
88
  def force_stop!
89
+ logger.info("Force stopping")
88
90
  @threads.map(&:kill)
89
91
  reset!
90
- logger.info("Force stopped")
91
92
  end
92
93
 
93
94
  def reset!
94
95
  # clean state so we can stop and start in the same process.
95
96
  @config = config.dup #unfreeze
96
- @logger = nil
97
97
  @running = false
98
+ @logger = nil
99
+ end
100
+
101
+ def stopped?
102
+ @stopped
98
103
  end
99
104
 
100
105
  private
101
106
 
102
107
  def enqueue_repeating_refresh_job
103
108
  @threads << Thread.new do
109
+ Thread.current.abort_on_exception = config[:abort_on_exception]
104
110
  logger.info("Starting heartbeat thread")
105
111
  while @running
106
- wait_for_it
107
112
  # we want to go through resque jobs, because that's what we're trying to test here:
108
113
  # ensure that jobs get executed and the time is updated!
109
114
  #
110
115
  # TODO REDIS 2.0 compat
111
116
  logger.info("Sending refresh job")
112
117
  Resque.enqueue(RefreshLatestTimestamp, global_key)
118
+ wait_for_it
113
119
  end
114
120
  end
115
121
  end
116
122
 
117
123
  def setup_checker_thread
118
124
  @threads << Thread.new do
125
+ Thread.current.abort_on_exception = config[:abort_on_exception]
119
126
  logger.info("Starting checker thread")
120
127
  while @running
121
- wait_for_it
122
128
  mutex = Redis::Mutex.new('resque_stuck_queue_lock', block: 0)
123
129
  if mutex.lock
124
130
  begin
@@ -130,6 +136,7 @@ module Resque
130
136
  mutex.unlock
131
137
  end
132
138
  end
139
+ wait_for_it
133
140
  end
134
141
  end
135
142
  end
@@ -152,6 +159,9 @@ module Resque
152
159
  def trigger_handler
153
160
  (config[:handler] || HANDLER).call
154
161
  manual_refresh
162
+ rescue => e
163
+ logger.info("handler crashed: #{e.inspect}")
164
+ force_stop!
155
165
  end
156
166
 
157
167
  def read_from_redis
@@ -49,5 +49,20 @@ class TestResqueStuckQueue < Minitest::Test
49
49
  assert_equal true, @triggered # "handler should be called"
50
50
  end
51
51
 
52
+ def test_stops_if_handler_raises
53
+ puts "#{__method__}"
54
+ Resque::StuckQueue.config[:trigger_timeout] = 1
55
+ last_time_too_old = Time.now.to_i - Resque::StuckQueue::TRIGGER_TIMEOUT
56
+ Resque::StuckQueue.stubs(:read_from_redis).returns(last_time_too_old.to_s) # enforce trigger
57
+ Resque::StuckQueue.config[:handler] = proc { raise "handler had bad sad!" }
58
+ Thread.new {
59
+ sleep 3 # should have triggered
60
+ Thread.current.abort_on_exception = true
61
+ assert Resque::StuckQueue.stopped?, "should stop stuck_queue if handler raises."
62
+ }
63
+ start_and_stop_loops_after(4)
64
+ end
65
+
66
+
52
67
  end
53
68
 
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.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shai Rosenfeld