rbbt-util 5.27.8 → 5.27.13
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rbbt/entity.rb +1 -1
- data/lib/rbbt/fix_width_table.rb +1 -1
- data/lib/rbbt/persist.rb +2 -2
- data/lib/rbbt/tsv/parallel/traverse.rb +2 -0
- data/lib/rbbt/util/misc.rb +1 -0
- data/lib/rbbt/util/misc/development.rb +16 -4
- data/lib/rbbt/util/misc/inspect.rb +1 -1
- data/lib/rbbt/util/open.rb +6 -1
- data/lib/rbbt/util/tmpfile.rb +4 -4
- data/lib/rbbt/workflow.rb +2 -5
- data/lib/rbbt/workflow/accessor.rb +1 -1
- data/lib/rbbt/workflow/remote_workflow/driver/rest.rb +6 -3
- data/lib/rbbt/workflow/remote_workflow/remote_step.rb +12 -4
- data/share/rbbt_commands/app/start +8 -0
- data/share/rbbt_commands/system/clean +2 -2
- data/share/rbbt_commands/tsv/uncollapse +28 -0
- data/share/rbbt_commands/workflow/info +1 -1
- data/share/rbbt_commands/workflow/server +4 -8
- data/share/rbbt_commands/workflow/task +2 -0
- data/test/rbbt/util/test_misc.rb +25 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 99b1ad9e8d9403c7f77e22b16497456324c340b08122b765033530f713e35c3c
|
4
|
+
data.tar.gz: 2d33590e395b9ca715e1c16d509d0a62a1ebeab2315b700ff4377a08803c89af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '097ce6c8c16c17441f5a8748ba4ab33afecf6d22d4d54c7ce53475cd642407ae5013346ba482f7fa9375176ab6790febfe030e9f7959ba7b928b5d3762382237'
|
7
|
+
data.tar.gz: 2fb616d7d66fc2eb979c9911921faecf163f51dd3323ac127265bcaefd0e8a4e3aab9ef41cc9bdf8bd351d44d4ef2cc388c692d5dc9a2d1b811155f21e3f0889
|
data/lib/rbbt/entity.rb
CHANGED
@@ -261,7 +261,7 @@ module Entity
|
|
261
261
|
|
262
262
|
define_method method_name do |*args|
|
263
263
|
id = self.id
|
264
|
-
persist_name = orig_method_name.to_s
|
264
|
+
persist_name = orig_method_name.to_s + ":" << (Array === id ? Misc.obj2digest(id) : id)
|
265
265
|
|
266
266
|
persist_options = options
|
267
267
|
persist_options = persist_options.merge(:other => {:args => args}) if args and args.any?
|
data/lib/rbbt/fix_width_table.rb
CHANGED
@@ -28,7 +28,7 @@ class FixWidthTable
|
|
28
28
|
else
|
29
29
|
Log.debug "FixWidthTable up-to-date: #{ filename } - (in_memory:#{in_memory})"
|
30
30
|
if in_memory
|
31
|
-
@file = Open.open(@filename, :mode => 'r:ASCII-
|
31
|
+
@file = Open.open(@filename, :mode => 'r:ASCII-8BIT'){|f| StringIO.new f.read}
|
32
32
|
else
|
33
33
|
@file = File.open(@filename, 'r:ASCII-8BIT')
|
34
34
|
end
|
data/lib/rbbt/persist.rb
CHANGED
@@ -365,12 +365,12 @@ module Persist
|
|
365
365
|
type ||= :marshal
|
366
366
|
|
367
367
|
persist_options ||= {}
|
368
|
-
if type == :memory
|
368
|
+
if type == :memory && persist_options[:file] && persist_options[:persist]
|
369
369
|
repo = persist_options[:repo] || Persist::MEMORY
|
370
370
|
if persist_options[:persist] == :update || persist_options[:update]
|
371
371
|
repo.delete persist_options[:file]
|
372
372
|
end
|
373
|
-
return repo[persist_options[:file]] ||= yield
|
373
|
+
return repo[persist_options[:file]] ||= yield
|
374
374
|
end
|
375
375
|
|
376
376
|
if FalseClass === persist_options[:persist]
|
data/lib/rbbt/util/misc.rb
CHANGED
@@ -292,14 +292,21 @@ def self.add_libdir(dir=nil)
|
|
292
292
|
end
|
293
293
|
end
|
294
294
|
|
295
|
-
def self.bootstrap(elems, num =
|
295
|
+
def self.bootstrap(elems, num = nil, options = {}, &block)
|
296
296
|
IndiferentHash.setup options
|
297
|
+
|
298
|
+
num = Rbbt::Config.get :cpus, :default_bootstrap_cpus, :bootstrap_cpus if num == :current || num == nil if defined?(Rbbt::Config)
|
297
299
|
num = :current if num.nil?
|
298
300
|
cpus = case num
|
299
301
|
when :current
|
300
|
-
|
301
|
-
|
302
|
-
|
302
|
+
n = Etc.nprocessors
|
303
|
+
n = elems.length / 2 if n > elems.length/2
|
304
|
+
|
305
|
+
if $BOOTSTRAPPED_CURRENT && $BOOTSTRAPPED_CURRENT + n > Etc.nprocessors
|
306
|
+
1
|
307
|
+
else
|
308
|
+
n
|
309
|
+
end
|
303
310
|
when String
|
304
311
|
num.to_i
|
305
312
|
when Integer
|
@@ -318,7 +325,12 @@ def self.add_libdir(dir=nil)
|
|
318
325
|
respawn = options[:respawn] and options[:cpus] and options[:cpus].to_i > 1
|
319
326
|
|
320
327
|
index = (0..elems.length-1).to_a.collect{|v| v.to_s }
|
328
|
+
|
321
329
|
TSV.traverse index, options do |pos|
|
330
|
+
if num == :current
|
331
|
+
$BOOTSTRAPPED_CURRENT ||= n
|
332
|
+
$BOOTSTRAPPED_CURRENT += 0
|
333
|
+
end
|
322
334
|
elem = elems[pos.to_i]
|
323
335
|
elems.annotate elem if elems.respond_to? :annotate
|
324
336
|
res = begin
|
@@ -401,7 +401,7 @@ module Misc
|
|
401
401
|
|
402
402
|
def self.scan_version_text(text, cmd = nil)
|
403
403
|
cmd = "NOCMDGIVE" if cmd.nil? || cmd.empty?
|
404
|
-
m = text.match(/(?:version.*?|#{cmd}.*?|v)((?:\d+\.)*\d+(?:-[a-z_]+)?)/i)
|
404
|
+
m = text.match(/(?:version.*?|#{cmd}.*?|#{cmd.split(/[-_.]/).first}.*?|v)((?:\d+\.)*\d+(?:-[a-z_]+)?)/i)
|
405
405
|
return nil if m.nil?
|
406
406
|
m[1]
|
407
407
|
end
|
data/lib/rbbt/util/open.rb
CHANGED
@@ -94,7 +94,8 @@ module Open
|
|
94
94
|
end
|
95
95
|
|
96
96
|
begin
|
97
|
-
wget_options = options.
|
97
|
+
wget_options = options.dup
|
98
|
+
wget_options = wget_options.merge( '-O' => '-') unless options.include?('--output-document')
|
98
99
|
wget_options[:pipe] = pipe unless pipe.nil?
|
99
100
|
wget_options[:stderr] = stderr unless stderr.nil?
|
100
101
|
|
@@ -824,4 +825,8 @@ module Open
|
|
824
825
|
def self.broken_link?(path)
|
825
826
|
File.symlink?(path) && ! File.exists?(File.readlink(path))
|
826
827
|
end
|
828
|
+
|
829
|
+
def self.download(url, path)
|
830
|
+
Open.wget(url, "--output-document" => path)
|
831
|
+
end
|
827
832
|
end
|
data/lib/rbbt/util/tmpfile.rb
CHANGED
@@ -17,14 +17,14 @@ module TmpFile
|
|
17
17
|
|
18
18
|
# Creates a random file name, with the given suffix and a random number
|
19
19
|
# up to +max+
|
20
|
-
def self.random_name(s = "tmp-", max =
|
20
|
+
def self.random_name(s = "tmp-", max = 1_000_000_000)
|
21
21
|
n = rand(max)
|
22
22
|
s + n.to_s
|
23
23
|
end
|
24
24
|
|
25
25
|
# Creates a random filename in the temporary directory
|
26
|
-
def self.tmp_file(s = "tmp-", max=
|
27
|
-
File.expand_path(File.join(dir, random_name(s,max)))
|
26
|
+
def self.tmp_file(s = "tmp-", max=1_000_000_000, dir = TMPDIR)
|
27
|
+
File.expand_path(File.join(dir, random_name(s, max)))
|
28
28
|
end
|
29
29
|
|
30
30
|
def self.with_file(content = nil, erase = true, options = {})
|
@@ -33,7 +33,7 @@ module TmpFile
|
|
33
33
|
|
34
34
|
prefix = options[:prefix] || "tmp-"
|
35
35
|
tmpdir = options[:tmpdir] || TMPDIR
|
36
|
-
max = options[:max] ||
|
36
|
+
max = options[:max] || 1_000_000_000
|
37
37
|
tmpfile = tmp_file prefix, max, tmpdir
|
38
38
|
if options[:extension]
|
39
39
|
tmpfile += ".#{options[:extension]}"
|
data/lib/rbbt/workflow.rb
CHANGED
@@ -10,9 +10,6 @@ require 'rbbt/workflow/util/provenance'
|
|
10
10
|
|
11
11
|
module Workflow
|
12
12
|
|
13
|
-
STEP_CACHE = {}
|
14
|
-
LOAD_STEP_CACHE = {}
|
15
|
-
|
16
13
|
class TaskNotFoundException < Exception
|
17
14
|
def initialize(workflow, task = nil)
|
18
15
|
if task
|
@@ -264,11 +261,11 @@ module Workflow
|
|
264
261
|
end
|
265
262
|
|
266
263
|
def step_cache
|
267
|
-
|
264
|
+
Thread.current[:step_cache] ||= {}
|
268
265
|
end
|
269
266
|
|
270
267
|
def self.load_step_cache
|
271
|
-
|
268
|
+
Thread.current[:load_step_cache] ||= {}
|
272
269
|
end
|
273
270
|
|
274
271
|
|
@@ -418,7 +418,7 @@ module Workflow
|
|
418
418
|
when :hash
|
419
419
|
clean_inputs = Annotated.purge(inputs)
|
420
420
|
clean_inputs = clean_inputs.collect{|i| Symbol === i ? i.to_s : i }
|
421
|
-
deps_str = dependencies.collect{|d| Step === d ? d.short_path : d }
|
421
|
+
deps_str = dependencies.collect{|d| (Step === d || (defined?(RemoteStep) && RemoteStep === Step)) ? "Step: " << d.short_path : d }
|
422
422
|
key_obj = {:inputs => clean_inputs, :dependencies => deps_str }
|
423
423
|
key_str = Misc.obj2str(key_obj)
|
424
424
|
hash_str = Misc.digest(key_str)
|
@@ -137,14 +137,16 @@ class RemoteWorkflow
|
|
137
137
|
|
138
138
|
post_thread = Thread.new(Thread.current) do |parent|
|
139
139
|
bl = lambda do |rok|
|
140
|
-
|
140
|
+
case rok
|
141
|
+
when Net::HTTPOK
|
141
142
|
_url = rok["RBBT-STREAMING-JOB-URL"]
|
142
143
|
@url = File.join(task_url, File.basename(_url)) if _url
|
143
144
|
rok.read_body do |c,_a, _b|
|
144
145
|
sin.write c
|
145
146
|
end
|
146
147
|
sin.close
|
147
|
-
|
148
|
+
when Net::HTTPRedirection, Net::HTTPAccepted
|
149
|
+
Thread.current.report_on_exception = false
|
148
150
|
raise TryThis.new(rok)
|
149
151
|
else
|
150
152
|
err = StringIO.new
|
@@ -178,7 +180,8 @@ class RemoteWorkflow
|
|
178
180
|
begin
|
179
181
|
RestClient::Request.execute(:method => :post, :url => task_url, :payload => task_params, :block_response => bl)
|
180
182
|
rescue TryThis
|
181
|
-
|
183
|
+
url = $!.payload["location"]
|
184
|
+
RestClient::Request.execute(:method => :get, :url => url, :block_response => bl)
|
182
185
|
end
|
183
186
|
end
|
184
187
|
|
@@ -26,8 +26,8 @@ class RemoteStep < Step
|
|
26
26
|
|
27
27
|
def cache_file
|
28
28
|
begin
|
29
|
-
digest = Misc.obj2digest([base_url, task, base_name, inputs])
|
30
|
-
Rbbt.var.cache.REST[[
|
29
|
+
digest = Misc.obj2digest([base_url, task.to_s, base_name, inputs])
|
30
|
+
Rbbt.var.cache.REST[task.to_s][[clean_name, digest].compact * "."].find
|
31
31
|
rescue
|
32
32
|
Log.exception $!
|
33
33
|
raise $!
|
@@ -143,7 +143,11 @@ class RemoteStep < Step
|
|
143
143
|
@info = Persist.memory("RemoteSteps Info", :url => @url, :persist => true, :update => update) do
|
144
144
|
@last_info_time = Time.now
|
145
145
|
init_job unless @url
|
146
|
-
info =
|
146
|
+
info = begin
|
147
|
+
@adaptor.get_json(File.join(@url, 'info'))
|
148
|
+
rescue
|
149
|
+
{:status => :noinfo}
|
150
|
+
end
|
147
151
|
info = RemoteWorkflow.fix_hash(info)
|
148
152
|
info[:status] = info[:status].to_sym if String === info[:status]
|
149
153
|
info
|
@@ -243,6 +247,7 @@ class RemoteStep < Step
|
|
243
247
|
def join
|
244
248
|
return true if cache_files.any?
|
245
249
|
init_job unless @url
|
250
|
+
produce unless @started
|
246
251
|
Log.debug{ "Joining RemoteStep: #{path}" }
|
247
252
|
|
248
253
|
if IO === @result
|
@@ -258,7 +263,6 @@ class RemoteStep < Step
|
|
258
263
|
sleep 1 unless self.done? || self.aborted? || self.error?
|
259
264
|
while not (self.done? || self.aborted? || self.error?)
|
260
265
|
sleep 3
|
261
|
-
iif [self.done?, self.status, self.info]
|
262
266
|
end
|
263
267
|
end
|
264
268
|
|
@@ -311,6 +315,10 @@ class RemoteStep < Step
|
|
311
315
|
end
|
312
316
|
end
|
313
317
|
|
318
|
+
def short_path
|
319
|
+
init_job unless @url
|
320
|
+
[@task, @name] * "/"
|
321
|
+
end
|
314
322
|
|
315
323
|
def input_checks
|
316
324
|
[]
|
@@ -15,6 +15,7 @@ $ rbbt app start [options]
|
|
15
15
|
-Ho--Host* Host name
|
16
16
|
-B--Bind* Bind IP
|
17
17
|
-p--port* TCP port
|
18
|
+
-w--workers* Number of workers for cluster mode (puma)
|
18
19
|
-s--server* Server type: thin, webrick, unicorn, etc
|
19
20
|
-f--finder Start server with finder functionality
|
20
21
|
-fs--file_server Activate file serving for resources
|
@@ -84,6 +85,12 @@ Misc.in_dir(app_dir) do
|
|
84
85
|
end
|
85
86
|
end
|
86
87
|
|
88
|
+
fixed_options = {}
|
89
|
+
options.each do |k,v| fixed_options[k.to_sym] = v end
|
90
|
+
options = fixed_options
|
91
|
+
|
92
|
+
options[:workers] = options[:workers].to_i if options[:workers]
|
93
|
+
|
87
94
|
case server
|
88
95
|
when 'passenger'
|
89
96
|
system ENV, "env RBBT_LOG=0 passenger start -R '#{config_ru_file}' -p #{options[:Port] || "2887"}"
|
@@ -91,6 +98,7 @@ Misc.in_dir(app_dir) do
|
|
91
98
|
system ENV, "puma '#{config_ru_file}' -p #{options[:Port] || "2887"} -w 3 -t 8:32 --preload"
|
92
99
|
else
|
93
100
|
options[:config] = config_ru_file
|
101
|
+
options[:threads] = "8:8"
|
94
102
|
Rack::Server.start(options)
|
95
103
|
end
|
96
104
|
end
|
@@ -97,7 +97,7 @@ TSV.traverse jobs do |file,i|
|
|
97
97
|
else
|
98
98
|
info = begin
|
99
99
|
Open.open(i[:info_file]) do |f|
|
100
|
-
Step::
|
100
|
+
Step::INFO_SERIALIZER.load(f)
|
101
101
|
end
|
102
102
|
rescue
|
103
103
|
{:status => :noinfo}
|
@@ -134,7 +134,7 @@ TSV.traverse jobs do |file,i|
|
|
134
134
|
end
|
135
135
|
end
|
136
136
|
|
137
|
-
if (force
|
137
|
+
if (force && status !~ /done/) or
|
138
138
|
status =~ /\b(old|dirty|nopid|error|missing|aborted|dead|sync)$/ or
|
139
139
|
(status == "noinfo" and not done) or
|
140
140
|
status == ""
|
@@ -0,0 +1,28 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rbbt-util'
|
4
|
+
require 'rbbt/util/simpleopt'
|
5
|
+
|
6
|
+
options = SOPT.setup <<EOF
|
7
|
+
Read a TSV file and dump it
|
8
|
+
|
9
|
+
$ rbbt tsv read [options] <filename.tsv|->
|
10
|
+
|
11
|
+
Use - to read from STDIN
|
12
|
+
|
13
|
+
-k--key_field* Key field
|
14
|
+
-f--fields* Fields
|
15
|
+
-t--type* Type
|
16
|
+
-m--merge* Merge from multiple rows
|
17
|
+
-h--help Print this help
|
18
|
+
|
19
|
+
EOF
|
20
|
+
rbbt_usage and exit 0 if options[:help]
|
21
|
+
|
22
|
+
file = ARGV.shift
|
23
|
+
|
24
|
+
file = STDIN if file == '-'
|
25
|
+
|
26
|
+
tsv = TSV.open file, :merge => true, :type => :double
|
27
|
+
|
28
|
+
puts tsv.to_unmerged_expanded_s
|
@@ -153,7 +153,7 @@ if recursive
|
|
153
153
|
dep = deps.shift
|
154
154
|
inputs = {} if inputs.nil?
|
155
155
|
inputs = inputs.merge(dep.info[:inputs] || {})
|
156
|
-
deps = deps.concat dep.dependencies
|
156
|
+
deps = deps.concat dep.dependencies if dep.dependencies
|
157
157
|
end
|
158
158
|
|
159
159
|
inputs = inputs.merge step.archived_inputs
|
@@ -123,15 +123,11 @@ TmpFile.with_file do |app_dir|
|
|
123
123
|
else
|
124
124
|
options[:config] = config_ru_file
|
125
125
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
clean_options[k.to_sym] = v
|
130
|
-
rescue
|
131
|
-
end
|
132
|
-
end
|
126
|
+
fixed_options = {}
|
127
|
+
options.each do |k,v| fixed_options[k.to_sym] = v end
|
128
|
+
options = fixed_options
|
133
129
|
|
134
|
-
Rack::Server.start(
|
130
|
+
Rack::Server.start(options)
|
135
131
|
end
|
136
132
|
end
|
137
133
|
end
|
data/test/rbbt/util/test_misc.rb
CHANGED
@@ -690,5 +690,30 @@ Written by Mike Haertel and others, see |
|
690
690
|
EOF
|
691
691
|
assert_equal "3.1", Misc.scan_version_text(txt, "grep")
|
692
692
|
end
|
693
|
+
|
694
|
+
def test_bootstrap_current_only_once
|
695
|
+
|
696
|
+
|
697
|
+
max = Etc.nprocessors * 10
|
698
|
+
TmpFile.with_file do |f|
|
699
|
+
RbbtSemaphore.with_semaphore(1) do |sem|
|
700
|
+
Misc.bootstrap (1..max).to_a do
|
701
|
+
Open.open(f, :mode => 'a') do |sin|
|
702
|
+
sin.puts Process.pid.to_s
|
703
|
+
end
|
704
|
+
Misc.bootstrap (1..10).to_a do
|
705
|
+
RbbtSemaphore.synchronize(sem) do
|
706
|
+
Open.open(f, :mode => 'a') do |sin|
|
707
|
+
sin.puts [Process.ppid.to_s, Process.pid.to_s] * ":"
|
708
|
+
end
|
709
|
+
end
|
710
|
+
end
|
711
|
+
end
|
712
|
+
end
|
713
|
+
assert_equal max * 10 + max, Open.read(f).split("\n").length
|
714
|
+
assert_equal Etc.nprocessors * 2, Open.read(f).split("\n").uniq.length
|
715
|
+
end
|
716
|
+
|
717
|
+
end
|
693
718
|
end
|
694
719
|
|
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.27.
|
4
|
+
version: 5.27.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miguel Vazquez
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-07-
|
11
|
+
date: 2020-07-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -403,6 +403,7 @@ files:
|
|
403
403
|
- share/rbbt_commands/tsv/sort
|
404
404
|
- share/rbbt_commands/tsv/subset
|
405
405
|
- share/rbbt_commands/tsv/transpose
|
406
|
+
- share/rbbt_commands/tsv/uncollapse
|
406
407
|
- share/rbbt_commands/tsv/unzip
|
407
408
|
- share/rbbt_commands/tsv/values
|
408
409
|
- share/rbbt_commands/tsv/write_excel
|