mongo 2.19.0 → 2.19.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/lib/mongo/client.rb +25 -0
- data/lib/mongo/collection/view/iterable.rb +15 -0
- data/lib/mongo/collection/view.rb +1 -0
- data/lib/mongo/collection.rb +3 -1
- data/lib/mongo/error/invalid_max_connecting.rb +28 -0
- data/lib/mongo/error.rb +1 -0
- data/lib/mongo/operation/shared/sessions_supported.rb +0 -1
- data/lib/mongo/server/connection_pool.rb +100 -46
- data/lib/mongo/uri/options_mapper.rb +1 -0
- data/lib/mongo/version.rb +1 -1
- data/spec/integration/docs_examples_spec.rb +1 -1
- data/spec/integration/find_options_spec.rb +227 -0
- data/spec/lite_spec_helper.rb +5 -1
- data/spec/mongo/client_construction_spec.rb +48 -0
- data/spec/mongo/collection_ddl_spec.rb +8 -4
- data/spec/mongo/collection_spec.rb +8 -4
- data/spec/mongo/protocol/msg_spec.rb +1 -62
- data/spec/mongo/uri/srv_protocol_spec.rb +12 -0
- data/spec/runners/unified/test.rb +12 -12
- data/spec/spec_tests/data/client_side_encryption/bypassedCommand.yml +5 -4
- data/spec/spec_tests/data/cmap/pool-checkout-minPoolSize-connection-maxConnecting.yml +2 -4
- data/spec/spec_tests/data/unified/valid-pass/collectionData-createOptions.yml +37 -0
- data.tar.gz.sig +0 -0
- metadata +7 -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: 455d5b9685fd2cefa18a1c37e81ddb97a177ac8e40b9298945e4f126ac9ce093
|
4
|
+
data.tar.gz: fab0630edde803ab5125536159e8fbd12d3f0bac233e87d40ea1e414287145ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f3db945520bf825c31fcd7a21295b03257b1ee01d3d2eb6903f69ae6dfdbb0834516c8214227196702f88e087754780a876941eb5a3ac8f0861bff40a3e55a07
|
7
|
+
data.tar.gz: 73ea3f0a4fc86ba9922c1054f925db03eab8ac3da47bd9b9daae5006af1f32299c3d1a45104623126db5c89e41bf3ddbfe82dd641ea77dce6d8936a5297a1880
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/lib/mongo/client.rb
CHANGED
@@ -71,6 +71,7 @@ module Mongo
|
|
71
71
|
:local_threshold,
|
72
72
|
:logger,
|
73
73
|
:log_prefix,
|
74
|
+
:max_connecting,
|
74
75
|
:max_idle_time,
|
75
76
|
:max_pool_size,
|
76
77
|
:max_read_retries,
|
@@ -266,6 +267,12 @@ module Mongo
|
|
266
267
|
# @option options [ String ] :log_prefix A custom log prefix to use when
|
267
268
|
# logging. This option is experimental and subject to change in a future
|
268
269
|
# version of the driver.
|
270
|
+
# @option options [ Integer ] :max_connecting The maximum number of
|
271
|
+
# connections that can be connecting simultaneously. The default is 2.
|
272
|
+
# This option should be increased if there are many threads that share
|
273
|
+
# the same client and the application is experiencing timeouts
|
274
|
+
# while waiting for connections to be established.
|
275
|
+
# selecting a server for an operation. The default is 2.
|
269
276
|
# @option options [ Integer ] :max_idle_time The maximum seconds a socket can remain idle
|
270
277
|
# since it has been checked in to the pool.
|
271
278
|
# @option options [ Integer ] :max_pool_size The maximum size of the
|
@@ -1318,6 +1325,7 @@ module Mongo
|
|
1318
1325
|
key = k.to_sym
|
1319
1326
|
if VALID_OPTIONS.include?(key)
|
1320
1327
|
validate_max_min_pool_size!(key, opts)
|
1328
|
+
validate_max_connecting!(key, opts)
|
1321
1329
|
validate_read!(key, opts)
|
1322
1330
|
if key == :compressors
|
1323
1331
|
compressors = valid_compressors(v)
|
@@ -1580,6 +1588,23 @@ module Mongo
|
|
1580
1588
|
true
|
1581
1589
|
end
|
1582
1590
|
|
1591
|
+
# Validates whether the max_connecting option is valid.
|
1592
|
+
#
|
1593
|
+
# @param [ Symbol ] option The option to validate.
|
1594
|
+
# @param [ Hash ] opts The client options.
|
1595
|
+
#
|
1596
|
+
# @return [ true ] If the option is valid.
|
1597
|
+
# @raise [ Error::InvalidMaxConnecting ] If the option is invalid.
|
1598
|
+
def validate_max_connecting!(option, opts)
|
1599
|
+
if option == :max_connecting && opts.key?(:max_connecting)
|
1600
|
+
max_connecting = opts[:max_connecting] || Server::ConnectionPool::DEFAULT_MAX_CONNECTING
|
1601
|
+
if max_connecting <= 0
|
1602
|
+
raise Error::InvalidMaxConnecting.new(opts[:max_connecting])
|
1603
|
+
end
|
1604
|
+
end
|
1605
|
+
true
|
1606
|
+
end
|
1607
|
+
|
1583
1608
|
def validate_read!(option, opts)
|
1584
1609
|
if option == :read && opts.has_key?(:read)
|
1585
1610
|
read = opts[:read]
|
@@ -185,6 +185,8 @@ module Mongo
|
|
185
185
|
collection.client.log_warn("The :oplog_replay option is deprecated and ignored by MongoDB 4.4 and later")
|
186
186
|
end
|
187
187
|
|
188
|
+
maybe_set_tailable_options(spec)
|
189
|
+
|
188
190
|
if explained?
|
189
191
|
spec[:explain] = options[:explain]
|
190
192
|
Operation::Explain.new(spec)
|
@@ -200,6 +202,19 @@ module Mongo
|
|
200
202
|
def use_query_cache?
|
201
203
|
QueryCache.enabled? && !collection.system_collection?
|
202
204
|
end
|
205
|
+
|
206
|
+
# Add tailable cusror options to the command specifiction if needed.
|
207
|
+
#
|
208
|
+
# @param [ Hash ] spec The command specification.
|
209
|
+
def maybe_set_tailable_options(spec)
|
210
|
+
case cursor_type
|
211
|
+
when :tailable
|
212
|
+
spec[:tailable] = true
|
213
|
+
when :tailable_await
|
214
|
+
spec[:tailable] = true
|
215
|
+
spec[:await_data] = true
|
216
|
+
end
|
217
|
+
end
|
203
218
|
end
|
204
219
|
end
|
205
220
|
end
|
@@ -127,6 +127,7 @@ module Mongo
|
|
127
127
|
# return in each response from MongoDB.
|
128
128
|
# @option options [ Hash ] :collation The collation to use.
|
129
129
|
# @option options [ String ] :comment Associate a comment with the query.
|
130
|
+
# @option options [ :tailable, :tailable_await ] :cursor_type The type of cursor to use.
|
130
131
|
# @option options [ Hash ] :explain Execute an explain with the provided
|
131
132
|
# explain options (known options are :verbose and :verbosity) rather
|
132
133
|
# than a find.
|
data/lib/mongo/collection.rb
CHANGED
@@ -314,7 +314,9 @@ module Mongo
|
|
314
314
|
#
|
315
315
|
# @since 2.0.0
|
316
316
|
def capped?
|
317
|
-
database.
|
317
|
+
database.list_collections(filter: { name: name })
|
318
|
+
.first
|
319
|
+
&.dig('options', CAPPED) || false
|
318
320
|
end
|
319
321
|
|
320
322
|
# Force the collection to be created in the database.
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright (C) 2014-present MongoDB Inc.
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
|
17
|
+
module Mongo
|
18
|
+
class Error
|
19
|
+
# Exception that is raised when trying to create a client with an invalid
|
20
|
+
# max_connecting option.
|
21
|
+
class InvalidMaxConnecting < Error
|
22
|
+
# Instantiate the new exception.
|
23
|
+
def initialize(max_connecting)
|
24
|
+
super("Invalid max_connecting: #{max_connecting}. Please ensure that it is greater than zero. ")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/mongo/error.rb
CHANGED
@@ -159,6 +159,7 @@ require 'mongo/error/invalid_database_name'
|
|
159
159
|
require 'mongo/error/invalid_document'
|
160
160
|
require 'mongo/error/invalid_file'
|
161
161
|
require 'mongo/error/invalid_file_revision'
|
162
|
+
require 'mongo/error/invalid_max_connecting'
|
162
163
|
require 'mongo/error/invalid_min_pool_size'
|
163
164
|
require 'mongo/error/invalid_read_option'
|
164
165
|
require 'mongo/error/invalid_application_name'
|
@@ -29,12 +29,16 @@ module Mongo
|
|
29
29
|
# The default max size for the connection pool.
|
30
30
|
#
|
31
31
|
# @since 2.9.0
|
32
|
-
DEFAULT_MAX_SIZE = 20
|
32
|
+
DEFAULT_MAX_SIZE = 20
|
33
33
|
|
34
34
|
# The default min size for the connection pool.
|
35
35
|
#
|
36
36
|
# @since 2.9.0
|
37
|
-
DEFAULT_MIN_SIZE = 0
|
37
|
+
DEFAULT_MIN_SIZE = 0
|
38
|
+
|
39
|
+
# The default maximum number of connections that can be connecting at
|
40
|
+
# any given time.
|
41
|
+
DEFAULT_MAX_CONNECTING = 2
|
38
42
|
|
39
43
|
# The default timeout, in seconds, to wait for a connection.
|
40
44
|
#
|
@@ -61,6 +65,11 @@ module Mongo
|
|
61
65
|
#
|
62
66
|
# @option options [ Integer ] :max_size The maximum pool size. Setting
|
63
67
|
# this option to zero creates an unlimited connection pool.
|
68
|
+
# @option options [ Integer ] :max_connecting The maximum number of
|
69
|
+
# connections that can be connecting simultaneously. The default is 2.
|
70
|
+
# This option should be increased if there are many threads that share
|
71
|
+
# same connection pool and the application is experiencing timeouts
|
72
|
+
# while waiting for connections to be established.
|
64
73
|
# @option options [ Integer ] :max_pool_size Deprecated.
|
65
74
|
# The maximum pool size. If max_size is also given, max_size and
|
66
75
|
# max_pool_size must be identical.
|
@@ -89,6 +98,7 @@ module Mongo
|
|
89
98
|
# any connections created by the pool.
|
90
99
|
#
|
91
100
|
# @since 2.0.0, API changed in 2.9.0
|
101
|
+
|
92
102
|
def initialize(server, options = {})
|
93
103
|
unless server.is_a?(Server)
|
94
104
|
raise ArgumentError, 'First argument must be a Server instance'
|
@@ -146,7 +156,7 @@ module Mongo
|
|
146
156
|
# Condition variable to enforce the first check in check_out: max_pool_size.
|
147
157
|
# This condition variable should be signaled when the number of
|
148
158
|
# unavailable connections decreases (pending + pending_connections +
|
149
|
-
#
|
159
|
+
# checked_out_connections).
|
150
160
|
@size_cv = Mongo::ConditionVariable.new(@lock)
|
151
161
|
# This represents the number of threads that have made it past the size_cv
|
152
162
|
# gate but have not acquired a connection to add to the pending_connections
|
@@ -157,7 +167,7 @@ module Mongo
|
|
157
167
|
# Thei condition variable should be signaled when the number of pending
|
158
168
|
# connections decreases.
|
159
169
|
@max_connecting_cv = Mongo::ConditionVariable.new(@lock)
|
160
|
-
@max_connecting = options.fetch(:max_connecting,
|
170
|
+
@max_connecting = options.fetch(:max_connecting, DEFAULT_MAX_CONNECTING)
|
161
171
|
|
162
172
|
ObjectSpace.define_finalizer(self, self.class.finalize(@available_connections, @pending_connections, @populator))
|
163
173
|
|
@@ -1074,7 +1084,8 @@ module Mongo
|
|
1074
1084
|
"from pool for #{@server.address}#{connection_global_id_msg} after #{wait_timeout} sec. " +
|
1075
1085
|
"Connections in pool: #{@available_connections.length} available, " +
|
1076
1086
|
"#{@checked_out_connections.length} checked out, " +
|
1077
|
-
"#{@pending_connections.length
|
1087
|
+
"#{@pending_connections.length} pending, " +
|
1088
|
+
"#{@connection_requests} connections requests " +
|
1078
1089
|
"(max size: #{max_size})"
|
1079
1090
|
raise Error::ConnectionCheckOutTimeout.new(msg, address: @server.address)
|
1080
1091
|
end
|
@@ -1170,7 +1181,6 @@ module Mongo
|
|
1170
1181
|
# one. If no connection exists and the pool is at max size, wait until
|
1171
1182
|
# a connection is checked back into the pool.
|
1172
1183
|
#
|
1173
|
-
# @param [ Float ] deadline The deadline to get the connection.
|
1174
1184
|
# @param [ Integer ] pid The current process id.
|
1175
1185
|
# @param [ Integer ] connection_global_id The global id for the
|
1176
1186
|
# connection to check out.
|
@@ -1180,17 +1190,22 @@ module Mongo
|
|
1180
1190
|
# @raise [ Error::PoolClosedError ] If the pool has been closed.
|
1181
1191
|
# @raise [ Timeout::Error ] If the connection pool is at maximum size
|
1182
1192
|
# and remains so for longer than the wait timeout.
|
1183
|
-
def get_connection(
|
1193
|
+
def get_connection(pid, connection_global_id)
|
1184
1194
|
if connection = next_available_connection(connection_global_id)
|
1185
1195
|
unless valid_available_connection?(connection, pid, connection_global_id)
|
1186
1196
|
return nil
|
1187
1197
|
end
|
1188
1198
|
|
1199
|
+
# We've got a connection, so we decrement the number of connection
|
1200
|
+
# requests.
|
1201
|
+
# We do not need to signal condition variable here, because
|
1202
|
+
# because the execution will continue, and we signal later.
|
1203
|
+
@connection_requests -= 1
|
1204
|
+
|
1189
1205
|
# If the connection is connected, it's not considered a
|
1190
1206
|
# "pending connection". The pending_connections list represents
|
1191
1207
|
# the set of connections that are awaiting connection.
|
1192
1208
|
unless connection.connected?
|
1193
|
-
@connection_requests -= 1
|
1194
1209
|
@pending_connections << connection
|
1195
1210
|
end
|
1196
1211
|
return connection
|
@@ -1207,6 +1222,9 @@ module Mongo
|
|
1207
1222
|
Monitoring::Event::Cmap::ConnectionCheckOutFailed::CONNECTION_ERROR
|
1208
1223
|
),
|
1209
1224
|
)
|
1225
|
+
# We're going to raise, so we need to decrement the number of
|
1226
|
+
# connection requests.
|
1227
|
+
decrement_connection_requests_and_signal
|
1210
1228
|
raise Error::MissingConnection.new
|
1211
1229
|
end
|
1212
1230
|
end
|
@@ -1237,7 +1255,6 @@ module Mongo
|
|
1237
1255
|
connection = nil
|
1238
1256
|
|
1239
1257
|
@lock.synchronize do
|
1240
|
-
|
1241
1258
|
# The first gate to checking out a connection. Make sure the number of
|
1242
1259
|
# unavailable connections is less than the max pool size.
|
1243
1260
|
until max_size == 0 || unavailable_connections < max_size
|
@@ -1247,60 +1264,97 @@ module Mongo
|
|
1247
1264
|
raise_if_not_ready!
|
1248
1265
|
end
|
1249
1266
|
@connection_requests += 1
|
1267
|
+
connection = wait_for_connection(connection_global_id, deadline)
|
1268
|
+
end
|
1250
1269
|
|
1251
|
-
|
1252
|
-
# The second gate to checking out a connection. Make sure 1) there
|
1253
|
-
# exists an available connection and 2) we are under max_connecting.
|
1254
|
-
until @available_connections.any? || @pending_connections.length < @max_connecting
|
1255
|
-
wait = deadline - Utils.monotonic_time
|
1256
|
-
raise_check_out_timeout!(connection_global_id) if wait <= 0
|
1257
|
-
@max_connecting_cv.wait(wait)
|
1258
|
-
raise_if_not_ready!
|
1259
|
-
end
|
1270
|
+
connect_or_raise(connection) unless connection.connected?
|
1260
1271
|
|
1261
|
-
|
1262
|
-
|
1263
|
-
|
1272
|
+
@lock.synchronize do
|
1273
|
+
@checked_out_connections << connection
|
1274
|
+
if @pending_connections.include?(connection)
|
1275
|
+
@pending_connections.delete(connection)
|
1264
1276
|
end
|
1277
|
+
@max_connecting_cv.signal
|
1278
|
+
# no need to signal size_cv here since the number of unavailable
|
1279
|
+
# connections is unchanged.
|
1265
1280
|
end
|
1266
1281
|
|
1267
|
-
|
1268
|
-
|
1269
|
-
|
1270
|
-
|
1271
|
-
|
1272
|
-
|
1273
|
-
|
1274
|
-
|
1275
|
-
|
1282
|
+
connection
|
1283
|
+
end
|
1284
|
+
|
1285
|
+
# Waits for a connection to become available, or raises is no connection
|
1286
|
+
# becomes available before the timeout.
|
1287
|
+
# @param [ Integer ] connection_global_id The global id for the
|
1288
|
+
# connection to check out.
|
1289
|
+
# @param [ Float ] deadline The time at which to stop waiting.
|
1290
|
+
#
|
1291
|
+
# @return [ Mongo::Server::Connection ] The checked out connection.
|
1292
|
+
def wait_for_connection(connection_global_id, deadline)
|
1293
|
+
connection = nil
|
1294
|
+
while connection.nil?
|
1295
|
+
# The second gate to checking out a connection. Make sure 1) there
|
1296
|
+
# exists an available connection and 2) we are under max_connecting.
|
1297
|
+
until @available_connections.any? || @pending_connections.length < @max_connecting
|
1298
|
+
wait = deadline - Utils.monotonic_time
|
1299
|
+
if wait <= 0
|
1300
|
+
# We are going to raise a timeout error, so the connection
|
1301
|
+
# request is not going to be fulfilled. Decrement the counter
|
1302
|
+
# here.
|
1303
|
+
decrement_connection_requests_and_signal
|
1304
|
+
raise_check_out_timeout!(connection_global_id)
|
1276
1305
|
end
|
1277
|
-
@max_connecting_cv.
|
1278
|
-
|
1306
|
+
@max_connecting_cv.wait(wait)
|
1307
|
+
# We do not need to decrement the connection_requests counter
|
1308
|
+
# or signal here because the pool is not ready yet.
|
1309
|
+
raise_if_not_ready!
|
1279
1310
|
end
|
1280
|
-
@populate_semaphore.signal
|
1281
1311
|
|
1282
|
-
|
1283
|
-
|
1284
|
-
|
1285
|
-
|
1286
|
-
|
1287
|
-
|
1288
|
-
|
1312
|
+
connection = get_connection(Process.pid, connection_global_id)
|
1313
|
+
wait = deadline - Utils.monotonic_time
|
1314
|
+
if connection.nil? && wait <= 0
|
1315
|
+
# connection is nil here, it means that get_connection method
|
1316
|
+
# did not create a new connection; therefore, it did not decrease
|
1317
|
+
# the connection_requests counter. We need to do it here.
|
1318
|
+
decrement_connection_requests_and_signal
|
1319
|
+
raise_check_out_timeout!(connection_global_id)
|
1320
|
+
end
|
1289
1321
|
end
|
1290
1322
|
|
1323
|
+
connection
|
1324
|
+
end
|
1325
|
+
|
1326
|
+
# Connects a connection and raises an exception if the connection
|
1327
|
+
# cannot be connected.
|
1328
|
+
# This method also publish corresponding event and ensures that counters
|
1329
|
+
# and condition variables are updated.
|
1330
|
+
def connect_or_raise(connection)
|
1331
|
+
connect_connection(connection)
|
1332
|
+
rescue Exception
|
1333
|
+
# Handshake or authentication failed
|
1291
1334
|
@lock.synchronize do
|
1292
|
-
@checked_out_connections << connection
|
1293
1335
|
if @pending_connections.include?(connection)
|
1294
1336
|
@pending_connections.delete(connection)
|
1295
|
-
else
|
1296
|
-
@connection_requests -= 1
|
1297
1337
|
end
|
1298
1338
|
@max_connecting_cv.signal
|
1299
|
-
|
1300
|
-
# connections is unchanged.
|
1339
|
+
@size_cv.signal
|
1301
1340
|
end
|
1341
|
+
@populate_semaphore.signal
|
1342
|
+
publish_cmap_event(
|
1343
|
+
Monitoring::Event::Cmap::ConnectionCheckOutFailed.new(
|
1344
|
+
@server.address,
|
1345
|
+
Monitoring::Event::Cmap::ConnectionCheckOutFailed::CONNECTION_ERROR
|
1346
|
+
),
|
1347
|
+
)
|
1348
|
+
raise
|
1349
|
+
end
|
1302
1350
|
|
1303
|
-
|
1351
|
+
|
1352
|
+
# Decrement connection requests counter and signal the condition
|
1353
|
+
# variables that the number of unavailable connections has decreased.
|
1354
|
+
def decrement_connection_requests_and_signal
|
1355
|
+
@connection_requests -= 1
|
1356
|
+
@max_connecting_cv.signal
|
1357
|
+
@size_cv.signal
|
1304
1358
|
end
|
1305
1359
|
end
|
1306
1360
|
end
|
@@ -285,6 +285,7 @@ module Mongo
|
|
285
285
|
uri_option 'maxStalenessSeconds', :max_staleness, group: :read, type: :max_staleness
|
286
286
|
|
287
287
|
# Pool options
|
288
|
+
uri_option 'maxConnecting', :max_connecting, type: :integer
|
288
289
|
uri_option 'minPoolSize', :min_pool_size, type: :integer
|
289
290
|
uri_option 'maxPoolSize', :max_pool_size, type: :integer
|
290
291
|
uri_option 'waitQueueTimeoutMS', :wait_queue_timeout, type: :ms
|
data/lib/mongo/version.rb
CHANGED
@@ -0,0 +1,227 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe 'Find operation options' do
|
6
|
+
require_mri
|
7
|
+
require_no_auth
|
8
|
+
min_server_fcv '4.4'
|
9
|
+
|
10
|
+
let(:subscriber) { Mrss::EventSubscriber.new }
|
11
|
+
|
12
|
+
let(:seeds) do
|
13
|
+
[ SpecConfig.instance.addresses.first ]
|
14
|
+
end
|
15
|
+
|
16
|
+
let(:client_options) do
|
17
|
+
{}
|
18
|
+
end
|
19
|
+
|
20
|
+
let(:collection_options) do
|
21
|
+
{}
|
22
|
+
end
|
23
|
+
|
24
|
+
let(:client) do
|
25
|
+
ClientRegistry.instance.new_local_client(
|
26
|
+
seeds,
|
27
|
+
SpecConfig.instance.test_options
|
28
|
+
.merge(database: SpecConfig.instance.test_db)
|
29
|
+
.merge(client_options)
|
30
|
+
).tap do |client|
|
31
|
+
client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
let(:collection) do
|
36
|
+
client['find_options', collection_options]
|
37
|
+
end
|
38
|
+
|
39
|
+
let(:find_command) do
|
40
|
+
subscriber.started_events.find { |cmd| cmd.command_name == 'find' }
|
41
|
+
end
|
42
|
+
|
43
|
+
let(:should_create_collection) { true }
|
44
|
+
|
45
|
+
before do
|
46
|
+
client['find_options'].drop
|
47
|
+
collection.create if should_create_collection
|
48
|
+
collection.insert_many([ { a: 1 }, { a: 2 }, { a: 3 } ])
|
49
|
+
end
|
50
|
+
|
51
|
+
describe 'collation' do
|
52
|
+
let(:client_options) do
|
53
|
+
{}
|
54
|
+
end
|
55
|
+
|
56
|
+
let(:collation) do
|
57
|
+
{ 'locale' => 'en_US' }
|
58
|
+
end
|
59
|
+
|
60
|
+
context 'when defined on the collection' do
|
61
|
+
let(:collection_options) do
|
62
|
+
{ collation: collation }
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'uses the collation defined on the collection' do
|
66
|
+
collection.find.to_a
|
67
|
+
expect(find_command.command['collation']).to be_nil
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'when defined on the operation' do
|
72
|
+
let(:collection_options) do
|
73
|
+
{}
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'uses the collation defined on the collection' do
|
77
|
+
collection.find({}, collation: collation).to_a
|
78
|
+
expect(find_command.command['collation']).to eq(collation)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'when defined on both collection and operation' do
|
83
|
+
let(:collection_options) do
|
84
|
+
{ 'locale' => 'de_AT' }
|
85
|
+
end
|
86
|
+
|
87
|
+
let(:should_create_collection) { false }
|
88
|
+
|
89
|
+
it 'uses the collation defined on the collection' do
|
90
|
+
collection.find({}, collation: collation).to_a
|
91
|
+
expect(find_command.command['collation']).to eq(collation)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe 'read concern' do
|
97
|
+
context 'when defined on the client' do
|
98
|
+
let(:client_options) do
|
99
|
+
{ read_concern: { level: :local } }
|
100
|
+
end
|
101
|
+
|
102
|
+
let(:collection_options) do
|
103
|
+
{}
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'uses the read concern defined on the client' do
|
107
|
+
collection.find.to_a
|
108
|
+
expect(find_command.command['readConcern']).to eq('level' => 'local')
|
109
|
+
end
|
110
|
+
|
111
|
+
context 'when defined on the collection' do
|
112
|
+
let(:collection_options) do
|
113
|
+
{ read_concern: { level: :majority } }
|
114
|
+
end
|
115
|
+
|
116
|
+
it 'uses the read concern defined on the collection' do
|
117
|
+
collection.find.to_a
|
118
|
+
expect(find_command.command['readConcern']).to eq('level' => 'majority')
|
119
|
+
end
|
120
|
+
|
121
|
+
context 'when defined on the operation' do
|
122
|
+
let(:operation_read_concern) do
|
123
|
+
{ level: :available }
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'uses the read concern defined on the operation' do
|
127
|
+
collection.find({}, read_concern: operation_read_concern).to_a
|
128
|
+
expect(find_command.command['readConcern']).to eq('level' => 'available')
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
context 'when defined on the operation' do
|
134
|
+
let(:collection_options) do
|
135
|
+
{}
|
136
|
+
end
|
137
|
+
|
138
|
+
let(:operation_read_concern) do
|
139
|
+
{ level: :available }
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'uses the read concern defined on the operation' do
|
143
|
+
collection.find({}, read_concern: operation_read_concern).to_a
|
144
|
+
expect(find_command.command['readConcern']).to eq('level' => 'available')
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
context 'when defined on the collection' do
|
150
|
+
let(:client_options) do
|
151
|
+
{}
|
152
|
+
end
|
153
|
+
|
154
|
+
let(:collection_options) do
|
155
|
+
{ read_concern: { level: :majority } }
|
156
|
+
end
|
157
|
+
|
158
|
+
it 'uses the read concern defined on the collection' do
|
159
|
+
collection.find.to_a
|
160
|
+
expect(find_command.command['readConcern']).to eq('level' => 'majority')
|
161
|
+
end
|
162
|
+
|
163
|
+
context 'when defined on the operation' do
|
164
|
+
let(:operation_read_concern) do
|
165
|
+
{ level: :available }
|
166
|
+
end
|
167
|
+
|
168
|
+
it 'uses the read concern defined on the operation' do
|
169
|
+
collection.find({}, read_concern: operation_read_concern).to_a
|
170
|
+
expect(find_command.command['readConcern']).to eq('level' => 'available')
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
describe 'read preference' do
|
177
|
+
require_topology :replica_set
|
178
|
+
|
179
|
+
context 'when defined on the client' do
|
180
|
+
let(:client_options) do
|
181
|
+
{ read: { mode: :secondary } }
|
182
|
+
end
|
183
|
+
|
184
|
+
let(:collection_options) do
|
185
|
+
{}
|
186
|
+
end
|
187
|
+
|
188
|
+
it 'uses the read preference defined on the client' do
|
189
|
+
collection.find.to_a
|
190
|
+
expect(find_command.command['$readPreference']).to eq('mode' => 'secondary')
|
191
|
+
end
|
192
|
+
|
193
|
+
context 'when defined on the collection' do
|
194
|
+
let(:collection_options) do
|
195
|
+
{ read: { mode: :secondary_preferred } }
|
196
|
+
end
|
197
|
+
|
198
|
+
it 'uses the read concern defined on the collection' do
|
199
|
+
collection.find.to_a
|
200
|
+
expect(find_command.command['$readPreference']).to eq('mode' => 'secondaryPreferred')
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
describe 'cursor type' do
|
207
|
+
let(:collection_options) do
|
208
|
+
{ capped: true, size: 1000 }
|
209
|
+
end
|
210
|
+
|
211
|
+
context 'when cursor type is :tailable' do
|
212
|
+
it 'sets the cursor type to tailable' do
|
213
|
+
collection.find({}, cursor_type: :tailable).first
|
214
|
+
expect(find_command.command['tailable']).to be true
|
215
|
+
expect(find_command.command['awaitData']).to be_falsey
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
context 'when cursor type is :tailable_await' do
|
220
|
+
it 'sets the cursor type to tailable' do
|
221
|
+
collection.find({}, cursor_type: :tailable_await).first
|
222
|
+
expect(find_command.command['tailable']).to be true
|
223
|
+
expect(find_command.command['awaitData']).to be true
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
data/spec/lite_spec_helper.rb
CHANGED
@@ -16,7 +16,11 @@ GRIDFS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/gridfs/*.yml").sort
|
|
16
16
|
TRANSACTIONS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/transactions/*.yml").sort
|
17
17
|
TRANSACTIONS_API_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/transactions_api/*.yml").sort
|
18
18
|
CHANGE_STREAMS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/change_streams/*.yml").sort
|
19
|
-
CMAP_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/cmap/*.yml").sort
|
19
|
+
CMAP_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/cmap/*.yml").sort.select do |f|
|
20
|
+
# Skip tests that are flaky on JRuby.
|
21
|
+
# https://jira.mongodb.org/browse/RUBY-3292
|
22
|
+
!defined?(JRUBY_VERSION) || !f.include?('pool-checkout-minPoolSize-connection-maxConnecting.yml')
|
23
|
+
end
|
20
24
|
AUTH_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/auth/*.yml").sort
|
21
25
|
CLIENT_SIDE_ENCRYPTION_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/client_side_encryption/*.yml").sort
|
22
26
|
|
@@ -797,6 +797,32 @@ describe Mongo::Client do
|
|
797
797
|
end
|
798
798
|
end
|
799
799
|
|
800
|
+
context 'when max_connecting is provided' do
|
801
|
+
let(:client) do
|
802
|
+
new_local_client_nmio(SINGLE_CLIENT, options)
|
803
|
+
end
|
804
|
+
|
805
|
+
context 'when max_connecting is a positive integer' do
|
806
|
+
let(:options) do
|
807
|
+
{ max_connecting: 5 }
|
808
|
+
end
|
809
|
+
|
810
|
+
it 'sets the max connecting' do
|
811
|
+
expect(client.options[:max_connecting]).to eq(options[:max_connecting])
|
812
|
+
end
|
813
|
+
end
|
814
|
+
|
815
|
+
context 'when max_connecting is a negative integer' do
|
816
|
+
let(:options) do
|
817
|
+
{ max_connecting: -5 }
|
818
|
+
end
|
819
|
+
|
820
|
+
it 'raises an exception' do
|
821
|
+
expect { client }.to raise_error(Mongo::Error::InvalidMaxConnecting)
|
822
|
+
end
|
823
|
+
end
|
824
|
+
end
|
825
|
+
|
800
826
|
context 'when min_pool_size is provided' do
|
801
827
|
let(:client) { new_local_client_nmio(SINGLE_CLIENT, options) }
|
802
828
|
|
@@ -998,6 +1024,28 @@ describe Mongo::Client do
|
|
998
1024
|
expect(client.options).to eq(expected_options)
|
999
1025
|
end
|
1000
1026
|
|
1027
|
+
context 'when max_connecting is provided' do
|
1028
|
+
context 'when max_connecting is a positive integer' do
|
1029
|
+
let(:uri) do
|
1030
|
+
'mongodb://127.0.0.1:27017/?maxConnecting=10'
|
1031
|
+
end
|
1032
|
+
|
1033
|
+
it 'sets the max connecting' do
|
1034
|
+
expect(client.options[:max_connecting]).to eq(10)
|
1035
|
+
end
|
1036
|
+
end
|
1037
|
+
|
1038
|
+
context 'when max_connecting is a negative integer' do
|
1039
|
+
let(:uri) do
|
1040
|
+
'mongodb://127.0.0.1:27017/?maxConnecting=0'
|
1041
|
+
end
|
1042
|
+
|
1043
|
+
it 'raises an exception' do
|
1044
|
+
expect { client }.to raise_error(Mongo::Error::InvalidMaxConnecting)
|
1045
|
+
end
|
1046
|
+
end
|
1047
|
+
end
|
1048
|
+
|
1001
1049
|
context 'when min_pool_size is provided' do
|
1002
1050
|
context 'when max_pool_size is provided' do
|
1003
1051
|
context 'when the min_pool_size is greater than the max_pool_size' do
|
@@ -137,7 +137,11 @@ describe Mongo::Collection do
|
|
137
137
|
end
|
138
138
|
|
139
139
|
let(:collstats) do
|
140
|
-
|
140
|
+
collection.aggregate([ {'$collStats' => { 'storageStats' => {} }} ]).first
|
141
|
+
end
|
142
|
+
|
143
|
+
let(:storage_stats) do
|
144
|
+
collstats.fetch('storageStats', {})
|
141
145
|
end
|
142
146
|
|
143
147
|
let(:options) do
|
@@ -157,9 +161,9 @@ describe Mongo::Collection do
|
|
157
161
|
end
|
158
162
|
|
159
163
|
it "applies the options" do
|
160
|
-
expect(
|
161
|
-
expect(
|
162
|
-
expect(
|
164
|
+
expect(storage_stats["capped"]).to be true
|
165
|
+
expect(storage_stats["max"]).to eq(512)
|
166
|
+
expect(storage_stats["maxSize"]).to eq(4096)
|
163
167
|
end
|
164
168
|
end
|
165
169
|
end
|
@@ -651,7 +651,11 @@ describe Mongo::Collection do
|
|
651
651
|
end
|
652
652
|
|
653
653
|
let(:collstats) do
|
654
|
-
|
654
|
+
collection.aggregate([ {'$collStats' => { 'storageStats' => {} }} ]).first
|
655
|
+
end
|
656
|
+
|
657
|
+
let(:storage_stats) do
|
658
|
+
collstats.fetch('storageStats', {})
|
655
659
|
end
|
656
660
|
|
657
661
|
before do
|
@@ -664,9 +668,9 @@ describe Mongo::Collection do
|
|
664
668
|
end
|
665
669
|
|
666
670
|
it "applies the options" do
|
667
|
-
expect(
|
668
|
-
expect(
|
669
|
-
expect(
|
671
|
+
expect(storage_stats["capped"]).to be true
|
672
|
+
expect(storage_stats["max"]).to eq(512)
|
673
|
+
expect(storage_stats["maxSize"]).to eq(4096)
|
670
674
|
end
|
671
675
|
end
|
672
676
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
# rubocop:todo all
|
3
3
|
|
4
|
-
require '
|
4
|
+
require 'spec_helper'
|
5
5
|
require 'support/shared/protocol'
|
6
6
|
|
7
7
|
describe Mongo::Protocol::Msg do
|
@@ -237,44 +237,6 @@ describe Mongo::Protocol::Msg do
|
|
237
237
|
end
|
238
238
|
end
|
239
239
|
|
240
|
-
=begin no longer supported
|
241
|
-
context 'when a 0 payload type is specified' do
|
242
|
-
|
243
|
-
let(:section) do
|
244
|
-
{ type: 0, payload: { ismaster: 1 } }
|
245
|
-
end
|
246
|
-
|
247
|
-
let(:section_payload_type) { bytes.to_s[36] }
|
248
|
-
let(:section_bytes) { bytes.to_s[37..-1] }
|
249
|
-
|
250
|
-
it 'sets the payload type' do
|
251
|
-
expect(section_payload_type).to eq(0.chr)
|
252
|
-
end
|
253
|
-
|
254
|
-
it 'serializes the section' do
|
255
|
-
expect(section_bytes).to be_bson(section[:payload])
|
256
|
-
end
|
257
|
-
end
|
258
|
-
|
259
|
-
context 'when a no payload type is specified' do
|
260
|
-
|
261
|
-
let(:section) do
|
262
|
-
{ payload: { ismaster: 1 } }
|
263
|
-
end
|
264
|
-
|
265
|
-
let(:section_payload_type) { bytes.to_s[36] }
|
266
|
-
let(:section_bytes) { bytes.to_s[37..-1] }
|
267
|
-
|
268
|
-
it 'sets the payload type as 0' do
|
269
|
-
expect(section_payload_type).to eq(0.chr)
|
270
|
-
end
|
271
|
-
|
272
|
-
it 'serializes the section' do
|
273
|
-
expect(section_bytes).to be_bson(section[:payload])
|
274
|
-
end
|
275
|
-
end
|
276
|
-
=end
|
277
|
-
|
278
240
|
context 'when a payload of type 1 is specified' do
|
279
241
|
|
280
242
|
let(:section) do
|
@@ -366,32 +328,9 @@ describe Mongo::Protocol::Msg do
|
|
366
328
|
end
|
367
329
|
end
|
368
330
|
end
|
369
|
-
|
370
|
-
=begin no longer supported
|
371
|
-
context 'when the sections are mixed types and payload type 1 comes before type 0' do
|
372
|
-
|
373
|
-
let(:section1) do
|
374
|
-
Mongo::Protocol::Msg::Section1.new('documents', [ { a: 1 } ])
|
375
|
-
end
|
376
|
-
|
377
|
-
let(:section2) do
|
378
|
-
{ type: 0, payload: { 'b' => 2 } }
|
379
|
-
end
|
380
|
-
|
381
|
-
let(:sections) do
|
382
|
-
[ section1, section2 ]
|
383
|
-
end
|
384
|
-
|
385
|
-
it 'serializes all sections' do
|
386
|
-
expect(deserialized.documents).to eq([ BSON::Document.new(main_document), { 'a' => 1 }, { 'b' => 2 }])
|
387
|
-
end
|
388
|
-
end
|
389
|
-
=end
|
390
331
|
end
|
391
332
|
|
392
333
|
context 'when the validating_keys option is true with payload 1' do
|
393
|
-
max_bson_version '4.99.99'
|
394
|
-
|
395
334
|
let(:sequences) do
|
396
335
|
[ section ]
|
397
336
|
end
|
@@ -1018,6 +1018,18 @@ describe Mongo::URI::SRVProtocol do
|
|
1018
1018
|
include_examples "roundtrips string"
|
1019
1019
|
end
|
1020
1020
|
|
1021
|
+
context 'when providing maxConnecting' do
|
1022
|
+
|
1023
|
+
let(:max_connecting) { 10 }
|
1024
|
+
let(:options) { "maxConnecting=#{max_connecting}" }
|
1025
|
+
|
1026
|
+
it 'sets the max connecting option' do
|
1027
|
+
expect(uri.uri_options[:max_connecting]).to eq(max_connecting)
|
1028
|
+
end
|
1029
|
+
|
1030
|
+
include_examples "roundtrips string"
|
1031
|
+
end
|
1032
|
+
|
1021
1033
|
context 'when providing maxPoolSize' do
|
1022
1034
|
|
1023
1035
|
let(:max_pool_size) { 10 }
|
@@ -320,22 +320,22 @@ module Unified
|
|
320
320
|
collection = root_authorized_client.with(write_concern: {w: :majority}).
|
321
321
|
use(spec.use!('databaseName'))[spec.use!('collectionName')]
|
322
322
|
collection.drop
|
323
|
+
create_options = spec.use('createOptions') || {}
|
323
324
|
docs = spec.use!('documents')
|
324
|
-
|
325
|
-
collection.
|
326
|
-
|
327
|
-
|
328
|
-
collection.create
|
329
|
-
rescue Mongo::Error => e
|
330
|
-
if Mongo::Error::OperationFailure === e && (
|
325
|
+
begin
|
326
|
+
collection.create(create_options)
|
327
|
+
rescue Mongo::Error => e
|
328
|
+
if Mongo::Error::OperationFailure === e && (
|
331
329
|
e.code == 48 || e.message =~ /collection already exists/
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
end
|
330
|
+
)
|
331
|
+
# Already exists
|
332
|
+
else
|
333
|
+
raise
|
337
334
|
end
|
338
335
|
end
|
336
|
+
if docs.any?
|
337
|
+
collection.insert_many(docs)
|
338
|
+
end
|
339
339
|
unless spec.empty?
|
340
340
|
raise NotImplementedError, "Unhandled spec keys: #{spec}"
|
341
341
|
end
|
@@ -26,7 +26,7 @@ tests:
|
|
26
26
|
command:
|
27
27
|
ping: 1
|
28
28
|
command_name: ping
|
29
|
-
- description: "
|
29
|
+
- description: "kill op is not bypassed"
|
30
30
|
clientOptions:
|
31
31
|
autoEncryptOpts:
|
32
32
|
kmsProviders:
|
@@ -34,9 +34,10 @@ tests:
|
|
34
34
|
operations:
|
35
35
|
- name: runCommand
|
36
36
|
object: database
|
37
|
-
command_name:
|
37
|
+
command_name: killOp
|
38
38
|
arguments:
|
39
39
|
command:
|
40
|
-
|
40
|
+
killOp: 1
|
41
|
+
op: 1234
|
41
42
|
result:
|
42
|
-
errorContains: "command not supported for auto encryption:
|
43
|
+
errorContains: "command not supported for auto encryption: killOp"
|
@@ -1,7 +1,6 @@
|
|
1
1
|
version: 1
|
2
2
|
style: integration
|
3
3
|
description: threads blocked by maxConnecting check out minPoolSize connections
|
4
|
-
# Remove the topology runOn requirement when cmap specs are adjusted for lbs
|
5
4
|
runOn:
|
6
5
|
-
|
7
6
|
# required for blockConnection in fail point
|
@@ -14,7 +13,7 @@ failPoint:
|
|
14
13
|
failCommands: ["isMaster","hello"]
|
15
14
|
closeConnection: false
|
16
15
|
blockConnection: true
|
17
|
-
blockTimeMS:
|
16
|
+
blockTimeMS: 1000
|
18
17
|
poolOptions:
|
19
18
|
# allows both thread1 and the background thread to start opening connections concurrently
|
20
19
|
minPoolSize: 2
|
@@ -35,9 +34,8 @@ operations:
|
|
35
34
|
# - it is long enough to make sure that the background thread opens a connection before thread1 releases its permit;
|
36
35
|
# - it is short enough to allow thread2 to become blocked acquiring a permit to open a connection, and then grab the connection
|
37
36
|
# opened by the background thread, before the background thread releases its permit.
|
38
|
-
# This wait is not necessary in ruby since the background thread runs immediately.
|
39
37
|
- name: wait
|
40
|
-
ms:
|
38
|
+
ms: 200
|
41
39
|
- name: checkOut
|
42
40
|
thread: thread1
|
43
41
|
- name: waitForEvent
|
@@ -0,0 +1,37 @@
|
|
1
|
+
description: collectionData-createOptions
|
2
|
+
schemaVersion: "1.9"
|
3
|
+
runOnRequirements:
|
4
|
+
- minServerVersion: "3.6"
|
5
|
+
# Capped collections cannot be created on serverless instances.
|
6
|
+
serverless: forbid
|
7
|
+
createEntities:
|
8
|
+
- client:
|
9
|
+
id: &client0 client0
|
10
|
+
- database:
|
11
|
+
id: &database0 database0
|
12
|
+
client: *client0
|
13
|
+
databaseName: &database0Name database0
|
14
|
+
- collection:
|
15
|
+
id: &collection0 collection0
|
16
|
+
database: *database0
|
17
|
+
collectionName: &collection0Name coll0
|
18
|
+
initialData:
|
19
|
+
- collectionName: *collection0Name
|
20
|
+
databaseName: *database0Name
|
21
|
+
createOptions:
|
22
|
+
capped: true
|
23
|
+
# With MMAPv1, the size field cannot be less than 4096.
|
24
|
+
size: &cappedSize 4096
|
25
|
+
documents:
|
26
|
+
- { _id: 1, x: 11 }
|
27
|
+
tests:
|
28
|
+
- description: collection is created with the correct options
|
29
|
+
operations:
|
30
|
+
- object: *collection0
|
31
|
+
name: aggregate
|
32
|
+
arguments:
|
33
|
+
pipeline:
|
34
|
+
- $collStats: { storageStats: {} }
|
35
|
+
- $project: { capped: '$storageStats.capped', maxSize: '$storageStats.maxSize'}
|
36
|
+
expectResult:
|
37
|
+
- { capped: true, maxSize: *cappedSize }
|
data.tar.gz.sig
CHANGED
Binary file
|
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.19.
|
4
|
+
version: 2.19.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- The MongoDB Ruby Team
|
@@ -35,7 +35,7 @@ cert_chain:
|
|
35
35
|
wkeAWhd5b+5JS0zgDL4SvGB8/W2IY+y0zELkojBMgJPyrpAWHL/WSsSBMuhyI2Pv
|
36
36
|
xxaBVLklnJJ/qCCOZ3lG2MyVc/Nb0Mmq8ygWNsfwHmKKYuuWcviit0D0Tek=
|
37
37
|
-----END CERTIFICATE-----
|
38
|
-
date: 2023-
|
38
|
+
date: 2023-10-30 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
41
|
name: bson
|
@@ -231,6 +231,7 @@ files:
|
|
231
231
|
- lib/mongo/error/invalid_document.rb
|
232
232
|
- lib/mongo/error/invalid_file.rb
|
233
233
|
- lib/mongo/error/invalid_file_revision.rb
|
234
|
+
- lib/mongo/error/invalid_max_connecting.rb
|
234
235
|
- lib/mongo/error/invalid_min_pool_size.rb
|
235
236
|
- lib/mongo/error/invalid_nonce.rb
|
236
237
|
- lib/mongo/error/invalid_read_concern.rb
|
@@ -590,6 +591,7 @@ files:
|
|
590
591
|
- spec/integration/cursor_reaping_spec.rb
|
591
592
|
- spec/integration/docs_examples_spec.rb
|
592
593
|
- spec/integration/error_detection_spec.rb
|
594
|
+
- spec/integration/find_options_spec.rb
|
593
595
|
- spec/integration/fork_reconnect_spec.rb
|
594
596
|
- spec/integration/get_more_spec.rb
|
595
597
|
- spec/integration/grid_fs_bucket_spec.rb
|
@@ -1774,6 +1776,7 @@ files:
|
|
1774
1776
|
- spec/spec_tests/data/unified/valid-fail/operation-failure.yml
|
1775
1777
|
- spec/spec_tests/data/unified/valid-fail/operation-unsupported.yml
|
1776
1778
|
- spec/spec_tests/data/unified/valid-pass/assertNumberConnectionsCheckedOut.yml
|
1779
|
+
- spec/spec_tests/data/unified/valid-pass/collectionData-createOptions.yml
|
1777
1780
|
- spec/spec_tests/data/unified/valid-pass/entity-client-cmap-events.yml
|
1778
1781
|
- spec/spec_tests/data/unified/valid-pass/entity-client-storeEventsAsEntities.yml
|
1779
1782
|
- spec/spec_tests/data/unified/valid-pass/expectedError-errorResponse.yml
|
@@ -2457,6 +2460,7 @@ test_files:
|
|
2457
2460
|
- spec/integration/client_side_encryption/auto_encryption_spec.rb
|
2458
2461
|
- spec/integration/client_side_encryption/on_demand_aws_credentials_spec.rb
|
2459
2462
|
- spec/integration/server_selection_spec.rb
|
2463
|
+
- spec/integration/find_options_spec.rb
|
2460
2464
|
- spec/integration/ocsp_connectivity_spec.rb
|
2461
2465
|
- spec/integration/error_detection_spec.rb
|
2462
2466
|
- spec/integration/aws_auth_request_spec.rb
|
@@ -2989,6 +2993,7 @@ test_files:
|
|
2989
2993
|
- spec/spec_tests/data/unified/valid-pass/poc-sessions.yml
|
2990
2994
|
- spec/spec_tests/data/unified/valid-pass/poc-transactions.yml
|
2991
2995
|
- spec/spec_tests/data/unified/valid-pass/expectedEventsForClient-eventType.yml
|
2996
|
+
- spec/spec_tests/data/unified/valid-pass/collectionData-createOptions.yml
|
2992
2997
|
- spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml
|
2993
2998
|
- spec/spec_tests/data/unified/valid-pass/observeSensitiveCommands.yml
|
2994
2999
|
- spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml
|
metadata.gz.sig
CHANGED
Binary file
|