zk 0.6.5 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), %w[spec_helper])
1
+ require 'spec_helper'
2
2
 
3
3
  require 'tracer'
4
4
 
@@ -57,33 +57,32 @@ describe ZK::Pool do
57
57
  @about_to_block = false
58
58
 
59
59
  open_th = Thread.new do
60
- @connection_pool.with_connection do |cnx|
61
- @about_to_block = true
62
- # wait for signal to release our connection
63
- release_q.pop
64
- end
60
+ @cnx = @connection_pool.checkout(true)
61
+ @about_to_block = true
62
+ # wait for signal to release our connection
63
+ release_q.pop
65
64
  end
66
65
 
67
- wait_until(2) { @about_to_block }
66
+ wait_until(5) { @about_to_block }
68
67
  @about_to_block.should be_true
69
68
 
70
- release_q.num_waiting.should == 1
71
-
72
69
  closing_th = Thread.new do
73
70
  @connection_pool.close_all!
74
71
  end
75
72
 
76
- wait_until(2) { @connection_pool.closing? }
73
+ wait_until(5) { @connection_pool.closing? }
77
74
  @connection_pool.should be_closing
75
+ logger.debug { "connection pool is closing" }
78
76
 
79
77
  lambda { @connection_pool.with_connection { |c| } }.should raise_error(ZK::Exceptions::PoolIsShuttingDownException)
80
78
 
81
79
  release_q << :ok_let_go
82
80
 
83
- open_th.join(2).should == open_th
81
+ open_th.join(5).should == open_th
82
+
83
+ wait_until(5) { @connection_pool.closed? }
84
+ # $stderr.puts "@connection_pool.pool_state: #{@connection_pool.pool_state.inspect}"
84
85
 
85
- wait_until(2) { @connection_pool.closed? }
86
- $stderr.puts "@connection_pool.pool_state: #{@connection_pool.pool_state.inspect}"
87
86
  @connection_pool.should be_closed
88
87
 
89
88
  lambda do
@@ -107,8 +106,8 @@ describe ZK::Pool do
107
106
  @connection_pool.checkout(true)
108
107
  end
109
108
 
110
- th.join_until { @connection_pool.count_waiters > 0 }
111
- @connection_pool.count_waiters.should > 0
109
+ # th.join_until { @connection_pool.count_waiters > 0 }
110
+ # @connection_pool.count_waiters.should > 0
112
111
 
113
112
  @connection_pool.force_close!
114
113
 
@@ -126,21 +125,21 @@ describe ZK::Pool do
126
125
  end
127
126
 
128
127
  @connection_pool.with_connection do |zk|
129
- $stderr.puts "registering callback"
128
+ # $stderr.puts "registering callback"
130
129
  zk.watcher.register(@path) do |event|
131
- $stderr.puts "callback fired! event: #{event.inspect}"
130
+ # $stderr.puts "callback fired! event: #{event.inspect}"
132
131
 
133
132
  @callback_called = true
134
133
  event.path.should == @path
135
- $stderr.puts "signaling other waiters"
134
+ # $stderr.puts "signaling other waiters"
136
135
  end
137
136
 
138
- $stderr.puts "setting up watcher"
137
+ # $stderr.puts "setting up watcher"
139
138
  zk.exists?(@path, :watch => true).should be_false
140
139
  end
141
140
 
142
141
  @connection_pool.with_connection do |zk|
143
- $stderr.puts "creating path"
142
+ # $stderr.puts "creating path"
144
143
  zk.create(@path, "", :mode => :ephemeral).should == @path
145
144
  end
146
145
 
@@ -148,7 +147,53 @@ describe ZK::Pool do
148
147
 
149
148
  @callback_called.should be_true
150
149
  end
151
- end # Client
150
+
151
+ # These tests are seriously yucky, but they show that when a client is !connected?
152
+ # the pool behaves properly and will not return that client to the caller.
153
+
154
+ describe 'health checking with disconnected client' do
155
+ before do
156
+ wait_until(2) { @connection_pool.available_size == 2 }
157
+ @connection_pool.available_size.should == 2
158
+
159
+ @connections = @connection_pool.connections
160
+ @connections.length.should == 2
161
+
162
+ @cnx1 = @connections.shift
163
+
164
+ mock_sub = flexmock(:subscription)
165
+
166
+ @mcnx1 = flexmock(@cnx1) do |m|
167
+ m.should_receive(:connected?).at_least.once.and_return(false)
168
+ m.should_receive(:on_connected).with(Proc).at_least.once.and_return(mock_sub)
169
+ end
170
+
171
+ @connections.unshift(@mcnx1)
172
+ end
173
+
174
+ after do
175
+ @connections.delete(@mcnx1)
176
+ @connections.unshift(@cnx1)
177
+ [@cnx1, @cnx2].each { |c| @connection_pool.checkin(c) }
178
+ end
179
+
180
+ it %[should remove the disconnected client from the pool] do
181
+ @connection_pool.available_size.should == 2
182
+
183
+ @cnx2 = @connection_pool.checkout
184
+
185
+ # this is gross and relies on knowing internal state
186
+ @connection_pool.checkout(false).should be_false
187
+
188
+ @cnx2.should_not be_nil
189
+ @cnx2.should_not == @mcnx1
190
+
191
+ @connection_pool.available_size.should == 0
192
+ @connections.should include(@mcnx1)
193
+ end
194
+ end
195
+
196
+ end # Simple
152
197
 
153
198
  describe :Bounded do
154
199
  before do
@@ -156,6 +201,7 @@ describe ZK::Pool do
156
201
  @max_clients = 2
157
202
  @connection_pool = ZK::Pool::Bounded.new("localhost:#{ZK_TEST_PORT}", :min_clients => @min_clients, :max_clients => @max_clients, :timeout => @timeout)
158
203
  @connection_pool.should be_open
204
+ wait_until(2) { @connection_pool.available_size > 0 }
159
205
  end
160
206
 
161
207
  after do
@@ -180,44 +226,25 @@ describe ZK::Pool do
180
226
  # end
181
227
 
182
228
  it %[should grow if it can] do
183
- q1 = Queue.new
229
+ wait_until(2) { @connection_pool.available_size > 0 }
230
+ @connection_pool.available_size.should > 0
184
231
 
185
232
  @connection_pool.size.should == 1
186
233
 
187
- th1 = Thread.new do
188
- @connection_pool.with_connection do |cnx|
189
- Thread.current[:cnx] = cnx
190
- q1.pop # block here
191
- end
192
- end
234
+ logger.debug { "checking out @cnx1" }
235
+ @cnx1 = @connection_pool.checkout
236
+ @cnx1.should_not be_false
193
237
 
194
- th1.join_until(2) { th1[:cnx] }
195
- th1[:cnx].should_not be_nil
238
+ @connection_pool.can_grow_pool?.should be_true
196
239
 
197
- th2 = Thread.new do
198
- @connection_pool.with_connection do |cnx|
199
- Thread.current[:cnx] = cnx
200
- q1.pop
201
- end
202
- end
203
-
204
- th2.join_until(2) { th2[:cnx] }
240
+ logger.debug { "checking out @cnx2" }
241
+ @cnx2 = @connection_pool.checkout
242
+ @cnx2.should_not be_false
243
+ @cnx2.should be_connected
205
244
 
206
- th2[:cnx].should_not be_nil
207
- th2[:cnx].should be_connected
245
+ @cnx1.object_id.should_not == @cnx2.object_id
208
246
 
209
- @connection_pool.size.should == 2
210
- @connection_pool.available_size.should be_zero
211
-
212
- 2.times { q1.enq(:release_cnx) }
213
-
214
- lambda do
215
- th1.join(1).should == th1
216
- th2.join(1).should == th2
217
- end.should_not raise_error
218
-
219
- @connection_pool.size.should == 2
220
- @connection_pool.available_size.should == 2
247
+ [@cnx1, @cnx2].each { |c| @connection_pool.checkin(c) }
221
248
  end
222
249
 
223
250
  it %[should not grow past max_clients and block] do
@@ -226,104 +253,49 @@ describe ZK::Pool do
226
253
 
227
254
  threads = []
228
255
 
229
- 2.times do
230
- threads << Thread.new do
231
- @connection_pool.with_connection do |cnx|
232
- Thread.current[:cnx] = cnx
233
- win_q.pop
234
- end
235
- end
236
- end
256
+ @cnx1 = @connection_pool.checkout
257
+ @cnx1.should_not be_false
258
+
259
+ @connection_pool.can_grow_pool?.should be_true
260
+
261
+ @cnx2 = @connection_pool.checkout
262
+ @cnx2.should_not be_false
237
263
 
238
- wait_until(2) { threads.all? { |th| th[:cnx] } }
239
- threads.each { |th| th[:cnx].should_not be_nil }
264
+ @connection_pool.can_grow_pool?.should be_false
265
+
266
+ logger.debug { "spawning losing thread" }
240
267
 
241
268
  loser = Thread.new do
242
269
  @connection_pool.with_connection do |cnx|
243
270
  Thread.current[:cnx] = cnx
271
+ logger.debug { "Losing thread got connection" }
244
272
  lose_q.pop
245
273
  end
274
+ logger.debug { "losing thread exiting" }
246
275
  end
247
276
 
248
- wait_until(2) { @connection_pool.count_waiters > 0 }
249
- @connection_pool.count_waiters.should == 1
277
+ # loser.join_until(5) { @connection_pool.count_waiters > 0 }
278
+ # logger.debug { "count waiters: #{@connection_pool.count_waiters}" }
279
+ # @connection_pool.count_waiters.should == 1
250
280
 
251
281
  loser[:cnx].should be_nil
252
282
 
253
- 2.times { win_q.enq(:release) }
254
-
255
- lambda { threads.each { |th| th.join(2).should == th } }.should_not raise_error
283
+ [@cnx1, @cnx2].each { |c| @connection_pool.checkin(c) }
256
284
 
257
285
  loser.join_until(2) { loser[:cnx] }
258
-
259
286
  loser[:cnx].should_not be_nil
260
287
 
261
288
  lose_q.enq(:release)
262
289
 
263
290
  lambda { loser.join(2).should == loser }.should_not raise_error
264
291
 
292
+ logger.debug { "joined losing thread" }
293
+
265
294
  @connection_pool.count_waiters.should be_zero
266
295
  @connection_pool.available_size.should == 2
267
296
  @connection_pool.size.should == 2
268
297
  end
269
- end
270
-
271
- describe 'health checking' do
272
- before do
273
- @connections = @connection_pool.connections
274
- @connections.length.should == 1
275
-
276
- @cnx1 = @connections.first
277
- end
278
-
279
- describe 'disconnected client' do
280
- before do
281
- flexmock(@cnx1) do |m|
282
- m.should_receive(:connected?).and_return(false)
283
- end
284
-
285
- @cnx2 = nil
286
-
287
- th = Thread.new do
288
- @connection_pool.with_connection do |cnx|
289
- @cnx2 = cnx
290
- end
291
- end
298
+ end # should grow to max_clients
292
299
 
293
- th.join_while { @cnx2.nil? }
294
- end
295
-
296
- it %[should create a new client and return it] do
297
- @cnx2.should_not be_nil
298
- @cnx2.should_not == @cnx1
299
- end
300
-
301
- it %[should remove the disconnected client from the pool] do
302
- @connection_pool.available_size.should == 1
303
- end
304
-
305
- it %[should still have the original client in its array of all connections] do
306
- @connections.should include(@cnx1)
307
- end
308
-
309
- describe 'when connected event fires' do
310
- before do
311
- @event = flexmock(:event) do |m|
312
- m.should_receive(:type).and_return(-1)
313
- m.should_receive(:zk=).with(any())
314
- m.should_receive(:node_event?).and_return(false)
315
- m.should_receive(:state_event?).and_return(true)
316
- m.should_receive(:state).and_return(ZookeeperConstants::ZOO_CONNECTED_STATE)
317
- end
318
-
319
- @cnx1.watcher.process(@event)
320
- end
321
-
322
- it %[should add the connection back into the pool] do
323
- @connection_pool.available_size.should == 2
324
- end
325
- end
326
- end
327
- end
328
300
  end
329
301
  end
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), %w[spec_helper])
1
+ require 'spec_helper'
2
2
 
3
3
  describe ZK::Threadpool do
4
4
 
@@ -55,13 +55,16 @@ describe ZK::Threadpool do
55
55
  describe :start! do
56
56
  it %[should be able to start a threadpool that had previously been shutdown (reuse)] do
57
57
  @threadpool.shutdown
58
- @threadpool.start!
58
+ @threadpool.start!.should be_true
59
59
 
60
60
  @threadpool.should be_running
61
61
 
62
62
  @rval = nil
63
63
 
64
- @threadpool.defer { @rval = true }
64
+ @threadpool.defer do
65
+ @rval = true
66
+ end
67
+
65
68
  wait_until(2) { @rval }
66
69
  @rval.should be_true
67
70
  end
data/zk.gemspec CHANGED
@@ -16,6 +16,7 @@ Gem::Specification.new do |s|
16
16
  s.add_development_dependency 'rspec', '~> 2.4.0'
17
17
  s.add_development_dependency 'wirble'
18
18
  s.add_development_dependency 'flexmock', '~> 0.8.10'
19
+ s.add_development_dependency 'ZenTest', '~> 4.5.0'
19
20
 
20
21
  s.files = `git ls-files`.split("\n")
21
22
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zk
3
3
  version: !ruby/object:Gem::Version
4
- hash: 13
4
+ hash: 1
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 6
9
- - 5
10
- version: 0.6.5
8
+ - 7
9
+ - 1
10
+ version: 0.7.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jonathan D. Simms
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2011-05-24 00:00:00 +00:00
19
+ date: 2011-06-08 00:00:00 +00:00
20
20
  default_executable:
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
@@ -81,6 +81,22 @@ dependencies:
81
81
  version: 0.8.10
82
82
  type: :development
83
83
  version_requirements: *id004
84
+ - !ruby/object:Gem::Dependency
85
+ name: ZenTest
86
+ prerelease: false
87
+ requirement: &id005 !ruby/object:Gem::Requirement
88
+ none: false
89
+ requirements:
90
+ - - ~>
91
+ - !ruby/object:Gem::Version
92
+ hash: 43
93
+ segments:
94
+ - 4
95
+ - 5
96
+ - 0
97
+ version: 4.5.0
98
+ type: :development
99
+ version_requirements: *id005
84
100
  description: A high-level wrapper around the zookeeper driver
85
101
  email:
86
102
  - simms@hp.com
@@ -92,12 +108,19 @@ extensions: []
92
108
  extra_rdoc_files: []
93
109
 
94
110
  files:
111
+ - .dotfiles/rspec-logging
95
112
  - .gitignore
113
+ - .yardopts
96
114
  - Gemfile
97
115
  - LICENSE
116
+ - README.markdown
98
117
  - Rakefile
99
118
  - lib/z_k.rb
100
119
  - lib/z_k/client.rb
120
+ - lib/z_k/client/base.rb
121
+ - lib/z_k/client/conveniences.rb
122
+ - lib/z_k/client/state_mixin.rb
123
+ - lib/z_k/client/unixisms.rb
101
124
  - lib/z_k/election.rb
102
125
  - lib/z_k/event_handler.rb
103
126
  - lib/z_k/event_handler_subscription.rb
@@ -112,19 +135,20 @@ files:
112
135
  - lib/z_k/threadpool.rb
113
136
  - lib/z_k/version.rb
114
137
  - lib/zk.rb
115
- - spec/client_pool_spec.rb
116
- - spec/client_spec.rb
117
- - spec/election_spec.rb
118
- - spec/locker_spec.rb
119
138
  - spec/log4j.properties
120
139
  - spec/message_queue_spec.rb
121
- - spec/mongoid_spec.rb
122
140
  - spec/spec_helper.rb
123
141
  - spec/support/bogus_mongoid.rb
142
+ - spec/support/logging_progress_bar_formatter.rb
124
143
  - spec/support/queuey_thread.rb
125
144
  - spec/test_file.txt
126
- - spec/threadpool_spec.rb
127
145
  - spec/watch_spec.rb
146
+ - spec/z_k/client_spec.rb
147
+ - spec/z_k/election_spec.rb
148
+ - spec/z_k/locker_spec.rb
149
+ - spec/z_k/mongoid_spec.rb
150
+ - spec/z_k/pool_spec.rb
151
+ - spec/z_k/threadpool_spec.rb
128
152
  - spec/zookeeper_spec.rb
129
153
  - zk.gemspec
130
154
  has_rdoc: true
@@ -161,18 +185,5 @@ rubygems_version: 1.6.2
161
185
  signing_key:
162
186
  specification_version: 3
163
187
  summary: A high-level wrapper around the zookeeper driver
164
- test_files:
165
- - spec/client_pool_spec.rb
166
- - spec/client_spec.rb
167
- - spec/election_spec.rb
168
- - spec/locker_spec.rb
169
- - spec/log4j.properties
170
- - spec/message_queue_spec.rb
171
- - spec/mongoid_spec.rb
172
- - spec/spec_helper.rb
173
- - spec/support/bogus_mongoid.rb
174
- - spec/support/queuey_thread.rb
175
- - spec/test_file.txt
176
- - spec/threadpool_spec.rb
177
- - spec/watch_spec.rb
178
- - spec/zookeeper_spec.rb
188
+ test_files: []
189
+