mongo 2.13.0.beta1 → 2.14.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +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
@@ -156,7 +156,9 @@ module Mongo
|
|
156
156
|
operation_id = Monitoring.next_operation_id
|
157
157
|
command_started(address, operation_id, message.payload,
|
158
158
|
socket_object_id: socket.object_id, connection_id: id,
|
159
|
-
connection_generation: generation
|
159
|
+
connection_generation: generation,
|
160
|
+
server_connection_id: description.server_connection_id,
|
161
|
+
)
|
160
162
|
start = Time.now
|
161
163
|
result = nil
|
162
164
|
begin
|
@@ -184,9 +186,6 @@ module Mongo
|
|
184
186
|
end
|
185
187
|
|
186
188
|
def serialize(message, client, buffer = BSON::ByteBuffer.new)
|
187
|
-
start_size = 0
|
188
|
-
final_message = message.maybe_compress(compressor, options[:zlib_compression_level])
|
189
|
-
|
190
189
|
# Driver specifications only mandate the fixed 16MiB limit for
|
191
190
|
# serialized BSON documents. However, the server returns its
|
192
191
|
# active serialized BSON document size limit in the ismaster response,
|
@@ -205,18 +204,45 @@ module Mongo
|
|
205
204
|
if message.bulk_write?
|
206
205
|
# Make the new maximum size equal to the specified reduced size
|
207
206
|
# limit plus the 16KiB overhead allowance.
|
208
|
-
max_bson_size = REDUCED_MAX_BSON_SIZE
|
207
|
+
max_bson_size = REDUCED_MAX_BSON_SIZE
|
209
208
|
end
|
210
|
-
else
|
211
|
-
max_bson_size += MAX_BSON_COMMAND_OVERHEAD
|
212
209
|
end
|
213
210
|
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
211
|
+
# RUBY-2234: It is necessary to check that the message size does not
|
212
|
+
# exceed the maximum bson object size before compressing and serializing
|
213
|
+
# the final message.
|
214
|
+
#
|
215
|
+
# This is to avoid the case where the user performs a bulk write
|
216
|
+
# larger than 16MiB which, when compressed, becomes smaller than 16MiB.
|
217
|
+
# If the driver does not split the bulk writes prior to compression,
|
218
|
+
# the entire operation will be sent to the server, which will raise an
|
219
|
+
# error because the uncompressed operation exceeds the maximum bson size.
|
220
|
+
#
|
221
|
+
# To address this problem, we serialize the message prior to compression
|
222
|
+
# and raise an exception if the serialized message exceeds the maximum
|
223
|
+
# bson size.
|
224
|
+
if max_message_size
|
225
|
+
# Create a separate buffer that contains the un-compressed message
|
226
|
+
# for the purpose of checking its size. Write any pre-existing contents
|
227
|
+
# from the original buffer into the temporary one.
|
228
|
+
temp_buffer = BSON::ByteBuffer.new
|
229
|
+
|
230
|
+
# TODO: address the fact that this line mutates the buffer.
|
231
|
+
temp_buffer.put_bytes(buffer.get_bytes(buffer.length))
|
232
|
+
|
233
|
+
message.serialize(temp_buffer, max_bson_size, MAX_BSON_COMMAND_OVERHEAD)
|
234
|
+
if temp_buffer.length > max_message_size
|
235
|
+
raise Error::MaxMessageSize.new(max_message_size)
|
236
|
+
end
|
219
237
|
end
|
238
|
+
|
239
|
+
# RUBY-2335: When the un-compressed message is smaller than the maximum
|
240
|
+
# bson size limit, the message will be serialized twice. The operations
|
241
|
+
# layer should be refactored to allow compression on an already-
|
242
|
+
# serialized message.
|
243
|
+
final_message = message.maybe_compress(compressor, options[:zlib_compression_level])
|
244
|
+
final_message.serialize(buffer, max_bson_size, MAX_BSON_COMMAND_OVERHEAD)
|
245
|
+
|
220
246
|
buffer
|
221
247
|
end
|
222
248
|
end
|
@@ -105,8 +105,8 @@ module Mongo
|
|
105
105
|
options.select { |k, v| k.to_s.start_with?('ssl') }
|
106
106
|
else
|
107
107
|
# Due to the way options are propagated from the client, if we
|
108
|
-
# decide that we don't want to use TLS we need to have the ssl
|
109
|
-
#
|
108
|
+
# decide that we don't want to use TLS we need to have the :ssl
|
109
|
+
# option explicitly set to false or the value provided to the
|
110
110
|
# connection might be overwritten by the default inherited from
|
111
111
|
# the client.
|
112
112
|
{ssl: false}
|
@@ -766,6 +766,9 @@ module Mongo
|
|
766
766
|
connection.disconnect!(reason: :error)
|
767
767
|
raise
|
768
768
|
end
|
769
|
+
rescue Error::SocketError, Error::SocketTimeoutError => exc
|
770
|
+
@server.unknown!(generation: exc.generation, stop_push_monitor: true)
|
771
|
+
raise
|
769
772
|
end
|
770
773
|
|
771
774
|
def check_invariants
|
@@ -182,13 +182,20 @@ module Mongo
|
|
182
182
|
# @since 2.5.0
|
183
183
|
LOGICAL_SESSION_TIMEOUT_MINUTES = 'logicalSessionTimeoutMinutes'.freeze
|
184
184
|
|
185
|
+
# Constant for reading connectionId info from config.
|
186
|
+
#
|
187
|
+
# @api private
|
188
|
+
CONNECTION_ID = 'connectionId'.freeze
|
189
|
+
|
185
190
|
# Fields to exclude when comparing two descriptions.
|
186
191
|
#
|
187
192
|
# @since 2.0.6
|
188
193
|
EXCLUDE_FOR_COMPARISON = [ LOCAL_TIME,
|
189
194
|
LAST_WRITE,
|
190
195
|
OPERATION_TIME,
|
191
|
-
Operation::CLUSTER_TIME
|
196
|
+
Operation::CLUSTER_TIME,
|
197
|
+
CONNECTION_ID,
|
198
|
+
].freeze
|
192
199
|
|
193
200
|
# Instantiate the new server description from the result of the ismaster
|
194
201
|
# command.
|
@@ -755,6 +762,11 @@ module Mongo
|
|
755
762
|
# @since 2.7.0
|
756
763
|
attr_reader :last_update_time
|
757
764
|
|
765
|
+
# @api experimental
|
766
|
+
def server_connection_id
|
767
|
+
config['connectionId']
|
768
|
+
end
|
769
|
+
|
758
770
|
# Check equality of two descriptions.
|
759
771
|
#
|
760
772
|
# @example Check description equality.
|
data/lib/mongo/server/monitor.rb
CHANGED
@@ -77,7 +77,9 @@ module Mongo
|
|
77
77
|
@monitoring = monitoring
|
78
78
|
@options = options.freeze
|
79
79
|
@mutex = Mutex.new
|
80
|
+
@sdam_mutex = Mutex.new
|
80
81
|
@next_earliest_scan = @next_wanted_scan = Time.now
|
82
|
+
@update_mutex = Mutex.new
|
81
83
|
end
|
82
84
|
|
83
85
|
# @return [ Server ] server The server that this monitor is monitoring.
|
@@ -109,6 +111,14 @@ module Mongo
|
|
109
111
|
# @return [ Monitoring ] monitoring The monitoring.
|
110
112
|
attr_reader :monitoring
|
111
113
|
|
114
|
+
# @return [ Server::PushMonitor | nil ] The push monitor, if one is being
|
115
|
+
# used.
|
116
|
+
def push_monitor
|
117
|
+
@update_mutex.synchronize do
|
118
|
+
@push_monitor
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
112
122
|
# Runs the server monitor. Refreshing happens on a separate thread per
|
113
123
|
# server.
|
114
124
|
#
|
@@ -120,9 +130,19 @@ module Mongo
|
|
120
130
|
# @since 2.0.0
|
121
131
|
def do_work
|
122
132
|
scan!
|
123
|
-
|
124
|
-
|
125
|
-
|
133
|
+
# @next_wanted_scan may be updated by the push monitor.
|
134
|
+
# However we need to check for termination flag so that the monitor
|
135
|
+
# thread exits when requested.
|
136
|
+
loop do
|
137
|
+
delta = @next_wanted_scan - Time.now
|
138
|
+
if delta > 0
|
139
|
+
signaled = server.scan_semaphore.wait(delta)
|
140
|
+
if signaled || @stop_requested
|
141
|
+
break
|
142
|
+
end
|
143
|
+
else
|
144
|
+
break
|
145
|
+
end
|
126
146
|
end
|
127
147
|
end
|
128
148
|
|
@@ -133,6 +153,8 @@ module Mongo
|
|
133
153
|
#
|
134
154
|
# @api public for backwards compatibility only
|
135
155
|
def stop!
|
156
|
+
stop_push_monitor!
|
157
|
+
|
136
158
|
# Forward super's return value
|
137
159
|
super.tap do
|
138
160
|
# Important: disconnect should happen after the background thread
|
@@ -141,6 +163,15 @@ module Mongo
|
|
141
163
|
end
|
142
164
|
end
|
143
165
|
|
166
|
+
def stop_push_monitor!
|
167
|
+
@update_mutex.synchronize do
|
168
|
+
if @push_monitor
|
169
|
+
@push_monitor.stop!
|
170
|
+
@push_monitor = nil
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
144
175
|
# Perform a check of the server with throttling, and update
|
145
176
|
# the server's description and average round trip time.
|
146
177
|
#
|
@@ -168,19 +199,27 @@ module Mongo
|
|
168
199
|
|
169
200
|
result = do_scan
|
170
201
|
|
202
|
+
run_sdam_flow(result)
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
def run_sdam_flow(result, awaited: false)
|
207
|
+
@sdam_mutex.synchronize do
|
171
208
|
old_description = server.description
|
172
209
|
|
173
210
|
new_description = Description.new(server.address, result,
|
174
211
|
server.round_trip_time_averager.average_round_trip_time)
|
175
212
|
|
176
|
-
server.cluster.run_sdam_flow(server.description, new_description)
|
213
|
+
server.cluster.run_sdam_flow(server.description, new_description, awaited: awaited)
|
177
214
|
|
178
215
|
server.description.tap do |new_description|
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
216
|
+
unless awaited
|
217
|
+
if new_description.unknown? && !old_description.unknown?
|
218
|
+
@next_earliest_scan = @next_wanted_scan = Time.now
|
219
|
+
else
|
220
|
+
@next_earliest_scan = Time.now + MIN_SCAN_INTERVAL
|
221
|
+
@next_wanted_scan = Time.now + heartbeat_interval
|
222
|
+
end
|
184
223
|
end
|
185
224
|
end
|
186
225
|
end
|
@@ -209,44 +248,19 @@ module Mongo
|
|
209
248
|
end
|
210
249
|
|
211
250
|
def do_scan
|
212
|
-
if monitoring.monitoring?
|
213
|
-
monitoring.started(
|
214
|
-
Monitoring::SERVER_HEARTBEAT,
|
215
|
-
Monitoring::Event::ServerHeartbeatStarted.new(server.address)
|
216
|
-
)
|
217
|
-
end
|
218
|
-
|
219
|
-
# The duration we publish in heartbeat succeeded/failed events is
|
220
|
-
# the time spent on the entire heartbeat. This could include time
|
221
|
-
# to connect the socket (including TLS handshake), not just time
|
222
|
-
# spent on ismaster call itself.
|
223
|
-
# The spec at https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring-monitoring.rst
|
224
|
-
# requires that the duration exposed here start from "sending the
|
225
|
-
# message" (ismaster). This requirement does not make sense if,
|
226
|
-
# for example, we were never able to connect to the server at all
|
227
|
-
# and thus ismaster was never sent.
|
228
|
-
start_time = Time.now
|
229
|
-
|
230
251
|
begin
|
231
|
-
|
232
|
-
|
233
|
-
log_warn("Error running ismaster on #{server.address}: #{exc.class}: #{exc}:\n#{exc.backtrace[0..5].join("\n")}")
|
234
|
-
if monitoring.monitoring?
|
235
|
-
monitoring.failed(
|
236
|
-
Monitoring::SERVER_HEARTBEAT,
|
237
|
-
Monitoring::Event::ServerHeartbeatFailed.new(server.address, Time.now-start_time, exc)
|
238
|
-
)
|
239
|
-
end
|
240
|
-
result = {}
|
241
|
-
else
|
242
|
-
if monitoring.monitoring?
|
243
|
-
monitoring.succeeded(
|
244
|
-
Monitoring::SERVER_HEARTBEAT,
|
245
|
-
Monitoring::Event::ServerHeartbeatSucceeded.new(server.address, Time.now-start_time)
|
246
|
-
)
|
252
|
+
monitoring.publish_heartbeat(server) do
|
253
|
+
ismaster
|
247
254
|
end
|
255
|
+
rescue => exc
|
256
|
+
msg = "Error running ismaster on #{server.address}"
|
257
|
+
Utils.warn_bg_exception(msg, exc,
|
258
|
+
logger: options[:logger],
|
259
|
+
log_prefix: options[:log_prefix],
|
260
|
+
bg_error_backtrace: options[:bg_error_backtrace],
|
261
|
+
)
|
262
|
+
{}
|
248
263
|
end
|
249
|
-
result
|
250
264
|
end
|
251
265
|
|
252
266
|
def ismaster
|
@@ -274,6 +288,24 @@ module Mongo
|
|
274
288
|
connection.handshake!
|
275
289
|
end
|
276
290
|
@connection = connection
|
291
|
+
if result['topologyVersion']
|
292
|
+
# Successful response, server 4.4+
|
293
|
+
@update_mutex.synchronize do
|
294
|
+
@push_monitor ||= PushMonitor.new(
|
295
|
+
self,
|
296
|
+
TopologyVersion.new(result['topologyVersion']),
|
297
|
+
monitoring,
|
298
|
+
**Utils.shallow_symbolize_keys(options.merge(
|
299
|
+
socket_timeout: heartbeat_interval + connection.socket_timeout,
|
300
|
+
)),
|
301
|
+
)
|
302
|
+
end
|
303
|
+
push_monitor.run!
|
304
|
+
else
|
305
|
+
# Failed response or pre-4.4 server
|
306
|
+
stop_push_monitor!
|
307
|
+
end
|
308
|
+
result
|
277
309
|
end
|
278
310
|
result
|
279
311
|
end
|
@@ -118,9 +118,11 @@ module Mongo
|
|
118
118
|
options[:connect_timeout] || Server::CONNECT_TIMEOUT
|
119
119
|
end
|
120
120
|
|
121
|
+
attr_reader :server_connection_id
|
122
|
+
|
121
123
|
# Sends a message and returns the result.
|
122
124
|
#
|
123
|
-
# @param [ Protocol::Message ] The message to send.
|
125
|
+
# @param [ Protocol::Message ] message The message to send.
|
124
126
|
#
|
125
127
|
# @return [ Protocol::Message ] The result.
|
126
128
|
def dispatch(message)
|
@@ -129,17 +131,45 @@ module Mongo
|
|
129
131
|
|
130
132
|
# Sends a preserialized message and returns the result.
|
131
133
|
#
|
132
|
-
# @param [ String ] The serialized message to send.
|
134
|
+
# @param [ String ] bytes The serialized message to send.
|
135
|
+
#
|
136
|
+
# @option opts [ Numeric ] :read_socket_timeout The timeout to use for
|
137
|
+
# each read operation.
|
133
138
|
#
|
134
139
|
# @return [ Protocol::Message ] The result.
|
135
|
-
def dispatch_bytes(bytes)
|
140
|
+
def dispatch_bytes(bytes, **opts)
|
141
|
+
write_bytes(bytes)
|
142
|
+
read_response(
|
143
|
+
socket_timeout: opts[:read_socket_timeout],
|
144
|
+
)
|
145
|
+
end
|
146
|
+
|
147
|
+
def write_bytes(bytes)
|
136
148
|
unless connected?
|
137
149
|
raise ArgumentError, "Trying to dispatch on an unconnected connection #{self}"
|
138
150
|
end
|
139
151
|
|
140
|
-
|
141
|
-
|
142
|
-
|
152
|
+
add_server_connection_id do
|
153
|
+
add_server_diagnostics do
|
154
|
+
socket.write(bytes)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
# @option opts [ Numeric ] :socket_timeout The timeout to use for
|
160
|
+
# each read operation.
|
161
|
+
def read_response(**opts)
|
162
|
+
unless connected?
|
163
|
+
raise ArgumentError, "Trying to read on an unconnected connection #{self}"
|
164
|
+
end
|
165
|
+
|
166
|
+
add_server_connection_id do
|
167
|
+
add_server_diagnostics do
|
168
|
+
Protocol::Message.deserialize(socket,
|
169
|
+
Protocol::Message::MAX_MESSAGE_SIZE,
|
170
|
+
nil,
|
171
|
+
**opts)
|
172
|
+
end
|
143
173
|
end
|
144
174
|
end
|
145
175
|
|
@@ -184,7 +214,7 @@ module Mongo
|
|
184
214
|
# @since 2.0.0
|
185
215
|
def disconnect!(options = nil)
|
186
216
|
if socket
|
187
|
-
socket.close
|
217
|
+
socket.close rescue nil
|
188
218
|
@socket = nil
|
189
219
|
end
|
190
220
|
true
|
@@ -200,11 +230,29 @@ module Mongo
|
|
200
230
|
message = dispatch_bytes(payload)
|
201
231
|
reply = message.documents.first
|
202
232
|
set_compressor!(reply)
|
233
|
+
@server_connection_id = reply['connectionId']
|
203
234
|
reply
|
204
|
-
rescue =>
|
205
|
-
|
235
|
+
rescue => exc
|
236
|
+
msg = "Failed to handshake with #{address}"
|
237
|
+
Utils.warn_bg_exception(msg, exc,
|
238
|
+
logger: options[:logger],
|
239
|
+
log_prefix: options[:log_prefix],
|
240
|
+
bg_error_backtrace: options[:bg_error_backtrace],
|
241
|
+
)
|
206
242
|
raise
|
207
243
|
end
|
244
|
+
|
245
|
+
private
|
246
|
+
|
247
|
+
def add_server_connection_id
|
248
|
+
yield
|
249
|
+
rescue Mongo::Error => e
|
250
|
+
if server_connection_id
|
251
|
+
note = "sconn:#{server_connection_id}"
|
252
|
+
e.add_note(note)
|
253
|
+
end
|
254
|
+
raise e
|
255
|
+
end
|
208
256
|
end
|
209
257
|
end
|
210
258
|
end
|
@@ -116,8 +116,13 @@ module Mongo
|
|
116
116
|
Protocol::Message.deserialize(socket, Protocol::Message::MAX_MESSAGE_SIZE).documents.first
|
117
117
|
end
|
118
118
|
end
|
119
|
-
rescue =>
|
120
|
-
|
119
|
+
rescue => exc
|
120
|
+
msg = "Failed to handshake with #{address}"
|
121
|
+
Utils.warn_bg_exception(msg, exc,
|
122
|
+
logger: options[:logger],
|
123
|
+
log_prefix: options[:log_prefix],
|
124
|
+
bg_error_backtrace: options[:bg_error_backtrace],
|
125
|
+
)
|
121
126
|
raise
|
122
127
|
end
|
123
128
|
end
|
@@ -151,8 +156,13 @@ module Mongo
|
|
151
156
|
speculative_auth_result: speculative_auth_result,
|
152
157
|
)
|
153
158
|
auth.login
|
154
|
-
rescue =>
|
155
|
-
|
159
|
+
rescue => exc
|
160
|
+
msg = "Failed to authenticate to #{address}"
|
161
|
+
Utils.warn_bg_exception(msg, exc,
|
162
|
+
logger: options[:logger],
|
163
|
+
log_prefix: options[:log_prefix],
|
164
|
+
bg_error_backtrace: options[:bg_error_backtrace],
|
165
|
+
)
|
156
166
|
raise
|
157
167
|
end
|
158
168
|
end
|