Class: Libertree::Model::Job
- Inherits:
-
Object
- Object
- Libertree::Model::Job
- Defined in:
- lib/libertree/model/job.rb
Constant Summary collapse
- MAX_TRIES =
48- RETRY_FACTOR =
0.2
Class Method Summary collapse
-
.create_for_forests(create_args, *forests) ⇒ Object
First parameter can be a Forest Array.
- .pending_where(*args) ⇒ Object
-
.reserve(tasks) ⇒ Job
Nil if no job was reserved.
- .unfinished(task = nil) ⇒ Object
Instance Method Summary collapse
Class Method Details
.create_for_forests(create_args, *forests) ⇒ Object
First parameter can be a Forest Array. Otherwise, assumed to create for all member forests.
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/libertree/model/job.rb', line 25 def self.create_for_forests(create_args, *forests) if forests.empty? forests = Forest.all_local_is_member end trees = Set.new forests.each do |f| if f.local_is_member? trees += f.trees end end trees.each do |tree| params = ( create_args[:params] || create_args['params'] || Hash.new ) params['server_id'] = tree.id Libertree::Model::Job.create( task: create_args[:task], params: params.to_json ) end end |
.pending_where(*args) ⇒ Object
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/libertree/model/job.rb', line 75 def self.pending_where(*args) query = args[0] params = args[1..-1] self.where( Sequel.lit( query + %{ AND time_finished IS NULL AND tries < ? }, *params, MAX_TRIES ) ) end |
.reserve(tasks) ⇒ Job
Returns nil if no job was reserved.
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/libertree/model/job.rb', line 47 def self.reserve(tasks) job = self.where( Sequel.lit("task IN ? AND pid IS NULL AND tries < #{MAX_TRIES} AND time_to_start <= NOW()", tasks) ).order(:time_to_start) .limit(1) .first return nil if job.nil? self.where({ id: job.id, pid: nil }). update({ pid: Process.pid, time_started: Time.now }) job = Job[job.id] if job.pid == Process.pid job end end |
Instance Method Details
#params ⇒ Object
10 11 12 13 14 |
# File 'lib/libertree/model/job.rb', line 10 def params if val = super JSON.parse val end end |
#retry! ⇒ Object
16 17 18 19 20 21 |
# File 'lib/libertree/model/job.rb', line 16 def retry! self.pid = self.time_started = self.time_finished = nil self.time_to_start = Time.now self.tries = 0 self.save end |
#unreserve ⇒ Object
65 66 67 68 69 70 71 72 73 |
# File 'lib/libertree/model/job.rb', line 65 def unreserve new_tries = self.tries+1 self.update( time_started: nil, pid: nil, tries: new_tries, time_to_start: Time.now + 60 * Math::E**(new_tries * RETRY_FACTOR) ) end |