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
@@ -0,0 +1,190 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'QueryCache with transactions' do
|
4
|
+
# Work around https://jira.mongodb.org/browse/HELP-10518
|
5
|
+
before(:all) do
|
6
|
+
client = ClientRegistry.instance.global_client('authorized')
|
7
|
+
Utils.create_collection(client, 'test')
|
8
|
+
|
9
|
+
Utils.mongos_each_direct_client do |client|
|
10
|
+
client['test'].distinct('foo').to_a
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
around do |spec|
|
15
|
+
Mongo::QueryCache.clear
|
16
|
+
Mongo::QueryCache.cache { spec.run }
|
17
|
+
end
|
18
|
+
|
19
|
+
# These tests do not currently use the session registry because transactions
|
20
|
+
# leak sessions independently of the query cache. This will be resolved by
|
21
|
+
# RUBY-2391.
|
22
|
+
|
23
|
+
let(:subscriber) { EventSubscriber.new }
|
24
|
+
|
25
|
+
let(:client) do
|
26
|
+
authorized_client.tap do |client|
|
27
|
+
client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
before do
|
32
|
+
collection.delete_many
|
33
|
+
|
34
|
+
# Work around https://jira.mongodb.org/browse/HELP-10518
|
35
|
+
client.start_session do |session|
|
36
|
+
session.with_transaction do
|
37
|
+
collection.find({}, session: session).to_a
|
38
|
+
end
|
39
|
+
end
|
40
|
+
subscriber.clear_events!
|
41
|
+
end
|
42
|
+
|
43
|
+
describe 'in transactions' do
|
44
|
+
require_transaction_support
|
45
|
+
require_wired_tiger
|
46
|
+
|
47
|
+
let(:collection) { client['test'] }
|
48
|
+
|
49
|
+
let(:events) do
|
50
|
+
subscriber.command_started_events('find')
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'with convenient API' do
|
54
|
+
context 'when same query is performed inside and outside of transaction' do
|
55
|
+
it 'performs one query' do
|
56
|
+
collection.find.to_a
|
57
|
+
|
58
|
+
session = client.start_session
|
59
|
+
session.with_transaction do
|
60
|
+
collection.find({}, session: session).to_a
|
61
|
+
end
|
62
|
+
|
63
|
+
expect(subscriber.command_started_events('find').length).to eq(1)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context 'when transaction has a different read concern' do
|
68
|
+
it 'performs two queries' do
|
69
|
+
collection.find.to_a
|
70
|
+
|
71
|
+
session = client.start_session
|
72
|
+
session.with_transaction(
|
73
|
+
read_concern: { level: :snapshot }
|
74
|
+
) do
|
75
|
+
collection.find({}, session: session).to_a
|
76
|
+
end
|
77
|
+
|
78
|
+
expect(subscriber.command_started_events('find').length).to eq(2)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'when transaction has a different read preference' do
|
83
|
+
it 'performs two queries' do
|
84
|
+
collection.find.to_a
|
85
|
+
|
86
|
+
session = client.start_session
|
87
|
+
session.with_transaction(
|
88
|
+
read: { mode: :primary }
|
89
|
+
) do
|
90
|
+
collection.find({}, session: session).to_a
|
91
|
+
end
|
92
|
+
|
93
|
+
expect(subscriber.command_started_events('find').length).to eq(2)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
context 'when transaction is committed' do
|
98
|
+
it 'clears the cache' do
|
99
|
+
session = client.start_session
|
100
|
+
session.with_transaction do
|
101
|
+
collection.insert_one({ test: 1 }, session: session)
|
102
|
+
collection.insert_one({ test: 2 }, session: session)
|
103
|
+
|
104
|
+
expect(collection.find({}, session: session).to_a.length).to eq(2)
|
105
|
+
expect(collection.find({}, session: session).to_a.length).to eq(2)
|
106
|
+
|
107
|
+
# The driver caches the queries within the transaction
|
108
|
+
expect(subscriber.command_started_events('find').length).to eq(1)
|
109
|
+
session.commit_transaction
|
110
|
+
end
|
111
|
+
|
112
|
+
expect(collection.find.to_a.length).to eq(2)
|
113
|
+
|
114
|
+
# The driver clears the cache and runs the query again
|
115
|
+
expect(subscriber.command_started_events('find').length).to eq(2)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
context 'when transaction is aborted' do
|
120
|
+
it 'clears the cache' do
|
121
|
+
session = client.start_session
|
122
|
+
session.with_transaction do
|
123
|
+
collection.insert_one({ test: 1 }, session: session)
|
124
|
+
collection.insert_one({ test: 2 }, session: session)
|
125
|
+
|
126
|
+
expect(collection.find({}, session: session).to_a.length).to eq(2)
|
127
|
+
expect(collection.find({}, session: session).to_a.length).to eq(2)
|
128
|
+
|
129
|
+
# The driver caches the queries within the transaction
|
130
|
+
expect(subscriber.command_started_events('find').length).to eq(1)
|
131
|
+
session.abort_transaction
|
132
|
+
end
|
133
|
+
|
134
|
+
expect(collection.find.to_a.length).to eq(0)
|
135
|
+
|
136
|
+
# The driver clears the cache and runs the query again
|
137
|
+
expect(subscriber.command_started_events('find').length).to eq(2)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
context 'with low-level API' do
|
143
|
+
context 'when transaction is committed' do
|
144
|
+
it 'clears the cache' do
|
145
|
+
session = client.start_session
|
146
|
+
session.start_transaction
|
147
|
+
|
148
|
+
collection.insert_one({ test: 1 }, session: session)
|
149
|
+
collection.insert_one({ test: 2 }, session: session)
|
150
|
+
|
151
|
+
expect(collection.find({}, session: session).to_a.length).to eq(2)
|
152
|
+
expect(collection.find({}, session: session).to_a.length).to eq(2)
|
153
|
+
|
154
|
+
# The driver caches the queries within the transaction
|
155
|
+
expect(subscriber.command_started_events('find').length).to eq(1)
|
156
|
+
|
157
|
+
session.commit_transaction
|
158
|
+
|
159
|
+
expect(collection.find.to_a.length).to eq(2)
|
160
|
+
|
161
|
+
# The driver clears the cache and runs the query again
|
162
|
+
expect(subscriber.command_started_events('find').length).to eq(2)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
context 'when transaction is aborted' do
|
167
|
+
it 'clears the cache' do
|
168
|
+
session = client.start_session
|
169
|
+
session.start_transaction
|
170
|
+
|
171
|
+
collection.insert_one({ test: 1 }, session: session)
|
172
|
+
collection.insert_one({ test: 2 }, session: session)
|
173
|
+
|
174
|
+
expect(collection.find({}, session: session).to_a.length).to eq(2)
|
175
|
+
expect(collection.find({}, session: session).to_a.length).to eq(2)
|
176
|
+
|
177
|
+
# The driver caches the queries within the transaction
|
178
|
+
expect(subscriber.command_started_events('find').length).to eq(1)
|
179
|
+
|
180
|
+
session.abort_transaction
|
181
|
+
|
182
|
+
expect(collection.find.to_a.length).to eq(0)
|
183
|
+
|
184
|
+
# The driver clears the cache and runs the query again
|
185
|
+
expect(subscriber.command_started_events('find').length).to eq(2)
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
@@ -106,7 +106,7 @@ describe 'Failing retryable operations' do
|
|
106
106
|
},
|
107
107
|
}
|
108
108
|
|
109
|
-
if ClusterConfig.instance.short_server_version >= '4.
|
109
|
+
if ClusterConfig.instance.short_server_version >= '4.4'
|
110
110
|
# Server versions 4.4 and newer will add the RetryableWriteError
|
111
111
|
# label to all retryable errors, and the driver must not add the label
|
112
112
|
# if it is not already present.
|
@@ -2,6 +2,8 @@ require_relative './adds_diagnostics'
|
|
2
2
|
|
3
3
|
module PerformsLegacyRetries
|
4
4
|
shared_examples 'it performs legacy retries' do
|
5
|
+
require_warning_clean
|
6
|
+
|
5
7
|
context 'for connection error' do
|
6
8
|
before do
|
7
9
|
client.use('admin').command(
|
@@ -26,7 +28,7 @@ module PerformsLegacyRetries
|
|
26
28
|
end
|
27
29
|
|
28
30
|
context 'for ETIMEDOUT' do
|
29
|
-
min_server_fcv '4.
|
31
|
+
min_server_fcv '4.4'
|
30
32
|
|
31
33
|
# shorten socket timeout so these tests take less time to run
|
32
34
|
let(:socket_timeout) { 1 }
|
@@ -59,7 +61,7 @@ module PerformsLegacyRetries
|
|
59
61
|
end
|
60
62
|
|
61
63
|
context 'on server versions >= 4.4' do
|
62
|
-
min_server_fcv '4.
|
64
|
+
min_server_fcv '4.4'
|
63
65
|
|
64
66
|
context 'for OperationFailure with RetryableWriteError label' do
|
65
67
|
before do
|
@@ -44,8 +44,8 @@ module PerformsModernRetries
|
|
44
44
|
|
45
45
|
context 'for ETIMEDOUT' do
|
46
46
|
# blockConnection option in failCommand was introduced in
|
47
|
-
# server version 4.
|
48
|
-
min_server_fcv '4.
|
47
|
+
# server version 4.4
|
48
|
+
min_server_fcv '4.4'
|
49
49
|
|
50
50
|
# shorten socket timeout so these tests take less time to run
|
51
51
|
let(:socket_timeout) { 1 }
|
@@ -94,7 +94,7 @@ module PerformsModernRetries
|
|
94
94
|
end
|
95
95
|
|
96
96
|
context 'on server versions >= 4.4' do
|
97
|
-
min_server_fcv '4.
|
97
|
+
min_server_fcv '4.4'
|
98
98
|
|
99
99
|
context 'for OperationFailure with RetryableWriteError label' do
|
100
100
|
before do
|
@@ -25,7 +25,7 @@ module PerformsNoRetries
|
|
25
25
|
end
|
26
26
|
|
27
27
|
context 'for ETIMEDOUT' do
|
28
|
-
min_server_fcv '4.
|
28
|
+
min_server_fcv '4.4'
|
29
29
|
|
30
30
|
# shorten socket timeout so these tests take less time to run
|
31
31
|
let(:socket_timeout) { 1 }
|
@@ -58,7 +58,7 @@ module PerformsNoRetries
|
|
58
58
|
end
|
59
59
|
|
60
60
|
context 'on server versions >= 4.4' do
|
61
|
-
min_server_fcv '4.
|
61
|
+
min_server_fcv '4.4'
|
62
62
|
# These tests will be implemented in a follow-up PR
|
63
63
|
end
|
64
64
|
|
@@ -3,15 +3,40 @@ require 'spec_helper'
|
|
3
3
|
describe 'SDAM error handling' do
|
4
4
|
clean_slate_for_all
|
5
5
|
|
6
|
+
after do
|
7
|
+
# Close all clients after every test to avoid leaking expectations into
|
8
|
+
# subsequent tests because we set global assertions on sockets.
|
9
|
+
ClientRegistry.instance.close_all_clients
|
10
|
+
end
|
11
|
+
|
6
12
|
# These tests operate on specific servers, and don't work in a multi
|
7
13
|
# shard cluster where multiple servers are equally eligible
|
8
14
|
require_no_multi_shard
|
9
15
|
|
10
|
-
let(:
|
16
|
+
let(:diagnostic_subscriber) { VerboseEventSubscriber.new }
|
17
|
+
|
18
|
+
let(:client) do
|
19
|
+
new_local_client(SpecConfig.instance.addresses,
|
20
|
+
SpecConfig.instance.all_test_options.merge(
|
21
|
+
socket_timeout: 3, connect_timeout: 3,
|
22
|
+
heartbeat_frequency: 100,
|
23
|
+
# Uncomment to print all events to stdout:
|
24
|
+
#sdam_proc: Utils.subscribe_all_sdam_proc(diagnostic_subscriber),
|
25
|
+
**Utils.disable_retries_client_options)
|
26
|
+
)
|
27
|
+
end
|
11
28
|
|
12
29
|
let(:server) { client.cluster.next_primary }
|
13
30
|
|
14
31
|
shared_examples_for 'marks server unknown' do
|
32
|
+
before do
|
33
|
+
server.monitor.stop!
|
34
|
+
end
|
35
|
+
|
36
|
+
after do
|
37
|
+
client.close
|
38
|
+
end
|
39
|
+
|
15
40
|
it 'marks server unknown' do
|
16
41
|
expect(server).not_to be_unknown
|
17
42
|
RSpec::Mocks.with_temporary_scope do
|
@@ -22,6 +47,14 @@ describe 'SDAM error handling' do
|
|
22
47
|
end
|
23
48
|
|
24
49
|
shared_examples_for 'does not mark server unknown' do
|
50
|
+
before do
|
51
|
+
server.monitor.stop!
|
52
|
+
end
|
53
|
+
|
54
|
+
after do
|
55
|
+
client.close
|
56
|
+
end
|
57
|
+
|
25
58
|
it 'does not mark server unknown' do
|
26
59
|
expect(server).not_to be_unknown
|
27
60
|
RSpec::Mocks.with_temporary_scope do
|
@@ -148,6 +181,9 @@ describe 'SDAM error handling' do
|
|
148
181
|
end
|
149
182
|
|
150
183
|
context 'network error' do
|
184
|
+
# With 4.4 servers we set up two monitoring connections, hence global
|
185
|
+
# socket expectations get hit twice.
|
186
|
+
max_server_version '4.2'
|
151
187
|
|
152
188
|
let(:operation) do
|
153
189
|
expect_any_instance_of(Mongo::Socket).to receive(:read).and_raise(exception)
|
@@ -178,15 +214,76 @@ describe 'SDAM error handling' do
|
|
178
214
|
end
|
179
215
|
end
|
180
216
|
|
181
|
-
describe 'when there is an error
|
182
|
-
|
217
|
+
describe 'when there is an error during connection establishment' do
|
218
|
+
require_topology :single
|
219
|
+
|
220
|
+
# The push monitor creates sockets unpredictably and interferes with this
|
221
|
+
# test.
|
222
|
+
max_server_version '4.2'
|
223
|
+
|
224
|
+
# When TLS is used there are two socket classes and we can't simply
|
225
|
+
# mock the base Socket class.
|
226
|
+
require_no_tls
|
227
|
+
|
228
|
+
{
|
229
|
+
SystemCallError => Mongo::Error::SocketError,
|
230
|
+
Errno::ETIMEDOUT => Mongo::Error::SocketTimeoutError,
|
231
|
+
}.each do |raw_error_cls, mapped_error_cls|
|
232
|
+
context raw_error_cls.name do
|
233
|
+
let(:socket) do
|
234
|
+
double('mock socket').tap do |socket|
|
235
|
+
allow(socket).to receive(:set_encoding)
|
236
|
+
allow(socket).to receive(:setsockopt)
|
237
|
+
allow(socket).to receive(:getsockopt)
|
238
|
+
allow(socket).to receive(:connect)
|
239
|
+
allow(socket).to receive(:close)
|
240
|
+
socket.should receive(:write).and_raise(raw_error_cls, 'mocked failure')
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
it 'marks server unknown' do
|
245
|
+
server = client.cluster.next_primary
|
246
|
+
client.cluster.servers.map(&:disconnect!)
|
247
|
+
|
248
|
+
RSpec::Mocks.with_temporary_scope do
|
249
|
+
|
250
|
+
Socket.should receive(:new).with(any_args).ordered.once.and_return(socket)
|
251
|
+
|
252
|
+
lambda do
|
253
|
+
client.command(ping: 1)
|
254
|
+
end.should raise_error(mapped_error_cls, /mocked failure/)
|
255
|
+
|
256
|
+
server.should be_unknown
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
it 'recovers' do
|
261
|
+
server = client.cluster.next_primary
|
262
|
+
# If we do not kill the monitor, the client will recover automatically.
|
263
|
+
|
264
|
+
RSpec::Mocks.with_temporary_scope do
|
265
|
+
|
266
|
+
Socket.should receive(:new).with(any_args).ordered.once.and_return(socket)
|
267
|
+
Socket.should receive(:new).with(any_args).ordered.once.and_call_original
|
268
|
+
|
269
|
+
lambda do
|
270
|
+
client.command(ping: 1)
|
271
|
+
end.should raise_error(mapped_error_cls, /mocked failure/)
|
272
|
+
|
273
|
+
client.command(ping: 1)
|
274
|
+
end
|
275
|
+
end
|
276
|
+
end
|
277
|
+
end
|
183
278
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
connect_timeout: 1, socket_timeout: 1,
|
188
|
-
))
|
279
|
+
after do
|
280
|
+
# Since we stopped monitoring on the client, close it.
|
281
|
+
ClientRegistry.instance.close_all_clients
|
189
282
|
end
|
283
|
+
end
|
284
|
+
|
285
|
+
describe 'when there is an error on monitoring connection' do
|
286
|
+
clean_slate_for_all
|
190
287
|
|
191
288
|
let(:subscriber) { EventSubscriber.new }
|
192
289
|
|
@@ -209,6 +306,7 @@ describe 'SDAM error handling' do
|
|
209
306
|
it 'marks server unknown' do
|
210
307
|
expect(server).not_to be_unknown
|
211
308
|
|
309
|
+
#subscriber.clear_events!
|
212
310
|
events = subscriber.select_succeeded_events(Mongo::Monitoring::Event::ServerDescriptionChanged)
|
213
311
|
events.should be_empty
|
214
312
|
|
@@ -228,6 +326,7 @@ describe 'SDAM error handling' do
|
|
228
326
|
|
229
327
|
shared_examples_for 'clears connection pool - cmap event' do
|
230
328
|
it 'clears connection pool' do
|
329
|
+
#subscriber.clear_events!
|
231
330
|
events = subscriber.select_published_events(Mongo::Monitoring::Event::Cmap::PoolCleared)
|
232
331
|
events.should be_empty
|
233
332
|
|
@@ -245,6 +344,7 @@ describe 'SDAM error handling' do
|
|
245
344
|
end
|
246
345
|
|
247
346
|
shared_examples_for 'marks server unknown and clears connection pool' do
|
347
|
+
=begin These tests are not reliable
|
248
348
|
context 'via object inspection' do
|
249
349
|
let(:expect_server_state_change) do
|
250
350
|
server.summary.should =~ /unknown/i
|
@@ -254,6 +354,7 @@ describe 'SDAM error handling' do
|
|
254
354
|
it_behaves_like 'marks server unknown'
|
255
355
|
it_behaves_like 'clears connection pool'
|
256
356
|
end
|
357
|
+
=end
|
257
358
|
|
258
359
|
context 'via events' do
|
259
360
|
# When we use events we do not need to examine object state, therefore
|
@@ -268,16 +369,22 @@ describe 'SDAM error handling' do
|
|
268
369
|
end
|
269
370
|
end
|
270
371
|
|
271
|
-
context '
|
272
|
-
|
372
|
+
context 'via stubs' do
|
373
|
+
# With 4.4 servers we set up two monitoring connections, hence global
|
374
|
+
# socket expectations get hit twice.
|
375
|
+
max_server_version '4.2'
|
273
376
|
|
274
|
-
|
275
|
-
|
377
|
+
context 'network timeout' do
|
378
|
+
let(:exception) { Mongo::Error::SocketTimeoutError }
|
276
379
|
|
277
|
-
|
278
|
-
|
380
|
+
it_behaves_like 'marks server unknown and clears connection pool'
|
381
|
+
end
|
279
382
|
|
280
|
-
|
383
|
+
context 'non-timeout network error' do
|
384
|
+
let(:exception) { Mongo::Error::SocketError }
|
385
|
+
|
386
|
+
it_behaves_like 'marks server unknown and clears connection pool'
|
387
|
+
end
|
281
388
|
end
|
282
389
|
|
283
390
|
context 'non-timeout network error via fail point' do
|