mongo 2.13.0.beta1 → 2.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +1 -5
- data/Rakefile +50 -9
- data/lib/mongo.rb +13 -2
- 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/auth/aws/request.rb +31 -5
- data/lib/mongo/bulk_write.rb +18 -0
- data/lib/mongo/caching_cursor.rb +74 -0
- data/lib/mongo/client.rb +238 -31
- data/lib/mongo/cluster.rb +56 -20
- data/lib/mongo/cluster/sdam_flow.rb +13 -10
- data/lib/mongo/cluster/topology/replica_set_no_primary.rb +3 -2
- data/lib/mongo/cluster/topology/sharded.rb +1 -1
- data/lib/mongo/cluster/topology/single.rb +2 -2
- data/lib/mongo/collection.rb +66 -24
- data/lib/mongo/collection/view.rb +24 -20
- data/lib/mongo/collection/view/aggregation.rb +25 -4
- data/lib/mongo/collection/view/builder/find_command.rb +38 -18
- data/lib/mongo/collection/view/explainable.rb +27 -8
- data/lib/mongo/collection/view/iterable.rb +72 -12
- data/lib/mongo/collection/view/readable.rb +19 -3
- data/lib/mongo/collection/view/writable.rb +55 -5
- data/lib/mongo/crypt/encryption_io.rb +6 -6
- data/lib/mongo/cursor.rb +16 -3
- data/lib/mongo/database.rb +37 -4
- data/lib/mongo/database/view.rb +18 -3
- data/lib/mongo/distinguishing_semaphore.rb +55 -0
- data/lib/mongo/error.rb +5 -0
- data/lib/mongo/error/invalid_read_concern.rb +28 -0
- data/lib/mongo/error/invalid_server_auth_host.rb +22 -0
- data/lib/mongo/error/invalid_session.rb +2 -1
- data/lib/mongo/error/operation_failure.rb +11 -5
- data/lib/mongo/error/server_certificate_revoked.rb +22 -0
- data/lib/mongo/error/sessions_not_supported.rb +35 -0
- data/lib/mongo/error/unsupported_option.rb +14 -12
- data/lib/mongo/event/base.rb +6 -0
- data/lib/mongo/grid/file.rb +5 -0
- data/lib/mongo/grid/file/chunk.rb +2 -0
- data/lib/mongo/grid/fs_bucket.rb +15 -13
- data/lib/mongo/grid/stream/write.rb +9 -3
- data/lib/mongo/index/view.rb +3 -0
- data/lib/mongo/lint.rb +2 -1
- data/lib/mongo/logger.rb +3 -3
- data/lib/mongo/monitoring.rb +38 -0
- data/lib/mongo/monitoring/command_log_subscriber.rb +10 -2
- data/lib/mongo/monitoring/event/command_failed.rb +11 -0
- data/lib/mongo/monitoring/event/command_started.rb +37 -2
- data/lib/mongo/monitoring/event/command_succeeded.rb +11 -0
- data/lib/mongo/monitoring/event/server_closed.rb +1 -1
- data/lib/mongo/monitoring/event/server_description_changed.rb +27 -4
- data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +9 -2
- data/lib/mongo/monitoring/event/server_heartbeat_started.rb +9 -2
- data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +9 -2
- data/lib/mongo/monitoring/event/server_opening.rb +1 -1
- data/lib/mongo/monitoring/event/topology_changed.rb +1 -1
- data/lib/mongo/monitoring/event/topology_closed.rb +1 -1
- data/lib/mongo/monitoring/event/topology_opening.rb +1 -1
- data/lib/mongo/monitoring/publishable.rb +6 -3
- data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +9 -1
- data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +1 -1
- data/lib/mongo/operation.rb +2 -0
- data/lib/mongo/operation/aggregate/result.rb +9 -8
- data/lib/mongo/operation/collections_info/command.rb +5 -0
- data/lib/mongo/operation/collections_info/result.rb +18 -1
- data/lib/mongo/operation/delete/bulk_result.rb +2 -0
- data/lib/mongo/operation/delete/result.rb +3 -0
- data/lib/mongo/operation/explain/command.rb +4 -0
- data/lib/mongo/operation/explain/legacy.rb +4 -0
- data/lib/mongo/operation/explain/op_msg.rb +6 -0
- data/lib/mongo/operation/explain/result.rb +3 -0
- data/lib/mongo/operation/find/legacy/result.rb +2 -0
- data/lib/mongo/operation/find/result.rb +13 -0
- data/lib/mongo/operation/get_more/result.rb +3 -0
- data/lib/mongo/operation/indexes/result.rb +5 -0
- data/lib/mongo/operation/insert/bulk_result.rb +5 -0
- data/lib/mongo/operation/insert/result.rb +5 -0
- data/lib/mongo/operation/list_collections/result.rb +5 -0
- data/lib/mongo/operation/map_reduce/result.rb +10 -0
- data/lib/mongo/operation/parallel_scan/result.rb +4 -0
- data/lib/mongo/operation/result.rb +35 -6
- data/lib/mongo/operation/shared/bypass_document_validation.rb +1 -0
- data/lib/mongo/operation/shared/causal_consistency_supported.rb +1 -0
- data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +2 -0
- data/lib/mongo/operation/shared/executable.rb +1 -0
- data/lib/mongo/operation/shared/idable.rb +2 -1
- data/lib/mongo/operation/shared/limited.rb +1 -0
- data/lib/mongo/operation/shared/object_id_generator.rb +1 -0
- data/lib/mongo/operation/shared/result/aggregatable.rb +1 -0
- data/lib/mongo/operation/shared/sessions_supported.rb +1 -0
- data/lib/mongo/operation/shared/specifiable.rb +1 -0
- data/lib/mongo/operation/shared/write.rb +1 -0
- data/lib/mongo/operation/shared/write_concern_supported.rb +1 -0
- data/lib/mongo/operation/update/legacy/result.rb +7 -0
- data/lib/mongo/operation/update/result.rb +8 -0
- data/lib/mongo/operation/users_info/result.rb +3 -0
- data/lib/mongo/protocol/message.rb +47 -10
- data/lib/mongo/protocol/msg.rb +34 -1
- data/lib/mongo/protocol/query.rb +36 -0
- data/lib/mongo/protocol/serializers.rb +5 -2
- data/lib/mongo/query_cache.rb +242 -0
- data/lib/mongo/retryable.rb +8 -1
- data/lib/mongo/server.rb +15 -4
- data/lib/mongo/server/app_metadata.rb +27 -3
- data/lib/mongo/server/connection.rb +4 -4
- data/lib/mongo/server/connection_base.rb +38 -12
- data/lib/mongo/server/connection_common.rb +2 -2
- data/lib/mongo/server/connection_pool.rb +3 -0
- data/lib/mongo/server/description.rb +13 -1
- data/lib/mongo/server/monitor.rb +76 -44
- data/lib/mongo/server/monitor/connection.rb +57 -9
- data/lib/mongo/server/pending_connection.rb +14 -4
- data/lib/mongo/server/push_monitor.rb +173 -0
- data/{spec/runners/transactions/context.rb → lib/mongo/server/push_monitor/connection.rb} +9 -14
- data/lib/mongo/server_selector.rb +0 -1
- data/lib/mongo/server_selector/base.rb +583 -1
- data/lib/mongo/server_selector/nearest.rb +1 -6
- data/lib/mongo/server_selector/primary.rb +1 -6
- data/lib/mongo/server_selector/primary_preferred.rb +7 -10
- data/lib/mongo/server_selector/secondary.rb +1 -6
- data/lib/mongo/server_selector/secondary_preferred.rb +1 -7
- data/lib/mongo/session.rb +7 -1
- data/lib/mongo/socket.rb +26 -12
- data/lib/mongo/socket/ocsp_cache.rb +97 -0
- data/lib/mongo/socket/ocsp_verifier.rb +368 -0
- data/lib/mongo/socket/ssl.rb +46 -25
- data/lib/mongo/socket/tcp.rb +1 -1
- data/lib/mongo/srv/monitor.rb +7 -13
- data/lib/mongo/srv/resolver.rb +14 -10
- data/lib/mongo/timeout.rb +2 -0
- data/lib/mongo/topology_version.rb +9 -0
- data/lib/mongo/uri.rb +21 -390
- data/lib/mongo/uri/options_mapper.rb +582 -0
- data/lib/mongo/uri/srv_protocol.rb +3 -2
- data/lib/mongo/utils.rb +73 -0
- data/lib/mongo/version.rb +1 -1
- data/spec/NOTES.aws-auth.md +12 -7
- data/spec/README.aws-auth.md +2 -2
- data/spec/README.md +63 -1
- data/spec/integration/awaited_ismaster_spec.rb +28 -0
- data/spec/integration/bson_symbol_spec.rb +4 -2
- data/spec/integration/bulk_write_spec.rb +67 -0
- data/spec/integration/change_stream_examples_spec.rb +6 -2
- data/spec/integration/change_stream_spec.rb +1 -1
- data/spec/integration/check_clean_slate_spec.rb +16 -0
- data/spec/integration/client_authentication_options_spec.rb +92 -28
- data/spec/integration/client_construction_spec.rb +1 -0
- data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +9 -5
- data/spec/integration/connect_single_rs_name_spec.rb +5 -2
- data/spec/integration/connection_pool_populator_spec.rb +4 -2
- data/spec/integration/connection_spec.rb +7 -4
- data/spec/integration/crud_spec.rb +4 -4
- data/spec/integration/cursor_reaping_spec.rb +54 -18
- data/spec/integration/docs_examples_spec.rb +6 -0
- data/spec/integration/fork_reconnect_spec.rb +56 -1
- data/spec/integration/grid_fs_bucket_spec.rb +48 -0
- data/spec/integration/heartbeat_events_spec.rb +4 -23
- data/spec/integration/ocsp_connectivity_spec.rb +26 -0
- data/spec/integration/ocsp_verifier_cache_spec.rb +188 -0
- data/spec/integration/ocsp_verifier_spec.rb +334 -0
- data/spec/integration/query_cache_spec.rb +1045 -0
- data/spec/integration/query_cache_transactions_spec.rb +190 -0
- data/spec/integration/read_concern_spec.rb +1 -1
- data/spec/integration/retryable_errors_spec.rb +1 -1
- data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -0
- data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +4 -2
- data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +3 -3
- data/spec/integration/retryable_writes/shared/performs_no_retries.rb +2 -2
- data/spec/integration/sdam_error_handling_spec.rb +122 -15
- data/spec/integration/sdam_events_spec.rb +80 -6
- data/spec/integration/sdam_prose_spec.rb +64 -0
- data/spec/integration/server_monitor_spec.rb +25 -1
- data/spec/integration/server_selection_spec.rb +36 -0
- data/spec/integration/size_limit_spec.rb +23 -5
- data/spec/integration/srv_monitoring_spec.rb +38 -3
- data/spec/integration/srv_spec.rb +56 -0
- data/spec/integration/ssl_uri_options_spec.rb +2 -2
- data/spec/integration/transactions_examples_spec.rb +17 -7
- data/spec/integration/zlib_compression_spec.rb +25 -0
- data/spec/lite_spec_helper.rb +20 -9
- data/spec/mongo/address_spec.rb +1 -1
- data/spec/mongo/auth/aws/request_region_spec.rb +42 -0
- data/spec/mongo/auth/aws/request_spec.rb +76 -0
- data/spec/mongo/auth/scram_spec.rb +1 -1
- data/spec/mongo/auth/user_spec.rb +1 -1
- data/spec/mongo/bulk_write_spec.rb +2 -2
- data/spec/mongo/caching_cursor_spec.rb +70 -0
- data/spec/mongo/client_construction_spec.rb +386 -3
- data/spec/mongo/client_encryption_spec.rb +16 -10
- data/spec/mongo/client_spec.rb +85 -3
- data/spec/mongo/cluster/topology/replica_set_spec.rb +53 -10
- data/spec/mongo/cluster/topology/sharded_spec.rb +1 -1
- data/spec/mongo/cluster/topology/single_spec.rb +19 -8
- data/spec/mongo/cluster/topology/unknown_spec.rb +1 -1
- data/spec/mongo/cluster/topology_spec.rb +1 -1
- data/spec/mongo/cluster_spec.rb +37 -35
- data/spec/mongo/collection/view/change_stream_resume_spec.rb +7 -7
- data/spec/mongo/collection/view/explainable_spec.rb +87 -4
- data/spec/mongo/collection/view/map_reduce_spec.rb +2 -0
- data/spec/mongo/collection/view/readable_spec.rb +36 -0
- data/spec/mongo/collection_spec.rb +572 -0
- data/spec/mongo/crypt/auto_decryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/auto_encryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/binary_spec.rb +1 -6
- data/spec/mongo/crypt/binding/binary_spec.rb +1 -6
- data/spec/mongo/crypt/binding/context_spec.rb +2 -7
- data/spec/mongo/crypt/binding/helpers_spec.rb +1 -6
- data/spec/mongo/crypt/binding/mongocrypt_spec.rb +2 -7
- data/spec/mongo/crypt/binding/status_spec.rb +1 -6
- data/spec/mongo/crypt/binding/version_spec.rb +1 -6
- data/spec/mongo/crypt/data_key_context_spec.rb +1 -1
- data/spec/mongo/crypt/explicit_decryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/explicit_encryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/status_spec.rb +1 -6
- data/spec/mongo/database_spec.rb +353 -8
- data/spec/mongo/distinguishing_semaphore_spec.rb +63 -0
- data/spec/mongo/error/no_server_available_spec.rb +1 -1
- data/spec/mongo/error/operation_failure_spec.rb +40 -0
- data/spec/mongo/index/view_spec.rb +148 -2
- data/spec/mongo/logger_spec.rb +13 -11
- data/spec/mongo/monitoring/event/server_closed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/server_description_changed_spec.rb +1 -4
- data/spec/mongo/monitoring/event/server_opening_spec.rb +1 -1
- data/spec/mongo/monitoring/event/topology_changed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/topology_closed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/topology_opening_spec.rb +1 -1
- data/spec/mongo/operation/delete/op_msg_spec.rb +3 -3
- data/spec/mongo/operation/insert/command_spec.rb +2 -2
- data/spec/mongo/operation/insert/op_msg_spec.rb +3 -3
- data/spec/mongo/operation/read_preference_op_msg_spec.rb +1 -1
- data/spec/mongo/operation/update/command_spec.rb +2 -2
- data/spec/mongo/operation/update/op_msg_spec.rb +3 -3
- data/spec/mongo/protocol/msg_spec.rb +10 -0
- data/spec/mongo/query_cache_spec.rb +280 -0
- data/spec/mongo/semaphore_spec.rb +51 -0
- data/spec/mongo/server/app_metadata_shared.rb +82 -2
- data/spec/mongo/server/connection_auth_spec.rb +2 -2
- data/spec/mongo/server/connection_pool_spec.rb +7 -3
- data/spec/mongo/server/connection_spec.rb +15 -8
- data/spec/mongo/server/description_spec.rb +18 -0
- data/spec/mongo/server_selector/nearest_spec.rb +23 -23
- data/spec/mongo/server_selector/primary_preferred_spec.rb +26 -26
- data/spec/mongo/server_selector/primary_spec.rb +9 -9
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +22 -22
- data/spec/mongo/server_selector/secondary_spec.rb +18 -18
- data/spec/mongo/server_selector_spec.rb +6 -6
- data/spec/mongo/session_spec.rb +35 -0
- data/spec/mongo/socket/ssl_spec.rb +4 -4
- data/spec/mongo/socket_spec.rb +1 -1
- data/spec/mongo/uri/srv_protocol_spec.rb +64 -33
- data/spec/mongo/uri_option_parsing_spec.rb +11 -11
- data/spec/mongo/uri_spec.rb +68 -41
- data/spec/mongo/utils_spec.rb +39 -0
- data/spec/runners/auth.rb +3 -0
- data/spec/runners/change_streams/test.rb +3 -3
- data/spec/runners/cmap.rb +1 -1
- data/spec/runners/command_monitoring.rb +3 -34
- data/spec/runners/connection_string.rb +35 -124
- data/spec/runners/crud/context.rb +9 -5
- data/spec/runners/crud/operation.rb +59 -27
- data/spec/runners/crud/spec.rb +0 -8
- data/spec/runners/crud/test.rb +1 -1
- data/spec/runners/crud/test_base.rb +0 -19
- data/spec/runners/sdam.rb +2 -2
- data/spec/runners/server_selection.rb +242 -28
- data/spec/runners/transactions.rb +12 -12
- data/spec/runners/transactions/operation.rb +151 -25
- data/spec/runners/transactions/test.rb +62 -18
- data/spec/shared/LICENSE +20 -0
- data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
- data/spec/shared/lib/mrss/constraints.rb +303 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
- data/spec/spec_helper.rb +3 -1
- data/spec/spec_tests/cmap_spec.rb +7 -3
- data/spec/spec_tests/command_monitoring_spec.rb +22 -12
- data/spec/spec_tests/crud_spec.rb +1 -1
- data/spec/spec_tests/data/change_streams/change-streams-errors.yml +4 -9
- data/spec/spec_tests/data/change_streams/change-streams-resume-whitelist.yml +66 -0
- data/spec/spec_tests/data/change_streams/change-streams.yml +0 -1
- data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +6 -2
- data/spec/spec_tests/data/cmap/pool-create-min-size.yml +3 -0
- data/spec/spec_tests/data/connection_string/valid-warnings.yml +24 -0
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml +15 -0
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +4 -3
- data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +1 -0
- data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +96 -0
- data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +88 -0
- data/spec/spec_tests/data/sdam_integration/find-network-error.yml +83 -0
- data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +116 -0
- data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +86 -0
- data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +115 -0
- data/spec/spec_tests/data/sdam_integration/isMaster-command-error.yml +168 -0
- data/spec/spec_tests/data/sdam_integration/isMaster-network-error.yml +162 -0
- data/spec/spec_tests/data/sdam_integration/isMaster-timeout.yml +229 -0
- data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +87 -0
- data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +1 -3
- data/spec/spec_tests/data/sdam_monitoring/standalone.yml +2 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +2 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +2 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +2 -2
- data/spec/spec_tests/data/uri_options/auth-options.yml +25 -0
- data/spec/spec_tests/data/uri_options/compression-options.yml +6 -3
- data/spec/spec_tests/data/uri_options/read-preference-options.yml +24 -0
- data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +1 -0
- data/spec/spec_tests/data/uri_options/tls-options.yml +160 -4
- data/spec/spec_tests/dns_seedlist_discovery_spec.rb +9 -1
- data/spec/spec_tests/max_staleness_spec.rb +4 -142
- data/spec/spec_tests/retryable_reads_spec.rb +2 -2
- data/spec/spec_tests/sdam_integration_spec.rb +13 -0
- data/spec/spec_tests/sdam_monitoring_spec.rb +1 -2
- data/spec/spec_tests/server_selection_spec.rb +4 -116
- data/spec/spec_tests/uri_options_spec.rb +31 -33
- data/spec/stress/cleanup_spec.rb +17 -2
- data/spec/stress/connection_pool_stress_spec.rb +10 -8
- data/spec/stress/fork_reconnect_stress_spec.rb +1 -1
- data/spec/support/certificates/atlas-ocsp-ca.crt +28 -0
- data/spec/support/certificates/atlas-ocsp.crt +41 -0
- data/spec/support/client_registry.rb +1 -0
- data/spec/support/client_registry_macros.rb +11 -2
- data/spec/support/cluster_config.rb +4 -0
- data/spec/support/common_shortcuts.rb +45 -0
- data/spec/support/constraints.rb +6 -253
- data/spec/support/event_subscriber.rb +123 -33
- data/spec/support/keyword_struct.rb +26 -0
- data/spec/support/matchers.rb +16 -0
- data/spec/support/ocsp +1 -0
- data/spec/support/session_registry.rb +52 -0
- data/spec/support/shared/server_selector.rb +13 -1
- data/spec/support/spec_config.rb +60 -13
- data/spec/support/spec_setup.rb +1 -1
- data/spec/support/utils.rb +84 -1
- metadata +1027 -937
- metadata.gz.sig +0 -0
- data/lib/mongo/server_selector/selectable.rb +0 -560
- data/spec/runners/sdam_monitoring.rb +0 -89
- data/spec/support/lite_constraints.rb +0 -141
data/lib/mongo/cluster.rb
CHANGED
@@ -395,7 +395,7 @@ module Mongo
|
|
395
395
|
#
|
396
396
|
# @since 2.0.0
|
397
397
|
def servers
|
398
|
-
topology.servers(servers_list
|
398
|
+
topology.servers(servers_list)
|
399
399
|
end
|
400
400
|
|
401
401
|
# The addresses in the cluster.
|
@@ -599,11 +599,14 @@ module Mongo
|
|
599
599
|
# respective server is cleared. Set this option to true to keep the
|
600
600
|
# existing connection pool (required when handling not master errors
|
601
601
|
# on 4.2+ servers).
|
602
|
+
# @option aptions [ true | false ] :awaited Whether the updated description
|
603
|
+
# was a result of processing an awaited ismaster.
|
602
604
|
#
|
603
605
|
# @api private
|
604
606
|
def run_sdam_flow(previous_desc, updated_desc, options = {})
|
605
607
|
@sdam_flow_lock.synchronize do
|
606
|
-
flow = SdamFlow.new(self, previous_desc, updated_desc
|
608
|
+
flow = SdamFlow.new(self, previous_desc, updated_desc,
|
609
|
+
awaited: options[:awaited])
|
607
610
|
flow.server_description_changed
|
608
611
|
|
609
612
|
# SDAM flow may alter the updated description - grab the final
|
@@ -886,21 +889,26 @@ module Mongo
|
|
886
889
|
end
|
887
890
|
end
|
888
891
|
|
889
|
-
#
|
890
|
-
# sessions.
|
892
|
+
# Raises Error::SessionsNotAvailable if the deployment that the driver
|
893
|
+
# is connected to does not support sessions.
|
891
894
|
#
|
892
895
|
# Session support may change over time, for example due to servers in the
|
893
|
-
# deployment being upgraded or downgraded.
|
894
|
-
#
|
895
|
-
#
|
896
|
-
#
|
897
|
-
# the deployment
|
896
|
+
# deployment being upgraded or downgraded. If the client is currently not
|
897
|
+
# connected to any data bearing servers, this method considers the state
|
898
|
+
# of session support as of when the client was last connected to at
|
899
|
+
# least one server. If the client has never connected to any servers,
|
900
|
+
# the deployment is considered to not support sessions.
|
898
901
|
#
|
899
|
-
# @return [ true | false ] Whether deployment supports sessions.
|
900
902
|
# @api private
|
901
|
-
def
|
902
|
-
|
903
|
-
|
903
|
+
def validate_session_support!
|
904
|
+
@state_change_lock.synchronize do
|
905
|
+
@sdam_flow_lock.synchronize do
|
906
|
+
if topology.data_bearing_servers?
|
907
|
+
unless topology.logical_session_timeout
|
908
|
+
raise_sessions_not_supported
|
909
|
+
end
|
910
|
+
end
|
911
|
+
end
|
904
912
|
end
|
905
913
|
|
906
914
|
# No data bearing servers known - perform server selection to try to
|
@@ -908,12 +916,24 @@ module Mongo
|
|
908
916
|
# assessment of whether sessions are currently supported.
|
909
917
|
begin
|
910
918
|
ServerSelector.get(mode: :primary_preferred).select_server(self)
|
911
|
-
|
919
|
+
@state_change_lock.synchronize do
|
920
|
+
@sdam_flow_lock.synchronize do
|
921
|
+
unless topology.logical_session_timeout
|
922
|
+
raise_sessions_not_supported
|
923
|
+
end
|
924
|
+
end
|
925
|
+
end
|
912
926
|
rescue Error::NoServerAvailable
|
913
927
|
# We haven't been able to contact any servers - use last known
|
914
|
-
# value for
|
915
|
-
@
|
916
|
-
@
|
928
|
+
# value for session support.
|
929
|
+
@state_change_lock.synchronize do
|
930
|
+
@sdam_flow_lock.synchronize do
|
931
|
+
@update_lock.synchronize do
|
932
|
+
unless @sessions_supported
|
933
|
+
raise_sessions_not_supported
|
934
|
+
end
|
935
|
+
end
|
936
|
+
end
|
917
937
|
end
|
918
938
|
end
|
919
939
|
end
|
@@ -930,9 +950,9 @@ module Mongo
|
|
930
950
|
# Start SRV monitor
|
931
951
|
@srv_monitor_lock.synchronize do
|
932
952
|
unless @srv_monitor
|
933
|
-
monitor_options = options.merge(
|
934
|
-
timeout: options[:connect_timeout] || Server::CONNECT_TIMEOUT)
|
935
|
-
@srv_monitor = _srv_monitor = Srv::Monitor.new(self, monitor_options)
|
953
|
+
monitor_options = Utils.shallow_symbolize_keys(options.merge(
|
954
|
+
timeout: options[:connect_timeout] || Server::CONNECT_TIMEOUT))
|
955
|
+
@srv_monitor = _srv_monitor = Srv::Monitor.new(self, **monitor_options)
|
936
956
|
finalizer = lambda do
|
937
957
|
_srv_monitor.stop!
|
938
958
|
end
|
@@ -952,6 +972,22 @@ module Mongo
|
|
952
972
|
end
|
953
973
|
end
|
954
974
|
end
|
975
|
+
|
976
|
+
def raise_sessions_not_supported
|
977
|
+
# Intentionally using @servers instead of +servers+ here because we
|
978
|
+
# are supposed to be already holding the @update_lock and we cannot
|
979
|
+
# recursively acquire it again.
|
980
|
+
offending_servers = @servers.select do |server|
|
981
|
+
server.description.data_bearing? && server.logical_session_timeout.nil?
|
982
|
+
end
|
983
|
+
reason = if offending_servers.empty?
|
984
|
+
"There are no known data bearing servers (current seeds: #{@servers.map(&:address).map(&:seed).join(', ')})"
|
985
|
+
else
|
986
|
+
"The following servers have null logical session timeout: #{offending_servers.map(&:address).map(&:seed).join(', ')}"
|
987
|
+
end
|
988
|
+
msg = "The deployment that the driver is connected to does not support sessions: #{reason}"
|
989
|
+
raise Error::SessionsNotSupported, msg
|
990
|
+
end
|
955
991
|
end
|
956
992
|
end
|
957
993
|
|
@@ -25,12 +25,13 @@ class Mongo::Cluster
|
|
25
25
|
class SdamFlow
|
26
26
|
extend Forwardable
|
27
27
|
|
28
|
-
def initialize(cluster, previous_desc, updated_desc)
|
28
|
+
def initialize(cluster, previous_desc, updated_desc, awaited: false)
|
29
29
|
@cluster = cluster
|
30
30
|
@topology = cluster.topology
|
31
31
|
@original_desc = @previous_desc = previous_desc
|
32
32
|
@updated_desc = updated_desc
|
33
33
|
@servers_to_disconnect = []
|
34
|
+
@awaited = !!awaited
|
34
35
|
end
|
35
36
|
|
36
37
|
attr_reader :cluster
|
@@ -51,6 +52,10 @@ class Mongo::Cluster
|
|
51
52
|
attr_reader :updated_desc
|
52
53
|
attr_reader :original_desc
|
53
54
|
|
55
|
+
def awaited?
|
56
|
+
@awaited
|
57
|
+
end
|
58
|
+
|
54
59
|
def_delegators :topology, :replica_set_name
|
55
60
|
|
56
61
|
# Updates descriptions on all servers whose address matches
|
@@ -431,15 +436,12 @@ class Mongo::Cluster
|
|
431
436
|
# the server - in case of a stale primary, the server reported itself
|
432
437
|
# as being a primary but updated_desc here will be unknown.
|
433
438
|
|
434
|
-
# We
|
435
|
-
#
|
436
|
-
#
|
437
|
-
#
|
438
|
-
#
|
439
|
-
#
|
440
|
-
if updated_desc.unknown? && previous_desc.unknown?
|
441
|
-
return
|
442
|
-
end
|
439
|
+
# We used to not notify on Unknown -> Unknown server changes.
|
440
|
+
# Technically these are valid state changes (or at least as valid as
|
441
|
+
# other server description changes when the description has not
|
442
|
+
# changed meaningfully but the events are still published).
|
443
|
+
# The current version of the driver notifies on Unknown -> Unknown
|
444
|
+
# transitions.
|
443
445
|
|
444
446
|
# Avoid dispatching events when updated description is the same as
|
445
447
|
# previous description. This allows this method to be called multiple
|
@@ -456,6 +458,7 @@ class Mongo::Cluster
|
|
456
458
|
topology,
|
457
459
|
previous_desc,
|
458
460
|
updated_desc,
|
461
|
+
awaited: awaited?,
|
459
462
|
)
|
460
463
|
)
|
461
464
|
@previous_desc = updated_desc
|
@@ -73,8 +73,9 @@ module Mongo
|
|
73
73
|
# @return [ true, false ] If a readable server is present.
|
74
74
|
#
|
75
75
|
# @since 2.4.0
|
76
|
+
# @deprecated
|
76
77
|
def has_readable_server?(cluster, server_selector = nil)
|
77
|
-
(server_selector || ServerSelector.primary).
|
78
|
+
!(server_selector || ServerSelector.primary).try_select_server(cluster).nil?
|
78
79
|
end
|
79
80
|
|
80
81
|
# Determine if the topology would select a writable server for the
|
@@ -89,7 +90,7 @@ module Mongo
|
|
89
90
|
#
|
90
91
|
# @since 2.4.0
|
91
92
|
def has_writable_server?(cluster)
|
92
|
-
|
93
|
+
!ServerSelector.primary.try_select_server(cluster).nil?
|
93
94
|
end
|
94
95
|
|
95
96
|
# A replica set topology is a replica set.
|
@@ -96,7 +96,7 @@ module Mongo
|
|
96
96
|
#
|
97
97
|
# @since 2.0.0
|
98
98
|
def servers(servers, name = nil)
|
99
|
-
|
99
|
+
servers.reject { |server| server.unknown? }
|
100
100
|
end
|
101
101
|
|
102
102
|
# A single topology is not sharded.
|
@@ -133,7 +133,7 @@ module Mongo
|
|
133
133
|
|
134
134
|
def validate_options(options, cluster)
|
135
135
|
if cluster.servers_list.length > 1
|
136
|
-
raise ArgumentError,
|
136
|
+
raise ArgumentError, "Cannot instantiate a single topology with more than one server in the cluster: #{cluster.servers_list.map(&:address).map(&:seed).join(', ')}"
|
137
137
|
end
|
138
138
|
|
139
139
|
super(options, cluster)
|
data/lib/mongo/collection.rb
CHANGED
@@ -223,6 +223,7 @@ module Mongo
|
|
223
223
|
# @param [ Hash ] opts The options for the create operation.
|
224
224
|
#
|
225
225
|
# @option options [ Session ] :session The session to use for the operation.
|
226
|
+
# @option opts [ Hash ] :write_concern The write concern options.
|
226
227
|
#
|
227
228
|
# @return [ Result ] The result of the command.
|
228
229
|
#
|
@@ -239,6 +240,11 @@ module Mongo
|
|
239
240
|
operation.delete(:write)
|
240
241
|
operation.delete(:write_concern)
|
241
242
|
client.send(:with_session, opts) do |session|
|
243
|
+
write_concern = if opts[:write_concern]
|
244
|
+
WriteConcern.get(opts[:write_concern])
|
245
|
+
else
|
246
|
+
self.write_concern
|
247
|
+
end
|
242
248
|
server = next_primary(nil, session)
|
243
249
|
if (options[:collation] || options[Operation::COLLATION]) && !server.with_connection { |connection| connection.features }.collation_enabled?
|
244
250
|
raise Error::UnsupportedCollation
|
@@ -264,12 +270,19 @@ module Mongo
|
|
264
270
|
# @param [ Hash ] opts The options for the drop operation.
|
265
271
|
#
|
266
272
|
# @option options [ Session ] :session The session to use for the operation.
|
273
|
+
# @option opts [ Hash ] :write_concern The write concern options.
|
267
274
|
#
|
268
275
|
# @return [ Result ] The result of the command.
|
269
276
|
#
|
270
277
|
# @since 2.0.0
|
271
278
|
def drop(opts = {})
|
272
279
|
client.send(:with_session, opts) do |session|
|
280
|
+
temp_write_concern = write_concern
|
281
|
+
write_concern = if opts[:write_concern]
|
282
|
+
WriteConcern.get(opts[:write_concern])
|
283
|
+
else
|
284
|
+
temp_write_concern
|
285
|
+
end
|
273
286
|
Operation::Drop.new({
|
274
287
|
selector: { :drop => name },
|
275
288
|
db_name: database.name,
|
@@ -278,8 +291,12 @@ module Mongo
|
|
278
291
|
}).execute(next_primary(nil, session), client: client)
|
279
292
|
end
|
280
293
|
rescue Error::OperationFailure => ex
|
281
|
-
|
282
|
-
|
294
|
+
# NamespaceNotFound
|
295
|
+
if ex.code == 26 || ex.code.nil? && ex.message =~ /ns not found/
|
296
|
+
false
|
297
|
+
else
|
298
|
+
raise
|
299
|
+
end
|
283
300
|
end
|
284
301
|
|
285
302
|
# Find documents in the collection.
|
@@ -400,7 +417,7 @@ module Mongo
|
|
400
417
|
View::ChangeStream.new(View.new(self, {}, options), pipeline, nil, options)
|
401
418
|
end
|
402
419
|
|
403
|
-
# Gets
|
420
|
+
# Gets an estimated number of matching documents in the collection.
|
404
421
|
#
|
405
422
|
# @example Get the count.
|
406
423
|
# collection.count(name: 1)
|
@@ -429,11 +446,13 @@ module Mongo
|
|
429
446
|
View.new(self, filter || {}, options).count(options)
|
430
447
|
end
|
431
448
|
|
432
|
-
# Gets the number of
|
433
|
-
# method, this will return the exact number of documents matching
|
449
|
+
# Gets the number of documents matching the query. Unlike the deprecated
|
450
|
+
# #count method, this will return the exact number of documents matching
|
451
|
+
# the filter (or exact number of documents in the collection, if no filter
|
452
|
+
# is provided) rather than an estimate.
|
434
453
|
#
|
435
|
-
#
|
436
|
-
#
|
454
|
+
# Use #estimated_document_count to retrieve an estimate of the number
|
455
|
+
# of documents in the collection using the collection metadata.
|
437
456
|
#
|
438
457
|
# @param [ Hash ] filter A filter for matching documents.
|
439
458
|
# @param [ Hash ] options Options for the operation.
|
@@ -450,19 +469,20 @@ module Mongo
|
|
450
469
|
# @return [ Integer ] The document count.
|
451
470
|
#
|
452
471
|
# @since 2.6.0
|
453
|
-
def count_documents(filter, options = {})
|
472
|
+
def count_documents(filter = {}, options = {})
|
454
473
|
View.new(self, filter, options).count_documents(options)
|
455
474
|
end
|
456
475
|
|
457
|
-
# Gets an estimate of the
|
476
|
+
# Gets an estimate of the number of documents in the collection using the
|
477
|
+
# collection metadata.
|
458
478
|
#
|
459
|
-
#
|
460
|
-
#
|
479
|
+
# Use #count_documents to retrieve the exact number of documents in the
|
480
|
+
# collection, or to count documents matching a filter.
|
461
481
|
#
|
462
482
|
# @param [ Hash ] options Options for the operation.
|
463
483
|
#
|
464
|
-
# @option opts :max_time_ms [ Integer ] The maximum amount of time to allow
|
465
|
-
# run.
|
484
|
+
# @option opts :max_time_ms [ Integer ] The maximum amount of time to allow
|
485
|
+
# the command to run for on the server.
|
466
486
|
# @option opts [ Hash ] :read The read preference options.
|
467
487
|
#
|
468
488
|
# @return [ Integer ] The document count.
|
@@ -536,20 +556,31 @@ module Mongo
|
|
536
556
|
#
|
537
557
|
# @since 2.0.0
|
538
558
|
def insert_one(document, opts = {})
|
559
|
+
QueryCache.clear_namespace(namespace)
|
560
|
+
|
539
561
|
client.send(:with_session, opts) do |session|
|
540
|
-
write_concern =
|
562
|
+
write_concern = if opts[:write_concern]
|
563
|
+
WriteConcern.get(opts[:write_concern])
|
564
|
+
else
|
565
|
+
write_concern_with_session(session)
|
566
|
+
end
|
567
|
+
|
568
|
+
if document.nil?
|
569
|
+
raise ArgumentError, "Document to be inserted cannot be nil"
|
570
|
+
end
|
571
|
+
|
541
572
|
write_with_retry(session, write_concern) do |server, txn_num|
|
542
573
|
Operation::Insert.new(
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
574
|
+
:documents => [ document ],
|
575
|
+
:db_name => database.name,
|
576
|
+
:coll_name => name,
|
577
|
+
:write_concern => write_concern,
|
578
|
+
:bypass_document_validation => !!opts[:bypass_document_validation],
|
579
|
+
:options => opts,
|
580
|
+
:id_generator => client.options[:id_generator],
|
581
|
+
:session => session,
|
582
|
+
:txn_num => txn_num
|
583
|
+
).execute(server, client: client)
|
553
584
|
end
|
554
585
|
end
|
555
586
|
end
|
@@ -568,6 +599,8 @@ module Mongo
|
|
568
599
|
#
|
569
600
|
# @since 2.0.0
|
570
601
|
def insert_many(documents, options = {})
|
602
|
+
QueryCache.clear_namespace(namespace)
|
603
|
+
|
571
604
|
inserts = documents.map{ |doc| { :insert_one => doc }}
|
572
605
|
bulk_write(inserts, options)
|
573
606
|
end
|
@@ -850,5 +883,14 @@ module Mongo
|
|
850
883
|
def namespace
|
851
884
|
"#{database.name}.#{name}"
|
852
885
|
end
|
886
|
+
|
887
|
+
# Whether the collection is a system collection.
|
888
|
+
#
|
889
|
+
# @return [ Boolean ] Whether the system is a system collection.
|
890
|
+
#
|
891
|
+
# @api private
|
892
|
+
def system_collection?
|
893
|
+
name.start_with?('system.')
|
894
|
+
end
|
853
895
|
end
|
854
896
|
end
|
@@ -120,27 +120,31 @@ module Mongo
|
|
120
120
|
# server can write temporary data to disk while executing the find
|
121
121
|
# operation. This option is only available on MongoDB server versions
|
122
122
|
# 4.4 and newer.
|
123
|
-
# @option options
|
124
|
-
#
|
125
|
-
# each response from MongoDB.
|
126
|
-
# @option options :projection [ Hash ] The fields to include or exclude in
|
127
|
-
# returned docs.
|
128
|
-
# @option options :hint [ Hash ] Override default index selection and force
|
129
|
-
# MongoDB to use a specific index for the query.
|
130
|
-
# @option options :limit [ Integer ] Max number of docs to return.
|
131
|
-
# @option options :max_scan [ Integer ] Constrain the query to only scan the
|
132
|
-
# specified number of docs. Use to prevent queries from running too long.
|
133
|
-
# Deprecated as of MongoDB server version 4.0.
|
134
|
-
# @option options :read [ Symbol ] The read preference to use for the query.
|
135
|
-
# If none is provided, the collection's default read preference is used.
|
136
|
-
# @option options :show_disk_loc [ true, false ] Return disk location info as
|
137
|
-
# a field in each doc.
|
138
|
-
# @option options :skip [ Integer ] The number of documents to skip.
|
139
|
-
# @option options :snapshot [ true, false ] Prevents returning a doc more than
|
140
|
-
# once. Deprecated as of MongoDB server version 4.0.
|
141
|
-
# @option options :sort [ Hash ] The key and direction pairs used to sort the
|
142
|
-
# results.
|
123
|
+
# @option options [ Integer ] :batch_size The number of documents to
|
124
|
+
# return in each response from MongoDB.
|
143
125
|
# @option options [ Hash ] :collation The collation to use.
|
126
|
+
# @option options [ String ] :comment Associate a comment with the query.
|
127
|
+
# @option options [ Hash ] :explain Execute an explain with the provided
|
128
|
+
# explain options (known options are :verbose and :verbosity) rather
|
129
|
+
# than a find.
|
130
|
+
# @option options [ Hash ] :hint Override the default index selection and
|
131
|
+
# force MongoDB to use a specific index for the query.
|
132
|
+
# @option options [ Integer ] :limit Max number of documents to return.
|
133
|
+
# @option options [ Integer ] :max_scan Constrain the query to only scan
|
134
|
+
# the specified number of documents. Use to prevent queries from
|
135
|
+
# running for too long. Deprecated as of MongoDB server version 4.0.
|
136
|
+
# @option options [ Hash ] :projection The fields to include or exclude
|
137
|
+
# in the returned documents.
|
138
|
+
# @option options [ Hash ] :read The read preference to use for the
|
139
|
+
# query. If none is provided, the collection's default read preference
|
140
|
+
# is used.
|
141
|
+
# @option options [ true | false ] :show_disk_loc Return disk location
|
142
|
+
# info as a field in each doc.
|
143
|
+
# @option options [ Integer ] :skip The number of documents to skip.
|
144
|
+
# @option options [ true | false ] :snapshot Prevents returning a
|
145
|
+
# document more than once. Deprecated as of MongoDB server version 4.0.
|
146
|
+
# @option options [ Hash ] :sort The key and direction pairs used to sort
|
147
|
+
# the results.
|
144
148
|
#
|
145
149
|
# @since 2.0.0
|
146
150
|
def initialize(collection, filter = {}, options = {})
|