blob: 58bf65928de7bf41764008fe28126e210783ddb0 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
module Oxidized
require 'oxidized/job'
require 'oxidized/jobs'
class Worker
def initialize nodes
@nodes = nodes
@jobs = Jobs.new CFG.threads, CFG.interval, @nodes
Thread.abort_on_exception = true
end
def work
ended = []
@jobs.delete_if { |job| ended << job if not job.alive? }
ended.each { |job| process job }
while @jobs.size < @jobs.want
Log.debug "Jobs #{@jobs.size}, Want: #{@jobs.want}"
# ask for next node in queue non destructive way
nextnode = @nodes.first
unless nextnode.last.nil?
break if nextnode.last.end + CFG.interval > Time.now.utc
end
# shift nodes and get the next node
node = @nodes.get
node.running? ? next : node.running = true
@jobs.push Job.new node
end
end
def process job
node = job.node
node.last = job
node.stats.add job
@jobs.duration job.time
if job.status == :success
msg = "update #{node.name}"
msg += " from #{node.from}" if node.from
msg += " with message '#{node.msg}'" if node.msg
node.output.new.store node.name, job.config,
:msg => msg, :user => node.user, :group => node.group
node.reset
else
Log.warn "#{node.name} status #{job.status}"
end
node.running = false
end
end
end
|