mongoid 7.0.10 → 7.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/mongoid/query_cache.rb +47 -17
- data/lib/mongoid/version.rb +1 -1
- data/spec/lite_spec_helper.rb +1 -0
- data/spec/mongoid/query_cache_spec.rb +15 -1
- data/spec/support/session_registry.rb +50 -0
- metadata +4 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2db36cde93b00ddee6d916461da83d9bfaf6c0ee58e8a82fac70b506256c6892
|
4
|
+
data.tar.gz: 06a177507dd8099105f3d851c5b92d371ba9f8a399946944b1cea60c91ac1a34
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5f42d1faa7ae4f8815fe338eca85e76bbe5dc434a1dad4cbe6f883c0f4e5cd057d0a40898258306b238a10f80446699d70898b4b3dafa535f5fb1dfa3f5d71ba
|
7
|
+
data.tar.gz: e3bfe307cb9e3bed02a247a27ad68b8556672badb4b5162410ae2b675fb61a99f9ca6fb4926af77294ba0c11b514eeeb73cbe3beeb4edbe240ae438d49e837ec
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/lib/mongoid/query_cache.rb
CHANGED
@@ -161,14 +161,13 @@ module Mongoid
|
|
161
161
|
private
|
162
162
|
|
163
163
|
def process(result)
|
164
|
-
|
165
|
-
|
166
|
-
@coll_name ||= result.namespace.sub("#{database.name}.", '') if result.namespace
|
167
|
-
documents = result.documents
|
164
|
+
documents = super
|
165
|
+
|
168
166
|
if @cursor_id.zero? && !@after_first_batch
|
169
167
|
@cached_documents ||= []
|
170
168
|
@cached_documents.concat(documents)
|
171
169
|
end
|
170
|
+
|
172
171
|
@after_first_batch = true
|
173
172
|
documents
|
174
173
|
end
|
@@ -224,34 +223,39 @@ module Mongoid
|
|
224
223
|
#
|
225
224
|
# @since 5.0.0
|
226
225
|
def each
|
227
|
-
if system_collection? || !QueryCache.enabled?
|
226
|
+
if system_collection? || !QueryCache.enabled? || (respond_to?(:write?, true) && write?)
|
228
227
|
super
|
229
228
|
else
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
229
|
+
@cursor = nil
|
230
|
+
unless @cursor = cached_cursor
|
231
|
+
|
232
|
+
if driver_supports_cursor_sessions?
|
233
|
+
session = client.send(:get_session, @options)
|
234
|
+
read_with_retry(session, server_selector) do |server|
|
235
|
+
result = send_initial_query(server, session)
|
236
|
+
@cursor = get_cursor(result, server, session)
|
237
|
+
end
|
238
|
+
else
|
239
|
+
read_with_retry do
|
240
|
+
server = server_selector.select_server(cluster)
|
241
|
+
result = send_initial_query(server)
|
242
|
+
@cursor = get_cursor(result, server)
|
239
243
|
end
|
240
244
|
end
|
241
245
|
end
|
242
246
|
|
243
247
|
if block_given?
|
244
248
|
if limit && limit != -1
|
245
|
-
cursor.to_a[0...limit].each do |doc|
|
249
|
+
@cursor.to_a[0...limit].each do |doc|
|
246
250
|
yield doc
|
247
251
|
end
|
248
252
|
else
|
249
|
-
cursor.each do |doc|
|
253
|
+
@cursor.each do |doc|
|
250
254
|
yield doc
|
251
255
|
end
|
252
256
|
end
|
253
257
|
else
|
254
|
-
cursor
|
258
|
+
@cursor.to_enum
|
255
259
|
end
|
256
260
|
end
|
257
261
|
end
|
@@ -266,6 +270,26 @@ module Mongoid
|
|
266
270
|
cursor || QueryCache.cache_table[cache_key]
|
267
271
|
end
|
268
272
|
|
273
|
+
def get_cursor(result, server, session = nil)
|
274
|
+
if result.cursor_id == 0 || result.cursor_id.nil?
|
275
|
+
cursor = if session
|
276
|
+
CachedCursor.new(view, result, server, session: session)
|
277
|
+
else
|
278
|
+
CachedCursor.new(view, result, server)
|
279
|
+
end
|
280
|
+
|
281
|
+
QueryCache.cache_table[cache_key] = cursor
|
282
|
+
else
|
283
|
+
cursor = if session
|
284
|
+
Mongo::Cursor.new(view, result, server, session: session)
|
285
|
+
else
|
286
|
+
Mongo::Cursor.new(view, result, server)
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
290
|
+
cursor
|
291
|
+
end
|
292
|
+
|
269
293
|
def cache_key
|
270
294
|
[ collection.namespace, selector, limit, skip, sort, projection, collation ]
|
271
295
|
end
|
@@ -273,6 +297,12 @@ module Mongoid
|
|
273
297
|
def system_collection?
|
274
298
|
collection.namespace =~ /\Asystem./
|
275
299
|
end
|
300
|
+
|
301
|
+
def driver_supports_cursor_sessions?
|
302
|
+
# Driver versions 2.9 and newer support passing in a session to the
|
303
|
+
# cursor object.
|
304
|
+
(Mongo::VERSION.split('.').map(&:to_i) <=> [2, 9, 0]) > 0
|
305
|
+
end
|
276
306
|
end
|
277
307
|
|
278
308
|
# Adds behaviour to the query cache for collections.
|
data/lib/mongoid/version.rb
CHANGED
data/spec/lite_spec_helper.rb
CHANGED
@@ -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
|
@@ -540,7 +554,7 @@ describe Mongoid::QueryCache do
|
|
540
554
|
Mongoid::QueryCache.enabled = true
|
541
555
|
10.times { Band.create! }
|
542
556
|
|
543
|
-
Band.batch_size(4).all.
|
557
|
+
Band.batch_size(4).all.to_a
|
544
558
|
end
|
545
559
|
|
546
560
|
it 'does not cache the result' do
|
@@ -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: 7.0.
|
4
|
+
version: 7.0.11
|
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-
|
32
|
+
date: 2020-11-06 00:00:00.000000000 Z
|
33
33
|
dependencies:
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
35
|
name: activemodel
|
@@ -896,6 +896,7 @@ files:
|
|
896
896
|
- spec/support/constraints.rb
|
897
897
|
- spec/support/expectations.rb
|
898
898
|
- spec/support/macros.rb
|
899
|
+
- spec/support/session_registry.rb
|
899
900
|
- spec/support/spec_config.rb
|
900
901
|
homepage: https://mongoid.org
|
901
902
|
licenses:
|
@@ -1425,6 +1426,7 @@ test_files:
|
|
1425
1426
|
- spec/mongoid_spec.rb
|
1426
1427
|
- spec/lite_spec_helper.rb
|
1427
1428
|
- spec/README.md
|
1429
|
+
- spec/support/session_registry.rb
|
1428
1430
|
- spec/support/child_process_helper.rb
|
1429
1431
|
- spec/support/constraints.rb
|
1430
1432
|
- spec/support/macros.rb
|
metadata.gz.sig
CHANGED
Binary file
|