mongo 2.15.0 → 2.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/README.md +1 -1
- data/lib/mongo/bulk_write.rb +2 -2
- data/lib/mongo/client.rb +45 -5
- data/lib/mongo/cluster/periodic_executor.rb +4 -3
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +76 -43
- data/lib/mongo/cluster/sdam_flow.rb +9 -3
- data/lib/mongo/cluster/topology/base.rb +13 -9
- data/lib/mongo/cluster/topology/load_balanced.rb +102 -0
- data/lib/mongo/cluster/topology.rb +28 -8
- data/lib/mongo/cluster.rb +136 -51
- data/lib/mongo/collection/view/aggregation.rb +5 -10
- data/lib/mongo/collection/view/builder/aggregation.rb +6 -5
- data/lib/mongo/collection/view/builder/map_reduce.rb +12 -49
- data/lib/mongo/collection/view/builder.rb +0 -4
- data/lib/mongo/collection/view/iterable.rb +58 -24
- data/lib/mongo/collection/view/map_reduce.rb +39 -15
- data/lib/mongo/collection/view/readable.rb +60 -51
- data/lib/mongo/collection/view/writable.rb +178 -175
- data/lib/mongo/collection/view.rb +15 -21
- data/lib/mongo/collection.rb +13 -13
- data/lib/mongo/cursor/kill_spec.rb +38 -0
- data/lib/mongo/cursor.rb +72 -31
- data/lib/mongo/database/view.rb +1 -1
- data/lib/mongo/error/bad_load_balancer_target.rb +26 -0
- data/lib/mongo/error/missing_service_id.rb +26 -0
- data/lib/mongo/error/no_service_connection_available.rb +49 -0
- data/lib/mongo/error/notable.rb +7 -0
- data/lib/mongo/error.rb +3 -0
- data/lib/mongo/grid/fs_bucket.rb +21 -2
- data/lib/mongo/id.rb +7 -5
- data/lib/mongo/index/view.rb +22 -41
- data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +7 -4
- data/lib/mongo/monitoring/event/command_failed.rb +1 -1
- data/lib/mongo/monitoring/event/command_started.rb +2 -0
- data/lib/mongo/monitoring/publishable.rb +2 -2
- data/lib/mongo/operation/aggregate/command.rb +8 -0
- data/lib/mongo/operation/context.rb +19 -1
- data/lib/mongo/operation/count/command.rb +6 -0
- data/lib/mongo/operation/count/op_msg.rb +6 -0
- data/lib/mongo/operation/create/command.rb +7 -1
- data/lib/mongo/operation/create/op_msg.rb +7 -0
- data/lib/mongo/operation/create_index/command.rb +17 -1
- data/lib/mongo/operation/create_index/op_msg.rb +17 -4
- data/lib/mongo/operation/delete/command.rb +6 -3
- data/lib/mongo/operation/delete/legacy.rb +9 -2
- data/lib/mongo/operation/delete/op_msg.rb +8 -1
- data/lib/mongo/operation/distinct/command.rb +6 -0
- data/lib/mongo/operation/distinct/op_msg.rb +7 -0
- data/lib/mongo/operation/explain/command.rb +13 -1
- data/lib/mongo/operation/explain/legacy.rb +12 -5
- data/lib/mongo/operation/explain/op_msg.rb +9 -1
- data/lib/mongo/operation/find/builder/command.rb +110 -0
- data/lib/mongo/{collection/view → operation/find}/builder/flags.rb +10 -14
- data/lib/mongo/operation/find/builder/legacy.rb +123 -0
- data/lib/mongo/{collection/view → operation/find}/builder/modifiers.rb +31 -25
- data/lib/mongo/{cursor → operation/find}/builder.rb +4 -4
- data/lib/mongo/operation/find/command.rb +9 -0
- data/lib/mongo/operation/find/legacy.rb +10 -1
- data/lib/mongo/operation/find/op_msg.rb +12 -0
- data/lib/mongo/operation/find.rb +1 -0
- data/lib/mongo/operation/get_more/command.rb +1 -0
- data/lib/mongo/operation/get_more/command_builder.rb +38 -0
- data/lib/mongo/operation/get_more/op_msg.rb +1 -0
- data/lib/mongo/operation/get_more.rb +1 -0
- data/lib/mongo/operation/kill_cursors/command.rb +8 -0
- data/lib/mongo/operation/kill_cursors/command_builder.rb +35 -0
- data/lib/mongo/operation/kill_cursors/legacy.rb +2 -1
- data/lib/mongo/operation/kill_cursors/op_msg.rb +10 -0
- data/lib/mongo/operation/kill_cursors.rb +1 -0
- data/lib/mongo/operation/map_reduce/command.rb +8 -0
- data/lib/mongo/operation/map_reduce/op_msg.rb +1 -1
- data/lib/mongo/operation/shared/executable.rb +15 -1
- data/lib/mongo/operation/shared/polymorphic_operation.rb +1 -1
- data/lib/mongo/operation/shared/read_preference_supported.rb +3 -1
- data/lib/mongo/operation/shared/response_handling.rb +1 -0
- data/lib/mongo/operation/shared/sessions_supported.rb +12 -12
- data/lib/mongo/operation/shared/specifiable.rb +11 -29
- data/lib/mongo/operation/shared/validatable.rb +87 -0
- data/lib/mongo/operation/shared/write.rb +1 -1
- data/lib/mongo/operation/update/command.rb +6 -3
- data/lib/mongo/operation/update/legacy.rb +19 -11
- data/lib/mongo/operation/update/op_msg.rb +7 -4
- data/lib/mongo/operation/write_command/command.rb +51 -0
- data/lib/mongo/operation/write_command/op_msg.rb +43 -0
- data/lib/mongo/operation/write_command.rb +32 -0
- data/lib/mongo/operation.rb +10 -0
- data/lib/mongo/protocol/query.rb +35 -18
- data/lib/mongo/server/connection.rb +25 -3
- data/lib/mongo/server/connection_base.rb +12 -1
- data/lib/mongo/server/connection_common.rb +38 -1
- data/lib/mongo/server/connection_pool/generation_manager.rb +71 -0
- data/lib/mongo/server/connection_pool.rb +100 -27
- data/lib/mongo/server/description/features.rb +17 -16
- data/lib/mongo/server/description/load_balancer.rb +33 -0
- data/lib/mongo/server/description.rb +85 -6
- data/lib/mongo/server/monitor/connection.rb +5 -6
- data/lib/mongo/server/monitor.rb +2 -1
- data/lib/mongo/server/pending_connection.rb +47 -31
- data/lib/mongo/server/push_monitor.rb +10 -1
- data/lib/mongo/server.rb +73 -26
- data/lib/mongo/server_selector/base.rb +5 -1
- data/lib/mongo/session/session_pool.rb +11 -0
- data/lib/mongo/session.rb +21 -1
- data/lib/mongo/socket/ocsp_verifier.rb +6 -37
- data/lib/mongo/uri/options_mapper.rb +1 -0
- data/lib/mongo/uri/srv_protocol.rb +6 -8
- data/lib/mongo/uri.rb +18 -0
- data/lib/mongo/utils.rb +0 -7
- data/lib/mongo/version.rb +1 -1
- data/mongo.gemspec +1 -1
- data/spec/integration/auth_spec.rb +31 -1
- data/spec/integration/awaited_ismaster_spec.rb +1 -1
- data/spec/integration/bulk_write_spec.rb +1 -1
- data/spec/integration/change_stream_spec.rb +3 -3
- data/spec/integration/client_construction_spec.rb +54 -0
- data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +1 -1
- data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +1 -1
- data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +1 -1
- data/spec/integration/client_side_encryption/data_key_spec.rb +1 -1
- data/spec/integration/client_spec.rb +2 -0
- data/spec/integration/command_monitoring_spec.rb +1 -1
- data/spec/integration/command_spec.rb +1 -1
- data/spec/integration/connection_spec.rb +52 -35
- data/spec/integration/crud_spec.rb +174 -1
- data/spec/integration/cursor_pinning_spec.rb +121 -0
- data/spec/integration/cursor_reaping_spec.rb +8 -4
- data/spec/integration/fork_reconnect_spec.rb +1 -5
- data/spec/integration/get_more_spec.rb +1 -1
- data/spec/integration/heartbeat_events_spec.rb +1 -1
- data/spec/integration/map_reduce_spec.rb +77 -0
- data/spec/integration/query_cache_spec.rb +47 -2
- data/spec/integration/query_cache_transactions_spec.rb +1 -1
- data/spec/integration/read_concern_spec.rb +1 -1
- data/spec/integration/read_preference_spec.rb +1 -1
- data/spec/integration/reconnect_spec.rb +30 -12
- data/spec/integration/retryable_errors_spec.rb +1 -1
- data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +1 -1
- data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -1
- data/spec/integration/sdam_error_handling_spec.rb +5 -3
- data/spec/integration/sdam_events_spec.rb +35 -19
- data/spec/integration/sdam_prose_spec.rb +1 -1
- data/spec/integration/server_monitor_spec.rb +1 -0
- data/spec/integration/server_selector_spec.rb +22 -5
- data/spec/integration/server_spec.rb +2 -0
- data/spec/integration/srv_monitoring_spec.rb +1 -1
- data/spec/integration/step_down_spec.rb +1 -1
- data/spec/integration/transaction_pinning_spec.rb +120 -0
- data/spec/integration/versioned_api_examples_spec.rb +45 -0
- data/spec/integration/x509_auth_spec.rb +1 -1
- data/spec/lite_spec_helper.rb +1 -2
- data/spec/mongo/address/unix_spec.rb +1 -0
- data/spec/mongo/auth/cr_spec.rb +2 -3
- data/spec/mongo/auth/ldap_spec.rb +2 -3
- data/spec/mongo/auth/scram_spec.rb +2 -3
- data/spec/mongo/auth/user/view_spec.rb +1 -1
- data/spec/mongo/auth/x509_spec.rb +2 -3
- data/spec/mongo/bulk_write_spec.rb +3 -3
- data/spec/mongo/client_construction_spec.rb +259 -28
- data/spec/mongo/client_spec.rb +6 -4
- data/spec/mongo/cluster/cursor_reaper_spec.rb +36 -21
- data/spec/mongo/cluster/periodic_executor_spec.rb +3 -1
- data/spec/mongo/cluster_spec.rb +44 -3
- data/spec/mongo/collection/view/aggregation_spec.rb +1 -1
- data/spec/mongo/collection/view/builder/find_command_spec.rb +4 -0
- data/spec/mongo/collection/view/builder/op_query_spec.rb +4 -0
- data/spec/mongo/collection/view/map_reduce_spec.rb +1 -1
- data/spec/mongo/collection_crud_spec.rb +7 -2
- data/spec/mongo/collection_ddl_spec.rb +1 -1
- data/spec/mongo/collection_spec.rb +1 -1
- data/spec/mongo/cursor/builder/get_more_command_spec.rb +4 -0
- data/spec/mongo/cursor/builder/op_get_more_spec.rb +4 -0
- data/spec/mongo/cursor_spec.rb +15 -5
- data/spec/mongo/database_spec.rb +15 -15
- data/spec/mongo/error/operation_failure_heavy_spec.rb +1 -1
- data/spec/mongo/grid/fs_bucket_spec.rb +18 -12
- data/spec/mongo/grid/stream/write_spec.rb +3 -9
- data/spec/mongo/grid/stream_spec.rb +1 -1
- data/spec/mongo/index/view_spec.rb +2 -2
- data/spec/mongo/operation/delete/op_msg_spec.rb +1 -1
- data/spec/mongo/{collection/view → operation/find}/builder/flags_spec.rb +2 -2
- data/spec/mongo/{collection/view → operation/find}/builder/modifiers_spec.rb +2 -2
- data/spec/mongo/operation/find/legacy_spec.rb +1 -0
- data/spec/mongo/operation/insert/bulk_spec.rb +1 -1
- data/spec/mongo/operation/insert/op_msg_spec.rb +1 -1
- data/spec/mongo/operation/kill_cursors_spec.rb +4 -1
- data/spec/mongo/operation/read_preference_legacy_spec.rb +4 -0
- data/spec/mongo/operation/read_preference_op_msg_spec.rb +2 -0
- data/spec/mongo/operation/update/bulk_spec.rb +1 -1
- data/spec/mongo/operation/update/op_msg_spec.rb +1 -1
- data/spec/mongo/query_cache_spec.rb +6 -2
- data/spec/mongo/server/connection_common_spec.rb +62 -11
- data/spec/mongo/server/connection_pool_spec.rb +73 -7
- data/spec/mongo/server/connection_spec.rb +138 -43
- data/spec/mongo/server/description_spec.rb +1 -1
- data/spec/mongo/server/monitor/connection_spec.rb +22 -0
- data/spec/mongo/server/monitor_spec.rb +4 -3
- data/spec/mongo/server/push_monitor_spec.rb +101 -0
- data/spec/mongo/session/session_pool_spec.rb +42 -10
- data/spec/mongo/session_transaction_spec.rb +15 -30
- data/spec/mongo/socket/unix_spec.rb +1 -0
- data/spec/mongo/uri_option_parsing_spec.rb +38 -5
- data/spec/runners/change_streams/test.rb +1 -1
- data/spec/runners/cmap.rb +1 -1
- data/spec/runners/connection_string.rb +7 -3
- data/spec/runners/crud/operation.rb +5 -3
- data/spec/runners/crud/requirement.rb +1 -0
- data/spec/runners/crud.rb +1 -1
- data/spec/runners/sdam.rb +2 -1
- data/spec/runners/transactions/test.rb +2 -2
- data/spec/runners/unified/assertions.rb +2 -3
- data/spec/runners/unified/event_subscriber.rb +2 -2
- data/spec/runners/unified/support_operations.rb +10 -2
- data/spec/runners/unified/test.rb +3 -0
- data/spec/runners/unified.rb +1 -1
- data/spec/shared/lib/mrss/cluster_config.rb +6 -1
- data/spec/shared/lib/mrss/constraints.rb +11 -5
- data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
- data/spec/shared/lib/mrss/server_version_registry.rb +17 -12
- data/spec/shared/share/Dockerfile.erb +5 -4
- data/spec/shared/shlib/server.sh +70 -20
- data/spec/spec_tests/change_streams_spec.rb +1 -1
- data/spec/spec_tests/cmap_spec.rb +4 -1
- data/spec/spec_tests/command_monitoring_spec.rb +2 -2
- data/spec/spec_tests/data/command_monitoring/find.yml +9 -9
- data/spec/spec_tests/data/crud/read/aggregate-collation.yml +2 -1
- data/spec/spec_tests/data/crud/read/aggregate-out.yml +1 -0
- data/spec/spec_tests/data/crud/read/count-collation.yml +2 -1
- data/spec/spec_tests/data/crud/read/distinct-collation.yml +2 -1
- data/spec/spec_tests/data/crud/read/find-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +3 -2
- data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +3 -2
- data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +3 -2
- data/spec/spec_tests/data/crud/write/updateMany-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/updateOne-collation.yml +2 -1
- data/spec/spec_tests/data/load_balancers/event-monitoring.yml +99 -0
- data/spec/spec_tests/data/load_balancers/lb-connection-establishment.yml +36 -0
- data/spec/spec_tests/data/load_balancers/non-lb-connection-establishment.yml +56 -0
- data/spec/spec_tests/data/load_balancers/server-selection.yml +50 -0
- data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/mapReduce.yml +3 -1
- data/spec/spec_tests/data/sdam/load-balanced/discover_load_balancer.yml +25 -0
- data/spec/spec_tests/data/sdam_integration/find-network-error.yml +2 -0
- data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +2 -0
- data/spec/spec_tests/data/sdam_integration/hello-command-error.yml +3 -1
- data/spec/spec_tests/data/sdam_integration/hello-network-error.yml +3 -1
- data/spec/spec_tests/data/sdam_integration/hello-timeout.yml +2 -0
- data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +2 -0
- data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +2 -0
- data/spec/spec_tests/data/sdam_monitoring/load_balancer.yml +65 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-directConnection.yml +13 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-replicaSet-errors.yml +6 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-multiple-hosts.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-txt.yml +10 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-false.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-true.yml +0 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/encoded-userinfo-and-db.yml +15 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/loadBalanced-false-txt.yml +10 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/longer-parent-in-return.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/misformatted-option.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/no-results.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/not-enough-parts.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-result-default-port.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record-multiple-strings.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch1.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch2.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch3.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch4.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch5.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-too-short.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-wrong.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-default-port.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-nonstandard-port.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-txt-records.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-not-allowed-option.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-ssl-option.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-uri-option.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-unallowed-option.yml +0 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-admin-database.yml +13 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-auth.yml +12 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-port.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-two-hosts.yml +0 -0
- data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +2 -0
- data/spec/spec_tests/data/transactions/retryable-abort.yml +2 -0
- data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +2 -0
- data/spec/spec_tests/data/transactions/retryable-commit.yml +2 -0
- data/spec/spec_tests/data/transactions/retryable-writes.yml +2 -0
- data/spec/spec_tests/data/uri_options/connection-options.yml +60 -0
- data/spec/spec_tests/load_balancers_spec.rb +15 -0
- data/spec/spec_tests/retryable_reads_spec.rb +2 -2
- data/spec/spec_tests/retryable_writes_spec.rb +1 -1
- data/spec/spec_tests/sdam_integration_spec.rb +1 -1
- data/spec/spec_tests/sdam_monitoring_spec.rb +10 -5
- data/spec/spec_tests/sdam_spec.rb +1 -1
- data/spec/spec_tests/seed_list_discovery_spec.rb +118 -0
- data/spec/spec_tests/uri_options_spec.rb +4 -4
- data/spec/stress/fork_reconnect_stress_spec.rb +1 -5
- data/spec/stress/push_monitor_close_spec.rb +44 -0
- data/spec/support/certificates/atlas-ocsp-ca.crt +82 -90
- data/spec/support/certificates/atlas-ocsp.crt +127 -122
- data/spec/support/common_shortcuts.rb +2 -3
- data/spec/support/matchers.rb +13 -0
- data/spec/support/shared/auth_context.rb +16 -0
- data/spec/support/shared/session.rb +2 -2
- data/spec/support/spec_config.rb +10 -11
- data/spec/support/using_hash.rb +31 -0
- data/spec/support/utils.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +1077 -1029
- metadata.gz.sig +0 -0
- data/lib/mongo/collection/view/builder/find_command.rb +0 -173
- data/lib/mongo/collection/view/builder/op_query.rb +0 -94
- data/lib/mongo/cursor/builder/get_more_command.rb +0 -80
- data/lib/mongo/cursor/builder/kill_cursors_command.rb +0 -111
- data/lib/mongo/cursor/builder/op_get_more.rb +0 -64
- data/lib/mongo/cursor/builder/op_kill_cursors.rb +0 -106
- data/lib/mongo/server/context.rb +0 -72
- data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +0 -66
- data/spec/runners/unified/using_hash.rb +0 -34
- data/spec/spec_tests/dns_seedlist_discovery_spec.rb +0 -79
- data/spec/support/event_subscriber.rb +0 -221
@@ -0,0 +1,123 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
# Copyright (C) 2015-2020 MongoDB Inc.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
18
|
+
module Mongo
|
19
|
+
module Operation
|
20
|
+
class Find
|
21
|
+
module Builder
|
22
|
+
|
23
|
+
# Builds a legacy OP_QUERY specification from options.
|
24
|
+
#
|
25
|
+
# @api private
|
26
|
+
module Legacy
|
27
|
+
|
28
|
+
# Mappings from driver options to legacy server values.
|
29
|
+
#
|
30
|
+
# @since 2.2.0
|
31
|
+
DRIVER_MAPPINGS = {
|
32
|
+
comment: '$comment',
|
33
|
+
explain: '$explain',
|
34
|
+
hint: '$hint',
|
35
|
+
max_scan: '$maxScan',
|
36
|
+
max_time_ms: '$maxTimeMS',
|
37
|
+
max_value: '$max',
|
38
|
+
min_value: '$min',
|
39
|
+
show_disk_loc: '$showDiskLoc',
|
40
|
+
snapshot: '$snapshot',
|
41
|
+
sort: '$orderby',
|
42
|
+
return_key: '$returnKey',
|
43
|
+
}.freeze
|
44
|
+
|
45
|
+
module_function def selector(spec, connection)
|
46
|
+
if Lint.enabled?
|
47
|
+
if spec.keys.any? { |k| String === k }
|
48
|
+
raise Error::LintError, "The spec must contain symbol keys only"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# Server versions that do not have the find command feature
|
53
|
+
# (versions older than 3.2) do not support the allow_disk_use option
|
54
|
+
# but perform no validation and will not raise an error if it is
|
55
|
+
# specified. If the allow_disk_use option is specified, raise an error
|
56
|
+
# to alert the user.
|
57
|
+
unless spec[:allow_disk_use].nil?
|
58
|
+
raise Error::UnsupportedOption.allow_disk_use_error
|
59
|
+
end
|
60
|
+
|
61
|
+
if spec[:collation] && !connection.features.collation_enabled?
|
62
|
+
raise Error::UnsupportedCollation
|
63
|
+
end
|
64
|
+
|
65
|
+
modifiers = {}
|
66
|
+
DRIVER_MAPPINGS.each do |k, server_k|
|
67
|
+
unless (value = spec[k]).nil?
|
68
|
+
modifiers[server_k] = value
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
selector = spec[:filter] || BSON::Document.new
|
73
|
+
# Write nil into rp if not talking to mongos, rather than false
|
74
|
+
rp = if connection.description.mongos?
|
75
|
+
read_pref_formatted(spec)
|
76
|
+
end
|
77
|
+
if modifiers.any? || rp
|
78
|
+
selector = {'$query' => selector}.update(modifiers)
|
79
|
+
|
80
|
+
if rp
|
81
|
+
selector['$readPreference'] = rp
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
selector
|
86
|
+
end
|
87
|
+
|
88
|
+
module_function def query_options(spec, connection)
|
89
|
+
query_options = {
|
90
|
+
project: spec[:projection],
|
91
|
+
skip: spec[:skip],
|
92
|
+
limit: spec[:limit],
|
93
|
+
# batch_size is converted to batchSize by Mongo::Protocol::Query.
|
94
|
+
batch_size: spec[:batch_size],
|
95
|
+
}
|
96
|
+
|
97
|
+
unless (flags = Builder::Flags.map_flags(spec)).empty?
|
98
|
+
query_options[:flags] = ((query_options[:flags] || []) + flags).uniq
|
99
|
+
end
|
100
|
+
|
101
|
+
query_options
|
102
|
+
end
|
103
|
+
|
104
|
+
private
|
105
|
+
|
106
|
+
module_function def read_pref_formatted(spec)
|
107
|
+
if spec[:read_preference]
|
108
|
+
raise ArgumentError, "Spec cannot include :read_preference here, use :read"
|
109
|
+
end
|
110
|
+
|
111
|
+
if read = spec[:read]
|
112
|
+
read_pref = ServerSelector.get(read).to_mongos
|
113
|
+
Mongo::Lint.validate_camel_case_read_preference(read_pref)
|
114
|
+
read_pref
|
115
|
+
else
|
116
|
+
nil
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -16,64 +16,70 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
|
18
18
|
module Mongo
|
19
|
-
|
20
|
-
class
|
19
|
+
module Operation
|
20
|
+
class Find
|
21
21
|
module Builder
|
22
22
|
|
23
|
-
# Provides behavior for mapping
|
23
|
+
# Provides behavior for mapping Ruby options to legacy OP_QUERY
|
24
|
+
# find modifiers.
|
24
25
|
#
|
25
|
-
#
|
26
|
+
# This module is used in two ways:
|
27
|
+
# 1. When Collection#find is invoked with the legacy OP_QUERY
|
28
|
+
# syntax (:$query argument etc.), this module is used to map
|
29
|
+
# the legacy parameters into the Ruby options that normally
|
30
|
+
# are used by applications.
|
31
|
+
# 2. When sending a find operation using the OP_QUERY protocol,
|
32
|
+
# this module is used to map the Ruby find options to the
|
33
|
+
# modifiers in the wire protocol message.
|
34
|
+
#
|
35
|
+
# @api private
|
26
36
|
module Modifiers
|
27
|
-
extend self
|
28
37
|
|
29
|
-
# Mappings from
|
30
|
-
#
|
31
|
-
# @since 2.2.0
|
38
|
+
# Mappings from Ruby options to OP_QUERY modifiers.
|
32
39
|
DRIVER_MAPPINGS = BSON::Document.new(
|
33
|
-
sort: '$orderby',
|
34
|
-
hint: '$hint',
|
35
40
|
comment: '$comment',
|
36
|
-
|
41
|
+
explain: '$explain',
|
42
|
+
hint: '$hint',
|
37
43
|
max_scan: '$maxScan',
|
44
|
+
max_time_ms: '$maxTimeMS',
|
38
45
|
max_value: '$max',
|
39
46
|
min_value: '$min',
|
40
|
-
max_time_ms: '$maxTimeMS',
|
41
47
|
return_key: '$returnKey',
|
42
48
|
show_disk_loc: '$showDiskLoc',
|
43
|
-
|
49
|
+
snapshot: '$snapshot',
|
50
|
+
sort: '$orderby',
|
44
51
|
).freeze
|
45
52
|
|
46
|
-
# Mappings from
|
47
|
-
#
|
48
|
-
# @since 2.2.0
|
53
|
+
# Mappings from OP_QUERY modifiers to Ruby options.
|
49
54
|
SERVER_MAPPINGS = BSON::Document.new(DRIVER_MAPPINGS.invert).freeze
|
50
55
|
|
51
|
-
# Transform the provided
|
56
|
+
# Transform the provided OP_QUERY modifiers to Ruby options.
|
52
57
|
#
|
53
58
|
# @example Transform to driver options.
|
54
59
|
# Modifiers.map_driver_options(modifiers)
|
55
60
|
#
|
56
61
|
# @param [ Hash ] modifiers The modifiers.
|
57
62
|
#
|
58
|
-
# @return [ BSON::Document ] The
|
59
|
-
|
60
|
-
# @since 2.2.0
|
61
|
-
def self.map_driver_options(modifiers)
|
63
|
+
# @return [ BSON::Document ] The Ruby options.
|
64
|
+
module_function def map_driver_options(modifiers)
|
62
65
|
Options::Mapper.transform_documents(modifiers, SERVER_MAPPINGS)
|
63
66
|
end
|
64
67
|
|
65
|
-
# Transform the provided options into a document of
|
68
|
+
# Transform the provided Ruby options into a document of OP_QUERY
|
66
69
|
# modifiers.
|
67
70
|
#
|
71
|
+
# Accepts both string and symbol keys.
|
72
|
+
#
|
73
|
+
# The input mapping may contain additional keys that do not map to
|
74
|
+
# OP_QUERY modifiers, in which case the extra keys are ignored.
|
75
|
+
#
|
68
76
|
# @example Map the server modifiers.
|
69
77
|
# Modifiers.map_server_modifiers(options)
|
70
78
|
#
|
71
79
|
# @param [ Hash, BSON::Document ] options The options.
|
72
80
|
#
|
73
81
|
# @return [ BSON::Document ] The modifiers.
|
74
|
-
|
75
|
-
# @since 2.2.0
|
76
|
-
def self.map_server_modifiers(options)
|
82
|
+
module_function def map_server_modifiers(options)
|
77
83
|
Options::Mapper.transform_documents(options, DRIVER_MAPPINGS)
|
78
84
|
end
|
79
85
|
end
|
@@ -15,7 +15,7 @@
|
|
15
15
|
# See the License for the specific language governing permissions and
|
16
16
|
# limitations under the License.
|
17
17
|
|
18
|
-
require 'mongo/
|
19
|
-
require 'mongo/
|
20
|
-
require 'mongo/
|
21
|
-
require 'mongo/
|
18
|
+
require 'mongo/operation/find/builder/command'
|
19
|
+
require 'mongo/operation/find/builder/flags'
|
20
|
+
require 'mongo/operation/find/builder/legacy'
|
21
|
+
require 'mongo/operation/find/builder/modifiers'
|
@@ -33,6 +33,15 @@ module Mongo
|
|
33
33
|
|
34
34
|
private
|
35
35
|
|
36
|
+
def selector(connection)
|
37
|
+
# The mappings are BSON::Documents and as such store keys as
|
38
|
+
# strings, the spec here has symbol keys
|
39
|
+
spec = BSON::Document.new(self.spec)
|
40
|
+
{
|
41
|
+
find: coll_name,
|
42
|
+
}.update(Find::Builder::Command.selector(spec, connection))
|
43
|
+
end
|
44
|
+
|
36
45
|
def message(connection)
|
37
46
|
Protocol::Query.new(db_name, Database::COMMAND, command(connection), options(connection))
|
38
47
|
end
|
@@ -35,7 +35,16 @@ module Mongo
|
|
35
35
|
private
|
36
36
|
|
37
37
|
def message(connection)
|
38
|
-
|
38
|
+
selector = Find::Builder::Legacy.selector(spec, connection)
|
39
|
+
options = options(connection).update(
|
40
|
+
Find::Builder::Legacy.query_options(spec, connection),
|
41
|
+
)
|
42
|
+
Protocol::Query.new(
|
43
|
+
db_name,
|
44
|
+
coll_name,
|
45
|
+
selector,
|
46
|
+
options,
|
47
|
+
)
|
39
48
|
end
|
40
49
|
end
|
41
50
|
end
|
@@ -28,6 +28,18 @@ module Mongo
|
|
28
28
|
include CausalConsistencySupported
|
29
29
|
include ExecutableTransactionLabel
|
30
30
|
include PolymorphicResult
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def selector(connection)
|
35
|
+
# The mappings are BSON::Documents and as such store keys as
|
36
|
+
# strings, the spec here has symbol keys.
|
37
|
+
spec = BSON::Document.new(self.spec)
|
38
|
+
{
|
39
|
+
find: coll_name,
|
40
|
+
Protocol::Msg::DATABASE_IDENTIFIER => db_name,
|
41
|
+
}.update(Find::Builder::Command.selector(spec, connection))
|
42
|
+
end
|
31
43
|
end
|
32
44
|
end
|
33
45
|
end
|
data/lib/mongo/operation/find.rb
CHANGED
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
# Copyright (C) 2021 MongoDB Inc.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
18
|
+
module Mongo
|
19
|
+
module Operation
|
20
|
+
class GetMore
|
21
|
+
|
22
|
+
# @api private
|
23
|
+
module CommandBuilder
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def selector(connection)
|
28
|
+
{
|
29
|
+
getMore: BSON::Int64.new(spec.fetch(:cursor_id)),
|
30
|
+
collection: spec.fetch(:coll_name),
|
31
|
+
batchSize: spec[:batch_size],
|
32
|
+
maxTimeMS: spec[:max_time_ms],
|
33
|
+
}.compact
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -15,6 +15,7 @@
|
|
15
15
|
# See the License for the specific language governing permissions and
|
16
16
|
# limitations under the License.
|
17
17
|
|
18
|
+
require 'mongo/operation/get_more/command_builder'
|
18
19
|
require 'mongo/operation/get_more/command'
|
19
20
|
require 'mongo/operation/get_more/op_msg'
|
20
21
|
require 'mongo/operation/get_more/legacy'
|
@@ -28,9 +28,17 @@ module Mongo
|
|
28
28
|
include Specifiable
|
29
29
|
include Executable
|
30
30
|
include Limited
|
31
|
+
include CommandBuilder
|
31
32
|
|
32
33
|
private
|
33
34
|
|
35
|
+
def selector(connection)
|
36
|
+
{
|
37
|
+
killCursors: coll_name,
|
38
|
+
cursors: int64_cursor_ids,
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
34
42
|
def message(connection)
|
35
43
|
Protocol::Query.new(db_name, Database::COMMAND, selector(connection), options(connection))
|
36
44
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
# Copyright (C) 2021 MongoDB Inc.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
18
|
+
module Mongo
|
19
|
+
module Operation
|
20
|
+
class KillCursors
|
21
|
+
|
22
|
+
# @api private
|
23
|
+
module CommandBuilder
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def int64_cursor_ids
|
28
|
+
spec.fetch(:cursor_ids).map do |id|
|
29
|
+
BSON::Int64.new(id)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -27,11 +27,12 @@ module Mongo
|
|
27
27
|
class Legacy
|
28
28
|
include Specifiable
|
29
29
|
include Executable
|
30
|
+
include CommandBuilder
|
30
31
|
|
31
32
|
private
|
32
33
|
|
33
34
|
def message(connection)
|
34
|
-
Protocol::KillCursors.new(coll_name, db_name,
|
35
|
+
Protocol::KillCursors.new(coll_name, db_name, int64_cursor_ids)
|
35
36
|
end
|
36
37
|
end
|
37
38
|
end
|
@@ -26,6 +26,16 @@ module Mongo
|
|
26
26
|
# @since 2.5.2
|
27
27
|
class OpMsg < OpMsgBase
|
28
28
|
include ExecutableTransactionLabel
|
29
|
+
include CommandBuilder
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def selector(connection)
|
34
|
+
{
|
35
|
+
killCursors: coll_name,
|
36
|
+
cursors: int64_cursor_ids,
|
37
|
+
}
|
38
|
+
end
|
29
39
|
end
|
30
40
|
end
|
31
41
|
end
|
@@ -15,6 +15,7 @@
|
|
15
15
|
# See the License for the specific language governing permissions and
|
16
16
|
# limitations under the License.
|
17
17
|
|
18
|
+
require 'mongo/operation/kill_cursors/command_builder'
|
18
19
|
require 'mongo/operation/kill_cursors/command'
|
19
20
|
require 'mongo/operation/kill_cursors/op_msg'
|
20
21
|
require 'mongo/operation/kill_cursors/legacy'
|
@@ -34,6 +34,14 @@ module Mongo
|
|
34
34
|
|
35
35
|
private
|
36
36
|
|
37
|
+
def selector(connection)
|
38
|
+
super.tap do |selector|
|
39
|
+
if selector[:collation] && !connection.features.collation_enabled?
|
40
|
+
raise Error::UnsupportedCollation
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
37
45
|
def message(connection)
|
38
46
|
Protocol::Query.new(db_name, Database::COMMAND, command(connection), options(connection))
|
39
47
|
end
|
@@ -31,6 +31,19 @@ module Mongo
|
|
31
31
|
add_error_labels(connection, context) do
|
32
32
|
add_server_diagnostics(connection) do
|
33
33
|
get_result(connection, context, options).tap do |result|
|
34
|
+
if session
|
35
|
+
if session.in_transaction? &&
|
36
|
+
connection.description.load_balancer?
|
37
|
+
then
|
38
|
+
if session.pinned_service_id
|
39
|
+
unless session.pinned_service_id == connection.service_id
|
40
|
+
raise Error::InternalDriverError, "Expected operation to use service #{session.pinned_session_id} but it used #{connection.service_id}"
|
41
|
+
end
|
42
|
+
else
|
43
|
+
session.pin_to_service(connection.service_id)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
34
47
|
process_result(result, connection)
|
35
48
|
end
|
36
49
|
end
|
@@ -93,7 +106,7 @@ module Mongo
|
|
93
106
|
|
94
107
|
def process_result_for_sdam(result, connection)
|
95
108
|
if (result.not_master? || result.node_recovering?) &&
|
96
|
-
connection.generation >= connection.server.pool.generation
|
109
|
+
connection.generation >= connection.server.pool.generation(service_id: connection.service_id)
|
97
110
|
then
|
98
111
|
if result.node_shutting_down?
|
99
112
|
keep_pool = false
|
@@ -105,6 +118,7 @@ module Mongo
|
|
105
118
|
connection.server.unknown!(
|
106
119
|
keep_connection_pool: keep_pool,
|
107
120
|
generation: connection.generation,
|
121
|
+
service_id: connection.service_id,
|
108
122
|
topology_version: result.topology_version,
|
109
123
|
)
|
110
124
|
|
@@ -32,7 +32,7 @@ module Mongo
|
|
32
32
|
#
|
33
33
|
# @return [ Mongo::Operation::Result ] The operation result.
|
34
34
|
def execute(server, context:, options: {})
|
35
|
-
server.with_connection do |connection|
|
35
|
+
server.with_connection(service_id: context.service_id) do |connection|
|
36
36
|
operation = final_operation(connection)
|
37
37
|
operation.execute(connection, context: context, options: options)
|
38
38
|
end
|
@@ -96,7 +96,9 @@ module Mongo
|
|
96
96
|
#
|
97
97
|
# @return [ Hash ] New command document to send to the server.
|
98
98
|
def add_read_preference_legacy(sel, connection)
|
99
|
-
if read &&
|
99
|
+
if read && (
|
100
|
+
connection.description.mongos? || connection.description.load_balancer?
|
101
|
+
) && read_pref = read.to_mongos
|
100
102
|
# If the read preference contains only mode and mode is secondary
|
101
103
|
# preferred and we are sending to a pre-OP_MSG server, this read
|
102
104
|
# preference is indicated by the :secondary_ok wire protocol flag
|
@@ -133,7 +133,7 @@ module Mongo
|
|
133
133
|
end
|
134
134
|
end
|
135
135
|
|
136
|
-
sel = selector(connection)
|
136
|
+
sel = BSON::Document.new(selector(connection))
|
137
137
|
add_write_concern!(sel)
|
138
138
|
sel[Protocol::Msg::DATABASE_IDENTIFIER] = db_name
|
139
139
|
|
@@ -169,8 +169,11 @@ module Mongo
|
|
169
169
|
Lint.assert_type(connection, Server::Connection)
|
170
170
|
|
171
171
|
# https://github.com/mongodb/specifications/blob/master/source/server-selection/server-selection.rst#topology-type-single
|
172
|
-
if connection.description.standalone?
|
172
|
+
read_doc = if connection.description.standalone?
|
173
173
|
# Read preference is never sent to standalones.
|
174
|
+
nil
|
175
|
+
elsif connection.server.load_balancer?
|
176
|
+
read&.to_mongos
|
174
177
|
elsif connection.description.mongos?
|
175
178
|
# When server is a mongos:
|
176
179
|
# - $readPreference is never sent when mode is 'primary'
|
@@ -178,12 +181,7 @@ module Mongo
|
|
178
181
|
# When mode is 'secondaryPreferred' $readPreference is currently
|
179
182
|
# required to only be sent when a non-mode field (i.e. tag_sets)
|
180
183
|
# is present, but this causes wrong behavior (DRIVERS-1642).
|
181
|
-
|
182
|
-
doc = read.to_mongos
|
183
|
-
if doc
|
184
|
-
sel['$readPreference'] = doc
|
185
|
-
end
|
186
|
-
end
|
184
|
+
read&.to_mongos
|
187
185
|
elsif connection.server.cluster.single?
|
188
186
|
# In Single topology:
|
189
187
|
# - If no read preference is specified by the application, the driver
|
@@ -198,13 +196,15 @@ module Mongo
|
|
198
196
|
if [nil, 'primary'].include?(read_doc['mode'])
|
199
197
|
read_doc['mode'] = 'primaryPreferred'
|
200
198
|
end
|
201
|
-
|
199
|
+
read_doc
|
202
200
|
else
|
203
201
|
# In replica sets, read preference is passed to the server if one
|
204
202
|
# is specified by the application, and there is no default.
|
205
|
-
|
206
|
-
|
207
|
-
|
203
|
+
read&.to_doc
|
204
|
+
end
|
205
|
+
|
206
|
+
if read_doc
|
207
|
+
sel['$readPreference'] = read_doc
|
208
208
|
end
|
209
209
|
end
|
210
210
|
|