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 +4 -4
- data/.vimproject +1 -0
- data/VERSION +1 -1
- data/lib/scout/semaphore.rb +28 -17
- data/lib/scout/work_queue/socket.rb +1 -0
- data/lib/scout/work_queue/worker.rb +2 -1
- data/lib/scout/work_queue.rb +4 -4
- data/lib/scout/workflow/step.rb +2 -2
- data/scout-gear.gemspec +3 -2
- data/scout_commands/workflow/cmd +2 -1
- data/scout_commands/workflow/example +123 -0
- data/scout_commands/workflow/info +9 -0
- metadata +2 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7fa8d9cac544d5ca1f697bd9664fed77ee89084e0d900aa237f2cbd0367a9453
|
|
4
|
+
data.tar.gz: fb87a9fb7e8562a9a5b5db2aae244f111612cc7ff1d8e1325714d99611add74e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 67697db2c2f3fb425fb8a56298934856aa7cceb7b0b1c43b8bba8cba51f867e2d2685fbd962c596c7527506a09a9e93face9816844e1fb8708a828a144071d69
|
|
7
|
+
data.tar.gz: 1534d012e107a68f01a6a747e029dd9c7e1497c08d16398d4964f9c1661b2afe6692a3f984077e7e1a66c86719cdc1788d749ae20fd2eed8526402cce4a75e4e
|
data/.vimproject
CHANGED
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
10.11.
|
|
1
|
+
10.11.6
|
data/lib/scout/semaphore.rb
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
159
|
-
ret = with_retry(**opts) { ScoutSemaphore.
|
|
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.
|
|
167
|
-
ret = with_retry(**opts) { ScoutSemaphore.
|
|
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.
|
|
175
|
-
|
|
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.
|
|
188
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
253
|
+
ScoutSemaphore.delete_semaphore(file)
|
|
243
254
|
rescue SystemCallError => e
|
|
244
255
|
Log.warn "delete_semaphore(#{file}) failed: #{e.message}"
|
|
245
256
|
end
|
data/lib/scout/work_queue.rb
CHANGED
|
@@ -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
|
data/lib/scout/workflow/step.rb
CHANGED
|
@@ -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 =>
|
|
205
|
+
:provided_inputs => IndiferentHash.serializable(provided_inputs),
|
|
206
206
|
:non_default_inputs => non_default_inputs,
|
|
207
|
-
:inputs =>
|
|
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.
|
|
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.
|
|
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",
|
data/scout_commands/workflow/cmd
CHANGED
|
@@ -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("
|
|
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.
|
|
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
|