mongo 2.5.0.beta → 2.5.0
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/address.rb +1 -1
- data/lib/mongo/address/unix.rb +1 -1
- data/lib/mongo/auth/user.rb +0 -5
- data/lib/mongo/auth/user/view.rb +4 -4
- data/lib/mongo/bulk_write.rb +60 -32
- data/lib/mongo/client.rb +44 -8
- data/lib/mongo/cluster.rb +14 -12
- data/lib/mongo/cluster/periodic_executor.rb +106 -0
- data/lib/mongo/cluster/{cursor_reaper.rb → reapers/cursor_reaper.rb} +5 -37
- data/lib/mongo/cluster/reapers/socket_reaper.rb +59 -0
- data/lib/mongo/collection.rb +9 -6
- data/lib/mongo/collection/view.rb +2 -2
- data/lib/mongo/collection/view/builder/aggregation.rb +2 -1
- data/lib/mongo/collection/view/builder/find_command.rb +1 -1
- data/lib/mongo/collection/view/change_stream.rb +14 -1
- data/lib/mongo/collection/view/map_reduce.rb +30 -13
- data/lib/mongo/collection/view/readable.rb +5 -5
- data/lib/mongo/collection/view/writable.rb +98 -51
- data/lib/mongo/error.rb +3 -0
- data/lib/mongo/error/invalid_txt_record.rb +27 -0
- data/lib/mongo/error/invalid_uri.rb +7 -6
- data/lib/mongo/error/mismatched_domain.rb +27 -0
- data/lib/mongo/error/no_srv_records.rb +26 -0
- data/lib/mongo/error/unsupported_features.rb +0 -18
- data/lib/mongo/index/view.rb +2 -2
- data/lib/mongo/operation.rb +1 -0
- data/lib/mongo/operation/causally_consistent.rb +33 -0
- data/lib/mongo/operation/commands.rb +2 -1
- data/lib/mongo/operation/commands/aggregate.rb +2 -7
- data/lib/mongo/operation/commands/count.rb +27 -0
- data/lib/mongo/operation/commands/distinct.rb +27 -0
- data/lib/mongo/operation/commands/find.rb +3 -1
- data/lib/mongo/operation/commands/map_reduce.rb +1 -0
- data/lib/mongo/operation/commands/parallel_scan.rb +1 -0
- data/lib/mongo/operation/specifiable.rb +12 -0
- data/lib/mongo/operation/uses_command_op_msg.rb +36 -5
- data/lib/mongo/operation/write.rb +0 -5
- data/lib/mongo/operation/write/bulk/bulkable.rb +4 -8
- data/lib/mongo/operation/write/bulk/mergable.rb +2 -0
- data/lib/mongo/operation/write/command/create_index.rb +19 -0
- data/lib/mongo/operation/write/command/create_user.rb +19 -0
- data/lib/mongo/operation/write/command/delete.rb +1 -2
- data/lib/mongo/operation/write/command/drop_index.rb +19 -0
- data/lib/mongo/operation/write/command/insert.rb +1 -2
- data/lib/mongo/operation/write/command/remove_user.rb +19 -0
- data/lib/mongo/operation/write/command/update.rb +1 -2
- data/lib/mongo/operation/write/command/update_user.rb +19 -0
- data/lib/mongo/operation/write/write_command_enabled.rb +1 -3
- data/lib/mongo/protocol/compressed.rb +2 -1
- data/lib/mongo/protocol/serializers.rb +6 -6
- data/lib/mongo/retryable.rb +48 -5
- data/lib/mongo/server.rb +15 -0
- data/lib/mongo/server/connection.rb +21 -1
- data/lib/mongo/server/connection_pool.rb +3 -0
- data/lib/mongo/server/connection_pool/queue.rb +50 -5
- data/lib/mongo/server/description.rb +11 -3
- data/lib/mongo/server/description/features.rb +26 -7
- data/lib/mongo/session.rb +133 -6
- data/lib/mongo/session/server_session.rb +30 -0
- data/lib/mongo/session/session_pool.rb +20 -20
- data/lib/mongo/uri.rb +88 -44
- data/lib/mongo/uri/srv_protocol.rb +158 -0
- data/lib/mongo/version.rb +1 -1
- data/lib/mongo/write_concern/normalizable.rb +12 -0
- data/mongo.gemspec +1 -2
- data/spec/mongo/address_spec.rb +12 -0
- data/spec/mongo/auth/user/view_spec.rb +1 -5
- data/spec/mongo/bulk_write_spec.rb +232 -401
- data/spec/mongo/change_stream_examples_spec.rb +150 -0
- data/spec/mongo/client_spec.rb +142 -2
- data/spec/mongo/cluster/cursor_reaper_spec.rb +0 -70
- data/spec/mongo/cluster/socket_reaper_spec.rb +32 -0
- data/spec/mongo/cluster_spec.rb +11 -7
- data/spec/mongo/collection/view/aggregation_spec.rb +46 -1
- data/spec/mongo/collection/view/builder/find_command_spec.rb +15 -0
- data/spec/mongo/collection/view/change_stream_spec.rb +79 -12
- data/spec/mongo/collection/view/map_reduce_spec.rb +120 -4
- data/spec/mongo/collection/view/readable_spec.rb +23 -5
- data/spec/mongo/collection_spec.rb +292 -102
- data/spec/mongo/command_monitoring_spec.rb +26 -32
- data/spec/mongo/crud_spec.rb +1 -1
- data/spec/mongo/cursor_spec.rb +2 -3
- data/spec/mongo/database_spec.rb +30 -14
- data/spec/mongo/dns_seedlist_discovery_spec.rb +94 -0
- data/spec/mongo/grid/fs_bucket_spec.rb +1 -1
- data/spec/mongo/grid/stream/write_spec.rb +1 -1
- data/spec/mongo/index/view_spec.rb +8 -46
- data/spec/mongo/operation/write/bulk/delete_spec.rb +2 -2
- data/spec/mongo/operation/write/bulk/insert_spec.rb +2 -10
- data/spec/mongo/operation/write/{create_index_spec.rb → command/create_index_spec.rb} +2 -6
- data/spec/mongo/operation/write/command/delete_spec.rb +35 -7
- data/spec/mongo/operation/write/{drop_index_spec.rb → command/drop_index_spec.rb} +1 -1
- data/spec/mongo/operation/write/command/insert_spec.rb +37 -6
- data/spec/mongo/operation/write/{remove_user_spec.rb → command/remove_user_spec.rb} +2 -6
- data/spec/mongo/operation/write/command/update_spec.rb +34 -7
- data/spec/mongo/operation/write/{update_user_spec.rb → command/update_user_spec.rb} +1 -1
- data/spec/mongo/operation/write/create_user_spec.rb +1 -1
- data/spec/mongo/operation/write/delete_spec.rb +1 -1
- data/spec/mongo/operation/write/insert_spec.rb +2 -10
- data/spec/mongo/operation/write/update_spec.rb +3 -15
- data/spec/mongo/retryable_spec.rb +1 -1
- data/spec/mongo/retryable_writes_spec.rb +815 -0
- data/spec/mongo/server/connection_pool/queue_spec.rb +35 -2
- data/spec/mongo/server/connection_pool_spec.rb +234 -1
- data/spec/mongo/server/connection_spec.rb +10 -6
- data/spec/mongo/server/description/features_spec.rb +51 -37
- data/spec/mongo/server/description_spec.rb +6 -3
- data/spec/mongo/server_spec.rb +87 -0
- data/spec/mongo/session/server_session_spec.rb +43 -0
- data/spec/mongo/session/session_pool_spec.rb +63 -27
- data/spec/mongo/session_spec.rb +247 -0
- data/spec/mongo/shell_examples_spec.rb +2 -2
- data/spec/mongo/uri/srv_protocol_spec.rb +933 -0
- data/spec/mongo/uri_spec.rb +42 -3
- data/spec/mongo/write_concern/acknowledged_spec.rb +11 -0
- data/spec/mongo/write_concern/unacknowledged_spec.rb +11 -0
- data/spec/spec_helper.rb +11 -25
- data/spec/support/authorization.rb +2 -1
- data/spec/support/connection_string.rb +8 -4
- data/spec/support/crud.rb +38 -24
- data/spec/support/crud/write.rb +30 -3
- data/spec/support/crud_tests/read/aggregate-out.yml +21 -0
- data/spec/support/crud_tests/write/bulkWrite-arrayFilters.yml +44 -0
- data/spec/support/crud_tests/write/findOneAndUpdate-arrayFilters.yml +1 -1
- data/spec/support/crud_tests/write/insertMany.yml +1 -3
- data/spec/support/crud_tests/write/replaceOne.yml +1 -1
- data/spec/support/crud_tests/write/updateMany-arrayFilters.yml +1 -1
- data/spec/support/crud_tests/write/updateOne-arrayFilters.yml +1 -1
- data/spec/support/dns_seedlist_discovery_tests/longer-parent-in-return.yml +11 -0
- data/spec/support/dns_seedlist_discovery_tests/misformatted-option.yml +5 -0
- data/spec/support/dns_seedlist_discovery_tests/no-results.yml +5 -0
- data/spec/support/dns_seedlist_discovery_tests/not-enough-parts.yml +5 -0
- data/spec/support/dns_seedlist_discovery_tests/one-result-default-port.yml +10 -0
- data/spec/support/dns_seedlist_discovery_tests/one-txt-record-multiple-strings.yml +10 -0
- data/spec/support/dns_seedlist_discovery_tests/one-txt-record.yml +11 -0
- data/spec/support/dns_seedlist_discovery_tests/parent-part-mismatch1.yml +5 -0
- data/spec/support/dns_seedlist_discovery_tests/parent-part-mismatch2.yml +5 -0
- data/spec/support/dns_seedlist_discovery_tests/parent-part-mismatch3.yml +5 -0
- data/spec/support/dns_seedlist_discovery_tests/parent-part-mismatch4.yml +5 -0
- data/spec/support/dns_seedlist_discovery_tests/parent-part-mismatch5.yml +5 -0
- data/spec/support/dns_seedlist_discovery_tests/returned-parent-too-short.yml +5 -0
- data/spec/support/dns_seedlist_discovery_tests/returned-parent-wrong.yml +5 -0
- data/spec/support/dns_seedlist_discovery_tests/two-results-default-port.yml +11 -0
- data/spec/support/dns_seedlist_discovery_tests/two-results-nonstandard-port.yml +11 -0
- data/spec/support/dns_seedlist_discovery_tests/two-txt-records.yml +5 -0
- data/spec/support/dns_seedlist_discovery_tests/txt-record-not-allowed-option.yml +5 -0
- data/spec/support/dns_seedlist_discovery_tests/txt-record-with-overridden-ssl-option.yml +11 -0
- data/spec/support/dns_seedlist_discovery_tests/txt-record-with-overridden-uri-option.yml +11 -0
- data/spec/support/dns_seedlist_discovery_tests/txt-record-with-unallowed-option.yml +5 -0
- data/spec/support/dns_seedlist_discovery_tests/uri-with-port.yml +5 -0
- data/spec/support/dns_seedlist_discovery_tests/uri-with-two-hosts.yml +5 -0
- data/spec/support/retryable_writes_tests/bulkWrite.yml +305 -0
- data/spec/support/retryable_writes_tests/deleteOne.yml +51 -0
- data/spec/support/retryable_writes_tests/findOneAndDelete.yml +52 -0
- data/spec/support/retryable_writes_tests/findOneAndReplace.yml +57 -0
- data/spec/support/retryable_writes_tests/findOneAndUpdate.yml +56 -0
- data/spec/support/retryable_writes_tests/insertMany.yml +72 -0
- data/spec/support/retryable_writes_tests/insertOne.yml +55 -0
- data/spec/support/retryable_writes_tests/replaceOne.yml +60 -0
- data/spec/support/retryable_writes_tests/updateOne.yml +120 -0
- data/spec/support/shared/session.rb +525 -24
- metadata +437 -350
- metadata.gz.sig +0 -0
- data/lib/mongo/operation/commands/user_query.rb +0 -72
- data/lib/mongo/operation/write/create_index.rb +0 -67
- data/lib/mongo/operation/write/create_user.rb +0 -50
- data/lib/mongo/operation/write/drop_index.rb +0 -63
- data/lib/mongo/operation/write/remove_user.rb +0 -48
- data/lib/mongo/operation/write/update_user.rb +0 -50
@@ -179,6 +179,24 @@ describe Mongo::Collection::View::Readable do
|
|
179
179
|
it_behaves_like 'a read concern aware operation'
|
180
180
|
end
|
181
181
|
|
182
|
+
context 'when a session supporting causal consistency is used' do
|
183
|
+
|
184
|
+
let(:view) do
|
185
|
+
Mongo::Collection::View.new(collection, selector, session: session)
|
186
|
+
end
|
187
|
+
|
188
|
+
let(:operation) do
|
189
|
+
begin; view.map_reduce(map, reduce).to_a; rescue; end
|
190
|
+
end
|
191
|
+
|
192
|
+
let(:command) do
|
193
|
+
operation
|
194
|
+
subscriber.started_events.find { |cmd| cmd.command_name == 'mapreduce' }.command
|
195
|
+
end
|
196
|
+
|
197
|
+
it_behaves_like 'an operation supporting causally consistent reads'
|
198
|
+
end
|
199
|
+
|
182
200
|
context 'when not iterating the map/reduce' do
|
183
201
|
|
184
202
|
it 'returns the map/reduce object' do
|
@@ -305,7 +323,7 @@ describe Mongo::Collection::View::Readable do
|
|
305
323
|
end
|
306
324
|
end
|
307
325
|
|
308
|
-
it 'takes a read preference option' do
|
326
|
+
it 'takes a read preference option', unless: sharded? do
|
309
327
|
expect(view.count(read: { mode: :secondary })).to eq(10)
|
310
328
|
end
|
311
329
|
|
@@ -460,13 +478,13 @@ describe Mongo::Collection::View::Readable do
|
|
460
478
|
end
|
461
479
|
end
|
462
480
|
|
463
|
-
it 'takes a max_time_ms option'
|
481
|
+
it 'takes a max_time_ms option' do
|
464
482
|
expect {
|
465
483
|
view.count(max_time_ms: 0.1)
|
466
484
|
}.to raise_error(Mongo::Error::OperationFailure)
|
467
485
|
end
|
468
486
|
|
469
|
-
it 'sets the max_time_ms option on the command'
|
487
|
+
it 'sets the max_time_ms option on the command' do
|
470
488
|
expect(view.count(max_time_ms: 100)).to eq(10)
|
471
489
|
end
|
472
490
|
|
@@ -830,7 +848,7 @@ describe Mongo::Collection::View::Readable do
|
|
830
848
|
end
|
831
849
|
end
|
832
850
|
|
833
|
-
context 'when a max_time_ms is specified'
|
851
|
+
context 'when a max_time_ms is specified' do
|
834
852
|
|
835
853
|
let(:documents) do
|
836
854
|
(1..3).map{ |i| { field: "test" }}
|
@@ -960,7 +978,7 @@ describe Mongo::Collection::View::Readable do
|
|
960
978
|
end
|
961
979
|
|
962
980
|
it 'does not apply the collation to the distinct' do
|
963
|
-
expect(result).to
|
981
|
+
expect(result).to match_array(['bang', 'BANG'])
|
964
982
|
end
|
965
983
|
end
|
966
984
|
end
|
@@ -14,6 +14,10 @@ describe Mongo::Collection do
|
|
14
14
|
authorized_client[:validating]
|
15
15
|
end
|
16
16
|
|
17
|
+
let(:client) do
|
18
|
+
authorized_client
|
19
|
+
end
|
20
|
+
|
17
21
|
describe '#==' do
|
18
22
|
|
19
23
|
let(:database) do
|
@@ -648,7 +652,6 @@ describe Mongo::Collection do
|
|
648
652
|
end
|
649
653
|
end
|
650
654
|
|
651
|
-
|
652
655
|
describe '#drop' do
|
653
656
|
|
654
657
|
let(:database) do
|
@@ -763,8 +766,12 @@ describe Mongo::Collection do
|
|
763
766
|
client[TEST_COLL].find.first
|
764
767
|
end
|
765
768
|
|
769
|
+
let(:operation_with_session) do
|
770
|
+
client[TEST_COLL].find({}, session: session).first
|
771
|
+
end
|
772
|
+
|
766
773
|
let(:second_operation) do
|
767
|
-
client[TEST_COLL].find.first
|
774
|
+
client[TEST_COLL].find({}, session: session).first
|
768
775
|
end
|
769
776
|
|
770
777
|
it_behaves_like 'an operation updating cluster time'
|
@@ -864,10 +871,6 @@ describe Mongo::Collection do
|
|
864
871
|
|
865
872
|
context 'when provided options' do
|
866
873
|
|
867
|
-
let(:view) do
|
868
|
-
authorized_collection.find({}, options)
|
869
|
-
end
|
870
|
-
|
871
874
|
context 'when a session is provided' do
|
872
875
|
|
873
876
|
let(:operation) do
|
@@ -879,7 +882,7 @@ describe Mongo::Collection do
|
|
879
882
|
end
|
880
883
|
|
881
884
|
let(:failed_operation) do
|
882
|
-
authorized_collection.find({ '$._id' => 1 }, session: session).to_a
|
885
|
+
client[authorized_collection.name].find({ '$._id' => 1 }, session: session).to_a
|
883
886
|
end
|
884
887
|
|
885
888
|
let(:client) do
|
@@ -890,6 +893,58 @@ describe Mongo::Collection do
|
|
890
893
|
it_behaves_like 'a failed operation using a session'
|
891
894
|
end
|
892
895
|
|
896
|
+
context 'session id', if: test_sessions? do
|
897
|
+
|
898
|
+
let(:options) do
|
899
|
+
{ session: session }
|
900
|
+
end
|
901
|
+
|
902
|
+
let(:client) do
|
903
|
+
authorized_client.with(heartbeat_frequency: 100).tap do |cl|
|
904
|
+
cl.subscribe(Mongo::Monitoring::COMMAND, subscriber)
|
905
|
+
end
|
906
|
+
end
|
907
|
+
|
908
|
+
let(:session) do
|
909
|
+
client.start_session
|
910
|
+
end
|
911
|
+
|
912
|
+
let(:subscriber) do
|
913
|
+
EventSubscriber.new
|
914
|
+
end
|
915
|
+
|
916
|
+
let(:view) do
|
917
|
+
Mongo::Collection::View.new(client[TEST_COLL], selector, view_options)
|
918
|
+
end
|
919
|
+
|
920
|
+
let(:command) do
|
921
|
+
client[TEST_COLL].find({}, session: session).explain
|
922
|
+
subscriber.started_events.find { |c| c.command_name == :explain }.command
|
923
|
+
end
|
924
|
+
|
925
|
+
it 'sends the session id' do
|
926
|
+
expect(command['lsid']).to eq(session.session_id)
|
927
|
+
end
|
928
|
+
end
|
929
|
+
|
930
|
+
context 'when a session supporting causal consistency is used' do
|
931
|
+
|
932
|
+
let(:operation) do
|
933
|
+
collection.find({}, session: session).to_a
|
934
|
+
end
|
935
|
+
|
936
|
+
let(:command) do
|
937
|
+
operation
|
938
|
+
subscriber.started_events.find { |cmd| cmd.command_name == 'find' }.command
|
939
|
+
end
|
940
|
+
|
941
|
+
it_behaves_like 'an operation supporting causally consistent reads'
|
942
|
+
end
|
943
|
+
|
944
|
+
let(:view) do
|
945
|
+
authorized_collection.find({}, options)
|
946
|
+
end
|
947
|
+
|
893
948
|
context 'when provided :allow_partial_results' do
|
894
949
|
|
895
950
|
let(:options) do
|
@@ -1064,6 +1119,19 @@ describe Mongo::Collection do
|
|
1064
1119
|
it_behaves_like 'a failed operation using a session'
|
1065
1120
|
end
|
1066
1121
|
|
1122
|
+
context 'when unacknowledged writes is used' do
|
1123
|
+
|
1124
|
+
let(:collection_with_unacknowledged_write_concern) do
|
1125
|
+
authorized_collection.with(write: { w: 0 })
|
1126
|
+
end
|
1127
|
+
|
1128
|
+
let(:operation) do
|
1129
|
+
collection_with_unacknowledged_write_concern.insert_many([{ name: 'test1' }, { name: 'test2' }], session: session)
|
1130
|
+
end
|
1131
|
+
|
1132
|
+
it_behaves_like 'a causally consistent client session with an unacknowledged write'
|
1133
|
+
end
|
1134
|
+
|
1067
1135
|
context 'when a document contains invalid keys' do
|
1068
1136
|
|
1069
1137
|
let(:docs) do
|
@@ -1218,6 +1286,21 @@ describe Mongo::Collection do
|
|
1218
1286
|
end
|
1219
1287
|
end
|
1220
1288
|
end
|
1289
|
+
|
1290
|
+
context 'when unacknowledged writes is used' do
|
1291
|
+
|
1292
|
+
let(:collection_with_unacknowledged_write_concern) do
|
1293
|
+
authorized_collection.with(write: { w: 0 })
|
1294
|
+
end
|
1295
|
+
|
1296
|
+
let(:result) do
|
1297
|
+
collection_with_unacknowledged_write_concern.insert_many([{ _id: 1 }, { _id: 1 }])
|
1298
|
+
end
|
1299
|
+
|
1300
|
+
it 'does not raise an exception' do
|
1301
|
+
expect(result.inserted_count).to be(0)
|
1302
|
+
end
|
1303
|
+
end
|
1221
1304
|
end
|
1222
1305
|
|
1223
1306
|
describe '#insert_one' do
|
@@ -1228,8 +1311,12 @@ describe Mongo::Collection do
|
|
1228
1311
|
client[TEST_COLL].insert_one({ name: 'testing' })
|
1229
1312
|
end
|
1230
1313
|
|
1314
|
+
let(:operation_with_session) do
|
1315
|
+
client[TEST_COLL].insert_one({ name: 'testing' }, session: session)
|
1316
|
+
end
|
1317
|
+
|
1231
1318
|
let(:second_operation) do
|
1232
|
-
client[TEST_COLL].insert_one({ name: 'testing' })
|
1319
|
+
client[TEST_COLL].insert_one({ name: 'testing' }, session: session)
|
1233
1320
|
end
|
1234
1321
|
|
1235
1322
|
it_behaves_like 'an operation updating cluster time'
|
@@ -1239,14 +1326,10 @@ describe Mongo::Collection do
|
|
1239
1326
|
authorized_collection.insert_one({ name: 'testing' })
|
1240
1327
|
end
|
1241
1328
|
|
1242
|
-
it 'inserts the document into the collection'
|
1329
|
+
it 'inserts the document into the collection'do
|
1243
1330
|
expect(result.written_count).to eq(1)
|
1244
1331
|
end
|
1245
1332
|
|
1246
|
-
it 'inserts the document into the collection', unless: write_command_enabled? do
|
1247
|
-
expect(result.written_count).to eq(0)
|
1248
|
-
end
|
1249
|
-
|
1250
1333
|
it 'contains the id in the result' do
|
1251
1334
|
expect(result.inserted_id).to_not be_nil
|
1252
1335
|
end
|
@@ -1274,6 +1357,19 @@ describe Mongo::Collection do
|
|
1274
1357
|
it_behaves_like 'a failed operation using a session'
|
1275
1358
|
end
|
1276
1359
|
|
1360
|
+
context 'when unacknowledged writes is used' do
|
1361
|
+
|
1362
|
+
let(:collection_with_unacknowledged_write_concern) do
|
1363
|
+
authorized_collection.with(write: { w: 0 })
|
1364
|
+
end
|
1365
|
+
|
1366
|
+
let(:operation) do
|
1367
|
+
collection_with_unacknowledged_write_concern.insert_one({ name: 'testing' }, session: session)
|
1368
|
+
end
|
1369
|
+
|
1370
|
+
it_behaves_like 'a causally consistent client session with an unacknowledged write'
|
1371
|
+
end
|
1372
|
+
|
1277
1373
|
context 'when the document contains invalid keys' do
|
1278
1374
|
|
1279
1375
|
let(:doc) do
|
@@ -1459,13 +1555,31 @@ describe Mongo::Collection do
|
|
1459
1555
|
client[TEST_COLL].aggregate([]).first
|
1460
1556
|
end
|
1461
1557
|
|
1558
|
+
let(:operation_with_session) do
|
1559
|
+
client[TEST_COLL].aggregate([], session: session).first
|
1560
|
+
end
|
1561
|
+
|
1462
1562
|
let(:second_operation) do
|
1463
|
-
client[TEST_COLL].aggregate([]).first
|
1563
|
+
client[TEST_COLL].aggregate([], session: session).first
|
1464
1564
|
end
|
1465
1565
|
|
1466
1566
|
it_behaves_like 'an operation updating cluster time'
|
1467
1567
|
end
|
1468
1568
|
|
1569
|
+
context 'when a session supporting causal consistency is used' do
|
1570
|
+
|
1571
|
+
let(:operation) do
|
1572
|
+
collection.aggregate([], session: session).first
|
1573
|
+
end
|
1574
|
+
|
1575
|
+
let(:command) do
|
1576
|
+
operation
|
1577
|
+
subscriber.started_events.find { |cmd| cmd.command_name == 'aggregate' }.command
|
1578
|
+
end
|
1579
|
+
|
1580
|
+
it_behaves_like 'an operation supporting causally consistent reads'
|
1581
|
+
end
|
1582
|
+
|
1469
1583
|
it 'returns an Aggregation object' do
|
1470
1584
|
expect(authorized_collection.aggregate([])).to be_a(Mongo::Collection::View::Aggregation)
|
1471
1585
|
end
|
@@ -1480,6 +1594,17 @@ describe Mongo::Collection do
|
|
1480
1594
|
expect(authorized_collection.aggregate([], options).options).to eq(BSON::Document.new(options))
|
1481
1595
|
end
|
1482
1596
|
|
1597
|
+
context 'when the :comment option is provided' do
|
1598
|
+
|
1599
|
+
let(:options) do
|
1600
|
+
{ :comment => 'testing' }
|
1601
|
+
end
|
1602
|
+
|
1603
|
+
it 'sets the options on the Aggregation object' do
|
1604
|
+
expect(authorized_collection.aggregate([], options).options).to eq(BSON::Document.new(options))
|
1605
|
+
end
|
1606
|
+
end
|
1607
|
+
|
1483
1608
|
context 'when a session is provided' do
|
1484
1609
|
|
1485
1610
|
let(:session) do
|
@@ -1605,6 +1730,20 @@ describe Mongo::Collection do
|
|
1605
1730
|
it_behaves_like 'a failed operation using a session'
|
1606
1731
|
end
|
1607
1732
|
|
1733
|
+
context 'when a session supporting causal consistency is used' do
|
1734
|
+
|
1735
|
+
let(:operation) do
|
1736
|
+
collection.count({}, session: session)
|
1737
|
+
end
|
1738
|
+
|
1739
|
+
let(:command) do
|
1740
|
+
operation
|
1741
|
+
subscriber.started_events.find { |cmd| cmd.command_name == :count }.command
|
1742
|
+
end
|
1743
|
+
|
1744
|
+
it_behaves_like 'an operation supporting causally consistent reads'
|
1745
|
+
end
|
1746
|
+
|
1608
1747
|
context 'when a collation is specified' do
|
1609
1748
|
|
1610
1749
|
let(:selector) do
|
@@ -1705,6 +1844,20 @@ describe Mongo::Collection do
|
|
1705
1844
|
end
|
1706
1845
|
end
|
1707
1846
|
|
1847
|
+
context 'when a session supporting causal consistency is used' do
|
1848
|
+
|
1849
|
+
let(:operation) do
|
1850
|
+
collection.distinct(:field, {}, session: session)
|
1851
|
+
end
|
1852
|
+
|
1853
|
+
let(:command) do
|
1854
|
+
operation
|
1855
|
+
subscriber.started_events.find { |cmd| cmd.command_name == :distinct }.command
|
1856
|
+
end
|
1857
|
+
|
1858
|
+
it_behaves_like 'an operation supporting causally consistent reads'
|
1859
|
+
end
|
1860
|
+
|
1708
1861
|
context 'when a collation is specified' do
|
1709
1862
|
|
1710
1863
|
let(:result) do
|
@@ -1762,7 +1915,7 @@ describe Mongo::Collection do
|
|
1762
1915
|
end
|
1763
1916
|
|
1764
1917
|
it 'does not apply the collation to the distinct' do
|
1765
|
-
expect(result).to
|
1918
|
+
expect(result).to match_array(['bang', 'BANG'])
|
1766
1919
|
end
|
1767
1920
|
end
|
1768
1921
|
end
|
@@ -1842,6 +1995,19 @@ describe Mongo::Collection do
|
|
1842
1995
|
it_behaves_like 'a failed operation using a session'
|
1843
1996
|
end
|
1844
1997
|
|
1998
|
+
context 'when unacknowledged writes is used' do
|
1999
|
+
|
2000
|
+
let(:collection_with_unacknowledged_write_concern) do
|
2001
|
+
authorized_collection.with(write: { w: 0 })
|
2002
|
+
end
|
2003
|
+
|
2004
|
+
let(:operation) do
|
2005
|
+
collection_with_unacknowledged_write_concern.delete_one({}, session: session)
|
2006
|
+
end
|
2007
|
+
|
2008
|
+
it_behaves_like 'a causally consistent client session with an unacknowledged write'
|
2009
|
+
end
|
2010
|
+
|
1845
2011
|
context 'when a collation is provided' do
|
1846
2012
|
|
1847
2013
|
let(:selector) do
|
@@ -2001,6 +2167,19 @@ describe Mongo::Collection do
|
|
2001
2167
|
it_behaves_like 'a failed operation using a session'
|
2002
2168
|
end
|
2003
2169
|
|
2170
|
+
context 'when unacknowledged writes is used' do
|
2171
|
+
|
2172
|
+
let(:collection_with_unacknowledged_write_concern) do
|
2173
|
+
authorized_collection.with(write: { w: 0 })
|
2174
|
+
end
|
2175
|
+
|
2176
|
+
let(:operation) do
|
2177
|
+
collection_with_unacknowledged_write_concern.delete_many({ '$._id' => 1}, session: session)
|
2178
|
+
end
|
2179
|
+
|
2180
|
+
it_behaves_like 'a causally consistent client session with an unacknowledged write'
|
2181
|
+
end
|
2182
|
+
|
2004
2183
|
context 'when a collation is specified' do
|
2005
2184
|
|
2006
2185
|
let(:selector) do
|
@@ -2119,34 +2298,24 @@ describe Mongo::Collection do
|
|
2119
2298
|
authorized_collection.parallel_scan(2)
|
2120
2299
|
end
|
2121
2300
|
|
2122
|
-
it 'returns an array of cursors'
|
2301
|
+
it 'returns an array of cursors' do
|
2123
2302
|
cursors.each do |cursor|
|
2124
2303
|
expect(cursor.class).to be(Mongo::Cursor)
|
2125
2304
|
end
|
2126
2305
|
end
|
2127
2306
|
|
2128
|
-
it 'returns the correct number of documents'
|
2307
|
+
it 'returns the correct number of documents' do
|
2129
2308
|
expect(
|
2130
2309
|
cursors.reduce(0) { |total, cursor| total + cursor.to_a.size }
|
2131
2310
|
).to eq(200)
|
2132
2311
|
end
|
2133
2312
|
|
2134
|
-
it 'raises an error', unless: write_command_enabled? do
|
2135
|
-
expect {
|
2136
|
-
cursors
|
2137
|
-
}.to raise_error(Mongo::Error::OperationFailure)
|
2138
|
-
end
|
2139
|
-
|
2140
2313
|
context 'when a session is provided' do
|
2141
2314
|
|
2142
2315
|
let(:cursors) do
|
2143
2316
|
authorized_collection.parallel_scan(2, session: session)
|
2144
2317
|
end
|
2145
2318
|
|
2146
|
-
let(:session) do
|
2147
|
-
authorized_client.start_session
|
2148
|
-
end
|
2149
|
-
|
2150
2319
|
let(:operation) do
|
2151
2320
|
cursors.reduce(0) { |total, cursor| total + cursor.to_a.size }
|
2152
2321
|
end
|
@@ -2163,6 +2332,24 @@ describe Mongo::Collection do
|
|
2163
2332
|
it_behaves_like 'a failed operation using a session'
|
2164
2333
|
end
|
2165
2334
|
|
2335
|
+
context 'when a session supporting causal consistency is used' do
|
2336
|
+
|
2337
|
+
let(:cursors) do
|
2338
|
+
collection.parallel_scan(2, session: session)
|
2339
|
+
end
|
2340
|
+
|
2341
|
+
let(:operation) do
|
2342
|
+
cursors.reduce(0) { |total, cursor| total + cursor.to_a.size }
|
2343
|
+
end
|
2344
|
+
|
2345
|
+
let(:command) do
|
2346
|
+
operation
|
2347
|
+
subscriber.started_events.find { |cmd| cmd.command_name == :parallelCollectionScan }.command
|
2348
|
+
end
|
2349
|
+
|
2350
|
+
it_behaves_like 'an operation supporting causally consistent reads'
|
2351
|
+
end
|
2352
|
+
|
2166
2353
|
context 'when a read concern is provided', if: find_command_enabled? do
|
2167
2354
|
|
2168
2355
|
let(:result) do
|
@@ -2224,7 +2411,7 @@ describe Mongo::Collection do
|
|
2224
2411
|
end
|
2225
2412
|
end
|
2226
2413
|
|
2227
|
-
context 'when a max time ms value is provided', if:
|
2414
|
+
context 'when a max time ms value is provided', if: !sharded? do
|
2228
2415
|
|
2229
2416
|
let(:result) do
|
2230
2417
|
authorized_collection.parallel_scan(2, options)
|
@@ -2276,14 +2463,10 @@ describe Mongo::Collection do
|
|
2276
2463
|
authorized_collection.find(field: 'testing').first
|
2277
2464
|
end
|
2278
2465
|
|
2279
|
-
it 'updates the first matching document in the collection'
|
2466
|
+
it 'updates the first matching document in the collection' do
|
2280
2467
|
expect(response.modified_count).to eq(1)
|
2281
2468
|
end
|
2282
2469
|
|
2283
|
-
it 'does not return modified count', unless: write_command_enabled? do
|
2284
|
-
expect(response.modified_count).to eq(nil)
|
2285
|
-
end
|
2286
|
-
|
2287
2470
|
it 'updates the documents in the collection' do
|
2288
2471
|
expect(updated[:field]).to eq('testing')
|
2289
2472
|
end
|
@@ -2299,14 +2482,10 @@ describe Mongo::Collection do
|
|
2299
2482
|
authorized_collection.find(field: 'test1').to_a
|
2300
2483
|
end
|
2301
2484
|
|
2302
|
-
it 'reports that no documents were written'
|
2485
|
+
it 'reports that no documents were written' do
|
2303
2486
|
expect(response.modified_count).to eq(0)
|
2304
2487
|
end
|
2305
2488
|
|
2306
|
-
it 'does not return modified count', unless: write_command_enabled? do
|
2307
|
-
expect(response.modified_count).to eq(nil)
|
2308
|
-
end
|
2309
|
-
|
2310
2489
|
it 'does not insert the document' do
|
2311
2490
|
expect(updated).to be_empty
|
2312
2491
|
end
|
@@ -2341,14 +2520,10 @@ describe Mongo::Collection do
|
|
2341
2520
|
authorized_collection.find(field: 'test1').to_a
|
2342
2521
|
end
|
2343
2522
|
|
2344
|
-
it 'reports that no documents were written'
|
2523
|
+
it 'reports that no documents were written' do
|
2345
2524
|
expect(response.modified_count).to eq(0)
|
2346
2525
|
end
|
2347
2526
|
|
2348
|
-
it 'does not return modified count', unless: write_command_enabled? do
|
2349
|
-
expect(response.modified_count).to eq(nil)
|
2350
|
-
end
|
2351
|
-
|
2352
2527
|
it 'does not insert the document' do
|
2353
2528
|
expect(updated).to be_empty
|
2354
2529
|
end
|
@@ -2550,6 +2725,19 @@ describe Mongo::Collection do
|
|
2550
2725
|
it_behaves_like 'an operation using a session'
|
2551
2726
|
it_behaves_like 'a failed operation using a session'
|
2552
2727
|
end
|
2728
|
+
|
2729
|
+
context 'when unacknowledged writes is used' do
|
2730
|
+
|
2731
|
+
let(:collection_with_unacknowledged_write_concern) do
|
2732
|
+
authorized_collection.with(write: { w: 0 })
|
2733
|
+
end
|
2734
|
+
|
2735
|
+
let(:operation) do
|
2736
|
+
collection_with_unacknowledged_write_concern.replace_one({ a: 1 }, { x: 5 }, session: session)
|
2737
|
+
end
|
2738
|
+
|
2739
|
+
it_behaves_like 'a causally consistent client session with an unacknowledged write'
|
2740
|
+
end
|
2553
2741
|
end
|
2554
2742
|
|
2555
2743
|
describe '#update_many' do
|
@@ -2572,14 +2760,10 @@ describe Mongo::Collection do
|
|
2572
2760
|
authorized_collection.find(field: 'testing').to_a.last
|
2573
2761
|
end
|
2574
2762
|
|
2575
|
-
it 'returns the number updated'
|
2763
|
+
it 'returns the number updated' do
|
2576
2764
|
expect(response.modified_count).to eq(2)
|
2577
2765
|
end
|
2578
2766
|
|
2579
|
-
it 'does not return modified count', unless: write_command_enabled? do
|
2580
|
-
expect(response.modified_count).to eq(nil)
|
2581
|
-
end
|
2582
|
-
|
2583
2767
|
it 'updates the documents in the collection' do
|
2584
2768
|
expect(updated[:field]).to eq('testing')
|
2585
2769
|
end
|
@@ -2596,14 +2780,10 @@ describe Mongo::Collection do
|
|
2596
2780
|
authorized_collection.find.to_a
|
2597
2781
|
end
|
2598
2782
|
|
2599
|
-
it 'reports that no documents were updated'
|
2783
|
+
it 'reports that no documents were updated' do
|
2600
2784
|
expect(response.modified_count).to eq(0)
|
2601
2785
|
end
|
2602
2786
|
|
2603
|
-
it 'does not return modified count', unless: write_command_enabled? do
|
2604
|
-
expect(response.modified_count).to eq(nil)
|
2605
|
-
end
|
2606
|
-
|
2607
2787
|
it 'updates no documents in the collection' do
|
2608
2788
|
expect(updated).to be_empty
|
2609
2789
|
end
|
@@ -2639,14 +2819,10 @@ describe Mongo::Collection do
|
|
2639
2819
|
authorized_collection.find.to_a
|
2640
2820
|
end
|
2641
2821
|
|
2642
|
-
it 'reports that no documents were updated'
|
2822
|
+
it 'reports that no documents were updated' do
|
2643
2823
|
expect(response.modified_count).to eq(0)
|
2644
2824
|
end
|
2645
2825
|
|
2646
|
-
it 'does not return modified count', unless: write_command_enabled? do
|
2647
|
-
expect(response.modified_count).to eq(nil)
|
2648
|
-
end
|
2649
|
-
|
2650
2826
|
it 'updates no documents in the collection' do
|
2651
2827
|
expect(updated).to be_empty
|
2652
2828
|
end
|
@@ -2953,6 +3129,19 @@ describe Mongo::Collection do
|
|
2953
3129
|
it_behaves_like 'an operation using a session'
|
2954
3130
|
it_behaves_like 'a failed operation using a session'
|
2955
3131
|
end
|
3132
|
+
|
3133
|
+
context 'when unacknowledged writes is used' do
|
3134
|
+
|
3135
|
+
let(:collection_with_unacknowledged_write_concern) do
|
3136
|
+
authorized_collection.with(write: { w: 0 })
|
3137
|
+
end
|
3138
|
+
|
3139
|
+
let(:operation) do
|
3140
|
+
collection_with_unacknowledged_write_concern.update_many({a: 1}, { '$set' => {x: 1} }, session: session)
|
3141
|
+
end
|
3142
|
+
|
3143
|
+
it_behaves_like 'a causally consistent client session with an unacknowledged write'
|
3144
|
+
end
|
2956
3145
|
end
|
2957
3146
|
|
2958
3147
|
describe '#update_one' do
|
@@ -2975,14 +3164,10 @@ describe Mongo::Collection do
|
|
2975
3164
|
authorized_collection.find(field: 'testing').first
|
2976
3165
|
end
|
2977
3166
|
|
2978
|
-
it 'updates the first matching document in the collection'
|
3167
|
+
it 'updates the first matching document in the collection' do
|
2979
3168
|
expect(response.modified_count).to eq(1)
|
2980
3169
|
end
|
2981
3170
|
|
2982
|
-
it 'does not return modified count', unless: write_command_enabled? do
|
2983
|
-
expect(response.modified_count).to eq(nil)
|
2984
|
-
end
|
2985
|
-
|
2986
3171
|
it 'updates the documents in the collection' do
|
2987
3172
|
expect(updated[:field]).to eq('testing')
|
2988
3173
|
end
|
@@ -2999,14 +3184,10 @@ describe Mongo::Collection do
|
|
2999
3184
|
authorized_collection.find.to_a
|
3000
3185
|
end
|
3001
3186
|
|
3002
|
-
it 'reports that no documents were updated'
|
3187
|
+
it 'reports that no documents were updated' do
|
3003
3188
|
expect(response.modified_count).to eq(0)
|
3004
3189
|
end
|
3005
3190
|
|
3006
|
-
it 'does not return modified count', unless: write_command_enabled? do
|
3007
|
-
expect(response.modified_count).to eq(nil)
|
3008
|
-
end
|
3009
|
-
|
3010
3191
|
it 'updates no documents in the collection' do
|
3011
3192
|
expect(updated).to be_empty
|
3012
3193
|
end
|
@@ -3042,14 +3223,10 @@ describe Mongo::Collection do
|
|
3042
3223
|
authorized_collection.find.to_a
|
3043
3224
|
end
|
3044
3225
|
|
3045
|
-
it 'reports that no documents were updated'
|
3226
|
+
it 'reports that no documents were updated' do
|
3046
3227
|
expect(response.modified_count).to eq(0)
|
3047
3228
|
end
|
3048
3229
|
|
3049
|
-
it 'does not return modified count', unless: write_command_enabled? do
|
3050
|
-
expect(response.modified_count).to eq(nil)
|
3051
|
-
end
|
3052
|
-
|
3053
3230
|
it 'updates no documents in the collection' do
|
3054
3231
|
expect(updated).to be_empty
|
3055
3232
|
end
|
@@ -3365,6 +3542,19 @@ describe Mongo::Collection do
|
|
3365
3542
|
it_behaves_like 'an operation using a session'
|
3366
3543
|
it_behaves_like 'a failed operation using a session'
|
3367
3544
|
end
|
3545
|
+
|
3546
|
+
context 'when unacknowledged writes is used' do
|
3547
|
+
|
3548
|
+
let(:collection_with_unacknowledged_write_concern) do
|
3549
|
+
authorized_collection.with(write: { w: 0 })
|
3550
|
+
end
|
3551
|
+
|
3552
|
+
let(:operation) do
|
3553
|
+
collection_with_unacknowledged_write_concern.update_one({a: 1}, { '$set' => {x: 1} }, session: session)
|
3554
|
+
end
|
3555
|
+
|
3556
|
+
it_behaves_like 'a causally consistent client session with an unacknowledged write'
|
3557
|
+
end
|
3368
3558
|
end
|
3369
3559
|
|
3370
3560
|
describe '#find_one_and_delete' do
|
@@ -3447,7 +3637,7 @@ describe Mongo::Collection do
|
|
3447
3637
|
end
|
3448
3638
|
end
|
3449
3639
|
|
3450
|
-
context 'when max_time_ms is provided'
|
3640
|
+
context 'when max_time_ms is provided' do
|
3451
3641
|
|
3452
3642
|
it 'includes the max_time_ms value in the command' do
|
3453
3643
|
expect {
|
@@ -3472,7 +3662,7 @@ describe Mongo::Collection do
|
|
3472
3662
|
end
|
3473
3663
|
end
|
3474
3664
|
|
3475
|
-
context 'when the operation fails'
|
3665
|
+
context 'when the operation fails' do
|
3476
3666
|
|
3477
3667
|
let(:result) do
|
3478
3668
|
authorized_collection.find_one_and_delete(selector, max_time_ms: 0.1)
|
@@ -3685,7 +3875,7 @@ describe Mongo::Collection do
|
|
3685
3875
|
|
3686
3876
|
context 'when max_time_ms is provided' do
|
3687
3877
|
|
3688
|
-
it 'includes the max_time_ms value in the command'
|
3878
|
+
it 'includes the max_time_ms value in the command' do
|
3689
3879
|
expect {
|
3690
3880
|
authorized_collection.find_one_and_update(selector, { '$set' => { field: 'testing' }}, max_time_ms: 0.1)
|
3691
3881
|
}.to raise_error(Mongo::Error::OperationFailure)
|
@@ -3740,7 +3930,7 @@ describe Mongo::Collection do
|
|
3740
3930
|
end
|
3741
3931
|
end
|
3742
3932
|
|
3743
|
-
context 'when the operation fails'
|
3933
|
+
context 'when the operation fails' do
|
3744
3934
|
|
3745
3935
|
let(:result) do
|
3746
3936
|
authorized_collection.find_one_and_update(selector, { '$set' => { field: 'testing' }}, max_time_ms: 0.1)
|
@@ -4116,7 +4306,7 @@ describe Mongo::Collection do
|
|
4116
4306
|
end
|
4117
4307
|
end
|
4118
4308
|
|
4119
|
-
context 'when max_time_ms is provided'
|
4309
|
+
context 'when max_time_ms is provided' do
|
4120
4310
|
|
4121
4311
|
it 'includes the max_time_ms value in the command' do
|
4122
4312
|
expect {
|
@@ -4125,7 +4315,7 @@ describe Mongo::Collection do
|
|
4125
4315
|
end
|
4126
4316
|
end
|
4127
4317
|
|
4128
|
-
context 'when the operation fails'
|
4318
|
+
context 'when the operation fails' do
|
4129
4319
|
|
4130
4320
|
let(:result) do
|
4131
4321
|
authorized_collection.find_one_and_replace(selector, { field: 'testing' }, max_time_ms: 0.1)
|
@@ -4364,8 +4554,11 @@ describe Mongo::Collection do
|
|
4364
4554
|
context 'when batch_size is provided' do
|
4365
4555
|
|
4366
4556
|
before do
|
4367
|
-
|
4368
|
-
|
4557
|
+
Thread.new do
|
4558
|
+
sleep 1
|
4559
|
+
authorized_collection.insert_one(a: 2)
|
4560
|
+
authorized_collection.insert_one(a: 3)
|
4561
|
+
end
|
4369
4562
|
end
|
4370
4563
|
|
4371
4564
|
let(:change_stream) do
|
@@ -4375,31 +4568,28 @@ describe Mongo::Collection do
|
|
4375
4568
|
it 'returns the documents in the batch size specified' do
|
4376
4569
|
expect(change_stream.instance_variable_get(:@cursor)).to receive(:get_more).once.and_call_original
|
4377
4570
|
enum.next
|
4378
|
-
enum.next
|
4379
4571
|
end
|
4380
4572
|
end
|
4381
4573
|
|
4382
4574
|
context 'when collation is provided' do
|
4383
|
-
|
4384
|
-
|
4385
|
-
|
4386
|
-
|
4387
|
-
|
4388
|
-
|
4389
|
-
|
4390
|
-
|
4391
|
-
|
4392
|
-
|
4393
|
-
|
4394
|
-
|
4395
|
-
|
4396
|
-
|
4397
|
-
|
4398
|
-
|
4399
|
-
|
4400
|
-
|
4401
|
-
# expect(change_doc[:fullDocument][:a]).to eq(2)
|
4402
|
-
# end
|
4575
|
+
|
4576
|
+
before do
|
4577
|
+
authorized_collection.update_one({ a: 1 }, { '$set' => { a: 2 } })
|
4578
|
+
end
|
4579
|
+
|
4580
|
+
let(:change_doc) do
|
4581
|
+
enum.next
|
4582
|
+
end
|
4583
|
+
|
4584
|
+
let(:change_stream) do
|
4585
|
+
authorized_collection.watch([ { '$match' => { operationType: 'UPDATE'}}],
|
4586
|
+
collation: { locale: 'en_US', strength: 2 } ).to_enum
|
4587
|
+
end
|
4588
|
+
|
4589
|
+
it 'returns the change' do
|
4590
|
+
expect(change_doc['operationType']).to eq('update')
|
4591
|
+
expect(change_doc['updateDescription']['updatedFields']['a']).to eq(2)
|
4592
|
+
end
|
4403
4593
|
end
|
4404
4594
|
end
|
4405
4595
|
end
|