Class: Tengine::Job::Runtime::Jobnet

Inherits:
NamedVertex
  • Object
show all
Includes:
Core::SafeUpdatable, Core::SelectableAttr, StateTransition, Structure::ElementSelectorNotation, Structure::JobnetBuilder, Structure::JobnetFinder
Defined in:
lib/tengine/job/runtime/jobnet.rb

Overview

ジョブの始端から終端までを持ち、VertexとEdgeを組み合わせてジョブネットを構成することができるVertex。 自身もジョブネットを構成するVertexの一部として扱われる。

Direct Known Subclasses

RootJobnet

Constant Summary collapse

VERTEX_CLASSES =
{
  vertex: "Vertex",
  start_vertex: "Start",
  end_vertex: "End",
  jobnet: "Jobnet",
  fork: "Fork",
  join: "Join",
}.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#stop_modifiedObject (readonly)

Returns the value of attribute stop_modified.



65
66
67
# File 'lib/tengine/job/runtime/jobnet.rb', line 65

def stop_modified
  @stop_modified
end

Class Method Details

.by_name(name) ⇒ Object



86
87
88
# File 'lib/tengine/job/runtime/jobnet.rb', line 86

def by_name(name)
  where({:name => name}).first
end

Instance Method Details

#ack(signal) ⇒ Object

ハンドリングするドライバ: ジョブネット制御ドライバ このackは、子要素のTengine::Job::Runtime::Start#activateから呼ばれます



143
144
145
# File 'lib/tengine/job/runtime/jobnet.rb', line 143

def ack(signal)
  self.phase_key = :running
end

#activate(signal) ⇒ Object

ハンドリングするドライバ: ジョブネット制御ドライバ



119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# File 'lib/tengine/job/runtime/jobnet.rb', line 119

def activate(signal)
  self.phase_key = :starting
  self.started_at = signal.event.occurred_at
  complete_origin_edge(signal) if prev_edges && !prev_edges.empty?

  signal.call_later do
    signal.cache(parent || signal.execution).ack(signal)
    if root?
      signal.execution.with(safe: safemode(Tengine::Job::Runtime::Execution.collection)).save!
    end

    signal.call_later do
      self.update_with_lock do
        signal.paths << self
        signal.cache(self.start_vertex).transmit(signal)
      end
    end
  end
end

#ancestors_until_expansionObject



92
93
94
95
96
97
98
# File 'lib/tengine/job/runtime/jobnet.rb', line 92

def ancestors_until_expansion
  if (parent = self.parent) && !self.was_expansion?
    parent.ancestors_until_expansion + [parent]
  else
    []
  end
end

#chained_box?Boolean

Returns:

  • (Boolean)


37
# File 'lib/tengine/job/runtime/jobnet.rb', line 37

def chained_box?; jobnet_type_entry[:chained_box]; end

#check_stop_modifiedObject



69
70
71
72
# File 'lib/tengine/job/runtime/jobnet.rb', line 69

def check_stop_modified
  @stop_modified = stop_reason_changed? || stopped_at_changed?
  true
end

#close(signal) ⇒ Object



206
207
208
# File 'lib/tengine/job/runtime/jobnet.rb', line 206

def close(signal)
  self.edges.each{|edge| signal.cache(edge).close(signal)}
end

#fail(signal) ⇒ Object

ハンドリングするドライバ: ジョブネット制御ドライバ



173
174
175
176
177
178
179
180
181
182
183
# File 'lib/tengine/job/runtime/jobnet.rb', line 173

def fail(signal)
  Tengine.logger.info("#{__FILE__}##{__LINE__} #{self.class}#fail")

  return if signal.cache(self.edges).any?(&:alive?)
  self.phase_key = :error
  self.finished_at = signal.event.occurred_at
  signal.fire(self, :"error.jobnet.job.tengine", {
      :target_jobnet_id => self.id,
      :target_jobnet_name_path => self.name_path,
    })
end

#finish(signal) ⇒ Object

ハンドリングするドライバ: ジョブネット制御ドライバ このackは、子要素のTengine::Job::End#activateから呼ばれます



151
152
153
154
155
156
157
158
159
# File 'lib/tengine/job/runtime/jobnet.rb', line 151

def finish(signal)

  Tengine.logger.info("#{__FILE__}##{__LINE__} #{self.class}#finish")

  edge = signal.cache(end_vertex.prev_edges.first)
  edge.closed? ?
  self.fail(signal) :
    succeed(signal)
end

#fire_stop(signal) ⇒ Object



186
187
188
189
190
191
192
193
# File 'lib/tengine/job/runtime/jobnet.rb', line 186

def fire_stop(signal)
  return if self.phase_key == :initialized
  signal.fire(self, :"stop.jobnet.job.tengine", {
      :target_jobnet_id => self.id,
      :target_jobnet_name_path => self.name_path,
      :stop_reason => signal.event[:stop_reason]
    })
end

#reset(signal, &block) ⇒ Object



211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
# File 'lib/tengine/job/runtime/jobnet.rb', line 211

def reset(signal, &block)
  # children.each{|c| c.reset(signal) }
  self.phase_key = :initialized
  edges.each do |edge|
    signal.paths.push(edge)
    edge.phase_key = :active
  end
  children.each do |child|
    signal.call_later do
      signal.paths.push(child)
      signal.cache(child).reset(signal)
    end
  end

  reset_followings(signal)

rescue Exception => e
  puts "#{self.name_path} [#{e.class}] #{e.message}"
  raise
end

#script_executable?Boolean

TODO このメソッドは削除するべき。これを使わないで動くようにする。

Returns:

  • (Boolean)


101
102
103
# File 'lib/tengine/job/runtime/jobnet.rb', line 101

def script_executable?
  false
end

#stop(signal) ⇒ Object



195
196
197
198
199
200
201
202
203
# File 'lib/tengine/job/runtime/jobnet.rb', line 195

def stop(signal)
  self.phase_key = :dying
  self.stopped_at = signal.event.occurred_at
  self.stop_reason = signal.event[:stop_reason]
  close(signal)
  children.each do |child|
    child.fire_stop(signal) if child.respond_to?(:fire_stop)
  end
end

#succeed(signal) ⇒ Object

ハンドリングするドライバ: ジョブネット制御ドライバ



162
163
164
165
166
167
168
169
# File 'lib/tengine/job/runtime/jobnet.rb', line 162

def succeed(signal)
  self.phase_key = :success
  self.finished_at = signal.event.occurred_at
  signal.fire(self, :"success.jobnet.job.tengine", {
      :target_jobnet_id => self.id,
      :target_jobnet_name_path => self.name_path,
    })
end

#transmit(signal) ⇒ Object

ハンドリングするドライバ: ジョブネット制御ドライバ or ジョブ起動ドライバ



108
109
110
111
112
113
114
# File 'lib/tengine/job/runtime/jobnet.rb', line 108

def transmit(signal)
  self.phase_key = :ready
  signal.fire(self, :"start.jobnet.job.tengine", {
      :target_jobnet_id => self.id,
      :target_jobnet_name_path => self.name_path,
    })
end

#update_children_stop_modifiedObject



74
75
76
77
78
79
80
81
82
83
# File 'lib/tengine/job/runtime/jobnet.rb', line 74

def update_children_stop_modified
  @stop_modified = false
  children.each do |child|
    if child.is_a?(Tengine::Job::Runtime::Stoppable) && child.respond_to?(:chained_box?) && child.chained_box?
      child.stop_reason = stop_reason
      child.stopped_at = stopped_at
      child.save!
    end
  end
end