mongo 2.12.3 → 2.12.4
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/mongo/client.rb +13 -2
- data/lib/mongo/collection.rb +6 -2
- data/lib/mongo/error/operation_failure.rb +5 -5
- data/lib/mongo/protocol/message.rb +11 -2
- data/lib/mongo/protocol/msg.rb +1 -1
- data/lib/mongo/protocol/query.rb +36 -0
- data/lib/mongo/server/connection_base.rb +3 -5
- data/lib/mongo/version.rb +1 -1
- data/spec/integration/client_authentication_options_spec.rb +37 -0
- data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +6 -2
- data/spec/integration/size_limit_spec.rb +20 -19
- metadata +2 -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: c810c7a786a9400b9a55c53b59a8078ec63e57703e8cf564e5001188cd33144b
|
4
|
+
data.tar.gz: 2230cea6d335950d790fb19f414113f7115241ce105d228f7e42a06606795b5e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1c0fd06e7e5e937ddb6a2c27f98574e79cf39e71f10a41b874186478708db34bcc6c9fa0a2cf5d191bf57ef35c613fbc40a47b8fca3ee660bd7e92dbb4f4b956
|
7
|
+
data.tar.gz: 28f1e23f087f9944ba3f236d78621e48b7fe91b7c75b57e9eac44d67dbe0f345c19d6be2ec96700e36de4952126fe42997702bd018eda9a70e2c25701991853a
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/lib/mongo/client.rb
CHANGED
@@ -446,7 +446,18 @@ module Mongo
|
|
446
446
|
# construction
|
447
447
|
sdam_proc = options.delete(:sdam_proc)
|
448
448
|
|
449
|
-
|
449
|
+
# For gssapi service_name, the default option is given in a hash
|
450
|
+
# (one level down from the top level).
|
451
|
+
merged_options = default_options(options)
|
452
|
+
options.each do |k, v|
|
453
|
+
default_v = merged_options[k]
|
454
|
+
if Hash === default_v
|
455
|
+
v = default_v.merge(v)
|
456
|
+
end
|
457
|
+
merged_options[k] = v
|
458
|
+
end
|
459
|
+
options = merged_options
|
460
|
+
|
450
461
|
@options = validate_new_options!(options)
|
451
462
|
=begin WriteConcern object support
|
452
463
|
if @options[:write_concern].is_a?(WriteConcern::Base)
|
@@ -605,7 +616,7 @@ module Mongo
|
|
605
616
|
#
|
606
617
|
# @return [ BSON::Document ] The user-defined read preference.
|
607
618
|
# The document may have the following fields:
|
608
|
-
# - *:
|
619
|
+
# - *:mode* -- read preference specified as a symbol; valid values are
|
609
620
|
# *:primary*, *:primary_preferred*, *:secondary*, *:secondary_preferred*
|
610
621
|
# and *:nearest*.
|
611
622
|
# - *:tag_sets* -- an array of hashes.
|
data/lib/mongo/collection.rb
CHANGED
@@ -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
|
-
|
282
|
-
|
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.
|
@@ -89,7 +89,8 @@ module Mongo
|
|
89
89
|
# @since 2.1.1
|
90
90
|
# @deprecated
|
91
91
|
def retryable?
|
92
|
-
write_retryable? ||
|
92
|
+
write_retryable? ||
|
93
|
+
code.nil? && RETRY_MESSAGES.any?{ |m| message.include?(m) }
|
93
94
|
end
|
94
95
|
|
95
96
|
# Whether the error is a retryable error according to the modern retryable
|
@@ -102,11 +103,11 @@ module Mongo
|
|
102
103
|
#
|
103
104
|
# @since 2.4.2
|
104
105
|
def write_retryable?
|
105
|
-
|
106
|
-
|
106
|
+
write_retryable_code? ||
|
107
|
+
code.nil? && WRITE_RETRY_MESSAGES.any? { |m| message.include?(m) }
|
107
108
|
end
|
108
109
|
|
109
|
-
def write_retryable_code?
|
110
|
+
private def write_retryable_code?
|
110
111
|
if code
|
111
112
|
WRITE_RETRY_ERRORS.any? { |e| e[:code] == code }
|
112
113
|
else
|
@@ -114,7 +115,6 @@ module Mongo
|
|
114
115
|
false
|
115
116
|
end
|
116
117
|
end
|
117
|
-
private :write_retryable_code?
|
118
118
|
|
119
119
|
# Error codes and code names that should result in a failing getMore
|
120
120
|
# 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,
|
192
|
+
serialize_fields(buffer, max_size)
|
184
193
|
buffer.replace_int32(start, buffer.length - start)
|
185
194
|
end
|
186
195
|
|
data/lib/mongo/protocol/msg.rb
CHANGED
@@ -139,7 +139,7 @@ module Mongo
|
|
139
139
|
# @return [ BSON::ByteBuffer ] buffer containing the serialized message.
|
140
140
|
#
|
141
141
|
# @since 2.5.0
|
142
|
-
def serialize(buffer = BSON::ByteBuffer.new, max_bson_size = nil)
|
142
|
+
def serialize(buffer = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil)
|
143
143
|
validate_document_size!(max_bson_size)
|
144
144
|
|
145
145
|
super
|
data/lib/mongo/protocol/query.rb
CHANGED
@@ -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
|
#
|
@@ -189,10 +189,8 @@ module Mongo
|
|
189
189
|
if message.bulk_write?
|
190
190
|
# Make the new maximum size equal to the specified reduced size
|
191
191
|
# limit plus the 16KiB overhead allowance.
|
192
|
-
max_bson_size = REDUCED_MAX_BSON_SIZE
|
192
|
+
max_bson_size = REDUCED_MAX_BSON_SIZE
|
193
193
|
end
|
194
|
-
else
|
195
|
-
max_bson_size += MAX_BSON_COMMAND_OVERHEAD
|
196
194
|
end
|
197
195
|
|
198
196
|
# RUBY-2234: It is necessary to check that the message size does not
|
@@ -217,7 +215,7 @@ module Mongo
|
|
217
215
|
# TODO: address the fact that this line mutates the buffer.
|
218
216
|
temp_buffer.put_bytes(buffer.get_bytes(buffer.length))
|
219
217
|
|
220
|
-
message.serialize(temp_buffer, max_bson_size)
|
218
|
+
message.serialize(temp_buffer, max_bson_size, MAX_BSON_COMMAND_OVERHEAD)
|
221
219
|
if temp_buffer.length > max_message_size
|
222
220
|
raise Error::MaxMessageSize.new(max_message_size)
|
223
221
|
end
|
@@ -228,7 +226,7 @@ module Mongo
|
|
228
226
|
# layer should be refactored to allow compression on an already-
|
229
227
|
# serialized message.
|
230
228
|
final_message = message.maybe_compress(compressor, options[:zlib_compression_level])
|
231
|
-
final_message.serialize(buffer, max_bson_size)
|
229
|
+
final_message.serialize(buffer, max_bson_size, MAX_BSON_COMMAND_OVERHEAD)
|
232
230
|
|
233
231
|
buffer
|
234
232
|
end
|
data/lib/mongo/version.rb
CHANGED
@@ -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
|
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
|
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
|
-
|
66
|
-
|
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
|
-
|
69
|
-
document
|
70
|
-
|
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
|
-
|
79
|
-
|
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
|
-
|
82
|
-
|
83
|
-
|
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
|
-
|
86
|
-
|
87
|
-
|
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
|
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.12.
|
4
|
+
version: 2.12.4
|
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-
|
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
|