pwrake 2.2.2 → 2.2.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 700155f122d51b4ae814349492054d336daa6dad
4
- data.tar.gz: 8bd23134b9c79784b95670440c0e823f139b41e5
3
+ metadata.gz: 1c3bfd1d1e40600085dbe880e57230260fa81b4f
4
+ data.tar.gz: 84a151198f3d200792e84fbe17715092b33abc15
5
5
  SHA512:
6
- metadata.gz: ca62080f1e262829e1da0623c474d0415bdda728498bea11a25f8b17d2a3d60ecf8ebb701ab4eb160f8a894840e402477f2daf87335103aefa42bf89a021d1b5
7
- data.tar.gz: ad190406c5a890f78e3691cac5bed219e537ac911617fe4cb1d68ce6d6cbd65c9963e0fa5bd8e328aad864e6303bef893bd5877afefcd2e85402d6864759f8ee
6
+ metadata.gz: 1db1ccc6ce750393100155219a6b86c012c9126b6dfe77ed7bc2f8e4d8ec7baa113741b51a43765e16513554cae8a077bd005706290b2f139d0e960a21d0d4c2
7
+ data.tar.gz: c2d49f2af43611bda75f92f74726bd5c7045ea2d85604b480231b5d0e5729d2d90b60f9c58b89aa12ea1e513eb8f3fa4c38a87b1beab485f266a0c759271383e
data/README.md CHANGED
@@ -170,6 +170,7 @@ Properties (The leftmost item is default):
170
170
 
171
171
  ncore=integer - The number of cores used by this task.
172
172
  exclusive=no|yes - Exclusively execute this task in a single node.
173
+ reserve=no|yes - Gives higher priority to this task if ncore>1. (reserve a host)
173
174
  allow=hostname - Allow this host to execute this task. (accepts wild card)
174
175
  deny=hostname - Deny this host to execute this task. (accepts wild card)
175
176
  order=deny,allow|allow,deny - The order of evaluation.
@@ -201,12 +202,12 @@ Properties (The leftmost item is default):
201
202
 
202
203
  ## Current version
203
204
 
204
- * Pwrake version 2.2.0
205
+ * Pwrake version 2.2.3
205
206
 
206
207
  ## Tested Platform
207
208
 
208
209
 
209
- * Ruby 2.4.0
210
+ * Ruby 2.4.1
210
211
  * Rake 12.0.0
211
212
  * CentOS 7.3
212
213
 
@@ -95,11 +95,15 @@ class CommunicatorSet
95
95
  end
96
96
 
97
97
  def kill(sig)
98
+ @selector.clear
98
99
  NBIO::Handler.kill(handler_set,sig)
100
+ @selector.run
99
101
  end
100
102
 
101
103
  def exit
104
+ @selector.clear
102
105
  NBIO::Handler.exit(handler_set)
106
+ @selector.run
103
107
  end
104
108
 
105
109
  end
@@ -1,4 +1,5 @@
1
1
  require "fileutils"
2
+ require "timeout"
2
3
  require "pwrake/logger"
3
4
  require "pwrake/nbio"
4
5
  require "pwrake/option/option"
@@ -22,6 +23,7 @@ module Pwrake
22
23
  @option = Option.new
23
24
  Log.set_logger(@option)
24
25
  TaskWrapper.init_task_logger(@option)
26
+ at_exit{TaskWrapper.close_task_logger}
25
27
  # moved from Option#init
26
28
  @option.put_log
27
29
  if @option['LOG_DIR'] && @option['GC_LOG_FILE']
@@ -63,31 +65,33 @@ module Pwrake
63
65
  end
64
66
 
65
67
  def signal_trap(sig)
66
- case @killed
67
- when 0
68
- # log writing failed. can't be called from trap context
69
- $stderr.puts "\nSignal trapped. (sig=#{sig} pid=#{Process.pid} ##{@killed})"
70
- if Rake.application.options.debug
71
- $stderr.puts "in master thread #{Thread.current}:"
72
- $stderr.puts caller
73
- if @thread
74
- $stderr.puts "in branch thread #{@thread}:"
75
- $stderr.puts @thread.backtrace.join("\n")
76
- end
68
+ $stderr.puts "\nSignal trapped. (sig=#{sig} pid=#{Process.pid})"
69
+ if Rake.application.options.debug
70
+ $stderr.puts "in master thread #{Thread.current}:"
71
+ $stderr.puts caller
72
+ if @thread
73
+ $stderr.puts "in branch thread #{@thread}:"
74
+ $stderr.puts @thread.backtrace.join("\n")
77
75
  end
78
- $stderr.puts "Exiting..."
79
- @no_more_run = true
80
- @failed = true
81
- NBIO::Handler.kill(@hdl_set,sig)
82
- # @selector.run : not required here
83
- when 1
84
- $stderr.puts "\nOnce more Ctrl-C (SIGINT) for exit."
85
- when 2
86
- @thread.kill if @thread
87
- else
88
- Kernel.exit(false) # must wait for nomral exit
89
76
  end
90
- @killed += 1
77
+ kill_end(sig)
78
+ end
79
+
80
+ def kill_end(sig)
81
+ # log writing failed. can't be called from trap context
82
+ $stderr.puts "Exiting..."
83
+ @no_more_run = true
84
+ @failed = true
85
+ @selector.clear
86
+ NBIO::Handler.kill(@hdl_set,sig)
87
+ begin
88
+ Timeout.timeout(30) do
89
+ @selector.run
90
+ @thread.join if @thread
91
+ end
92
+ rescue
93
+ end
94
+ Kernel.exit(false)
91
95
  end
92
96
 
93
97
  def setup_branches
@@ -167,12 +171,14 @@ module Pwrake
167
171
  host_info = @hostinfo_by_id[hid.to_i]
168
172
  if host_info && host_info.decrease(1)
169
173
  # all retired
170
- m = "retired: host #{host_info.name}"
171
- Log.warn(m)
172
- $stderr.puts(m)
173
- drop_host(host_info) # delete from hostinfo_by_id
174
- if @hostinfo_by_id.empty?
175
- raise RuntimeError,"no worker host"
174
+ if !@exited
175
+ m = "retired: host #{host_info.name}"
176
+ Log.warn(m)
177
+ $stderr.puts(m)
178
+ drop_host(host_info) # delete from hostinfo_by_id
179
+ if @hostinfo_by_id.empty?
180
+ raise RuntimeError,"no worker host"
181
+ end
176
182
  end
177
183
  end
178
184
  end
@@ -208,7 +214,6 @@ module Pwrake
208
214
 
209
215
  setup_postprocess1
210
216
  @branch_setup_thread.join
211
- @killed = 0
212
217
  [:TERM,:INT].each do |sig|
213
218
  Signal.trap(sig) do
214
219
  signal_trap(sig)
@@ -374,12 +379,18 @@ module Pwrake
374
379
  end
375
380
 
376
381
  def ending?
377
- #Log.debug " @no_more_run=#{@no_more_run.inspect}"
378
- #Log.debug " @task_queue.empty?=#{@task_queue.empty?}"
379
- #Log.debug " @hostinfo_by_id.empty?=#{@hostinfo_by_id.empty?}"
380
- #Log.debug " @hostinfo_by_taskname.keys=#{@hostinfo_by_taskname.keys.inspect}"
381
- (@no_more_run || @task_queue.empty? || @hostinfo_by_id.empty?) &&
382
+ if @no_more_run || @task_queue.empty? || @hostinfo_by_id.empty?
383
+ case @hostinfo_by_taskname.size
384
+ when 1..2
385
+ Log.debug " @no_more_run=#{@no_more_run.inspect}" if @no_more_run
386
+ Log.debug " @task_queue.empty?=#{@task_queue.empty?}" if @task_queue.empty?
387
+ Log.debug " @hostinfo_by_id.empty?=#{@hostinfo_by_id.empty?}" if @hostinfo_by_id.empty?
388
+ Log.debug " @hostinfo_by_taskname.keys=#{@hostinfo_by_taskname.keys.inspect}"
389
+ end
382
390
  @hostinfo_by_taskname.empty?
391
+ else
392
+ false
393
+ end
383
394
  end
384
395
 
385
396
  def handle_failed_target(name)
@@ -427,16 +438,25 @@ module Pwrake
427
438
  @branch_setup_thread.join
428
439
  # continues running fibers
429
440
  Log.debug "Master#finish @selector.run begin"
430
- @selector.run(60)
441
+ begin
442
+ Timeout.timeout(30){@selector.run}
443
+ rescue
444
+ end
431
445
  Log.debug "Master#finish @selector.run end"
432
446
  if !@exited
433
447
  @exited = true
434
448
  Log.debug "Master#finish Handler.exit begin"
449
+ @selector.clear
435
450
  NBIO::Handler.exit(@hdl_set)
436
- @selector.run(60)
451
+ begin
452
+ Timeout.timeout(30) do
453
+ @selector.run
454
+ @thread.join if @thread
455
+ end
456
+ rescue
457
+ end
437
458
  Log.debug "Master#finish Handler.exit end"
438
459
  end
439
- TaskWrapper.close_task_logger
440
460
  Log.debug "Master#finish end"
441
461
  @failed
442
462
  end
@@ -31,21 +31,25 @@ module Pwrake
31
31
  top_level
32
32
  Log.debug "main: #{Time.now-t} sec"
33
33
  t = Time.now
34
+ @failed = @master.finish
35
+ Log.debug "finish: #{Time.now-t} sec"
36
+ rescue SystemExit => e
37
+ @failed = true
34
38
  rescue Exception => e
35
39
  # Exit with error message
36
40
  m = Log.bt(e)
37
41
  if @master.thread
38
42
  m += "\nIn branch thread #{@master.thread}:\n "
39
- m += @master.thread.backtrace.join("\n ")
43
+ if @master.thread.backtrace
44
+ m += @master.thread.backtrace.join("\n ")
45
+ end
40
46
  end
41
47
  Log.fatal m
42
48
  $stderr.puts m
43
- @master.signal_trap("INT")
44
- ensure
45
- @failed = @master.finish
46
- Log.debug "finish: #{Time.now-t} sec"
47
- Log.info "pwrake elapsed time: #{Time.now-START_TIME} sec"
49
+ @master.kill_end("INT")
50
+ @failed = true
48
51
  end
52
+ Log.info "pwrake elapsed time: #{Time.now-START_TIME} sec"
49
53
  Kernel.exit(false) if @failed
50
54
  end
51
55
  end
@@ -183,6 +187,7 @@ module Pwrake
183
187
  ],
184
188
  ['--clear-gfarm2fs',"[Pw] Clear gfarm2fs mountpoints left after failure.",
185
189
  lambda { |value|
190
+ require "pwrake/option/option_gfarm2fs"
186
191
  Option.new.clear_gfarm2fs
187
192
  exit
188
193
  }
data/lib/pwrake/nbio.rb CHANGED
@@ -39,6 +39,11 @@ module NBIO
39
39
  @reader.empty? && @writer.empty?
40
40
  end
41
41
 
42
+ def clear
43
+ @reader.clear
44
+ @writer.clear
45
+ end
46
+
42
47
  def halt
43
48
  @running = false
44
49
  @writer.each_value{|w| w.halt}
@@ -101,12 +106,22 @@ module NBIO
101
106
 
102
107
  def init_heartbeat
103
108
  t = Time.now
109
+ @hb_check_time = t
104
110
  @hb_time = {}
105
111
  @reader.each_key{|io| @hb_time[io] = t}
106
112
  end
107
113
 
108
114
  def check_heartbeat(ios,timeout)
109
115
  t = Time.now
116
+ if t - @hb_check_time < 3
117
+ if ios
118
+ ios.each do |io|
119
+ @hb_time[io] = t
120
+ end
121
+ end
122
+ return
123
+ end
124
+ @hb_check_time = t
110
125
  rds = @reader.dup
111
126
  if ios
112
127
  ios.each do |io|
@@ -119,7 +134,8 @@ module NBIO
119
134
  tdif = t - @hb_time[io]
120
135
  if tdif > timeout
121
136
  m = "Heartbeat Timeout: no response during #{tdif}s "+
122
- "> timeout #{timeout}s from host=#{get_host(io)}"
137
+ "> timeout #{timeout}s from host=#{get_host(io)} " +
138
+ "@hb_time[io=#{io.inspect}]=#{@hb_time[io].strftime('%FT%T.%6N')}"
123
139
  hdl.error(TimeoutError.new(m))
124
140
  end
125
141
  end
@@ -138,6 +154,7 @@ module NBIO
138
154
  @pool = []
139
155
  end
140
156
  attr_reader :io
157
+ attr_accessor :host
141
158
 
142
159
  # call from Selector
143
160
  def call
@@ -237,7 +254,7 @@ module NBIO
237
254
  @chunk_size = 8192
238
255
  end
239
256
  attr_reader :io, :waiter
240
- attr_accessor :check_timeout
257
+ attr_accessor :check_timeout, :host
241
258
 
242
259
  # call from Selector#run
243
260
  def call
@@ -455,6 +472,8 @@ module NBIO
455
472
  @writer = writer
456
473
  @reader = reader
457
474
  @host = hostname
475
+ @reader.host = @host
476
+ @writer.host = @host
458
477
  @exited = false
459
478
  end
460
479
  attr_reader :reader, :writer, :host
@@ -87,25 +87,20 @@ module Pwrake
87
87
  @continuous_fail
88
88
  end
89
89
 
90
- def accept_core(task_name, use_cores)
91
- if @reserved_task
92
- if @reserved_task == task_name
93
- if use_cores <= @idle_cores
94
- Log.info "use reserved: #{@name} for #{task_name} (#{use_cores} cores)"
95
- @reserved_task = nil
96
- return :ok
97
- end
98
- end
99
- else
100
- if use_cores <= @idle_cores
101
- return :ok
102
- elsif use_cores > 1
103
- @reserved_task = task_name
104
- Log.info "reserve host: #{@name} for #{task_name} (#{use_cores} cores)"
105
- return :reserve
106
- end
90
+ def check_cores(use_cores)
91
+ unless (1-@ncore..@ncore) === use_cores
92
+ m = "use_cores=#{use_cores} is invalid for @ncore=#{@ncore}"
93
+ Log.fatal m
94
+ raise RuntimeError,m
107
95
  end
108
- :busy
96
+ if use_cores < 1
97
+ use_cores += @ncore
98
+ end
99
+ use_cores
100
+ end
101
+
102
+ def accept_core(use_cores)
103
+ check_cores(use_cores) <= @idle_cores
109
104
  end
110
105
  end
111
106
 
@@ -37,7 +37,12 @@ module Pwrake
37
37
  if !kv.empty?
38
38
  kv.each_key do |id|
39
39
  t.assigned.push(id)
40
- @q[id].push(t)
40
+ q = @q[id]
41
+ if q
42
+ q.push(t)
43
+ else
44
+ Log.warn("@q[id]=#{q.inspect} : @q.keys=#{@q.keys.inspect} id=#{id.inspect}")
45
+ end
41
46
  end
42
47
  @size_q += 1
43
48
  else
@@ -116,10 +121,13 @@ module Pwrake
116
121
  end
117
122
  if max_num > 0
118
123
  max_info = @hostinfo_by_id[max_host]
119
- Log.debug "deq_steal max_host=#{max_info.name} max_num=#{max_num}"
124
+ #Log.debug "deq_steal max_host=#{max_info.name} max_num=#{max_num}"
120
125
  t = host_info.steal_phase{|h| deq_locate(max_info,h)}
121
126
  #Log.debug "deq_steal task=#{t.inspect}"
122
- return t if t
127
+ if t
128
+ Log.debug "deq_steal max_host=#{max_info.name} max_num=#{max_num}"
129
+ return t
130
+ end
123
131
  end
124
132
  end
125
133
  nil
@@ -152,13 +160,16 @@ module Pwrake
152
160
 
153
161
  def clear
154
162
  @q_no_action.clear
163
+ @q_reserved.clear
155
164
  @q.each{|h,q| q.clear}
165
+ @size_q = 0
156
166
  @q_remote.clear
157
167
  end
158
168
 
159
169
  def empty?
160
170
  @size_q == 0 &&
161
171
  @q_no_action.empty? &&
172
+ @q_reserved.empty? &&
162
173
  @q_remote.empty?
163
174
  end
164
175
 
@@ -8,6 +8,7 @@ module Pwrake
8
8
  def initialize(hostinfo_by_id, group_map=nil)
9
9
  @enable_steal = true
10
10
  @q_no_action = NoActionQueue.new
11
+ @q_reserved = Hash.new
11
12
 
12
13
  @hostinfo_by_id = hostinfo_by_id
13
14
 
@@ -84,22 +85,29 @@ module Pwrake
84
85
  count = 0
85
86
  @hostinfo_by_id.each_value do |host_info|
86
87
  #Log.debug "TaskQueue#deq_turn host_info=#{host_info.name}"
87
- if (n = host_info.idle_cores) && n > 0
88
- if turn_empty?(turn)
89
- return queued
88
+ if turn_empty?(turn)
89
+ return queued
90
+ elsif (n_idle = host_info.idle_cores) && n_idle > 0
91
+ if tw = @q_reserved[host_info]
92
+ n_use = tw.n_used_cores(host_info)
93
+ if n_idle < n_use
94
+ next
95
+ end
96
+ @q_reserved.delete(host_info)
97
+ Log.debug "deq_reserve: #{tw.name} n_use_cores=#{n_use}"
90
98
  elsif tw = deq_impl(host_info,turn)
91
- n_task_cores = tw.n_used_cores(host_info)
92
- Log.debug "deq: #{tw.name} n_task_cores=#{n_task_cores}"
93
- if host_info.idle_cores < n_task_cores
94
- m = "task.n_used_cores=#{n_task_cores} must be "+
95
- "<= host_info.idle_cores=#{host_info.idle_cores}"
96
- Log.fatal m
97
- raise RuntimeError,m
98
- else
99
- yield(tw,host_info,n_task_cores)
100
- count += 1
101
- queued += 1
99
+ n_use = tw.n_used_cores(host_info)
100
+ if n_idle < n_use
101
+ @q_reserved[host_info] = tw
102
+ Log.debug "reserve host: #{host_info.name} for #{tw.name} (#{n_use} cores)"
103
+ next
102
104
  end
105
+ Log.debug "deq: #{tw.name} n_use_cores=#{n_use}"
106
+ end
107
+ if tw
108
+ yield(tw,host_info,n_use)
109
+ count += 1
110
+ queued += 1
103
111
  end
104
112
  end
105
113
  end
@@ -120,12 +128,14 @@ module Pwrake
120
128
 
121
129
  def clear
122
130
  @q_no_action.clear
131
+ @q_reserved.clear
123
132
  @q_input.clear
124
133
  @q_no_input.clear
125
134
  end
126
135
 
127
136
  def empty?
128
137
  @q_no_action.empty? &&
138
+ @q_reserved.empty? &&
129
139
  @q_input.empty? &&
130
140
  @q_no_input.empty?
131
141
  end
@@ -59,11 +59,14 @@ EOL
59
59
 
60
60
  h = {}
61
61
  @elap_sum = 0
62
+ @elap_core_sum = 0
62
63
  @sh_table.each do |row|
63
64
  if host = row['host']
64
65
  h[host] = true
65
66
  end
66
- @elap_sum += row['elap_time'].to_f
67
+ t = row['elap_time'].to_f
68
+ @elap_sum += t
69
+ @elap_core_sum += t * row['ncore'].to_f
67
70
  end
68
71
  @hosts = h.keys.sort
69
72
  @start_time = Time.parse(@sh_table[0]["start_time"])
@@ -207,18 +210,18 @@ EOL
207
210
  html = HTML_HEAD + "<body><h1>Pwrake Statistics</h1>\n"
208
211
  html << "<h2>Workflow</h2>\n"
209
212
  html << "<table>\n"
210
- html << "<tr><th>log file</th><td>#{@base}</td><tr>\n"
213
+ html << "<tr><th>log directory</th><td>#{@base}</td><tr>\n"
211
214
  html << "<tr><th>ncore</th><td>#{@ncore}</td><tr>\n"
212
215
  html << "<tr><th>elapsed time</th><td>%.3f sec</td><tr>\n"%[@elap]
213
- html << "<tr><th>cumulative process time</th><td>%.3f sec</td><tr>\n"%[@elap_sum]
214
- html << "<tr><th>occupancy</th><td>%.3f %%</td><tr>\n"%[@elap_sum/@elap/@ncore*100]
216
+ html << "<tr><th>accumulated process time</th><td>%.3f sec</td><tr>\n"%[@elap_sum]
217
+ html << "<tr><th>occupancy</th><td>%.3f %%</td><tr>\n"%[@elap_core_sum/@elap/@ncore*100]
215
218
  html << "<tr><th>start time</th><td>#{@start_time}</td><tr>\n"
216
219
  html << "<tr><th>end time</th><td>#{@end_time}</td><tr>\n"
217
- html << "</table>\n"
220
+ html << "</table><br/>\n"
218
221
  html << "<table>\n"
219
- html << "<tr><th>hosts</th><tr>\n"
220
- @hosts.each do |h|
221
- html << "<tr><td>#{h}</td><tr>\n"
222
+ html << "<tr><th colspan=5>#{@hosts.size} hosts &times; #{@ncore.fdiv @hosts.size} cores/host</th><tr>\n"
223
+ @hosts.each_slice(5) do |a|
224
+ html << "<tr>"+a.map{|h|"<td>#{h}</td>"}.join("")+"<tr>\n"
222
225
  end
223
226
  html << "</table>\n"
224
227
  html << "<h2>Parallelism</h2>\n"
@@ -3,7 +3,7 @@ module Pwrake
3
3
  class TaskProperty
4
4
 
5
5
  attr_reader :ncore, :exclusive, :allow, :deny, :order_allow_deny,
6
- :retry, :disable_steal
6
+ :retry, :disable_steal, :reserve
7
7
  attr_accessor :subflow
8
8
 
9
9
  def parse_description(description)
@@ -18,6 +18,11 @@ module Pwrake
18
18
  @exclusive = true
19
19
  end
20
20
  end
21
+ if /\breserve[=:]\s*(\S+)/i =~ description
22
+ if /^(y|t)/i =~ $1
23
+ @reserve = true
24
+ end
25
+ end
21
26
  if /\ballow[=:]\s*(\S+)/i =~ description
22
27
  @allow = $1
23
28
  end
@@ -37,25 +42,24 @@ module Pwrake
37
42
  @disable_steal = true
38
43
  end
39
44
  end
45
+ @use_cores = nil
40
46
  end
41
47
 
42
48
  def merge(prop)
43
49
  @ncore = prop.ncore if prop.ncore
44
50
  @exclusive = prop.exclusive if prop.exclusive
51
+ @reserve = prop.reserve if prop.reserve
45
52
  @allow = prop.allow if prop.allow
46
53
  @deny = prop.deny if prop.deny
47
54
  @order_allow_deny = prop.order_allow_deny if prop.order_allow_deny
48
55
  @retry = prop.retry if prop.retry
49
56
  @disable_steal = prop.disable_steal if prop.disable_steal
50
57
  @subflow = prop.subflow if prop.subflow
58
+ @use_cores = nil
51
59
  end
52
60
 
53
- def use_cores(host_info)
54
- nc = (@exclusive) ? 0 : (@ncore || 1)
55
- if nc < 1
56
- nc += host_info.ncore
57
- end
58
- return nc
61
+ def use_cores
62
+ @use_cores ||= (@exclusive) ? 0 : (@ncore || 1)
59
63
  end
60
64
 
61
65
  def accept_host(host_info)
@@ -84,31 +88,17 @@ module Pwrake
84
88
  end
85
89
 
86
90
  def n_used_cores(host_info=nil)
87
- nc_node = host_info && host_info.ncore
88
- if @ncore.nil?
91
+ n = use_cores
92
+ if n == 1
89
93
  return 1
90
- elsif @ncore > 0
91
- if nc_node && @ncore > nc_node
92
- m = "ncore=#{@ncore} must be <= nc_node=#{nc_node}"
93
- Log.fatal m
94
- raise RuntimeError,m
95
- end
96
- return @ncore
97
- else
98
- if nc_node.nil?
99
- m = "host_info.ncore is not set"
100
- Log.fatal m
101
- raise RuntimeError,m
102
- end
103
- n = @ncore + nc_node
104
- if n > 0
105
- return n
106
- else
107
- m = "ncore+nc_node=#{n} must be > 0"
108
- Log.fatal m
109
- raise RuntimeError,m
110
- end
94
+ elsif host_info
95
+ return host_info.check_cores(n)
96
+ elsif n < 1
97
+ m = "invalid for use_cores=#{n}"
98
+ Log.fatal m
99
+ raise RuntimeError,m
111
100
  end
101
+ return n
112
102
  end
113
103
 
114
104
  end
@@ -343,20 +343,16 @@ module Pwrake
343
343
  end
344
344
 
345
345
  def acceptable_for(host_info)
346
+ unless host_info
347
+ return true
348
+ end
346
349
  unless @property.accept_host(host_info)
347
350
  return false
348
351
  end
349
- use_cores = @property.use_cores(host_info)
350
- if @reserved_host.nil? || @reserved_host == host_info
351
- case host_info.accept_core(name,use_cores)
352
- when :ok
353
- @reserved_host = nil
354
- return true
355
- when :reserve
356
- @reserved_host = host_info
357
- end
352
+ if @property.reserve
353
+ return true
358
354
  end
359
- false
355
+ host_info.accept_core(@property.use_cores)
360
356
  end
361
357
 
362
358
  def tried_host?(host_info)
@@ -1,3 +1,3 @@
1
1
  module Pwrake
2
- VERSION = "2.2.2"
2
+ VERSION = "2.2.3"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pwrake
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.2
4
+ version: 2.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masahiro TANAKA
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-14 00:00:00.000000000 Z
11
+ date: 2017-07-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parallel