mongo 2.13.0 → 2.13.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: df3eb3a5733323f2f4440c67bc0173661ada194ecb35374e8e78345e2d072525
4
- data.tar.gz: 63227bff6f14e3100f86a747b3e5d577812dd74d6da8061a069d8a313ecce09c
3
+ metadata.gz: cd4f9d74906d6f99fd038c0a3b4cfe0ee5cc3a7a4b327debf9c57649112b2cbb
4
+ data.tar.gz: 052b3f3af1749d9f26d8e3655359650653b4bf71e9198a3d2116afde6d576eb3
5
5
  SHA512:
6
- metadata.gz: '02253019a9aab19c94dbb2a4e459a84c1fa6f1383eca9d5b1daa26bf1c2aa1a96c32f52a23267b0b7b5c58fc469144d0c1722b4f79593ae7563ac0c9deb55d95'
7
- data.tar.gz: e02d93a95630d770f20a37cbe91a4dc18c98cb18e684da4b2a538a70afaaf61731e808832b2fe9aadca484dacfc8dce43cedf356ef00db019a03d77e9283cc45
6
+ metadata.gz: c016d60512a77572e58ae6553dc9e61ecf6574abc724785858c43987aa84d7b79199589a9be7da702d6385d48f70f65fe135caa36176f9cf6fb638c3e156afc4
7
+ data.tar.gz: a5c0dbab135a661a3cec5b0eab3300308693474d4c6662b0a18dd33b303f86753390eb0880232794a09ba511824f5d863f7bf428a8af1ca7b7b511458c078049
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -466,7 +466,18 @@ module Mongo
466
466
  # construction
467
467
  sdam_proc = options.delete(:sdam_proc)
468
468
 
469
- options = default_options(options).merge(options)
469
+ # For gssapi service_name, the default option is given in a hash
470
+ # (one level down from the top level).
471
+ merged_options = default_options(options)
472
+ options.each do |k, v|
473
+ default_v = merged_options[k]
474
+ if Hash === default_v
475
+ v = default_v.merge(v)
476
+ end
477
+ merged_options[k] = v
478
+ end
479
+ options = merged_options
480
+
470
481
  @options = validate_new_options!(options)
471
482
  =begin WriteConcern object support
472
483
  if @options[:write_concern].is_a?(WriteConcern::Base)
@@ -632,7 +643,7 @@ module Mongo
632
643
  #
633
644
  # @return [ BSON::Document ] The user-defined read preference.
634
645
  # The document may have the following fields:
635
- # - *:read* -- read preference specified as a symbol; valid values are
646
+ # - *:mode* -- read preference specified as a symbol; valid values are
636
647
  # *:primary*, *:primary_preferred*, *:secondary*, *:secondary_preferred*
637
648
  # and *:nearest*.
638
649
  # - *:tag_sets* -- an array of hashes.
@@ -278,8 +278,12 @@ module Mongo
278
278
  }).execute(next_primary(nil, session), client: client)
279
279
  end
280
280
  rescue Error::OperationFailure => ex
281
- raise ex unless ex.message =~ /ns not found/
282
- false
281
+ # NamespaceNotFound
282
+ if ex.code == 26 || ex.code.nil? && ex.message =~ /ns not found/
283
+ false
284
+ else
285
+ raise
286
+ end
283
287
  end
284
288
 
285
289
  # Find documents in the collection.
@@ -400,7 +404,7 @@ module Mongo
400
404
  View::ChangeStream.new(View.new(self, {}, options), pipeline, nil, options)
401
405
  end
402
406
 
403
- # Gets the number of matching documents in the collection.
407
+ # Gets an estimated number of matching documents in the collection.
404
408
  #
405
409
  # @example Get the count.
406
410
  # collection.count(name: 1)
@@ -429,11 +433,13 @@ module Mongo
429
433
  View.new(self, filter || {}, options).count(options)
430
434
  end
431
435
 
432
- # Gets the number of matching documents in the collection. Unlike the deprecated #count
433
- # method, this will return the exact number of documents matching the filter rather than the estimate.
436
+ # Gets the number of documents matching the query. Unlike the deprecated
437
+ # #count method, this will return the exact number of documents matching
438
+ # the filter (or exact number of documents in the collection, if no filter
439
+ # is provided) rather than an estimate.
434
440
  #
435
- # @example Get the number of documents in the collection.
436
- # collection_view.count_documents
441
+ # Use #estimated_document_count to retrieve an estimate of the number
442
+ # of documents in the collection using the collection metadata.
437
443
  #
438
444
  # @param [ Hash ] filter A filter for matching documents.
439
445
  # @param [ Hash ] options Options for the operation.
@@ -454,15 +460,16 @@ module Mongo
454
460
  View.new(self, filter, options).count_documents(options)
455
461
  end
456
462
 
457
- # Gets an estimate of the count of documents in a collection using collection metadata.
463
+ # Gets an estimate of the number of documents in the collection using the
464
+ # collection metadata.
458
465
  #
459
- # @example Get the number of documents in the collection.
460
- # collection_view.estimated_document_count
466
+ # Use #count_documents to retrieve the exact number of documents in the
467
+ # collection, or to count documents matching a filter.
461
468
  #
462
469
  # @param [ Hash ] options Options for the operation.
463
470
  #
464
- # @option opts :max_time_ms [ Integer ] The maximum amount of time to allow the command to
465
- # run.
471
+ # @option opts :max_time_ms [ Integer ] The maximum amount of time to allow
472
+ # the command to run for on the server.
466
473
  # @option opts [ Hash ] :read The read preference options.
467
474
  #
468
475
  # @return [ Integer ] The document count.
@@ -97,7 +97,8 @@ module Mongo
97
97
  # @since 2.1.1
98
98
  # @deprecated
99
99
  def retryable?
100
- write_retryable? || RETRY_MESSAGES.any?{ |m| message.include?(m) }
100
+ write_retryable? ||
101
+ code.nil? && RETRY_MESSAGES.any?{ |m| message.include?(m) }
101
102
  end
102
103
 
103
104
  # Whether the error is a retryable error according to the modern retryable
@@ -110,11 +111,11 @@ module Mongo
110
111
  #
111
112
  # @since 2.4.2
112
113
  def write_retryable?
113
- WRITE_RETRY_MESSAGES.any? { |m| message.include?(m) } ||
114
- write_retryable_code?
114
+ write_retryable_code? ||
115
+ code.nil? && WRITE_RETRY_MESSAGES.any? { |m| message.include?(m) }
115
116
  end
116
117
 
117
- def write_retryable_code?
118
+ private def write_retryable_code?
118
119
  if code
119
120
  WRITE_RETRY_ERRORS.any? { |e| e[:code] == code }
120
121
  else
@@ -122,7 +123,6 @@ module Mongo
122
123
  false
123
124
  end
124
125
  end
125
- private :write_retryable_code?
126
126
 
127
127
  # Error codes and code names that should result in a failing getMore
128
128
  # command on a change stream NOT being resumed.
@@ -177,10 +177,19 @@ module Mongo
177
177
  #
178
178
  # @param buffer [String] buffer where the message should be inserted
179
179
  # @return [String] buffer containing the serialized message
180
- def serialize(buffer = BSON::ByteBuffer.new, max_bson_size = nil)
180
+ def serialize(buffer = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil)
181
+ max_size =
182
+ if max_bson_size && bson_overhead
183
+ max_bson_size + bson_overhead
184
+ elsif max_bson_size
185
+ max_bson_size
186
+ else
187
+ nil
188
+ end
189
+
181
190
  start = buffer.length
182
191
  serialize_header(buffer)
183
- serialize_fields(buffer, max_bson_size)
192
+ serialize_fields(buffer, max_size)
184
193
  buffer.replace_int32(start, buffer.length - start)
185
194
  end
186
195
 
@@ -146,7 +146,7 @@ module Mongo
146
146
  # @return [ BSON::ByteBuffer ] buffer containing the serialized message.
147
147
  #
148
148
  # @since 2.5.0
149
- def serialize(buffer = BSON::ByteBuffer.new, max_bson_size = nil)
149
+ def serialize(buffer = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil)
150
150
  validate_document_size!(max_bson_size)
151
151
 
152
152
  super
@@ -115,12 +115,48 @@ module Mongo
115
115
  compress_if_possible(selector.keys.first, compressor, zlib_compression_level)
116
116
  end
117
117
 
118
+ # Serializes message into bytes that can be sent on the wire.
119
+ #
120
+ # @param [ BSON::ByteBuffer ] buffer where the message should be inserted.
121
+ # @param [ Integer ] max_bson_size The maximum bson object size.
122
+ #
123
+ # @return [ BSON::ByteBuffer ] buffer containing the serialized message.
124
+ def serialize(buffer = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil)
125
+ validate_document_size!(max_bson_size)
126
+
127
+ super
128
+ end
129
+
118
130
  protected
119
131
 
120
132
  attr_reader :upconverter
121
133
 
122
134
  private
123
135
 
136
+ # Validate that the documents in this message are all smaller than the
137
+ # maxBsonObjectSize. If not, raise an exception.
138
+ def validate_document_size!(max_bson_size)
139
+ max_bson_size ||= Mongo::Server::ConnectionBase::DEFAULT_MAX_BSON_OBJECT_SIZE
140
+
141
+ documents = if @selector.key?(:documents)
142
+ @selector[:documents]
143
+ elsif @selector.key?(:deletes)
144
+ @selector[:deletes]
145
+ elsif @selector.key?(:updates)
146
+ @selector[:updates]
147
+ else
148
+ []
149
+ end
150
+
151
+ contains_too_large_document = documents.any? do |doc|
152
+ doc.to_bson.length > max_bson_size
153
+ end
154
+
155
+ if contains_too_large_document
156
+ raise Error::MaxBSONSize.new('The document exceeds maximum allowed BSON object size after serialization')
157
+ end
158
+ end
159
+
124
160
  # The operation code required to specify a Query message.
125
161
  # @return [Fixnum] the operation code.
126
162
  #
@@ -204,10 +204,8 @@ module Mongo
204
204
  if message.bulk_write?
205
205
  # Make the new maximum size equal to the specified reduced size
206
206
  # limit plus the 16KiB overhead allowance.
207
- max_bson_size = REDUCED_MAX_BSON_SIZE + MAX_BSON_COMMAND_OVERHEAD
207
+ max_bson_size = REDUCED_MAX_BSON_SIZE
208
208
  end
209
- else
210
- max_bson_size += MAX_BSON_COMMAND_OVERHEAD
211
209
  end
212
210
 
213
211
  # RUBY-2234: It is necessary to check that the message size does not
@@ -232,7 +230,7 @@ module Mongo
232
230
  # TODO: address the fact that this line mutates the buffer.
233
231
  temp_buffer.put_bytes(buffer.get_bytes(buffer.length))
234
232
 
235
- message.serialize(temp_buffer, max_bson_size)
233
+ message.serialize(temp_buffer, max_bson_size, MAX_BSON_COMMAND_OVERHEAD)
236
234
  if temp_buffer.length > max_message_size
237
235
  raise Error::MaxMessageSize.new(max_message_size)
238
236
  end
@@ -243,7 +241,7 @@ module Mongo
243
241
  # layer should be refactored to allow compression on an already-
244
242
  # serialized message.
245
243
  final_message = message.maybe_compress(compressor, options[:zlib_compression_level])
246
- final_message.serialize(buffer, max_bson_size)
244
+ final_message.serialize(buffer, max_bson_size, MAX_BSON_COMMAND_OVERHEAD)
247
245
 
248
246
  buffer
249
247
  end
@@ -17,5 +17,5 @@ module Mongo
17
17
  # The current version of the driver.
18
18
  #
19
19
  # @since 2.0.0
20
- VERSION = '2.13.0'.freeze
20
+ VERSION = '2.13.1'.freeze
21
21
  end
@@ -256,6 +256,43 @@ describe 'Client authentication options' do
256
256
  expect(client.options[:auth_mech_properties]).to eq({ 'service_name' => 'mongodb' })
257
257
  end
258
258
  end
259
+
260
+ context 'when properties are given but not service name' do
261
+ context 'with URI options' do
262
+ let(:credentials) { "#{user}:#{pwd}@" }
263
+
264
+ context 'with default auth mech properties' do
265
+ let(:options) { '?authMechanism=GSSAPI&authMechanismProperties=service_realm:foo' }
266
+
267
+ it 'sets service name to mongodb' do
268
+ expect(client.options[:auth_mech_properties]).to eq(
269
+ 'service_name' => 'mongodb',
270
+ 'service_realm' => 'foo',
271
+ )
272
+ end
273
+ end
274
+ end
275
+
276
+ context 'with client options' do
277
+ let(:client_opts) do
278
+ {
279
+ auth_mech: :gssapi,
280
+ user: user,
281
+ password: pwd,
282
+ auth_mech_properties: {
283
+ service_realm: 'foo',
284
+ }.freeze,
285
+ }.freeze
286
+ end
287
+
288
+ it 'sets default auth mech properties' do
289
+ expect(client.options[:auth_mech_properties]).to eq(
290
+ 'service_name' => 'mongodb',
291
+ 'service_realm' => 'foo',
292
+ )
293
+ end
294
+ end
295
+ end
259
296
  end
260
297
 
261
298
  context 'with PLAIN auth mechanism' do
@@ -162,15 +162,19 @@ describe 'Bulk writes with auto-encryption enabled' do
162
162
  context 'when one operation is larger than 16MiB' do
163
163
  let(:requests) do
164
164
  [
165
- { update_one: { filter: { _id: 1 }, update: { ssn: 'a' * (Mongo::Server::ConnectionBase::DEFAULT_MAX_BSON_OBJECT_SIZE - 100) } } },
165
+ { update_one: { filter: { _id: 1 }, update: { ssn: 'a' * (Mongo::Server::ConnectionBase::DEFAULT_MAX_BSON_OBJECT_SIZE) } } },
166
166
  { update_one: { filter: { _id: 2 }, update: { ssn: 'a' * size_limit } } },
167
167
  ]
168
168
  end
169
169
 
170
+ before do
171
+ expect(requests.first.to_bson.length).to be > Mongo::Server::ConnectionBase::DEFAULT_MAX_BSON_OBJECT_SIZE
172
+ end
173
+
170
174
  it 'raises an exception' do
171
175
  expect do
172
176
  bulk_write.execute
173
- end.to raise_error(Mongo::Error::MaxBSONSize, /maximum allowed size: 16777216 bytes/)
177
+ end.to raise_error(Mongo::Error::MaxBSONSize, /The document exceeds maximum allowed BSON object size after serialization/)
174
178
  end
175
179
  end
176
180
  end
@@ -62,30 +62,31 @@ describe 'BSON & command size limits' do
62
62
  authorized_collection.insert_one(document)
63
63
  end
64
64
 
65
- context 'on server versions >= 3.6' do
66
- min_server_fcv '3.6'
65
+ it 'fails on the driver when a document larger than 16MiB is inserted' do
66
+ document = { key: 'a' * (max_document_size - 27), _id: 'foo' }
67
+ expect(document.to_bson.length).to eq(max_document_size+1)
67
68
 
68
- it 'fails on the driver when a document larger than 16MiB is inserted' do
69
- document = { key: 'a' * (max_document_size - 27), _id: 'foo' }
70
- expect(document.to_bson.length).to eq(max_document_size+1)
71
-
72
- lambda do
73
- authorized_collection.insert_one(document)
74
- end.should raise_error(Mongo::Error::MaxBSONSize, /The document exceeds maximum allowed BSON object size after serialization/)
75
- end
69
+ lambda do
70
+ authorized_collection.insert_one(document)
71
+ end.should raise_error(Mongo::Error::MaxBSONSize, /The document exceeds maximum allowed BSON object size after serialization/)
76
72
  end
77
73
 
78
- context 'on server versions <= 3.4' do
79
- max_server_fcv '3.4'
74
+ it 'fails on the driver when an update larger than 16MiB is performed' do
75
+ document = { key: 'a' * (max_document_size - 14) }
76
+ expect(document.to_bson.length).to eq(max_document_size+1)
77
+
78
+ lambda do
79
+ authorized_collection.update_one({ _id: 'foo' }, document)
80
+ end.should raise_error(Mongo::Error::MaxBSONSize, /The document exceeds maximum allowed BSON object size after serialization/)
81
+ end
80
82
 
81
- it 'fails on the server when a document larger than 16MiB is inserted' do
82
- document = { key: 'a' * (max_document_size - 27), _id: 'foo' }
83
- expect(document.to_bson.length).to eq(max_document_size+1)
83
+ it 'fails on the driver when an delete larger than 16MiB is performed' do
84
+ document = { key: 'a' * (max_document_size - 14) }
85
+ expect(document.to_bson.length).to eq(max_document_size+1)
84
86
 
85
- lambda do
86
- authorized_collection.insert_one(document)
87
- end.should raise_error(Mongo::Error::OperationFailure, /object to insert too large/)
88
- end
87
+ lambda do
88
+ authorized_collection.delete_one(document)
89
+ end.should raise_error(Mongo::Error::MaxBSONSize, /The document exceeds maximum allowed BSON object size after serialization/)
89
90
  end
90
91
 
91
92
  it 'fails in the driver when a document larger than 16MiB+16KiB is inserted' do
@@ -2092,6 +2092,7 @@ describe Mongo::Client do
2092
2092
  sdam_proc: sdam_proc,
2093
2093
  connect_timeout: 3.08, socket_timeout: 3.09,
2094
2094
  server_selection_timeout: 2.92,
2095
+ heartbeat_frequency: 100,
2095
2096
  database: SpecConfig.instance.test_db))
2096
2097
  end
2097
2098
 
@@ -2112,6 +2113,10 @@ describe Mongo::Client do
2112
2113
  end
2113
2114
 
2114
2115
  it 'does not notify subscribers set up by sdam_proc' do
2116
+ # On 4.4, the push monitor also is receiving heartbeats.
2117
+ # Give those some time to be processed.
2118
+ sleep 2
2119
+
2115
2120
  expect(subscriber.started_events.length).to be > 0
2116
2121
  subscriber.started_events.clear
2117
2122
 
@@ -2119,6 +2124,12 @@ describe Mongo::Client do
2119
2124
  # subscriber may receive events from the original client.
2120
2125
 
2121
2126
  new_client.cluster.next_primary
2127
+
2128
+ # Diagnostics
2129
+ unless subscriber.started_events.empty?
2130
+ p subscriber.started_events
2131
+ end
2132
+
2122
2133
  expect(subscriber.started_events.length).to eq 0
2123
2134
  new_client.cluster.topology.class.should_not be Mongo::Cluster::Topology::Unknown
2124
2135
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongo
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.13.0
4
+ version: 2.13.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tyler Brock
@@ -31,7 +31,7 @@ cert_chain:
31
31
  gpvfPNWMwyBDlHaNS3GfO6cRRxBOvEG05GUCsvtTY4Bpe8yjE64wg1ymb47LMOnv
32
32
  Qb1lGORmf/opg45mluKUYl7pQNZHD0d3
33
33
  -----END CERTIFICATE-----
34
- date: 2020-07-30 00:00:00.000000000 Z
34
+ date: 2020-10-09 00:00:00.000000000 Z
35
35
  dependencies:
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: bson
metadata.gz.sig CHANGED
Binary file