mongo 2.10.0.rc0 → 2.10.0
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.tar.gz.sig +0 -0
- data/lib/mongo/error/operation_failure.rb +12 -0
- data/lib/mongo/retryable.rb +14 -1
- data/lib/mongo/server/description.rb +12 -10
- data/lib/mongo/session.rb +4 -1
- data/lib/mongo/session/session_pool.rb +1 -1
- data/lib/mongo/socket.rb +28 -7
- data/lib/mongo/socket/ssl.rb +0 -3
- data/lib/mongo/socket/tcp.rb +0 -3
- data/lib/mongo/socket/unix.rb +0 -3
- data/lib/mongo/version.rb +1 -1
- data/spec/integration/retryable_writes_errors_spec.rb +34 -0
- data/spec/mongo/retryable_spec.rb +13 -0
- data/spec/mongo/server/connection_spec.rb +15 -11
- data/spec/mongo/server/description_spec.rb +4 -4
- data/spec/mongo/socket_spec.rb +63 -1
- data/spec/support/cluster_config.rb +14 -0
- data/spec/support/spec_config.rb +0 -1
- metadata +6 -4
- 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: 1a1e6b0cb6b8548601a5ad4c4758361f9815d65750b52fef6b2393eb09ab5ae4
|
4
|
+
data.tar.gz: '084a8d5a64bba3ffaab853919918f9cb214754edbaec4ac22eeaee5e9954f39b'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 19fc6811951a53cfef86d647849337fb56014e97d2cf9aec0ea0de58f3525632a96e04c1f5a6ecd4f6de8f7a853faded939e59f716d9fa4a6c9ac40a7e742ce9
|
7
|
+
data.tar.gz: '08ff4b626997aa23fb9db94893818e2326cc2c13032ea4dabf512628b436597f13a2c69a2693d57fd58d60208c384660b4c811ca98b8aeb1a47994b212a0dbd5'
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
@@ -252,6 +252,18 @@ module Mongo
|
|
252
252
|
def max_time_ms_expired?
|
253
253
|
code == 50 # MaxTimeMSExpired
|
254
254
|
end
|
255
|
+
|
256
|
+
# Whether the error is caused by an attempted retryable write
|
257
|
+
# on a storage engine that does not support retryable writes.
|
258
|
+
#
|
259
|
+
# @return [ true | false ] Whether the error is caused by an attempted
|
260
|
+
# retryable write on a storage engine that does not support retryable writes.
|
261
|
+
#
|
262
|
+
# @since 2.10.0
|
263
|
+
def unsupported_retryable_write?
|
264
|
+
# code 20 is IllegalOperation
|
265
|
+
code == 20 && message.start_with?("Transaction numbers")
|
266
|
+
end
|
255
267
|
end
|
256
268
|
end
|
257
269
|
end
|
data/lib/mongo/retryable.rb
CHANGED
@@ -215,9 +215,12 @@ module Mongo
|
|
215
215
|
end
|
216
216
|
retry_write(e, session, txn_num, &block)
|
217
217
|
rescue Error::OperationFailure => e
|
218
|
-
if
|
218
|
+
if e.unsupported_retryable_write?
|
219
|
+
raise_unsupported_error(e)
|
220
|
+
elsif (session.in_transaction? && !ending_transaction) || !e.write_retryable?
|
219
221
|
raise
|
220
222
|
end
|
223
|
+
|
221
224
|
retry_write(e, session, txn_num, &block)
|
222
225
|
end
|
223
226
|
end
|
@@ -403,5 +406,15 @@ module Mongo
|
|
403
406
|
end
|
404
407
|
Logger.logger.warn "#{message} due to: #{e.class.name} #{e.message}"
|
405
408
|
end
|
409
|
+
|
410
|
+
# Retry writes on MMAPv1 should raise an actionable error; append actionable
|
411
|
+
# information to the error message and preserve the backtrace.
|
412
|
+
def raise_unsupported_error(e)
|
413
|
+
new_error = Error::OperationFailure.new("#{e.class}: #{e} "\
|
414
|
+
"This MongoDB deployment does not support retryable writes. Please add "\
|
415
|
+
"retryWrites=false to your connection string or use the retry_writes: false Ruby client option")
|
416
|
+
new_error.set_backtrace(e.backtrace)
|
417
|
+
raise new_error
|
418
|
+
end
|
406
419
|
end
|
407
420
|
end
|
@@ -20,6 +20,13 @@ module Mongo
|
|
20
20
|
# Represents a description of the server, populated by the result of the
|
21
21
|
# ismaster command.
|
22
22
|
#
|
23
|
+
# Note: Unknown servers do not have wire versions, but for legacy reasons
|
24
|
+
# we return 0 for min_wire_version and max_wire_version of any server that does
|
25
|
+
# not have them. Presently the driver sometimes constructs commands when the
|
26
|
+
# server is unknown, so references to min_wire_version and max_wire_version
|
27
|
+
# should not be nil. When driver behavior is changed
|
28
|
+
# (https://jira.mongodb.org/browse/RUBY-1805), this may no longer be necessary.
|
29
|
+
#
|
23
30
|
# @since 2.0.0
|
24
31
|
class Description
|
25
32
|
|
@@ -192,9 +199,7 @@ module Mongo
|
|
192
199
|
def initialize(address, config = {}, average_round_trip_time = nil)
|
193
200
|
@address = address
|
194
201
|
@config = config
|
195
|
-
|
196
|
-
@features = Features.new(wire_versions, me || @address.to_s)
|
197
|
-
end
|
202
|
+
@features = Features.new(wire_versions, me || @address.to_s)
|
198
203
|
@average_round_trip_time = average_round_trip_time
|
199
204
|
@last_update_time = Time.now.dup.freeze
|
200
205
|
|
@@ -216,9 +221,6 @@ module Mongo
|
|
216
221
|
|
217
222
|
# @return [ Features ] features The features for the server.
|
218
223
|
def features
|
219
|
-
if unknown?
|
220
|
-
return Features.new(0..0, address.to_s)
|
221
|
-
end
|
222
224
|
@features
|
223
225
|
end
|
224
226
|
|
@@ -333,7 +335,7 @@ module Mongo
|
|
333
335
|
config[MAX_WRITE_BATCH_SIZE] || DEFAULT_MAX_WRITE_BATCH_SIZE
|
334
336
|
end
|
335
337
|
|
336
|
-
# Get the maximum wire version.
|
338
|
+
# Get the maximum wire version. Defaults to zero.
|
337
339
|
#
|
338
340
|
# @example Get the max wire version.
|
339
341
|
# description.max_wire_version
|
@@ -342,10 +344,10 @@ module Mongo
|
|
342
344
|
#
|
343
345
|
# @since 2.0.0
|
344
346
|
def max_wire_version
|
345
|
-
config[MAX_WIRE_VERSION]
|
347
|
+
config[MAX_WIRE_VERSION] || 0
|
346
348
|
end
|
347
349
|
|
348
|
-
# Get the minimum wire version.
|
350
|
+
# Get the minimum wire version. Defaults to zero.
|
349
351
|
#
|
350
352
|
# @example Get the min wire version.
|
351
353
|
# description.min_wire_version
|
@@ -354,7 +356,7 @@ module Mongo
|
|
354
356
|
#
|
355
357
|
# @since 2.0.0
|
356
358
|
def min_wire_version
|
357
|
-
config[MIN_WIRE_VERSION]
|
359
|
+
config[MIN_WIRE_VERSION] || 0
|
358
360
|
end
|
359
361
|
|
360
362
|
# Get the me field value.
|
data/lib/mongo/session.rb
CHANGED
@@ -299,7 +299,7 @@ module Mongo
|
|
299
299
|
if within_states?(TRANSACTION_IN_PROGRESS_STATE)
|
300
300
|
begin
|
301
301
|
abort_transaction
|
302
|
-
rescue Mongo::Error
|
302
|
+
rescue Mongo::Error, Error::AuthError
|
303
303
|
end
|
304
304
|
end
|
305
305
|
@client.cluster.session_pool.checkin(@server_session)
|
@@ -429,6 +429,9 @@ module Mongo
|
|
429
429
|
transaction_in_progress = false
|
430
430
|
raise
|
431
431
|
end
|
432
|
+
rescue Error::AuthError
|
433
|
+
transaction_in_progress = false
|
434
|
+
raise
|
432
435
|
end
|
433
436
|
end
|
434
437
|
end
|
data/lib/mongo/socket.rb
CHANGED
@@ -49,6 +49,9 @@ module Mongo
|
|
49
49
|
# @return [ Hash ] The options.
|
50
50
|
attr_reader :options
|
51
51
|
|
52
|
+
# @return [ Float ] timeout The socket timeout.
|
53
|
+
attr_reader :timeout
|
54
|
+
|
52
55
|
# Is the socket connection alive?
|
53
56
|
#
|
54
57
|
# @example Is the socket alive?
|
@@ -123,10 +126,14 @@ module Mongo
|
|
123
126
|
def read(length)
|
124
127
|
handle_errors do
|
125
128
|
data = read_from_socket(length)
|
126
|
-
|
129
|
+
unless (data.length > 0 || length == 0)
|
130
|
+
raise IOError, "Expected to read > 0 bytes but read 0 bytes"
|
131
|
+
end
|
127
132
|
while data.length < length
|
128
133
|
chunk = read_from_socket(length - data.length)
|
129
|
-
|
134
|
+
unless (chunk.length > 0 || length == 0)
|
135
|
+
raise IOError, "Expected to read > 0 bytes but read 0 bytes"
|
136
|
+
end
|
130
137
|
data << chunk
|
131
138
|
end
|
132
139
|
data
|
@@ -185,7 +192,9 @@ module Mongo
|
|
185
192
|
return ''.force_encoding('BINARY')
|
186
193
|
end
|
187
194
|
|
188
|
-
|
195
|
+
if _timeout = self.timeout
|
196
|
+
deadline = Time.now + _timeout
|
197
|
+
end
|
189
198
|
|
190
199
|
# We want to have a fixed and reasonably small size buffer for reads
|
191
200
|
# because, for example, OpenSSL reads in 16 kb chunks max.
|
@@ -232,10 +241,22 @@ module Mongo
|
|
232
241
|
data[retrieved, chunk.length] = chunk
|
233
242
|
retrieved += chunk.length
|
234
243
|
end
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
244
|
+
# As explained in https://ruby-doc.com/core-trunk/IO.html#method-c-select,
|
245
|
+
# reading from a TLS socket may require writing which may raise WaitWritable
|
246
|
+
rescue IO::WaitReadable, IO::WaitWritable => exc
|
247
|
+
if deadline
|
248
|
+
select_timeout = deadline - Time.now
|
249
|
+
if select_timeout <= 0
|
250
|
+
raise Errno::ETIMEDOUT, "Took more than #{_timeout} seconds to receive data"
|
251
|
+
end
|
252
|
+
end
|
253
|
+
if exc.is_a?(IO::WaitReadable)
|
254
|
+
select_args = [[@socket], nil, [@socket], select_timeout]
|
255
|
+
else
|
256
|
+
select_args = [nil, [@socket], [@socket], select_timeout]
|
257
|
+
end
|
258
|
+
unless Kernel::select(*select_args)
|
259
|
+
raise Errno::ETIMEDOUT, "Took more than #{_timeout} seconds to receive data"
|
239
260
|
end
|
240
261
|
retry
|
241
262
|
end
|
data/lib/mongo/socket/ssl.rb
CHANGED
data/lib/mongo/socket/tcp.rb
CHANGED
data/lib/mongo/socket/unix.rb
CHANGED
data/lib/mongo/version.rb
CHANGED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Retryable writes errors tests' do
|
4
|
+
describe 'when the storage engine does not support retryable writes but the server does' do
|
5
|
+
require_mmapv1
|
6
|
+
min_server_fcv '3.6'
|
7
|
+
require_topology :replica_set, :sharded
|
8
|
+
|
9
|
+
before do
|
10
|
+
collection.delete_many
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:collection) do
|
14
|
+
client[authorized_collection.name]
|
15
|
+
end
|
16
|
+
|
17
|
+
let(:client) do
|
18
|
+
authorized_client.with(retry_writes: true)
|
19
|
+
end
|
20
|
+
|
21
|
+
after do
|
22
|
+
client.close(true)
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'when a retryable write is attempted' do
|
26
|
+
it 'raises an actionable error message' do
|
27
|
+
expect {
|
28
|
+
collection.insert_one(a:1)
|
29
|
+
}.to raise_error(Mongo::Error::OperationFailure, /This MongoDB deployment does not support retryable writes. Please add retryWrites=false to your connection string or use the retry_writes: false Ruby client option/)
|
30
|
+
expect(collection.find.count).to eq(0)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -591,5 +591,18 @@ describe Mongo::Retryable do
|
|
591
591
|
end
|
592
592
|
end
|
593
593
|
|
594
|
+
context 'when an error due to using an unsupported storage engine occurs' do
|
595
|
+
before do
|
596
|
+
expect(operation).to receive(:execute).and_raise(
|
597
|
+
Mongo::Error::OperationFailure.new('Transaction numbers are only allowed on...',
|
598
|
+
nil, :code=>20)).ordered
|
599
|
+
end
|
600
|
+
|
601
|
+
it 'raises an exception with the correct error message' do
|
602
|
+
expect {
|
603
|
+
retryable.write
|
604
|
+
}.to raise_error(Mongo::Error::OperationFailure, /This MongoDB deployment does not support retryable writes. Please add retryWrites=false to your connection string or use the retry_writes: false Ruby client option/)
|
605
|
+
end
|
606
|
+
end
|
594
607
|
end
|
595
608
|
end
|
@@ -757,26 +757,30 @@ describe Mongo::Server::Connection, retry: 3 do
|
|
757
757
|
end
|
758
758
|
end
|
759
759
|
|
760
|
-
context 'when a socket timeout is set' do
|
760
|
+
context 'when a socket timeout is set on client' do
|
761
761
|
|
762
762
|
let(:connection) do
|
763
763
|
described_class.new(server, socket_timeout: 10)
|
764
764
|
end
|
765
765
|
|
766
|
-
it '
|
766
|
+
it 'is propagated to connection timeout' do
|
767
767
|
expect(connection.timeout).to eq(10)
|
768
768
|
end
|
769
|
+
end
|
769
770
|
|
771
|
+
context 'when an operation never completes' do
|
770
772
|
let(:client) do
|
771
|
-
authorized_client.with(socket_timeout: 1.5
|
773
|
+
authorized_client.with(socket_timeout: 1.5,
|
774
|
+
# Read retries would cause the reads to be attempted twice,
|
775
|
+
# thus making the find take twice as long to time out.
|
776
|
+
retry_reads: false, max_read_retries: 0)
|
772
777
|
end
|
773
778
|
|
774
779
|
before do
|
775
|
-
|
776
|
-
authorized_collection.insert_one(a: 1)
|
780
|
+
client.cluster.next_primary
|
777
781
|
end
|
778
782
|
|
779
|
-
it '
|
783
|
+
it 'times out and raises SocketTimeoutError' do
|
780
784
|
start = Time.now
|
781
785
|
begin
|
782
786
|
Timeout::timeout(1.5 + 15) do
|
@@ -784,11 +788,11 @@ describe Mongo::Server::Connection, retry: 3 do
|
|
784
788
|
end
|
785
789
|
rescue => ex
|
786
790
|
end_time = Time.now
|
787
|
-
expect(ex).to be_a(
|
788
|
-
expect(ex.message).to
|
791
|
+
expect(ex).to be_a(Mongo::Error::SocketTimeoutError)
|
792
|
+
expect(ex.message).to match(/Took more than 1.5 seconds to receive data/)
|
789
793
|
end
|
790
|
-
#
|
791
|
-
expect(end_time - start).to be_within(
|
794
|
+
# allow 1.5 seconds +- 0.5 seconds
|
795
|
+
expect(end_time - start).to be_within(1).of(2)
|
792
796
|
end
|
793
797
|
|
794
798
|
context 'when the socket_timeout is negative' do
|
@@ -816,7 +820,7 @@ describe Mongo::Server::Connection, retry: 3 do
|
|
816
820
|
it 'raises a timeout error' do
|
817
821
|
expect {
|
818
822
|
reply
|
819
|
-
}.to raise_exception(
|
823
|
+
}.to raise_exception(Mongo::Error::SocketTimeoutError)
|
820
824
|
end
|
821
825
|
end
|
822
826
|
end
|
@@ -21,7 +21,7 @@ describe Mongo::Server::Description do
|
|
21
21
|
'maxMessageSizeBytes' => 48000000,
|
22
22
|
'maxWriteBatchSize' => 1000,
|
23
23
|
'maxWireVersion' => 2,
|
24
|
-
'minWireVersion' =>
|
24
|
+
'minWireVersion' => 1,
|
25
25
|
'localTime' => Time.now,
|
26
26
|
'lastWrite' => { 'lastWriteDate' => Time.now },
|
27
27
|
'logicalSessionTimeoutMinutes' => 7,
|
@@ -194,7 +194,7 @@ describe Mongo::Server::Description do
|
|
194
194
|
end
|
195
195
|
|
196
196
|
it 'returns the default' do
|
197
|
-
expect(description.max_wire_version).to
|
197
|
+
expect(description.max_wire_version).to eq(0)
|
198
198
|
end
|
199
199
|
end
|
200
200
|
end
|
@@ -208,7 +208,7 @@ describe Mongo::Server::Description do
|
|
208
208
|
end
|
209
209
|
|
210
210
|
it 'returns the value' do
|
211
|
-
expect(description.min_wire_version).to eq(
|
211
|
+
expect(description.min_wire_version).to eq(1)
|
212
212
|
end
|
213
213
|
end
|
214
214
|
|
@@ -219,7 +219,7 @@ describe Mongo::Server::Description do
|
|
219
219
|
end
|
220
220
|
|
221
221
|
it 'returns the default' do
|
222
|
-
expect(description.min_wire_version).to
|
222
|
+
expect(description.min_wire_version).to eq(0)
|
223
223
|
end
|
224
224
|
end
|
225
225
|
end
|
data/spec/mongo/socket_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Mongo::Socket do
|
4
4
|
|
@@ -51,4 +51,66 @@ describe Mongo::Socket do
|
|
51
51
|
end.to raise_error(Mongo::Error::SocketError, 'OpenSSL::SSL::SSLError: Test error (for fake-address) (MongoDB may not be configured with SSL support)')
|
52
52
|
end
|
53
53
|
end
|
54
|
+
|
55
|
+
describe '#read' do
|
56
|
+
let(:target_host) do
|
57
|
+
host = ClusterConfig.instance.primary_address_host
|
58
|
+
# Take ipv4 address
|
59
|
+
Socket.getaddrinfo(host, 0).detect { |ai| ai.first == 'AF_INET' }[3]
|
60
|
+
end
|
61
|
+
|
62
|
+
let(:socket) do
|
63
|
+
Mongo::Socket::TCP.new(target_host, ClusterConfig.instance.primary_address_port, 1, Socket::PF_INET)
|
64
|
+
end
|
65
|
+
|
66
|
+
let(:raw_socket) { socket.instance_variable_get('@socket') }
|
67
|
+
|
68
|
+
let(:wait_readable_class) do
|
69
|
+
Class.new(Exception) do
|
70
|
+
include IO::WaitReadable
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context 'timeout' do
|
75
|
+
clean_slate_for_all
|
76
|
+
|
77
|
+
shared_examples_for 'times out' do
|
78
|
+
it 'times out' do
|
79
|
+
expect(socket).to receive(:timeout).at_least(:once).and_return(0.2)
|
80
|
+
# When we raise WaitWritable, the socket object is ready for
|
81
|
+
# writing which makes the read method invoke read_nonblock many times
|
82
|
+
expect(raw_socket).to receive(:read_nonblock).at_least(:once) do |len, buf|
|
83
|
+
sleep 0.01
|
84
|
+
raise exception_class
|
85
|
+
end
|
86
|
+
|
87
|
+
expect do
|
88
|
+
socket.read(10)
|
89
|
+
end.to raise_error(Mongo::Error::SocketTimeoutError, /Took more than .* seconds to receive data \(for /)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
context 'with WaitReadable' do
|
94
|
+
|
95
|
+
let(:exception_class) do
|
96
|
+
Class.new(Exception) do
|
97
|
+
include IO::WaitReadable
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
it_behaves_like 'times out'
|
102
|
+
end
|
103
|
+
|
104
|
+
context 'with WaitWritable' do
|
105
|
+
|
106
|
+
let(:exception_class) do
|
107
|
+
Class.new(Exception) do
|
108
|
+
include IO::WaitWritable
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
it_behaves_like 'times out'
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
54
116
|
end
|
@@ -74,6 +74,20 @@ class ClusterConfig
|
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
|
+
def primary_address_str
|
78
|
+
primary_address
|
79
|
+
end
|
80
|
+
|
81
|
+
def primary_address_host
|
82
|
+
both = primary_address_str
|
83
|
+
both.split(':').first
|
84
|
+
end
|
85
|
+
|
86
|
+
def primary_address_port
|
87
|
+
both = primary_address_str
|
88
|
+
both.split(':')[1] || 27017
|
89
|
+
end
|
90
|
+
|
77
91
|
# Try running a command on the admin database to see if the mongod was
|
78
92
|
# started with auth.
|
79
93
|
def auth_enabled?
|
data/spec/support/spec_config.rb
CHANGED
@@ -337,7 +337,6 @@ EOT
|
|
337
337
|
{
|
338
338
|
max_pool_size: 1,
|
339
339
|
heartbeat_frequency: 20,
|
340
|
-
max_read_retries: 5,
|
341
340
|
# The test suite seems to perform a number of operations
|
342
341
|
# requiring server selection. Hence a timeout of 1 here,
|
343
342
|
# together with e.g. a misconfigured replica set,
|
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.10.0
|
4
|
+
version: 2.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tyler Brock
|
@@ -31,7 +31,7 @@ cert_chain:
|
|
31
31
|
bMYVwXXhV8czdzgkQB/ZPWHSbEWXnmkze1mzvqWBCPOVXYrcnL9cnEl/RoxtS1hr
|
32
32
|
Db6Ac6mCUSYfYHBWpWqxjc45n70i5Xi1
|
33
33
|
-----END CERTIFICATE-----
|
34
|
-
date: 2019-08-
|
34
|
+
date: 2019-08-13 00:00:00.000000000 Z
|
35
35
|
dependencies:
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: bson
|
@@ -456,6 +456,7 @@ files:
|
|
456
456
|
- spec/integration/read_concern_spec.rb
|
457
457
|
- spec/integration/read_preference_spec.rb
|
458
458
|
- spec/integration/reconnect_spec.rb
|
459
|
+
- spec/integration/retryable_writes_errors_spec.rb
|
459
460
|
- spec/integration/retryable_writes_spec.rb
|
460
461
|
- spec/integration/sdam_error_handling_spec.rb
|
461
462
|
- spec/integration/sdam_events_spec.rb
|
@@ -1110,9 +1111,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
1110
1111
|
version: '0'
|
1111
1112
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
1112
1113
|
requirements:
|
1113
|
-
- - "
|
1114
|
+
- - ">="
|
1114
1115
|
- !ruby/object:Gem::Version
|
1115
|
-
version:
|
1116
|
+
version: '0'
|
1116
1117
|
requirements: []
|
1117
1118
|
rubygems_version: 3.0.3
|
1118
1119
|
signing_key:
|
@@ -1216,6 +1217,7 @@ test_files:
|
|
1216
1217
|
- spec/integration/time_zone_querying_spec.rb
|
1217
1218
|
- spec/integration/mongos_pinning_spec.rb
|
1218
1219
|
- spec/integration/heartbeat_events_spec.rb
|
1220
|
+
- spec/integration/retryable_writes_errors_spec.rb
|
1219
1221
|
- spec/integration/docs_examples_spec.rb
|
1220
1222
|
- spec/integration/sdam_error_handling_spec.rb
|
1221
1223
|
- spec/mongo/cursor_spec.rb
|
metadata.gz.sig
CHANGED
Binary file
|