Skip to content

Commit 9710973

Browse files
committed
RUBY-1300 Add tests ensuring implicit session is returned to session pool after queried docs are retrieved
1 parent e1c9fa8 commit 9710973

File tree

2 files changed

+62
-18
lines changed

2 files changed

+62
-18
lines changed

spec/mongo/cursor_spec.rb

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -328,20 +328,16 @@
328328

329329
context 'when an implicit session is used', if: sessions_enabled? do
330330

331-
let(:documents) do
332-
(1..4).map{ |i| { field: "test#{i}" }}
331+
let(:collection) do
332+
authorized_client_with_subscriber[TEST_COLL]
333333
end
334334

335335
before do
336-
authorized_collection.insert_many(documents)
336+
collection.insert_many(documents)
337337
end
338338

339339
after do
340-
authorized_collection.delete_many
341-
end
342-
343-
let(:view) do
344-
authorized_collection.find({}, batch_size: 2, limit: 4)
340+
collection.delete_many
345341
end
346342

347343
let(:cursor) do
@@ -352,30 +348,58 @@
352348
view.to_enum
353349
end
354350

355-
let!(:server_session) do
356-
enum.next
357-
cursor.instance_variable_get(:@session).instance_variable_get(:@server_session)
351+
let(:session_pool_ids) do
352+
queue = view.client.cluster.session_pool.instance_variable_get(:@queue)
353+
queue.collect { |s| s.session_id }
358354
end
359355

360-
let(:session_pool_queue) do
361-
view.client.cluster.session_pool.instance_variable_get(:@queue)
356+
let(:find_events) do
357+
event_subscriber.started_events.select { |e| e.command_name == "find" }
358+
end
359+
360+
context 'when all results are retrieved in the first response' do
361+
362+
let(:documents) do
363+
(1..2).map{ |i| { field: "test#{i}" }}
364+
end
365+
366+
let(:view) do
367+
collection.find
368+
end
369+
370+
it 'returns the session to the cluster session pool' do
371+
1.times { enum.next }
372+
expect(find_events.collect { |event| event.command['lsid'] }.uniq.size).to eq(1)
373+
expect(session_pool_ids).to include(find_events.collect { |event| event.command['lsid'] }.uniq.first)
374+
end
362375
end
363376

364-
context 'when all results are retrieved from the server', if: sessions_enabled? && !sharded? do
377+
context 'when a getmore is needed to retrieve all results', if: sessions_enabled? && !sharded? do
378+
379+
let(:documents) do
380+
(1..4).map{ |i| { field: "test#{i}" }}
381+
end
382+
383+
let(:view) do
384+
collection.find({}, batch_size: 2, limit: 4)
385+
end
386+
365387

366388
context 'when not all documents are iterated' do
367389

368390
it 'returns the session to the cluster session pool' do
369-
2.times { enum.next }
370-
expect(session_pool_queue).to include(server_session)
391+
3.times { enum.next }
392+
expect(find_events.collect { |event| event.command['lsid'] }.uniq.size).to eq(1)
393+
expect(session_pool_ids).to include(find_events.collect { |event| event.command['lsid'] }.uniq.first)
371394
end
372395
end
373396

374397
context 'when all documents are iterated' do
375398

376399
it 'returns the session to the cluster session pool' do
377-
3.times { enum.next }
378-
expect(session_pool_queue).to include(server_session)
400+
4.times { enum.next }
401+
expect(find_events.collect { |event| event.command['lsid'] }.uniq.size).to eq(1)
402+
expect(session_pool_ids).to include(find_events.collect { |event| event.command['lsid'] }.uniq.first)
379403
end
380404
end
381405
end

spec/support/authorization.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,26 @@ def self.included(context)
230230
# @since 2.5.1
231231
context.let(:authorized_client_with_retry_writes) { AUTHROIZED_CLIENT_WITH_RETRY_WRITES }
232232

233+
# Provides an authorized mongo client that has a Command subscriber.
234+
#
235+
# @since 2.5.1
236+
context.let(:authorized_client_with_subscriber) do
237+
Mongo::Client.new(
238+
ADDRESSES,
239+
TEST_OPTIONS.merge(
240+
database: TEST_DB,
241+
user: TEST_USER.name,
242+
password: TEST_USER.password)
243+
).tap do |client|
244+
client.subscribe(Mongo::Monitoring::COMMAND, event_subscriber)
245+
end
246+
end
247+
248+
# A command event subscriber.
249+
#
250+
# @since 2.5.1
251+
context.let(:event_subscriber) { EventSubscriber.new }
252+
233253
# Provides an unauthorized mongo client on the default test database.
234254
#
235255
# @since 2.0.0

0 commit comments

Comments
 (0)