resque_manager 3.3.0 → 3.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.markdown +2 -2
- data/app/controllers/resque_manager/resque_controller.rb +31 -31
- data/app/helpers/resque_manager/resque_helper.rb +1 -1
- data/app/views/resque_manager/resque/_queues.html.erb +1 -1
- data/app/views/resque_manager/resque/schedule.html.erb +6 -8
- data/lib/resque_manager.rb +2 -2
- data/lib/resque_manager/overrides/resque/worker.rb +6 -12
- data/lib/resque_manager/overrides/resque_scheduler/resque_scheduler.rb +4 -4
- data/lib/resque_manager/overrides/resque_status/status.rb +2 -2
- data/lib/resque_manager/version.rb +1 -1
- data/lib/tasks/scheduler.rake +2 -2
- data/test/dummy/app/models/data_contribution_file.rb +28 -0
- data/test/dummy/app/models/single_record_loader.rb +8 -0
- data/test/dummy/config/initializers/resque_manager.rb +7 -0
- data/test/dummy/config/redis.yml +16 -0
- data/test/dummy/config/resque_manager.yml +23 -0
- data/test/dummy/config/routes.rb +1 -2
- data/test/dummy/lib/tasks/resque_setup.rake +1 -0
- data/test/dummy/log/test.log +642 -0
- data/test/functional/resque_manager/resque_controller_test.rb +301 -4
- data/test/test_helper.rb +7 -4
- data/test/unit/overrides/resque/worker_test.rb +169 -0
- data/test/unit/overrides/resque_scheduler/resque_scheduler_test.rb +104 -0
- data/test/unit/overrides/resque_status/chained_status_test.rb +63 -0
- data/test/unit/overrides/resque_status/status_test.rb +193 -0
- metadata +68 -5
- data/test/integration/navigation_test.rb +0 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc0f5d6ae5c0b8f07d40fb0255213f896e000b55
|
4
|
+
data.tar.gz: 80b0ec095f8ab9f7f1690528c116f10606c22fed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2eb3aad6bde5be68c075529a24f69b5220ddafaecfa32c0cf5ce640d37465d74f1770a475a7c8df7b9d49c15d5815a36d5c1314bfdea512baf05eea669366d6a
|
7
|
+
data.tar.gz: d864075ab6c290d213ba0ffe6bcd3b71d29822f80e2502067b8c709b5e2851b69a15f5fdfb042599f3956aae0fafd9dabf63d7c864e47fc1535560a2f54d35f4
|
data/README.markdown
CHANGED
@@ -153,7 +153,7 @@ Resque::Plugins::Status, and everything after that includes from Resque::Plugins
|
|
153
153
|
the chained job from the preceding job, you just need to pass {'uuid' => uuid} as one of the hash arguments.
|
154
154
|
|
155
155
|
class DataContributionFile
|
156
|
-
Resque::Plugins::Status
|
156
|
+
include Resque::Plugins::Status
|
157
157
|
|
158
158
|
@queue = :data_contribution
|
159
159
|
|
@@ -167,7 +167,7 @@ the chained job from the preceding job, you just need to pass {'uuid' => uuid} a
|
|
167
167
|
end
|
168
168
|
|
169
169
|
class SingleRecordLoader
|
170
|
-
Resque::Plugins::ChainedStatus
|
170
|
+
include Resque::Plugins::ChainedStatus
|
171
171
|
@queue = :single_record_loader
|
172
172
|
|
173
173
|
def completed(*messages)
|
@@ -42,42 +42,42 @@ class ResqueManager::ResqueController < ApplicationController
|
|
42
42
|
# in the application the UI is in.
|
43
43
|
if ResqueManager.applications.blank?
|
44
44
|
Resque.dequeue(params['class'].constantize, *Resque.decode(params['args']))
|
45
|
-
redirect_to request.referrer
|
46
45
|
end
|
46
|
+
redirect_to request.referrer
|
47
47
|
end
|
48
48
|
|
49
49
|
def stop_worker
|
50
50
|
worker = find_worker(params[:worker])
|
51
51
|
worker.quit if worker
|
52
|
-
redirect_to
|
52
|
+
redirect_to workers_resque_path
|
53
53
|
end
|
54
54
|
|
55
55
|
def pause_worker
|
56
56
|
worker = find_worker(params[:worker])
|
57
57
|
worker.pause if worker
|
58
|
-
redirect_to
|
58
|
+
redirect_to workers_resque_path
|
59
59
|
end
|
60
60
|
|
61
61
|
def continue_worker
|
62
62
|
worker = find_worker(params[:worker])
|
63
63
|
worker.continue if worker
|
64
|
-
redirect_to
|
64
|
+
redirect_to workers_resque_path
|
65
65
|
end
|
66
66
|
|
67
67
|
def restart_worker
|
68
68
|
worker = find_worker(params[:worker])
|
69
69
|
worker.restart if worker
|
70
|
-
redirect_to
|
70
|
+
redirect_to workers_resque_path
|
71
71
|
end
|
72
72
|
|
73
73
|
def start_worker
|
74
74
|
Resque::Worker.start(params)
|
75
|
-
redirect_to
|
75
|
+
redirect_to workers_resque_path
|
76
76
|
end
|
77
77
|
|
78
78
|
def stats
|
79
79
|
unless params[:id]
|
80
|
-
redirect_to(:
|
80
|
+
redirect_to(stats_resque_path(:id => 'resque'))
|
81
81
|
end
|
82
82
|
|
83
83
|
if params[:id] == 'txt'
|
@@ -89,7 +89,6 @@ class ResqueManager::ResqueController < ApplicationController
|
|
89
89
|
stats << "resque.failed+=#{info[:failed]}"
|
90
90
|
stats << "resque.workers=#{info[:workers]}"
|
91
91
|
stats << "resque.working=#{info[:working]}"
|
92
|
-
|
93
92
|
Resque.queues.each do |queue|
|
94
93
|
stats << "queues.#{queue}=#{Resque.size(queue)}"
|
95
94
|
end
|
@@ -107,13 +106,13 @@ class ResqueManager::ResqueController < ApplicationController
|
|
107
106
|
def schedule_requeue
|
108
107
|
config = Resque.schedule[params['job_name']]
|
109
108
|
Resque::Scheduler.enqueue_from_config(config)
|
110
|
-
redirect_to
|
109
|
+
redirect_to overview_resque_path
|
111
110
|
end
|
112
111
|
|
113
112
|
def add_scheduled_job
|
114
113
|
errors = []
|
115
114
|
if Resque.schedule.keys.include?(params[:name])
|
116
|
-
errors << 'Name already exists'
|
115
|
+
errors << 'Name already exists.'
|
117
116
|
end
|
118
117
|
if params[:ip].blank?
|
119
118
|
errors << 'You must enter an ip address for the server you want this job to run on.'
|
@@ -129,33 +128,32 @@ class ResqueManager::ResqueController < ApplicationController
|
|
129
128
|
'description' => params['description']}
|
130
129
|
}
|
131
130
|
Resque.redis.rpush(:scheduled, Resque.encode(config))
|
132
|
-
ResqueScheduler.restart('ip')
|
131
|
+
ResqueScheduler.restart(params['ip'])
|
133
132
|
else
|
134
|
-
flash[:error] = errors.join('<br>')
|
133
|
+
flash[:error] = errors.join('<br>').html_safe
|
135
134
|
end
|
136
|
-
redirect_to
|
135
|
+
redirect_to schedule_resque_path
|
137
136
|
end
|
138
137
|
|
139
138
|
def remove_from_schedule
|
140
139
|
Resque.list_range(:scheduled, 0, -0).each do |s|
|
141
|
-
|
142
140
|
if s[params['job_name']]
|
143
141
|
Resque.redis.lrem(:scheduled, 0, s.to_json)
|
144
142
|
# Restart the scheduler on the server that has changed it's schedule
|
145
143
|
ResqueScheduler.restart(params['ip'])
|
146
144
|
end
|
147
145
|
end
|
148
|
-
redirect_to
|
146
|
+
redirect_to schedule_resque_path
|
149
147
|
end
|
150
148
|
|
151
149
|
def start_scheduler
|
152
150
|
ResqueScheduler.start(params[:ip])
|
153
|
-
redirect_to
|
151
|
+
redirect_to schedule_resque_path
|
154
152
|
end
|
155
153
|
|
156
154
|
def stop_scheduler
|
157
155
|
ResqueScheduler.quit(params[:ip])
|
158
|
-
redirect_to
|
156
|
+
redirect_to schedule_resque_path
|
159
157
|
end
|
160
158
|
|
161
159
|
# resque-status actions
|
@@ -165,20 +163,22 @@ class ResqueManager::ResqueController < ApplicationController
|
|
165
163
|
@end = @start + (params[:per_page] || 20)
|
166
164
|
@statuses = Resque::Plugins::Status::Hash.statuses(@start, @end)
|
167
165
|
@size = Resque::Plugins::Status::Hash.status_ids.size
|
168
|
-
|
169
|
-
render :
|
166
|
+
respond_to do |format|
|
167
|
+
format.js { render json: @statuses }
|
168
|
+
format.json { render json: @statuses }
|
170
169
|
end
|
171
170
|
end
|
172
171
|
|
173
172
|
def clear_statuses
|
174
173
|
Resque::Plugins::Status::Hash.clear
|
175
|
-
redirect_to
|
174
|
+
redirect_to statuses_resque_path
|
176
175
|
end
|
177
176
|
|
178
177
|
def status
|
179
178
|
@status = Resque::Plugins::Status::Hash.get(params[:id])
|
180
|
-
|
181
|
-
render :
|
179
|
+
respond_to do |format|
|
180
|
+
format.js { render json: @status }
|
181
|
+
format.json { render json: @status }
|
182
182
|
end
|
183
183
|
end
|
184
184
|
|
@@ -187,7 +187,7 @@ class ResqueManager::ResqueController < ApplicationController
|
|
187
187
|
s = Resque::Plugins::Status::Hash.get(params[:id])
|
188
188
|
s.status = 'killed'
|
189
189
|
Resque::Plugins::Status::Hash.set(params[:id], s)
|
190
|
-
redirect_to
|
190
|
+
redirect_to statuses_resque_path
|
191
191
|
end
|
192
192
|
|
193
193
|
def cleaner
|
@@ -262,7 +262,7 @@ class ResqueManager::ResqueController < ApplicationController
|
|
262
262
|
|
263
263
|
def cleaner_stale
|
264
264
|
@cleaner.clear_stale
|
265
|
-
redirect_to
|
265
|
+
redirect_to cleaner_resque_path
|
266
266
|
end
|
267
267
|
|
268
268
|
|
@@ -271,11 +271,12 @@ class ResqueManager::ResqueController < ApplicationController
|
|
271
271
|
def check_connection
|
272
272
|
Resque.keys
|
273
273
|
rescue Errno::ECONNREFUSED
|
274
|
-
render(:template => 'resque/error', :layout => false, :locals => {:error => "Can't connect to Redis! (#{Resque.
|
274
|
+
render(:template => 'resque_manager/resque/error', :layout => false, :locals => { :error => "Can't connect to Redis! (#{Resque.redis_id})" })
|
275
275
|
false
|
276
276
|
end
|
277
277
|
|
278
278
|
def find_worker(worker)
|
279
|
+
return nil if worker.blank?
|
279
280
|
first_part, *rest = worker.split(':')
|
280
281
|
first_part.gsub!(/_/, '.')
|
281
282
|
Resque::Worker.find("#{first_part}:#{rest.join(':')}")
|
@@ -290,14 +291,14 @@ class ResqueManager::ResqueController < ApplicationController
|
|
290
291
|
end
|
291
292
|
|
292
293
|
def load_cleaner_filter
|
293
|
-
@from
|
294
|
-
@to
|
295
|
-
@klass
|
296
|
-
@exception = params[:ex]
|
294
|
+
@from = params[:f].blank? ? nil : params[:f]
|
295
|
+
@to = params[:t].blank? ? nil : params[:t]
|
296
|
+
@klass = params[:c].blank? ? nil : params[:c]
|
297
|
+
@exception = params[:ex].blank? ? nil : params[:ex]
|
297
298
|
end
|
298
299
|
|
299
300
|
def filter_block
|
300
|
-
|
301
|
+
lambda { |j|
|
301
302
|
(!@from || j.after?(hours_ago(@from))) &&
|
302
303
|
(!@to || j.before?(hours_ago(@to))) &&
|
303
304
|
(!@klass || j.klass?(@klass)) &&
|
@@ -309,5 +310,4 @@ class ResqueManager::ResqueController < ApplicationController
|
|
309
310
|
def hours_ago(h)
|
310
311
|
Time.now - h.to_i*60*60
|
311
312
|
end
|
312
|
-
|
313
313
|
end
|
@@ -91,7 +91,7 @@ module ResqueManager
|
|
91
91
|
if @polling
|
92
92
|
text = "Last Updated: #{Time.now.strftime("%H:%M:%S")}"
|
93
93
|
else
|
94
|
-
text = link_to('Live Poll', {:
|
94
|
+
text = link_to('Live Poll', status_poll_resque_path({:start => start}), :rel => 'poll')
|
95
95
|
end
|
96
96
|
"<p class='poll'>#{text}</p>".html_safe
|
97
97
|
end
|
@@ -51,7 +51,7 @@
|
|
51
51
|
</tr>
|
52
52
|
<% end %>
|
53
53
|
<tr class='failed'>
|
54
|
-
<td class='queue failed'><%= link_to('failed',
|
54
|
+
<td class='queue failed'><%= link_to('failed', cleaner_resque_path , :class => 'queue') %></td>
|
55
55
|
<td class='size'><%= Resque::Failure.count %></td>
|
56
56
|
</tr>
|
57
57
|
</table>
|
@@ -21,7 +21,7 @@
|
|
21
21
|
<% Resque.schedule.each do |name,config| %>
|
22
22
|
<tr>
|
23
23
|
<td>
|
24
|
-
<%= button_to "Queue now",
|
24
|
+
<%= button_to "Queue now", schedule_requeue_resque_path(job_name: name), :method => :post %>
|
25
25
|
</td>
|
26
26
|
<td><%= h name %></td>
|
27
27
|
<td><%= h config['ip'] %></td>
|
@@ -29,7 +29,7 @@
|
|
29
29
|
<td style="white-space:nowrap"><%= h config['cron'] %></td>
|
30
30
|
<td><%= h config['class'] %></td>
|
31
31
|
<td><%= h config['args'].inspect %></td>
|
32
|
-
<td><%= button_to "Remove",
|
32
|
+
<td><%= button_to "Remove", remove_from_schedule_resque_path(job_name: name, ip: config['ip']), :method => :post %></td>
|
33
33
|
</tr>
|
34
34
|
<%end%>
|
35
35
|
</table>
|
@@ -38,10 +38,8 @@
|
|
38
38
|
<div id='flash' class="flash">
|
39
39
|
<%flash_message = flash_helper%>
|
40
40
|
<% unless flash_message.blank? -%>
|
41
|
-
|
42
|
-
<%=
|
43
|
-
</p>
|
44
|
-
<%= javascript_tag "$('flash').show();" %>
|
41
|
+
<%= flash_message.html_safe %>
|
42
|
+
<%= javascript_tag "$('flash').show();" %>
|
45
43
|
<% end %>
|
46
44
|
</div>
|
47
45
|
<%= form_tag '/resque/add_scheduled_job' do -%>
|
@@ -85,9 +83,9 @@
|
|
85
83
|
<td><%= status %></td>
|
86
84
|
<td>
|
87
85
|
<% if status == 'Running' -%>
|
88
|
-
<%= button_to
|
86
|
+
<%= button_to 'Stop Scheduler', stop_scheduler_resque_path(ip: ip), :method => :post %>
|
89
87
|
<% else -%>
|
90
|
-
<%= button_to
|
88
|
+
<%= button_to 'Start Scheduler', stop_scheduler_resque_path(ip: ip), :method => :post %>
|
91
89
|
<% end -%>
|
92
90
|
</td>
|
93
91
|
</tr>
|
data/lib/resque_manager.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
|
-
require
|
1
|
+
require 'resque_manager/engine'
|
2
2
|
require 'resque/server'
|
3
3
|
require 'resque_manager/overrides/resque/worker'
|
4
4
|
require 'resque_manager/overrides/resque/resque'
|
5
5
|
require 'resque_manager/overrides/resque/job'
|
6
6
|
require 'resque_manager/overrides/resque/failure/redis'
|
7
7
|
if Resque.respond_to? :schedule
|
8
|
-
require 'resque_scheduler/tasks'
|
9
8
|
require 'resque_manager/overrides/resque_scheduler/resque_scheduler'
|
10
9
|
end
|
11
10
|
require 'resque-status'
|
12
11
|
require 'resque_manager/overrides/resque_status/status'
|
12
|
+
require 'resque_manager/overrides/resque_status/hash'
|
13
13
|
require 'resque_manager/overrides/resque_status/chained_status'
|
14
14
|
require 'resque-cleaner'
|
15
15
|
|
@@ -5,12 +5,7 @@ module Resque
|
|
5
5
|
@@local_ip = nil
|
6
6
|
|
7
7
|
def local_ip
|
8
|
-
@@local_ip ||=
|
9
|
-
UDPSocket.open do |s|
|
10
|
-
s.connect 'google.com', 1
|
11
|
-
s.addr.last
|
12
|
-
end
|
13
|
-
end
|
8
|
+
@@local_ip ||= IPSocket.getaddress(Socket.gethostname)
|
14
9
|
end
|
15
10
|
|
16
11
|
# The string representation is the same as the id for this worker
|
@@ -40,7 +35,7 @@ module Resque
|
|
40
35
|
end
|
41
36
|
|
42
37
|
def queue
|
43
|
-
to_s.split(':').
|
38
|
+
to_s.split(':').fifth
|
44
39
|
end
|
45
40
|
|
46
41
|
def workers_in_pid
|
@@ -52,7 +47,7 @@ module Resque
|
|
52
47
|
end
|
53
48
|
|
54
49
|
def queues_in_pid
|
55
|
-
workers_in_pid.collect { |w| w.queue }
|
50
|
+
workers_in_pid.collect { |w| w.queue }.compact
|
56
51
|
end
|
57
52
|
|
58
53
|
#OVERRIDE for multithreaded workers
|
@@ -100,7 +95,7 @@ module Resque
|
|
100
95
|
#OVERRIDE to set a redis key so UI knows it's paused too
|
101
96
|
# Would prefer to call super but get no superclass method error
|
102
97
|
def pause_processing
|
103
|
-
log
|
98
|
+
log 'USR2 received; pausing job processing'
|
104
99
|
@paused = true
|
105
100
|
Resque.redis.set(pause_key, Time.now.to_s)
|
106
101
|
end
|
@@ -109,7 +104,7 @@ module Resque
|
|
109
104
|
#OVERRIDE to set remove redis key so UI knows it's unpaused too
|
110
105
|
# Would prefer to call super but get no superclass method error
|
111
106
|
def unpause_processing
|
112
|
-
log
|
107
|
+
log 'CONT received; resuming job processing'
|
113
108
|
@paused = false
|
114
109
|
Resque.redis.del(pause_key)
|
115
110
|
end
|
@@ -167,12 +162,11 @@ module Resque
|
|
167
162
|
#OVERRIDE for multithreaded workers
|
168
163
|
def work(interval = 5.0, &block)
|
169
164
|
interval = Float(interval)
|
170
|
-
$0 =
|
165
|
+
$0 = 'resque: Starting'
|
171
166
|
startup
|
172
167
|
|
173
168
|
loop do
|
174
169
|
break if shutdown? || Thread.current[:shutdown]
|
175
|
-
|
176
170
|
if not paused? and job = reserve
|
177
171
|
log "got: #{job.inspect}"
|
178
172
|
job.worker = self
|
@@ -16,7 +16,7 @@ module ResqueScheduler
|
|
16
16
|
|
17
17
|
def self.start(ips)
|
18
18
|
if Rails.env =~ /development|test/
|
19
|
-
Thread.new{system(
|
19
|
+
Thread.new{system('rake resque:scheduler')}
|
20
20
|
else
|
21
21
|
Thread.new(ips){|ip_list|system("cd #{Rails.root}; #{ResqueManager::Cap.path} #{Rails.env} resque:scheduler host=#{ip_list}")}
|
22
22
|
end
|
@@ -24,9 +24,9 @@ module ResqueScheduler
|
|
24
24
|
|
25
25
|
def self.quit(ips)
|
26
26
|
if Rails.env =~ /development|test/
|
27
|
-
system(
|
27
|
+
system('rake resque:quit_scheduler')
|
28
28
|
else
|
29
|
-
system("cd #{Rails.root};
|
29
|
+
system("cd #{Rails.root}; bundle exec cap #{Rails.env} resque:quit_scheduler host=#{ips}")
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
@@ -41,7 +41,7 @@ module ResqueScheduler
|
|
41
41
|
status['localhost'] = pids.present? ? 'Running' : 'Stopped'
|
42
42
|
else
|
43
43
|
Resque.schedule.values.collect{|job| job['ip']}.each do |ip|
|
44
|
-
cap = `cd #{Rails.root};
|
44
|
+
cap = `cd #{Rails.root}; bundle exec cap #{Rails.env} resque:scheduler_status hosts=#{ip}`
|
45
45
|
status[ip] = cap =~ /resque:scheduler is up/ ? 'Running' : 'Stopped'
|
46
46
|
end
|
47
47
|
end
|
@@ -45,7 +45,7 @@ module Resque
|
|
45
45
|
|
46
46
|
# OVERRIDE to clear all the keys that have the UUI. status, counters, etc.
|
47
47
|
def remove(uuid)
|
48
|
-
Resque.redis.zrem(set_key, uuid)
|
48
|
+
Resque.redis.zrem(Resque::Plugins::Status::Hash.set_key, uuid)
|
49
49
|
Resque.redis.keys("*#{uuid}").each do |key|
|
50
50
|
Resque.redis.del(key)
|
51
51
|
end
|
@@ -130,7 +130,7 @@ module Resque
|
|
130
130
|
Rails.logger.info "Job #{self} Killed at #{Time.now}"
|
131
131
|
Resque::Plugins::Status::Hash.killed(uuid)
|
132
132
|
on_killed if respond_to?(:on_killed)
|
133
|
-
rescue => e
|
133
|
+
rescue Exception => e
|
134
134
|
Rails.logger.error e
|
135
135
|
failed("The task failed because of an error: #{e}")
|
136
136
|
if respond_to?(:on_failure)
|
data/lib/tasks/scheduler.rake
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
namespace :resque do
|
2
2
|
|
3
|
-
desc
|
3
|
+
desc 'Kill the scheduler pid'
|
4
4
|
task :quit_scheduler => :setup do
|
5
5
|
require 'resque_scheduler'
|
6
6
|
ResqueScheduler.pids.each do |pid|
|
@@ -8,4 +8,4 @@ namespace :resque do
|
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
-
end
|
11
|
+
end if Resque.respond_to? :schedule
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class DataContributionFile
|
2
|
+
include Resque::Plugins::Status
|
3
|
+
@queue = :data_contribution
|
4
|
+
|
5
|
+
def perform
|
6
|
+
#stub
|
7
|
+
end
|
8
|
+
|
9
|
+
def on_failure(e)
|
10
|
+
#stub
|
11
|
+
end
|
12
|
+
|
13
|
+
def on_success
|
14
|
+
#stub
|
15
|
+
end
|
16
|
+
|
17
|
+
def completed?
|
18
|
+
#stub
|
19
|
+
end
|
20
|
+
|
21
|
+
def failed?
|
22
|
+
#stub
|
23
|
+
end
|
24
|
+
|
25
|
+
def killed?
|
26
|
+
#stub
|
27
|
+
end
|
28
|
+
end
|