mongo 2.4.3 → 2.5.0.beta
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 +3 -2
- data.tar.gz.sig +0 -0
- data/lib/mongo.rb +3 -2
- data/lib/mongo/auth/cr.rb +6 -4
- data/lib/mongo/auth/cr/conversation.rb +33 -17
- data/lib/mongo/auth/ldap.rb +4 -2
- data/lib/mongo/auth/ldap/conversation.rb +19 -9
- data/lib/mongo/auth/scram.rb +7 -4
- data/lib/mongo/auth/scram/conversation.rb +62 -24
- data/lib/mongo/auth/user.rb +10 -0
- data/lib/mongo/auth/user/view.rb +44 -22
- data/lib/mongo/auth/x509.rb +4 -2
- data/lib/mongo/auth/x509/conversation.rb +19 -9
- data/lib/mongo/bulk_write.rb +33 -27
- data/lib/mongo/bulk_write/combineable.rb +5 -0
- data/lib/mongo/bulk_write/transformable.rb +2 -0
- data/lib/mongo/bulk_write/validatable.rb +4 -0
- data/lib/mongo/client.rb +123 -12
- data/lib/mongo/cluster.rb +52 -11
- data/lib/mongo/cluster/app_metadata.rb +8 -2
- data/lib/mongo/cluster/cursor_reaper.rb +0 -1
- data/lib/mongo/cluster/topology.rb +1 -1
- data/lib/mongo/collection.rb +114 -27
- data/lib/mongo/collection/view.rb +8 -2
- data/lib/mongo/collection/view/aggregation.rb +11 -7
- data/lib/mongo/collection/view/builder/aggregation.rb +5 -1
- data/lib/mongo/collection/view/builder/find_command.rb +5 -3
- data/lib/mongo/collection/view/builder/map_reduce.rb +11 -3
- data/lib/mongo/collection/view/builder/op_query.rb +1 -1
- data/lib/mongo/collection/view/change_stream.rb +160 -0
- data/lib/mongo/collection/view/change_stream/retryable.rb +57 -0
- data/lib/mongo/collection/view/iterable.rb +11 -10
- data/lib/mongo/collection/view/map_reduce.rb +22 -18
- data/lib/mongo/collection/view/readable.rb +51 -37
- data/lib/mongo/collection/view/writable.rb +72 -40
- data/lib/mongo/cursor.rb +25 -4
- data/lib/mongo/cursor/builder/get_more_command.rb +4 -2
- data/lib/mongo/database.rb +22 -11
- data/lib/mongo/database/view.rb +16 -12
- data/lib/mongo/error.rb +5 -0
- data/lib/mongo/error/invalid_session.rb +36 -0
- data/lib/mongo/error/missing_resume_token.rb +39 -0
- data/lib/mongo/error/operation_failure.rb +17 -0
- data/lib/mongo/error/parser.rb +3 -2
- data/lib/mongo/error/unknown_payload_type.rb +41 -0
- data/lib/mongo/error/unsupported_array_filters.rb +51 -0
- data/lib/mongo/error/unsupported_message_type.rb +23 -0
- data/lib/mongo/grid/fs_bucket.rb +5 -4
- data/lib/mongo/grid/stream/read.rb +3 -2
- data/lib/mongo/grid/stream/write.rb +2 -2
- data/lib/mongo/index/view.rb +35 -25
- data/lib/mongo/monitoring/event/secure.rb +14 -0
- data/lib/mongo/operation.rb +16 -0
- data/lib/mongo/operation/commands.rb +1 -0
- data/lib/mongo/operation/commands/aggregate.rb +9 -5
- data/lib/mongo/operation/commands/aggregate/result.rb +1 -1
- data/lib/mongo/operation/commands/collections_info.rb +6 -6
- data/lib/mongo/operation/commands/command.rb +2 -1
- data/lib/mongo/operation/commands/create.rb +6 -2
- data/lib/mongo/operation/commands/drop.rb +6 -2
- data/lib/mongo/operation/commands/drop_database.rb +6 -2
- data/lib/mongo/operation/commands/explain.rb +27 -0
- data/lib/mongo/operation/commands/explain/result.rb +52 -0
- data/lib/mongo/operation/commands/indexes.rb +1 -1
- data/lib/mongo/operation/commands/list_collections.rb +1 -1
- data/lib/mongo/operation/commands/list_collections/result.rb +1 -1
- data/lib/mongo/operation/commands/list_indexes.rb +1 -1
- data/lib/mongo/operation/commands/list_indexes/result.rb +1 -1
- data/lib/mongo/operation/commands/map_reduce.rb +8 -4
- data/lib/mongo/operation/commands/map_reduce/result.rb +13 -1
- data/lib/mongo/operation/commands/user_query.rb +1 -1
- data/lib/mongo/operation/commands/users_info.rb +6 -2
- data/lib/mongo/operation/executable.rb +4 -1
- data/lib/mongo/operation/read_preference.rb +10 -5
- data/lib/mongo/operation/result.rb +26 -2
- data/lib/mongo/operation/specifiable.rb +13 -1
- data/lib/mongo/operation/uses_command_op_msg.rb +47 -0
- data/lib/mongo/operation/write/bulk/bulkable.rb +4 -1
- data/lib/mongo/operation/write/bulk/insert/result.rb +4 -4
- data/lib/mongo/operation/write/command/create_index.rb +6 -1
- data/lib/mongo/operation/write/command/delete.rb +28 -4
- data/lib/mongo/operation/write/command/drop_index.rb +6 -1
- data/lib/mongo/operation/write/command/insert.rb +22 -18
- data/lib/mongo/operation/write/command/update.rb +24 -9
- data/lib/mongo/operation/write/command/writable.rb +14 -1
- data/lib/mongo/operation/write/insert.rb +4 -1
- data/lib/mongo/operation/write/insert/result.rb +2 -2
- data/lib/mongo/operation/write/update.rb +7 -1
- data/lib/mongo/operation/write/write_command_enabled.rb +20 -3
- data/lib/mongo/protocol.rb +3 -0
- data/lib/mongo/protocol/bit_vector.rb +2 -2
- data/lib/mongo/protocol/compressed.rb +135 -0
- data/lib/mongo/protocol/delete.rb +8 -6
- data/lib/mongo/protocol/get_more.rb +8 -6
- data/lib/mongo/protocol/insert.rb +8 -6
- data/lib/mongo/protocol/kill_cursors.rb +8 -6
- data/lib/mongo/protocol/message.rb +31 -3
- data/lib/mongo/protocol/msg.rb +172 -0
- data/lib/mongo/protocol/query.rb +26 -6
- data/lib/mongo/protocol/registry.rb +76 -0
- data/lib/mongo/protocol/reply.rb +10 -5
- data/lib/mongo/protocol/serializers.rb +224 -0
- data/lib/mongo/protocol/update.rb +8 -6
- data/lib/mongo/retryable.rb +4 -2
- data/lib/mongo/server.rb +6 -3
- data/lib/mongo/server/connectable.rb +1 -1
- data/lib/mongo/server/connection.rb +30 -8
- data/lib/mongo/server/description.rb +25 -1
- data/lib/mongo/server/description/features.rb +4 -1
- data/lib/mongo/server/monitor.rb +5 -0
- data/lib/mongo/server/monitor/connection.rb +50 -2
- data/lib/mongo/server_selector/nearest.rb +10 -4
- data/lib/mongo/server_selector/primary.rb +20 -0
- data/lib/mongo/server_selector/primary_preferred.rb +10 -4
- data/lib/mongo/server_selector/secondary.rb +10 -4
- data/lib/mongo/server_selector/secondary_preferred.rb +24 -4
- data/lib/mongo/session.rb +180 -0
- data/lib/mongo/session/server_session.rb +73 -0
- data/lib/mongo/session/session_pool.rb +161 -0
- data/lib/mongo/uri.rb +11 -0
- data/lib/mongo/version.rb +1 -1
- data/mongo.gemspec +2 -1
- data/spec/mongo/auth/cr_spec.rb +12 -0
- data/spec/mongo/auth/ldap_spec.rb +2 -0
- data/spec/mongo/auth/scram/conversation_spec.rb +6 -6
- data/spec/mongo/auth/scram_spec.rb +25 -1
- data/spec/mongo/auth/user/view_spec.rb +268 -76
- data/spec/mongo/auth/x509_spec.rb +2 -0
- data/spec/mongo/bulk_write_spec.rb +435 -5
- data/spec/mongo/client_spec.rb +356 -39
- data/spec/mongo/cluster/app_metadata_spec.rb +2 -2
- data/spec/mongo/cluster_spec.rb +176 -0
- data/spec/mongo/collection/view/aggregation_spec.rb +33 -12
- data/spec/mongo/collection/view/builder/find_command_spec.rb +46 -6
- data/spec/mongo/collection/view/change_stream_spec.rb +814 -0
- data/spec/mongo/collection/view/map_reduce_spec.rb +94 -17
- data/spec/mongo/collection/view/readable_spec.rb +3 -12
- data/spec/mongo/collection_spec.rb +1048 -42
- data/spec/mongo/cursor/builder/get_more_command_spec.rb +19 -0
- data/spec/mongo/cursor_spec.rb +2 -2
- data/spec/mongo/database_spec.rb +50 -1
- data/spec/mongo/grid/fs_bucket_spec.rb +225 -137
- data/spec/mongo/grid/stream/read_spec.rb +2 -2
- data/spec/mongo/index/view_spec.rb +146 -8
- data/spec/mongo/monitoring/event/secure_spec.rb +42 -0
- data/spec/mongo/operation/read/query_spec.rb +2 -1
- data/spec/mongo/operation/specifiable_spec.rb +2 -2
- data/spec/mongo/operation/write/command/delete_spec.rb +96 -13
- data/spec/mongo/operation/write/command/insert_spec.rb +111 -12
- data/spec/mongo/operation/write/command/update_spec.rb +93 -10
- data/spec/mongo/operation/write/delete_spec.rb +1 -1
- data/spec/mongo/operation/write/insert_spec.rb +1 -1
- data/spec/mongo/operation/write/update_spec.rb +1 -1
- data/spec/mongo/protocol/compressed_spec.rb +66 -0
- data/spec/mongo/protocol/delete_spec.rb +14 -0
- data/spec/mongo/protocol/get_more_spec.rb +14 -0
- data/spec/mongo/protocol/insert_spec.rb +14 -0
- data/spec/mongo/protocol/kill_cursors_spec.rb +14 -0
- data/spec/mongo/protocol/msg_spec.rb +499 -0
- data/spec/mongo/protocol/query_spec.rb +45 -0
- data/spec/mongo/protocol/registry_spec.rb +31 -0
- data/spec/mongo/protocol/reply_spec.rb +14 -0
- data/spec/mongo/protocol/update_spec.rb +14 -0
- data/spec/mongo/retryable_spec.rb +6 -2
- data/spec/mongo/sdam_spec.rb +4 -0
- data/spec/mongo/server/connection_spec.rb +4 -2
- data/spec/mongo/server/description_spec.rb +28 -1
- data/spec/mongo/session/server_session_spec.rb +16 -0
- data/spec/mongo/session/session_pool_spec.rb +194 -0
- data/spec/mongo/uri_spec.rb +31 -2
- data/spec/spec_helper.rb +104 -0
- data/spec/support/authorization.rb +6 -1
- data/spec/support/crud.rb +3 -1
- data/spec/support/crud/write.rb +6 -1
- data/spec/support/crud_tests/write/findOneAndUpdate-arrayFilters.yml +69 -0
- data/spec/support/crud_tests/write/updateMany-arrayFilters.yml +63 -0
- data/spec/support/crud_tests/write/updateOne-arrayFilters.yml +109 -0
- data/spec/support/sdam/rs/discover_arbiters.yml +1 -1
- data/spec/support/sdam/rs/discover_passives.yml +2 -2
- data/spec/support/sdam/rs/discover_primary.yml +1 -1
- data/spec/support/sdam/rs/discover_secondary.yml +1 -1
- data/spec/support/sdam/rs/discovery.yml +4 -4
- data/spec/support/sdam/rs/equal_electionids.yml +1 -0
- data/spec/support/sdam/rs/ghost_discovered.yml +1 -1
- data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +1 -1
- data/spec/support/sdam/rs/ls_timeout.yml +88 -0
- data/spec/support/sdam/rs/member_reconfig.yml +2 -2
- data/spec/support/sdam/rs/member_standalone.yml +2 -2
- data/spec/support/sdam/rs/new_primary.yml +2 -2
- data/spec/support/sdam/rs/new_primary_new_electionid.yml +3 -0
- data/spec/support/sdam/rs/new_primary_new_setversion.yml +3 -0
- data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +2 -2
- data/spec/support/sdam/rs/non_rs_member.yml +1 -1
- data/spec/support/sdam/rs/normalize_case.yml +1 -1
- data/spec/support/sdam/rs/null_election_id.yml +4 -0
- data/spec/support/sdam/rs/primary_becomes_standalone.yml +2 -2
- data/spec/support/sdam/rs/primary_changes_set_name.yml +2 -2
- data/spec/support/sdam/rs/primary_disconnect.yml +2 -2
- data/spec/support/sdam/rs/primary_disconnect_electionid.yml +5 -0
- data/spec/support/sdam/rs/primary_disconnect_setversion.yml +5 -0
- data/spec/support/sdam/rs/primary_hint_from_secondary_with_mismatched_me.yml +58 -0
- data/spec/support/sdam/rs/primary_reports_new_member.yml +4 -4
- data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +2 -2
- data/spec/support/sdam/rs/primary_wrong_set_name.yml +1 -1
- data/spec/support/sdam/rs/response_from_removed.yml +2 -2
- data/spec/support/sdam/rs/rsother_discovered.yml +1 -1
- data/spec/support/sdam/rs/sec_not_auth.yml +1 -1
- data/spec/support/sdam/rs/secondary_wrong_set_name.yml +1 -1
- data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +2 -2
- data/spec/support/sdam/rs/setversion_without_electionid.yml +2 -0
- data/spec/support/sdam/rs/stepdown_change_set_name.yml +2 -2
- data/spec/support/sdam/rs/unexpected_mongos.yml +1 -1
- data/spec/support/sdam/rs/use_setversion_without_electionid.yml +3 -0
- data/spec/support/sdam/rs/wrong_set_name.yml +1 -1
- data/spec/support/sdam/sharded/ls_timeout_mongos.yml +97 -0
- data/spec/support/sdam/sharded/mongos_disconnect.yml +3 -3
- data/spec/support/sdam/sharded/multiple_mongoses.yml +1 -1
- data/spec/support/sdam/sharded/non_mongos_removed.yml +1 -1
- data/spec/support/sdam/sharded/normalize_uri_case.yml +1 -1
- data/spec/support/sdam/single/direct_connection_external_ip.yml +1 -1
- data/spec/support/sdam/single/direct_connection_mongos.yml +1 -1
- data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
- data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
- data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
- data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
- data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
- data/spec/support/sdam/single/ls_timeout_standalone.yml +35 -0
- data/spec/support/sdam/single/not_ok_response.yml +1 -1
- data/spec/support/sdam/single/standalone_removed.yml +1 -1
- data/spec/support/sdam/single/unavailable_seed.yml +1 -1
- data/spec/support/server_discovery_and_monitoring.rb +4 -0
- data/spec/support/shared/session.rb +236 -0
- metadata +53 -15
- metadata.gz.sig +0 -0
@@ -154,10 +154,22 @@ module Mongo
|
|
154
154
|
# @since 2.1.0
|
155
155
|
LOCAL_TIME = 'localTime'.freeze
|
156
156
|
|
157
|
+
# Constant for reading operationTime info from config.
|
158
|
+
#
|
159
|
+
# @since 2.5.0
|
160
|
+
OPERATION_TIME = 'operationTime'.freeze
|
161
|
+
|
162
|
+
# Constant for reading logicalSessionTimeoutMinutes info from config.
|
163
|
+
#
|
164
|
+
# @since 2.5.0
|
165
|
+
LOGICAL_SESSION_TIMEOUT_MINUTES = 'logicalSessionTimeoutMinutes'.freeze
|
166
|
+
|
157
167
|
# Fields to exclude when comparing two descriptions.
|
158
168
|
#
|
159
169
|
# @since 2.0.6
|
160
|
-
EXCLUDE_FOR_COMPARISON = [ LOCAL_TIME,
|
170
|
+
EXCLUDE_FOR_COMPARISON = [ LOCAL_TIME,
|
171
|
+
LAST_WRITE,
|
172
|
+
OPERATION_TIME ].freeze
|
161
173
|
|
162
174
|
# @return [ Address ] address The server's address.
|
163
175
|
attr_reader :address
|
@@ -382,6 +394,18 @@ module Mongo
|
|
382
394
|
config[LAST_WRITE][LAST_WRITE_DATE] if config[LAST_WRITE]
|
383
395
|
end
|
384
396
|
|
397
|
+
# Get the logicalSessionTimeoutMinutes from the config.
|
398
|
+
#
|
399
|
+
# @example Get the logicalSessionTimeoutMinutes value in minutes.
|
400
|
+
# description.logical_session_timeout
|
401
|
+
#
|
402
|
+
# @return [ Integer, nil ] The logical session timeout in minutes.
|
403
|
+
#
|
404
|
+
# @since 2.5.0
|
405
|
+
def logical_session_timeout
|
406
|
+
config[LOGICAL_SESSION_TIMEOUT_MINUTES] if config[LOGICAL_SESSION_TIMEOUT_MINUTES]
|
407
|
+
end
|
408
|
+
|
385
409
|
# Is the server a mongos?
|
386
410
|
#
|
387
411
|
# @example Is the server a mongos?
|
@@ -25,6 +25,9 @@ module Mongo
|
|
25
25
|
#
|
26
26
|
# @since 2.0.0
|
27
27
|
MAPPINGS = {
|
28
|
+
:array_filters => 6,
|
29
|
+
:op_msg => 6,
|
30
|
+
:sessions => 6,
|
28
31
|
:collation => 5,
|
29
32
|
:max_staleness => 5,
|
30
33
|
:find_command => 4,
|
@@ -38,7 +41,7 @@ module Mongo
|
|
38
41
|
# The wire protocol versions that this version of the driver supports.
|
39
42
|
#
|
40
43
|
# @since 2.0.0
|
41
|
-
DRIVER_WIRE_VERSIONS = (0..
|
44
|
+
DRIVER_WIRE_VERSIONS = (0..6).freeze
|
42
45
|
|
43
46
|
# Create the methods for each mapping to tell if they are supported.
|
44
47
|
#
|
data/lib/mongo/server/monitor.rb
CHANGED
@@ -23,6 +23,7 @@ module Mongo
|
|
23
23
|
# @since 2.0.0
|
24
24
|
class Monitor
|
25
25
|
include Loggable
|
26
|
+
extend Forwardable
|
26
27
|
|
27
28
|
# The default time for a server to refresh its status is 10 seconds.
|
28
29
|
#
|
@@ -58,6 +59,10 @@ module Mongo
|
|
58
59
|
# @since 2.4.0
|
59
60
|
attr_reader :last_scan
|
60
61
|
|
62
|
+
# The compressor is determined during the handshake, so it must be an attribute
|
63
|
+
# of the connection.
|
64
|
+
def_delegators :connection, :compressor
|
65
|
+
|
61
66
|
# Force the monitor to immediately do a check of its server.
|
62
67
|
#
|
63
68
|
# @example Force a scan.
|
@@ -22,22 +22,38 @@ module Mongo
|
|
22
22
|
class Connection
|
23
23
|
include Retryable
|
24
24
|
include Connectable
|
25
|
+
include Loggable
|
25
26
|
|
26
27
|
# The command used for determining server status.
|
27
28
|
#
|
28
29
|
# @since 2.2.0
|
29
30
|
ISMASTER = { :ismaster => 1 }.freeze
|
30
31
|
|
32
|
+
# The command used for determining server status formatted for an OP_MSG (server versions >= 3.6).
|
33
|
+
#
|
34
|
+
# @since 2.5.0
|
35
|
+
ISMASTER_OP_MSG = { :ismaster => 1, '$db' => Database::ADMIN }.freeze
|
36
|
+
|
31
37
|
# The constant for the ismaster command.
|
32
38
|
#
|
33
39
|
# @since 2.2.0
|
34
40
|
ISMASTER_MESSAGE = Protocol::Query.new(Database::ADMIN, Database::COMMAND, ISMASTER, :limit => -1)
|
35
41
|
|
42
|
+
# The constant for the ismaster command as an OP_MSG (server versions >= 3.6).
|
43
|
+
#
|
44
|
+
# @since 2.5.0
|
45
|
+
ISMASTER_OP_MSG_MESSAGE = Protocol::Msg.new([:none], {}, ISMASTER_OP_MSG)
|
46
|
+
|
36
47
|
# The raw bytes for the ismaster message.
|
37
48
|
#
|
38
49
|
# @since 2.2.0
|
39
50
|
ISMASTER_BYTES = ISMASTER_MESSAGE.serialize.to_s.freeze
|
40
51
|
|
52
|
+
# The raw bytes for the ismaster OP_MSG message (server versions >= 3.6).
|
53
|
+
#
|
54
|
+
# @since 2.5.0
|
55
|
+
ISMASTER_OP_MSG_BYTES = ISMASTER_OP_MSG_MESSAGE.serialize.to_s.freeze
|
56
|
+
|
41
57
|
# The default time in seconds to timeout a connection attempt.
|
42
58
|
#
|
43
59
|
# @since 2.1.2
|
@@ -45,6 +61,23 @@ module Mongo
|
|
45
61
|
# @deprecated Please use Server::CONNECT_TIMEOUT instead. Will be removed in 3.0.0
|
46
62
|
CONNECT_TIMEOUT = 10.freeze
|
47
63
|
|
64
|
+
# Key for compression algorithms in the response from the server during handshake.
|
65
|
+
#
|
66
|
+
# @since 2.5.0
|
67
|
+
COMPRESSION = 'compression'.freeze
|
68
|
+
|
69
|
+
# Warning message that the server has no compression algorithms in common with those requested
|
70
|
+
# by the client.
|
71
|
+
#
|
72
|
+
# @since 2.5.0
|
73
|
+
COMPRESSION_WARNING = 'The server has no compression algorithms in common with those requested. ' +
|
74
|
+
'Compression will not be used.'.freeze
|
75
|
+
|
76
|
+
# The compressor, which is determined during the handshake.
|
77
|
+
#
|
78
|
+
# @since 2.5.0
|
79
|
+
attr_reader :compressor
|
80
|
+
|
48
81
|
# Send the preserialized ismaster call.
|
49
82
|
#
|
50
83
|
# @example Send a preserialized ismaster message.
|
@@ -57,7 +90,7 @@ module Mongo
|
|
57
90
|
ensure_connected do |socket|
|
58
91
|
read_with_one_retry do
|
59
92
|
socket.write(ISMASTER_BYTES)
|
60
|
-
Protocol::
|
93
|
+
Protocol::Message.deserialize(socket).documents[0]
|
61
94
|
end
|
62
95
|
end
|
63
96
|
end
|
@@ -122,6 +155,7 @@ module Mongo
|
|
122
155
|
@ssl_options = options.reject { |k, v| !k.to_s.start_with?(SSL) }
|
123
156
|
@socket = nil
|
124
157
|
@pid = Process.pid
|
158
|
+
@compressor = nil
|
125
159
|
end
|
126
160
|
|
127
161
|
# Get the socket timeout.
|
@@ -142,10 +176,24 @@ module Mongo
|
|
142
176
|
|
143
177
|
private
|
144
178
|
|
179
|
+
def set_compressor!(reply)
|
180
|
+
server_compressors = reply[COMPRESSION]
|
181
|
+
|
182
|
+
if options[:compressors]
|
183
|
+
if intersection = (server_compressors & options[:compressors])
|
184
|
+
@compressor = intersection[0]
|
185
|
+
else
|
186
|
+
log_warn(COMPRESSION_WARNING)
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
145
191
|
def handshake!
|
146
192
|
if @app_metadata
|
147
193
|
socket.write(@app_metadata.ismaster_bytes)
|
148
|
-
Protocol::
|
194
|
+
reply = Protocol::Message.deserialize(socket, Mongo::Protocol::Message::MAX_MESSAGE_SIZE).documents[0]
|
195
|
+
set_compressor!(reply)
|
196
|
+
reply
|
149
197
|
end
|
150
198
|
end
|
151
199
|
end
|
@@ -22,6 +22,11 @@ module Mongo
|
|
22
22
|
class Nearest
|
23
23
|
include Selectable
|
24
24
|
|
25
|
+
# Name of the this read preference in the server's format.
|
26
|
+
#
|
27
|
+
# @since 2.5.0
|
28
|
+
SERVER_FORMATTED_NAME = 'nearest'.freeze
|
29
|
+
|
25
30
|
# Get the name of the server mode type.
|
26
31
|
#
|
27
32
|
# @example Get the name of the server mode for this preference.
|
@@ -65,11 +70,12 @@ module Mongo
|
|
65
70
|
#
|
66
71
|
# @since 2.0.0
|
67
72
|
def to_mongos
|
68
|
-
preference = { :mode =>
|
69
|
-
|
70
|
-
|
71
|
-
|
73
|
+
@doc ||= (preference = { :mode => SERVER_FORMATTED_NAME }
|
74
|
+
preference.merge!({ :tags => tag_sets }) unless tag_sets.empty?
|
75
|
+
preference.merge!({ maxStalenessSeconds: max_staleness }) if max_staleness
|
76
|
+
preference)
|
72
77
|
end
|
78
|
+
alias :to_doc :to_mongos
|
73
79
|
|
74
80
|
private
|
75
81
|
|
@@ -23,6 +23,11 @@ module Mongo
|
|
23
23
|
class Primary
|
24
24
|
include Selectable
|
25
25
|
|
26
|
+
# Name of the this read preference in the server's format.
|
27
|
+
#
|
28
|
+
# @since 2.5.0
|
29
|
+
SERVER_FORMATTED_NAME = 'primary'.freeze
|
30
|
+
|
26
31
|
# Get the name of the server mode type.
|
27
32
|
#
|
28
33
|
# @example Get the name of the server mode for this preference.
|
@@ -69,6 +74,21 @@ module Mongo
|
|
69
74
|
nil
|
70
75
|
end
|
71
76
|
|
77
|
+
# Convert this server preference definition into a format appropriate
|
78
|
+
# for a mongodb server.
|
79
|
+
#
|
80
|
+
# @example Convert this server preference definition into a format
|
81
|
+
# for a server.
|
82
|
+
# preference = Mongo::ServerSelector::Primary.new
|
83
|
+
# preference.to_doc
|
84
|
+
#
|
85
|
+
# @return [ Hash ] The server preference formatted for a mongodb server.
|
86
|
+
#
|
87
|
+
# @since 2.5.0
|
88
|
+
def to_doc
|
89
|
+
@doc ||= { mode: SERVER_FORMATTED_NAME }
|
90
|
+
end
|
91
|
+
|
72
92
|
private
|
73
93
|
|
74
94
|
# Select the primary server from a list of candidates.
|
@@ -23,6 +23,11 @@ module Mongo
|
|
23
23
|
class PrimaryPreferred
|
24
24
|
include Selectable
|
25
25
|
|
26
|
+
# Name of the this read preference in the server's format.
|
27
|
+
#
|
28
|
+
# @since 2.5.0
|
29
|
+
SERVER_FORMATTED_NAME = 'primaryPreferred'.freeze
|
30
|
+
|
26
31
|
# Get the name of the server mode type.
|
27
32
|
#
|
28
33
|
# @example Get the name of the server mode for this preference.
|
@@ -66,11 +71,12 @@ module Mongo
|
|
66
71
|
#
|
67
72
|
# @since 2.0.0
|
68
73
|
def to_mongos
|
69
|
-
preference = { :mode =>
|
70
|
-
|
71
|
-
|
72
|
-
|
74
|
+
@doc ||= (preference = { :mode => SERVER_FORMATTED_NAME }
|
75
|
+
preference.merge!({ :tags => tag_sets }) unless tag_sets.empty?
|
76
|
+
preference.merge!({ maxStalenessSeconds: max_staleness }) if max_staleness
|
77
|
+
preference)
|
73
78
|
end
|
79
|
+
alias :to_doc :to_mongos
|
74
80
|
|
75
81
|
private
|
76
82
|
|
@@ -23,6 +23,11 @@ module Mongo
|
|
23
23
|
class Secondary
|
24
24
|
include Selectable
|
25
25
|
|
26
|
+
# Name of the this read preference in the server's format.
|
27
|
+
#
|
28
|
+
# @since 2.5.0
|
29
|
+
SERVER_FORMATTED_NAME = 'secondary'.freeze
|
30
|
+
|
26
31
|
# Get the name of the server mode type.
|
27
32
|
#
|
28
33
|
# @example Get the name of the server mode for this preference.
|
@@ -66,11 +71,12 @@ module Mongo
|
|
66
71
|
#
|
67
72
|
# @since 2.0.0
|
68
73
|
def to_mongos
|
69
|
-
preference = { :mode =>
|
70
|
-
|
71
|
-
|
72
|
-
|
74
|
+
@doc ||= (preference = { :mode => SERVER_FORMATTED_NAME }
|
75
|
+
preference.merge!({ :tags => tag_sets }) unless tag_sets.empty?
|
76
|
+
preference.merge!({ maxStalenessSeconds: max_staleness }) if max_staleness
|
77
|
+
preference)
|
73
78
|
end
|
79
|
+
alias :to_doc :to_mongos
|
74
80
|
|
75
81
|
private
|
76
82
|
|
@@ -23,6 +23,11 @@ module Mongo
|
|
23
23
|
class SecondaryPreferred
|
24
24
|
include Selectable
|
25
25
|
|
26
|
+
# Name of the this read preference in the server's format.
|
27
|
+
#
|
28
|
+
# @since 2.5.0
|
29
|
+
SERVER_FORMATTED_NAME = 'secondaryPreferred'.freeze
|
30
|
+
|
26
31
|
# Get the name of the server mode type.
|
27
32
|
#
|
28
33
|
# @example Get the name of the server mode for this preference.
|
@@ -69,10 +74,25 @@ module Mongo
|
|
69
74
|
# @since 2.0.0
|
70
75
|
def to_mongos
|
71
76
|
return nil if tag_sets.empty? && max_staleness.nil?
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
77
|
+
to_doc
|
78
|
+
end
|
79
|
+
|
80
|
+
# Convert this server preference definition into a format appropriate
|
81
|
+
# for a server.
|
82
|
+
#
|
83
|
+
# @example Convert this server preference definition into a format
|
84
|
+
# for a server.
|
85
|
+
# preference = Mongo::ServerSelector::SecondaryPreferred.new
|
86
|
+
# preference.to_doc
|
87
|
+
#
|
88
|
+
# @return [ Hash ] The server preference formatted for a server.
|
89
|
+
#
|
90
|
+
# @since 2.5.0
|
91
|
+
def to_doc
|
92
|
+
@doc ||= (preference = { mode: SERVER_FORMATTED_NAME }
|
93
|
+
preference.merge!({ tags: tag_sets }) unless tag_sets.empty?
|
94
|
+
preference.merge!({ maxStalenessSeconds: max_staleness }) if max_staleness
|
95
|
+
preference)
|
76
96
|
end
|
77
97
|
|
78
98
|
private
|
@@ -0,0 +1,180 @@
|
|
1
|
+
# Copyright (C) 2017 MongoDB, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'mongo/session/session_pool'
|
16
|
+
require 'mongo/session/server_session'
|
17
|
+
|
18
|
+
module Mongo
|
19
|
+
|
20
|
+
# A logical client session representing a set of sequential operations executed
|
21
|
+
# by an application that are related in some way.
|
22
|
+
#
|
23
|
+
# @since 2.5.0
|
24
|
+
class Session
|
25
|
+
extend Forwardable
|
26
|
+
|
27
|
+
# Get the options for this session.
|
28
|
+
#
|
29
|
+
# @since 2.5.0
|
30
|
+
attr_reader :options
|
31
|
+
|
32
|
+
# Get the client through which this session was created.
|
33
|
+
#
|
34
|
+
# @since 2.5.0
|
35
|
+
attr_reader :client
|
36
|
+
|
37
|
+
def_delegators :@server_session, :session_id
|
38
|
+
|
39
|
+
# Error message describing that the session was attempted to be used by a client different from the
|
40
|
+
# one it was originally associated with.
|
41
|
+
#
|
42
|
+
# @since 2.5.0
|
43
|
+
MISTMATCHED_CLUSTER_ERROR_MSG = 'The client used to create this session does not match that of client ' +
|
44
|
+
'initiating this operation. Please only use this session for operations through its parent client.'.freeze
|
45
|
+
|
46
|
+
# Error message describing that the session cannot be used because it has already been ended.
|
47
|
+
#
|
48
|
+
# @since 2.5.0
|
49
|
+
SESSION_ENDED_ERROR_MSG = 'This session has ended and cannot be used. Please create a new one.'.freeze
|
50
|
+
|
51
|
+
# Error message describing that sessions are not supported by the server version.
|
52
|
+
#
|
53
|
+
# @since 2.5.0
|
54
|
+
SESSIONS_NOT_SUPPORTED = 'Sessions are not supported by the connected servers.'.freeze
|
55
|
+
|
56
|
+
# Initialize a Session.
|
57
|
+
#
|
58
|
+
# @example
|
59
|
+
# Session.new(server_session, client, options)
|
60
|
+
#
|
61
|
+
# @param [ ServerSession ] server_session The server session this client session is associated with.
|
62
|
+
# @param [ Client ] client The client through which this session is created.
|
63
|
+
# @param [ Hash ] options The options for this session.
|
64
|
+
#
|
65
|
+
# @since 2.5.0
|
66
|
+
def initialize(server_session, client, options = {})
|
67
|
+
@server_session = server_session
|
68
|
+
@client = client
|
69
|
+
@options = options
|
70
|
+
end
|
71
|
+
|
72
|
+
# End this session.
|
73
|
+
#
|
74
|
+
# @example
|
75
|
+
# session.end_session
|
76
|
+
#
|
77
|
+
# @return [ nil ] Always nil.
|
78
|
+
#
|
79
|
+
# @since 2.5.0
|
80
|
+
def end_session
|
81
|
+
if !ended? && @client
|
82
|
+
@client.instance_variable_get(:@session_pool).checkin(@server_session)
|
83
|
+
nil
|
84
|
+
end
|
85
|
+
ensure
|
86
|
+
@server_session = nil
|
87
|
+
end
|
88
|
+
|
89
|
+
# End this session if it's an implicit session.
|
90
|
+
#
|
91
|
+
# @example
|
92
|
+
# session.end_implicit_session
|
93
|
+
#
|
94
|
+
# @return [ nil ] Always nil.
|
95
|
+
#
|
96
|
+
# @since 2.5.0
|
97
|
+
def end_implicit_session
|
98
|
+
end_session if implicit_session?
|
99
|
+
end
|
100
|
+
|
101
|
+
# Whether this session has ended.
|
102
|
+
#
|
103
|
+
# @example
|
104
|
+
# session.ended?
|
105
|
+
#
|
106
|
+
# @return [ true, false ] Whether the session has ended.
|
107
|
+
#
|
108
|
+
# @since 2.5.0
|
109
|
+
def ended?
|
110
|
+
@server_session.nil?
|
111
|
+
end
|
112
|
+
|
113
|
+
# Add this session's id to a command document.
|
114
|
+
#
|
115
|
+
# @example
|
116
|
+
# session.add_id!(cmd)
|
117
|
+
#
|
118
|
+
# @return [ Hash, BSON::Document ] The command document.
|
119
|
+
#
|
120
|
+
# @since 2.5.0
|
121
|
+
def add_id!(command)
|
122
|
+
command.merge!(lsid: session_id)
|
123
|
+
end
|
124
|
+
|
125
|
+
# Validate the session.
|
126
|
+
#
|
127
|
+
# @example
|
128
|
+
# session.validate!(client)
|
129
|
+
#
|
130
|
+
# @param [ Client ] client The client the session is attempted to be used with.
|
131
|
+
#
|
132
|
+
# @return [ nil ] nil if the session is valid.
|
133
|
+
#
|
134
|
+
# @raise [ Mongo::Error::InvalidSession ] Raise error if the session is not valid.
|
135
|
+
#
|
136
|
+
# @since 2.5.0
|
137
|
+
def validate!(client)
|
138
|
+
check_matching_client!(client)
|
139
|
+
check_if_ended!
|
140
|
+
end
|
141
|
+
|
142
|
+
# Process a response from the server that used this session.
|
143
|
+
#
|
144
|
+
# @example Process a response from the server.
|
145
|
+
# session.process(result)
|
146
|
+
#
|
147
|
+
# @param [ Operation::Result ] The result from the operation.
|
148
|
+
#
|
149
|
+
# @return [ Operation::Result ] The result.
|
150
|
+
#
|
151
|
+
# @since 2.5.0
|
152
|
+
def process(result)
|
153
|
+
set_operation_time(result)
|
154
|
+
@server_session.set_last_use!
|
155
|
+
result
|
156
|
+
end
|
157
|
+
|
158
|
+
private
|
159
|
+
|
160
|
+
def implicit_session?
|
161
|
+
@implicit_session ||= !!(@options.key?(:implicit) && @options[:implicit] == true)
|
162
|
+
end
|
163
|
+
|
164
|
+
def set_operation_time(result)
|
165
|
+
if result && result.operation_time
|
166
|
+
@operation_time = result.operation_time
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def check_if_ended!
|
171
|
+
raise Mongo::Error::InvalidSession.new(SESSION_ENDED_ERROR_MSG) if ended?
|
172
|
+
end
|
173
|
+
|
174
|
+
def check_matching_client!(client)
|
175
|
+
if @client != client
|
176
|
+
raise Mongo::Error::InvalidSession.new(MISTMATCHED_CLUSTER_ERROR_MSG)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|