scout-gear 10.11.3 → 10.11.6

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: 59a4e58c16692963459b2f3993829a34a48bedae88a879e5b0a349acb279e135
4
- data.tar.gz: 5473ffe02a923a32ea39d1c8b72e9841c25716382e13975d93f846b83943c43a
3
+ metadata.gz: 7fa8d9cac544d5ca1f697bd9664fed77ee89084e0d900aa237f2cbd0367a9453
4
+ data.tar.gz: fb87a9fb7e8562a9a5b5db2aae244f111612cc7ff1d8e1325714d99611add74e
5
5
  SHA512:
6
- metadata.gz: f0937e1aedac6d478e5164a26802f342e759c71a62d6e6abf81b3621191c1b7c4ad72b9db1f5579c6b1478fff749b734b5fe9926774aa783a54c3130cc676e79
7
- data.tar.gz: fe8ba7061d5d381097acab46ec9ad591526fb2623a9b8e7739b1afd20079f0df5fce7ca35418c781b416993afd9dcdc5d611c6db008c7f246a45fea37c150f42
6
+ metadata.gz: 67697db2c2f3fb425fb8a56298934856aa7cceb7b0b1c43b8bba8cba51f867e2d2685fbd962c596c7527506a09a9e93face9816844e1fb8708a828a144071d69
7
+ data.tar.gz: 1534d012e107a68f01a6a747e029dd9c7e1497c08d16398d4964f9c1661b2afe6692a3f984077e7e1a66c86719cdc1788d749ae20fd2eed8526402cce4a75e4e
data/.vimproject CHANGED
@@ -193,6 +193,7 @@ scout-gear=/$PWD filter="*.rb *.yaml" {
193
193
  }
194
194
  workflow=workflow{
195
195
  task
196
+ example
196
197
  list
197
198
  info
198
199
  write_info
data/VERSION CHANGED
@@ -1 +1 @@
1
- 10.11.3
1
+ 10.11.6
@@ -25,7 +25,7 @@ if continue
25
25
 
26
26
  # Create a named semaphore. Return 0 on success, -errno on error.
27
27
  builder.c_singleton <<-EOF
28
- int create_semaphore(char* name, int value){
28
+ int create_semaphore_c(char* name, int value){
29
29
  sem_t* sem;
30
30
  sem = sem_open(name, O_CREAT, S_IRWXU|S_IRWXG|S_IRWXO, value);
31
31
  if (sem == SEM_FAILED){
@@ -39,7 +39,7 @@ if continue
39
39
 
40
40
  # Unlink (remove) a named semaphore. Return 0 on success, -errno on error.
41
41
  builder.c_singleton <<-EOF
42
- int delete_semaphore(char* name){
42
+ int delete_semaphore_c(char* name){
43
43
  int ret = sem_unlink(name);
44
44
  if (ret == -1) {
45
45
  return -errno;
@@ -50,7 +50,7 @@ if continue
50
50
 
51
51
  # Wait (sem_wait) on a named semaphore. Return 0 on success, -errno on error.
52
52
  builder.c_singleton <<-EOF
53
- int wait_semaphore(char* name){
53
+ int wait_semaphore_c(char* name){
54
54
  sem_t* sem;
55
55
  sem = sem_open(name, 0);
56
56
  if (sem == SEM_FAILED){
@@ -76,7 +76,7 @@ if continue
76
76
 
77
77
  # Post (sem_post) on a named semaphore. Return 0 on success, -errno on error.
78
78
  builder.c_singleton <<-EOF
79
- int post_semaphore(char* name){
79
+ int post_semaphore_c(char* name){
80
80
  sem_t* sem;
81
81
  sem = sem_open(name, 0);
82
82
  if (sem == SEM_FAILED){
@@ -113,6 +113,11 @@ if continue
113
113
  s
114
114
  end
115
115
 
116
+ def self.exists?(name)
117
+ file = File.join('/dev/shm', 'sem.' + name[1..-1])
118
+ Open.exists? file
119
+ end
120
+
116
121
  # Errno numeric lists
117
122
  RETRIABLE_ERRNOS = [
118
123
  Errno::ENOENT,
@@ -155,24 +160,26 @@ if continue
155
160
  end
156
161
 
157
162
  # Safe wrappers that raise SystemCallError on final failure
158
- def self.safe_create_semaphore(name, value, **opts)
159
- ret = with_retry(**opts) { ScoutSemaphore.create_semaphore(name, value) }
163
+ def self.create_semaphore(name, value, **opts)
164
+ ret = with_retry(**opts) { ScoutSemaphore.create_semaphore_c(name, value) }
165
+ raise SystemCallError.new("Semaphore missing (#{name})") unless self.exists?(name)
160
166
  if ret < 0
161
167
  raise SystemCallError.new("create_semaphore(#{name}) failed", -ret)
162
168
  end
163
169
  ret
164
170
  end
165
171
 
166
- def self.safe_delete_semaphore(name, **opts)
167
- ret = with_retry(**opts) { ScoutSemaphore.delete_semaphore(name) }
172
+ def self.delete_semaphore(name, **opts)
173
+ ret = with_retry(**opts) { ScoutSemaphore.delete_semaphore_c(name) }
168
174
  if ret < 0
169
175
  raise SystemCallError.new("delete_semaphore(#{name}) failed", -ret)
170
176
  end
171
177
  ret
172
178
  end
173
179
 
174
- def self.safe_wait_semaphore(name, **opts)
175
- ret = with_retry(**opts) { ScoutSemaphore.wait_semaphore(name) }
180
+ def self.wait_semaphore(name, **opts)
181
+ raise SystemCallError.new("Semaphore missing (#{name})") unless self.exists?(name)
182
+ ret = with_retry(**opts) { ScoutSemaphore.wait_semaphore_c(name) }
176
183
  if ret < 0
177
184
  err = -ret
178
185
  if err == Errno::EINTR.new.errno
@@ -184,8 +191,9 @@ if continue
184
191
  ret
185
192
  end
186
193
 
187
- def self.safe_post_semaphore(name, **opts)
188
- ret = with_retry(**opts) { ScoutSemaphore.post_semaphore(name) }
194
+ def self.post_semaphore(name, **opts)
195
+ raise SystemCallError.new("Semaphore missing (#{name})") unless self.exists?(name)
196
+ ret = with_retry(**opts) { ScoutSemaphore.post_semaphore_c(name) }
189
197
  if ret < 0
190
198
  raise SystemCallError.new("post_semaphore(#{name}) failed", -ret)
191
199
  end
@@ -198,7 +206,7 @@ if continue
198
206
 
199
207
  # wait_semaphore returns 0 on success or -errno on error
200
208
  begin
201
- ScoutSemaphore.safe_wait_semaphore(sem)
209
+ ScoutSemaphore.wait_semaphore(sem)
202
210
  rescue SemaphoreInterrupted
203
211
  raise
204
212
  rescue SystemCallError => e
@@ -210,10 +218,13 @@ if continue
210
218
  yield
211
219
  ensure
212
220
  begin
213
- ScoutSemaphore.safe_post_semaphore(sem)
221
+ ScoutSemaphore.post_semaphore(sem)
214
222
  rescue SystemCallError => e
215
223
  # Log but don't raise from ensure
216
- Log.warn "post_semaphore(#{sem}) failed in ensure: #{e.message}"
224
+ # Log.warn "post_semaphore(#{sem}) failed in ensure: #{e.message}"
225
+
226
+ # Actually, do raise
227
+ raise e
217
228
  end
218
229
  end
219
230
  end
@@ -229,7 +240,7 @@ if continue
229
240
  begin
230
241
  Log.debug "Creating semaphore (#{ size }): #{file}"
231
242
  begin
232
- ScoutSemaphore.safe_create_semaphore(file, size)
243
+ ScoutSemaphore.create_semaphore(file, size)
233
244
  rescue SystemCallError => e
234
245
  Log.error "Failed to create semaphore #{file}: #{e.message}"
235
246
  raise
@@ -239,7 +250,7 @@ if continue
239
250
  ensure
240
251
  Log.debug "Removing semaphore #{ file }"
241
252
  begin
242
- ScoutSemaphore.safe_delete_semaphore(file)
253
+ ScoutSemaphore.delete_semaphore(file)
243
254
  rescue SystemCallError => e
244
255
  Log.warn "delete_semaphore(#{file}) failed: #{e.message}"
245
256
  end
@@ -22,6 +22,7 @@ class WorkQueue
22
22
  end
23
23
 
24
24
  def clean
25
+ return if @cleaned
25
26
  @cleaned = true
26
27
  @sread.close unless @sread.closed?
27
28
  @swrite.close unless @swrite.closed?
@@ -51,8 +51,9 @@ class WorkQueue
51
51
  rescue Exception
52
52
  begin
53
53
  output.write WorkerException.new($!, Process.pid)
54
- ensure
55
54
  exit EXIT_STATUS
55
+ rescue
56
+ exit -1
56
57
  end
57
58
  end
58
59
  exit 0
@@ -115,7 +115,7 @@ class WorkQueue
115
115
  break if @worker_mutex.synchronize{ @workers.empty? }
116
116
  threads = @workers.collect do |w|
117
117
  t = Thread.new do
118
- Thread.report_on_exception = false
118
+ Thread.current.report_on_exception = false
119
119
  Thread.current["name"] = "Worker waiter #{queue_id} worker #{w.pid}"
120
120
  pid, status = Process.wait2 w.pid
121
121
  remove_worker(pid) if pid
@@ -129,7 +129,7 @@ class WorkQueue
129
129
  threads.each do |t|
130
130
  begin
131
131
  t.join
132
- rescue
132
+ rescue Exception
133
133
  exceptions << $!
134
134
  end
135
135
  end
@@ -169,13 +169,13 @@ class WorkQueue
169
169
  @worker_mutex.synchronize{ @workers.length }.times do
170
170
  begin
171
171
  @input.write DoneProcessing.new() unless @input.closed_write?
172
- rescue IOError
172
+ rescue IOError,Errno::ENOENT
173
173
  end
174
174
  end
175
175
  end
176
176
 
177
177
  def clean
178
- @waiter.join if @waiter
178
+ @waiter.join if @waiter && Thread.current != @waiter
179
179
  @input.clean
180
180
  @output.clean
181
181
  end
@@ -202,9 +202,9 @@ class Step
202
202
  reset_info :status => :setup, :issued => Time.now,
203
203
  :pid => Process.pid, :pid_hostname => Misc.hostname,
204
204
  :task_name => task_name, :workflow => workflow.to_s,
205
- :provided_inputs => Annotation.purge(provided_inputs),
205
+ :provided_inputs => IndiferentHash.serializable(provided_inputs),
206
206
  :non_default_inputs => non_default_inputs,
207
- :inputs => Annotation.purge(inputs), :input_names => input_names, :type => type,
207
+ :inputs => IndiferentHash.serializable(inputs), :input_names => input_names, :type => type,
208
208
  :dependencies => (dependencies || []) .collect{|d| d.path }
209
209
 
210
210
  run_dependencies
data/scout-gear.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: scout-gear 10.11.3 ruby lib
5
+ # stub: scout-gear 10.11.6 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "scout-gear".freeze
9
- s.version = "10.11.3".freeze
9
+ s.version = "10.11.6".freeze
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
@@ -169,6 +169,7 @@ Gem::Specification.new do |s|
169
169
  "scout_commands/template",
170
170
  "scout_commands/update",
171
171
  "scout_commands/workflow/cmd",
172
+ "scout_commands/workflow/example",
172
173
  "scout_commands/workflow/info",
173
174
  "scout_commands/workflow/install",
174
175
  "scout_commands/workflow/list",
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'scout'
4
4
 
5
+ exec = $0
5
6
  $0 = "scout #{$previous_commands.any? ? $previous_commands*" " + " " : "" }#{ File.basename(__FILE__) }" if $previous_commands
6
7
 
7
8
  options = SOPT.setup <<EOF
@@ -76,7 +77,7 @@ begin
76
77
  CMD.cmd_log('ruby', wf.libdir["test_workflow.rb"].find)
77
78
  else
78
79
  Log.info "No bootstrap for #{ workflow }, running examples instead"
79
- CMD.cmd_log("scout workflow example #{ workflow }")
80
+ CMD.cmd_log("#{exec} workflow example #{ workflow }")
80
81
  exit 0
81
82
  end
82
83
  end
@@ -0,0 +1,123 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'scout'
5
+
6
+ cmd = $previous_commands ?
7
+ "scout #{$previous_commands.any? ? "#{$previous_commands * ' '} " : ''}#{File.basename(__FILE__)}" :
8
+ $PROGRAM_NAME
9
+
10
+ options = SOPT.setup <<~EOF
11
+ Run examples
12
+
13
+ $ #{cmd} <workflow> [<task>] [<name>] -- [<task_options>]
14
+
15
+ Run workflow examples. You can define tasks and example names. You can also override task options
16
+
17
+ -h--help Print this help
18
+ EOF
19
+ if options[:help]
20
+ if defined? scout_usage
21
+ scout_usage
22
+ else
23
+ puts SOPT.doc
24
+ end
25
+ exit 0
26
+ end
27
+
28
+ help = IndiferentHash.process_options options, :help
29
+
30
+ filename, _ = ARGV
31
+
32
+
33
+ raise MissingParameterException, :filename if filename.nil?
34
+
35
+ def run_task(workflow, task, name)
36
+ Log.info "Running example #{Log.color :magenta, workflow.to_s}##{Log.color :yellow, task} -- #{Log.color :cyan, name}"
37
+
38
+ example_dir = workflow.libdir.examples[task][name].find
39
+ Log.debug "Using #{example_dir}"
40
+
41
+ ARGV.replace([workflow.to_s, task, '--load_inputs', example_dir, '--jobname', name,'-pf'] + $saved_args)
42
+
43
+ path = nil
44
+ success = nil
45
+ TmpFile.with_file do |res|
46
+ Open.open(res, :mode => 'w') do |file|
47
+ @pid = Process.fork{
48
+ STDOUT.reopen res
49
+ load Rbbt.share.rbbt_commands.workflow.task.find
50
+ }
51
+ Signal.trap(:INT) do
52
+ begin
53
+ Process.kill "INT", @pid
54
+ ensure
55
+ Kernel.exit! -1
56
+ end
57
+ end
58
+ file.close
59
+ begin
60
+ p,s = Process.waitpid2 @pid
61
+ success = s.success?
62
+ rescue Errno::ECHILD
63
+ success = true
64
+ end
65
+ end
66
+ sleep 0.5
67
+ path = Open.read(res).strip.split("\n").last if File.exist? res
68
+ end
69
+ path = "NO RESULT" if path.nil? or path.empty?
70
+
71
+ if success
72
+ Log.info "#{Log.color :green, "SUCCESS"} #{Log.color :magenta, workflow.to_s}##{Log.color :yellow, task} -- #{Log.color :cyan, name}"
73
+ return [path, true]
74
+ else
75
+ Log.info "#{Log.color :red, "ERROR"} #{Log.color :magenta, workflow.to_s}##{Log.color :yellow, task} -- #{Log.color :cyan, name}"
76
+ return [path, false]
77
+ end
78
+ end
79
+
80
+ workflow = ARGV.shift
81
+ raise ParameterException if workflow.nil?
82
+
83
+ task = ARGV.shift
84
+ task = nil if task == '--'
85
+
86
+ name = ARGV.shift if task
87
+ name = nil if name == '--'
88
+
89
+ orig_name = name
90
+
91
+ $saved_args = ARGV.dup
92
+
93
+ $saved_args.shift if $saved_args.include? '--'
94
+
95
+ workflow = Workflow.require_workflow workflow
96
+
97
+ tasks = task ? [task] : workflow.libdir.examples.glob('*').collect{|file| File.basename file }
98
+
99
+ task_result = {}
100
+ TSV.traverse tasks do |task|
101
+ names = name ? [name] : workflow.libdir.examples[task].glob('*').collect{|file| File.basename file }
102
+ TSV.traverse names do |name|
103
+ success = run_task workflow, task, name
104
+ task_result[[task, name]] = success
105
+ end
106
+ end
107
+
108
+
109
+ task_result.each do |code,res|
110
+ task, name = code
111
+ path, success = res
112
+ if success
113
+ if orig_name
114
+ puts Open.read(path)
115
+ else
116
+ STDERR.puts "#{Log.color :green, "SUCCESS"} #{Log.color :magenta, workflow.to_s}##{Log.color :yellow, task} -- #{Log.color :cyan, name}"
117
+ puts path
118
+ end
119
+ else
120
+ STDERR.puts "#{Log.color :red, "ERROR"} #{Log.color :magenta, workflow.to_s}##{Log.color :yellow, task} -- #{Log.color :cyan, name}"
121
+ puts path
122
+ end
123
+ end
@@ -38,6 +38,7 @@ elsif options[:recursive_inputs]
38
38
  end
39
39
  else
40
40
  step.info.each do |k,v|
41
+ next if k.to_s == 'exception'
41
42
  case v
42
43
  when nil
43
44
  next
@@ -50,5 +51,13 @@ else
50
51
  rescue
51
52
  next
52
53
  end
54
+ if step.error?
55
+ if exception = step.exception
56
+ begin
57
+ Log.exception exception
58
+ rescue
59
+ end
60
+ end
61
+ end
53
62
  end
54
63
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scout-gear
3
3
  version: !ruby/object:Gem::Version
4
- version: 10.11.3
4
+ version: 10.11.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miguel Vazquez
@@ -252,6 +252,7 @@ files:
252
252
  - scout_commands/template
253
253
  - scout_commands/update
254
254
  - scout_commands/workflow/cmd
255
+ - scout_commands/workflow/example
255
256
  - scout_commands/workflow/info
256
257
  - scout_commands/workflow/install
257
258
  - scout_commands/workflow/list