mongo 2.4.3 → 2.5.0.beta
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 +3 -2
- data.tar.gz.sig +0 -0
- data/lib/mongo.rb +3 -2
- data/lib/mongo/auth/cr.rb +6 -4
- data/lib/mongo/auth/cr/conversation.rb +33 -17
- data/lib/mongo/auth/ldap.rb +4 -2
- data/lib/mongo/auth/ldap/conversation.rb +19 -9
- data/lib/mongo/auth/scram.rb +7 -4
- data/lib/mongo/auth/scram/conversation.rb +62 -24
- data/lib/mongo/auth/user.rb +10 -0
- data/lib/mongo/auth/user/view.rb +44 -22
- data/lib/mongo/auth/x509.rb +4 -2
- data/lib/mongo/auth/x509/conversation.rb +19 -9
- data/lib/mongo/bulk_write.rb +33 -27
- data/lib/mongo/bulk_write/combineable.rb +5 -0
- data/lib/mongo/bulk_write/transformable.rb +2 -0
- data/lib/mongo/bulk_write/validatable.rb +4 -0
- data/lib/mongo/client.rb +123 -12
- data/lib/mongo/cluster.rb +52 -11
- data/lib/mongo/cluster/app_metadata.rb +8 -2
- data/lib/mongo/cluster/cursor_reaper.rb +0 -1
- data/lib/mongo/cluster/topology.rb +1 -1
- data/lib/mongo/collection.rb +114 -27
- data/lib/mongo/collection/view.rb +8 -2
- data/lib/mongo/collection/view/aggregation.rb +11 -7
- data/lib/mongo/collection/view/builder/aggregation.rb +5 -1
- data/lib/mongo/collection/view/builder/find_command.rb +5 -3
- data/lib/mongo/collection/view/builder/map_reduce.rb +11 -3
- data/lib/mongo/collection/view/builder/op_query.rb +1 -1
- data/lib/mongo/collection/view/change_stream.rb +160 -0
- data/lib/mongo/collection/view/change_stream/retryable.rb +57 -0
- data/lib/mongo/collection/view/iterable.rb +11 -10
- data/lib/mongo/collection/view/map_reduce.rb +22 -18
- data/lib/mongo/collection/view/readable.rb +51 -37
- data/lib/mongo/collection/view/writable.rb +72 -40
- data/lib/mongo/cursor.rb +25 -4
- data/lib/mongo/cursor/builder/get_more_command.rb +4 -2
- data/lib/mongo/database.rb +22 -11
- data/lib/mongo/database/view.rb +16 -12
- data/lib/mongo/error.rb +5 -0
- data/lib/mongo/error/invalid_session.rb +36 -0
- data/lib/mongo/error/missing_resume_token.rb +39 -0
- data/lib/mongo/error/operation_failure.rb +17 -0
- data/lib/mongo/error/parser.rb +3 -2
- data/lib/mongo/error/unknown_payload_type.rb +41 -0
- data/lib/mongo/error/unsupported_array_filters.rb +51 -0
- data/lib/mongo/error/unsupported_message_type.rb +23 -0
- data/lib/mongo/grid/fs_bucket.rb +5 -4
- data/lib/mongo/grid/stream/read.rb +3 -2
- data/lib/mongo/grid/stream/write.rb +2 -2
- data/lib/mongo/index/view.rb +35 -25
- data/lib/mongo/monitoring/event/secure.rb +14 -0
- data/lib/mongo/operation.rb +16 -0
- data/lib/mongo/operation/commands.rb +1 -0
- data/lib/mongo/operation/commands/aggregate.rb +9 -5
- data/lib/mongo/operation/commands/aggregate/result.rb +1 -1
- data/lib/mongo/operation/commands/collections_info.rb +6 -6
- data/lib/mongo/operation/commands/command.rb +2 -1
- data/lib/mongo/operation/commands/create.rb +6 -2
- data/lib/mongo/operation/commands/drop.rb +6 -2
- data/lib/mongo/operation/commands/drop_database.rb +6 -2
- data/lib/mongo/operation/commands/explain.rb +27 -0
- data/lib/mongo/operation/commands/explain/result.rb +52 -0
- data/lib/mongo/operation/commands/indexes.rb +1 -1
- data/lib/mongo/operation/commands/list_collections.rb +1 -1
- data/lib/mongo/operation/commands/list_collections/result.rb +1 -1
- data/lib/mongo/operation/commands/list_indexes.rb +1 -1
- data/lib/mongo/operation/commands/list_indexes/result.rb +1 -1
- data/lib/mongo/operation/commands/map_reduce.rb +8 -4
- data/lib/mongo/operation/commands/map_reduce/result.rb +13 -1
- data/lib/mongo/operation/commands/user_query.rb +1 -1
- data/lib/mongo/operation/commands/users_info.rb +6 -2
- data/lib/mongo/operation/executable.rb +4 -1
- data/lib/mongo/operation/read_preference.rb +10 -5
- data/lib/mongo/operation/result.rb +26 -2
- data/lib/mongo/operation/specifiable.rb +13 -1
- data/lib/mongo/operation/uses_command_op_msg.rb +47 -0
- data/lib/mongo/operation/write/bulk/bulkable.rb +4 -1
- data/lib/mongo/operation/write/bulk/insert/result.rb +4 -4
- data/lib/mongo/operation/write/command/create_index.rb +6 -1
- data/lib/mongo/operation/write/command/delete.rb +28 -4
- data/lib/mongo/operation/write/command/drop_index.rb +6 -1
- data/lib/mongo/operation/write/command/insert.rb +22 -18
- data/lib/mongo/operation/write/command/update.rb +24 -9
- data/lib/mongo/operation/write/command/writable.rb +14 -1
- data/lib/mongo/operation/write/insert.rb +4 -1
- data/lib/mongo/operation/write/insert/result.rb +2 -2
- data/lib/mongo/operation/write/update.rb +7 -1
- data/lib/mongo/operation/write/write_command_enabled.rb +20 -3
- data/lib/mongo/protocol.rb +3 -0
- data/lib/mongo/protocol/bit_vector.rb +2 -2
- data/lib/mongo/protocol/compressed.rb +135 -0
- data/lib/mongo/protocol/delete.rb +8 -6
- data/lib/mongo/protocol/get_more.rb +8 -6
- data/lib/mongo/protocol/insert.rb +8 -6
- data/lib/mongo/protocol/kill_cursors.rb +8 -6
- data/lib/mongo/protocol/message.rb +31 -3
- data/lib/mongo/protocol/msg.rb +172 -0
- data/lib/mongo/protocol/query.rb +26 -6
- data/lib/mongo/protocol/registry.rb +76 -0
- data/lib/mongo/protocol/reply.rb +10 -5
- data/lib/mongo/protocol/serializers.rb +224 -0
- data/lib/mongo/protocol/update.rb +8 -6
- data/lib/mongo/retryable.rb +4 -2
- data/lib/mongo/server.rb +6 -3
- data/lib/mongo/server/connectable.rb +1 -1
- data/lib/mongo/server/connection.rb +30 -8
- data/lib/mongo/server/description.rb +25 -1
- data/lib/mongo/server/description/features.rb +4 -1
- data/lib/mongo/server/monitor.rb +5 -0
- data/lib/mongo/server/monitor/connection.rb +50 -2
- data/lib/mongo/server_selector/nearest.rb +10 -4
- data/lib/mongo/server_selector/primary.rb +20 -0
- data/lib/mongo/server_selector/primary_preferred.rb +10 -4
- data/lib/mongo/server_selector/secondary.rb +10 -4
- data/lib/mongo/server_selector/secondary_preferred.rb +24 -4
- data/lib/mongo/session.rb +180 -0
- data/lib/mongo/session/server_session.rb +73 -0
- data/lib/mongo/session/session_pool.rb +161 -0
- data/lib/mongo/uri.rb +11 -0
- data/lib/mongo/version.rb +1 -1
- data/mongo.gemspec +2 -1
- data/spec/mongo/auth/cr_spec.rb +12 -0
- data/spec/mongo/auth/ldap_spec.rb +2 -0
- data/spec/mongo/auth/scram/conversation_spec.rb +6 -6
- data/spec/mongo/auth/scram_spec.rb +25 -1
- data/spec/mongo/auth/user/view_spec.rb +268 -76
- data/spec/mongo/auth/x509_spec.rb +2 -0
- data/spec/mongo/bulk_write_spec.rb +435 -5
- data/spec/mongo/client_spec.rb +356 -39
- data/spec/mongo/cluster/app_metadata_spec.rb +2 -2
- data/spec/mongo/cluster_spec.rb +176 -0
- data/spec/mongo/collection/view/aggregation_spec.rb +33 -12
- data/spec/mongo/collection/view/builder/find_command_spec.rb +46 -6
- data/spec/mongo/collection/view/change_stream_spec.rb +814 -0
- data/spec/mongo/collection/view/map_reduce_spec.rb +94 -17
- data/spec/mongo/collection/view/readable_spec.rb +3 -12
- data/spec/mongo/collection_spec.rb +1048 -42
- data/spec/mongo/cursor/builder/get_more_command_spec.rb +19 -0
- data/spec/mongo/cursor_spec.rb +2 -2
- data/spec/mongo/database_spec.rb +50 -1
- data/spec/mongo/grid/fs_bucket_spec.rb +225 -137
- data/spec/mongo/grid/stream/read_spec.rb +2 -2
- data/spec/mongo/index/view_spec.rb +146 -8
- data/spec/mongo/monitoring/event/secure_spec.rb +42 -0
- data/spec/mongo/operation/read/query_spec.rb +2 -1
- data/spec/mongo/operation/specifiable_spec.rb +2 -2
- data/spec/mongo/operation/write/command/delete_spec.rb +96 -13
- data/spec/mongo/operation/write/command/insert_spec.rb +111 -12
- data/spec/mongo/operation/write/command/update_spec.rb +93 -10
- data/spec/mongo/operation/write/delete_spec.rb +1 -1
- data/spec/mongo/operation/write/insert_spec.rb +1 -1
- data/spec/mongo/operation/write/update_spec.rb +1 -1
- data/spec/mongo/protocol/compressed_spec.rb +66 -0
- data/spec/mongo/protocol/delete_spec.rb +14 -0
- data/spec/mongo/protocol/get_more_spec.rb +14 -0
- data/spec/mongo/protocol/insert_spec.rb +14 -0
- data/spec/mongo/protocol/kill_cursors_spec.rb +14 -0
- data/spec/mongo/protocol/msg_spec.rb +499 -0
- data/spec/mongo/protocol/query_spec.rb +45 -0
- data/spec/mongo/protocol/registry_spec.rb +31 -0
- data/spec/mongo/protocol/reply_spec.rb +14 -0
- data/spec/mongo/protocol/update_spec.rb +14 -0
- data/spec/mongo/retryable_spec.rb +6 -2
- data/spec/mongo/sdam_spec.rb +4 -0
- data/spec/mongo/server/connection_spec.rb +4 -2
- data/spec/mongo/server/description_spec.rb +28 -1
- data/spec/mongo/session/server_session_spec.rb +16 -0
- data/spec/mongo/session/session_pool_spec.rb +194 -0
- data/spec/mongo/uri_spec.rb +31 -2
- data/spec/spec_helper.rb +104 -0
- data/spec/support/authorization.rb +6 -1
- data/spec/support/crud.rb +3 -1
- data/spec/support/crud/write.rb +6 -1
- data/spec/support/crud_tests/write/findOneAndUpdate-arrayFilters.yml +69 -0
- data/spec/support/crud_tests/write/updateMany-arrayFilters.yml +63 -0
- data/spec/support/crud_tests/write/updateOne-arrayFilters.yml +109 -0
- data/spec/support/sdam/rs/discover_arbiters.yml +1 -1
- data/spec/support/sdam/rs/discover_passives.yml +2 -2
- data/spec/support/sdam/rs/discover_primary.yml +1 -1
- data/spec/support/sdam/rs/discover_secondary.yml +1 -1
- data/spec/support/sdam/rs/discovery.yml +4 -4
- data/spec/support/sdam/rs/equal_electionids.yml +1 -0
- data/spec/support/sdam/rs/ghost_discovered.yml +1 -1
- data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +1 -1
- data/spec/support/sdam/rs/ls_timeout.yml +88 -0
- data/spec/support/sdam/rs/member_reconfig.yml +2 -2
- data/spec/support/sdam/rs/member_standalone.yml +2 -2
- data/spec/support/sdam/rs/new_primary.yml +2 -2
- data/spec/support/sdam/rs/new_primary_new_electionid.yml +3 -0
- data/spec/support/sdam/rs/new_primary_new_setversion.yml +3 -0
- data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +2 -2
- data/spec/support/sdam/rs/non_rs_member.yml +1 -1
- data/spec/support/sdam/rs/normalize_case.yml +1 -1
- data/spec/support/sdam/rs/null_election_id.yml +4 -0
- data/spec/support/sdam/rs/primary_becomes_standalone.yml +2 -2
- data/spec/support/sdam/rs/primary_changes_set_name.yml +2 -2
- data/spec/support/sdam/rs/primary_disconnect.yml +2 -2
- data/spec/support/sdam/rs/primary_disconnect_electionid.yml +5 -0
- data/spec/support/sdam/rs/primary_disconnect_setversion.yml +5 -0
- data/spec/support/sdam/rs/primary_hint_from_secondary_with_mismatched_me.yml +58 -0
- data/spec/support/sdam/rs/primary_reports_new_member.yml +4 -4
- data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +2 -2
- data/spec/support/sdam/rs/primary_wrong_set_name.yml +1 -1
- data/spec/support/sdam/rs/response_from_removed.yml +2 -2
- data/spec/support/sdam/rs/rsother_discovered.yml +1 -1
- data/spec/support/sdam/rs/sec_not_auth.yml +1 -1
- data/spec/support/sdam/rs/secondary_wrong_set_name.yml +1 -1
- data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +2 -2
- data/spec/support/sdam/rs/setversion_without_electionid.yml +2 -0
- data/spec/support/sdam/rs/stepdown_change_set_name.yml +2 -2
- data/spec/support/sdam/rs/unexpected_mongos.yml +1 -1
- data/spec/support/sdam/rs/use_setversion_without_electionid.yml +3 -0
- data/spec/support/sdam/rs/wrong_set_name.yml +1 -1
- data/spec/support/sdam/sharded/ls_timeout_mongos.yml +97 -0
- data/spec/support/sdam/sharded/mongos_disconnect.yml +3 -3
- data/spec/support/sdam/sharded/multiple_mongoses.yml +1 -1
- data/spec/support/sdam/sharded/non_mongos_removed.yml +1 -1
- data/spec/support/sdam/sharded/normalize_uri_case.yml +1 -1
- data/spec/support/sdam/single/direct_connection_external_ip.yml +1 -1
- data/spec/support/sdam/single/direct_connection_mongos.yml +1 -1
- data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
- data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
- data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
- data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
- data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
- data/spec/support/sdam/single/ls_timeout_standalone.yml +35 -0
- data/spec/support/sdam/single/not_ok_response.yml +1 -1
- data/spec/support/sdam/single/standalone_removed.yml +1 -1
- data/spec/support/sdam/single/unavailable_seed.yml +1 -1
- data/spec/support/server_discovery_and_monitoring.rb +4 -0
- data/spec/support/shared/session.rb +236 -0
- metadata +53 -15
- metadata.gz.sig +0 -0
data/spec/mongo/client_spec.rb
CHANGED
@@ -218,6 +218,119 @@ describe Mongo::Client do
|
|
218
218
|
|
219
219
|
context 'when providing options' do
|
220
220
|
|
221
|
+
context 'when compressors are provided' do
|
222
|
+
|
223
|
+
let(:client) do
|
224
|
+
described_class.new([default_address.seed], authorized_client.options.merge(options))
|
225
|
+
end
|
226
|
+
|
227
|
+
after do
|
228
|
+
client.close
|
229
|
+
end
|
230
|
+
|
231
|
+
context 'when the compressor is supported' do
|
232
|
+
|
233
|
+
let(:options) do
|
234
|
+
{ compressors: ['zlib'] }
|
235
|
+
end
|
236
|
+
|
237
|
+
it 'sets the compressor' do
|
238
|
+
expect(client.options['compressors']).to eq(options[:compressors])
|
239
|
+
end
|
240
|
+
|
241
|
+
it 'sends the compressor in the compression key of the handshake document' do
|
242
|
+
expect(client.cluster.app_metadata.send(:document)[:compression]).to eq(options[:compressors])
|
243
|
+
end
|
244
|
+
|
245
|
+
it 'uses compression for messages', if: testing_compression? do
|
246
|
+
expect(Mongo::Protocol::Compressed).to receive(:new).and_call_original
|
247
|
+
client[TEST_COLL].find({}, limit: 1).first
|
248
|
+
end
|
249
|
+
|
250
|
+
it 'does not use compression for authentication messages' do
|
251
|
+
expect(Mongo::Protocol::Compressed).not_to receive(:new)
|
252
|
+
client.cluster.next_primary.send(:with_connection) do |conn|
|
253
|
+
conn.send(:authenticate!)
|
254
|
+
end
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
context 'when the compressor is not supported by the driver' do
|
259
|
+
|
260
|
+
let(:options) do
|
261
|
+
{ compressors: ['snoopy'] }
|
262
|
+
end
|
263
|
+
|
264
|
+
it 'does not set the compressor and warns' do
|
265
|
+
expect(Mongo::Logger.logger).to receive(:warn)
|
266
|
+
expect(client.options['compressors']).to be_nil
|
267
|
+
end
|
268
|
+
|
269
|
+
it 'sets the compression key of the handshake document to an empty array' do
|
270
|
+
expect(client.cluster.app_metadata.send(:document)[:compression]).to eq([])
|
271
|
+
end
|
272
|
+
|
273
|
+
context 'when one supported compressor and one unsupported compressor are provided', if: compression_enabled? do
|
274
|
+
|
275
|
+
let(:options) do
|
276
|
+
{ compressors: ['zlib', 'snoopy'] }
|
277
|
+
end
|
278
|
+
|
279
|
+
it 'does not set the unsupported compressor and warns' do
|
280
|
+
expect(Mongo::Logger.logger).to receive(:warn).at_least(:once)
|
281
|
+
expect(client.options['compressors']).to eq(['zlib'])
|
282
|
+
end
|
283
|
+
|
284
|
+
it 'sets the compression key of the handshake document to the list of supported compressors' do
|
285
|
+
expect(client.cluster.app_metadata.send(:document)[:compression]).to eq(['zlib'])
|
286
|
+
end
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
290
|
+
context 'when the compressor is not supported by the server', unless: collation_enabled? do
|
291
|
+
|
292
|
+
let(:options) do
|
293
|
+
{ compressors: ['zlib'] }
|
294
|
+
end
|
295
|
+
|
296
|
+
it 'does not set the compressor and warns' do
|
297
|
+
expect(Mongo::Logger.logger).to receive(:warn).at_least(:once)
|
298
|
+
expect(client.cluster.next_primary.monitor.compressor).to be_nil
|
299
|
+
end
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
context 'when compressors are not provided', unless: compression_enabled? do
|
304
|
+
|
305
|
+
let(:client) do
|
306
|
+
authorized_client
|
307
|
+
end
|
308
|
+
|
309
|
+
it 'does not set the compressor' do
|
310
|
+
expect(client.options['compressors']).to be_nil
|
311
|
+
end
|
312
|
+
|
313
|
+
it 'sets the compression key of the handshake document to an empty array' do
|
314
|
+
expect(client.cluster.app_metadata.send(:document)[:compression]).to eq([])
|
315
|
+
end
|
316
|
+
|
317
|
+
it 'does not use compression for messages' do
|
318
|
+
client[TEST_COLL].find({}, limit: 1).first
|
319
|
+
expect(Mongo::Protocol::Compressed).not_to receive(:new)
|
320
|
+
end
|
321
|
+
end
|
322
|
+
|
323
|
+
context 'when a zlib_compression_level option is provided', if: testing_compression? do
|
324
|
+
|
325
|
+
let(:client) do
|
326
|
+
described_class.new([default_address.seed], TEST_OPTIONS.merge(zlib_compression_level: 1))
|
327
|
+
end
|
328
|
+
|
329
|
+
it 'sets the option on the client' do
|
330
|
+
expect(client.options[:zlib_compression_level]).to eq(1)
|
331
|
+
end
|
332
|
+
end
|
333
|
+
|
221
334
|
context 'when ssl options are provided' do
|
222
335
|
|
223
336
|
let(:options) do
|
@@ -444,6 +557,25 @@ describe Mongo::Client do
|
|
444
557
|
end
|
445
558
|
end
|
446
559
|
|
560
|
+
context 'when max_pool_size and min_pool_size are both nil' do
|
561
|
+
|
562
|
+
let(:client) do
|
563
|
+
described_class.new(['127.0.0.1:27017'], options)
|
564
|
+
end
|
565
|
+
|
566
|
+
let(:options) do
|
567
|
+
{
|
568
|
+
:min_pool_size => nil,
|
569
|
+
:max_pool_size => nil
|
570
|
+
}
|
571
|
+
end
|
572
|
+
|
573
|
+
it 'does not set either option' do
|
574
|
+
expect(client.options[:max_pool_size]).to be_nil
|
575
|
+
expect(client.options[:min_pool_size]).to be_nil
|
576
|
+
end
|
577
|
+
end
|
578
|
+
|
447
579
|
context 'when platform details are specified' do
|
448
580
|
|
449
581
|
let(:app_metadata) do
|
@@ -690,6 +822,122 @@ describe Mongo::Client do
|
|
690
822
|
end
|
691
823
|
end
|
692
824
|
|
825
|
+
describe '#server_selector' do
|
826
|
+
|
827
|
+
context 'when there is a read preference set' do
|
828
|
+
|
829
|
+
let(:client) do
|
830
|
+
described_class.new(['127.0.0.1:27017'],
|
831
|
+
:database => TEST_DB,
|
832
|
+
:read => mode,
|
833
|
+
:server_selection_timeout => 2)
|
834
|
+
end
|
835
|
+
|
836
|
+
let(:server_selector) do
|
837
|
+
client.server_selector
|
838
|
+
end
|
839
|
+
|
840
|
+
context 'when mode is primary' do
|
841
|
+
|
842
|
+
let(:mode) do
|
843
|
+
{ :mode => :primary }
|
844
|
+
end
|
845
|
+
|
846
|
+
it 'returns a primary server selector' do
|
847
|
+
expect(server_selector).to be_a(Mongo::ServerSelector::Primary)
|
848
|
+
end
|
849
|
+
|
850
|
+
it 'passes the options to the cluster' do
|
851
|
+
expect(client.cluster.options[:server_selection_timeout]).to eq(2)
|
852
|
+
end
|
853
|
+
end
|
854
|
+
|
855
|
+
context 'when mode is primary_preferred' do
|
856
|
+
|
857
|
+
let(:mode) do
|
858
|
+
{ :mode => :primary_preferred }
|
859
|
+
end
|
860
|
+
|
861
|
+
it 'returns a primary preferred server selector' do
|
862
|
+
expect(server_selector).to be_a(Mongo::ServerSelector::PrimaryPreferred)
|
863
|
+
end
|
864
|
+
end
|
865
|
+
|
866
|
+
context 'when mode is secondary' do
|
867
|
+
|
868
|
+
let(:mode) do
|
869
|
+
{ :mode => :secondary }
|
870
|
+
end
|
871
|
+
|
872
|
+
it 'uses a Secondary server selector' do
|
873
|
+
expect(server_selector).to be_a(Mongo::ServerSelector::Secondary)
|
874
|
+
end
|
875
|
+
end
|
876
|
+
|
877
|
+
context 'when mode is secondary preferred' do
|
878
|
+
|
879
|
+
let(:mode) do
|
880
|
+
{ :mode => :secondary_preferred }
|
881
|
+
end
|
882
|
+
|
883
|
+
it 'uses a Secondary server selector' do
|
884
|
+
expect(server_selector).to be_a(Mongo::ServerSelector::SecondaryPreferred)
|
885
|
+
end
|
886
|
+
end
|
887
|
+
|
888
|
+
context 'when mode is nearest' do
|
889
|
+
|
890
|
+
let(:mode) do
|
891
|
+
{ :mode => :nearest }
|
892
|
+
end
|
893
|
+
|
894
|
+
it 'uses a Secondary server selector' do
|
895
|
+
expect(server_selector).to be_a(Mongo::ServerSelector::Nearest)
|
896
|
+
end
|
897
|
+
end
|
898
|
+
|
899
|
+
context 'when no mode provided' do
|
900
|
+
|
901
|
+
let(:client) do
|
902
|
+
described_class.new(['127.0.0.1:27017'],
|
903
|
+
:database => TEST_DB,
|
904
|
+
:server_selection_timeout => 2)
|
905
|
+
end
|
906
|
+
|
907
|
+
it 'returns a primary server selector' do
|
908
|
+
expect(server_selector).to be_a(Mongo::ServerSelector::Primary)
|
909
|
+
end
|
910
|
+
end
|
911
|
+
|
912
|
+
context 'when the read preference is printed' do
|
913
|
+
|
914
|
+
let(:client) do
|
915
|
+
described_class.new([ default_address.to_s ], options)
|
916
|
+
end
|
917
|
+
|
918
|
+
let(:options) do
|
919
|
+
{ user: 'Emily', password: 'sensitive_data', server_selection_timeout: 0.1 }
|
920
|
+
end
|
921
|
+
|
922
|
+
before do
|
923
|
+
allow(client.database.cluster).to receive(:single?).and_return(false)
|
924
|
+
end
|
925
|
+
|
926
|
+
let(:error) do
|
927
|
+
begin
|
928
|
+
client.database.command(ping: 1)
|
929
|
+
rescue => e
|
930
|
+
e
|
931
|
+
end
|
932
|
+
end
|
933
|
+
|
934
|
+
it 'redacts sensitive client options' do
|
935
|
+
expect(error.message).not_to match(options[:password])
|
936
|
+
end
|
937
|
+
end
|
938
|
+
end
|
939
|
+
end
|
940
|
+
|
693
941
|
describe '#read_preference' do
|
694
942
|
|
695
943
|
let(:client) do
|
@@ -710,11 +958,7 @@ describe Mongo::Client do
|
|
710
958
|
end
|
711
959
|
|
712
960
|
it 'returns a primary read preference' do
|
713
|
-
expect(preference).to
|
714
|
-
end
|
715
|
-
|
716
|
-
it 'passes the options to the cluster' do
|
717
|
-
expect(client.cluster.options[:server_selection_timeout]).to eq(2)
|
961
|
+
expect(preference).to eq(BSON::Document.new(mode))
|
718
962
|
end
|
719
963
|
end
|
720
964
|
|
@@ -725,7 +969,7 @@ describe Mongo::Client do
|
|
725
969
|
end
|
726
970
|
|
727
971
|
it 'returns a primary preferred read preference' do
|
728
|
-
expect(preference).to
|
972
|
+
expect(preference).to eq(BSON::Document.new(mode))
|
729
973
|
end
|
730
974
|
end
|
731
975
|
|
@@ -736,7 +980,7 @@ describe Mongo::Client do
|
|
736
980
|
end
|
737
981
|
|
738
982
|
it 'returns a secondary read preference' do
|
739
|
-
expect(preference).to
|
983
|
+
expect(preference).to eq(BSON::Document.new(mode))
|
740
984
|
end
|
741
985
|
end
|
742
986
|
|
@@ -747,7 +991,7 @@ describe Mongo::Client do
|
|
747
991
|
end
|
748
992
|
|
749
993
|
it 'returns a secondary preferred read preference' do
|
750
|
-
expect(preference).to
|
994
|
+
expect(preference).to eq(BSON::Document.new(mode))
|
751
995
|
end
|
752
996
|
end
|
753
997
|
|
@@ -758,45 +1002,20 @@ describe Mongo::Client do
|
|
758
1002
|
end
|
759
1003
|
|
760
1004
|
it 'returns a nearest read preference' do
|
761
|
-
expect(preference).to
|
1005
|
+
expect(preference).to eq(BSON::Document.new(mode))
|
762
1006
|
end
|
763
1007
|
end
|
764
1008
|
|
765
1009
|
context 'when no mode provided' do
|
766
1010
|
|
767
|
-
let(:mode) do
|
768
|
-
{}
|
769
|
-
end
|
770
|
-
|
771
|
-
it 'returns a primary read preference' do
|
772
|
-
expect(preference).to be_a(Mongo::ServerSelector::Primary)
|
773
|
-
end
|
774
|
-
end
|
775
|
-
|
776
|
-
context 'when the read preference is printed' do
|
777
|
-
|
778
1011
|
let(:client) do
|
779
|
-
described_class.new([
|
1012
|
+
described_class.new(['127.0.0.1:27017'],
|
1013
|
+
:database => TEST_DB,
|
1014
|
+
:server_selection_timeout => 2)
|
780
1015
|
end
|
781
1016
|
|
782
|
-
|
783
|
-
|
784
|
-
end
|
785
|
-
|
786
|
-
before do
|
787
|
-
allow(client.database.cluster).to receive(:single?).and_return(false)
|
788
|
-
end
|
789
|
-
|
790
|
-
let(:error) do
|
791
|
-
begin
|
792
|
-
client.database.command(ping: 1)
|
793
|
-
rescue => e
|
794
|
-
e
|
795
|
-
end
|
796
|
-
end
|
797
|
-
|
798
|
-
it 'redacts sensitive client options' do
|
799
|
-
expect(error.message).not_to match(options[:password])
|
1017
|
+
it 'returns nil' do
|
1018
|
+
expect(preference).to be_nil
|
800
1019
|
end
|
801
1020
|
end
|
802
1021
|
end
|
@@ -1133,4 +1352,102 @@ describe Mongo::Client do
|
|
1133
1352
|
expect(authorized_client.collections).to all(be_a(Mongo::Collection))
|
1134
1353
|
end
|
1135
1354
|
end
|
1355
|
+
|
1356
|
+
describe '#start_session' do
|
1357
|
+
|
1358
|
+
let(:session) do
|
1359
|
+
authorized_client.start_session
|
1360
|
+
end
|
1361
|
+
|
1362
|
+
context 'when sessions are supported', if: sessions_enabled? do
|
1363
|
+
|
1364
|
+
it 'creates a session' do
|
1365
|
+
expect(session).to be_a(Mongo::Session)
|
1366
|
+
end
|
1367
|
+
|
1368
|
+
it 'sets the last use field to the current time' do
|
1369
|
+
expect(session.instance_variable_get(:@server_session).last_use).to be_within(0.2).of(Time.now)
|
1370
|
+
end
|
1371
|
+
|
1372
|
+
context 'when options are provided' do
|
1373
|
+
|
1374
|
+
let(:options) do
|
1375
|
+
{ causally_consistent: true }
|
1376
|
+
end
|
1377
|
+
|
1378
|
+
let(:session) do
|
1379
|
+
authorized_client.start_session(options)
|
1380
|
+
end
|
1381
|
+
|
1382
|
+
it 'sets the options on the session' do
|
1383
|
+
expect(session.options).to eq(options)
|
1384
|
+
end
|
1385
|
+
end
|
1386
|
+
|
1387
|
+
context 'when options are not provided' do
|
1388
|
+
|
1389
|
+
it 'does not set options on the session' do
|
1390
|
+
expect(session.options).to be_empty
|
1391
|
+
end
|
1392
|
+
end
|
1393
|
+
|
1394
|
+
context 'when a session is checked out and checked back in' do
|
1395
|
+
|
1396
|
+
let!(:session_a) do
|
1397
|
+
authorized_client.start_session
|
1398
|
+
end
|
1399
|
+
|
1400
|
+
let!(:session_b) do
|
1401
|
+
authorized_client.start_session
|
1402
|
+
end
|
1403
|
+
|
1404
|
+
let!(:session_a_server_session) do
|
1405
|
+
session_a.instance_variable_get(:@server_session)
|
1406
|
+
end
|
1407
|
+
|
1408
|
+
let!(:session_b_server_session) do
|
1409
|
+
session_b.instance_variable_get(:@server_session)
|
1410
|
+
end
|
1411
|
+
|
1412
|
+
before do
|
1413
|
+
session_a.end_session
|
1414
|
+
session_b.end_session
|
1415
|
+
end
|
1416
|
+
|
1417
|
+
it 'is returned to the front of the queue' do
|
1418
|
+
expect(authorized_client.start_session.instance_variable_get(:@server_session)).to be(session_b_server_session)
|
1419
|
+
expect(authorized_client.start_session.instance_variable_get(:@server_session)).to be(session_a_server_session)
|
1420
|
+
end
|
1421
|
+
end
|
1422
|
+
|
1423
|
+
context 'when an implicit session is used' do
|
1424
|
+
|
1425
|
+
before do
|
1426
|
+
authorized_client.database.command(ping: 1)
|
1427
|
+
end
|
1428
|
+
|
1429
|
+
let(:pool) do
|
1430
|
+
authorized_client.instance_variable_get(:@session_pool)
|
1431
|
+
end
|
1432
|
+
|
1433
|
+
let!(:before_last_use) do
|
1434
|
+
pool.instance_variable_get(:@queue)[0].last_use
|
1435
|
+
end
|
1436
|
+
|
1437
|
+
it 'uses the session and updates the last use time' do
|
1438
|
+
authorized_client.database.command(ping: 1)
|
1439
|
+
expect(before_last_use).to be < (pool.instance_variable_get(:@queue)[0].last_use)
|
1440
|
+
end
|
1441
|
+
end
|
1442
|
+
end
|
1443
|
+
|
1444
|
+
context 'when sessions are not supported', unless: sessions_enabled? do
|
1445
|
+
|
1446
|
+
it 'raises an exception' do
|
1447
|
+
expect {
|
1448
|
+
session
|
1449
|
+
}.to raise_exception(Mongo::Error::InvalidSession)
|
1450
|
+
end
|
1451
|
+
end
|
1452
|
+
end
|
1136
1453
|
end
|