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.
- checksums.yaml +15 -0
- data/Gemfile.lock +78 -48
- data/bin/tengine_job +71 -0
- data/examples/0004_retry_one_layer.rb +10 -7
- data/examples/0027_parallel_ssh_job +9 -0
- data/examples/0027_parallel_ssh_jobs.rb +14 -0
- data/lib/tengine/job.rb +19 -49
- data/lib/tengine/job/dsl.rb +13 -0
- data/lib/tengine/job/{dsl_binder.rb → dsl/binder.rb} +4 -4
- data/lib/tengine/job/{dsl_evaluator.rb → dsl/evaluator.rb} +2 -2
- data/lib/tengine/job/{dsl_loader.rb → dsl/loader.rb} +20 -22
- data/lib/tengine/job/runtime.rb +32 -0
- data/lib/tengine/job/{drivers → runtime/drivers}/job_control_driver.rb +46 -92
- data/lib/tengine/job/{drivers → runtime/drivers}/job_execution_driver.rb +14 -10
- data/lib/tengine/job/runtime/drivers/jobnet_control_driver.rb +240 -0
- data/lib/tengine/job/{drivers → runtime/drivers}/schedule_driver.rb +4 -4
- data/lib/tengine/job/{edge.rb → runtime/edge.rb} +79 -25
- data/lib/tengine/job/{executable.rb → runtime/executable.rb} +35 -15
- data/lib/tengine/job/{execution.rb → runtime/execution.rb} +19 -11
- data/lib/tengine/job/runtime/job_base.rb +5 -0
- data/lib/tengine/job/runtime/jobnet.rb +283 -0
- data/lib/tengine/job/runtime/junction.rb +44 -0
- data/lib/tengine/job/runtime/named_vertex.rb +95 -0
- data/lib/tengine/job/runtime/root_jobnet.rb +81 -0
- data/lib/tengine/job/{signal.rb → runtime/signal.rb} +99 -13
- data/lib/tengine/job/runtime/ssh_job.rb +486 -0
- data/lib/tengine/job/{jobnet → runtime}/state_transition.rb +6 -4
- data/lib/tengine/job/runtime/stoppable.rb +64 -0
- data/lib/tengine/job/runtime/vertex.rb +50 -0
- data/lib/tengine/job/structure.rb +20 -0
- data/lib/tengine/job/{category.rb → structure/category.rb} +9 -5
- data/lib/tengine/job/{jobnet/builder.rb → structure/edge_builder.rb} +11 -7
- data/lib/tengine/job/{element_selector_notation.rb → structure/element_selector_notation.rb} +15 -11
- data/lib/tengine/job/structure/jobnet_builder.rb +83 -0
- data/lib/tengine/job/structure/jobnet_finder.rb +60 -0
- data/lib/tengine/job/{name_path.rb → structure/name_path.rb} +2 -2
- data/lib/tengine/job/structure/tree.rb +20 -0
- data/lib/tengine/job/structure/visitor.rb +67 -0
- data/lib/tengine/job/template.rb +24 -0
- data/lib/tengine/job/template/edge.rb +37 -0
- data/lib/tengine/job/template/expansion.rb +24 -0
- data/lib/tengine/job/template/generator.rb +111 -0
- data/lib/tengine/job/template/jobnet.rb +83 -0
- data/lib/tengine/job/template/junction.rb +14 -0
- data/lib/tengine/job/{job.rb → template/named_vertex.rb} +3 -5
- data/lib/tengine/job/{root_jobnet_template.rb → template/root_jobnet.rb} +12 -26
- data/lib/tengine/job/template/ssh_job.rb +80 -0
- data/lib/tengine/job/template/vertex.rb +97 -0
- metadata +127 -93
- data/lib/tengine/job/connectable.rb +0 -43
- data/lib/tengine/job/drivers/jobnet_control_driver.rb +0 -249
- data/lib/tengine/job/end.rb +0 -32
- data/lib/tengine/job/expansion.rb +0 -37
- data/lib/tengine/job/fork.rb +0 -6
- data/lib/tengine/job/jobnet.rb +0 -184
- data/lib/tengine/job/jobnet/job_state_transition.rb +0 -167
- data/lib/tengine/job/jobnet/jobnet_state_transition.rb +0 -110
- data/lib/tengine/job/jobnet_actual.rb +0 -84
- data/lib/tengine/job/jobnet_template.rb +0 -10
- data/lib/tengine/job/join.rb +0 -6
- data/lib/tengine/job/junction.rb +0 -29
- data/lib/tengine/job/killing.rb +0 -30
- data/lib/tengine/job/mm_compatibility.rb +0 -6
- data/lib/tengine/job/mm_compatibility/connectable.rb +0 -13
- data/lib/tengine/job/root.rb +0 -16
- data/lib/tengine/job/root_jobnet_actual.rb +0 -58
- data/lib/tengine/job/script_executable.rb +0 -235
- data/lib/tengine/job/start.rb +0 -20
- data/lib/tengine/job/stoppable.rb +0 -15
- 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::
|
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::
|
6
|
-
include Tengine::Job::
|
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::
|
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::
|
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::
|
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::
|
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
|
-
:
|
102
|
-
:
|
103
|
-
:
|
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::
|
107
|
+
Tengine::Job::Template::SshJob.new(options)
|
108
108
|
end
|
109
109
|
@jobnet.children << result
|
110
110
|
if preparation
|
111
|
-
Tengine::Job::
|
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::
|
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::
|
130
|
-
result.children << reduce = Tengine::Job::
|
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
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
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
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
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
|
-
|
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::
|
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
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
signal
|
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::
|
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
|
-
|
104
|
-
|
105
|
-
|
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::
|
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
|
-
|
133
|
-
|
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::
|
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
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
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::
|
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
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
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
|