@@ -97,7 +97,11 @@ def initialize(server_session, client, options = {})
9797 @server_session = server_session
9898 options = options . dup
9999
100- @client = client . use ( :admin )
100+ # Implicit sessions only need the cluster and client options (never run
101+ # transactions), so avoid creating a Mongo::Client clone to prevent
102+ # memory leaks: use the original client directly instead.
103+ @client = options [ :implicit ] ? client : client . use ( :admin )
104+ @cluster = @client . cluster
101105 @options = options . dup . freeze
102106 @cluster_time = nil
103107 @state = NO_TRANSACTION_STATE
@@ -115,7 +119,7 @@ def initialize(server_session, client, options = {})
115119 attr_reader :client
116120
117121 def cluster
118- @client . cluster
122+ @cluster
119123 end
120124
121125 # @return [ true | false ] Whether the session is configured for snapshot
@@ -384,12 +388,13 @@ def end_session
384388 end
385389 end
386390 if @server_session
387- @client . cluster . session_pool . checkin ( @server_session )
391+ cluster . session_pool . checkin ( @server_session )
388392 end
389393 end
390394 ensure
391395 @server_session = nil
392396 @ended = true
397+ @client = nil
393398 end
394399
395400 # Executes the provided block in a transaction, retrying as necessary.
@@ -1099,8 +1104,8 @@ def update_state!
10991104 # @since 2.5.0
11001105 # @api private
11011106 def validate! ( client )
1102- check_matching_cluster! ( client )
11031107 check_if_ended!
1108+ check_matching_cluster! ( client )
11041109 self
11051110 end
11061111
@@ -1280,7 +1285,7 @@ def check_if_ended!
12801285 end
12811286
12821287 def check_matching_cluster! ( client )
1283- if @client . cluster != client . cluster
1288+ if cluster != client . cluster
12841289 raise Mongo ::Error ::InvalidSession . new ( MISMATCHED_CLUSTER_ERROR_MSG )
12851290 end
12861291 end
0 commit comments