mongo 2.13.0 → 2.13.1

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: 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