rbbt-util 5.13.3 → 5.13.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|