zk 1.9.3 → 1.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/build.yml +55 -0
  3. data/.gitignore +1 -0
  4. data/Gemfile +18 -8
  5. data/README.markdown +9 -9
  6. data/RELEASES.markdown +28 -1
  7. data/lib/zk/client/base.rb +15 -0
  8. data/lib/zk/client/threaded.rb +3 -3
  9. data/lib/zk/client.rb +1 -1
  10. data/lib/zk/election.rb +1 -1
  11. data/lib/zk/event_handler.rb +16 -8
  12. data/lib/zk/event_handler_subscription/base.rb +1 -1
  13. data/lib/zk/fork_hook.rb +9 -4
  14. data/lib/zk/locker/locker_base.rb +14 -2
  15. data/lib/zk/locker/semaphore.rb +1 -3
  16. data/lib/zk/logger.rb +34 -0
  17. data/lib/zk/node_deletion_watcher.rb +4 -5
  18. data/lib/zk/pool.rb +12 -12
  19. data/lib/zk/subscription.rb +1 -1
  20. data/lib/zk/threaded_callback.rb +1 -1
  21. data/lib/zk/threadpool.rb +1 -1
  22. data/lib/zk/version.rb +1 -1
  23. data/lib/zk.rb +1 -5
  24. data/spec/event_catcher_spec.rb +1 -1
  25. data/spec/logging_progress_bar_formatter.rb +1 -1
  26. data/spec/message_queue_spec.rb +6 -6
  27. data/spec/shared/client_examples.rb +81 -81
  28. data/spec/shared/locker_examples.rb +13 -13
  29. data/spec/spec_helper.rb +12 -13
  30. data/spec/support/bogus_mongoid.rb +1 -1
  31. data/spec/support/client_forker.rb +1 -1
  32. data/spec/support/event_catcher.rb +1 -1
  33. data/spec/support/logging.rb +15 -47
  34. data/spec/zk/00_forked_client_integration_spec.rb +3 -3
  35. data/spec/zk/client/locking_and_session_death_spec.rb +2 -2
  36. data/spec/zk/client_spec.rb +19 -19
  37. data/spec/zk/election_spec.rb +44 -44
  38. data/spec/zk/extensions_spec.rb +2 -2
  39. data/spec/zk/locker/exclusive_locker_spec.rb +41 -41
  40. data/spec/zk/locker/locker_basic_spec.rb +55 -33
  41. data/spec/zk/locker/semaphore_spec.rb +39 -32
  42. data/spec/zk/locker/shared_exclusive_integration_spec.rb +37 -37
  43. data/spec/zk/locker/shared_locker_spec.rb +43 -43
  44. data/spec/zk/locker_spec.rb +2 -2
  45. data/spec/zk/module_spec.rb +25 -25
  46. data/spec/zk/mongoid_spec.rb +47 -47
  47. data/spec/zk/node_deletion_watcher_spec.rb +39 -31
  48. data/spec/zk/pool_spec.rb +56 -65
  49. data/spec/zk/threaded_callback_spec.rb +10 -10
  50. data/spec/zk/threadpool_spec.rb +25 -25
  51. data/spec/zk/watch_spec.rb +67 -79
  52. data/spec/zk/zookeeper_spec.rb +36 -30
  53. data/zk.gemspec +1 -2
  54. metadata +26 -47
  55. data/.travis.yml +0 -25
  56. data/lib/zk/logging.rb +0 -36
data/spec/zk/pool_spec.rb CHANGED
@@ -8,7 +8,7 @@ describe ZK::Pool do
8
8
  report_realtime('opening pool') do
9
9
  @pool_size = 2
10
10
  @connection_pool = ZK::Pool::Simple.new(connection_host, @pool_size, :watcher => :default)
11
- @connection_pool.should be_open
11
+ expect(@connection_pool).to be_open
12
12
  end
13
13
  end
14
14
 
@@ -22,7 +22,7 @@ describe ZK::Pool do
22
22
  unless th.join(5) == th
23
23
  logger.warn { "Forcing pool closed!" }
24
24
  @connection_pool.force_close!
25
- th.join(5).should == th
25
+ expect(th.join(5)).to eq(th)
26
26
  end
27
27
  end
28
28
  end
@@ -40,7 +40,7 @@ describe ZK::Pool do
40
40
  it "should allow you to execute commands on a connection" do
41
41
  @connection_pool.with_connection do |zk|
42
42
  zk.create("/test_pool", "", :mode => :ephemeral)
43
- zk.exists?("/test_pool").should be_true
43
+ expect(zk.exists?("/test_pool")).to be(true)
44
44
  end
45
45
  end
46
46
 
@@ -48,14 +48,12 @@ describe ZK::Pool do
48
48
  it %[should allow you to execute commands on the connection pool itself] do
49
49
  @connection_pool.create('/test_pool', '', :mode => :persistent)
50
50
  wait_until(2) { @connection_pool.exists?('/test_pool') }
51
- @connection_pool.exists?('/test_pool').should be_true
51
+ expect(@connection_pool.exists?('/test_pool')).to be(true)
52
52
  end
53
53
  end
54
54
 
55
55
  describe :close_all! do
56
56
  it %[should shutdown gracefully] do
57
- release_q = Queue.new
58
-
59
57
  latch = Latch.new
60
58
 
61
59
  @about_to_block = false
@@ -76,30 +74,30 @@ describe ZK::Pool do
76
74
  @cond.wait(@mutex) while @cnx.nil?
77
75
  end
78
76
 
79
- @cnx.should_not be_nil
77
+ expect(@cnx).not_to be_nil
80
78
 
81
79
  closing_th = Thread.new do
82
80
  @connection_pool.close_all!
83
81
  end
84
82
 
85
83
  wait_until(5) { @connection_pool.closing? }
86
- @connection_pool.should be_closing
84
+ expect(@connection_pool).to be_closing
87
85
  logger.debug { "connection pool is closing" }
88
86
 
89
- lambda { @connection_pool.with_connection { |c| c } }.should raise_error(ZK::Exceptions::PoolIsShuttingDownException)
87
+ expect { @connection_pool.with_connection { |c| c } }.to raise_error(ZK::Exceptions::PoolIsShuttingDownException)
90
88
 
91
89
  latch.release
92
90
 
93
- open_th.join(5).should == open_th
91
+ expect(open_th.join(5)).to eq(open_th)
94
92
 
95
93
  @connection_pool.wait_until_closed
96
94
 
97
- @connection_pool.should be_closed
95
+ expect(@connection_pool).to be_closed
98
96
 
99
- lambda do
100
- closing_th.join(1).should == closing_th
101
- open_th.join(1).should == open_th
102
- end.should_not raise_error
97
+ expect do
98
+ expect(closing_th.join(1)).to eq(closing_th)
99
+ expect(open_th.join(1)).to eq(open_th)
100
+ end.not_to raise_error
103
101
  end
104
102
  end
105
103
 
@@ -111,8 +109,8 @@ describe ZK::Pool do
111
109
  @cnx << @connection_pool.checkout
112
110
  end
113
111
 
114
- @cnx.length.should_not be_zero
115
-
112
+ expect(@cnx.length).not_to be_zero
113
+
116
114
  # this exc nonsense is because 1.8.7's scheduler is broken
117
115
  @exc = nil
118
116
 
@@ -131,8 +129,8 @@ describe ZK::Pool do
131
129
 
132
130
  @connection_pool.wait_until_closed
133
131
 
134
- th.join(5).should == th
135
- @exc.should be_kind_of(ZK::Exceptions::PoolIsShuttingDownException)
132
+ expect(th.join(5)).to eq(th)
133
+ expect(@exc).to be_kind_of(ZK::Exceptions::PoolIsShuttingDownException)
136
134
  end
137
135
  end
138
136
 
@@ -143,7 +141,7 @@ describe ZK::Pool do
143
141
 
144
142
  @connection_pool.with_connection do |zk|
145
143
  begin
146
- zk.delete(@path)
144
+ zk.delete(@path)
147
145
  rescue ZK::Exceptions::NoNode
148
146
  end
149
147
  end
@@ -152,63 +150,59 @@ describe ZK::Pool do
152
150
  zk.watcher.register(@path) do |event|
153
151
 
154
152
  @callback_called = true
155
- event.path.should == @path
153
+ expect(event.path).to eq(@path)
156
154
  end
157
155
 
158
- zk.exists?(@path, :watch => true).should be_false
156
+ expect(zk.exists?(@path, :watch => true)).to be(false)
159
157
  end
160
158
 
161
159
  @connection_pool.with_connection do |zk|
162
- zk.create(@path, "", :mode => :ephemeral).should == @path
160
+ expect(zk.create(@path, "", :mode => :ephemeral)).to eq(@path)
163
161
  end
164
162
 
165
163
  wait_until(1) { @callback_called }
166
164
 
167
- @callback_called.should be_true
165
+ expect(@callback_called).to be(true)
168
166
  end
169
167
 
170
168
  # These tests are seriously yucky, but they show that when a client is !connected?
171
169
  # the pool behaves properly and will not return that client to the caller.
172
-
170
+
173
171
  describe 'health checking with disconnected client', :rbx => :broken do
174
172
  before do
175
173
  wait_until(2) { @connection_pool.available_size == 2 }
176
- @connection_pool.available_size.should == 2
174
+ expect(@connection_pool.available_size).to eq(2)
177
175
 
178
176
  @connections = @connection_pool.connections
179
- @connections.length.should == 2
177
+ expect(@connections.length).to eq(2)
180
178
 
181
179
  @cnx1 = @connections.shift
182
180
 
183
- mock_sub = flexmock(:subscription)
181
+ mock_sub = double(:subscription)
184
182
 
185
- @mcnx1 = flexmock(@cnx1) do |m|
186
- m.should_receive(:connected?).at_least.once.and_return(false)
187
- m.should_receive(:on_connected).with(Proc).at_least.once.and_return(mock_sub)
188
- end
183
+ expect(@cnx1).to receive(:connected?).at_least(1).and_return(false)
184
+ expect(@cnx1).to receive(:on_connected).at_least(1).and_yield.and_return(mock_sub)
189
185
 
190
- @connections.unshift(@mcnx1)
186
+ @connections.unshift(@cnx1)
191
187
  end
192
188
 
193
189
  after do
194
- @connections.delete(@mcnx1)
195
- @connections.unshift(@cnx1)
196
190
  [@cnx1, @cnx2].each { |c| @connection_pool.checkin(c) }
197
191
  end
198
192
 
199
193
  it %[should remove the disconnected client from the pool] do
200
- @connection_pool.available_size.should == 2
194
+ expect(@connection_pool.available_size).to eq(2)
201
195
 
202
196
  @cnx2 = @connection_pool.checkout
203
-
197
+
204
198
  # this is gross and relies on knowing internal state
205
- @connection_pool.checkout(false).should be_false
199
+ expect(@connection_pool.checkout(false)).to be(false)
206
200
 
207
- @cnx2.should_not be_nil
208
- @cnx2.should_not == @mcnx1
201
+ expect(@cnx2).not_to be_nil
202
+ expect(@cnx2).not_to eq(@cnx1)
209
203
 
210
- @connection_pool.available_size.should == 0
211
- @connections.should include(@mcnx1)
204
+ expect(@connection_pool.available_size).to eq(0)
205
+ expect(@connections).to include(@cnx1)
212
206
  end
213
207
  end
214
208
  end # Simple
@@ -221,18 +215,18 @@ describe ZK::Pool do
221
215
  @max_clients = 2
222
216
  @timeout = 10
223
217
  @connection_pool = ZK::Pool::Bounded.new(connection_host, :min_clients => @min_clients, :max_clients => @max_clients, :timeout => @timeout)
224
- @connection_pool.should be_open
218
+ expect(@connection_pool).to be_open
225
219
  wait_until(2) { @connection_pool.available_size > 0 }
226
220
  end
227
221
 
228
222
  after do
229
223
  @connection_pool.force_close! unless @connection_pool.closed?
230
- @connection_pool.should be_closed
224
+ expect(@connection_pool).to be_closed
231
225
  end
232
226
 
233
227
  describe 'initial state' do
234
228
  it %[should have initialized the minimum number of clients] do
235
- @connection_pool.size.should == @min_clients
229
+ expect(@connection_pool.size).to eq(@min_clients)
236
230
  end
237
231
  end
238
232
 
@@ -248,41 +242,38 @@ describe ZK::Pool do
248
242
 
249
243
  it %[should grow if it can] do
250
244
  wait_until(2) { @connection_pool.available_size > 0 }
251
- @connection_pool.available_size.should > 0
245
+ expect(@connection_pool.available_size > 0).to be(true)
252
246
 
253
- @connection_pool.size.should == 1
247
+ expect(@connection_pool.size).to eq(1)
254
248
 
255
249
  logger.debug { "checking out @cnx1" }
256
250
  @cnx1 = @connection_pool.checkout
257
- @cnx1.should_not be_false
251
+ expect(@cnx1).not_to be(false)
258
252
 
259
- @connection_pool.can_grow_pool?.should be_true
253
+ expect(@connection_pool.can_grow_pool?).to be(true)
260
254
 
261
255
  logger.debug { "checking out @cnx2" }
262
256
  @cnx2 = @connection_pool.checkout
263
- @cnx2.should_not be_false
264
- @cnx2.should be_connected
257
+ expect(@cnx2).not_to be(false)
258
+ expect(@cnx2).to be_connected
265
259
 
266
- @cnx1.object_id.should_not == @cnx2.object_id
260
+ expect(@cnx1.object_id).not_to eq(@cnx2.object_id)
267
261
 
268
262
  [@cnx1, @cnx2].each { |c| @connection_pool.checkin(c) }
269
263
  end
270
264
 
271
265
  it %[should not grow past max_clients and block] do
272
- win_q = Queue.new
273
266
  lose_q = Queue.new
274
267
 
275
- threads = []
276
-
277
268
  @cnx1 = @connection_pool.checkout
278
- @cnx1.should_not be_false
269
+ expect(@cnx1).not_to be(false)
279
270
 
280
- @connection_pool.can_grow_pool?.should be_true
271
+ expect(@connection_pool.can_grow_pool?).to be(true)
281
272
 
282
273
  @cnx2 = @connection_pool.checkout
283
- @cnx2.should_not be_false
274
+ expect(@cnx2).not_to be(false)
284
275
 
285
- @connection_pool.can_grow_pool?.should be_false
276
+ expect(@connection_pool.can_grow_pool?).to be(false)
286
277
 
287
278
  logger.debug { "spawning losing thread" }
288
279
 
@@ -299,22 +290,22 @@ describe ZK::Pool do
299
290
  # logger.debug { "count waiters: #{@connection_pool.count_waiters}" }
300
291
  # @connection_pool.count_waiters.should == 1
301
292
 
302
- loser[:cnx].should be_nil
293
+ expect(loser[:cnx]).to be_nil
303
294
 
304
295
  [@cnx1, @cnx2].each { |c| @connection_pool.checkin(c) }
305
296
 
306
297
  loser.join_until(2) { loser[:cnx] }
307
- loser[:cnx].should_not be_nil
298
+ expect(loser[:cnx]).not_to be_nil
308
299
 
309
300
  lose_q.enq(:release)
310
301
 
311
- lambda { loser.join(2).should == loser }.should_not raise_error
302
+ expect { expect(loser.join(2)).to eq(loser) }.not_to raise_error
312
303
 
313
304
  logger.debug { "joined losing thread" }
314
305
 
315
- @connection_pool.count_waiters.should be_zero
316
- @connection_pool.available_size.should == 2
317
- @connection_pool.size.should == 2
306
+ expect(@connection_pool.count_waiters).to be_zero
307
+ expect(@connection_pool.available_size).to eq(2)
308
+ expect(@connection_pool.size).to eq(2)
318
309
  end
319
310
  end # should grow to max_clients
320
311
 
@@ -17,11 +17,11 @@ describe ZK::ThreadedCallback do
17
17
  end
18
18
 
19
19
  after do
20
- @tcb.shutdown.should be_true
20
+ expect(@tcb.shutdown).to be(true)
21
21
  end
22
22
 
23
23
  it %[should have started the thread] do
24
- @tcb.should be_alive
24
+ expect(@tcb).to be_alive
25
25
  end
26
26
 
27
27
  describe %[pausing for fork] do
@@ -31,19 +31,19 @@ describe ZK::ThreadedCallback do
31
31
  end
32
32
 
33
33
  it %[should stop the thread] do
34
- @tcb.should_not be_alive
34
+ expect(@tcb).not_to be_alive
35
35
  end
36
36
 
37
37
  it %[should allow calls] do
38
- lambda { @tcb.call(:a) }.should_not raise_error
38
+ expect { @tcb.call(:a) }.not_to raise_error
39
39
  end
40
40
  end
41
41
 
42
42
  describe %[when not running] do
43
43
  it %[should barf with InvalidStateError] do
44
- @tcb.shutdown.should be_true
45
- @tcb.should_not be_alive
46
- lambda { @tcb.pause_before_fork_in_parent }.should raise_error(ZK::Exceptions::InvalidStateError)
44
+ expect(@tcb.shutdown).to be(true)
45
+ expect(@tcb).not_to be_alive
46
+ expect { @tcb.pause_before_fork_in_parent }.to raise_error(ZK::Exceptions::InvalidStateError)
47
47
  end
48
48
  end
49
49
  end
@@ -52,7 +52,7 @@ describe ZK::ThreadedCallback do
52
52
  describe %[after pause] do
53
53
  before do
54
54
  @tcb.pause_before_fork_in_parent
55
- @tcb.should_not be_alive
55
+ expect(@tcb).not_to be_alive
56
56
  end
57
57
 
58
58
  it %[should deliver any calls on resume] do
@@ -65,13 +65,13 @@ describe ZK::ThreadedCallback do
65
65
 
66
66
  wait_until { @called.length >= 2 }
67
67
 
68
- @called.length.should >= 2
68
+ expect(@called.length).to be >= 2
69
69
  end
70
70
  end
71
71
 
72
72
  describe %[if not paused] do
73
73
  it %[should barf with InvalidStateError] do
74
- lambda { @tcb.resume_after_fork_in_parent }.should raise_error(ZK::Exceptions::InvalidStateError)
74
+ expect { @tcb.resume_after_fork_in_parent }.to raise_error(ZK::Exceptions::InvalidStateError)
75
75
  end
76
76
  end
77
77
  end
@@ -11,11 +11,11 @@ describe ZK::Threadpool do
11
11
 
12
12
  describe :new do
13
13
  it %[should be running] do
14
- @threadpool.should be_running
14
+ expect(@threadpool).to be_running
15
15
  end
16
16
 
17
17
  it %[should use the default size] do
18
- @threadpool.size.should == ZK::Threadpool.default_size
18
+ expect(@threadpool.size).to eq(ZK::Threadpool.default_size)
19
19
  end
20
20
  end
21
21
 
@@ -27,19 +27,19 @@ describe ZK::Threadpool do
27
27
 
28
28
  wait_until(2) { @th }
29
29
 
30
- @th.should_not == Thread.current
30
+ expect(@th).not_to eq(Thread.current)
31
31
  end
32
32
 
33
33
  it %[should barf if the argument is not callable] do
34
- bad_obj = flexmock(:not_callable)
35
- bad_obj.should_not respond_to(:call)
34
+ bad_obj = double(:not_callable)
35
+ expect(bad_obj).not_to respond_to(:call)
36
36
 
37
- lambda { @threadpool.defer(bad_obj) }.should raise_error(ArgumentError)
37
+ expect { @threadpool.defer(bad_obj) }.to raise_error(ArgumentError)
38
38
  end
39
39
 
40
40
  it %[should not barf if the threadpool is not running] do
41
41
  @threadpool.shutdown
42
- lambda { @threadpool.defer { "hai!" } }.should_not raise_error
42
+ expect { @threadpool.defer { "hai!" } }.not_to raise_error
43
43
  end
44
44
  end
45
45
 
@@ -48,42 +48,42 @@ describe ZK::Threadpool do
48
48
  @ary = []
49
49
 
50
50
  @threadpool.on_exception { |exc| @ary << exc }
51
-
51
+
52
52
  @threadpool.defer { raise "ZOMG!" }
53
53
 
54
54
  wait_while(2) { @ary.empty? }
55
55
 
56
- @ary.length.should == 1
56
+ expect(@ary.length).to eq(1)
57
57
 
58
58
  e = @ary.shift
59
59
 
60
- e.should be_kind_of(RuntimeError)
61
- e.message.should == 'ZOMG!'
60
+ expect(e).to be_kind_of(RuntimeError)
61
+ expect(e.message).to eq('ZOMG!')
62
62
  end
63
63
  end
64
64
 
65
65
  describe :shutdown do
66
66
  it %[should set running to false] do
67
67
  @threadpool.shutdown
68
- @threadpool.should_not be_running
68
+ expect(@threadpool).not_to be_running
69
69
  end
70
70
  end
71
71
 
72
72
  describe :start! do
73
73
  it %[should be able to start a threadpool that had previously been shutdown (reuse)] do
74
74
  @threadpool.shutdown
75
- @threadpool.start!.should be_true
75
+ expect(@threadpool.start!).to be(true)
76
76
 
77
- @threadpool.should be_running
77
+ expect(@threadpool).to be_running
78
78
 
79
79
  @rval = nil
80
80
 
81
- @threadpool.defer do
81
+ @threadpool.defer do
82
82
  @rval = true
83
83
  end
84
84
 
85
85
  wait_until(2) { @rval }
86
- @rval.should be_true
86
+ expect(@rval).to be(true)
87
87
  end
88
88
  end
89
89
 
@@ -93,24 +93,24 @@ describe ZK::Threadpool do
93
93
  @threadpool.defer { @a << @threadpool.on_threadpool? }
94
94
 
95
95
  wait_while(2) { @a.empty? }
96
- @a.should_not be_empty
96
+ expect(@a).not_to be_empty
97
97
 
98
- @a.first.should be_true
98
+ expect(@a.first).to be(true)
99
99
  end
100
100
  end
101
101
 
102
102
  describe :pause_before_fork_in_parent do
103
103
  it %[should stop all running threads] do
104
- @threadpool.should be_running
105
- @threadpool.should be_alive
104
+ expect(@threadpool).to be_running
105
+ expect(@threadpool).to be_alive
106
106
  @threadpool.pause_before_fork_in_parent
107
107
 
108
- @threadpool.should_not be_alive
108
+ expect(@threadpool).not_to be_alive
109
109
  end
110
110
 
111
111
  it %[should raise InvalidStateError if already paused] do
112
112
  @threadpool.pause_before_fork_in_parent
113
- lambda { @threadpool.pause_before_fork_in_parent }.should raise_error(ZK::Exceptions::InvalidStateError)
113
+ expect { @threadpool.pause_before_fork_in_parent }.to raise_error(ZK::Exceptions::InvalidStateError)
114
114
  end
115
115
  end
116
116
 
@@ -121,12 +121,12 @@ describe ZK::Threadpool do
121
121
 
122
122
  it %[should start all threads running again] do
123
123
  @threadpool.resume_after_fork_in_parent
124
- @threadpool.should be_alive
124
+ expect(@threadpool).to be_alive
125
125
  end
126
126
 
127
127
  it %[should raise InvalidStateError if not in paused state] do
128
128
  @threadpool.shutdown
129
- lambda { @threadpool.resume_after_fork_in_parent }.should raise_error(ZK::Exceptions::InvalidStateError)
129
+ expect { @threadpool.resume_after_fork_in_parent }.to raise_error(ZK::Exceptions::InvalidStateError)
130
130
  end
131
131
 
132
132
  it %[should run callbacks deferred while paused] do
@@ -147,7 +147,7 @@ describe ZK::Threadpool do
147
147
 
148
148
  latch.await(2)
149
149
 
150
- calls.should_not be_empty
150
+ expect(calls).not_to be_empty
151
151
  end
152
152
  end
153
153
  end