rbbt-util 5.13.3 → 5.13.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/rbbt +5 -0
- data/lib/rbbt/persist.rb +10 -8
- data/lib/rbbt/tsv/parallel/traverse.rb +12 -2
- data/lib/rbbt/tsv/stream.rb +2 -1
- data/lib/rbbt/util/log/progress.rb +6 -2
- data/lib/rbbt/util/misc/concurrent_stream.rb +8 -5
- data/lib/rbbt/util/misc/lock.rb +0 -1
- data/lib/rbbt/util/misc/objects.rb +1 -1
- data/lib/rbbt/util/misc/pipes.rb +12 -6
- data/lib/rbbt/workflow.rb +1 -1
- data/lib/rbbt/workflow/accessor.rb +1 -1
- data/lib/rbbt/workflow/step.rb +1 -1
- data/lib/rbbt/workflow/step/run.rb +35 -29
- data/share/rbbt_commands/workflow/task +1 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 43ee6ce8a12a65ea0a42e62a3eef0a917c084051
|
4
|
+
data.tar.gz: 91fc982769f590d4f33738c87c459afeaa5dd7be
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 18a0478c57dd34188715d0eede18d661739f862dcc40a303383254638a93c73ae4a2bf294bcfdf2d5480f895321a8c94eafdcecf0b1a2cbcddd510103ed8311c
|
7
|
+
data.tar.gz: 3a3e30b11a53ea72d7b76065a646a05faec9607c53046f69db78842be35072208e23b235121fe9e909646031b45ddcff4d6f4874e1158cb0b4f30367173868f1
|
data/bin/rbbt
CHANGED
@@ -13,6 +13,7 @@ $ rbbt <command> <subcommand> ... -a --arg1 --arg2='value' --arg3 'another-value
|
|
13
13
|
-cd--command_dir* #{Log.color :yellow, "Directory from where to load command scripts"}
|
14
14
|
--profile #{Log.color :yellow, "Profile execution"}
|
15
15
|
--nocolor #{Log.color :yellow, "Disable colored output"}
|
16
|
+
--nobar #{Log.color :yellow, "Disable progress report"}
|
16
17
|
--locate_file #{Log.color :yellow, "Report the location of the script instead of executing it"}
|
17
18
|
EOF
|
18
19
|
|
@@ -20,6 +21,10 @@ if options[:nocolor]
|
|
20
21
|
Log.nocolor = true
|
21
22
|
end
|
22
23
|
|
24
|
+
if options.delete :nobar
|
25
|
+
ENV["RBBT_NO_PROGRESS"] = "true"
|
26
|
+
end
|
27
|
+
|
23
28
|
locate = options.delete :locate_file
|
24
29
|
|
25
30
|
if options[:log]
|
data/lib/rbbt/persist.rb
CHANGED
@@ -190,7 +190,7 @@ module Persist
|
|
190
190
|
end
|
191
191
|
end
|
192
192
|
|
193
|
-
def self.tee_stream_thread(stream, path, type, callback = nil)
|
193
|
+
def self.tee_stream_thread(stream, path, type, callback = nil, abort_callback = nil)
|
194
194
|
file, out = Misc.tee_stream(stream)
|
195
195
|
|
196
196
|
saver_thread = Thread.new(Thread.current) do |parent|
|
@@ -209,9 +209,12 @@ module Persist
|
|
209
209
|
end
|
210
210
|
end
|
211
211
|
ConcurrentStream.setup(out, :threads => saver_thread, :filename => path)
|
212
|
+
out.callback = callback
|
213
|
+
out.abort_callback = abort_callback
|
214
|
+
out
|
212
215
|
end
|
213
216
|
|
214
|
-
def self.tee_stream_pipe(stream, path, type, callback = nil)
|
217
|
+
def self.tee_stream_pipe(stream, path, type, callback = nil, abort_callback = nil)
|
215
218
|
parent_pid = Process.pid
|
216
219
|
out = Misc.open_pipe true, false do |sin|
|
217
220
|
begin
|
@@ -280,12 +283,11 @@ module Persist
|
|
280
283
|
if persist_options[:no_load] == :stream
|
281
284
|
case res
|
282
285
|
when IO
|
283
|
-
res = tee_stream(res, path, type, res.respond_to?(:callback)? res.callback : nil)
|
286
|
+
res = tee_stream(res, path, type, res.respond_to?(:callback)? res.callback : nil, res.respond_to?(:abort_callback)? res.abort_callback : nil)
|
284
287
|
ConcurrentStream.setup res do
|
285
288
|
begin
|
286
289
|
lockfile.unlock if File.exists? lockfile.path and lockfile.locked?
|
287
290
|
rescue
|
288
|
-
Log.exception $!
|
289
291
|
Log.warn "Lockfile exception: " << $!.message
|
290
292
|
end
|
291
293
|
end
|
@@ -293,26 +295,26 @@ module Persist
|
|
293
295
|
begin
|
294
296
|
lockfile.unlock if File.exists? lockfile.path and lockfile.locked?
|
295
297
|
rescue
|
296
|
-
Log.exception $!
|
297
298
|
Log.warn "Lockfile exception: " << $!.message
|
298
299
|
end
|
299
300
|
end
|
300
301
|
raise KeepLocked.new res
|
301
302
|
when TSV::Dumper
|
302
|
-
|
303
|
+
stream = res.stream
|
304
|
+
res = tee_stream(stream, path, type)
|
303
305
|
ConcurrentStream.setup res do
|
304
306
|
begin
|
307
|
+
stream.callback
|
305
308
|
lockfile.unlock if File.exists? lockfile.path and lockfile.locked?
|
306
309
|
rescue
|
307
|
-
Log.exception $!
|
308
310
|
Log.warn "Lockfile exception: " << $!.message
|
309
311
|
end
|
310
312
|
end
|
311
313
|
res.abort_callback = Proc.new do
|
312
314
|
begin
|
315
|
+
stream.abort
|
313
316
|
lockfile.unlock if File.exists? lockfile.path and lockfile.locked?
|
314
317
|
rescue
|
315
|
-
Log.exception $!
|
316
318
|
Log.warn "Lockfile exception: " << $!.message
|
317
319
|
end
|
318
320
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module TSV
|
2
2
|
def self.obj_stream(obj)
|
3
3
|
case obj
|
4
|
+
when Step
|
5
|
+
obj.result
|
4
6
|
when IO, File
|
5
7
|
obj
|
6
8
|
when TSV::Dumper
|
@@ -252,6 +254,7 @@ module TSV
|
|
252
254
|
stream.abort if stream and stream.respond_to? :abort
|
253
255
|
stream = obj_stream(options[:into])
|
254
256
|
stream.abort if stream.respond_to? :abort
|
257
|
+
Log.warn "Aborted traversing 2 #{stream_name(obj)}"
|
255
258
|
rescue Exception
|
256
259
|
Log.warn "Exception traversing #{stream_name(obj)}"
|
257
260
|
stream = obj_stream(obj)
|
@@ -359,7 +362,6 @@ module TSV
|
|
359
362
|
rescue Exception
|
360
363
|
stream = obj_stream(store)
|
361
364
|
stream.abort if stream.respond_to? :abort
|
362
|
-
Log.exception $!
|
363
365
|
raise $!
|
364
366
|
end
|
365
367
|
end
|
@@ -423,7 +425,7 @@ module TSV
|
|
423
425
|
begin
|
424
426
|
traverse_run(obj, threads, cpus, options, &block)
|
425
427
|
into.close if into.respond_to? :close
|
426
|
-
rescue
|
428
|
+
rescue Exception
|
427
429
|
stream = obj_stream(obj)
|
428
430
|
stream.abort if stream and stream.respond_to? :abort
|
429
431
|
stream = obj_stream(into)
|
@@ -483,9 +485,17 @@ module TSV
|
|
483
485
|
store_into into, e
|
484
486
|
rescue Aborted
|
485
487
|
Log.warn "Aborted callback #{stream_name(obj)} #{Log.color :green, "->"} #{stream_name(options[:into])}"
|
488
|
+
stream = nil
|
489
|
+
stream = get_stream obj
|
490
|
+
stream.abort if stream.respond_to? :abort
|
491
|
+
raise $!
|
486
492
|
rescue Exception
|
487
493
|
Log.warn "Exception callback #{stream_name(obj)} #{Log.color :green, "->"} #{stream_name(options[:into])}"
|
488
494
|
Log.exception $!
|
495
|
+
stream = nil
|
496
|
+
stream = get_stream obj
|
497
|
+
stream.abort if stream.respond_to? :abort
|
498
|
+
raise $!
|
489
499
|
ensure
|
490
500
|
bar.tick if bar
|
491
501
|
end
|
data/lib/rbbt/tsv/stream.rb
CHANGED
@@ -149,11 +149,12 @@ module TSV
|
|
149
149
|
stream.join if stream.respond_to? :join
|
150
150
|
end
|
151
151
|
rescue Exception
|
152
|
-
streams.
|
152
|
+
ts = streams.collect do |stream|
|
153
153
|
Thread.new do
|
154
154
|
stream.abort if stream.respond_to? :abort
|
155
155
|
end
|
156
156
|
end
|
157
|
+
ts.each do |t| t.join end
|
157
158
|
raise $!
|
158
159
|
end
|
159
160
|
end
|
@@ -25,6 +25,7 @@ module Log
|
|
25
25
|
|
26
26
|
# Used to register a new completed loop iteration.
|
27
27
|
def tick(step = nil)
|
28
|
+
return if ENV["RBBT_NO_PROGRESS"] == 'true'
|
28
29
|
|
29
30
|
if step.nil?
|
30
31
|
@current += 1
|
@@ -163,6 +164,8 @@ module Log
|
|
163
164
|
Log::LAST.replace "progress"
|
164
165
|
length = Log::ProgressBar.cleanup_bars
|
165
166
|
length.times{print(io, "\n")}
|
167
|
+
else
|
168
|
+
print(io, "\n") if @last_report == -1
|
166
169
|
end
|
167
170
|
print(io, up_lines(@depth) << report_msg << down_lines(@depth)) if severity >= Log.severity
|
168
171
|
@last_report = Time.now if @last_report == -1
|
@@ -173,6 +176,8 @@ module Log
|
|
173
176
|
Log::LAST.replace "progress"
|
174
177
|
length = Log::ProgressBar.cleanup_bars
|
175
178
|
length.times{print(io, "\n")}
|
179
|
+
else
|
180
|
+
print(io, "\n") if @last_report == -1
|
176
181
|
end
|
177
182
|
print(io, up_lines(@depth) << throughput_msg << down_lines(@depth)) if severity >= Log.severity
|
178
183
|
@last_report = Time.now
|
@@ -217,10 +222,9 @@ module Log
|
|
217
222
|
end
|
218
223
|
|
219
224
|
def self.remove_bar(bar)
|
220
|
-
bar.done unless bar.max
|
225
|
+
bar.done unless bar.max or ENV["RBBT_NO_PROGRESS"] == 'true'
|
221
226
|
BAR_MUTEX.synchronize do
|
222
227
|
REMOVE << bar
|
223
|
-
Log::LAST.replace "remove"
|
224
228
|
end
|
225
229
|
end
|
226
230
|
|
@@ -98,18 +98,21 @@ module ConcurrentStream
|
|
98
98
|
|
99
99
|
def abort_pids
|
100
100
|
@pids.each{|pid| Process.kill :INT, pid } if @pids
|
101
|
+
@pids = []
|
101
102
|
end
|
102
103
|
|
103
104
|
def abort
|
105
|
+
Log.warn "Aborting stream #{Misc.fingerprint self} -- #{@abort_callback} [#{@aborted}]"
|
104
106
|
return if @aborted
|
107
|
+
@aborted = true
|
105
108
|
begin
|
106
|
-
|
107
|
-
abort_pids
|
109
|
+
@callback = nil
|
108
110
|
@abort_callback.call if @abort_callback
|
109
|
-
ensure
|
110
111
|
@abort_callback = nil
|
111
|
-
|
112
|
-
|
112
|
+
close unless closed?
|
113
|
+
|
114
|
+
abort_threads
|
115
|
+
abort_pids
|
113
116
|
end
|
114
117
|
end
|
115
118
|
|
data/lib/rbbt/util/misc/lock.rb
CHANGED
@@ -7,7 +7,7 @@ module Misc
|
|
7
7
|
|
8
8
|
dup_array = options.delete :dup_array
|
9
9
|
|
10
|
-
if Annotated === field or Entity.respond_to?(:formats) and Entity.formats.include? field
|
10
|
+
if Annotated === field or (Entity.respond_to?(:formats) and Entity.formats.include? field)
|
11
11
|
params = options.dup
|
12
12
|
|
13
13
|
params[:format] ||= params.delete "format"
|
data/lib/rbbt/util/misc/pipes.rb
CHANGED
@@ -100,20 +100,26 @@ module Misc
|
|
100
100
|
stream_in2.close unless stream_in2.closed?
|
101
101
|
stream.join if stream.respond_to? :join
|
102
102
|
rescue Aborted, Interrupt
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
103
|
+
Log.warn "Tee aborting #{Misc.fingerprint stream}"
|
104
|
+
stream.abort if stream.respond_to? :abort
|
105
|
+
stream_out1.abort if stream_out1.respond_to? :abort
|
106
|
+
stream_out2.abort if stream_out2.respond_to? :abort
|
107
|
+
parent.raise $!
|
108
108
|
rescue Exception
|
109
|
-
Log.exception $!
|
110
109
|
stream.abort if stream.respond_to? :abort
|
110
|
+
parent.raise $!
|
111
111
|
end
|
112
112
|
end
|
113
113
|
|
114
114
|
ConcurrentStream.setup stream_out1, :threads => splitter_thread
|
115
115
|
ConcurrentStream.setup stream_out2, :threads => splitter_thread
|
116
116
|
|
117
|
+
stream_out1.callback = stream.callback if stream.respond_to? :callback
|
118
|
+
stream_out1.abort_callback = stream.abort_callback if stream.respond_to? :abort_callback
|
119
|
+
|
120
|
+
stream_out2.callback = stream.callback if stream.respond_to? :callback
|
121
|
+
stream_out2.abort_callback = stream.abort_callback if stream.respond_to? :abort_callback
|
122
|
+
|
117
123
|
[stream_out1, stream_out2]
|
118
124
|
end
|
119
125
|
|
data/lib/rbbt/workflow.rb
CHANGED
@@ -188,7 +188,6 @@ module Workflow
|
|
188
188
|
def step_cache
|
189
189
|
@step_cache ||= Workflow::STEP_CACHE
|
190
190
|
end
|
191
|
-
|
192
191
|
|
193
192
|
def helpers
|
194
193
|
@helpers ||= {}
|
@@ -237,6 +236,7 @@ module Workflow
|
|
237
236
|
def get_job_step(step_path, task = nil, input_values = nil, dependencies = nil)
|
238
237
|
step_path = step_path.call if Proc === step_path
|
239
238
|
persist = input_values.nil? ? false : true
|
239
|
+
#persist = false
|
240
240
|
key = Path === step_path ? step_path.find : step_path
|
241
241
|
step = Persist.memory("Step", :key => key, :repo => step_cache, :persist => persist) do
|
242
242
|
step = Step.new step_path, task, input_values, dependencies
|
data/lib/rbbt/workflow/step.rb
CHANGED
@@ -66,13 +66,12 @@ class Step
|
|
66
66
|
def get_stream
|
67
67
|
@mutex.synchronize do
|
68
68
|
begin
|
69
|
+
return nil if @saved_stream
|
69
70
|
if IO === @result
|
70
71
|
@saved_stream = @result
|
71
72
|
else
|
72
73
|
nil
|
73
74
|
end
|
74
|
-
ensure
|
75
|
-
@result = nil
|
76
75
|
end
|
77
76
|
end
|
78
77
|
end
|
@@ -118,29 +117,33 @@ class Step
|
|
118
117
|
end
|
119
118
|
end
|
120
119
|
|
121
|
-
def run_dependencies
|
120
|
+
def run_dependencies
|
121
|
+
@seen ||= []
|
122
122
|
dependencies.uniq.each do |dependency|
|
123
|
-
|
124
123
|
next if seen.collect{|d| d.path}.include?(dependency.path)
|
125
|
-
seen
|
126
|
-
seen
|
124
|
+
dependency.seen = seen
|
125
|
+
@seen << dependency
|
126
|
+
@seen.concat dependency.rec_dependencies.collect{|d| d }
|
127
|
+
@seen.uniq!
|
127
128
|
end
|
128
129
|
|
129
|
-
seen.each do |dependency|
|
130
|
+
@seen.each do |dependency|
|
130
131
|
next if dependency == self
|
132
|
+
next unless dependencies.include? dependency
|
131
133
|
dependency.relay_log self
|
132
134
|
dependency.dup_inputs
|
133
135
|
end
|
134
136
|
|
135
|
-
seen.each do |dependency|
|
137
|
+
@seen.each do |dependency|
|
136
138
|
next if dependency == self
|
139
|
+
next unless dependencies.include? dependency
|
137
140
|
Log.info "#{Log.color :magenta, "Checking dependency"} #{Log.color :yellow, task.name.to_s || ""} => #{Log.color :yellow, dependency.task_name.to_s || ""} -- #{Log.color :blue, dependency.path}"
|
138
141
|
begin
|
139
142
|
if dependency.streaming?
|
140
143
|
next if dependency.running?
|
141
144
|
dependency.clean
|
142
145
|
else
|
143
|
-
dependency.clean if
|
146
|
+
dependency.clean if (dependency.error? or dependency.aborted? or not dependency.done?)
|
144
147
|
end
|
145
148
|
|
146
149
|
unless dependency.result or dependency.done?
|
@@ -155,8 +158,8 @@ class Step
|
|
155
158
|
rescue Interrupt
|
156
159
|
backtrace = $!.backtrace
|
157
160
|
set_info :backtrace, backtrace
|
158
|
-
log(:error, "Interrupted dependency #{Log.color :yellow, dependency.task.name.to_s}")
|
159
161
|
self.abort
|
162
|
+
log(:error, "Interrupted dependency #{Log.color :yellow, dependency.task.name.to_s}")
|
160
163
|
raise $!
|
161
164
|
rescue Exception
|
162
165
|
backtrace = $!.backtrace
|
@@ -171,8 +174,8 @@ class Step
|
|
171
174
|
def run(no_load = false)
|
172
175
|
result = nil
|
173
176
|
|
174
|
-
|
175
|
-
|
177
|
+
begin
|
178
|
+
@mutex.synchronize do
|
176
179
|
no_load = no_load ? :stream : false
|
177
180
|
result = Persist.persist "Job", @task.result_type, :file => path, :check => checks, :no_load => no_load do |lockfile|
|
178
181
|
if Step === Step.log_relay_step and not self == Step.log_relay_step
|
@@ -244,8 +247,6 @@ class Step
|
|
244
247
|
result.abort_callback = Proc.new do
|
245
248
|
begin
|
246
249
|
log :error, "#{Log.color :red, "ERROR -- streamming aborted"} #{Log.color :yellow, task.name.to_s || ""} [#{Process.pid}] -- #{path}" if status == :streaming
|
247
|
-
stop_dependencies
|
248
|
-
abort_stream
|
249
250
|
rescue
|
250
251
|
Log.exception $!
|
251
252
|
ensure
|
@@ -267,9 +268,9 @@ class Step
|
|
267
268
|
end
|
268
269
|
result.stream.abort_callback = Proc.new do
|
269
270
|
begin
|
270
|
-
stop_dependencies
|
271
271
|
log :error, "#{Log.color :red, "ERROR -- streamming aborted"} #{Log.color :yellow, task.name.to_s || ""} [#{Process.pid}] -- #{path}" if status == :streaming
|
272
272
|
rescue Exception
|
273
|
+
Log.exception $!
|
273
274
|
end
|
274
275
|
end
|
275
276
|
else
|
@@ -287,9 +288,10 @@ class Step
|
|
287
288
|
else
|
288
289
|
@result = prepare_result result, @task.result_description
|
289
290
|
end
|
290
|
-
rescue Exception
|
291
|
-
self.abort
|
292
291
|
end
|
292
|
+
rescue Exception
|
293
|
+
self.abort
|
294
|
+
raise $!
|
293
295
|
end
|
294
296
|
end
|
295
297
|
|
@@ -343,13 +345,7 @@ class Step
|
|
343
345
|
|
344
346
|
def stop_dependencies
|
345
347
|
dependencies.each do |dep|
|
346
|
-
|
347
|
-
begin
|
348
|
-
dep.abort unless dep.done?
|
349
|
-
rescue Exception
|
350
|
-
Log.exception $!
|
351
|
-
rescue Aborted
|
352
|
-
end
|
348
|
+
dep.abort
|
353
349
|
end
|
354
350
|
kill_children
|
355
351
|
end
|
@@ -379,11 +375,11 @@ class Step
|
|
379
375
|
def abort_stream
|
380
376
|
stream = get_stream if @result
|
381
377
|
stream ||= @saved_stream
|
378
|
+
@saved_stream = nil
|
382
379
|
if stream and stream.respond_to? :abort and not stream.aborted?
|
383
380
|
begin
|
384
381
|
Log.medium "Aborting job stream #{stream.inspect} -- #{Log.color :blue, path}"
|
385
382
|
stream.abort
|
386
|
-
Log.medium "Aborted job stream #{stream.inspect} -- #{Log.color :blue, path}"
|
387
383
|
#stream.close unless stream.closed?
|
388
384
|
rescue Aborted
|
389
385
|
Log.medium "Aborting job stream #{stream.inspect} ABORTED RETRY -- #{Log.color :blue, path}"
|
@@ -394,19 +390,29 @@ class Step
|
|
394
390
|
|
395
391
|
def abort
|
396
392
|
return if @aborted
|
393
|
+
@aborted = true
|
394
|
+
return if error?
|
395
|
+
return if done?
|
397
396
|
Log.medium{"#{Log.color :red, "Aborting"} #{Log.color :blue, path}"}
|
398
397
|
begin
|
399
|
-
stop_dependencies
|
400
|
-
@aborted = true
|
401
398
|
abort_stream
|
402
399
|
abort_pid
|
400
|
+
stop_dependencies
|
403
401
|
rescue Aborted
|
404
402
|
Log.medium{"#{Log.color :red, "Aborting ABORTED RETRY"} #{Log.color :blue, path}"}
|
405
403
|
retry
|
406
404
|
rescue Exception
|
407
|
-
|
405
|
+
retry
|
408
406
|
ensure
|
409
|
-
|
407
|
+
if Open.exists? path
|
408
|
+
Log.warn "Aborted job had finished. Removing result"
|
409
|
+
begin
|
410
|
+
Open.rm path
|
411
|
+
rescue Exception
|
412
|
+
Log.warn "Exception removing result of aborted job: #{$!.message}"
|
413
|
+
end
|
414
|
+
end
|
415
|
+
|
410
416
|
begin
|
411
417
|
log(:aborted, "Job aborted")
|
412
418
|
rescue Exception
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbbt-util
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.13.
|
4
|
+
version: 5.13.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miguel Vazquez
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-05-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|