mongoid 7.1.4 → 7.1.5
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: '06912d432d08b07e80bad71d5073cf2d5a4924f097cdefed959107c6cad245ef'
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: d6880896621095c3d3017207d9966f99c17f7aea9a1d7366746e287e4c2cea04
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 9b9a2bcc459c5ae8f2d7dd5585e7c0c39869f6a860067ae4ab36c5df64efb524ef688d5ab087e1a52a9d6ea3101df66213ad607c62df7499e5706bcce3f0974c
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: cafe608ad57c0b91593bd570024c74aa6ed203f14e6ebe61b026601ef7c64ab8bc28d944a42e73aa6c1b1aea1510f83e9a64f869bee15ce549db2ade75e56295
         
     | 
    
        checksums.yaml.gz.sig
    CHANGED
    
    | 
         Binary file 
     | 
    
        data.tar.gz.sig
    CHANGED
    
    | 
         Binary file 
     | 
    
        data/lib/mongoid/query_cache.rb
    CHANGED
    
    | 
         @@ -163,14 +163,13 @@ module Mongoid 
     | 
|
| 
       163 
163 
     | 
    
         
             
                  private
         
     | 
| 
       164 
164 
     | 
    
         | 
| 
       165 
165 
     | 
    
         
             
                  def process(result)
         
     | 
| 
       166 
     | 
    
         
            -
                     
     | 
| 
       167 
     | 
    
         
            -
             
     | 
| 
       168 
     | 
    
         
            -
                    @coll_name ||= result.namespace.sub("#{database.name}.", '') if result.namespace
         
     | 
| 
       169 
     | 
    
         
            -
                    documents = result.documents
         
     | 
| 
      
 166 
     | 
    
         
            +
                    documents = super
         
     | 
| 
      
 167 
     | 
    
         
            +
             
     | 
| 
       170 
168 
     | 
    
         
             
                    if @cursor_id.zero? && !@after_first_batch
         
     | 
| 
       171 
169 
     | 
    
         
             
                      @cached_documents ||= []
         
     | 
| 
       172 
170 
     | 
    
         
             
                      @cached_documents.concat(documents)
         
     | 
| 
       173 
171 
     | 
    
         
             
                    end
         
     | 
| 
      
 172 
     | 
    
         
            +
             
     | 
| 
       174 
173 
     | 
    
         
             
                    @after_first_batch = true
         
     | 
| 
       175 
174 
     | 
    
         
             
                    documents
         
     | 
| 
       176 
175 
     | 
    
         
             
                  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 behavior to the query cache for collections.
         
     | 
    
        data/lib/mongoid/version.rb
    CHANGED
    
    
    
        data/spec/lite_spec_helper.rb
    CHANGED
    
    
| 
         @@ -10,6 +10,20 @@ describe Mongoid::QueryCache do 
     | 
|
| 
       10 
10 
     | 
    
         
             
                Mongoid::QueryCache.cache { spec.run }
         
     | 
| 
       11 
11 
     | 
    
         
             
              end
         
     | 
| 
       12 
12 
     | 
    
         | 
| 
      
 13 
     | 
    
         
            +
              before(:all) do
         
     | 
| 
      
 14 
     | 
    
         
            +
                # It is likely that there are other session leaks in the driver
         
     | 
| 
      
 15 
     | 
    
         
            +
                # and/or Mongoid that are unrelated to the query cache. Clear the
         
     | 
| 
      
 16 
     | 
    
         
            +
                # SessionRegistry at the start of these tests in order to detect leaks that
         
     | 
| 
      
 17 
     | 
    
         
            +
                # occur only within the scope of these tests.
         
     | 
| 
      
 18 
     | 
    
         
            +
                #
         
     | 
| 
      
 19 
     | 
    
         
            +
                # Other session leaks will be detected and addressed as part of RUBY-2391.
         
     | 
| 
      
 20 
     | 
    
         
            +
                SessionRegistry.instance.clear_registry
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
              after do
         
     | 
| 
      
 24 
     | 
    
         
            +
                SessionRegistry.instance.verify_sessions_ended!
         
     | 
| 
      
 25 
     | 
    
         
            +
              end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
       13 
27 
     | 
    
         
             
              context 'when iterating over objects sharing the same base' do
         
     | 
| 
       14 
28 
     | 
    
         | 
| 
       15 
29 
     | 
    
         
             
                let(:server) do
         
     | 
| 
         @@ -543,7 +557,7 @@ describe Mongoid::QueryCache do 
     | 
|
| 
       543 
557 
     | 
    
         
             
                  Mongoid::QueryCache.enabled = true
         
     | 
| 
       544 
558 
     | 
    
         
             
                  10.times { Band.create! }
         
     | 
| 
       545 
559 
     | 
    
         | 
| 
       546 
     | 
    
         
            -
                  Band.batch_size(4).all. 
     | 
| 
      
 560 
     | 
    
         
            +
                  Band.batch_size(4).all.to_a
         
     | 
| 
       547 
561 
     | 
    
         
             
                end
         
     | 
| 
       548 
562 
     | 
    
         | 
| 
       549 
563 
     | 
    
         
             
                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.1. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 7.1.5
         
     | 
| 
       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
         
     | 
| 
         @@ -929,6 +929,7 @@ files: 
     | 
|
| 
       929 
929 
     | 
    
         
             
            - spec/support/helpers.rb
         
     | 
| 
       930 
930 
     | 
    
         
             
            - spec/support/lite_constraints.rb
         
     | 
| 
       931 
931 
     | 
    
         
             
            - spec/support/macros.rb
         
     | 
| 
      
 932 
     | 
    
         
            +
            - spec/support/session_registry.rb
         
     | 
| 
       932 
933 
     | 
    
         
             
            - spec/support/shared/time.rb
         
     | 
| 
       933 
934 
     | 
    
         
             
            - spec/support/spec_config.rb
         
     | 
| 
       934 
935 
     | 
    
         
             
            homepage: https://mongoid.org
         
     | 
| 
         @@ -1489,6 +1490,7 @@ test_files: 
     | 
|
| 
       1489 
1490 
     | 
    
         
             
            - spec/lite_spec_helper.rb
         
     | 
| 
       1490 
1491 
     | 
    
         
             
            - spec/README.md
         
     | 
| 
       1491 
1492 
     | 
    
         
             
            - spec/support/helpers.rb
         
     | 
| 
      
 1493 
     | 
    
         
            +
            - spec/support/session_registry.rb
         
     | 
| 
       1492 
1494 
     | 
    
         
             
            - spec/support/child_process_helper.rb
         
     | 
| 
       1493 
1495 
     | 
    
         
             
            - spec/support/constraints.rb
         
     | 
| 
       1494 
1496 
     | 
    
         
             
            - spec/support/lite_constraints.rb
         
     | 
    
        metadata.gz.sig
    CHANGED
    
    | 
         Binary file 
     |