mongoid 6.4.7 → 6.4.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9b178391288873186489028a588fe8d35be83a44d9bf351846a727af169096cd
4
- data.tar.gz: ce725bbd596c7ac7df2817826788be6162a55a6ebeacf5553eebc810feb43ee3
3
+ metadata.gz: b8c453904dce4061c6cd88c36e21f3514fb778b37976ffd12e985aaf80fc2b98
4
+ data.tar.gz: d10421a146387851daa6a9c27184b48da1cc50d96a946bce0851aa69fd56c9a5
5
5
  SHA512:
6
- metadata.gz: ea99aca6fe69fbe884477398019e761bf7f1274bb75b382b451767cdc6cfa4f6a1ea1ed874a65835d758ebc97c08823734721c6908296a926b1ae37e35c67fda
7
- data.tar.gz: d9e7087501c49435c51873f901bb2e24a036dd1b2268fcb733f03f3aea6a523339e13997198d8e46ea2a128abf665ded41a1765382004d40523b317f3691e7d6
6
+ metadata.gz: 6c0e672470d68faab3afc70e65524baa771801b46bbbb51b831a5cc709baf6df4ed7f0d81aed2dd5d0c3e3cf6730166da9bc8345b33577298f4438ec6c11fca3
7
+ data.tar.gz: 2008465437ba6eafe50235b22204df40b560b8e3bd27d064e97912c3249f5443af2ad1016c9a545d9d487abc6c1b38835624090a6d9165d06f9c4e676b561a23
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -159,11 +159,14 @@ module Mongoid
159
159
  private
160
160
 
161
161
  def process(result)
162
- @remaining -= result.returned_count if limited?
163
- @cursor_id = result.cursor_id
164
- @coll_name ||= result.namespace.sub("#{database.name}.", '') if result.namespace
165
- documents = result.documents
166
- (@cached_documents ||= []).concat(documents)
162
+ documents = super
163
+
164
+ if @cursor_id.zero? && !@after_first_batch
165
+ @cached_documents ||= []
166
+ @cached_documents.concat(documents)
167
+ end
168
+
169
+ @after_first_batch = true
167
170
  documents
168
171
  end
169
172
  end
@@ -218,34 +221,39 @@ module Mongoid
218
221
  #
219
222
  # @since 5.0.0
220
223
  def each
221
- if system_collection? || !QueryCache.enabled?
224
+ if system_collection? || !QueryCache.enabled? || (respond_to?(:write?, true) && write?)
222
225
  super
223
226
  else
224
- unless cursor = cached_cursor
225
- read_with_retry do
226
- server = server_selector.select_server(cluster)
227
- result = send_initial_query(server)
228
- if result.cursor_id == 0 || result.cursor_id.nil?
229
- cursor = CachedCursor.new(view, result, server)
230
- QueryCache.cache_table[cache_key] = cursor
231
- else
232
- cursor = Mongo::Cursor.new(view, result, server)
227
+ @cursor = nil
228
+ unless @cursor = cached_cursor
229
+
230
+ if driver_supports_cursor_sessions?
231
+ session = client.send(:get_session, @options)
232
+ read_with_retry(session, server_selector) do |server|
233
+ result = send_initial_query(server, session)
234
+ @cursor = get_cursor(result, server, session)
235
+ end
236
+ else
237
+ read_with_retry do
238
+ server = server_selector.select_server(cluster)
239
+ result = send_initial_query(server)
240
+ @cursor = get_cursor(result, server)
233
241
  end
234
242
  end
235
243
  end
236
244
 
237
245
  if block_given?
238
246
  if limit && limit != -1
239
- cursor.to_a[0...limit].each do |doc|
247
+ @cursor.to_a[0...limit].each do |doc|
240
248
  yield doc
241
249
  end
242
250
  else
243
- cursor.each do |doc|
251
+ @cursor.each do |doc|
244
252
  yield doc
245
253
  end
246
254
  end
247
255
  else
248
- cursor
256
+ @cursor.to_enum
249
257
  end
250
258
  end
251
259
  end
@@ -260,6 +268,26 @@ module Mongoid
260
268
  cursor || QueryCache.cache_table[cache_key]
261
269
  end
262
270
 
271
+ def get_cursor(result, server, session = nil)
272
+ if result.cursor_id == 0 || result.cursor_id.nil?
273
+ cursor = if session
274
+ CachedCursor.new(view, result, server, session: session)
275
+ else
276
+ CachedCursor.new(view, result, server)
277
+ end
278
+
279
+ QueryCache.cache_table[cache_key] = cursor
280
+ else
281
+ cursor = if session
282
+ Mongo::Cursor.new(view, result, server, session: session)
283
+ else
284
+ Mongo::Cursor.new(view, result, server)
285
+ end
286
+ end
287
+
288
+ cursor
289
+ end
290
+
263
291
  def cache_key
264
292
  [ collection.namespace, selector, limit, skip, sort, projection, collation ]
265
293
  end
@@ -267,6 +295,12 @@ module Mongoid
267
295
  def system_collection?
268
296
  collection.namespace =~ /^system./
269
297
  end
298
+
299
+ def driver_supports_cursor_sessions?
300
+ # Driver versions 2.9 and newer support passing in a session to the
301
+ # cursor object.
302
+ (Mongo::VERSION.split('.').map(&:to_i) <=> [2, 9, 0]) > 0
303
+ end
270
304
  end
271
305
 
272
306
  # Adds behaviour to the query cache for collections.
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- VERSION = "6.4.7"
3
+ VERSION = "6.4.8"
4
4
  end
@@ -7,6 +7,20 @@ describe Mongoid::QueryCache do
7
7
  Mongoid::QueryCache.cache { spec.run }
8
8
  end
9
9
 
10
+ before(:all) do
11
+ # It is likely that there are other session leaks in the driver
12
+ # and/or Mongoid that are unrelated to the query cache. Clear the
13
+ # SessionRegistry at the start of these tests in order to detect leaks that
14
+ # occur only within the scope of these tests.
15
+ #
16
+ # Other session leaks will be detected and addressed as part of RUBY-2391.
17
+ SessionRegistry.instance.clear_registry
18
+ end
19
+
20
+ after do
21
+ SessionRegistry.instance.verify_sessions_ended!
22
+ end
23
+
10
24
  context 'when iterating over objects sharing the same base' do
11
25
 
12
26
  let(:server) do
@@ -38,6 +38,7 @@ require 'support/macros'
38
38
  require 'support/spec_config'
39
39
  require 'support/cluster_config'
40
40
  require 'support/constraints'
41
+ require 'support/session_registry'
41
42
 
42
43
  # Give MongoDB time to start up on the travis ci environment.
43
44
  if (ENV['CI'] == 'travis' || ENV['CI'] == 'evergreen')
@@ -0,0 +1,50 @@
1
+ require 'singleton'
2
+
3
+ module Mongo
4
+ class Client
5
+ alias :get_session_without_tracking :get_session
6
+
7
+ def get_session(options = {})
8
+ get_session_without_tracking(options).tap do |session|
9
+ SessionRegistry.instance.register(session)
10
+ end
11
+ end
12
+ end
13
+
14
+ class Session
15
+ alias :end_session_without_tracking :end_session
16
+
17
+ def end_session
18
+ SessionRegistry.instance.unregister(self)
19
+ end_session_without_tracking
20
+ end
21
+ end
22
+ end
23
+
24
+
25
+ class SessionRegistry
26
+ include Singleton
27
+
28
+ def initialize
29
+ @registry = {}
30
+ end
31
+
32
+ def register(session)
33
+ @registry[session.session_id] = session if session
34
+ end
35
+
36
+ def unregister(session)
37
+ @registry.delete(session.session_id)
38
+ end
39
+
40
+ def verify_sessions_ended!
41
+ unless @registry.empty?
42
+ sessions = @registry.map { |_, session| session }
43
+ raise "Session registry contains live sessions: #{sessions.join(', ')}"
44
+ end
45
+ end
46
+
47
+ def clear_registry
48
+ @registry = {}
49
+ end
50
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.4.7
4
+ version: 6.4.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Durran Jordan
@@ -29,7 +29,7 @@ cert_chain:
29
29
  gpvfPNWMwyBDlHaNS3GfO6cRRxBOvEG05GUCsvtTY4Bpe8yjE64wg1ymb47LMOnv
30
30
  Qb1lGORmf/opg45mluKUYl7pQNZHD0d3
31
31
  -----END CERTIFICATE-----
32
- date: 2020-10-13 00:00:00.000000000 Z
32
+ date: 2020-11-06 00:00:00.000000000 Z
33
33
  dependencies:
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: activemodel
@@ -861,6 +861,7 @@ files:
861
861
  - spec/support/constraints.rb
862
862
  - spec/support/expectations.rb
863
863
  - spec/support/macros.rb
864
+ - spec/support/session_registry.rb
864
865
  - spec/support/spec_config.rb
865
866
  homepage: http://mongoid.org
866
867
  licenses:
@@ -1356,6 +1357,7 @@ test_files:
1356
1357
  - spec/config/mongoid.yml
1357
1358
  - spec/integration/document_spec.rb
1358
1359
  - spec/mongoid_spec.rb
1360
+ - spec/support/session_registry.rb
1359
1361
  - spec/support/constraints.rb
1360
1362
  - spec/support/macros.rb
1361
1363
  - spec/support/expectations.rb
metadata.gz.sig CHANGED
Binary file