rbbt-util 5.33.5 → 5.33.8
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/lib/rbbt/hpc/batch.rb +1 -1
- data/lib/rbbt/hpc/orchestrate/chains.rb +1 -89
- data/lib/rbbt/hpc/orchestrate.rb +24 -1
- data/lib/rbbt/resource/path.rb +1 -2
- data/lib/rbbt/resource/util.rb +20 -7
- data/lib/rbbt/util/migrate.rb +6 -0
- data/lib/rbbt/util/misc/inspect.rb +8 -7
- data/lib/rbbt/workflow/step/run.rb +2 -2
- data/lib/rbbt/workflow/util/orchestrator.rb +3 -3
- data/share/Rlib/plot.R +1 -0
- data/share/install/software/lib/install_helpers +4 -0
- data/share/rbbt_commands/hpc/list +48 -15
- data/share/rbbt_commands/lsf/list +48 -15
- data/share/rbbt_commands/slurm/list +48 -15
- data/share/rbbt_commands/workflow/prov +1 -1
- data/share/rbbt_commands/workflow/task +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: aaa014ffdad4e098212cc3f7cefc4d04ac62a7f7fcbf17bbbab9415c6253d9ef
|
|
4
|
+
data.tar.gz: b8a2a233686ec2f229ed79bb19d87d8eb79ad945142305f7b61dcdb11f5f7912
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 564242bef1dd92c2f53a5fe6c967624de26d7ae7eeb4da1ef2a1f682db9cf6d4b0bf0f8e76b3a600afe6af7bb443df28a8fe50e570c3c56265319eb607d6c1fc
|
|
7
|
+
data.tar.gz: ac7c01fa7e8fccdff8dfc861b82f28889a68f77886c198ff55b09558b36857ec9c29a8bae979bc7d088f311ad81515676bc7a4cc30097fd6c4b7586e6838c0e3
|
data/lib/rbbt/hpc/batch.rb
CHANGED
|
@@ -544,7 +544,7 @@ env > #{batch_options[:fenv]}
|
|
|
544
544
|
Misc.add_defaults options,
|
|
545
545
|
:batch_dir => batch_dir,
|
|
546
546
|
:inputs_dir => File.join(batch_dir, "inputs_dir"),
|
|
547
|
-
:workflows => workflows_to_load * ","
|
|
547
|
+
:workflows => workflows_to_load.uniq * ","
|
|
548
548
|
|
|
549
549
|
options[:procpath_performance] ||= File.join(batch_dir, "procpath##{procpath.gsub(',', '#')}") if procpath
|
|
550
550
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
module HPC
|
|
2
2
|
module Orchestration
|
|
3
3
|
def self.check_chains(chains, job)
|
|
4
|
+
return [] if Symbol === job.overriden
|
|
4
5
|
matches = []
|
|
5
6
|
chains.each do |name, chain|
|
|
6
7
|
next unless chain[:tasks].include?(job.workflow.to_s)
|
|
@@ -36,95 +37,6 @@ module HPC
|
|
|
36
37
|
(job.dependencies + job.input_dependencies).uniq.select{|d| ! d.done? || d.dirty? }
|
|
37
38
|
end
|
|
38
39
|
|
|
39
|
-
#def self.job_workload(job)
|
|
40
|
-
# workload = []
|
|
41
|
-
# heap = []
|
|
42
|
-
# heap << job
|
|
43
|
-
# while job = heap.pop
|
|
44
|
-
# next if job.done?
|
|
45
|
-
# workload << job
|
|
46
|
-
# heap.concat job_dependencies(job)
|
|
47
|
-
# heap.uniq!
|
|
48
|
-
# end
|
|
49
|
-
# workload.uniq
|
|
50
|
-
#end
|
|
51
|
-
|
|
52
|
-
#def self.top_level_job(jobs)
|
|
53
|
-
# top = jobs.select do |job|
|
|
54
|
-
# (jobs - job_workload(job)).empty? &&
|
|
55
|
-
# (job_workload(job) - jobs).select{|j| (job_workload(j) & jobs).any? }.empty?
|
|
56
|
-
# end
|
|
57
|
-
# return nil if top.length != 1
|
|
58
|
-
# top.first
|
|
59
|
-
#end
|
|
60
|
-
|
|
61
|
-
#def self.job_chains(rules, job)
|
|
62
|
-
# workload = job_workload(job)
|
|
63
|
-
# chains = parse_chains(rules)
|
|
64
|
-
|
|
65
|
-
# chain_jobs = {}
|
|
66
|
-
# workload.each do |job|
|
|
67
|
-
# check_chains(chains, job).each do |match|
|
|
68
|
-
# chain_jobs[match] ||= []
|
|
69
|
-
# chain_jobs[match] << job
|
|
70
|
-
# end
|
|
71
|
-
# end
|
|
72
|
-
|
|
73
|
-
# job_chains = []
|
|
74
|
-
|
|
75
|
-
# seen = []
|
|
76
|
-
# chain_jobs.sort_by{|name,jobs| jobs.length }.reverse.each do |name,jobs|
|
|
77
|
-
# remain = jobs - seen
|
|
78
|
-
# next unless remain.length > 1
|
|
79
|
-
# top_level_job = top_level_job(jobs)
|
|
80
|
-
# next if top_level_job.nil?
|
|
81
|
-
# job_chains << {:jobs => remain, :rules => chains[name][:rules], :top_level_job => top_level_job}
|
|
82
|
-
# seen.concat remain
|
|
83
|
-
# end
|
|
84
|
-
|
|
85
|
-
# job_chains
|
|
86
|
-
#end
|
|
87
|
-
|
|
88
|
-
#def self._job_chains(rules, job)
|
|
89
|
-
# workload = job_workload(job)
|
|
90
|
-
# chains = parse_chains(rules)
|
|
91
|
-
|
|
92
|
-
# matches = check_chains(chains, job)
|
|
93
|
-
|
|
94
|
-
# job_chains = {}
|
|
95
|
-
# job.dependencies.each do |dep|
|
|
96
|
-
# dep_chains = _job_chains(rules, dep)
|
|
97
|
-
# matches.each do |match|
|
|
98
|
-
# if dep_chains[match] && dep_chains[match].include?(dep)
|
|
99
|
-
# dep_chains[match].prepend job
|
|
100
|
-
# end
|
|
101
|
-
# end
|
|
102
|
-
# job_chains.merge!(dep_chains)
|
|
103
|
-
# end
|
|
104
|
-
|
|
105
|
-
# matches.each do |match|
|
|
106
|
-
# job_chains[match] ||= [job]
|
|
107
|
-
# end
|
|
108
|
-
|
|
109
|
-
# job_chains
|
|
110
|
-
#end
|
|
111
|
-
|
|
112
|
-
#def self.job_chains(rules, job)
|
|
113
|
-
# job_chains = self._job_chains(rules, job)
|
|
114
|
-
# iif job_chains
|
|
115
|
-
# chains = parse_chains(rules)
|
|
116
|
-
|
|
117
|
-
# seen = []
|
|
118
|
-
# job_chains.collect do |name,jobs|
|
|
119
|
-
# remain = jobs - seen
|
|
120
|
-
# next unless remain.length > 1
|
|
121
|
-
# top_level_job = top_level_job(jobs)
|
|
122
|
-
# next if top_level_job.nil?
|
|
123
|
-
# seen.concat remain
|
|
124
|
-
# {:jobs => remain, :rules => chains[name][:rules], :top_level_job => top_level_job}
|
|
125
|
-
# end.compact
|
|
126
|
-
#end
|
|
127
|
-
|
|
128
40
|
def self.job_chains(rules, job)
|
|
129
41
|
chains = self.parse_chains(rules)
|
|
130
42
|
|
data/lib/rbbt/hpc/orchestrate.rb
CHANGED
|
@@ -5,6 +5,23 @@ require 'rbbt/hpc/orchestrate/batches'
|
|
|
5
5
|
module HPC
|
|
6
6
|
module Orchestration
|
|
7
7
|
|
|
8
|
+
def prepare_for_execution(job)
|
|
9
|
+
rec_dependencies = job.rec_dependencies(true)
|
|
10
|
+
|
|
11
|
+
return if rec_dependencies.empty?
|
|
12
|
+
|
|
13
|
+
all_deps = rec_dependencies + [job]
|
|
14
|
+
|
|
15
|
+
all_deps.each do |dep|
|
|
16
|
+
begin
|
|
17
|
+
Step.prepare_for_execution(dep)
|
|
18
|
+
rescue RbbtException
|
|
19
|
+
next
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
24
|
+
|
|
8
25
|
def orchestrate_job(job, options)
|
|
9
26
|
options.delete "recursive_clean"
|
|
10
27
|
options.delete "clean_task"
|
|
@@ -14,6 +31,9 @@ module HPC
|
|
|
14
31
|
options.delete "detach"
|
|
15
32
|
options.delete "jobname"
|
|
16
33
|
|
|
34
|
+
Log.high "Prepare for exec"
|
|
35
|
+
prepare_for_execution(job)
|
|
36
|
+
|
|
17
37
|
if options[:orchestration_rules]
|
|
18
38
|
rules = YAML.load(Open.read(options[:orchestration_rules]))
|
|
19
39
|
elsif Rbbt.etc.slurm["default.yaml"].exists?
|
|
@@ -25,6 +45,7 @@ module HPC
|
|
|
25
45
|
IndiferentHash.setup(rules)
|
|
26
46
|
|
|
27
47
|
batches = HPC::Orchestration.job_batches(rules, job)
|
|
48
|
+
Log.high "Compute #{batches.length} batches"
|
|
28
49
|
|
|
29
50
|
batch_ids = {}
|
|
30
51
|
while batches.any?
|
|
@@ -60,7 +81,9 @@ module HPC
|
|
|
60
81
|
|
|
61
82
|
if options[:dry_run]
|
|
62
83
|
puts Log.color(:magenta, "Manifest: ") + Log.color(:blue, job_options[:manifest] * ", ") + " - tasks: #{job_options[:task_cpus] || 1} - time: #{job_options[:time]} - config: #{job_options[:config_keys]}"
|
|
63
|
-
puts Log.color(:
|
|
84
|
+
puts Log.color(:magenta, "Deps: ") + Log.color(:blue, job_options[:batch_dependencies]*", ")
|
|
85
|
+
puts Log.color(:yellow, "Path: ") + top[:top_level].path
|
|
86
|
+
puts Log.color(:yellow, "Options: ") + job_options.inspect
|
|
64
87
|
batch_ids[top] = top[:top_level].task_signature
|
|
65
88
|
else
|
|
66
89
|
id = run_job(top[:top_level], job_options)
|
data/lib/rbbt/resource/path.rb
CHANGED
|
@@ -167,8 +167,7 @@ module Path
|
|
|
167
167
|
|
|
168
168
|
@path ||= {}
|
|
169
169
|
rsearch_paths = (resource and resource.respond_to?(:search_paths)) ? resource.search_paths : nil
|
|
170
|
-
|
|
171
|
-
key = Misc.obj2digest(key_elems.inspect)
|
|
170
|
+
key = [where, caller_lib, rsearch_paths, paths].inspect
|
|
172
171
|
self.sub!('~/', Etc.getpwuid.dir + '/') if self.include? "~"
|
|
173
172
|
|
|
174
173
|
return @path[key] if @path[key]
|
data/lib/rbbt/resource/util.rb
CHANGED
|
@@ -1,13 +1,26 @@
|
|
|
1
1
|
module Path
|
|
2
2
|
|
|
3
3
|
def self.caller_lib_dir(file = nil, relative_to = ['lib', 'bin'])
|
|
4
|
-
file = caller.reject{|l|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}.first.sub(/\.rb[^\w].*/,'.rb') if file.nil?
|
|
4
|
+
#file = caller.reject{|l|
|
|
5
|
+
# l =~ /rbbt\/(?:resource\.rb|workflow\.rb)/ or
|
|
6
|
+
# l =~ /rbbt\/resource\/path\.rb/ or
|
|
7
|
+
# l =~ /rbbt\/persist.rb/ or
|
|
8
|
+
# l =~ /rbbt\/util\/misc\.rb/ or
|
|
9
|
+
# l =~ /progress-monitor\.rb/
|
|
10
|
+
#}.first.sub(/\.rb[^\w].*/,'.rb') if file.nil?
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
if file.nil?
|
|
14
|
+
caller_dup = caller.dup
|
|
15
|
+
while file = caller_dup.shift
|
|
16
|
+
break unless file =~ /rbbt\/(?:resource\.rb|workflow\.rb)/ or
|
|
17
|
+
file =~ /rbbt\/resource\/path\.rb/ or
|
|
18
|
+
file =~ /rbbt\/persist.rb/ or
|
|
19
|
+
file =~ /rbbt\/util\/misc\.rb/ or
|
|
20
|
+
file =~ /progress-monitor\.rb/
|
|
21
|
+
end
|
|
22
|
+
file = file.sub(/\.rb[^\w].*/,'.rb')
|
|
23
|
+
end
|
|
11
24
|
|
|
12
25
|
relative_to = [relative_to] unless Array === relative_to
|
|
13
26
|
file = File.expand_path(file)
|
data/lib/rbbt/util/migrate.rb
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
module Rbbt
|
|
2
|
+
|
|
3
|
+
prepare_for_execution(job)
|
|
2
4
|
def self.migrate_source_paths(path, resource = Rbbt, source = nil)
|
|
3
5
|
if source
|
|
4
6
|
lpath, *paths = Misc.ssh_run(source, <<-EOF).split("\n")
|
|
@@ -44,6 +46,8 @@ puts resource[path].find(search_path)
|
|
|
44
46
|
excludes += (options[:exclude] || "").split(/,\s*/)
|
|
45
47
|
excludes_str = excludes.collect{|s| "--exclude '#{s}'" } * " "
|
|
46
48
|
|
|
49
|
+
hard_link = options[:hard_link]
|
|
50
|
+
|
|
47
51
|
other = options[:other] || []
|
|
48
52
|
|
|
49
53
|
test_str = options[:test] ? '-nv' : ''
|
|
@@ -82,6 +86,8 @@ puts resource[path].find(search_path)
|
|
|
82
86
|
# rsync_args = "-avztAXHP --copy-unsafe-links"
|
|
83
87
|
rsync_args = "-avztAHP --copy-unsafe-links"
|
|
84
88
|
|
|
89
|
+
rsync_args << " --link-dest '#{source_path}'" if hard_link && ! options[:source]
|
|
90
|
+
|
|
85
91
|
cmd = "rsync #{rsync_args} #{test_str} #{files_from_str} #{excludes_str} '#{source_path}' #{target_path} #{other * " "}"
|
|
86
92
|
|
|
87
93
|
cmd << " && rm -Rf #{source_path}" if options[:delete] && ! options[:files]
|
|
@@ -80,7 +80,7 @@ module Misc
|
|
|
80
80
|
end
|
|
81
81
|
when (defined? TSV and TSV)
|
|
82
82
|
obj.with_unnamed do
|
|
83
|
-
"TSV:{"<< fingerprint(obj.all_fields|| [])
|
|
83
|
+
"TSV:{"<< fingerprint(obj.all_fields|| []) << ";" << fingerprint(obj.keys) << "}"
|
|
84
84
|
end
|
|
85
85
|
when Hash
|
|
86
86
|
if obj.length > 10
|
|
@@ -297,14 +297,14 @@ module Misc
|
|
|
297
297
|
str = case obj
|
|
298
298
|
when nil
|
|
299
299
|
'nil'
|
|
300
|
+
when Symbol
|
|
301
|
+
obj.to_s
|
|
300
302
|
when TrueClass
|
|
301
303
|
'true'
|
|
302
304
|
when FalseClass
|
|
303
305
|
'false'
|
|
304
306
|
when Hash
|
|
305
307
|
"{"<< obj.collect{|k,v| obj2str(k) + '=>' << obj2str(v)}*"," << "}"
|
|
306
|
-
when Symbol
|
|
307
|
-
obj.to_s
|
|
308
308
|
when (defined?(Path) and Path)
|
|
309
309
|
if defined?(Step) && Open.exists?(Step.info_file(obj))
|
|
310
310
|
obj2str(Workflow.load_step(obj))
|
|
@@ -324,9 +324,10 @@ module Misc
|
|
|
324
324
|
end
|
|
325
325
|
when String
|
|
326
326
|
good_filename = Misc.is_filename?(obj, false) && ! %w(. ..).include?(obj) && %w(. /).include?(obj[0])
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
327
|
+
if good_filename
|
|
328
|
+
obj = obj.dup
|
|
329
|
+
obj.extend Path
|
|
330
|
+
obj2str obj
|
|
330
331
|
else
|
|
331
332
|
obj = obj.chomp if String === obj
|
|
332
333
|
if obj.length > HASH2MD5_MAX_STRING_LENGTH
|
|
@@ -339,7 +340,7 @@ module Misc
|
|
|
339
340
|
if obj.length > HASH2MD5_MAX_ARRAY_LENGTH
|
|
340
341
|
"[" << sample_large_obj(obj, HASH2MD5_MAX_ARRAY_LENGTH).collect{|v| obj2str(v)} * "," << "]"
|
|
341
342
|
else
|
|
342
|
-
"[" << obj.collect{|v| obj2str(v)} * "," << "]"
|
|
343
|
+
"[" << obj.collect{|v| obj2str(v) } * "," << "]"
|
|
343
344
|
end
|
|
344
345
|
when TSV::Parser
|
|
345
346
|
remove_long_items(obj)
|
|
@@ -181,8 +181,8 @@ class Step
|
|
|
181
181
|
# end
|
|
182
182
|
#end
|
|
183
183
|
|
|
184
|
-
Log.
|
|
185
|
-
Log.
|
|
184
|
+
Log.medium "Some newer files found: #{Misc.fingerprint outdated_time}" if outdated_time.any?
|
|
185
|
+
Log.medium "Some outdated files found: #{Misc.fingerprint outdated_dep}" if outdated_dep.any?
|
|
186
186
|
|
|
187
187
|
outdated_time + outdated_dep
|
|
188
188
|
end
|
|
@@ -5,10 +5,10 @@ module Workflow
|
|
|
5
5
|
|
|
6
6
|
def self.job_workload(job)
|
|
7
7
|
workload = {job => []}
|
|
8
|
-
return workload if job.done?
|
|
8
|
+
return workload if job.done? && ! job.dirty?
|
|
9
9
|
|
|
10
10
|
job.dependencies.each do |dep|
|
|
11
|
-
next if dep.done?
|
|
11
|
+
next if dep.done? && ! job.dirty?
|
|
12
12
|
workload.merge!(job_workload(dep))
|
|
13
13
|
workload[job] += workload[dep]
|
|
14
14
|
workload[job] << dep
|
|
@@ -16,7 +16,7 @@ module Workflow
|
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
job.input_dependencies.each do |dep|
|
|
19
|
-
next if dep.done?
|
|
19
|
+
next if dep.done? && ! job.dirty?
|
|
20
20
|
workload.merge!(job_workload(dep))
|
|
21
21
|
workload[job] += workload[dep]
|
|
22
22
|
workload[job] << dep
|
data/share/Rlib/plot.R
CHANGED
|
@@ -22,6 +22,7 @@ $ rbbt slurm list [options]
|
|
|
22
22
|
-s--search* Regular expression
|
|
23
23
|
-t--tail* Show the last lines of the STDERR
|
|
24
24
|
-l--long Show more entries
|
|
25
|
+
-c--compressed Show compressed information about entries
|
|
25
26
|
-p--progress Report progress of job and the dependencies
|
|
26
27
|
-BP--batch_parameters show batch parameters
|
|
27
28
|
-BPP--batch_procpath show Procpath performance summary
|
|
@@ -185,6 +186,40 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
185
186
|
end
|
|
186
187
|
|
|
187
188
|
|
|
189
|
+
count += 1
|
|
190
|
+
|
|
191
|
+
if options[:compressed]
|
|
192
|
+
status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) : Log.color(:green, id)
|
|
193
|
+
if different_system
|
|
194
|
+
status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : Log.color(:green, id)
|
|
195
|
+
else
|
|
196
|
+
status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : (running_jobs.include?(id) || $norunningjobs ? Log.color(:green, id) : Log.color(:red, id) )
|
|
197
|
+
end
|
|
198
|
+
prog_rep = []
|
|
199
|
+
if options[:progress]
|
|
200
|
+
step_line = Open.read(fcmd).split("\n").select{|line| line =~ /^#STEP_PATH:/}.first
|
|
201
|
+
if step_line
|
|
202
|
+
require 'rbbt/workflow'
|
|
203
|
+
step_path = step_line.split(": ").last.strip
|
|
204
|
+
step = Step.new step_path
|
|
205
|
+
step.load_dependencies_from_info
|
|
206
|
+
has_bar = false
|
|
207
|
+
(step.rec_dependencies + [step]).reverse.each do |j|
|
|
208
|
+
next if j.done?
|
|
209
|
+
if j.file(:progress).exists?
|
|
210
|
+
bar = Log::ProgressBar.new
|
|
211
|
+
bar.load(j.file(:progress).yaml)
|
|
212
|
+
prog_rep << bar.report_msg.split("·")[0..1]
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
workflow, task, name = step_path.split("/")[-3..-1]
|
|
218
|
+
job_str = [Log.color(:yellow, workflow), Log.color(:magenta, task), name] * "/"
|
|
219
|
+
puts [job_str, status, prog_rep ].flatten * " "
|
|
220
|
+
next
|
|
221
|
+
end
|
|
222
|
+
|
|
188
223
|
puts Log.color :blue, dir
|
|
189
224
|
puts Log.color(:magenta, "Creation: ") << File.mtime(File.join(dir, 'command.batch')).to_s if long
|
|
190
225
|
puts Log.color(:magenta, "Started: ") << File.ctime(File.join(dir, 'std.err')).to_s if File.exist?(File.join(dir, 'std.err')) && long
|
|
@@ -232,22 +267,22 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
232
267
|
cpu_average = {}
|
|
233
268
|
rss_average = {}
|
|
234
269
|
perf.through :key, ["ts", 'stat_pid', "stat_utime", "stat_stime", "stat_cutime", "stat_cstime", "stat_rss"] do |k, values|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
270
|
+
time, stat_pid, ucpu, scpu, ccpu, cscpu, rss = values
|
|
271
|
+
time = time.to_f
|
|
272
|
+
|
|
273
|
+
cpu = Misc.sum([ucpu, scpu].collect{|v| v.to_f})
|
|
274
|
+
cpu_average[stat_pid] ||= {}
|
|
275
|
+
cpu_average[stat_pid][time] ||= []
|
|
276
|
+
cpu_average[stat_pid][time] << cpu.to_f
|
|
277
|
+
rss_average[time] ||= []
|
|
278
|
+
rss_average[time] << rss.to_f * page_size
|
|
244
279
|
end
|
|
245
280
|
|
|
246
281
|
ticks = 0
|
|
247
282
|
cpu_average.each do |stat_pid, cpu_average_pid|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
283
|
+
start = cpu_average_pid.keys.sort.first
|
|
284
|
+
eend = cpu_average_pid.keys.sort.last
|
|
285
|
+
ticks += Misc.sum(cpu_average_pid[eend]) - Misc.sum(cpu_average_pid[start])
|
|
251
286
|
end
|
|
252
287
|
start = rss_average.keys.sort.first
|
|
253
288
|
eend = rss_average.keys.sort.last
|
|
@@ -284,7 +319,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
284
319
|
puts CMD.cmd("grep -i -w 'Completed step' #{File.join(dir, 'std.err')} | grep -v 'Retrying dep.' | tail -n #{tail.to_i}", :no_fail => true).read
|
|
285
320
|
else
|
|
286
321
|
puts Log.color(:magenta, "Log tail: ")
|
|
287
|
-
puts CMD.cmd(" cat #{File.join(dir, 'std.err')} | grep -v '^[^\\s:]*\\[3.m' | grep -v -e '^[[:space:]]*$' | tail -n #{tail.to_i} ").read
|
|
322
|
+
puts CMD.cmd(" cat #{File.join(dir, 'std.err')} | grep -v '^[^\\s:]*\\[3.m' | grep -v -e '^[[:space:]]*$' | grep -v \"\\(STDOUT\\|STDERR\\):[[:space:]]*$\" | tail -n #{tail.to_i} ").read
|
|
288
323
|
end
|
|
289
324
|
end
|
|
290
325
|
|
|
@@ -309,8 +344,6 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
309
344
|
end
|
|
310
345
|
end
|
|
311
346
|
|
|
312
|
-
count += 1
|
|
313
|
-
|
|
314
347
|
end
|
|
315
348
|
|
|
316
349
|
puts
|
|
@@ -22,6 +22,7 @@ $ rbbt slurm list [options]
|
|
|
22
22
|
-s--search* Regular expression
|
|
23
23
|
-t--tail* Show the last lines of the STDERR
|
|
24
24
|
-l--long Show more entries
|
|
25
|
+
-c--compressed Show compressed information about entries
|
|
25
26
|
-p--progress Report progress of job and the dependencies
|
|
26
27
|
-BP--batch_parameters show batch parameters
|
|
27
28
|
-BPP--batch_procpath show Procpath performance summary
|
|
@@ -185,6 +186,40 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
185
186
|
end
|
|
186
187
|
|
|
187
188
|
|
|
189
|
+
count += 1
|
|
190
|
+
|
|
191
|
+
if options[:compressed]
|
|
192
|
+
status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) : Log.color(:green, id)
|
|
193
|
+
if different_system
|
|
194
|
+
status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : Log.color(:green, id)
|
|
195
|
+
else
|
|
196
|
+
status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : (running_jobs.include?(id) || $norunningjobs ? Log.color(:green, id) : Log.color(:red, id) )
|
|
197
|
+
end
|
|
198
|
+
prog_rep = []
|
|
199
|
+
if options[:progress]
|
|
200
|
+
step_line = Open.read(fcmd).split("\n").select{|line| line =~ /^#STEP_PATH:/}.first
|
|
201
|
+
if step_line
|
|
202
|
+
require 'rbbt/workflow'
|
|
203
|
+
step_path = step_line.split(": ").last.strip
|
|
204
|
+
step = Step.new step_path
|
|
205
|
+
step.load_dependencies_from_info
|
|
206
|
+
has_bar = false
|
|
207
|
+
(step.rec_dependencies + [step]).reverse.each do |j|
|
|
208
|
+
next if j.done?
|
|
209
|
+
if j.file(:progress).exists?
|
|
210
|
+
bar = Log::ProgressBar.new
|
|
211
|
+
bar.load(j.file(:progress).yaml)
|
|
212
|
+
prog_rep << bar.report_msg.split("·")[0..1]
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
workflow, task, name = step_path.split("/")[-3..-1]
|
|
218
|
+
job_str = [Log.color(:yellow, workflow), Log.color(:magenta, task), name] * "/"
|
|
219
|
+
puts [job_str, status, prog_rep ].flatten * " "
|
|
220
|
+
next
|
|
221
|
+
end
|
|
222
|
+
|
|
188
223
|
puts Log.color :blue, dir
|
|
189
224
|
puts Log.color(:magenta, "Creation: ") << File.mtime(File.join(dir, 'command.batch')).to_s if long
|
|
190
225
|
puts Log.color(:magenta, "Started: ") << File.ctime(File.join(dir, 'std.err')).to_s if File.exist?(File.join(dir, 'std.err')) && long
|
|
@@ -232,22 +267,22 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
232
267
|
cpu_average = {}
|
|
233
268
|
rss_average = {}
|
|
234
269
|
perf.through :key, ["ts", 'stat_pid', "stat_utime", "stat_stime", "stat_cutime", "stat_cstime", "stat_rss"] do |k, values|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
270
|
+
time, stat_pid, ucpu, scpu, ccpu, cscpu, rss = values
|
|
271
|
+
time = time.to_f
|
|
272
|
+
|
|
273
|
+
cpu = Misc.sum([ucpu, scpu].collect{|v| v.to_f})
|
|
274
|
+
cpu_average[stat_pid] ||= {}
|
|
275
|
+
cpu_average[stat_pid][time] ||= []
|
|
276
|
+
cpu_average[stat_pid][time] << cpu.to_f
|
|
277
|
+
rss_average[time] ||= []
|
|
278
|
+
rss_average[time] << rss.to_f * page_size
|
|
244
279
|
end
|
|
245
280
|
|
|
246
281
|
ticks = 0
|
|
247
282
|
cpu_average.each do |stat_pid, cpu_average_pid|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
283
|
+
start = cpu_average_pid.keys.sort.first
|
|
284
|
+
eend = cpu_average_pid.keys.sort.last
|
|
285
|
+
ticks += Misc.sum(cpu_average_pid[eend]) - Misc.sum(cpu_average_pid[start])
|
|
251
286
|
end
|
|
252
287
|
start = rss_average.keys.sort.first
|
|
253
288
|
eend = rss_average.keys.sort.last
|
|
@@ -284,7 +319,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
284
319
|
puts CMD.cmd("grep -i -w 'Completed step' #{File.join(dir, 'std.err')} | grep -v 'Retrying dep.' | tail -n #{tail.to_i}", :no_fail => true).read
|
|
285
320
|
else
|
|
286
321
|
puts Log.color(:magenta, "Log tail: ")
|
|
287
|
-
puts CMD.cmd(" cat #{File.join(dir, 'std.err')} | grep -v '^[^\\s:]*\\[3.m' | grep -v -e '^[[:space:]]*$' | tail -n #{tail.to_i} ").read
|
|
322
|
+
puts CMD.cmd(" cat #{File.join(dir, 'std.err')} | grep -v '^[^\\s:]*\\[3.m' | grep -v -e '^[[:space:]]*$' | grep -v \"\\(STDOUT\\|STDERR\\):[[:space:]]*$\" | tail -n #{tail.to_i} ").read
|
|
288
323
|
end
|
|
289
324
|
end
|
|
290
325
|
|
|
@@ -309,8 +344,6 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
309
344
|
end
|
|
310
345
|
end
|
|
311
346
|
|
|
312
|
-
count += 1
|
|
313
|
-
|
|
314
347
|
end
|
|
315
348
|
|
|
316
349
|
puts
|
|
@@ -22,6 +22,7 @@ $ rbbt slurm list [options]
|
|
|
22
22
|
-s--search* Regular expression
|
|
23
23
|
-t--tail* Show the last lines of the STDERR
|
|
24
24
|
-l--long Show more entries
|
|
25
|
+
-c--compressed Show compressed information about entries
|
|
25
26
|
-p--progress Report progress of job and the dependencies
|
|
26
27
|
-BP--batch_parameters show batch parameters
|
|
27
28
|
-BPP--batch_procpath show Procpath performance summary
|
|
@@ -185,6 +186,40 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
185
186
|
end
|
|
186
187
|
|
|
187
188
|
|
|
189
|
+
count += 1
|
|
190
|
+
|
|
191
|
+
if options[:compressed]
|
|
192
|
+
status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) : Log.color(:green, id)
|
|
193
|
+
if different_system
|
|
194
|
+
status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : Log.color(:green, id)
|
|
195
|
+
else
|
|
196
|
+
status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : (running_jobs.include?(id) || $norunningjobs ? Log.color(:green, id) : Log.color(:red, id) )
|
|
197
|
+
end
|
|
198
|
+
prog_rep = []
|
|
199
|
+
if options[:progress]
|
|
200
|
+
step_line = Open.read(fcmd).split("\n").select{|line| line =~ /^#STEP_PATH:/}.first
|
|
201
|
+
if step_line
|
|
202
|
+
require 'rbbt/workflow'
|
|
203
|
+
step_path = step_line.split(": ").last.strip
|
|
204
|
+
step = Step.new step_path
|
|
205
|
+
step.load_dependencies_from_info
|
|
206
|
+
has_bar = false
|
|
207
|
+
(step.rec_dependencies + [step]).reverse.each do |j|
|
|
208
|
+
next if j.done?
|
|
209
|
+
if j.file(:progress).exists?
|
|
210
|
+
bar = Log::ProgressBar.new
|
|
211
|
+
bar.load(j.file(:progress).yaml)
|
|
212
|
+
prog_rep << bar.report_msg.split("·")[0..1]
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
workflow, task, name = step_path.split("/")[-3..-1]
|
|
218
|
+
job_str = [Log.color(:yellow, workflow), Log.color(:magenta, task), name] * "/"
|
|
219
|
+
puts [job_str, status, prog_rep ].flatten * " "
|
|
220
|
+
next
|
|
221
|
+
end
|
|
222
|
+
|
|
188
223
|
puts Log.color :blue, dir
|
|
189
224
|
puts Log.color(:magenta, "Creation: ") << File.mtime(File.join(dir, 'command.batch')).to_s if long
|
|
190
225
|
puts Log.color(:magenta, "Started: ") << File.ctime(File.join(dir, 'std.err')).to_s if File.exist?(File.join(dir, 'std.err')) && long
|
|
@@ -232,22 +267,22 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
232
267
|
cpu_average = {}
|
|
233
268
|
rss_average = {}
|
|
234
269
|
perf.through :key, ["ts", 'stat_pid', "stat_utime", "stat_stime", "stat_cutime", "stat_cstime", "stat_rss"] do |k, values|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
270
|
+
time, stat_pid, ucpu, scpu, ccpu, cscpu, rss = values
|
|
271
|
+
time = time.to_f
|
|
272
|
+
|
|
273
|
+
cpu = Misc.sum([ucpu, scpu].collect{|v| v.to_f})
|
|
274
|
+
cpu_average[stat_pid] ||= {}
|
|
275
|
+
cpu_average[stat_pid][time] ||= []
|
|
276
|
+
cpu_average[stat_pid][time] << cpu.to_f
|
|
277
|
+
rss_average[time] ||= []
|
|
278
|
+
rss_average[time] << rss.to_f * page_size
|
|
244
279
|
end
|
|
245
280
|
|
|
246
281
|
ticks = 0
|
|
247
282
|
cpu_average.each do |stat_pid, cpu_average_pid|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
283
|
+
start = cpu_average_pid.keys.sort.first
|
|
284
|
+
eend = cpu_average_pid.keys.sort.last
|
|
285
|
+
ticks += Misc.sum(cpu_average_pid[eend]) - Misc.sum(cpu_average_pid[start])
|
|
251
286
|
end
|
|
252
287
|
start = rss_average.keys.sort.first
|
|
253
288
|
eend = rss_average.keys.sort.last
|
|
@@ -284,7 +319,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
284
319
|
puts CMD.cmd("grep -i -w 'Completed step' #{File.join(dir, 'std.err')} | grep -v 'Retrying dep.' | tail -n #{tail.to_i}", :no_fail => true).read
|
|
285
320
|
else
|
|
286
321
|
puts Log.color(:magenta, "Log tail: ")
|
|
287
|
-
puts CMD.cmd(" cat #{File.join(dir, 'std.err')} | grep -v '^[^\\s:]*\\[3.m' | grep -v -e '^[[:space:]]*$' | tail -n #{tail.to_i} ").read
|
|
322
|
+
puts CMD.cmd(" cat #{File.join(dir, 'std.err')} | grep -v '^[^\\s:]*\\[3.m' | grep -v -e '^[[:space:]]*$' | grep -v \"\\(STDOUT\\|STDERR\\):[[:space:]]*$\" | tail -n #{tail.to_i} ").read
|
|
288
323
|
end
|
|
289
324
|
end
|
|
290
325
|
|
|
@@ -309,8 +344,6 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
309
344
|
end
|
|
310
345
|
end
|
|
311
346
|
|
|
312
|
-
count += 1
|
|
313
|
-
|
|
314
347
|
end
|
|
315
348
|
|
|
316
349
|
puts
|
|
@@ -219,8 +219,8 @@ help = !!options.delete(:help)
|
|
|
219
219
|
do_fork = !!options.delete(:fork)
|
|
220
220
|
detach = !!options.delete(:detach)
|
|
221
221
|
do_exec = !!options.delete(:exec)
|
|
222
|
-
clean = !!options.delete(:clean)
|
|
223
222
|
clean_task = options.delete(:clean_task)
|
|
223
|
+
clean = !!options.delete(:clean) || clean_task
|
|
224
224
|
override_deps = options.delete(:override_deps)
|
|
225
225
|
recursive_clean = !!options.delete(:recursive_clean)
|
|
226
226
|
out = options.include?(:output) ? File.open(options[:output], 'wb') : STDOUT
|
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.33.
|
|
4
|
+
version: 5.33.8
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Miguel Vazquez
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-03-
|
|
11
|
+
date: 2022-03-14 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rake
|