mongo 2.2.7 → 2.3.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/LICENSE +1 -1
- data/README.md +1 -1
- data/Rakefile +1 -1
- data/lib/mongo.rb +1 -1
- data/lib/mongo/address.rb +1 -1
- data/lib/mongo/address/ipv4.rb +1 -1
- data/lib/mongo/address/ipv6.rb +1 -1
- data/lib/mongo/address/unix.rb +1 -1
- data/lib/mongo/auth.rb +1 -1
- data/lib/mongo/auth/cr.rb +1 -1
- data/lib/mongo/auth/ldap.rb +1 -1
- data/lib/mongo/auth/roles.rb +1 -1
- data/lib/mongo/auth/user.rb +1 -1
- data/lib/mongo/auth/user/view.rb +5 -5
- data/lib/mongo/auth/x509.rb +1 -1
- data/lib/mongo/bson.rb +1 -1
- data/lib/mongo/bulk_write.rb +4 -4
- data/lib/mongo/bulk_write/combineable.rb +1 -1
- data/lib/mongo/bulk_write/ordered_combiner.rb +1 -1
- data/lib/mongo/bulk_write/result.rb +1 -1
- data/lib/mongo/bulk_write/result_combiner.rb +1 -1
- data/lib/mongo/bulk_write/transformable.rb +1 -1
- data/lib/mongo/bulk_write/unordered_combiner.rb +1 -1
- data/lib/mongo/bulk_write/validatable.rb +1 -1
- data/lib/mongo/client.rb +2 -2
- data/lib/mongo/cluster.rb +15 -3
- data/lib/mongo/cluster/cursor_reaper.rb +174 -0
- data/lib/mongo/cluster/topology.rb +1 -1
- data/lib/mongo/cluster/topology/replica_set.rb +1 -1
- data/lib/mongo/cluster/topology/sharded.rb +1 -1
- data/lib/mongo/cluster/topology/single.rb +1 -1
- data/lib/mongo/cluster/topology/unknown.rb +1 -1
- data/lib/mongo/collection.rb +5 -4
- data/lib/mongo/collection/view.rb +4 -4
- data/lib/mongo/collection/view/aggregation.rb +2 -2
- data/lib/mongo/collection/view/builder.rb +1 -1
- data/lib/mongo/collection/view/builder/aggregation.rb +1 -1
- data/lib/mongo/collection/view/builder/find_command.rb +1 -1
- data/lib/mongo/collection/view/builder/flags.rb +1 -1
- data/lib/mongo/collection/view/builder/map_reduce.rb +1 -1
- data/lib/mongo/collection/view/builder/modifiers.rb +1 -1
- data/lib/mongo/collection/view/builder/op_query.rb +1 -1
- data/lib/mongo/collection/view/explainable.rb +1 -1
- data/lib/mongo/collection/view/immutable.rb +1 -1
- data/lib/mongo/collection/view/iterable.rb +2 -2
- data/lib/mongo/collection/view/map_reduce.rb +3 -3
- data/lib/mongo/collection/view/readable.rb +23 -6
- data/lib/mongo/collection/view/writable.rb +3 -3
- data/lib/mongo/cursor.rb +50 -7
- data/lib/mongo/cursor/builder.rb +1 -1
- data/lib/mongo/cursor/builder/get_more_command.rb +1 -1
- data/lib/mongo/cursor/builder/kill_cursors_command.rb +29 -1
- data/lib/mongo/cursor/builder/op_get_more.rb +1 -1
- data/lib/mongo/cursor/builder/op_kill_cursors.rb +29 -1
- data/lib/mongo/database.rb +4 -4
- data/lib/mongo/database/view.rb +2 -2
- data/lib/mongo/dbref.rb +4 -3
- data/lib/mongo/error.rb +1 -1
- data/lib/mongo/error/bulk_write_error.rb +1 -1
- data/lib/mongo/error/closed_stream.rb +1 -1
- data/lib/mongo/error/extra_file_chunk.rb +1 -1
- data/lib/mongo/error/file_not_found.rb +1 -1
- data/lib/mongo/error/invalid_bulk_operation.rb +1 -1
- data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -1
- data/lib/mongo/error/invalid_collection_name.rb +1 -1
- data/lib/mongo/error/invalid_database_name.rb +1 -1
- data/lib/mongo/error/invalid_document.rb +1 -1
- data/lib/mongo/error/invalid_file.rb +1 -1
- data/lib/mongo/error/invalid_file_revision.rb +1 -1
- data/lib/mongo/error/invalid_nonce.rb +1 -1
- data/lib/mongo/error/invalid_replacement_document.rb +1 -1
- data/lib/mongo/error/invalid_server_preference.rb +1 -1
- data/lib/mongo/error/invalid_signature.rb +1 -1
- data/lib/mongo/error/invalid_update_document.rb +1 -1
- data/lib/mongo/error/invalid_uri.rb +1 -1
- data/lib/mongo/error/invalid_write_concern.rb +1 -1
- data/lib/mongo/error/max_bson_size.rb +1 -1
- data/lib/mongo/error/max_message_size.rb +1 -1
- data/lib/mongo/error/missing_file_chunk.rb +1 -1
- data/lib/mongo/error/multi_index_drop.rb +1 -1
- data/lib/mongo/error/need_primary_server.rb +1 -1
- data/lib/mongo/error/no_server_available.rb +4 -2
- data/lib/mongo/error/operation_failure.rb +1 -1
- data/lib/mongo/error/parser.rb +1 -1
- data/lib/mongo/error/socket_error.rb +1 -1
- data/lib/mongo/error/socket_timeout_error.rb +1 -1
- data/lib/mongo/error/unchangeable_collection_option.rb +1 -1
- data/lib/mongo/error/unexpected_chunk_length.rb +1 -1
- data/lib/mongo/error/unexpected_response.rb +1 -1
- data/lib/mongo/error/unsupported_features.rb +1 -1
- data/lib/mongo/event.rb +1 -1
- data/lib/mongo/event/description_changed.rb +1 -1
- data/lib/mongo/event/publisher.rb +1 -1
- data/lib/mongo/event/subscriber.rb +1 -1
- data/lib/mongo/grid.rb +1 -1
- data/lib/mongo/grid/file.rb +6 -2
- data/lib/mongo/grid/file/chunk.rb +6 -4
- data/lib/mongo/grid/file/info.rb +7 -3
- data/lib/mongo/grid/fs_bucket.rb +12 -6
- data/lib/mongo/grid/stream.rb +1 -1
- data/lib/mongo/grid/stream/read.rb +2 -4
- data/lib/mongo/grid/stream/write.rb +4 -3
- data/lib/mongo/index.rb +1 -1
- data/lib/mongo/index/view.rb +5 -4
- data/lib/mongo/loggable.rb +1 -1
- data/lib/mongo/logger.rb +1 -1
- data/lib/mongo/monitoring.rb +1 -1
- data/lib/mongo/operation.rb +1 -1
- data/lib/mongo/operation/commands.rb +1 -1
- data/lib/mongo/operation/commands/aggregate.rb +7 -7
- data/lib/mongo/operation/commands/aggregate/result.rb +1 -1
- data/lib/mongo/operation/commands/collections_info.rb +10 -9
- data/lib/mongo/operation/commands/collections_info/result.rb +1 -1
- data/lib/mongo/operation/commands/command.rb +1 -1
- data/lib/mongo/operation/commands/indexes.rb +12 -11
- 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 +1 -1
- data/lib/mongo/operation/commands/map_reduce/result.rb +1 -1
- data/lib/mongo/operation/commands/user_query.rb +11 -10
- data/lib/mongo/operation/commands/users_info.rb +2 -2
- data/lib/mongo/operation/commands/users_info/result.rb +1 -1
- data/lib/mongo/operation/executable.rb +8 -7
- data/lib/mongo/operation/kill_cursors.rb +2 -2
- data/lib/mongo/operation/limited.rb +1 -1
- data/lib/mongo/operation/read.rb +1 -1
- data/lib/mongo/operation/read/get_more.rb +2 -2
- data/lib/mongo/operation/read/query.rb +1 -1
- data/lib/mongo/operation/read/query/result.rb +1 -1
- data/lib/mongo/operation/read_preference.rb +10 -10
- data/lib/mongo/operation/result.rb +1 -1
- data/lib/mongo/operation/specifiable.rb +2 -2
- data/lib/mongo/operation/write.rb +1 -1
- data/lib/mongo/operation/write/bulk.rb +1 -1
- data/lib/mongo/operation/write/bulk/bulkable.rb +9 -9
- data/lib/mongo/operation/write/bulk/delete.rb +3 -3
- data/lib/mongo/operation/write/bulk/delete/result.rb +1 -1
- data/lib/mongo/operation/write/bulk/insert.rb +5 -5
- data/lib/mongo/operation/write/bulk/insert/result.rb +1 -1
- data/lib/mongo/operation/write/bulk/legacy_mergable.rb +1 -1
- data/lib/mongo/operation/write/bulk/mergable.rb +1 -1
- data/lib/mongo/operation/write/bulk/update.rb +3 -3
- data/lib/mongo/operation/write/bulk/update/result.rb +1 -1
- data/lib/mongo/operation/write/command.rb +1 -1
- data/lib/mongo/operation/write/command/create_index.rb +1 -1
- data/lib/mongo/operation/write/command/create_user.rb +1 -1
- data/lib/mongo/operation/write/command/delete.rb +1 -1
- data/lib/mongo/operation/write/command/drop_index.rb +1 -1
- data/lib/mongo/operation/write/command/insert.rb +11 -1
- data/lib/mongo/operation/write/command/remove_user.rb +1 -1
- data/lib/mongo/operation/write/command/update.rb +1 -1
- data/lib/mongo/operation/write/command/update_user.rb +1 -1
- data/lib/mongo/operation/write/command/writable.rb +7 -6
- data/lib/mongo/operation/write/create_index.rb +1 -1
- data/lib/mongo/operation/write/create_user.rb +1 -1
- data/lib/mongo/operation/write/delete.rb +1 -1
- data/lib/mongo/operation/write/delete/result.rb +1 -1
- data/lib/mongo/operation/write/drop_index.rb +5 -5
- data/lib/mongo/operation/write/gle.rb +3 -3
- data/lib/mongo/operation/write/idable.rb +1 -1
- data/lib/mongo/operation/write/insert.rb +5 -5
- data/lib/mongo/operation/write/insert/result.rb +1 -1
- data/lib/mongo/operation/write/remove_user.rb +1 -1
- data/lib/mongo/operation/write/update.rb +1 -1
- data/lib/mongo/operation/write/update/result.rb +1 -1
- data/lib/mongo/operation/write/update_user.rb +1 -1
- data/lib/mongo/operation/write/write_command_enabled.rb +10 -9
- data/lib/mongo/protocol/bit_vector.rb +2 -2
- data/lib/mongo/protocol/delete.rb +1 -1
- data/lib/mongo/protocol/get_more.rb +1 -1
- data/lib/mongo/protocol/insert.rb +5 -1
- data/lib/mongo/protocol/kill_cursors.rb +1 -1
- data/lib/mongo/protocol/message.rb +9 -5
- data/lib/mongo/protocol/query.rb +1 -1
- data/lib/mongo/protocol/reply.rb +1 -1
- data/lib/mongo/protocol/serializers.rb +8 -8
- data/lib/mongo/protocol/update.rb +1 -1
- data/lib/mongo/server.rb +40 -3
- data/lib/mongo/server/connectable.rb +1 -1
- data/lib/mongo/server/connection.rb +4 -2
- data/lib/mongo/server/connection_pool.rb +1 -1
- data/lib/mongo/server/connection_pool/queue.rb +1 -1
- data/lib/mongo/server/context.rb +3 -1
- data/lib/mongo/server/description.rb +1 -1
- data/lib/mongo/server/description/inspector/description_changed.rb +1 -1
- data/lib/mongo/server/monitor.rb +1 -1
- data/lib/mongo/server_selector.rb +2 -1
- data/lib/mongo/server_selector/nearest.rb +1 -1
- data/lib/mongo/server_selector/primary.rb +1 -1
- data/lib/mongo/server_selector/primary_preferred.rb +1 -1
- data/lib/mongo/server_selector/secondary.rb +1 -1
- data/lib/mongo/server_selector/secondary_preferred.rb +1 -1
- data/lib/mongo/server_selector/selectable.rb +12 -7
- data/lib/mongo/socket.rb +1 -1
- data/lib/mongo/socket/ssl.rb +1 -1
- data/lib/mongo/socket/tcp.rb +1 -1
- data/lib/mongo/socket/unix.rb +1 -1
- data/lib/mongo/uri.rb +1 -1
- data/lib/mongo/version.rb +2 -2
- data/lib/mongo/write_concern/acknowledged.rb +1 -1
- data/lib/mongo/write_concern/normalizable.rb +1 -1
- data/lib/mongo/write_concern/unacknowledged.rb +1 -1
- data/mongo.gemspec +1 -1
- data/spec/mongo/client_spec.rb +2 -2
- data/spec/mongo/cluster/cursor_reaper_spec.rb +216 -0
- data/spec/mongo/cluster_spec.rb +36 -5
- data/spec/mongo/collection/view/aggregation_spec.rb +2 -2
- data/spec/mongo/collection/view/map_reduce_spec.rb +2 -2
- data/spec/mongo/collection/view/readable_spec.rb +203 -5
- data/spec/mongo/collection/view_spec.rb +10 -0
- data/spec/mongo/collection_spec.rb +64 -18
- data/spec/mongo/cursor_spec.rb +89 -0
- data/spec/mongo/database_spec.rb +79 -13
- data/spec/mongo/grid/fs_bucket_spec.rb +119 -1
- data/spec/mongo/grid/stream/write_spec.rb +63 -12
- data/spec/mongo/index/view_spec.rb +19 -0
- data/spec/mongo/operation/commands/aggregate_spec.rb +10 -7
- data/spec/mongo/operation/commands/collections_info_spec.rb +1 -1
- data/spec/mongo/operation/commands/command_spec.rb +3 -3
- data/spec/mongo/operation/commands/indexes_spec.rb +1 -1
- data/spec/mongo/operation/commands/map_reduce_spec.rb +2 -2
- data/spec/mongo/operation/kill_cursors_spec.rb +10 -19
- data/spec/mongo/operation/read/get_more_spec.rb +13 -25
- data/spec/mongo/operation/read/query_spec.rb +26 -30
- data/spec/mongo/operation/read_preference_spec.rb +11 -11
- data/spec/mongo/operation/specifiable_spec.rb +31 -0
- data/spec/mongo/operation/write/bulk/delete_spec.rb +16 -18
- data/spec/mongo/operation/write/bulk/insert_spec.rb +17 -18
- data/spec/mongo/operation/write/bulk/update_spec.rb +20 -25
- data/spec/mongo/operation/write/command/delete_spec.rb +26 -32
- data/spec/mongo/operation/write/command/insert_spec.rb +24 -31
- data/spec/mongo/operation/write/command/update_spec.rb +24 -32
- data/spec/mongo/operation/write/create_index_spec.rb +4 -4
- data/spec/mongo/operation/write/create_user_spec.rb +3 -3
- data/spec/mongo/operation/write/delete_spec.rb +51 -22
- data/spec/mongo/operation/write/drop_index_spec.rb +2 -2
- data/spec/mongo/operation/write/insert_spec.rb +42 -11
- data/spec/mongo/operation/write/remove_user_spec.rb +4 -4
- data/spec/mongo/operation/write/update_spec.rb +34 -6
- data/spec/mongo/operation/write/update_user_spec.rb +1 -1
- data/spec/mongo/server/connection_spec.rb +22 -14
- data/spec/mongo/server_selection_spec.rb +2 -2
- data/spec/mongo/server_selector/nearest_spec.rb +4 -4
- data/spec/mongo/server_selector/primary_preferred_spec.rb +4 -4
- data/spec/mongo/server_selector/primary_spec.rb +2 -2
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +4 -4
- data/spec/mongo/server_selector/secondary_spec.rb +3 -3
- data/spec/mongo/server_selector_spec.rb +82 -3
- data/spec/mongo/server_spec.rb +0 -20
- data/spec/support/command_monitoring.rb +1 -1
- data/spec/support/connection_string.rb +1 -1
- data/spec/support/crud.rb +1 -1
- data/spec/support/crud/read.rb +1 -1
- data/spec/support/crud/write.rb +1 -1
- data/spec/support/gridfs.rb +1 -1
- data/spec/support/shared/server_selector.rb +3 -3
- metadata +7 -10
- metadata.gz.sig +0 -0
- data/lib/csasl/csasl.bundle +0 -0
- data/spec/mongo/operation/write/response_spec.rb +0 -85
- data/spec/support/shared/operation.rb +0 -100
@@ -370,7 +370,7 @@ describe Mongo::Collection::View::Aggregation do
|
|
370
370
|
end
|
371
371
|
|
372
372
|
|
373
|
-
context 'when the
|
373
|
+
context 'when the server is not a valid for writing' do
|
374
374
|
|
375
375
|
it 'reroutes the operation to a primary' do
|
376
376
|
allow(aggregation).to receive(:valid_server?).and_return(false)
|
@@ -379,7 +379,7 @@ describe Mongo::Collection::View::Aggregation do
|
|
379
379
|
end
|
380
380
|
end
|
381
381
|
|
382
|
-
context 'when the
|
382
|
+
context 'when the server is a valid for writing' do
|
383
383
|
|
384
384
|
it 'does not reroute the operation to a primary' do
|
385
385
|
expect(Mongo::Logger.logger).not_to receive(:warn?)
|
@@ -328,7 +328,7 @@ describe Mongo::Collection::View::MapReduce do
|
|
328
328
|
expect(map_reduce.send(:secondary_ok?)).to be false
|
329
329
|
end
|
330
330
|
|
331
|
-
context 'when the
|
331
|
+
context 'when the server is not a valid for writing' do
|
332
332
|
|
333
333
|
it 'reroutes the operation to a primary' do
|
334
334
|
allow(map_reduce).to receive(:valid_server?).and_return(false)
|
@@ -337,7 +337,7 @@ describe Mongo::Collection::View::MapReduce do
|
|
337
337
|
end
|
338
338
|
end
|
339
339
|
|
340
|
-
context 'when the
|
340
|
+
context 'when the server is a valid for writing' do
|
341
341
|
|
342
342
|
it 'does not reroute the operation to a primary' do
|
343
343
|
expect(Mongo::Logger.logger).not_to receive(:warn?)
|
@@ -309,6 +309,93 @@ describe Mongo::Collection::View::Readable do
|
|
309
309
|
expect(view.count(read: { mode: :secondary })).to eq(10)
|
310
310
|
end
|
311
311
|
|
312
|
+
context 'when the collection has a read preference set' do
|
313
|
+
|
314
|
+
after do
|
315
|
+
client.close
|
316
|
+
end
|
317
|
+
|
318
|
+
let(:client) do
|
319
|
+
# Set a timeout in case the collection read_preference does get used.
|
320
|
+
# Otherwise, the test will hang for 30 seconds.
|
321
|
+
authorized_client.with(server_selection_timeout: 1)
|
322
|
+
end
|
323
|
+
|
324
|
+
let(:read_preference) do
|
325
|
+
{ :mode => :secondary, :tag_sets => [{ 'non' => 'existent' }] }
|
326
|
+
end
|
327
|
+
|
328
|
+
let(:collection) do
|
329
|
+
client[authorized_collection.name, read: read_preference]
|
330
|
+
end
|
331
|
+
|
332
|
+
let(:view) do
|
333
|
+
Mongo::Collection::View.new(collection, selector, options)
|
334
|
+
end
|
335
|
+
|
336
|
+
context 'when a read preference argument is provided' do
|
337
|
+
|
338
|
+
let(:result) do
|
339
|
+
view.count(read: { mode: :primary })
|
340
|
+
end
|
341
|
+
|
342
|
+
it 'uses the read preference passed to the method' do
|
343
|
+
expect(result).to eq(10)
|
344
|
+
end
|
345
|
+
end
|
346
|
+
|
347
|
+
context 'when no read preference argument is provided', unless: sharded? do
|
348
|
+
|
349
|
+
before do
|
350
|
+
allow(view.collection.client.cluster).to receive(:single?).and_return(false)
|
351
|
+
end
|
352
|
+
|
353
|
+
let(:result) do
|
354
|
+
view.count
|
355
|
+
end
|
356
|
+
|
357
|
+
it 'uses the read preference of the collection' do
|
358
|
+
expect {
|
359
|
+
result
|
360
|
+
}.to raise_exception(Mongo::Error::NoServerAvailable)
|
361
|
+
end
|
362
|
+
end
|
363
|
+
|
364
|
+
context 'when the collection does not have a read preference set', unless: sharded? do
|
365
|
+
|
366
|
+
after do
|
367
|
+
client.close
|
368
|
+
end
|
369
|
+
|
370
|
+
let(:client) do
|
371
|
+
authorized_client.with(server_selection_timeout: 1)
|
372
|
+
end
|
373
|
+
|
374
|
+
before do
|
375
|
+
allow(view.collection.client.cluster).to receive(:single?).and_return(false)
|
376
|
+
end
|
377
|
+
|
378
|
+
let(:collection) do
|
379
|
+
client[authorized_collection.name]
|
380
|
+
end
|
381
|
+
|
382
|
+
let(:view) do
|
383
|
+
Mongo::Collection::View.new(collection, selector, options)
|
384
|
+
end
|
385
|
+
|
386
|
+
let(:result) do
|
387
|
+
read_preference = { :mode => :secondary, :tag_sets => [{ 'non' => 'existent' }] }
|
388
|
+
view.count(read: read_preference)
|
389
|
+
end
|
390
|
+
|
391
|
+
it 'uses the read preference passed to the method' do
|
392
|
+
expect {
|
393
|
+
result
|
394
|
+
}.to raise_exception(Mongo::Error::NoServerAvailable)
|
395
|
+
end
|
396
|
+
end
|
397
|
+
end
|
398
|
+
|
312
399
|
it 'takes a max_time_ms option', if: write_command_enabled? do
|
313
400
|
expect {
|
314
401
|
view.count(max_time_ms: 0.1)
|
@@ -434,7 +521,7 @@ describe Mongo::Collection::View::Readable do
|
|
434
521
|
end
|
435
522
|
end
|
436
523
|
|
437
|
-
context 'when a read preference
|
524
|
+
context 'when the collection has a read preference set' do
|
438
525
|
|
439
526
|
let(:documents) do
|
440
527
|
(1..3).map{ |i| { field: "test#{i}" }}
|
@@ -444,12 +531,93 @@ describe Mongo::Collection::View::Readable do
|
|
444
531
|
authorized_collection.insert_many(documents)
|
445
532
|
end
|
446
533
|
|
447
|
-
|
448
|
-
|
534
|
+
after do
|
535
|
+
client.close
|
449
536
|
end
|
450
537
|
|
451
|
-
|
452
|
-
|
538
|
+
let(:client) do
|
539
|
+
# Set a timeout in case the collection read_preference does get used.
|
540
|
+
# Otherwise, the test will hang for 30 seconds.
|
541
|
+
authorized_client.with(server_selection_timeout: 1)
|
542
|
+
end
|
543
|
+
|
544
|
+
let(:read_preference) do
|
545
|
+
{ :mode => :secondary, :tag_sets => [{ 'non' => 'existent' }] }
|
546
|
+
end
|
547
|
+
|
548
|
+
let(:collection) do
|
549
|
+
client[authorized_collection.name, read: read_preference]
|
550
|
+
end
|
551
|
+
|
552
|
+
let(:view) do
|
553
|
+
Mongo::Collection::View.new(collection, selector, options)
|
554
|
+
end
|
555
|
+
|
556
|
+
context 'when a read preference argument is provided' do
|
557
|
+
|
558
|
+
let(:distinct) do
|
559
|
+
view.distinct(:field, read: { mode: :primary })
|
560
|
+
end
|
561
|
+
|
562
|
+
it 'uses the read preference passed to the method' do
|
563
|
+
expect(distinct.sort).to eq([ 'test1', 'test2', 'test3' ])
|
564
|
+
end
|
565
|
+
end
|
566
|
+
|
567
|
+
context 'when no read preference argument is provided', unless: sharded? do
|
568
|
+
|
569
|
+
before do
|
570
|
+
allow(view.collection.client.cluster).to receive(:single?).and_return(false)
|
571
|
+
end
|
572
|
+
|
573
|
+
let(:distinct) do
|
574
|
+
view.distinct(:field)
|
575
|
+
end
|
576
|
+
|
577
|
+
it 'uses the read preference of the collection' do
|
578
|
+
expect {
|
579
|
+
distinct
|
580
|
+
}.to raise_exception(Mongo::Error::NoServerAvailable)
|
581
|
+
end
|
582
|
+
end
|
583
|
+
|
584
|
+
context 'when the collection does not have a read preference set', unless: sharded? do
|
585
|
+
|
586
|
+
let(:documents) do
|
587
|
+
(1..3).map{ |i| { field: "test#{i}" }}
|
588
|
+
end
|
589
|
+
|
590
|
+
before do
|
591
|
+
authorized_collection.insert_many(documents)
|
592
|
+
allow(view.collection.client.cluster).to receive(:single?).and_return(false)
|
593
|
+
end
|
594
|
+
|
595
|
+
after do
|
596
|
+
client.close
|
597
|
+
end
|
598
|
+
|
599
|
+
let(:client) do
|
600
|
+
authorized_client.with(server_selection_timeout: 1)
|
601
|
+
end
|
602
|
+
|
603
|
+
let(:collection) do
|
604
|
+
client[authorized_collection.name]
|
605
|
+
end
|
606
|
+
|
607
|
+
let(:view) do
|
608
|
+
Mongo::Collection::View.new(collection, selector, options)
|
609
|
+
end
|
610
|
+
|
611
|
+
let(:distinct) do
|
612
|
+
read_preference = { :mode => :secondary, :tag_sets => [{ 'non' => 'existent' }] }
|
613
|
+
view.distinct(:field, read: read_preference)
|
614
|
+
end
|
615
|
+
|
616
|
+
it 'uses the read preference passed to the method' do
|
617
|
+
expect {
|
618
|
+
distinct
|
619
|
+
}.to raise_exception(Mongo::Error::NoServerAvailable)
|
620
|
+
end
|
453
621
|
end
|
454
622
|
end
|
455
623
|
|
@@ -793,6 +961,36 @@ describe Mongo::Collection::View::Readable do
|
|
793
961
|
end
|
794
962
|
end
|
795
963
|
|
964
|
+
describe '#cusor_type' do
|
965
|
+
|
966
|
+
let(:options) do
|
967
|
+
{ :cursor_type => :tailable }
|
968
|
+
end
|
969
|
+
|
970
|
+
context 'when cursor_type is specified' do
|
971
|
+
|
972
|
+
let(:new_cursor_type) do
|
973
|
+
:tailable_await
|
974
|
+
end
|
975
|
+
|
976
|
+
it 'sets the cursor_type value' do
|
977
|
+
new_view = view.cursor_type(new_cursor_type)
|
978
|
+
expect(new_view.cursor_type).to eq(new_cursor_type)
|
979
|
+
end
|
980
|
+
|
981
|
+
it 'returns a new View' do
|
982
|
+
expect(view.cursor_type(new_cursor_type)).not_to be(view)
|
983
|
+
end
|
984
|
+
end
|
985
|
+
|
986
|
+
context 'when cursor_type is not specified' do
|
987
|
+
|
988
|
+
it 'returns the cursor_type value' do
|
989
|
+
expect(view.cursor_type).to eq(options[:cursor_type])
|
990
|
+
end
|
991
|
+
end
|
992
|
+
end
|
993
|
+
|
796
994
|
describe '#skip' do
|
797
995
|
|
798
996
|
context 'when a skip is specified' do
|
@@ -246,6 +246,16 @@ describe Mongo::Collection::View do
|
|
246
246
|
it 'parses standard options' do
|
247
247
|
expect(view.options).to eq(options)
|
248
248
|
end
|
249
|
+
|
250
|
+
it 'only freezes the view filter, not the user filter' do
|
251
|
+
expect(view.filter.frozen?).to be(true)
|
252
|
+
expect(filter.frozen?).to be(false)
|
253
|
+
end
|
254
|
+
|
255
|
+
it 'only freezes the view options, not the user options' do
|
256
|
+
expect(view.options.frozen?).to be(true)
|
257
|
+
expect(options.frozen?).to be(false)
|
258
|
+
end
|
249
259
|
end
|
250
260
|
|
251
261
|
context 'when the filter contains modifiers' do
|
@@ -135,12 +135,8 @@ describe Mongo::Collection do
|
|
135
135
|
Mongo::Client.new(ADDRESSES, server_selection_timeout: 2)
|
136
136
|
end
|
137
137
|
|
138
|
-
|
139
|
-
|
140
|
-
end
|
141
|
-
|
142
|
-
it 'keeps the server_selection_timeout setting from client' do
|
143
|
-
expect(server_selection_timeout).to eq(client.options[:server_selection_timeout])
|
138
|
+
it 'passes the the server_selection_timeout to the cluster' do
|
139
|
+
expect(client.cluster.options[:server_selection_timeout]).to eq(client.options[:server_selection_timeout])
|
144
140
|
end
|
145
141
|
end
|
146
142
|
|
@@ -152,6 +148,7 @@ describe Mongo::Collection do
|
|
152
148
|
|
153
149
|
it 'sets the new read options on the new collection' do
|
154
150
|
expect(new_collection.read_preference).to eq(Mongo::ServerSelector.get(new_options[:read]))
|
151
|
+
expect(new_collection.read_preference).not_to eq(client.read_preference)
|
155
152
|
end
|
156
153
|
end
|
157
154
|
|
@@ -161,16 +158,12 @@ describe Mongo::Collection do
|
|
161
158
|
Mongo::Client.new(ADDRESSES, read: { mode: :primary_preferred }, server_selection_timeout: 2)
|
162
159
|
end
|
163
160
|
|
164
|
-
let(:server_selection_timeout) do
|
165
|
-
new_collection.read_preference.server_selection_timeout
|
166
|
-
end
|
167
|
-
|
168
161
|
it 'sets the new read options on the new collection' do
|
169
162
|
expect(new_collection.read_preference).to eq(Mongo::ServerSelector.get(new_options[:read]))
|
170
163
|
end
|
171
164
|
|
172
|
-
it '
|
173
|
-
expect(server_selection_timeout).to eq(client.options[:server_selection_timeout])
|
165
|
+
it 'passes the server_selection_timeout setting to the cluster' do
|
166
|
+
expect(client.cluster.options[:server_selection_timeout]).to eq(client.options[:server_selection_timeout])
|
174
167
|
end
|
175
168
|
end
|
176
169
|
end
|
@@ -228,12 +221,8 @@ describe Mongo::Collection do
|
|
228
221
|
Mongo::Client.new(ADDRESSES, server_selection_timeout: 2)
|
229
222
|
end
|
230
223
|
|
231
|
-
|
232
|
-
|
233
|
-
end
|
234
|
-
|
235
|
-
it 'keeps the server_selection_timeout setting from client' do
|
236
|
-
expect(server_selection_timeout).to eq(client.options[:server_selection_timeout])
|
224
|
+
it 'passes the server_selection_timeout setting to the cluster' do
|
225
|
+
expect(client.cluster.options[:server_selection_timeout]).to eq(client.options[:server_selection_timeout])
|
237
226
|
end
|
238
227
|
end
|
239
228
|
|
@@ -245,6 +234,7 @@ describe Mongo::Collection do
|
|
245
234
|
|
246
235
|
it 'sets the new read options on the new collection' do
|
247
236
|
expect(new_collection.read_preference).to eq(Mongo::ServerSelector.get(new_options[:read]))
|
237
|
+
expect(new_collection.read_preference).not_to be(client.read_preference)
|
248
238
|
end
|
249
239
|
end
|
250
240
|
end
|
@@ -719,6 +709,19 @@ describe Mongo::Collection do
|
|
719
709
|
expect(result.inserted_ids.size).to eq(2)
|
720
710
|
end
|
721
711
|
|
712
|
+
context 'when a document contains invalid keys' do
|
713
|
+
|
714
|
+
let(:docs) do
|
715
|
+
[ { 'first.name' => 'test1' }, { name: 'test2' } ]
|
716
|
+
end
|
717
|
+
|
718
|
+
it 'raises a BSON::String::IllegalKey exception' do
|
719
|
+
expect {
|
720
|
+
authorized_collection.insert_many(docs)
|
721
|
+
}.to raise_exception(BSON::String::IllegalKey)
|
722
|
+
end
|
723
|
+
end
|
724
|
+
|
722
725
|
context 'when the client has a custom id generator' do
|
723
726
|
|
724
727
|
let(:generator) do
|
@@ -842,6 +845,19 @@ describe Mongo::Collection do
|
|
842
845
|
expect(result.inserted_id).to_not be_nil
|
843
846
|
end
|
844
847
|
|
848
|
+
context 'when the document contains invalid keys' do
|
849
|
+
|
850
|
+
let(:doc) do
|
851
|
+
{ 'testing.test' => 'value' }
|
852
|
+
end
|
853
|
+
|
854
|
+
it 'raises a BSON::String::IllegalKey exception' do
|
855
|
+
expect {
|
856
|
+
authorized_collection.insert_one(doc)
|
857
|
+
}.to raise_exception(BSON::String::IllegalKey)
|
858
|
+
end
|
859
|
+
end
|
860
|
+
|
845
861
|
context 'when the insert fails' do
|
846
862
|
|
847
863
|
let(:result) do
|
@@ -1216,6 +1232,36 @@ describe Mongo::Collection do
|
|
1216
1232
|
end
|
1217
1233
|
end
|
1218
1234
|
end
|
1235
|
+
|
1236
|
+
context 'when the collection has a read preference', unless: sharded? do
|
1237
|
+
|
1238
|
+
before do
|
1239
|
+
allow(collection.client.cluster).to receive(:single?).and_return(false)
|
1240
|
+
end
|
1241
|
+
|
1242
|
+
after do
|
1243
|
+
client.close
|
1244
|
+
end
|
1245
|
+
|
1246
|
+
let(:client) do
|
1247
|
+
authorized_client.with(server_selection_timeout: 0.2)
|
1248
|
+
end
|
1249
|
+
|
1250
|
+
let(:collection) do
|
1251
|
+
client[authorized_collection.name,
|
1252
|
+
read: { :mode => :secondary, :tag_sets => [{ 'non' => 'existent' }] }]
|
1253
|
+
end
|
1254
|
+
|
1255
|
+
let(:result) do
|
1256
|
+
collection.parallel_scan(2)
|
1257
|
+
end
|
1258
|
+
|
1259
|
+
it 'uses that read preference' do
|
1260
|
+
expect {
|
1261
|
+
result
|
1262
|
+
}.to raise_exception(Mongo::Error::NoServerAvailable)
|
1263
|
+
end
|
1264
|
+
end
|
1219
1265
|
end
|
1220
1266
|
|
1221
1267
|
describe '#replace_one' do
|
data/spec/mongo/cursor_spec.rb
CHANGED
@@ -232,6 +232,95 @@ describe Mongo::Cursor do
|
|
232
232
|
end
|
233
233
|
end
|
234
234
|
end
|
235
|
+
|
236
|
+
context 'when the cursor is not fully iterated and is garbage collected' do
|
237
|
+
|
238
|
+
let(:documents) do
|
239
|
+
(1..3).map{ |i| { field: "test#{i}" }}
|
240
|
+
end
|
241
|
+
|
242
|
+
before do
|
243
|
+
authorized_collection.insert_many(documents)
|
244
|
+
cursor_reaper.schedule_kill_cursor(cursor.id,
|
245
|
+
cursor.send(:kill_cursors_op_spec),
|
246
|
+
cursor.instance_variable_get(:@server))
|
247
|
+
end
|
248
|
+
|
249
|
+
after do
|
250
|
+
authorized_collection.delete_many
|
251
|
+
end
|
252
|
+
|
253
|
+
let(:view) do
|
254
|
+
Mongo::Collection::View.new(
|
255
|
+
authorized_collection,
|
256
|
+
{},
|
257
|
+
:batch_size => 2
|
258
|
+
)
|
259
|
+
end
|
260
|
+
|
261
|
+
let!(:cursor) do
|
262
|
+
view.to_enum.next
|
263
|
+
view.instance_variable_get(:@cursor)
|
264
|
+
end
|
265
|
+
|
266
|
+
let(:cursor_reaper) do
|
267
|
+
authorized_client.cluster.instance_variable_get(:@cursor_reaper)
|
268
|
+
end
|
269
|
+
|
270
|
+
|
271
|
+
it 'schedules a kill cursors op' do
|
272
|
+
sleep(Mongo::Cluster::CursorReaper::FREQUENCY + 0.5)
|
273
|
+
expect {
|
274
|
+
cursor.to_a
|
275
|
+
}.to raise_exception(Mongo::Error::OperationFailure)
|
276
|
+
end
|
277
|
+
|
278
|
+
context 'when the cursor is unregistered before the kill cursors operations are executed' do
|
279
|
+
|
280
|
+
it 'does not send a kill cursors operation for the unregistered cursor' do
|
281
|
+
cursor_reaper.unregister_cursor(cursor.id)
|
282
|
+
expect(cursor.to_a.size).to eq(documents.size)
|
283
|
+
end
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
context 'when the cursor is fully iterated' do
|
288
|
+
|
289
|
+
let(:documents) do
|
290
|
+
(1..3).map{ |i| { field: "test#{i}" }}
|
291
|
+
end
|
292
|
+
|
293
|
+
before do
|
294
|
+
authorized_collection.insert_many(documents)
|
295
|
+
end
|
296
|
+
|
297
|
+
after do
|
298
|
+
authorized_collection.delete_many
|
299
|
+
end
|
300
|
+
|
301
|
+
let(:view) do
|
302
|
+
authorized_collection.find({}, batch_size: 2)
|
303
|
+
end
|
304
|
+
|
305
|
+
let!(:cursor_id) do
|
306
|
+
enum.next
|
307
|
+
enum.next
|
308
|
+
view.instance_variable_get(:@cursor).id
|
309
|
+
end
|
310
|
+
|
311
|
+
let(:enum) do
|
312
|
+
view.to_enum
|
313
|
+
end
|
314
|
+
|
315
|
+
let(:cursor_reaper) do
|
316
|
+
authorized_collection.client.cluster.instance_variable_get(:@cursor_reaper)
|
317
|
+
end
|
318
|
+
|
319
|
+
it 'removes the cursor id from the active cursors tracked by the cluster cursor manager' do
|
320
|
+
enum.next
|
321
|
+
expect(cursor_reaper.instance_variable_get(:@active_cursors)).not_to include(cursor_id)
|
322
|
+
end
|
323
|
+
end
|
235
324
|
end
|
236
325
|
|
237
326
|
describe '#inspect' do
|