fasten 0.5.4 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +4 -0
- data/Gemfile.lock +11 -9
- data/exe/fasten +5 -0
- data/fasten.gemspec +4 -2
- data/lib/fasten.rb +86 -31
- data/lib/fasten/{executor.rb → runner.rb} +102 -28
- data/lib/fasten/std_thread_proxy.rb +56 -0
- data/lib/fasten/support/dag.rb +130 -0
- data/lib/fasten/support/fork_worker.rb +107 -0
- data/lib/fasten/support/logger.rb +57 -0
- data/lib/fasten/support/state.rb +32 -0
- data/lib/fasten/support/stats.rb +137 -0
- data/lib/fasten/support/thread_worker.rb +61 -0
- data/lib/fasten/support/ui.rb +22 -0
- data/lib/fasten/support/yaml.rb +54 -0
- data/lib/fasten/task.rb +16 -7
- data/lib/fasten/timeout_queue.rb +36 -0
- data/lib/fasten/ui/console.rb +7 -7
- data/lib/fasten/ui/curses.rb +26 -22
- data/lib/fasten/version.rb +1 -1
- data/lib/fasten/worker.rb +48 -81
- metadata +34 -14
- data/lib/fasten/dag.rb +0 -137
- data/lib/fasten/logger.rb +0 -62
- data/lib/fasten/state.rb +0 -30
- data/lib/fasten/stats.rb +0 -137
- data/lib/fasten/ui.rb +0 -18
- data/lib/fasten/yaml.rb +0 -48
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'fasten/std_thread_proxy'
|
2
|
+
|
3
|
+
module Fasten
|
4
|
+
module Support
|
5
|
+
module ThreadWorker
|
6
|
+
attr_accessor :thread
|
7
|
+
|
8
|
+
def start
|
9
|
+
@queue = Queue.new
|
10
|
+
|
11
|
+
self.thread = Thread.new do
|
12
|
+
process_incoming_requests
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def kill
|
17
|
+
log_info 'Removing worker'
|
18
|
+
thread.exit
|
19
|
+
rescue StandardError => error
|
20
|
+
log_warn "Ignoring error killing worker #{self}, error: #{error}"
|
21
|
+
ensure
|
22
|
+
@queue.clear
|
23
|
+
end
|
24
|
+
|
25
|
+
def send_request_to_child(task)
|
26
|
+
task.state = :RUNNING
|
27
|
+
task.worker = self
|
28
|
+
self.running_task = task
|
29
|
+
self.state = :RUNNING
|
30
|
+
|
31
|
+
@queue.push task
|
32
|
+
end
|
33
|
+
|
34
|
+
def receive_request_from_parent
|
35
|
+
@queue.pop
|
36
|
+
end
|
37
|
+
|
38
|
+
def send_response_to_parent(task)
|
39
|
+
log_info "Sending task response back to runner #{task}"
|
40
|
+
|
41
|
+
runner.queue.push task
|
42
|
+
end
|
43
|
+
|
44
|
+
def redirect_std(path)
|
45
|
+
StdThreadProxy.install
|
46
|
+
|
47
|
+
FileUtils.mkdir_p File.dirname(path)
|
48
|
+
@redirect_log = File.new path, 'a'
|
49
|
+
@redirect_log.sync = true
|
50
|
+
StdThreadProxy.thread_io = @redirect_log
|
51
|
+
logger.reopen(@redirect_log)
|
52
|
+
end
|
53
|
+
|
54
|
+
def restore_std
|
55
|
+
@redirect_log&.close
|
56
|
+
StdThreadProxy.thread_io = nil
|
57
|
+
logger.reopen(log_file)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'fasten/ui/console'
|
2
|
+
|
3
|
+
module Fasten
|
4
|
+
module Support
|
5
|
+
module UI
|
6
|
+
def ui
|
7
|
+
require 'fasten/ui/curses'
|
8
|
+
@ui ||= STDIN.tty? && STDOUT.tty? ? Fasten::UI::Curses.new(runner: self) : Fasten::UI::Console.new(runner: self)
|
9
|
+
rescue StandardError, LoadError
|
10
|
+
@ui = Fasten::UI::Console.new(runner: self)
|
11
|
+
end
|
12
|
+
|
13
|
+
def run_ui
|
14
|
+
ui.update
|
15
|
+
|
16
|
+
yield
|
17
|
+
ensure
|
18
|
+
ui.cleanup
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Fasten
|
4
|
+
module Support
|
5
|
+
module Yaml
|
6
|
+
def load_yaml(path)
|
7
|
+
items = YAML.safe_load(File.read(path)).each do |name, params|
|
8
|
+
if params.is_a? String
|
9
|
+
params = { after: params }
|
10
|
+
elsif params.is_a? Hash
|
11
|
+
transform_params(params)
|
12
|
+
else
|
13
|
+
params = {}
|
14
|
+
end
|
15
|
+
|
16
|
+
add Fasten::Task.new({ name: name }.merge(params))
|
17
|
+
end
|
18
|
+
|
19
|
+
log_info "Loaded #{items.count} tasks from #{path}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def save_yaml(path)
|
23
|
+
keys = %i[after shell]
|
24
|
+
|
25
|
+
items = task_list.map do |task|
|
26
|
+
data = task.to_h.select do |key, _val|
|
27
|
+
keys.include? key
|
28
|
+
end
|
29
|
+
|
30
|
+
[task.name, data]
|
31
|
+
end.to_h
|
32
|
+
|
33
|
+
File.write path, items.to_yaml
|
34
|
+
|
35
|
+
log_info "Loaded #{items.count} tasks into #{path}"
|
36
|
+
end
|
37
|
+
|
38
|
+
protected
|
39
|
+
|
40
|
+
def transform_params(params)
|
41
|
+
params.keys.each do |k|
|
42
|
+
val = params[k]
|
43
|
+
|
44
|
+
if val.is_a?(String) && (match = %r{^/(.+)/$}.match(val))
|
45
|
+
val = Regexp.new(match[1])
|
46
|
+
end
|
47
|
+
|
48
|
+
params[k.to_sym] = val
|
49
|
+
params.delete(k)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/lib/fasten/task.rb
CHANGED
@@ -1,25 +1,34 @@
|
|
1
|
+
require 'fasten/support/state'
|
2
|
+
|
1
3
|
module Fasten
|
2
4
|
class Task
|
3
|
-
include Fasten::
|
4
|
-
include Fasten::State
|
5
|
+
include Fasten::Support::State
|
5
6
|
|
6
7
|
attr_accessor :name, :after, :shell, :ruby
|
7
|
-
attr_accessor :dependants, :depends, :request, :response, :worker, :run_score
|
8
|
+
attr_accessor :dependants, :depends, :request, :response, :worker, :run_score, :block
|
8
9
|
|
9
|
-
def initialize(name: nil, shell: nil, ruby: nil, request: nil, after: nil)
|
10
|
+
def initialize(name: nil, shell: nil, ruby: nil, block: nil, request: nil, after: nil)
|
10
11
|
self.name = name
|
11
|
-
self.after = after
|
12
12
|
self.shell = shell
|
13
13
|
self.ruby = ruby
|
14
|
+
self.block = block
|
14
15
|
self.request = request
|
16
|
+
self.after = after
|
15
17
|
end
|
16
18
|
|
17
19
|
def marshal_dump
|
18
|
-
[@name, @state, @ini, @fin, @dif, @request, @response, @shell, @ruby, @error]
|
20
|
+
[@name, @state, @ini, @fin, @dif, @request, @response, @shell, @ruby, @block&.object_id, @error]
|
19
21
|
end
|
20
22
|
|
21
23
|
def marshal_load(data)
|
22
|
-
@name, @state, @ini, @fin, @dif, @request, @response, @shell, @ruby, @error = data
|
24
|
+
@name, @state, @ini, @fin, @dif, @request, @response, @shell, @ruby, block_id, @error = data
|
25
|
+
@block = ObjectSpace._id2ref block_id if block_id
|
26
|
+
|
27
|
+
raise "Sorry, unable to get block for task #{self}, please try using threads" if block_id && !@block.is_a?(Proc)
|
28
|
+
end
|
29
|
+
|
30
|
+
def kind
|
31
|
+
'task'
|
23
32
|
end
|
24
33
|
|
25
34
|
def to_s
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Fasten
|
2
|
+
class TimeoutQueue
|
3
|
+
def initialize
|
4
|
+
@mutex = Mutex.new
|
5
|
+
@queue = []
|
6
|
+
@received = ConditionVariable.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def push(object)
|
10
|
+
@mutex.synchronize do
|
11
|
+
@queue << object
|
12
|
+
@received.signal
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def receive_with_timeout(timeout = nil) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
17
|
+
@mutex.synchronize do
|
18
|
+
if timeout.nil?
|
19
|
+
# wait indefinitely until there is an element in the queue
|
20
|
+
@received.wait(@mutex) while @queue.empty?
|
21
|
+
elsif @queue.empty? && timeout != 0
|
22
|
+
# wait for element or timeout
|
23
|
+
timeout_time = timeout + Time.now.to_f
|
24
|
+
while @queue.empty? && (remaining_time = timeout_time - Time.now.to_f).positive?
|
25
|
+
@received.wait(@mutex, remaining_time)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
items = []
|
30
|
+
items << @queue.shift until @queue.empty?
|
31
|
+
|
32
|
+
items
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/fasten/ui/console.rb
CHANGED
@@ -5,13 +5,13 @@ module Fasten
|
|
5
5
|
class Console
|
6
6
|
extend Forwardable
|
7
7
|
|
8
|
-
def_delegators :
|
9
|
-
def_delegators :
|
8
|
+
def_delegators :runner, :worker_list, :task_list, :task_done_list, :task_error_list, :task_running_list, :task_waiting_list, :worker_list
|
9
|
+
def_delegators :runner, :name, :workers, :workers=, :state, :state=, :hformat
|
10
10
|
|
11
|
-
attr_accessor :
|
11
|
+
attr_accessor :runner
|
12
12
|
|
13
|
-
def initialize(
|
14
|
-
@
|
13
|
+
def initialize(runner:)
|
14
|
+
@runner = runner
|
15
15
|
@old = {
|
16
16
|
task_done_list: [],
|
17
17
|
task_error_list: []
|
@@ -22,7 +22,7 @@ module Fasten
|
|
22
22
|
puts <<~FIN
|
23
23
|
|
24
24
|
= == === ==== ===== ====== ======= ======== ========= ==========
|
25
|
-
Fasten your seatbelts! #{'💺' * workers}
|
25
|
+
Fasten your seatbelts! #{'💺' * workers} #{runner.use_threads ? 'threads' : 'processes'}
|
26
26
|
|
27
27
|
#{name}
|
28
28
|
FIN
|
@@ -50,7 +50,7 @@ module Fasten
|
|
50
50
|
return unless old.count != orig.count
|
51
51
|
|
52
52
|
(orig - old).each do |task|
|
53
|
-
puts "Time: #{hformat Time.new -
|
53
|
+
puts "Time: #{hformat Time.new - runner.ini} #{message} #{hformat task.dif} Task #{task}"
|
54
54
|
old << task
|
55
55
|
end
|
56
56
|
end
|
data/lib/fasten/ui/curses.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'curses'
|
3
4
|
require 'forwardable'
|
4
5
|
|
5
6
|
module Fasten
|
@@ -8,18 +9,18 @@ module Fasten
|
|
8
9
|
include ::Curses
|
9
10
|
extend Forwardable
|
10
11
|
|
11
|
-
def_delegators :
|
12
|
-
def_delegators :
|
12
|
+
def_delegators :runner, :worker_list, :task_list, :task_done_list, :task_error_list, :task_running_list, :task_waiting_list, :worker_list
|
13
|
+
def_delegators :runner, :name, :workers, :workers=, :state, :state=
|
13
14
|
|
14
|
-
attr_accessor :n_rows, :n_cols, :clear_needed, :message, :
|
15
|
+
attr_accessor :n_rows, :n_cols, :selected, :sel_index, :clear_needed, :message, :runner
|
15
16
|
|
16
17
|
SPINNER_STR = '⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏'
|
17
18
|
SPINNER_LEN = SPINNER_STR.length
|
18
19
|
PROGRESSBAR_STR = ' ▏▎▍▌▋▊▉'
|
19
20
|
PROGRESSBAR_LEN = PROGRESSBAR_STR.length
|
20
21
|
|
21
|
-
def initialize(
|
22
|
-
@
|
22
|
+
def initialize(runner:)
|
23
|
+
@runner = runner
|
23
24
|
end
|
24
25
|
|
25
26
|
def update
|
@@ -99,11 +100,17 @@ module Fasten
|
|
99
100
|
self.message = "Can't remove 1 worker left, press [P] to pause"
|
100
101
|
else
|
101
102
|
self.workers -= 1
|
102
|
-
self.message = "Decreasing
|
103
|
+
self.message = "Decreasing workers to #{workers}"
|
103
104
|
end
|
104
105
|
elsif key == Curses::Key::RIGHT
|
105
106
|
self.workers += 1
|
106
|
-
self.message = "Increasing
|
107
|
+
self.message = "Increasing workers to #{workers}"
|
108
|
+
elsif key == Curses::Key::DOWN
|
109
|
+
self.sel_index = sel_index ? [sel_index + 1, task_list.count - 1].min : 0
|
110
|
+
self.selected = task_list[sel_index]
|
111
|
+
elsif key == Curses::Key::UP
|
112
|
+
self.sel_index = sel_index ? [sel_index - 1, 0].max : task_list.count - 1
|
113
|
+
self.selected = task_list[sel_index]
|
107
114
|
elsif key == 'q'
|
108
115
|
self.message = 'Will quit when running tasks end'
|
109
116
|
self.state = :QUITTING
|
@@ -122,7 +129,7 @@ module Fasten
|
|
122
129
|
waiting_count = task_waiting_list.count
|
123
130
|
workers_count = worker_list.count
|
124
131
|
|
125
|
-
"Procs: #{running_count}
|
132
|
+
"Procs run: #{running_count} idle: #{workers_count - running_count} #{runner.use_threads ? 'threads' : 'processes'}: #{workers} wait: #{waiting_count}"
|
126
133
|
end
|
127
134
|
|
128
135
|
def ui_workers
|
@@ -140,13 +147,13 @@ module Fasten
|
|
140
147
|
end
|
141
148
|
|
142
149
|
def ui_state
|
143
|
-
if
|
150
|
+
if runner.running?
|
144
151
|
attrs = color_pair(2)
|
145
|
-
elsif
|
152
|
+
elsif runner.pausing?
|
146
153
|
attrs = color_pair(1) | A_BLINK | A_STANDOUT
|
147
|
-
elsif
|
154
|
+
elsif runner.paused?
|
148
155
|
attrs = color_pair(1) | A_STANDOUT
|
149
|
-
elsif
|
156
|
+
elsif runner.quitting?
|
150
157
|
attrs = color_pair(3) | A_BLINK | A_STANDOUT
|
151
158
|
end
|
152
159
|
|
@@ -188,19 +195,16 @@ module Fasten
|
|
188
195
|
end
|
189
196
|
|
190
197
|
def ui_task_color(task)
|
198
|
+
rev = task == selected ? A_REVERSE : 0
|
191
199
|
case task.state
|
192
200
|
when :RUNNING
|
193
|
-
color_pair(1) | A_TOP
|
201
|
+
color_pair(1) | A_TOP | rev
|
194
202
|
when :FAIL
|
195
|
-
color_pair(3) | A_TOP
|
203
|
+
color_pair(3) | A_TOP | rev
|
196
204
|
when :DONE
|
197
|
-
color_pair(2) | A_TOP
|
205
|
+
color_pair(2) | A_TOP | rev
|
198
206
|
else
|
199
|
-
|
200
|
-
A_TOP
|
201
|
-
else
|
202
|
-
color_pair(4) | A_DIM
|
203
|
-
end
|
207
|
+
task_waiting_list.include?(task) ? A_TOP | rev : color_pair(4) | A_DIM | rev
|
204
208
|
end
|
205
209
|
end
|
206
210
|
|
@@ -227,7 +231,7 @@ module Fasten
|
|
227
231
|
count_done = task_done_list.count
|
228
232
|
count_total = task_list.count
|
229
233
|
tl = count_total.to_s.length
|
230
|
-
col_ini = ui_text_aligned(2, :left, format("Tasks
|
234
|
+
col_ini = ui_text_aligned(2, :left, format("Tasks %#{tl}d/%d", count_done, count_total)) + 1
|
231
235
|
col_fin = n_cols - 5
|
232
236
|
ui_text_aligned(2, :right, "#{(count_done * 100 / count_total).to_i}%") if count_total.positive?
|
233
237
|
|
@@ -253,7 +257,7 @@ module Fasten
|
|
253
257
|
end
|
254
258
|
else
|
255
259
|
x = max + 1
|
256
|
-
last =
|
260
|
+
last = runner.stats_last(task)
|
257
261
|
if task.dif
|
258
262
|
str = format ' %.2f s', task.dif
|
259
263
|
elsif last['avg'] && last['err']
|
data/lib/fasten/version.rb
CHANGED
data/lib/fasten/worker.rb
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
require 'English'
|
2
|
+
require 'fasten/support/logger'
|
3
|
+
require 'fasten/support/state'
|
4
|
+
require 'fasten/support/fork_worker'
|
5
|
+
require 'fasten/support/thread_worker'
|
6
|
+
|
1
7
|
module Fasten
|
2
8
|
class WorkerError < StandardError
|
3
9
|
attr_reader :backtrace
|
@@ -9,97 +15,65 @@ module Fasten
|
|
9
15
|
end
|
10
16
|
|
11
17
|
class Worker
|
12
|
-
include Fasten::Logger
|
13
|
-
include Fasten::State
|
18
|
+
include Fasten::Support::Logger
|
19
|
+
include Fasten::Support::State
|
20
|
+
|
21
|
+
attr_accessor :runner, :name, :spinner, :child_read, :child_write, :parent_read, :parent_write, :running_task
|
14
22
|
|
15
|
-
|
23
|
+
def initialize(runner:, name: nil, use_threads: nil)
|
24
|
+
if use_threads
|
25
|
+
extend Fasten::Support::ThreadWorker
|
26
|
+
else
|
27
|
+
extend Fasten::Support::ForkWorker
|
28
|
+
end
|
16
29
|
|
17
|
-
|
18
|
-
self.executor = executor
|
30
|
+
self.runner = runner
|
19
31
|
self.name = name
|
20
32
|
self.spinner = 0
|
21
|
-
end
|
22
33
|
|
23
|
-
|
24
|
-
perform_shell(task) if task.shell
|
25
|
-
perform_ruby(task) if task.ruby
|
26
|
-
perform_block(task) if block
|
27
|
-
end
|
28
|
-
|
29
|
-
def perform_ruby(task)
|
30
|
-
task.response = eval task.ruby # rubocop:disable Security/Eval we trust our users ;-)
|
34
|
+
initialize_logger(log_file: runner&.log_file)
|
31
35
|
end
|
32
36
|
|
33
|
-
def
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
task.response = block.call(task.request)
|
41
|
-
end
|
42
|
-
|
43
|
-
def fork
|
44
|
-
create_pipes
|
45
|
-
|
46
|
-
self.pid = Process.fork do
|
47
|
-
close_parent_pipes
|
48
|
-
|
49
|
-
process_incoming_requests
|
37
|
+
def perform(task)
|
38
|
+
if task.ruby
|
39
|
+
perform_ruby(task)
|
40
|
+
elsif task.shell
|
41
|
+
perform_shell(task)
|
42
|
+
elsif task.block
|
43
|
+
perform_block(task, task.block)
|
50
44
|
end
|
51
|
-
|
52
|
-
close_child_pipes
|
53
|
-
end
|
54
|
-
|
55
|
-
def send_request(task)
|
56
|
-
task.state = :RUNNING
|
57
|
-
task.worker = self
|
58
|
-
self.running_task = task
|
59
|
-
self.state = :RUNNING
|
60
|
-
Marshal.dump(task, parent_write)
|
61
45
|
end
|
62
46
|
|
63
|
-
def
|
64
|
-
|
65
|
-
|
66
|
-
%i[state ini fin dif response error].each { |key| running_task.send "#{key}=", updated_task.send(key) }
|
67
|
-
|
68
|
-
task = running_task
|
69
|
-
self.running_task = self.state = nil
|
70
|
-
|
71
|
-
task
|
47
|
+
def kind
|
48
|
+
'worker'
|
72
49
|
end
|
73
50
|
|
74
|
-
def
|
75
|
-
|
76
|
-
Process.kill :KILL, pid
|
77
|
-
close_parent_pipes
|
78
|
-
rescue StandardError => error
|
79
|
-
log_warn "Ignoring error killing worker #{self}, error: #{error}"
|
51
|
+
def to_s
|
52
|
+
name
|
80
53
|
end
|
81
54
|
|
82
55
|
protected
|
83
56
|
|
84
|
-
def
|
85
|
-
|
86
|
-
self.parent_read, self.child_write = IO.pipe
|
57
|
+
def perform_ruby(task)
|
58
|
+
task.response = eval task.ruby # rubocop:disable Security/Eval we trust our users ;-)
|
87
59
|
end
|
88
60
|
|
89
|
-
def
|
90
|
-
|
91
|
-
|
61
|
+
def perform_shell(task)
|
62
|
+
shell_pid = spawn task.shell, out: @redirect_log, err: @redirect_log
|
63
|
+
Process.wait shell_pid
|
64
|
+
result = $CHILD_STATUS
|
65
|
+
|
66
|
+
raise "Command failed with exit code: #{result.exitstatus}" unless result.exitstatus.zero?
|
92
67
|
end
|
93
68
|
|
94
|
-
def
|
95
|
-
|
96
|
-
child_write.close unless child_write.closed?
|
69
|
+
def perform_block(task, block)
|
70
|
+
task.response = instance_exec task.request, &block
|
97
71
|
end
|
98
72
|
|
99
73
|
def process_incoming_requests
|
100
74
|
log_ini self, 'process_incoming_requests'
|
101
75
|
|
102
|
-
while (object =
|
76
|
+
while (object = receive_request_from_parent)
|
103
77
|
run_task(object) if object.is_a? Fasten::Task
|
104
78
|
end
|
105
79
|
|
@@ -109,19 +83,18 @@ module Fasten
|
|
109
83
|
end
|
110
84
|
|
111
85
|
def run_task(task)
|
112
|
-
log_ini task, '
|
113
|
-
|
114
|
-
redirect_std "#{executor.fasten_dir}/log/task/#{task.name}.log"
|
86
|
+
log_ini task, 'run_task'
|
87
|
+
redirect_std "#{runner.fasten_dir}/log/task/#{task.name}.log"
|
115
88
|
|
116
89
|
perform_task task
|
117
|
-
|
90
|
+
ensure
|
118
91
|
restore_std
|
119
|
-
|
120
|
-
log_fin task, '
|
92
|
+
logger.reopen(log_file)
|
93
|
+
log_fin task, 'run_task'
|
121
94
|
end
|
122
95
|
|
123
96
|
def perform_task(task)
|
124
|
-
log_ini task, '
|
97
|
+
log_ini task, 'perform_task'
|
125
98
|
|
126
99
|
perform(task)
|
127
100
|
task.state = :DONE
|
@@ -129,14 +102,8 @@ module Fasten
|
|
129
102
|
task.state = :FAIL
|
130
103
|
task.error = WorkerError.new(error)
|
131
104
|
ensure
|
132
|
-
log_fin task, '
|
133
|
-
|
134
|
-
end
|
135
|
-
|
136
|
-
def send_response(task)
|
137
|
-
log_info "Sending task response back to executor #{task}"
|
138
|
-
data = Marshal.dump(task)
|
139
|
-
child_write.write(data)
|
105
|
+
log_fin task, 'perform_task'
|
106
|
+
send_response_to_parent(task)
|
140
107
|
end
|
141
108
|
end
|
142
109
|
end
|