Class: Libertree::Model::Job

Inherits:
Object
  • Object
show all
Defined in:
lib/libertree/model/job.rb

Constant Summary collapse

MAX_TRIES =
48
RETRY_FACTOR =
0.2

Class Method Summary collapse

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.

Returns:

  • (Job)

    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

.unfinished(task = nil) ⇒ Object



91
92
93
94
95
96
97
# File 'lib/libertree/model/job.rb', line 91

def self.unfinished(task=nil)
  if task
    self.where(Sequel.lit("task = ? AND time_finished IS NULL", task)).all
  else
    self.where(Sequel.lit("time_finished IS NULL")).all
  end
end

Instance Method Details

#paramsObject



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

#unreserveObject



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