Skip to content

Commit d06012d

Browse files
MONGOID-5820 Fix the session object leak when using transactions (#5878)
Co-authored-by: Dmitry Rybakov <dmitry.rybakov@mongodb.com>
1 parent 3c8f5db commit d06012d

File tree

3 files changed

+22
-3
lines changed

3 files changed

+22
-3
lines changed

lib/mongoid/clients/sessions.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ def with_session(options = {})
6262
rescue *transactions_not_supported_exceptions
6363
raise Mongoid::Errors::TransactionsNotSupported
6464
ensure
65+
Threaded.clear_modified_documents(session)
6566
Threaded.clear_session(client: persistence_context.client)
6667
end
6768

lib/mongoid/threaded.rb

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ module Threaded
1818
CURRENT_SCOPE_KEY = '[mongoid]:current-scope'
1919

2020
AUTOSAVES_KEY = '[mongoid]:autosaves'
21+
2122
VALIDATIONS_KEY = '[mongoid]:validations'
2223

2324
STACK_KEYS = Hash.new do |hash, key|
@@ -376,9 +377,7 @@ def add_modified_document(session, document)
376377
# @return [ Set<Mongoid::Document> ] Collection of modified documents before
377378
# it was cleared.
378379
def clear_modified_documents(session)
379-
modified_documents[session].dup
380-
ensure
381-
modified_documents[session].clear
380+
modified_documents.delete(session) || []
382381
end
383382

384383
# Queries whether document callbacks should be executed by default for the

spec/mongoid/threaded_spec.rb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,4 +341,23 @@
341341
end
342342
end
343343
end
344+
345+
describe '#clear_modified_documents' do
346+
let(:session) do
347+
double(Mongo::Session).tap do |session|
348+
allow(session).to receive(:in_transaction?).and_return(true)
349+
end
350+
end
351+
352+
context 'when there are modified documents' do
353+
before do
354+
described_class.add_modified_document(session, Minim.new)
355+
described_class.clear_modified_documents(session)
356+
end
357+
358+
it 'removes the documents and keys' do
359+
expect(described_class.modified_documents).to be_empty
360+
end
361+
end
362+
end
344363
end

0 commit comments

Comments
 (0)