tengine_job 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +15 -0
  2. data/Gemfile.lock +78 -48
  3. data/bin/tengine_job +71 -0
  4. data/examples/0004_retry_one_layer.rb +10 -7
  5. data/examples/0027_parallel_ssh_job +9 -0
  6. data/examples/0027_parallel_ssh_jobs.rb +14 -0
  7. data/lib/tengine/job.rb +19 -49
  8. data/lib/tengine/job/dsl.rb +13 -0
  9. data/lib/tengine/job/{dsl_binder.rb → dsl/binder.rb} +4 -4
  10. data/lib/tengine/job/{dsl_evaluator.rb → dsl/evaluator.rb} +2 -2
  11. data/lib/tengine/job/{dsl_loader.rb → dsl/loader.rb} +20 -22
  12. data/lib/tengine/job/runtime.rb +32 -0
  13. data/lib/tengine/job/{drivers → runtime/drivers}/job_control_driver.rb +46 -92
  14. data/lib/tengine/job/{drivers → runtime/drivers}/job_execution_driver.rb +14 -10
  15. data/lib/tengine/job/runtime/drivers/jobnet_control_driver.rb +240 -0
  16. data/lib/tengine/job/{drivers → runtime/drivers}/schedule_driver.rb +4 -4
  17. data/lib/tengine/job/{edge.rb → runtime/edge.rb} +79 -25
  18. data/lib/tengine/job/{executable.rb → runtime/executable.rb} +35 -15
  19. data/lib/tengine/job/{execution.rb → runtime/execution.rb} +19 -11
  20. data/lib/tengine/job/runtime/job_base.rb +5 -0
  21. data/lib/tengine/job/runtime/jobnet.rb +283 -0
  22. data/lib/tengine/job/runtime/junction.rb +44 -0
  23. data/lib/tengine/job/runtime/named_vertex.rb +95 -0
  24. data/lib/tengine/job/runtime/root_jobnet.rb +81 -0
  25. data/lib/tengine/job/{signal.rb → runtime/signal.rb} +99 -13
  26. data/lib/tengine/job/runtime/ssh_job.rb +486 -0
  27. data/lib/tengine/job/{jobnet → runtime}/state_transition.rb +6 -4
  28. data/lib/tengine/job/runtime/stoppable.rb +64 -0
  29. data/lib/tengine/job/runtime/vertex.rb +50 -0
  30. data/lib/tengine/job/structure.rb +20 -0
  31. data/lib/tengine/job/{category.rb → structure/category.rb} +9 -5
  32. data/lib/tengine/job/{jobnet/builder.rb → structure/edge_builder.rb} +11 -7
  33. data/lib/tengine/job/{element_selector_notation.rb → structure/element_selector_notation.rb} +15 -11
  34. data/lib/tengine/job/structure/jobnet_builder.rb +83 -0
  35. data/lib/tengine/job/structure/jobnet_finder.rb +60 -0
  36. data/lib/tengine/job/{name_path.rb → structure/name_path.rb} +2 -2
  37. data/lib/tengine/job/structure/tree.rb +20 -0
  38. data/lib/tengine/job/structure/visitor.rb +67 -0
  39. data/lib/tengine/job/template.rb +24 -0
  40. data/lib/tengine/job/template/edge.rb +37 -0
  41. data/lib/tengine/job/template/expansion.rb +24 -0
  42. data/lib/tengine/job/template/generator.rb +111 -0
  43. data/lib/tengine/job/template/jobnet.rb +83 -0
  44. data/lib/tengine/job/template/junction.rb +14 -0
  45. data/lib/tengine/job/{job.rb → template/named_vertex.rb} +3 -5
  46. data/lib/tengine/job/{root_jobnet_template.rb → template/root_jobnet.rb} +12 -26
  47. data/lib/tengine/job/template/ssh_job.rb +80 -0
  48. data/lib/tengine/job/template/vertex.rb +97 -0
  49. metadata +127 -93
  50. data/lib/tengine/job/connectable.rb +0 -43
  51. data/lib/tengine/job/drivers/jobnet_control_driver.rb +0 -249
  52. data/lib/tengine/job/end.rb +0 -32
  53. data/lib/tengine/job/expansion.rb +0 -37
  54. data/lib/tengine/job/fork.rb +0 -6
  55. data/lib/tengine/job/jobnet.rb +0 -184
  56. data/lib/tengine/job/jobnet/job_state_transition.rb +0 -167
  57. data/lib/tengine/job/jobnet/jobnet_state_transition.rb +0 -110
  58. data/lib/tengine/job/jobnet_actual.rb +0 -84
  59. data/lib/tengine/job/jobnet_template.rb +0 -10
  60. data/lib/tengine/job/join.rb +0 -6
  61. data/lib/tengine/job/junction.rb +0 -29
  62. data/lib/tengine/job/killing.rb +0 -30
  63. data/lib/tengine/job/mm_compatibility.rb +0 -6
  64. data/lib/tengine/job/mm_compatibility/connectable.rb +0 -13
  65. data/lib/tengine/job/root.rb +0 -16
  66. data/lib/tengine/job/root_jobnet_actual.rb +0 -58
  67. data/lib/tengine/job/script_executable.rb +0 -235
  68. data/lib/tengine/job/start.rb +0 -20
  69. data/lib/tengine/job/stoppable.rb +0 -15
  70. data/lib/tengine/job/vertex.rb +0 -181
@@ -1,9 +1,9 @@
1
1
  # -*- coding: utf-8 -*-
2
- require 'tengine/job'
2
+ require 'tengine/job/dsl'
3
3
 
4
4
  # Tengine::Job::DslLoader と Tengine::Job::DslBinder がincludeしているモジュールです。
5
5
  # それぞれに共通のメソッドを定義します。
6
- module Tengine::Job::DslEvaluator
6
+ module Tengine::Job::Dsl::Evaluator
7
7
  private
8
8
  def __stack_instance_variable__(ivar_name, value)
9
9
  backup = instance_variable_get(ivar_name)
@@ -1,9 +1,9 @@
1
1
  # -*- coding: utf-8 -*-
2
- require 'tengine/job'
2
+ require 'tengine/job/dsl'
3
3
 
4
4
  # ジョブDSLをロードする際に使用される語彙に関するメソッドを定義するモジュール
5
- module Tengine::Job::DslLoader
6
- include Tengine::Job::DslEvaluator
5
+ module Tengine::Job::Dsl::Loader
6
+ include Tengine::Job::Dsl::Evaluator
7
7
 
8
8
  class << self
9
9
  def loading_template_block_store
@@ -46,13 +46,13 @@ module Tengine::Job::DslLoader
46
46
  auto_sequence = options.delete(:auto_sequence)
47
47
  result = __with_redirection__(options) do
48
48
  if @jobnet.nil?
49
- klass = Tengine::Job::RootJobnetTemplate
49
+ klass = Tengine::Job::Template::RootJobnet
50
50
  options[:dsl_version] = config.dsl_version
51
51
  path, lineno = *block.source_location
52
52
  options[:dsl_filepath] = config.relative_path_from_dsl_dir(path)
53
53
  options[:dsl_lineno] = lineno.to_i
54
54
  else
55
- klass = Tengine::Job::JobnetTemplate
55
+ klass = Tengine::Job::Template::Jobnet
56
56
  end
57
57
  klass.new(options)
58
58
  end
@@ -62,7 +62,7 @@ module Tengine::Job::DslLoader
62
62
  if duplicated = result.find_duplication
63
63
  if (duplicated.dsl_filepath != result.dsl_filepath) ||
64
64
  (duplicated.dsl_lineno != result.dsl_lineno)
65
- raise Tengine::Job::DslError, "2 jobnet named #{name.inspect} found at #{duplicated.dsl_filepath}:#{duplicated.dsl_lineno} and #{result.dsl_filepath}:#{result.dsl_lineno}"
65
+ raise Tengine::Job::Dsl::Error, "2 jobnet named #{name.inspect} found at #{duplicated.dsl_filepath}:#{duplicated.dsl_lineno} and #{result.dsl_filepath}:#{result.dsl_lineno}"
66
66
  end
67
67
  end
68
68
  end
@@ -78,7 +78,7 @@ module Tengine::Job::DslLoader
78
78
  if result.parent.nil?
79
79
  loaded = result.find_duplication
80
80
  result.save! unless loaded
81
- Tengine::Job::DslLoader.update_loaded_blocks(loaded)
81
+ Tengine::Job::Dsl::Loader.update_loaded_blocks(loaded)
82
82
  loaded || result
83
83
  else
84
84
  result
@@ -98,17 +98,17 @@ module Tengine::Job::DslLoader
98
98
  script, description, options = __parse_job_args__(name, args)
99
99
  options[:description] = options.delete(:caption) if options[:caption]
100
100
  options = {
101
- :name => name,
102
- :description => description,
103
- :script => script
101
+ name: name,
102
+ description: description,
103
+ script: script,
104
104
  }.update(options)
105
105
  preparation = options.delete(:preparation)
106
106
  result = __with_redirection__(options) do
107
- Tengine::Job::JobnetTemplate.new(options)
107
+ Tengine::Job::Template::SshJob.new(options)
108
108
  end
109
109
  @jobnet.children << result
110
110
  if preparation
111
- Tengine::Job::DslLoader.loading_template_block_store[result] = [:preparation, preparation]
111
+ Tengine::Job::Dsl::Loader.loading_template_block_store[result] = [:preparation, preparation]
112
112
  end
113
113
  result
114
114
  end
@@ -122,14 +122,14 @@ module Tengine::Job::DslLoader
122
122
 
123
123
  def hadoop_job(name, options = {})
124
124
  result = __with_redirection__(options) do
125
- Tengine::Job::JobnetTemplate.new(:name => name, :jobnet_type_key => :hadoop_job)
125
+ Tengine::Job::Template::Jobnet.new(:name => name, :jobnet_type_key => :hadoop_job)
126
126
  end
127
- result.children << start = Tengine::Job::Start.new
128
- result.children << fork = Tengine::Job::Fork.new
129
- result.children << map = Tengine::Job::JobnetTemplate.new(:name => "Map" , :jobnet_type_key => :map_phase )
130
- result.children << reduce = Tengine::Job::JobnetTemplate.new(:name => "Reduce", :jobnet_type_key => :reduce_phase)
131
- result.children << join = Tengine::Job::Join.new
132
- result.children << _end = Tengine::Job::End.new
127
+ result.children << start = Tengine::Job::Template::Start.new
128
+ result.children << fork = Tengine::Job::Template::Fork.new
129
+ result.children << map = Tengine::Job::Template::Jobnet.new(:name => "Map" , :jobnet_type_key => :map_phase )
130
+ result.children << reduce = Tengine::Job::Template::Jobnet.new(:name => "Reduce", :jobnet_type_key => :reduce_phase)
131
+ result.children << join = Tengine::Job::Template::Join.new
132
+ result.children << _end = Tengine::Job::Template::End.new
133
133
  result.edges.new(:origin_id => start.id , :destination_id => fork.id )
134
134
  result.edges.new(:origin_id => fork.id , :destination_id => map.id )
135
135
  result.edges.new(:origin_id => fork.id , :destination_id => reduce.id)
@@ -149,7 +149,7 @@ module Tengine::Job::DslLoader
149
149
  :name => root_jobnet_name,
150
150
  }.update(options)
151
151
  result = __with_redirection__(options) do
152
- Tengine::Job::Expansion.new(options)
152
+ Tengine::Job::Template::Expansion.new(options)
153
153
  end
154
154
  @jobnet.children << result
155
155
  result
@@ -177,6 +177,4 @@ module Tengine::Job::DslLoader
177
177
  result
178
178
  end
179
179
 
180
-
181
-
182
180
  end
@@ -0,0 +1,32 @@
1
+ require 'tengine/job'
2
+
3
+ module Tengine::Job::Runtime
4
+
5
+ autoload :Vertex , "tengine/job/runtime/vertex"
6
+ autoload :Edge , "tengine/job/runtime/edge"
7
+
8
+ autoload :NamedVertex , "tengine/job/runtime/named_vertex"
9
+
10
+ autoload :Jobnet , "tengine/job/runtime/jobnet"
11
+ autoload :Start , "tengine/job/runtime/jobnet"
12
+ autoload :End , "tengine/job/runtime/jobnet"
13
+
14
+ autoload :Junction , "tengine/job/runtime/junction"
15
+ autoload :Fork , "tengine/job/runtime/junction"
16
+ autoload :Join , "tengine/job/runtime/junction"
17
+
18
+ autoload :RootJobnet , "tengine/job/runtime/root_jobnet"
19
+
20
+ autoload :JobBase , "tengine/job/runtime/job_base"
21
+
22
+ autoload :SshJob , "tengine/job/runtime/ssh_job"
23
+
24
+ autoload :Executable , "tengine/job/runtime/executable"
25
+ autoload :Stoppable , "tengine/job/runtime/stoppable"
26
+
27
+ autoload :Execution , "tengine/job/runtime/execution"
28
+
29
+ autoload :Signal , 'tengine/job/runtime/signal'
30
+
31
+ autoload :StateTransition , 'tengine/job/runtime/state_transition'
32
+ end
@@ -1,11 +1,11 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  [
4
- :'start.job.job.tengine',
5
- :'stop.job.job.tengine',
6
- :'finished.process.job.tengine',
7
- :'expired.job.heartbeat.tengine',
8
- :'restart.job.job.tengine',
4
+ :'start.job.job.tengine',
5
+ :'stop.job.job.tengine',
6
+ :'finished.process.job.tengine',
7
+ :'expired.job.heartbeat.tengine',
8
+ :'restart.job.job.tengine',
9
9
  ].each do |i|
10
10
  ack_policy :after_all_handler_submit, i
11
11
  end
@@ -15,25 +15,16 @@ end
15
15
  driver :job_control_driver do
16
16
 
17
17
  on :'start.job.job.tengine' do
18
- signal = Tengine::Job::Signal.new(event)
19
- # activate
20
- root_jobnet = Tengine::Job::RootJobnetActual.find(event[:root_jobnet_id])
21
- root_jobnet.update_with_lock do
22
- signal.reset
23
- target_jobnet = root_jobnet.find_descendant(event[:target_jobnet_id]) || root_jobnet
24
- target_job = target_jobnet.find_descendant(event[:target_job_id])
25
- signal.with_paths_backup do
26
- target_job.activate(signal) # transmitは既にされているはず。
27
- end
28
- end
29
- root_jobnet.reload
30
- if signal.callback
31
- block = signal.callback
32
- signal.callback = nil
33
- block.call
18
+ signal = Tengine::Job::Runtime::Signal.new(event)
19
+ signal.reset
20
+ target_job = Tengine::Job::Runtime::NamedVertex.find(event[:target_job_id])
21
+ signal.remember_all(target_job.parent)
22
+ signal.with_paths_backup do
23
+ target_job.activate(signal) # transmitは既にされているはず。
34
24
  end
25
+ signal.process_callbacks
35
26
  if signal.callback
36
- root_jobnet.update_with_lock(&signal.callback)
27
+ target_job.update_with_lock(&signal.callback)
37
28
  end
38
29
  signal.reservations.each{|r| fire(*r.fire_args)}
39
30
  submit
@@ -49,30 +40,20 @@ driver :job_control_driver do
49
40
  i = h["root_jobnet_id"] or next
50
41
  j = h["target_jobnet_id"] or next
51
42
  k = h["target_job_id"] or next
52
- l = Tengine::Job::RootJobnetActual.find(i) or next
53
-
54
- l.update_with_lock do
55
- m = l.find_descendant(j) || l
56
- n = m.find_descendant(k)
57
- n.phase_key = :stuck
58
- end
43
+ l = Tengine::Job::Runtime::NamedVertex.find(k) or next
44
+ l.update_with_lock{ l.phase_key = :stuck }
59
45
  end
60
46
 
61
47
  on :'stop.job.job.tengine' do
62
- signal = Tengine::Job::Signal.new(event)
63
- root_jobnet = Tengine::Job::RootJobnetActual.find(event[:root_jobnet_id])
64
- root_jobnet.update_with_lock do
65
- signal.reset
66
- target_jobnet = root_jobnet.find_descendant(event[:target_jobnet_id]) || root_jobnet
67
- target_job = target_jobnet.find_descendant(event[:target_job_id])
68
- signal.with_paths_backup do
69
- target_job.stop(signal)
70
- end
71
- end
72
- root_jobnet.reload
73
- if signal.callback
74
- signal.callback.call
48
+ target_job = Tengine::Job::Runtime::NamedVertex.find(event[:target_job_id])
49
+ signal = Tengine::Job::Runtime::Signal.new(event)
50
+ signal.reset
51
+ signal.remember_all(target_job.root)
52
+ signal.cache_list
53
+ signal.with_paths_backup do
54
+ target_job.stop(signal)
75
55
  end
56
+ signal.process_callbacks
76
57
  signal.reservations.each{|r| fire(*r.fire_args)}
77
58
  submit
78
59
  end
@@ -87,24 +68,16 @@ driver :job_control_driver do
87
68
  i = h["root_jobnet_id"] or next
88
69
  j = h["target_jobnet_id"] or next
89
70
  k = h["target_job_id"] or next
90
- l = Tengine::Job::RootJobnetActual.find(i) or next
91
-
92
- l.update_with_lock do
93
- m = l.find_descendant(j) || l
94
- n = m.find_descendant(k)
95
- n.phase_key = :stuck
96
- end
71
+ l = Tengine::Job::Runtime::NamedVertex.find(k) or next
72
+ l.update_with_lock{ l.phase_key = :stuck }
97
73
  end
98
74
 
99
75
  on :'finished.process.job.tengine' do
100
- signal = Tengine::Job::Signal.new(event)
101
- root_jobnet = Tengine::Job::RootJobnetActual.find(event[:root_jobnet_id])
76
+ signal = Tengine::Job::Runtime::Signal.new(event)
102
77
  # finish
103
- root_jobnet.update_with_lock do
104
- signal.reset
105
- job = root_jobnet.find_descendant(event[:target_job_id])
106
- job.finish(signal) unless job.phase_key == :stuck
107
- end
78
+ signal.reset
79
+ job = Tengine::Job::Runtime::NamedVertex.find(event[:target_job_id])
80
+ job.finish(signal) unless job.phase_key == :stuck
108
81
  signal.reservations.each{|r| fire(*r.fire_args)}
109
82
  submit
110
83
  end
@@ -119,23 +92,13 @@ driver :job_control_driver do
119
92
  i = h["root_jobnet_id"] or next
120
93
  j = h["target_jobnet_id"] or next
121
94
  k = h["target_job_id"] or next
122
- l = Tengine::Job::RootJobnetActual.find(i) or next
123
-
124
- l.update_with_lock do
125
- m = l.find_descendant(j) || l
126
- n = m.find_descendant(k)
127
- n.phase_key = :stuck
128
- end
95
+ l = Tengine::Job::Runtime::NamedVertex.find(k) or next
96
+ l.update_with_lock{ l.phase_key = :stuck }
129
97
  end
130
98
 
131
99
  on :'expired.job.heartbeat.tengine' do
132
- event.tap do |e|
133
- Tengine::Job::RootJobnetActual.find(e[:root_jobnet_id]).tap do |r|
134
- r.update_with_lock do
135
- r.find_descendant(e[:target_job_id]).phase_key = :stuck
136
- end
137
- end
138
- end
100
+ job = Tengine::Job::Runtime::NamedVertex.find(event[:target_job_id])
101
+ job.update_with_lock{ job.phase_key = :stuck }
139
102
  submit
140
103
  end
141
104
 
@@ -149,25 +112,21 @@ driver :job_control_driver do
149
112
  i = h["root_jobnet_id"] or next
150
113
  j = h["target_jobnet_id"] or next
151
114
  k = h["target_job_id"] or next
152
- l = Tengine::Job::RootJobnetActual.find(i) or next
153
-
154
- l.update_with_lock do
155
- m = l.find_descendant(j) || l
156
- n = m.find_descendant(k)
157
- n.phase_key = :stuck
158
- end
115
+ l = Tengine::Job::Runtime::NamedVertex.find(k) or next
116
+ l.update_with_lock{ l.phase_key = :stuck }
159
117
  end
160
118
 
161
119
  on :'restart.job.job.tengine' do
162
120
  begin
163
- signal = Tengine::Job::Signal.new(event)
164
- root_jobnet = Tengine::Job::RootJobnetActual.find(event[:root_jobnet_id])
165
- root_jobnet.update_with_lock do
166
- signal.reset
167
- job = root_jobnet.find_descendant(event[:target_job_id])
168
- job.reset(signal)
169
- job.transmit(signal)
170
- end
121
+ job = Tengine::Job::Runtime::NamedVertex.find(event[:target_job_id])
122
+ signal = Tengine::Job::Runtime::Signal.new(event)
123
+ signal.reset
124
+ signal.remember_all(job.parent)
125
+ signal.cache_list
126
+ job.reset(signal)
127
+ job.transmit(signal)
128
+ # signal.changed_vertecs.each(&:save!)
129
+ signal.process_callbacks
171
130
  signal.reservations.each{|r| fire(*r.fire_args)}
172
131
  ensure
173
132
  submit
@@ -184,12 +143,7 @@ driver :job_control_driver do
184
143
  i = h["root_jobnet_id"] or next
185
144
  j = h["target_jobnet_id"] or next
186
145
  k = h["target_job_id"] or next
187
- l = Tengine::Job::RootJobnetActual.find(i) or next
188
-
189
- l.update_with_lock do
190
- m = l.find_descendant(j) || l
191
- n = m.find_descendant(k)
192
- n.phase_key = :stuck
193
- end
146
+ l = Tengine::Job::Runtime::NamedVertex.find(k) or next
147
+ l.update_with_lock{ l.phase_key = :stuck }
194
148
  end
195
149
  end
@@ -8,14 +8,17 @@ ack_policy :after_all_handler_submit, :'stop.execution.job.tengine'
8
8
  driver :job_execution_driver do
9
9
 
10
10
  on :'start.execution.job.tengine' do
11
- signal = Tengine::Job::Signal.new(event)
11
+ signal = Tengine::Job::Runtime::Signal.new(event)
12
+ signal.reset
12
13
  execution = signal.execution
13
14
  root_jobnet = execution.root_jobnet
14
- root_jobnet.update_with_lock do
15
- signal.reset
16
- execution.transmit(signal)
17
- end
18
- execution.with(safe: safemode(Tengine::Job::Execution.collection)).save!
15
+ signal.remember(execution)
16
+ signal.remember_all(root_jobnet)
17
+
18
+ execution.transmit(signal)
19
+ execution.with(safe: safemode(Tengine::Job::Runtime::Execution.collection)).save!
20
+
21
+ signal.process_callbacks
19
22
  signal.reservations.each{|r| fire(*r.fire_args)}
20
23
  submit
21
24
  end
@@ -28,20 +31,21 @@ driver :job_execution_driver do
28
31
  g = f["original_event"] or next
29
32
  h = g["properties"] or next
30
33
  i = h["execution_id"] or next
31
- j = Tengine::Job::Execution.find(i) or next
34
+ j = Tengine::Job::Runtime::Execution.find(i) or next
32
35
 
33
36
  j.update_attributes :phase_key => :stuck
34
37
  end
35
38
 
36
39
  on :'stop.execution.job.tengine' do
37
- signal = Tengine::Job::Signal.new(event)
40
+ signal = Tengine::Job::Runtime::Signal.new(event)
38
41
  execution = signal.execution
39
42
  root_jobnet = execution.root_jobnet
40
43
  root_jobnet.update_with_lock do
41
44
  signal.reset
42
45
  execution.stop(signal)
43
46
  end
44
- execution.with(safe: safemode(Tengine::Job::Execution.collection)).save!
47
+ execution.with(safe: safemode(Tengine::Job::Runtime::Execution.collection)).save!
48
+ signal.process_callbacks
45
49
  signal.reservations.each{|r| fire(*r.fire_args)}
46
50
  submit
47
51
  end
@@ -54,7 +58,7 @@ driver :job_execution_driver do
54
58
  g = f["original_event"] or next
55
59
  h = g["properties"] or next
56
60
  i = h["execution_id"] or next
57
- j = Tengine::Job::Execution.find(i) or next
61
+ j = Tengine::Job::Runtime::Execution.find(i) or next
58
62
 
59
63
  j.update_attributes :phase_key => :stuck
60
64
  end
@@ -0,0 +1,240 @@
1
+ # -*- coding: utf-8 -*-
2
+ include Tengine::Core::SafeUpdatable
3
+
4
+ [
5
+ :'start.jobnet.job.tengine',
6
+ :'success.job.job.tengine',
7
+ :'error.job.job.tengine',
8
+ :'success.jobnet.job.tengine',
9
+ :'error.jobnet.job.tengine',
10
+ :'stop.jobnet.job.tengine',
11
+ ].each do |i|
12
+ ack_policy :after_all_handler_submit, i
13
+ end
14
+
15
+
16
+ # ジョブネット制御ドライバ
17
+ driver :jobnet_control_driver do
18
+
19
+ on :'start.jobnet.job.tengine' do
20
+ signal = Tengine::Job::Runtime::Signal.new(event)
21
+ signal.reset
22
+ target_jobnet =
23
+ Tengine::Job::Runtime::Jobnet.find(event[:target_jobnet_id]) ||
24
+ Tengine::Job::Runtime::RootJobnet.find(event[:root_jobnet_id])
25
+ signal.with_paths_backup do
26
+ signal.remember(target_jobnet)
27
+ signal.remember(target_jobnet.edges)
28
+ target_jobnet.activate(signal)
29
+ end
30
+ signal.process_callbacks
31
+ signal.reservations.each{|r| fire(*r.fire_args)}
32
+ submit
33
+ end
34
+
35
+ on :'start.jobnet.job.tengine.failed.tengined' do
36
+ # このイベントは壊れていたからfailedなのかもしれない。多重送信によ
37
+ # りfailedなのかもしれない。あまりへんな仮定を置かない方が良い。
38
+ e = event
39
+ f = e.properties or next
40
+ g = f["original_event"] or next
41
+ h = g["properties"] or next
42
+ i = h["root_jobnet_id"] or next
43
+ j = h["target_jobnet_id"] or next
44
+ k = Tengine::Job::Runtime::NamedVertex.find(j) or next
45
+ k.update_with_lock{ k.phase_key = :stuck }
46
+ end
47
+
48
+ on :'success.job.job.tengine' do
49
+ signal = Tengine::Job::Runtime::Signal.new(event)
50
+ signal.reset
51
+ target_job = Tengine::Job::Runtime::NamedVertex.find(event[:target_job_id])
52
+ signal.with_paths_backup do
53
+ edge = target_job.next_edges.first
54
+ jobnet = edge.owner
55
+ signal.remember(edge)
56
+ signal.remember(jobnet)
57
+ signal.remember(jobnet.edges)
58
+ # signal.cache_list
59
+ jobnet.update_with_lock{ edge.transmit(signal) }
60
+ end
61
+ signal.process_callbacks
62
+ # (*1)
63
+ signal.reservations.each{|r| fire(*r.fire_args)}
64
+ submit
65
+ end
66
+
67
+ on :'success.job.job.tengine.failed.tengined' do
68
+ # このイベントは壊れていたからfailedなのかもしれない。多重送信によ
69
+ # りfailedなのかもしれない。あまりへんな仮定を置かない方が良い。
70
+ e = event
71
+ f = e.properties or next
72
+ g = f["original_event"] or next
73
+ h = g["properties"] or next
74
+ i = h["root_jobnet_id"] or next
75
+ j = h["target_jobnet_id"] or next
76
+ k = h["target_job_id"] or next
77
+
78
+ # 上記(*1)のポイントでtenginedが落ちた時のことを考えると、後続のエッ
79
+ # ジはもうtransmitしているが送信すべきイベントが欠けている状態であ
80
+ # るので、この場合このジョブがおかしくなっているというよりむしろジョ
81
+ # ブネット全体がおかしくなっているというべきである。
82
+ l = Tengine::Job::Runtime::NamedVertex.find(k) or next
83
+ m = l.parent || l
84
+ m.update_with_lock{ m.phase_key = :stuck }
85
+ end
86
+
87
+ on :'error.job.job.tengine' do
88
+ signal = Tengine::Job::Runtime::Signal.new(event)
89
+ signal.reset
90
+ target_job = Tengine::Job::Runtime::NamedVertex.find(event[:target_job_id])
91
+ signal.remember(target_job)
92
+ signal.with_paths_backup do
93
+ edge = target_job.next_edges.first
94
+ signal.remember_all(target_job.root)
95
+ signal.cache_list
96
+ edge.close_followings_and_trasmit(signal)
97
+ end
98
+ signal.process_callbacks
99
+ # target_jobnet = target_job.parent
100
+ # target_jobnet.jobnet_fail(signal)
101
+ signal.reservations.each{|r| fire(*r.fire_args)}
102
+ submit
103
+ end
104
+
105
+ on :'error.job.job.tengine.failed.tengined' do
106
+ # このイベントは壊れていたからfailedなのかもしれない。多重送信によ
107
+ # りfailedなのかもしれない。あまりへんな仮定を置かない方が良い。
108
+ e = event
109
+ f = e.properties or next
110
+ g = f["original_event"] or next
111
+ h = g["properties"] or next
112
+ i = h["root_jobnet_id"] or next
113
+ j = h["target_jobnet_id"] or next
114
+ k = h["target_job_id"] or next
115
+
116
+ # 同上で、この場合このジョブがおかしくなっているというよりむしろジョ
117
+ # ブネット全体がおかしくなっているというべきである。
118
+ l = Tengine::Job::Runtime::NamedVertex.find(k) or next
119
+ m = l.parent || l
120
+ m.update_with_lock{ m.phase_key = :stuck }
121
+ end
122
+
123
+ on :'success.jobnet.job.tengine' do
124
+ signal = Tengine::Job::Runtime::Signal.new(event)
125
+ signal.reset
126
+ target_jobnet = Tengine::Job::Runtime::Jobnet.find(event[:target_jobnet_id])
127
+ signal.with_paths_backup do
128
+ case target_jobnet.jobnet_type_key
129
+ when :finally then
130
+ parent = target_jobnet.parent
131
+ signal.remember_all(parent)
132
+ signal.cache_list
133
+ edge = signal.cache(parent.end_vertex.prev_edges.first)
134
+ (edge.closed? || edge.closing?) ?
135
+ parent.fail(signal) :
136
+ parent.succeed(signal)
137
+ else
138
+ if edge = signal.cache(target_jobnet.next_edges || []).first
139
+ edge.owner.update_with_lock do
140
+ edge.transmit(signal)
141
+ end
142
+ else
143
+ signal.cache(target_jobnet.parent || signal.execution).succeed(signal)
144
+ if target_jobnet.root?
145
+ signal.execution.with(sage: safemode(Tengine::Job::Runtime::Execution.collection)).save!
146
+ end
147
+ end
148
+ end
149
+ end
150
+ signal.process_callbacks
151
+ signal.reservations.each{|r| fire(*r.fire_args)}
152
+ submit
153
+ end
154
+
155
+ on :'success.jobnet.job.tengine.failed.tengined' do
156
+ # このイベントは壊れていたからfailedなのかもしれない。多重送信によ
157
+ # りfailedなのかもしれない。あまりへんな仮定を置かない方が良い。
158
+ e = event
159
+ f = e.properties or next
160
+ g = f["original_event"] or next
161
+ h = g["properties"] or next
162
+ i = h["root_jobnet_id"] or next
163
+ j = h["target_jobnet_id"] or next
164
+
165
+ k = Tengine::Job::Runtime::NamedVertex.find(j) or next
166
+ k.update_with_lock{ k.phase_key = :stuck }
167
+ end
168
+
169
+ on :'error.jobnet.job.tengine' do
170
+ signal = Tengine::Job::Runtime::Signal.new(event)
171
+ signal.reset
172
+ target_jobnet =
173
+ Tengine::Job::Runtime::Jobnet.find(event[:target_jobnet_id]) ||
174
+ Tengine::Job::Runtime::RootJobnet.find(event[:root_jobnet_id])
175
+ signal.with_paths_backup do
176
+ case target_jobnet.jobnet_type_key
177
+ when :finally then
178
+ target_jobnet.parent.fail(signal)
179
+ else
180
+ signal.remember_all(target_jobnet.root)
181
+ if edge = (target_jobnet.next_edges || []).first
182
+ edge.close_followings_and_trasmit(signal)
183
+ else
184
+ (target_jobnet.parent || signal.execution).fail(signal)
185
+ if target_jobnet.root?
186
+ signal.execution.with(safe: safemode(Tengine::Job::Runtime::Execution.collection)).save!
187
+ end
188
+ end
189
+ end
190
+ end
191
+ signal.process_callbacks
192
+ # if target_parent = target_jobnet.parent
193
+ # target_parent.end_vertex.transmit(signal)
194
+ # end
195
+ signal.reservations.each{|r| fire(*r.fire_args)}
196
+ submit
197
+ end
198
+
199
+ on :'error.jobnet.job.tengine.failed.tengined' do
200
+ # このイベントは壊れていたからfailedなのかもしれない。多重送信によ
201
+ # りfailedなのかもしれない。あまりへんな仮定を置かない方が良い。
202
+ e = event
203
+ f = e.properties or next
204
+ g = f["original_event"] or next
205
+ h = g["properties"] or next
206
+ i = h["root_jobnet_id"] or next
207
+ j = h["target_jobnet_id"] or next
208
+
209
+ k = Tengine::Job::Runtime::NamedVertex.find(j) or next
210
+ k.update_with_lock{ k.phase_key = :stuck }
211
+ end
212
+
213
+ on :'stop.jobnet.job.tengine' do
214
+ signal = Tengine::Job::Runtime::Signal.new(event)
215
+ signal.reset
216
+ target_jobnet =
217
+ Tengine::Job::Runtime::Jobnet.find(event[:target_jobnet_id]) ||
218
+ Tengine::Job::Runtime::RootJobnet.find(event[:root_jobnet_id])
219
+ # signal.remember_all(target_jobnet)
220
+ # signal.cache_list
221
+ target_jobnet.stop(signal)
222
+ signal.process_callbacks
223
+ signal.reservations.each{|r| fire(*r.fire_args) }
224
+ submit
225
+ end
226
+
227
+ on :'stop.jobnet.job.tengine.failed.tengined' do
228
+ # このイベントは壊れていたからfailedなのかもしれない。多重送信によ
229
+ # りfailedなのかもしれない。あまりへんな仮定を置かない方が良い。
230
+ e = event
231
+ f = e.properties or next
232
+ g = f["original_event"] or next
233
+ h = g["properties"] or next
234
+ i = h["root_jobnet_id"] or next
235
+ j = h["target_jobnet_id"] or next
236
+
237
+ k = Tengine::Job::Runtime::NamedVertex.find(j) or next
238
+ k.update_with_lock{ k.phase_key = :stuck }
239
+ end
240
+ end