mongo 2.7.2 → 2.8.0.rc0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +1 -3
  4. data/lib/mongo/address.rb +17 -20
  5. data/lib/mongo/address/ipv4.rb +6 -3
  6. data/lib/mongo/address/ipv6.rb +6 -3
  7. data/lib/mongo/address/unix.rb +5 -2
  8. data/lib/mongo/auth.rb +15 -2
  9. data/lib/mongo/auth/cr/conversation.rb +4 -2
  10. data/lib/mongo/auth/ldap/conversation.rb +4 -2
  11. data/lib/mongo/auth/scram.rb +3 -7
  12. data/lib/mongo/auth/scram/conversation.rb +28 -19
  13. data/lib/mongo/auth/user.rb +45 -10
  14. data/lib/mongo/auth/x509/conversation.rb +4 -2
  15. data/lib/mongo/cluster.rb +9 -17
  16. data/lib/mongo/error.rb +2 -0
  17. data/lib/mongo/error/missing_password.rb +29 -0
  18. data/lib/mongo/error/operation_failure.rb +7 -3
  19. data/lib/mongo/error/parser.rb +2 -1
  20. data/lib/mongo/error/sdam_error_detection.rb +54 -0
  21. data/lib/mongo/operation/aggregate/command.rb +1 -16
  22. data/lib/mongo/operation/aggregate/op_msg.rb +1 -1
  23. data/lib/mongo/operation/collections_info.rb +2 -3
  24. data/lib/mongo/operation/delete/command.rb +2 -15
  25. data/lib/mongo/operation/delete/legacy.rb +1 -16
  26. data/lib/mongo/operation/explain/command.rb +1 -16
  27. data/lib/mongo/operation/explain/legacy.rb +1 -16
  28. data/lib/mongo/operation/find/command.rb +1 -16
  29. data/lib/mongo/operation/find/legacy.rb +1 -16
  30. data/lib/mongo/operation/get_more/command.rb +1 -16
  31. data/lib/mongo/operation/indexes/command.rb +1 -16
  32. data/lib/mongo/operation/indexes/legacy.rb +4 -16
  33. data/lib/mongo/operation/list_collections/command.rb +1 -16
  34. data/lib/mongo/operation/map_reduce/command.rb +1 -16
  35. data/lib/mongo/operation/parallel_scan/command.rb +1 -16
  36. data/lib/mongo/operation/result.rb +3 -0
  37. data/lib/mongo/operation/shared/executable.rb +4 -0
  38. data/lib/mongo/operation/shared/polymorphic_lookup.rb +1 -1
  39. data/lib/mongo/operation/shared/polymorphic_result.rb +8 -1
  40. data/lib/mongo/operation/shared/result/aggregatable.rb +0 -5
  41. data/lib/mongo/operation/update/command.rb +2 -15
  42. data/lib/mongo/operation/update/legacy.rb +1 -16
  43. data/lib/mongo/operation/users_info/command.rb +1 -16
  44. data/lib/mongo/retryable.rb +22 -10
  45. data/lib/mongo/server.rb +10 -1
  46. data/lib/mongo/server/app_metadata.rb +7 -2
  47. data/lib/mongo/server/connectable.rb +0 -6
  48. data/lib/mongo/server/connection.rb +86 -135
  49. data/lib/mongo/server/connection_base.rb +133 -0
  50. data/lib/mongo/server/connection_pool.rb +11 -24
  51. data/lib/mongo/server/connection_pool/queue.rb +41 -41
  52. data/lib/mongo/server/description.rb +1 -1
  53. data/lib/mongo/server/monitor.rb +4 -4
  54. data/lib/mongo/server/monitor/connection.rb +26 -7
  55. data/lib/mongo/server/pending_connection.rb +36 -0
  56. data/lib/mongo/server_selector/selectable.rb +9 -1
  57. data/lib/mongo/session.rb +0 -1
  58. data/lib/mongo/socket.rb +23 -6
  59. data/lib/mongo/socket/ssl.rb +11 -18
  60. data/lib/mongo/socket/tcp.rb +13 -14
  61. data/lib/mongo/socket/unix.rb +9 -27
  62. data/lib/mongo/uri.rb +1 -1
  63. data/lib/mongo/version.rb +1 -1
  64. data/spec/integration/auth_spec.rb +160 -0
  65. data/spec/integration/retryable_writes_spec.rb +55 -58
  66. data/spec/integration/sdam_error_handling_spec.rb +115 -0
  67. data/spec/mongo/address/ipv4_spec.rb +4 -0
  68. data/spec/mongo/address/ipv6_spec.rb +4 -0
  69. data/spec/mongo/auth/scram/conversation_spec.rb +6 -5
  70. data/spec/mongo/auth/scram/negotiation_spec.rb +25 -36
  71. data/spec/mongo/auth/scram_spec.rb +2 -2
  72. data/spec/mongo/auth/user_spec.rb +97 -0
  73. data/spec/mongo/client_construction_spec.rb +1 -1
  74. data/spec/mongo/error/operation_failure_spec.rb +125 -1
  75. data/spec/mongo/retryable_spec.rb +17 -8
  76. data/spec/mongo/server/connection_pool/queue_spec.rb +24 -10
  77. data/spec/mongo/server/connection_pool_spec.rb +30 -117
  78. data/spec/mongo/server/connection_spec.rb +147 -25
  79. data/spec/mongo/server/description_spec.rb +0 -14
  80. data/spec/mongo/server/monitor/connection_spec.rb +22 -0
  81. data/spec/mongo/server_selector_spec.rb +1 -0
  82. data/spec/mongo/server_spec.rb +6 -6
  83. data/spec/mongo/socket/ssl_spec.rb +48 -116
  84. data/spec/mongo/socket/tcp_spec.rb +22 -0
  85. data/spec/mongo/socket/unix_spec.rb +9 -9
  86. data/spec/mongo/socket_spec.rb +15 -3
  87. data/spec/spec_tests/server_selection_spec.rb +2 -0
  88. data/spec/support/client_registry.rb +8 -2
  89. data/spec/support/common_shortcuts.rb +20 -1
  90. data/spec/support/constraints.rb +10 -2
  91. data/spec/support/lite_constraints.rb +8 -0
  92. data/spec/support/spec_config.rb +9 -1
  93. metadata +14 -4
  94. metadata.gz.sig +0 -0
@@ -203,7 +203,7 @@ describe Mongo::Client do
203
203
  it 'does not use compression for authentication messages' do
204
204
  expect(Mongo::Protocol::Compressed).not_to receive(:new)
205
205
  client.cluster.next_primary.send(:with_connection) do |conn|
206
- conn.send(:authenticate!)
206
+ conn.send(:authenticate!, conn)
207
207
  end
208
208
  end
209
209
  end
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require 'lite_spec_helper'
2
2
 
3
3
  describe Mongo::Error::OperationFailure do
4
4
 
@@ -219,4 +219,128 @@ describe Mongo::Error::OperationFailure do
219
219
  end
220
220
  end
221
221
  end
222
+
223
+ describe '#not_master?' do
224
+ [10107, 13435].each do |code|
225
+ context "error code #{code}" do
226
+ subject do
227
+ described_class.new("thingy (#{code})", nil,
228
+ :code => code, :code_name => 'thingy')
229
+ end
230
+
231
+ it 'is true' do
232
+ expect(subject.not_master?).to be true
233
+ end
234
+ end
235
+ end
236
+
237
+ # node is recovering error codes
238
+ [11600, 11602, 13436, 189, 91].each do |code|
239
+ context "error code #{code}" do
240
+ subject do
241
+ described_class.new("thingy (#{code})", nil,
242
+ :code => code, :code_name => 'thingy')
243
+ end
244
+
245
+ it 'is false' do
246
+ expect(subject.not_master?).to be false
247
+ end
248
+ end
249
+ end
250
+
251
+ context 'another error code' do
252
+ subject do
253
+ described_class.new('some error (123)', nil,
254
+ :code => 123, :code_name => 'SomeError')
255
+ end
256
+
257
+ it 'is false' do
258
+ expect(subject.not_master?).to be false
259
+ end
260
+ end
261
+
262
+ context 'not master in message with different code' do
263
+ subject do
264
+ described_class.new('not master (999)', nil,
265
+ :code => 999, :code_name => nil)
266
+ end
267
+
268
+ it 'is true' do
269
+ expect(subject.not_master?).to be true
270
+ end
271
+ end
272
+
273
+ context 'not master or secondary text' do
274
+ subject do
275
+ described_class.new('not master or secondary (999)', nil,
276
+ :code => 999, :code_name => nil)
277
+ end
278
+
279
+ it 'is false' do
280
+ expect(subject.not_master?).to be false
281
+ end
282
+ end
283
+ end
284
+
285
+ describe '#node_recovering?' do
286
+ [11600, 11602, 13436, 189, 91].each do |code|
287
+ context "error code #{code}" do
288
+ subject do
289
+ described_class.new("thingy (#{code})", nil,
290
+ :code => code, :code_name => 'thingy')
291
+ end
292
+
293
+ it 'is true' do
294
+ expect(subject.node_recovering?).to be true
295
+ end
296
+ end
297
+ end
298
+
299
+ # not master error codes
300
+ [10107, 13435].each do |code|
301
+ context "error code #{code}" do
302
+ subject do
303
+ described_class.new("thingy (#{code})", nil,
304
+ :code => code, :code_name => 'thingy')
305
+ end
306
+
307
+ it 'is false' do
308
+ expect(subject.node_recovering?).to be false
309
+ end
310
+ end
311
+ end
312
+
313
+ context 'another error code' do
314
+ subject do
315
+ described_class.new('some error (123)', nil,
316
+ :code => 123, :code_name => 'SomeError')
317
+ end
318
+
319
+ it 'is false' do
320
+ expect(subject.node_recovering?).to be false
321
+ end
322
+ end
323
+
324
+ context 'node is recovering in message with different code' do
325
+ subject do
326
+ described_class.new('node is recovering (999)', nil,
327
+ :code => 999, :code_name => nil)
328
+ end
329
+
330
+ it 'is true' do
331
+ expect(subject.node_recovering?).to be true
332
+ end
333
+ end
334
+
335
+ context 'not master or secondary text' do
336
+ subject do
337
+ described_class.new('not master or secondary (999)', nil,
338
+ :code => 999, :code_name => nil)
339
+ end
340
+
341
+ it 'is true' do
342
+ expect(subject.node_recovering?).to be true
343
+ end
344
+ end
345
+ end
222
346
  end
@@ -79,12 +79,14 @@ describe Mongo::Retryable do
79
79
  double('operation')
80
80
  end
81
81
 
82
+ let(:server) { double('server') }
83
+
82
84
  let(:cluster) do
83
- double('cluster', next_primary: server_selector)
85
+ double('cluster', next_primary: server)
84
86
  end
85
87
 
86
88
  let(:server_selector) do
87
- double('server_selector', select_server: double('server'))
89
+ double('server_selector', select_server: server)
88
90
  end
89
91
 
90
92
  let(:retryable) do
@@ -418,7 +420,7 @@ describe Mongo::Retryable do
418
420
  # Quick sanity check that the expected code path is being exercised
419
421
  expect(retryable.retry_write_allowed_as_configured?).to be true
420
422
 
421
- allow(server_selector).to receive(:retry_writes?).and_return(true)
423
+ allow(server).to receive(:retry_writes?).and_return(true)
422
424
  allow(cluster).to receive(:scan!)
423
425
  end
424
426
 
@@ -442,9 +444,9 @@ describe Mongo::Retryable do
442
444
  context 'when a not master error occurs' do
443
445
 
444
446
  before do
447
+ server = cluster.next_primary
445
448
  expect(operation).to receive(:execute).and_raise(
446
449
  Mongo::Error::OperationFailure.new('not master')).ordered
447
- expect(cluster).to receive(:scan!).and_return(true).ordered
448
450
  expect(operation).to receive(:execute).and_return(true).ordered
449
451
  end
450
452
 
@@ -454,9 +456,9 @@ describe Mongo::Retryable do
454
456
  context 'when a node is recovering error occurs' do
455
457
 
456
458
  before do
459
+ server = cluster.next_primary
457
460
  expect(operation).to receive(:execute).and_raise(
458
461
  Mongo::Error::OperationFailure.new('node is recovering')).ordered
459
- expect(cluster).to receive(:scan!).and_return(true).ordered
460
462
  expect(operation).to receive(:execute).and_return(true).ordered
461
463
  end
462
464
 
@@ -466,10 +468,10 @@ describe Mongo::Retryable do
466
468
  context 'when a retryable error occurs with a code' do
467
469
 
468
470
  before do
471
+ server = cluster.next_primary
469
472
  expect(operation).to receive(:execute).and_raise(
470
473
  Mongo::Error::OperationFailure.new('message missing', nil,
471
474
  :code => 91, :code_name => 'ShutdownInProgress')).ordered
472
- expect(cluster).to receive(:scan!).and_return(true).ordered
473
475
  expect(operation).to receive(:execute).and_return(true).ordered
474
476
  end
475
477
 
@@ -494,7 +496,10 @@ describe Mongo::Retryable do
494
496
  before do
495
497
  expect(operation).to receive(:execute).and_raise(
496
498
  Mongo::Error::SocketError.new('socket error')).ordered
497
- expect(cluster).to receive(:scan!).and_return(true).ordered
499
+ # This is where the server would be marked unknown, but since
500
+ # we are not tracking which server the operation was sent to,
501
+ # we are not able to assert this.
502
+ # There is no explicit cluster scan requested.
498
503
  expect(operation).to receive(:execute).and_return(true).ordered
499
504
  end
500
505
 
@@ -506,7 +511,11 @@ describe Mongo::Retryable do
506
511
  before do
507
512
  expect(operation).to receive(:execute).and_raise(
508
513
  Mongo::Error::SocketTimeoutError.new('socket timeout')).ordered
509
- expect(cluster).to receive(:scan!).and_return(true).ordered
514
+ # This is where the server would be marked unknown, but since
515
+ # we are not tracking which server the operation was sent to,
516
+ # we are not able to assert this.
517
+ # There is no explicit cluster scan requested (and the operation may
518
+ # end up being sent to the same server it was sent to originally).
510
519
  expect(operation).to receive(:execute).and_return(true).ordered
511
520
  end
512
521
 
@@ -96,14 +96,14 @@ describe Mongo::Server::ConnectionPool::Queue do
96
96
  create_queue(1)
97
97
  end
98
98
 
99
- it 'disconnects all connections in the queue and recreates up to min size with new generation' do
99
+ it 'disconnects all connections in the queue and bumps generation' do
100
100
  expect(queue.queue_size).to eq(2)
101
101
  expect(queue.pool_size).to eq(2)
102
102
 
103
103
  queue.disconnect!
104
104
 
105
- expect(queue.queue_size).to eq(1)
106
- expect(queue.pool_size).to eq(1)
105
+ expect(queue.queue_size).to eq(0)
106
+ expect(queue.pool_size).to eq(0)
107
107
 
108
108
  new_connection = queue.dequeue
109
109
  expect(new_connection).not_to eq(connection)
@@ -304,12 +304,14 @@ describe Mongo::Server::ConnectionPool::Queue do
304
304
  end
305
305
 
306
306
  describe 'close_stale_sockets!!' do
307
+ after do
308
+ Timecop.return
309
+ end
307
310
 
308
311
  let(:queue) do
309
312
  described_class.new(max_pool_size: 2, max_idle_time: 0.5) do
310
313
  double('connection').tap do |con|
311
314
  expect(con).to receive(:generation).and_return(1)
312
- expect(con).to receive(:disconnect!).and_return(true)
313
315
  allow(con).to receive(:record_checkin!) do
314
316
  allow(con).to receive(:last_checkin).and_return(Time.now)
315
317
  con
@@ -324,16 +326,28 @@ describe Mongo::Server::ConnectionPool::Queue do
324
326
  end
325
327
  end
326
328
 
327
- before do
328
- queue.enqueue(connection)
329
- expect(connection).to receive(:connect!).and_return(true)
330
- sleep(0.5)
329
+ it 'disconnects all expired and only expired connections' do
330
+ c1 = queue.dequeue
331
+ expect(c1).to receive(:disconnect!)
332
+ c2 = queue.dequeue
333
+ expect(c2).not_to receive(:disconnect!)
334
+
335
+ queue.enqueue(c1)
336
+ Timecop.travel(Time.now + 1)
337
+ queue.enqueue(c2)
338
+
339
+ expect(queue.queue_size).to eq(2)
340
+ expect(queue.pool_size).to eq(2)
341
+ expect(queue.queue.length).to eq(2)
342
+
343
+ expect(c1).not_to receive(:connect!)
344
+ expect(c2).not_to receive(:connect!)
345
+
331
346
  queue.close_stale_sockets!
332
- end
333
347
 
334
- it 'disconnects and reconnects up to min_size the expired connections' do
335
348
  expect(queue.queue_size).to eq(1)
336
349
  expect(queue.pool_size).to eq(1)
350
+ expect(queue.queue.length).to eq(1)
337
351
  end
338
352
  end
339
353
  end
@@ -35,11 +35,11 @@ describe Mongo::Server::ConnectionPool do
35
35
  end
36
36
 
37
37
  let!(:pool) do
38
- described_class.get(server)
38
+ server.pool
39
39
  end
40
40
 
41
41
  after do
42
- expect(cluster).to receive(:pool).with(server).and_return(pool)
42
+ expect(server).to receive(:pool).and_return(pool)
43
43
  server.disconnect!
44
44
  end
45
45
 
@@ -70,7 +70,7 @@ describe Mongo::Server::ConnectionPool do
70
70
  end
71
71
 
72
72
  let!(:pool) do
73
- described_class.get(server)
73
+ server.pool
74
74
  end
75
75
 
76
76
  context 'when no connection is checked out on the same thread' do
@@ -129,36 +129,16 @@ describe Mongo::Server::ConnectionPool do
129
129
  end
130
130
 
131
131
  let!(:pool) do
132
- described_class.get(server)
132
+ server.pool
133
133
  end
134
134
 
135
135
  it 'disconnects the queue' do
136
- expect(cluster).to receive(:pool).with(server).and_return(pool)
136
+ expect(server).to receive(:pool).and_return(pool)
137
137
  expect(pool.send(:queue)).to receive(:disconnect!).once.and_call_original
138
138
  server.disconnect!
139
139
  end
140
140
  end
141
141
 
142
- describe '.get' do
143
-
144
- let(:server) do
145
- Mongo::Server.new(address, cluster, monitoring, listeners, options)
146
- end
147
-
148
- let!(:pool) do
149
- described_class.get(server)
150
- end
151
-
152
- after do
153
- expect(cluster).to receive(:pool).with(server).and_return(pool)
154
- server.disconnect!
155
- end
156
-
157
- it 'returns the pool for the server' do
158
- expect(pool).to_not be_nil
159
- end
160
- end
161
-
162
142
  describe '#inspect' do
163
143
 
164
144
  let(:server) do
@@ -166,11 +146,11 @@ describe Mongo::Server::ConnectionPool do
166
146
  end
167
147
 
168
148
  let!(:pool) do
169
- described_class.get(server)
149
+ server.pool
170
150
  end
171
151
 
172
152
  after do
173
- expect(cluster).to receive(:pool).with(server).and_return(pool)
153
+ expect(server).to receive(:pool).and_return(pool)
174
154
  server.disconnect!
175
155
  end
176
156
 
@@ -190,7 +170,7 @@ describe Mongo::Server::ConnectionPool do
190
170
  end
191
171
 
192
172
  let!(:pool) do
193
- described_class.get(server)
173
+ server.pool
194
174
  end
195
175
 
196
176
  context 'when a connection cannot be checked out' do
@@ -217,7 +197,7 @@ describe Mongo::Server::ConnectionPool do
217
197
  end
218
198
 
219
199
  let!(:pool) do
220
- described_class.get(server)
200
+ server.pool
221
201
  end
222
202
 
223
203
  let(:options) do
@@ -245,7 +225,7 @@ describe Mongo::Server::ConnectionPool do
245
225
  end
246
226
 
247
227
  let!(:pool) do
248
- described_class.get(server)
228
+ server.pool
249
229
  end
250
230
 
251
231
  let(:queue) do
@@ -297,14 +277,16 @@ describe Mongo::Server::ConnectionPool do
297
277
  end
298
278
 
299
279
  context 'when min size is > 0' do
280
+ after do
281
+ Timecop.return
282
+ end
300
283
 
301
284
  context 'when more than the number of min_size are checked out' do
302
-
303
285
  let(:options) do
304
286
  SpecConfig.instance.test_options.merge(max_pool_size: 5, min_pool_size: 3, max_idle_time: 0.5)
305
287
  end
306
288
 
307
- before do
289
+ it 'closes and removes connections with stale sockets and does not connect new ones' do
308
290
  first = pool.checkout
309
291
  second = pool.checkout
310
292
  third = pool.checkout
@@ -316,13 +298,14 @@ describe Mongo::Server::ConnectionPool do
316
298
  expect(fifth).to receive(:disconnect!).and_call_original
317
299
  expect(fifth).not_to receive(:connect!)
318
300
 
319
- sleep(0.5)
301
+ Timecop.travel(Time.now + 1)
302
+ expect(queue.length).to be(1)
320
303
  pool.close_stale_sockets!
321
- end
322
304
 
323
- it 'closes all stale sockets and does not connect new ones' do
324
- expect(queue.size).to be(1)
325
- expect(queue[0].connected?).to be(false)
305
+ expect(pool.send(:queue).pool_size).to be(4)
306
+ expect(pool.send(:queue).queue_size).to be(0)
307
+ expect(queue.length).to be(0)
308
+ expect(fifth.connected?).to be(false)
326
309
  end
327
310
  end
328
311
 
@@ -332,46 +315,7 @@ describe Mongo::Server::ConnectionPool do
332
315
  SpecConfig.instance.test_options.merge(max_pool_size: 5, min_pool_size: 3, max_idle_time: 0.5)
333
316
  end
334
317
 
335
- before do
336
- first = pool.checkout
337
- second = pool.checkout
338
- third = pool.checkout
339
- fourth = pool.checkout
340
- fifth = pool.checkout
341
-
342
- pool.checkin(third)
343
- pool.checkin(fourth)
344
- pool.checkin(fifth)
345
-
346
-
347
- expect(third).to receive(:disconnect!).and_call_original
348
- expect(third).not_to receive(:connect!)
349
-
350
- expect(fourth).to receive(:disconnect!).and_call_original
351
- expect(fourth).not_to receive(:connect!)
352
-
353
- expect(fifth).to receive(:disconnect!).and_call_original
354
- expect(fifth).to receive(:connect!).and_call_original
355
-
356
- sleep(0.5)
357
- pool.close_stale_sockets!
358
- end
359
-
360
- it 'closes all stale sockets and does not connect new ones' do
361
- expect(queue.size).to be(3)
362
- expect(queue[0].connected?).to be(true)
363
- expect(queue[1].connected?).to be(false)
364
- expect(queue[2].connected?).to be(false)
365
- end
366
- end
367
-
368
- context 'when a stale connection is unsuccessfully reconnected' do
369
-
370
- let(:options) do
371
- SpecConfig.instance.test_options.merge(max_pool_size: 5, min_pool_size: 3, max_idle_time: 0.5)
372
- end
373
-
374
- before do
318
+ it 'closes and removes connections with stale sockets and does not connect new ones' do
375
319
  first = pool.checkout
376
320
  second = pool.checkout
377
321
  third = pool.checkout
@@ -390,50 +334,19 @@ describe Mongo::Server::ConnectionPool do
390
334
  expect(fourth).not_to receive(:connect!)
391
335
 
392
336
  expect(fifth).to receive(:disconnect!).and_call_original
393
- allow(fifth).to receive(:connect!).and_raise(Mongo::Error::SocketError)
337
+ expect(fifth).not_to receive(:connect!).and_call_original
394
338
 
395
- sleep(0.5)
339
+ Timecop.travel(Time.now + 1)
340
+ expect(queue.length).to be(3)
396
341
  pool.close_stale_sockets!
397
- end
398
-
399
- it 'is kept in the pool' do
400
- expect(queue.size).to be(3)
401
- expect(queue[0].connected?).to be(false)
402
- expect(queue[1].connected?).to be(false)
403
- expect(queue[2].connected?).to be(false)
404
- end
405
- end
406
342
 
407
- context 'when exactly the min_size number of connections is checked out' do
408
-
409
- let(:options) do
410
- SpecConfig.instance.test_options.merge(max_pool_size: 5, min_pool_size: 3, max_idle_time: 0.5)
411
- end
412
-
413
- before do
414
- first = pool.checkout
415
- second = pool.checkout
416
- third = pool.checkout
417
- fourth = pool.checkout
418
- fifth = pool.checkout
419
-
420
- pool.checkin(fourth)
421
- pool.checkin(fifth)
422
-
423
- expect(fourth).to receive(:disconnect!).and_call_original
424
- expect(fourth).not_to receive(:connect!)
425
-
426
- expect(fifth).to receive(:disconnect!).and_call_original
427
- expect(fifth).not_to receive(:connect!)
428
-
429
- sleep(0.5)
430
- pool.close_stale_sockets!
431
- end
343
+ expect(pool.send(:queue).pool_size).to be(2)
344
+ expect(pool.send(:queue).queue_size).to be(0)
345
+ expect(queue.length).to be(0)
432
346
 
433
- it 'closes all stale sockets and does not connect new ones' do
434
- expect(queue.size).to be(2)
435
- expect(queue[0].connected?).to be(false)
436
- expect(queue[1].connected?).to be(false)
347
+ expect(third.connected?).to be(false)
348
+ expect(fourth.connected?).to be(false)
349
+ expect(fifth.connected?).to be(false)
437
350
  end
438
351
  end
439
352
  end