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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bea55b2e4dd5972cf0e9646e84db4ce6ffd0556bb54796927640dbe3a3ba6611
4
- data.tar.gz: 281d52e1685badaba8427e5ffd2226e1a1ab61d66df30cc7cd88acb79ef5aa18
3
+ metadata.gz: aaa014ffdad4e098212cc3f7cefc4d04ac62a7f7fcbf17bbbab9415c6253d9ef
4
+ data.tar.gz: b8a2a233686ec2f229ed79bb19d87d8eb79ad945142305f7b61dcdb11f5f7912
5
5
  SHA512:
6
- metadata.gz: 459b75076980833dc1be3bd60d9fc98707270c626ab837e76a6c09180aaa2bd3328b4dea8776cf09c8fca0358e38258a30a90d17cd615450a38398c53bacfef0
7
- data.tar.gz: 1bb336e1a592b64fbb3e87453042e3f6f220b76c92f5e9ff7550aa25401fd3e36a823f31bddb0e8be6878fa7646b28a010ac320d6fd8e00066bd1ebf2e9f774f
6
+ metadata.gz: 564242bef1dd92c2f53a5fe6c967624de26d7ae7eeb4da1ef2a1f682db9cf6d4b0bf0f8e76b3a600afe6af7bb443df28a8fe50e570c3c56265319eb607d6c1fc
7
+ data.tar.gz: ac7c01fa7e8fccdff8dfc861b82f28889a68f77886c198ff55b09558b36857ec9c29a8bae979bc7d088f311ad81515676bc7a4cc30097fd6c4b7586e6838c0e3
@@ -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
 
@@ -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(:yellow, "Deps: ") + Log.color(:blue, job_options[:batch_dependencies]*", ")
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)
@@ -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
- key_elems = [where, caller_lib, rsearch_paths, paths]
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]
@@ -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
- 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?
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)
@@ -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|| []).inspect << ";" << fingerprint(obj.keys).inspect << "}"
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
- is_path = Path === obj
328
- if good_filename && ! is_path
329
- obj2str Path.setup(obj.dup)
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.high "Some newer files found: #{Misc.fingerprint outdated_time}" if outdated_time.any?
185
- Log.high "Some outdated files found: #{Misc.fingerprint outdated_dep}" if outdated_dep.any?
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
@@ -38,3 +38,4 @@ geom_entity <- function (real.geom = NULL, mapping = NULL, data = NULL, stat = "
38
38
  rg
39
39
  }
40
40
 
41
+ rbbt.ggplot2.rotate_x_labels <- function(){ theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1)) }
@@ -185,6 +185,10 @@ compile(){
185
185
  local name=$1; shift
186
186
  local extra="$@"
187
187
 
188
+ if [ -f bootstrap ]; then
189
+ ./bootstrap
190
+ fi
191
+
188
192
  if [ -f Makefile -o -f makefile ]; then
189
193
  make -j 4 || exit -1
190
194
  make install || echo "No install"
@@ -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
- time, stat_pid, ucpu, scpu, ccpu, cscpu, rss = values
236
- time = time.to_f
237
-
238
- cpu = Misc.sum([ucpu, scpu].collect{|v| v.to_f})
239
- cpu_average[stat_pid] ||= {}
240
- cpu_average[stat_pid][time] ||= []
241
- cpu_average[stat_pid][time] << cpu.to_f
242
- rss_average[time] ||= []
243
- rss_average[time] << rss.to_f * page_size
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
- start = cpu_average_pid.keys.sort.first
249
- eend = cpu_average_pid.keys.sort.last
250
- ticks += Misc.sum(cpu_average_pid[eend]) - Misc.sum(cpu_average_pid[start])
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
- time, stat_pid, ucpu, scpu, ccpu, cscpu, rss = values
236
- time = time.to_f
237
-
238
- cpu = Misc.sum([ucpu, scpu].collect{|v| v.to_f})
239
- cpu_average[stat_pid] ||= {}
240
- cpu_average[stat_pid][time] ||= []
241
- cpu_average[stat_pid][time] << cpu.to_f
242
- rss_average[time] ||= []
243
- rss_average[time] << rss.to_f * page_size
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
- start = cpu_average_pid.keys.sort.first
249
- eend = cpu_average_pid.keys.sort.last
250
- ticks += Misc.sum(cpu_average_pid[eend]) - Misc.sum(cpu_average_pid[start])
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
- time, stat_pid, ucpu, scpu, ccpu, cscpu, rss = values
236
- time = time.to_f
237
-
238
- cpu = Misc.sum([ucpu, scpu].collect{|v| v.to_f})
239
- cpu_average[stat_pid] ||= {}
240
- cpu_average[stat_pid][time] ||= []
241
- cpu_average[stat_pid][time] << cpu.to_f
242
- rss_average[time] ||= []
243
- rss_average[time] << rss.to_f * page_size
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
- start = cpu_average_pid.keys.sort.first
249
- eend = cpu_average_pid.keys.sort.last
250
- ticks += Misc.sum(cpu_average_pid[eend]) - Misc.sum(cpu_average_pid[start])
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
@@ -37,7 +37,7 @@ file = ARGV.shift
37
37
  $seen = []
38
38
  def get_step(file)
39
39
  file = File.expand_path(file)
40
- file = file.sub(/\.(info|files)/,'')
40
+ file = file.sub(/\.(info|files)$/,'')
41
41
  $seen << file
42
42
  Workflow.load_step file
43
43
  end
@@ -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.5
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-04 00:00:00.000000000 Z
11
+ date: 2022-03-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake