trident 0.4.2 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +7 -1
- data/CHANGELOG +5 -0
- data/Gemfile +1 -0
- data/README.md +10 -1
- data/lib/trident.rb +1 -0
- data/lib/trident/cli.rb +2 -2
- data/lib/trident/pool.rb +120 -27
- data/lib/trident/pool_handler.rb +1 -2
- data/lib/trident/pool_manager.rb +2 -2
- data/lib/trident/version.rb +1 -1
- data/lib/trident/worker.rb +33 -0
- data/test/fixtures/integration_project/config/trident.yml +5 -0
- data/test/integration/trident_test.rb +0 -6
- data/test/test_helper.rb +15 -46
- data/test/unit/trident/cli_test.rb +1 -1
- data/test/unit/trident/pool_manager_test.rb +2 -12
- data/test/unit/trident/pool_test.rb +289 -48
- data/test/unit/trident/worker_test.rb +52 -0
- data/trident.example.yml +4 -0
- data/trident.gemspec +1 -1
- metadata +27 -25
@@ -178,7 +178,7 @@ class Trident::CLITest < MiniTest::Should::TestCase
|
|
178
178
|
|
179
179
|
assert_equal 5, pools['pool1'].size
|
180
180
|
assert_equal @handlers['handler1'], pools['pool1'].handler
|
181
|
-
assert_equal({"foo" => "bar"}, pools['pool1'].options)
|
181
|
+
assert_equal({"options" => {"foo" => "bar"}, "handler" => "handler1"}, pools['pool1'].options)
|
182
182
|
end
|
183
183
|
|
184
184
|
should "filter pools if given" do
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require_relative '../../test_helper'
|
2
2
|
|
3
3
|
class Trident::PoolManagerTest < MiniTest::Should::TestCase
|
4
|
-
|
5
4
|
setup do
|
6
5
|
SignalHandler.stubs(:reset_for_fork)
|
7
6
|
|
@@ -27,12 +26,11 @@ class Trident::PoolManagerTest < MiniTest::Should::TestCase
|
|
27
26
|
signal_mappings = {'stop_forcefully' => 'KILL', 'stop_gracefully' => 'TERM'}
|
28
27
|
@handler1 = PoolHandler.new("foo", "TestPoolWorker", env, signal_mappings, {})
|
29
28
|
@handler2 = PoolHandler.new("bar", "TestPoolWorker", env, signal_mappings, {})
|
30
|
-
@pool1 = Pool.new("foo", @handler1, 2, 'sleep' => 0.1)
|
31
|
-
@pool2 = Pool.new("bar", @handler2, 3, 'sleep' => 0.1)
|
29
|
+
@pool1 = Pool.new("foo", @handler1, 'size' => 2, 'pids_dir' => Dir.mktmpdir, 'sleep' => 0.1)
|
30
|
+
@pool2 = Pool.new("bar", @handler2, 'size' => 3, 'pids_dir' => Dir.mktmpdir, 'sleep' => 0.1)
|
32
31
|
end
|
33
32
|
|
34
33
|
context "#start" do
|
35
|
-
|
36
34
|
should "start workers for each pool" do
|
37
35
|
manager = PoolManager.new("mymanager", [@pool1, @pool2], false)
|
38
36
|
manager.expects(:load_handlers).never
|
@@ -53,11 +51,9 @@ class Trident::PoolManagerTest < MiniTest::Should::TestCase
|
|
53
51
|
# once for each worker plus once for each handler
|
54
52
|
assert_equal 7, $counter.read
|
55
53
|
end
|
56
|
-
|
57
54
|
end
|
58
55
|
|
59
56
|
context "#stop" do
|
60
|
-
|
61
57
|
should "stop workers for each pool" do
|
62
58
|
manager = PoolManager.new("mymanager", [@pool1, @pool2], false)
|
63
59
|
manager.start
|
@@ -86,11 +82,9 @@ class Trident::PoolManagerTest < MiniTest::Should::TestCase
|
|
86
82
|
manager.expects(:stop).with("stop_gracefully")
|
87
83
|
manager.stop_gracefully
|
88
84
|
end
|
89
|
-
|
90
85
|
end
|
91
86
|
|
92
87
|
context "#wait" do
|
93
|
-
|
94
88
|
should "wait for processes to exit" do
|
95
89
|
manager = PoolManager.new("mymanager", [@pool1, @pool2], false)
|
96
90
|
manager.start
|
@@ -106,11 +100,9 @@ class Trident::PoolManagerTest < MiniTest::Should::TestCase
|
|
106
100
|
assert_empty @pool1.workers
|
107
101
|
assert_empty @pool2.workers
|
108
102
|
end
|
109
|
-
|
110
103
|
end
|
111
104
|
|
112
105
|
context "#update" do
|
113
|
-
|
114
106
|
should "update status of all pools" do
|
115
107
|
manager = PoolManager.new("mymanager", [@pool1, @pool2], false)
|
116
108
|
manager.start
|
@@ -125,7 +117,5 @@ class Trident::PoolManagerTest < MiniTest::Should::TestCase
|
|
125
117
|
refute_equal orig_pool1, @pool1.workers
|
126
118
|
refute_equal orig_pool2, @pool2.workers
|
127
119
|
end
|
128
|
-
|
129
120
|
end
|
130
|
-
|
131
121
|
end
|
@@ -1,6 +1,12 @@
|
|
1
1
|
require_relative '../../test_helper'
|
2
|
+
require 'pry'
|
2
3
|
|
3
4
|
class Trident::PoolTest < MiniTest::Should::TestCase
|
5
|
+
class DeadbeatPool < Pool
|
6
|
+
def stop
|
7
|
+
@size = 0
|
8
|
+
end
|
9
|
+
end
|
4
10
|
|
5
11
|
setup do
|
6
12
|
SignalHandler.stubs(:reset_for_fork)
|
@@ -15,6 +21,7 @@ class Trident::PoolTest < MiniTest::Should::TestCase
|
|
15
21
|
end
|
16
22
|
def start
|
17
23
|
sleep(@o['sleep']) if @o['sleep']
|
24
|
+
exit!(0)
|
18
25
|
end
|
19
26
|
end
|
20
27
|
EOS
|
@@ -23,56 +30,66 @@ class Trident::PoolTest < MiniTest::Should::TestCase
|
|
23
30
|
end
|
24
31
|
|
25
32
|
context "#spawn_worker" do
|
26
|
-
|
27
33
|
should "fork a worker" do
|
28
|
-
pool = Pool.new("foo", @handler, 1, 'sleep' => 0.1)
|
34
|
+
pool = Pool.new("foo", @handler, 'size' => 1, 'pids_dir' => Dir.mktmpdir, 'sleep' => 0.1)
|
29
35
|
assert_empty pool.workers
|
30
36
|
pool.send(:spawn_worker)
|
31
37
|
assert_equal 1, pool.workers.size
|
32
|
-
Process.waitpid(pool.workers.first)
|
38
|
+
Process.waitpid(pool.workers.first.pid)
|
33
39
|
assert $?.success?
|
34
40
|
end
|
35
|
-
|
36
41
|
end
|
37
42
|
|
38
43
|
context "#kill_worker" do
|
39
|
-
|
40
44
|
should "kill a worker" do
|
41
|
-
pool = Pool.new("foo", @handler, 1, 'sleep' => 1)
|
45
|
+
pool = Pool.new("foo", @handler, 'size' => 1, 'pids_dir' => Dir.mktmpdir, 'sleep' => 1)
|
42
46
|
pool.send(:spawn_worker)
|
43
|
-
|
47
|
+
worker = pool.workers.first
|
44
48
|
|
45
|
-
pool.send(:kill_worker,
|
46
|
-
Process.waitpid(pid)
|
49
|
+
pool.send(:kill_worker, worker, 'stop_forcefully')
|
50
|
+
Process.waitpid(worker.pid)
|
47
51
|
assert ! $?.success?
|
48
52
|
assert_empty pool.workers
|
49
53
|
end
|
50
54
|
|
51
55
|
should "kill a worker with specific signal" do
|
52
|
-
pool = Pool.new("foo", @handler, 1, 'sleep' => 1)
|
56
|
+
pool = Pool.new("foo", @handler, 'size' => 1, 'pids_dir' => Dir.mktmpdir, 'sleep' => 1)
|
53
57
|
pool.send(:spawn_worker)
|
54
|
-
|
58
|
+
worker = pool.workers.first
|
55
59
|
|
56
|
-
Process.expects(:kill).with("TERM", pid)
|
57
|
-
pool.send(:kill_worker,
|
60
|
+
Process.expects(:kill).with("TERM", worker.pid)
|
61
|
+
pool.send(:kill_worker, worker, 'stop_gracefully')
|
58
62
|
end
|
59
|
-
|
60
63
|
end
|
61
64
|
|
62
65
|
context "#spawn_workers" do
|
63
|
-
|
64
66
|
should "start multiple workers" do
|
65
|
-
pool = Pool.new("foo", @handler, 4, 'sleep' => 1)
|
67
|
+
pool = Pool.new("foo", @handler, 'size' => 4, 'pids_dir' => Dir.mktmpdir, 'sleep' => 1)
|
66
68
|
pool.send(:spawn_workers, 4)
|
67
69
|
assert_equal 4, pool.workers.size
|
68
70
|
end
|
69
71
|
|
72
|
+
context "forked process" do
|
73
|
+
should "clean up its pid file when complete" do
|
74
|
+
pool = Pool.new("foo", @handler, 'size' => 4, 'pids_dir' => Dir.mktmpdir, 'sleep' => 1)
|
75
|
+
pool.send(:spawn_workers, 1)
|
76
|
+
|
77
|
+
assert_equal 1, pool.workers.size
|
78
|
+
|
79
|
+
worker = pool.workers.first
|
80
|
+
assert File.exists?(File.join(pool.orphans_dir, "#{worker.pid}.pid"))
|
81
|
+
|
82
|
+
pool.send(:kill_worker, worker, 'stop_gracefully')
|
83
|
+
Process.waitpid(worker.pid)
|
84
|
+
|
85
|
+
refute File.exists?(File.join(pool.orphans_dir, "#{worker.pid}.pid"))
|
86
|
+
end
|
87
|
+
end
|
70
88
|
end
|
71
89
|
|
72
90
|
context "#kill_workers" do
|
73
|
-
|
74
91
|
should "kill multiple workers, most recent first" do
|
75
|
-
pool = Pool.new("foo", @handler, 4, 'sleep' => 1)
|
92
|
+
pool = Pool.new("foo", @handler, 'size' => 4, 'pids_dir' => Dir.mktmpdir, 'sleep' => 1)
|
76
93
|
pool.send(:spawn_workers, 4)
|
77
94
|
orig_workers = pool.workers.dup
|
78
95
|
assert_equal 4, orig_workers.size
|
@@ -81,13 +98,11 @@ class Trident::PoolTest < MiniTest::Should::TestCase
|
|
81
98
|
assert_equal 1, pool.workers.size
|
82
99
|
assert_equal orig_workers.first, pool.workers.first
|
83
100
|
end
|
84
|
-
|
85
101
|
end
|
86
102
|
|
87
103
|
context "#cleanup_dead_workers" do
|
88
|
-
|
89
104
|
should "stop tracking workers that have died" do
|
90
|
-
pool = Pool.new("foo", @handler, 4, 'sleep' => 0)
|
105
|
+
pool = Pool.new("foo", @handler, 'size' => 4, 'pids_dir' => Dir.mktmpdir, 'sleep' => 0)
|
91
106
|
pool.send(:spawn_workers, 4)
|
92
107
|
|
93
108
|
sleep 0.1
|
@@ -97,7 +112,7 @@ class Trident::PoolTest < MiniTest::Should::TestCase
|
|
97
112
|
end
|
98
113
|
|
99
114
|
should "block waiting for workers that have died when blocking" do
|
100
|
-
pool = Pool.new("foo", @handler, 1, 'sleep' => 0.2)
|
115
|
+
pool = Pool.new("foo", @handler, 'size' => 1, 'pids_dir' => Dir.mktmpdir, 'sleep' => 0.2)
|
101
116
|
pool.send(:spawn_workers, 1)
|
102
117
|
assert_equal 1, pool.workers.size
|
103
118
|
|
@@ -109,7 +124,7 @@ class Trident::PoolTest < MiniTest::Should::TestCase
|
|
109
124
|
end
|
110
125
|
|
111
126
|
should "not block waiting for workers that have died when not-blocking" do
|
112
|
-
pool = Pool.new("foo", @handler, 1, 'sleep' => 0.1)
|
127
|
+
pool = Pool.new("foo", @handler, 'size' => 1, 'pids_dir' => Dir.mktmpdir, 'sleep' => 0.1)
|
113
128
|
pool.send(:spawn_workers, 1)
|
114
129
|
assert_equal 1, pool.workers.size
|
115
130
|
|
@@ -118,7 +133,7 @@ class Trident::PoolTest < MiniTest::Should::TestCase
|
|
118
133
|
end
|
119
134
|
|
120
135
|
should "cleanup workers that have died even if already waited on" do
|
121
|
-
pool = Pool.new("foo", @handler, 4, 'sleep' => 0)
|
136
|
+
pool = Pool.new("foo", @handler, 'size' => 4, 'pids_dir' => Dir.mktmpdir, 'sleep' => 0)
|
122
137
|
pool.send(:spawn_workers, 4)
|
123
138
|
|
124
139
|
# Calling process.wait on a pid that was already waited on throws a ECHLD
|
@@ -128,14 +143,11 @@ class Trident::PoolTest < MiniTest::Should::TestCase
|
|
128
143
|
|
129
144
|
assert_equal 0, pool.workers.size
|
130
145
|
end
|
131
|
-
|
132
|
-
|
133
146
|
end
|
134
147
|
|
135
148
|
context "#maintain_worker_count" do
|
136
|
-
|
137
149
|
should "spawn workers when count is low" do
|
138
|
-
pool = Pool.new("foo", @handler, 2, 'sleep' => 0.1)
|
150
|
+
pool = Pool.new("foo", @handler, 'size' => 2, 'pids_dir' => Dir.mktmpdir, 'sleep' => 0.1)
|
139
151
|
assert_empty pool.workers
|
140
152
|
|
141
153
|
pool.send(:maintain_worker_count, 'stop_gracefully')
|
@@ -143,7 +155,7 @@ class Trident::PoolTest < MiniTest::Should::TestCase
|
|
143
155
|
end
|
144
156
|
|
145
157
|
should "kill workers when count is high" do
|
146
|
-
pool = Pool.new("foo", @handler, 2, 'sleep' => 0.1)
|
158
|
+
pool = Pool.new("foo", @handler, 'size' => 2, 'pids_dir' => Dir.mktmpdir, 'sleep' => 0.1)
|
147
159
|
pool.send(:spawn_workers, 4)
|
148
160
|
assert_equal 4, pool.workers.size
|
149
161
|
|
@@ -152,23 +164,58 @@ class Trident::PoolTest < MiniTest::Should::TestCase
|
|
152
164
|
end
|
153
165
|
|
154
166
|
should "kill workers with given action when count is high" do
|
155
|
-
pool = Pool.new("foo", @handler, 2, 'sleep' => 0.1)
|
167
|
+
pool = Pool.new("foo", @handler, 'size' => 2, 'pids_dir' => Dir.mktmpdir, 'sleep' => 0.1)
|
156
168
|
pool.send(:spawn_workers, 4)
|
157
169
|
assert_equal 4, pool.workers.size
|
158
170
|
|
159
|
-
Process.expects(:kill).with("KILL", pool.workers.to_a[-1])
|
160
|
-
Process.expects(:kill).with("KILL", pool.workers.to_a[-2])
|
171
|
+
Process.expects(:kill).with("KILL", pool.workers.to_a[-1].pid)
|
172
|
+
Process.expects(:kill).with("KILL", pool.workers.to_a[-2].pid)
|
161
173
|
pool.send(:maintain_worker_count, 'stop_forcefully')
|
162
174
|
|
163
175
|
pool.send(:spawn_workers, 2)
|
164
|
-
Process.expects(:kill).with("TERM", pool.workers.to_a[-1])
|
165
|
-
Process.expects(:kill).with("TERM", pool.workers.to_a[-2])
|
176
|
+
Process.expects(:kill).with("TERM", pool.workers.to_a[-1].pid)
|
177
|
+
Process.expects(:kill).with("TERM", pool.workers.to_a[-2].pid)
|
178
|
+
|
179
|
+
pool.send(:maintain_worker_count, 'stop_gracefully')
|
180
|
+
end
|
181
|
+
|
182
|
+
should "do nothing when orphan count is high and no workers are present" do
|
183
|
+
dir = Dir.mktmpdir
|
184
|
+
pool = DeadbeatPool.new("foo", @handler, 'size' => 4, 'pids_dir' => dir, 'sleep' => 0.1)
|
185
|
+
pool.start
|
186
|
+
pool.stop
|
187
|
+
|
188
|
+
pool = Pool.new("foo", @handler, 'size' => 2, 'pids_dir' => dir, 'sleep' => 0.1)
|
189
|
+
pool.send(:maintain_worker_count, 'stop_gracefully')
|
190
|
+
|
191
|
+
assert_equal 0, pool.workers.size
|
192
|
+
assert_equal 4, pool.orphans.size
|
193
|
+
end
|
194
|
+
|
195
|
+
should "kill workers when orphan count is high and workers are present" do
|
196
|
+
dir = Dir.mktmpdir
|
197
|
+
pool = DeadbeatPool.new("foo", @handler, 'size' => 4, 'pids_dir' => dir, 'sleep' => 0.1)
|
198
|
+
pool.start
|
199
|
+
pool.stop
|
200
|
+
|
201
|
+
new_pool = Pool.new("foo", @handler, 'size' => 2, 'pids_dir' => dir, 'sleep' => 0.1)
|
202
|
+
assert_equal 4, new_pool.orphans.size
|
203
|
+
|
204
|
+
new_pool.send(:spawn_workers, 4)
|
205
|
+
assert_equal 4, pool.workers.size
|
206
|
+
|
166
207
|
pool.send(:maintain_worker_count, 'stop_gracefully')
|
208
|
+
|
209
|
+
pool.workers.each do |worker|
|
210
|
+
Process.waitpid(worker.pid)
|
211
|
+
end
|
212
|
+
|
213
|
+
assert_equal 0, pool.workers.size
|
167
214
|
end
|
168
215
|
|
169
216
|
should "do nothing when count is correct" do
|
170
217
|
Process.expects(:kill).never
|
171
|
-
pool = Pool.new("foo", @handler, 2, 'sleep' => 0.1)
|
218
|
+
pool = Pool.new("foo", @handler, 'size' => 2, 'pids_dir' => Dir.mktmpdir, 'sleep' => 0.1)
|
172
219
|
pool.send(:spawn_workers, 2)
|
173
220
|
orig_workers = pool.workers.dup
|
174
221
|
assert_equal 2, orig_workers.size
|
@@ -177,57 +224,251 @@ class Trident::PoolTest < MiniTest::Should::TestCase
|
|
177
224
|
assert_equal 2, pool.workers.size
|
178
225
|
assert_equal orig_workers, pool.workers
|
179
226
|
end
|
180
|
-
|
181
227
|
end
|
182
228
|
|
183
229
|
context "#start" do
|
184
|
-
|
185
230
|
should "start up the workers" do
|
186
|
-
pool = Pool.new("foo", @handler, 2, 'sleep' => 0.1)
|
231
|
+
pool = Pool.new("foo", @handler, 'size' => 2, 'pids_dir' => Dir.mktmpdir, 'sleep' => 0.1)
|
187
232
|
pool.start
|
188
233
|
assert_equal 2, pool.workers.size
|
189
234
|
end
|
190
|
-
|
191
235
|
end
|
192
236
|
|
193
237
|
context "#stop" do
|
194
|
-
|
195
238
|
should "stop the workers" do
|
196
|
-
pool = Pool.new("foo", @handler, 2, 'sleep' => 0.1)
|
239
|
+
pool = Pool.new("foo", @handler, 'size' => 2, 'pids_dir' => Dir.mktmpdir, 'sleep' => 0.1)
|
197
240
|
pool.start
|
198
241
|
assert_equal 2, pool.workers.size
|
199
242
|
pool.stop
|
200
243
|
assert_empty pool.workers
|
201
244
|
end
|
202
|
-
|
203
245
|
end
|
204
246
|
|
205
247
|
context "#wait" do
|
206
|
-
|
207
248
|
should "block till all workers complete" do
|
208
|
-
pool = Pool.new("foo", @handler, 2, 'sleep' => 0.1)
|
249
|
+
pool = Pool.new("foo", @handler, 'size' => 2, 'pids_dir' => Dir.mktmpdir, 'sleep' => 0.1)
|
209
250
|
pool.start
|
210
251
|
assert_equal 2, pool.workers.size
|
211
252
|
pool.wait
|
212
253
|
assert_empty pool.workers
|
213
254
|
end
|
214
|
-
|
215
255
|
end
|
216
256
|
|
217
257
|
context "#update" do
|
218
|
-
|
219
258
|
should "update monitored workers" do
|
220
|
-
pool = Pool.new("foo", @handler, 2, 'sleep' => 0.2)
|
259
|
+
pool = Pool.new("foo", @handler, 'size' => 2, 'pids_dir' => Dir.mktmpdir, 'sleep' => 0.2)
|
221
260
|
pool.start
|
222
261
|
orig_workers = pool.workers.dup
|
223
262
|
assert_equal 2, orig_workers.size
|
224
|
-
Process.kill("KILL", orig_workers.first)
|
263
|
+
Process.kill("KILL", orig_workers.first.pid)
|
225
264
|
sleep(0.1)
|
226
265
|
assert_equal orig_workers, pool.workers
|
227
266
|
pool.update
|
228
267
|
refute_equal orig_workers, pool.workers
|
229
268
|
end
|
269
|
+
end
|
270
|
+
|
271
|
+
context "#load_orphans" do
|
272
|
+
should "load orphaned workers from the pool's pid directory" do
|
273
|
+
dir = Dir.mktmpdir
|
274
|
+
pool = DeadbeatPool.new("foo", @handler, 'size' => 1, 'pids_dir' => dir, 'sleep' => 0.1)
|
275
|
+
pool.start
|
276
|
+
pid = pool.workers.first.pid
|
277
|
+
pool.stop
|
278
|
+
|
279
|
+
new_pool = Pool.new("foo", @handler, 'size' => 1, 'pids_dir' => dir, 'sleep' => 0.1)
|
280
|
+
assert_equal 1, new_pool.orphans.size
|
281
|
+
assert_equal pid, new_pool.orphans.first.pid
|
282
|
+
end
|
283
|
+
|
284
|
+
should "not load dead orphan workers" do
|
285
|
+
tmp = Dir.mktmpdir
|
286
|
+
File.open(File.join(tmp, "99999.pid"), 'w') do |f|
|
287
|
+
f << '99999'
|
288
|
+
end
|
230
289
|
|
290
|
+
pool = Pool.new("foo", @handler, 'pids_dir' => tmp , 'size' => 2, 'sleep' => 0.1)
|
291
|
+
assert 0, pool.orphans.size
|
292
|
+
end
|
231
293
|
end
|
232
294
|
|
295
|
+
context "#cleanup_orphaned_workers" do
|
296
|
+
should "remove any orphaned workers that throw Errno::ESRCH (does not exist)" do
|
297
|
+
dir = Dir.mktmpdir
|
298
|
+
pool = DeadbeatPool.new("foo", @handler, 'size' => 1, 'pids_dir' => dir, 'sleep' => 0.1)
|
299
|
+
pool.send(:spawn_worker)
|
300
|
+
assert_equal 1, pool.workers.size
|
301
|
+
|
302
|
+
pid = pool.workers.first.pid
|
303
|
+
|
304
|
+
pool.stop
|
305
|
+
|
306
|
+
Process.kill(9, pid)
|
307
|
+
Process.waitpid(pid)
|
308
|
+
|
309
|
+
pool = Pool.new("foo", @handler, 'size' => 1, 'pids_dir' => dir, 'sleep' => 0.1)
|
310
|
+
|
311
|
+
assert_equal 1, pool.orphans.size
|
312
|
+
|
313
|
+
pool.send(:cleanup_orphaned_workers)
|
314
|
+
|
315
|
+
assert_equal 0, pool.orphans.size
|
316
|
+
end
|
317
|
+
|
318
|
+
should "remove any orphaned workers that throw Errno::EPERM (permission error)" do
|
319
|
+
dir = Dir.mktmpdir
|
320
|
+
pool = DeadbeatPool.new("foo", @handler, 'size' => 1, 'pids_dir' => dir, 'sleep' => 0.1)
|
321
|
+
pool.send(:spawn_worker)
|
322
|
+
assert_equal 1, pool.workers.size
|
323
|
+
|
324
|
+
pid = pool.workers.first.pid
|
325
|
+
|
326
|
+
pool.stop
|
327
|
+
|
328
|
+
Process.kill(9, pid)
|
329
|
+
Process.waitpid(pid)
|
330
|
+
|
331
|
+
pool = Pool.new("foo", @handler, 'size' => 1, 'pids_dir' => dir, 'sleep' => 0.1)
|
332
|
+
|
333
|
+
assert_equal 1, pool.orphans.size
|
334
|
+
|
335
|
+
Process.expects(:kill).once.with(0, pid).raises(Errno::EPERM)
|
336
|
+
|
337
|
+
pool.send(:cleanup_orphaned_workers)
|
338
|
+
|
339
|
+
assert_equal 0, pool.orphans.size
|
340
|
+
end
|
341
|
+
end
|
342
|
+
|
343
|
+
context "above_threshold?" do
|
344
|
+
should "return true if total_workers_count is above the threshold" do
|
345
|
+
pool = Pool.new("foo", @handler, 'size' => 0, 'pids_dir' => Dir.mktmpdir, 'sleep' => 0.1)
|
346
|
+
|
347
|
+
pool.send(:spawn_worker)
|
348
|
+
assert_equal 1, pool.workers.size
|
349
|
+
|
350
|
+
# cleanup spawned worker
|
351
|
+
# in case assertion fails.
|
352
|
+
pid = pool.workers.first.pid
|
353
|
+
Process.kill(9, pid)
|
354
|
+
Process.waitpid(pid)
|
355
|
+
|
356
|
+
assert pool.above_threshold?
|
357
|
+
end
|
358
|
+
|
359
|
+
should "return false if total_workers_count is equal to the threshold" do
|
360
|
+
pool = Pool.new("foo", @handler, 'size' => 1, 'pids_dir' => Dir.mktmpdir, 'sleep' => 0.1)
|
361
|
+
|
362
|
+
pool.send(:spawn_worker)
|
363
|
+
assert_equal 1, pool.workers.size
|
364
|
+
|
365
|
+
# cleanup spawned worker
|
366
|
+
# in case assertion fails.
|
367
|
+
pid = pool.workers.first.pid
|
368
|
+
Process.kill(9, pid)
|
369
|
+
Process.waitpid(pid)
|
370
|
+
|
371
|
+
refute pool.above_threshold?
|
372
|
+
end
|
373
|
+
|
374
|
+
should "return false if total_workers_count is below the threshold" do
|
375
|
+
pool = Pool.new("foo", @handler, 'size' => 2, 'pids_dir' => Dir.mktmpdir, 'sleep' => 0.1)
|
376
|
+
|
377
|
+
pool.send(:spawn_worker)
|
378
|
+
assert_equal 1, pool.workers.size
|
379
|
+
|
380
|
+
# cleanup spawned worker
|
381
|
+
# in case assertion fails.
|
382
|
+
pid = pool.workers.first.pid
|
383
|
+
Process.kill(9, pid)
|
384
|
+
Process.waitpid(pid)
|
385
|
+
|
386
|
+
refute pool.above_threshold?
|
387
|
+
end
|
388
|
+
end
|
389
|
+
|
390
|
+
context "at_threshold?" do
|
391
|
+
should "return false if total_workers_count is above the threshold" do
|
392
|
+
pool = Pool.new("foo", @handler, 'size' => 0, 'pids_dir' => Dir.mktmpdir, 'sleep' => 0.1)
|
393
|
+
|
394
|
+
pool.send(:spawn_worker)
|
395
|
+
assert_equal 1, pool.workers.size
|
396
|
+
|
397
|
+
# cleanup spawned worker
|
398
|
+
# in case assertion fails.
|
399
|
+
pid = pool.workers.first.pid
|
400
|
+
Process.kill(9, pid)
|
401
|
+
Process.waitpid(pid)
|
402
|
+
|
403
|
+
refute pool.at_threshold?
|
404
|
+
end
|
405
|
+
|
406
|
+
should "return true if total_workers_count is equal to the threshold" do
|
407
|
+
pool = Pool.new("foo", @handler, 'size' => 1, 'pids_dir' => Dir.mktmpdir, 'sleep' => 0.1)
|
408
|
+
|
409
|
+
pool.send(:spawn_worker)
|
410
|
+
assert_equal 1, pool.workers.size
|
411
|
+
|
412
|
+
# cleanup spawned worker
|
413
|
+
# in case assertion fails.
|
414
|
+
pid = pool.workers.first.pid
|
415
|
+
Process.kill(9, pid)
|
416
|
+
Process.waitpid(pid)
|
417
|
+
|
418
|
+
assert pool.at_threshold?
|
419
|
+
end
|
420
|
+
|
421
|
+
should "return false if total_workers_count is below the threshold" do
|
422
|
+
pool = Pool.new("foo", @handler, 'size' => 2, 'pids_dir' => Dir.mktmpdir, 'sleep' => 0.1)
|
423
|
+
|
424
|
+
pool.send(:spawn_worker)
|
425
|
+
assert_equal 1, pool.workers.size
|
426
|
+
|
427
|
+
# cleanup spawned worker
|
428
|
+
# in case assertion fails.
|
429
|
+
pid = pool.workers.first.pid
|
430
|
+
Process.kill(9, pid)
|
431
|
+
Process.waitpid(pid)
|
432
|
+
|
433
|
+
refute pool.at_threshold?
|
434
|
+
end
|
435
|
+
end
|
436
|
+
|
437
|
+
context "has_workers?" do
|
438
|
+
should "return false if there are no workers" do
|
439
|
+
pool = Pool.new("foo", @handler, 'size' => 2, 'pids_dir' => Dir.mktmpdir, 'sleep' => 0.1)
|
440
|
+
refute pool.has_workers?
|
441
|
+
end
|
442
|
+
|
443
|
+
should "return true if there are workers" do
|
444
|
+
pool = Pool.new("foo", @handler, 'size' => 2, 'pids_dir' => Dir.mktmpdir, 'sleep' => 0.1)
|
445
|
+
refute pool.has_workers?
|
446
|
+
|
447
|
+
pool.send(:spawn_worker)
|
448
|
+
|
449
|
+
# cleanup spawned worker
|
450
|
+
# in case assertion fails.
|
451
|
+
pid = pool.workers.first.pid
|
452
|
+
Process.kill(9, pid)
|
453
|
+
Process.waitpid(pid)
|
454
|
+
|
455
|
+
assert pool.has_workers?
|
456
|
+
end
|
457
|
+
end
|
458
|
+
|
459
|
+
context "total_workers_count" do
|
460
|
+
should "return the sum of orphans.size + workers.size" do
|
461
|
+
pool = Pool.new("foo", @handler, 'size' => 2, 'pids_dir' => Dir.mktmpdir, 'sleep' => 0.1)
|
462
|
+
assert_equal 0, pool.total_workers_count
|
463
|
+
|
464
|
+
pool.orphans << Worker.new(1, pool)
|
465
|
+
pool.orphans << Worker.new(2, pool)
|
466
|
+
pool.orphans << Worker.new(3, pool)
|
467
|
+
pool.workers << Worker.new(4, pool)
|
468
|
+
pool.workers << Worker.new(5, pool)
|
469
|
+
pool.workers << Worker.new(6, pool)
|
470
|
+
|
471
|
+
assert_equal 6, pool.total_workers_count
|
472
|
+
end
|
473
|
+
end
|
233
474
|
end
|