mongo 2.7.0 → 2.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/README.md +39 -14
- data/Rakefile +1 -0
- data/lib/mongo/auth.rb +4 -1
- data/lib/mongo/client.rb +4 -3
- data/lib/mongo/cluster.rb +1 -1
- data/lib/mongo/collection/view/readable.rb +5 -2
- data/lib/mongo/database.rb +1 -0
- data/lib/mongo/error/invalid_server_preference.rb +1 -0
- data/lib/mongo/error/operation_failure.rb +10 -0
- data/lib/mongo/error/parser.rb +10 -0
- data/lib/mongo/event.rb +1 -2
- data/lib/mongo/operation/result.rb +4 -1
- data/lib/mongo/operation/shared/executable_transaction_label.rb +3 -1
- data/lib/mongo/operation/shared/sessions_supported.rb +1 -1
- data/lib/mongo/protocol/msg.rb +1 -1
- data/lib/mongo/protocol/query.rb +2 -2
- data/lib/mongo/retryable.rb +20 -6
- data/lib/mongo/server.rb +6 -0
- data/lib/mongo/server/connection.rb +4 -4
- data/lib/mongo/server/monitor/connection.rb +9 -5
- data/lib/mongo/server_selector/selectable.rb +86 -32
- data/lib/mongo/session.rb +98 -15
- data/lib/mongo/version.rb +1 -1
- data/spec/README.md +85 -0
- data/spec/integration/bulk_insert_spec.rb +1 -1
- data/spec/integration/change_stream_examples_spec.rb +3 -1
- data/spec/integration/change_stream_spec.rb +10 -14
- data/spec/integration/client_construction_spec.rb +1 -0
- data/spec/integration/command_monitoring_spec.rb +37 -1
- data/spec/integration/command_spec.rb +141 -0
- data/spec/integration/connection_spec.rb +4 -2
- data/spec/integration/cursor_reaping_spec.rb +1 -1
- data/spec/integration/docs_examples_spec.rb +1 -1
- data/spec/integration/retryable_writes_spec.rb +33 -42
- data/spec/integration/server_description_spec.rb +3 -3
- data/spec/integration/server_selector_spec.rb +79 -0
- data/spec/lite_spec_helper.rb +4 -2
- data/spec/mongo/address_spec.rb +8 -0
- data/spec/mongo/auth/cr_spec.rb +5 -2
- data/spec/mongo/auth/invalid_mechanism_spec.rb +11 -0
- data/spec/mongo/auth/scram/conversation_spec.rb +3 -2
- data/spec/mongo/auth/scram/negotiation_spec.rb +1 -2
- data/spec/mongo/auth/scram_spec.rb +11 -6
- data/spec/mongo/auth/user/view_spec.rb +13 -6
- data/spec/mongo/bulk_write_spec.rb +81 -104
- data/spec/mongo/client_construction_spec.rb +18 -7
- data/spec/mongo/client_spec.rb +11 -7
- data/spec/mongo/cluster_spec.rb +30 -1
- data/spec/mongo/collection/view/aggregation_spec.rb +18 -10
- data/spec/mongo/collection/view/change_stream_spec.rb +28 -8
- data/spec/mongo/collection/view/map_reduce_spec.rb +24 -10
- data/spec/mongo/collection/view/readable_spec.rb +37 -19
- data/spec/mongo/collection/view/writable_spec.rb +64 -32
- data/spec/mongo/collection/view_spec.rb +4 -2
- data/spec/mongo/collection_spec.rb +163 -73
- data/spec/mongo/cursor_spec.rb +5 -2
- data/spec/mongo/database_spec.rb +41 -19
- data/spec/mongo/error/no_server_available_spec.rb +1 -1
- data/spec/mongo/error/parser_spec.rb +29 -0
- data/spec/mongo/grid/stream/write_spec.rb +2 -1
- data/spec/mongo/index/view_spec.rb +42 -24
- data/spec/mongo/operation/delete/op_msg_spec.rb +11 -7
- data/spec/mongo/operation/insert/op_msg_spec.rb +10 -6
- data/spec/mongo/operation/update/op_msg_spec.rb +10 -6
- data/spec/mongo/protocol/compressed_spec.rb +1 -1
- data/spec/mongo/protocol/msg_spec.rb +1 -1
- data/spec/mongo/server/app_metadata_spec.rb +2 -1
- data/spec/mongo/server/connection_auth_spec.rb +1 -1
- data/spec/mongo/server/monitor/connection_spec.rb +42 -0
- data/spec/mongo/server_selector_spec.rb +17 -0
- data/spec/mongo/server_spec.rb +110 -0
- data/spec/mongo/session/session_pool_spec.rb +1 -1
- data/spec/mongo/session_spec.rb +1 -1
- data/spec/mongo/session_transaction_spec.rb +162 -1
- data/spec/mongo/socket/ssl_spec.rb +14 -7
- data/spec/mongo/uri/srv_protocol_spec.rb +41 -34
- data/spec/spec_helper.rb +3 -191
- data/spec/spec_tests/change_streams_spec.rb +3 -6
- data/spec/spec_tests/data/transactions/abort.yml +3 -1
- data/spec/spec_tests/data/transactions/commit.yml +4 -3
- data/spec/spec_tests/data/transactions/error-labels.yml +17 -13
- data/spec/spec_tests/data/transactions/read-concern.yml +611 -0
- data/spec/spec_tests/data/transactions/retryable-commit.yml +126 -21
- data/spec/spec_tests/data/transactions_api/callback-aborts.yml +42 -39
- data/spec/spec_tests/data/transactions_api/callback-commits.yml +52 -50
- data/spec/spec_tests/data/transactions_api/callback-retry.yml +33 -31
- data/spec/spec_tests/data/transactions_api/commit-retry.yml +42 -39
- data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror-4.2.yml +13 -12
- data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror.yml +15 -26
- data/spec/spec_tests/data/transactions_api/commit-writeconcernerror.yml +25 -33
- data/spec/spec_tests/data/transactions_api/commit.yml +44 -42
- data/spec/spec_tests/data/transactions_api/transaction-options.yml +25 -23
- data/spec/spec_tests/max_staleness_spec.rb +2 -0
- data/spec/spec_tests/retryable_writes_spec.rb +2 -6
- data/spec/spec_tests/sdam_spec.rb +2 -0
- data/spec/spec_tests/server_selection_spec.rb +3 -0
- data/spec/spec_tests/transactions_api_spec.rb +7 -1
- data/spec/spec_tests/transactions_spec.rb +6 -0
- data/spec/spec_tests/uri_options_spec.rb +4 -26
- data/spec/support/certificates/ca.pem +21 -16
- data/spec/support/certificates/client.pem +90 -90
- data/spec/support/certificates/client_cert.pem +21 -20
- data/spec/support/certificates/client_key.pem +27 -28
- data/spec/support/certificates/client_key_encrypted.pem +26 -26
- data/spec/support/certificates/crl.pem +10 -8
- data/spec/support/certificates/crl_client_revoked.pem +11 -10
- data/spec/support/certificates/server.pem +48 -33
- data/spec/support/change_streams.rb +12 -32
- data/spec/support/client_registry.rb +12 -1
- data/spec/support/cluster_config.rb +48 -2
- data/spec/support/common_shortcuts.rb +73 -7
- data/spec/support/connection_string.rb +0 -3
- data/spec/support/constraints.rb +87 -22
- data/spec/support/crud.rb +2 -1
- data/spec/support/shared/server_selector.rb +0 -28
- data/spec/support/shared/session.rb +25 -14
- data/spec/support/transactions.rb +4 -8
- data/spec/support/transactions/operation.rb +26 -4
- data/spec/support/transactions/verifier.rb +5 -2
- metadata +496 -488
- metadata.gz.sig +5 -2
- data/spec/support/certificates/password_protected.pem +0 -51
@@ -3,6 +3,8 @@ require 'spec_helper'
|
|
3
3
|
describe 'Change stream integration', retry: 4 do
|
4
4
|
only_mri
|
5
5
|
max_example_run_time 7
|
6
|
+
min_server_fcv '3.6'
|
7
|
+
require_topology :replica_set
|
6
8
|
|
7
9
|
let(:fail_point_base_command) do
|
8
10
|
{ 'configureFailPoint' => "failCommand" }
|
@@ -23,12 +25,6 @@ describe 'Change stream integration', retry: 4 do
|
|
23
25
|
end
|
24
26
|
end
|
25
27
|
|
26
|
-
before do
|
27
|
-
unless test_change_streams?
|
28
|
-
skip 'Not testing change streams'
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
28
|
describe 'watch+next' do
|
33
29
|
let(:change_stream) { authorized_collection.watch }
|
34
30
|
|
@@ -66,7 +62,7 @@ describe 'Change stream integration', retry: 4 do
|
|
66
62
|
end
|
67
63
|
|
68
64
|
context 'error on initial aggregation' do
|
69
|
-
|
65
|
+
min_server_fcv '4.0'
|
70
66
|
clear_fail_point_before
|
71
67
|
|
72
68
|
before do
|
@@ -83,7 +79,7 @@ describe 'Change stream integration', retry: 4 do
|
|
83
79
|
end
|
84
80
|
|
85
81
|
context 'one error on getMore' do
|
86
|
-
|
82
|
+
min_server_fcv '4.0'
|
87
83
|
clear_fail_point_before
|
88
84
|
|
89
85
|
context 'error on first getMore' do
|
@@ -117,7 +113,7 @@ describe 'Change stream integration', retry: 4 do
|
|
117
113
|
end
|
118
114
|
|
119
115
|
context 'two errors on getMore' do
|
120
|
-
|
116
|
+
min_server_fcv '4.0'
|
121
117
|
clear_fail_point_before
|
122
118
|
|
123
119
|
context 'error of first getMores' do
|
@@ -155,7 +151,7 @@ describe 'Change stream integration', retry: 4 do
|
|
155
151
|
end
|
156
152
|
|
157
153
|
context 'two errors on getMore followed by an error on aggregation' do
|
158
|
-
|
154
|
+
min_server_fcv '4.0'
|
159
155
|
clear_fail_point_before
|
160
156
|
|
161
157
|
it 'next raises error' do
|
@@ -215,7 +211,7 @@ describe 'Change stream integration', retry: 4 do
|
|
215
211
|
end
|
216
212
|
|
217
213
|
context 'one error on getMore' do
|
218
|
-
|
214
|
+
min_server_fcv '4.0'
|
219
215
|
clear_fail_point_before
|
220
216
|
|
221
217
|
context 'error on first getMore' do
|
@@ -245,7 +241,7 @@ describe 'Change stream integration', retry: 4 do
|
|
245
241
|
end
|
246
242
|
|
247
243
|
context 'two errors on getMore' do
|
248
|
-
|
244
|
+
min_server_fcv '4.0'
|
249
245
|
clear_fail_point_before
|
250
246
|
|
251
247
|
before do
|
@@ -265,7 +261,7 @@ describe 'Change stream integration', retry: 4 do
|
|
265
261
|
end
|
266
262
|
|
267
263
|
context 'two errors on getMore followed by an error on aggregation' do
|
268
|
-
|
264
|
+
min_server_fcv '4.0'
|
269
265
|
clear_fail_point_before
|
270
266
|
|
271
267
|
context 'error on first getMore' do
|
@@ -316,7 +312,7 @@ describe 'Change stream integration', retry: 4 do
|
|
316
312
|
end
|
317
313
|
|
318
314
|
describe ':start_at_operation_time option' do
|
319
|
-
|
315
|
+
min_server_fcv '4.0'
|
320
316
|
|
321
317
|
before do
|
322
318
|
authorized_collection.delete_many
|
@@ -5,6 +5,7 @@ require 'spec_helper'
|
|
5
5
|
describe 'Client construction' do
|
6
6
|
let(:base_options) do
|
7
7
|
SpecConfig.instance.test_options.merge(
|
8
|
+
server_selection_timeout: 5,
|
8
9
|
database: SpecConfig.instance.test_db,
|
9
10
|
user: SpecConfig.instance.test_user.name,
|
10
11
|
password: SpecConfig.instance.test_user.password)
|
@@ -68,7 +68,7 @@ describe 'Command monitoring' do
|
|
68
68
|
context 'client with no established connections' do
|
69
69
|
# for simplicity use 3.6+ servers only, then we can assert
|
70
70
|
# scram auth commands
|
71
|
-
|
71
|
+
min_server_fcv '3.6'
|
72
72
|
|
73
73
|
it 'does not nest auth and find' do
|
74
74
|
expect(subscriber.started_events.length).to eq 0
|
@@ -77,4 +77,40 @@ describe 'Command monitoring' do
|
|
77
77
|
expect(command_names).to eq %w(saslStart saslContinue saslContinue find)
|
78
78
|
end
|
79
79
|
end
|
80
|
+
|
81
|
+
context 'when write concern is specified outside of command document' do
|
82
|
+
require_topology :replica_set
|
83
|
+
min_server_fcv '4.0'
|
84
|
+
|
85
|
+
let(:collection) do
|
86
|
+
client['command-monitoring-test']
|
87
|
+
end
|
88
|
+
let(:write_concern) { Mongo::WriteConcern.get({w: 42}) }
|
89
|
+
let(:session) { client.start_session }
|
90
|
+
let(:command) do
|
91
|
+
Mongo::Operation::Command.new(
|
92
|
+
selector: { commitTransaction: 1 },
|
93
|
+
db_name: 'admin',
|
94
|
+
session: session,
|
95
|
+
txn_num: 123,
|
96
|
+
write_concern: write_concern,
|
97
|
+
)
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'includes write concern in notified command document' do
|
101
|
+
server = client.cluster.next_primary
|
102
|
+
collection.insert_one(a: 1)
|
103
|
+
session.start_transaction
|
104
|
+
collection.insert_one({a: 1}, session: session)
|
105
|
+
|
106
|
+
subscriber.clear_events!
|
107
|
+
expect do
|
108
|
+
command.execute(server)
|
109
|
+
end.to raise_error(Mongo::Error::OperationFailure, 'Not enough data-bearing nodes (100)')
|
110
|
+
|
111
|
+
expect(subscriber.started_events.length).to eq(1)
|
112
|
+
event = subscriber.started_events.first
|
113
|
+
expect(event.command['writeConcern']['w']).to eq(42)
|
114
|
+
end
|
115
|
+
end
|
80
116
|
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Command' do
|
4
|
+
|
5
|
+
let(:subscriber) { EventSubscriber.new }
|
6
|
+
|
7
|
+
describe 'payload' do
|
8
|
+
let(:server) { authorized_client.cluster.next_primary }
|
9
|
+
|
10
|
+
let(:payload) do
|
11
|
+
command.send(:final_operation, server).send(:message, server).payload.dup.tap do |payload|
|
12
|
+
if payload['request_id'].is_a?(Integer)
|
13
|
+
payload['request_id'] = 42
|
14
|
+
end
|
15
|
+
# $clusterTime may be present depending on the client's state
|
16
|
+
payload['command'].delete('$clusterTime')
|
17
|
+
# 3.6+ servers also return a payload field, earlier ones do not.
|
18
|
+
# The contents of this field duplicates the rest of the response
|
19
|
+
# so we can get rid of it without losing information.
|
20
|
+
payload.delete('reply')
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
let(:session) { nil }
|
25
|
+
|
26
|
+
context 'commitTransaction' do
|
27
|
+
# Although these are unit tests, when targeting pre-4.0 servers
|
28
|
+
# the driver does not add arguments like write concerns to commands that
|
29
|
+
# it adds for 4.0+ servers, breaking expectations
|
30
|
+
min_server_fcv '4.0'
|
31
|
+
|
32
|
+
let(:selector) do
|
33
|
+
{ commitTransaction: 1 }.freeze
|
34
|
+
end
|
35
|
+
|
36
|
+
let(:write_concern) { nil }
|
37
|
+
|
38
|
+
let(:command) do
|
39
|
+
Mongo::Operation::Command.new(
|
40
|
+
selector: selector,
|
41
|
+
db_name: 'admin',
|
42
|
+
session: session,
|
43
|
+
txn_num: 123,
|
44
|
+
write_concern: write_concern,
|
45
|
+
)
|
46
|
+
end
|
47
|
+
|
48
|
+
let(:expected_payload) do
|
49
|
+
{
|
50
|
+
'command' => {'commitTransaction' => 1},
|
51
|
+
'command_name' => 'commitTransaction',
|
52
|
+
'database_name' => 'admin',
|
53
|
+
'request_id' => 42,
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'returns expected payload' do
|
58
|
+
expect(payload).to eq(expected_payload)
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'with session' do
|
62
|
+
min_server_fcv '3.6'
|
63
|
+
|
64
|
+
let(:session) { authorized_client.start_session }
|
65
|
+
# w will be 2 for a RS topology with 3 nodes
|
66
|
+
let(:w) do
|
67
|
+
authorized_client.write_concern.options[:w].tap do |w|
|
68
|
+
expect(w).to be_a(Integer)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
let(:expected_payload) do
|
73
|
+
{
|
74
|
+
'command' => {
|
75
|
+
'commitTransaction' => 1,
|
76
|
+
'lsid' => session.session_id,
|
77
|
+
'txnNumber' => BSON::Int64.new(123),
|
78
|
+
'writeConcern' => {'w' => w},
|
79
|
+
},
|
80
|
+
'command_name' => 'commitTransaction',
|
81
|
+
'database_name' => 'admin',
|
82
|
+
'request_id' => 42,
|
83
|
+
}
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'returns selector with write concern' do
|
87
|
+
expect(payload).to eq(expected_payload)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
context 'with write concern' do
|
92
|
+
let(:write_concern) { Mongo::WriteConcern.get(w: :majority) }
|
93
|
+
|
94
|
+
let(:expected_payload) do
|
95
|
+
{
|
96
|
+
'command' => {
|
97
|
+
'commitTransaction' => 1,
|
98
|
+
'writeConcern' => {'w' => 'majority'},
|
99
|
+
},
|
100
|
+
'command_name' => 'commitTransaction',
|
101
|
+
'database_name' => 'admin',
|
102
|
+
'request_id' => 42,
|
103
|
+
}
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'returns selector with write concern' do
|
107
|
+
expect(payload).to eq(expected_payload)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
context 'find' do
|
113
|
+
let(:selector) do
|
114
|
+
{ find: 'collection_name' }.freeze
|
115
|
+
end
|
116
|
+
|
117
|
+
let(:command) do
|
118
|
+
Mongo::Operation::Command.new(
|
119
|
+
selector: selector,
|
120
|
+
db_name: 'foo',
|
121
|
+
session: session,
|
122
|
+
)
|
123
|
+
end
|
124
|
+
|
125
|
+
let(:expected_payload) do
|
126
|
+
{
|
127
|
+
'command' => {'find' => 'collection_name'},
|
128
|
+
'command_name' => 'find',
|
129
|
+
'database_name' => 'foo',
|
130
|
+
'request_id' => 42,
|
131
|
+
}
|
132
|
+
end
|
133
|
+
|
134
|
+
it 'returns expected payload' do
|
135
|
+
expect(payload).to eq(expected_payload)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
@@ -48,6 +48,8 @@ describe 'Connections' do
|
|
48
48
|
it 'publishes server description changed event' do
|
49
49
|
expect(subscriber.events).to be_empty
|
50
50
|
|
51
|
+
wait_for_all_servers(client.cluster)
|
52
|
+
|
51
53
|
connection
|
52
54
|
subscriber.events.clear
|
53
55
|
error
|
@@ -94,7 +96,7 @@ describe 'Connections' do
|
|
94
96
|
end
|
95
97
|
|
96
98
|
context 'error during handshake to primary in a replica set' do
|
97
|
-
require_topology
|
99
|
+
require_topology :replica_set
|
98
100
|
|
99
101
|
let(:server) { client.cluster.servers.detect { |server| server.primary? } }
|
100
102
|
|
@@ -119,7 +121,7 @@ describe 'Connections' do
|
|
119
121
|
# which is not supported by modern mongos.
|
120
122
|
# Instead of mucking with this we just limit this test to 3.2+
|
121
123
|
# so that we can downgrade protocol range to 0..3 instead of 0..1.
|
122
|
-
|
124
|
+
min_server_fcv '3.2'
|
123
125
|
|
124
126
|
let(:client) { ClientRegistry.instance.global_client('authorized').with(app_name: 'wire_protocol_update') }
|
125
127
|
|
@@ -299,6 +299,37 @@ describe 'Retryable writes integration tests' do
|
|
299
299
|
end
|
300
300
|
end
|
301
301
|
|
302
|
+
shared_examples_for 'operation that is retried when server supports retryable writes' do
|
303
|
+
context 'when the server supports retryable writes' do
|
304
|
+
min_server_fcv '3.6'
|
305
|
+
|
306
|
+
before do
|
307
|
+
allow(primary_server).to receive(:retry_writes?).and_return(true)
|
308
|
+
end
|
309
|
+
|
310
|
+
context 'standalone' do
|
311
|
+
require_topology :single
|
312
|
+
|
313
|
+
it_behaves_like 'an operation that is not retried'
|
314
|
+
end
|
315
|
+
|
316
|
+
context 'replica set or sharded cluster' do
|
317
|
+
require_topology :replica_set, :sharded
|
318
|
+
|
319
|
+
it_behaves_like 'an operation that is retried'
|
320
|
+
end
|
321
|
+
end
|
322
|
+
|
323
|
+
context 'when the server does not support retryable writes' do
|
324
|
+
|
325
|
+
before do
|
326
|
+
allow(primary_server).to receive(:retry_writes?).and_return(false)
|
327
|
+
end
|
328
|
+
|
329
|
+
it_behaves_like 'an operation that is not retried'
|
330
|
+
end
|
331
|
+
end
|
332
|
+
|
302
333
|
shared_examples_for 'supported retryable writes' do
|
303
334
|
|
304
335
|
context 'when the client has retry_writes set to true' do
|
@@ -313,27 +344,7 @@ describe 'Retryable writes integration tests' do
|
|
313
344
|
client[TEST_COLL, write: SpecConfig.instance.write_concern]
|
314
345
|
end
|
315
346
|
|
316
|
-
|
317
|
-
|
318
|
-
before do
|
319
|
-
allow(primary_server).to receive(:retry_writes?).and_return(true)
|
320
|
-
end
|
321
|
-
|
322
|
-
if standalone? && sessions_enabled?
|
323
|
-
it_behaves_like 'an operation that is not retried'
|
324
|
-
elsif sessions_enabled?
|
325
|
-
it_behaves_like 'an operation that is retried'
|
326
|
-
end
|
327
|
-
end
|
328
|
-
|
329
|
-
context 'when the server does not support retryable writes' do
|
330
|
-
|
331
|
-
before do
|
332
|
-
allow(primary_server).to receive(:retry_writes?).and_return(false)
|
333
|
-
end
|
334
|
-
|
335
|
-
it_behaves_like 'an operation that is not retried'
|
336
|
-
end
|
347
|
+
it_behaves_like 'operation that is retried when server supports retryable writes'
|
337
348
|
end
|
338
349
|
|
339
350
|
context 'when the collection has write concern unacknowledged' do
|
@@ -351,27 +362,7 @@ describe 'Retryable writes integration tests' do
|
|
351
362
|
client[TEST_COLL]
|
352
363
|
end
|
353
364
|
|
354
|
-
|
355
|
-
|
356
|
-
before do
|
357
|
-
allow(primary_server).to receive(:retry_writes?).and_return(true)
|
358
|
-
end
|
359
|
-
|
360
|
-
if standalone? && sessions_enabled?
|
361
|
-
it_behaves_like 'an operation that is not retried'
|
362
|
-
elsif sessions_enabled?
|
363
|
-
it_behaves_like 'an operation that is retried'
|
364
|
-
end
|
365
|
-
end
|
366
|
-
|
367
|
-
context 'when the server does not support retryable writes' do
|
368
|
-
|
369
|
-
before do
|
370
|
-
allow(primary_server).to receive(:retry_writes?).and_return(false)
|
371
|
-
end
|
372
|
-
|
373
|
-
it_behaves_like 'an operation that is not retried'
|
374
|
-
end
|
365
|
+
it_behaves_like 'operation that is retried when server supports retryable writes'
|
375
366
|
end
|
376
367
|
end
|
377
368
|
|