mongo 2.0.6 → 2.1.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 +5 -2
- data/lib/mongo/address/ipv4.rb +6 -1
- data/lib/mongo/address/unix.rb +2 -2
- data/lib/mongo/address.rb +18 -10
- data/lib/mongo/auth/cr/conversation.rb +1 -1
- data/lib/mongo/auth/ldap/conversation.rb +7 -3
- data/lib/mongo/auth/scram/conversation.rb +9 -3
- data/lib/mongo/auth/user/view.rb +23 -2
- data/lib/mongo/auth/x509/conversation.rb +1 -1
- data/lib/mongo/bulk_write/combineable.rb +51 -0
- data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
- data/lib/mongo/bulk_write/result.rb +191 -0
- data/lib/mongo/bulk_write/result_combiner.rb +117 -0
- data/lib/mongo/bulk_write/transformable.rb +132 -0
- data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
- data/lib/mongo/bulk_write/validatable.rb +62 -0
- data/lib/mongo/bulk_write.rb +159 -23
- data/lib/mongo/client.rb +52 -16
- data/lib/mongo/cluster/topology/replica_set.rb +27 -9
- data/lib/mongo/cluster/topology/sharded.rb +1 -1
- data/lib/mongo/cluster/topology/unknown.rb +5 -2
- data/lib/mongo/cluster.rb +42 -7
- data/lib/mongo/collection/view/aggregation.rb +48 -9
- data/lib/mongo/collection/view/immutable.rb +6 -6
- data/lib/mongo/collection/view/iterable.rb +18 -4
- data/lib/mongo/collection/view/map_reduce.rb +58 -17
- data/lib/mongo/collection/view/readable.rb +173 -42
- data/lib/mongo/collection/view/writable.rb +37 -23
- data/lib/mongo/collection/view.rb +2 -2
- data/lib/mongo/collection.rb +370 -33
- data/lib/mongo/cursor.rb +15 -3
- data/lib/mongo/database/view.rb +5 -4
- data/lib/mongo/database.rb +14 -4
- data/lib/mongo/dbref.rb +113 -0
- data/lib/mongo/error/closed_stream.rb +34 -0
- data/lib/mongo/error/extra_file_chunk.rb +34 -0
- data/lib/mongo/error/{invalid_uri_option.rb → file_not_found.rb} +11 -12
- data/lib/mongo/error/invalid_file.rb +2 -2
- data/lib/mongo/error/invalid_file_revision.rb +37 -0
- data/lib/mongo/error/invalid_uri.rb +5 -4
- data/lib/mongo/error/missing_file_chunk.rb +38 -0
- data/lib/mongo/error/operation_failure.rb +1 -1
- data/lib/mongo/error/parser.rb +1 -1
- data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
- data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
- data/lib/mongo/error.rb +13 -2
- data/lib/mongo/event/description_changed.rb +1 -1
- data/lib/mongo/grid/file/chunk.rb +6 -6
- data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
- data/lib/mongo/grid/file.rb +13 -10
- data/lib/mongo/grid/fs_bucket.rb +448 -0
- data/lib/mongo/grid/stream/read.rb +208 -0
- data/lib/mongo/grid/stream/write.rb +187 -0
- data/lib/mongo/grid/stream.rb +64 -0
- data/lib/mongo/grid.rb +2 -1
- data/lib/mongo/index/view.rb +3 -3
- data/lib/mongo/index.rb +5 -0
- data/lib/mongo/loggable.rb +34 -57
- data/lib/mongo/logger.rb +16 -78
- data/lib/mongo/monitoring/command_log_subscriber.rb +112 -0
- data/lib/mongo/monitoring/event/command_failed.rb +96 -0
- data/lib/mongo/monitoring/event/command_started.rb +89 -0
- data/lib/mongo/monitoring/event/command_succeeded.rb +118 -0
- data/lib/mongo/monitoring/event/secure.rb +58 -0
- data/lib/mongo/monitoring/event.rb +18 -0
- data/lib/mongo/monitoring/publishable.rb +106 -0
- data/lib/mongo/monitoring.rb +195 -0
- data/lib/mongo/operation/{aggregate.rb → commands/aggregate.rb} +3 -41
- data/lib/mongo/operation/commands/collections_info/result.rb +39 -0
- data/lib/mongo/operation/commands/collections_info.rb +68 -0
- data/lib/mongo/operation/{command.rb → commands/command.rb} +2 -18
- data/lib/mongo/operation/commands/indexes.rb +70 -0
- data/lib/mongo/operation/commands/list_collections/result.rb +112 -0
- data/lib/mongo/operation/commands/list_collections.rb +54 -0
- data/lib/mongo/operation/commands/list_indexes/result.rb +116 -0
- data/lib/mongo/operation/commands/list_indexes.rb +56 -0
- data/lib/mongo/operation/{map_reduce → commands/map_reduce}/result.rb +1 -1
- data/lib/mongo/operation/{map_reduce.rb → commands/map_reduce.rb} +3 -41
- data/lib/mongo/operation/commands/parallel_scan/result.rb +72 -0
- data/lib/mongo/operation/commands/parallel_scan.rb +56 -0
- data/lib/mongo/operation/commands/user_query.rb +69 -0
- data/lib/mongo/{bulk_write/ordered_bulk_write.rb → operation/commands/users_info/result.rb} +18 -30
- data/lib/mongo/operation/commands/users_info.rb +53 -0
- data/lib/mongo/operation/commands.rb +24 -0
- data/lib/mongo/operation/executable.rb +4 -68
- data/lib/mongo/operation/kill_cursors.rb +3 -3
- data/lib/mongo/operation/read/get_more.rb +2 -22
- data/lib/mongo/{bulk_write/unordered_bulk_write.rb → operation/read/query/result.rb} +20 -26
- data/lib/mongo/operation/read/query.rb +4 -21
- data/lib/mongo/operation/read.rb +0 -4
- data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
- data/lib/mongo/operation/result.rb +13 -1
- data/lib/mongo/operation/specifiable.rb +42 -0
- data/lib/mongo/operation/write/bulk/bulkable.rb +82 -0
- data/lib/mongo/operation/write/bulk/delete/result.rb +74 -0
- data/lib/mongo/operation/write/bulk/delete.rb +71 -0
- data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
- data/lib/mongo/operation/write/bulk/insert.rb +96 -0
- data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
- data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
- data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
- data/lib/mongo/operation/write/bulk/update.rb +81 -0
- data/lib/mongo/operation/write/bulk.rb +6 -3
- data/lib/mongo/operation/write/command/create_index.rb +0 -1
- data/lib/mongo/operation/write/command/create_user.rb +0 -1
- data/lib/mongo/operation/write/command/delete.rb +0 -1
- data/lib/mongo/operation/write/command/drop_index.rb +0 -1
- data/lib/mongo/operation/write/command/insert.rb +0 -1
- data/lib/mongo/operation/write/command/remove_user.rb +0 -1
- data/lib/mongo/operation/write/command/update.rb +0 -1
- data/lib/mongo/operation/write/command/update_user.rb +0 -1
- data/lib/mongo/operation/write/command/writable.rb +13 -18
- data/lib/mongo/operation/write/create_index.rb +4 -27
- data/lib/mongo/operation/write/create_user.rb +4 -30
- data/lib/mongo/operation/write/delete.rb +6 -29
- data/lib/mongo/operation/write/drop_index.rb +3 -3
- data/lib/mongo/operation/write/gle.rb +48 -0
- data/lib/mongo/operation/write/idable.rb +5 -0
- data/lib/mongo/operation/write/insert.rb +2 -24
- data/lib/mongo/operation/write/remove_user.rb +4 -27
- data/lib/mongo/operation/write/update.rb +13 -36
- data/lib/mongo/operation/write/update_user.rb +4 -30
- data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
- data/lib/mongo/operation/write.rb +2 -0
- data/lib/mongo/operation.rb +32 -4
- data/lib/mongo/options/mapper.rb +4 -2
- data/lib/mongo/options/redacted.rb +156 -0
- data/lib/mongo/options.rb +1 -0
- data/lib/mongo/protocol/delete.rb +75 -15
- data/lib/mongo/protocol/get_more.rb +65 -13
- data/lib/mongo/protocol/insert.rb +85 -13
- data/lib/mongo/protocol/kill_cursors.rb +59 -14
- data/lib/mongo/protocol/message.rb +12 -12
- data/lib/mongo/protocol/query.rb +163 -37
- data/lib/mongo/protocol/reply.rb +103 -0
- data/lib/mongo/protocol/serializers.rb +1 -1
- data/lib/mongo/protocol/update.rb +82 -14
- data/lib/mongo/retryable.rb +83 -0
- data/lib/mongo/server/connectable.rb +21 -25
- data/lib/mongo/server/connection.rb +75 -4
- data/lib/mongo/server/connection_pool/queue.rb +15 -0
- data/lib/mongo/server/connection_pool.rb +12 -0
- data/lib/mongo/server/description/features.rb +2 -1
- data/lib/mongo/server/description.rb +52 -1
- data/lib/mongo/server/monitor/connection.rb +26 -2
- data/lib/mongo/server/monitor.rb +19 -3
- data/lib/mongo/server.rb +39 -5
- data/lib/mongo/server_selector/selectable.rb +40 -31
- data/lib/mongo/server_selector.rb +19 -10
- data/lib/mongo/socket/ssl.rb +28 -16
- data/lib/mongo/socket/tcp.rb +3 -3
- data/lib/mongo/socket/unix.rb +5 -8
- data/lib/mongo/socket.rb +11 -4
- data/lib/mongo/uri.rb +248 -137
- data/lib/mongo/version.rb +1 -1
- data/lib/mongo.rb +5 -3
- data/spec/mongo/address/unix_spec.rb +1 -1
- data/spec/mongo/address_spec.rb +25 -0
- data/spec/mongo/auth/cr_spec.rb +9 -1
- data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
- data/spec/mongo/auth/ldap_spec.rb +9 -1
- data/spec/mongo/auth/scram_spec.rb +9 -1
- data/spec/mongo/auth/user/view_spec.rb +26 -1
- data/spec/mongo/auth/x509_spec.rb +9 -1
- data/spec/mongo/bulk_write/ordered_combiner_spec.rb +271 -0
- data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
- data/spec/mongo/bulk_write_spec.rb +428 -0
- data/spec/mongo/client_spec.rb +167 -17
- data/spec/mongo/cluster/topology/replica_set_spec.rb +18 -9
- data/spec/mongo/cluster/topology/sharded_spec.rb +11 -3
- data/spec/mongo/cluster/topology/single_spec.rb +12 -4
- data/spec/mongo/cluster_spec.rb +55 -10
- data/spec/mongo/collection/view/aggregation_spec.rb +188 -1
- data/spec/mongo/collection/view/explainable_spec.rb +1 -1
- data/spec/mongo/collection/view/immutable_spec.rb +103 -0
- data/spec/mongo/collection/view/map_reduce_spec.rb +99 -4
- data/spec/mongo/collection/view/readable_spec.rb +238 -6
- data/spec/mongo/collection/view/writable_spec.rb +4 -4
- data/spec/mongo/collection/view_spec.rb +459 -71
- data/spec/mongo/collection_spec.rb +1291 -9
- data/spec/mongo/command_monitoring_spec.rb +51 -0
- data/spec/mongo/connection_string_spec.rb +115 -0
- data/spec/mongo/crud_spec.rb +2 -2
- data/spec/mongo/cursor_spec.rb +3 -3
- data/spec/mongo/database_spec.rb +47 -11
- data/spec/mongo/dbref_spec.rb +149 -0
- data/spec/mongo/grid/file/chunk_spec.rb +5 -5
- data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
- data/spec/mongo/grid/file_spec.rb +8 -8
- data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
- data/spec/mongo/grid/stream/read_spec.rb +275 -0
- data/spec/mongo/grid/stream/write_spec.rb +440 -0
- data/spec/mongo/grid/stream_spec.rb +48 -0
- data/spec/mongo/gridfs_spec.rb +50 -0
- data/spec/mongo/logger_spec.rb +0 -40
- data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
- data/spec/mongo/monitoring/event/command_started_spec.rb +26 -0
- data/spec/mongo/monitoring/event/command_succeeded_spec.rb +26 -0
- data/spec/mongo/monitoring/event/secure_spec.rb +57 -0
- data/spec/mongo/monitoring_spec.rb +168 -0
- data/spec/mongo/operation/commands/aggregate_spec.rb +69 -0
- data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
- data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +0 -18
- data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
- data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +1 -19
- data/spec/mongo/operation/kill_cursors_spec.rb +1 -17
- data/spec/mongo/operation/read/get_more_spec.rb +0 -16
- data/spec/mongo/operation/read/query_spec.rb +19 -16
- data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
- data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +18 -29
- data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +3 -14
- data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +8 -19
- data/spec/mongo/operation/write/command/delete_spec.rb +0 -16
- data/spec/mongo/operation/write/command/insert_spec.rb +0 -16
- data/spec/mongo/operation/write/command/update_spec.rb +0 -16
- data/spec/mongo/operation/write/delete_spec.rb +4 -4
- data/spec/mongo/operation/write/insert_spec.rb +2 -13
- data/spec/mongo/operation/write/update_spec.rb +7 -7
- data/spec/mongo/options/redacted_spec.rb +350 -0
- data/spec/mongo/protocol/kill_cursors_spec.rb +5 -3
- data/spec/mongo/protocol/query_spec.rb +15 -30
- data/spec/mongo/retryable_spec.rb +147 -0
- data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
- data/spec/mongo/server/connection_pool_spec.rb +50 -6
- data/spec/mongo/server/connection_spec.rb +49 -4
- data/spec/mongo/server/description_spec.rb +49 -3
- data/spec/mongo/server/monitor_spec.rb +51 -0
- data/spec/mongo/server_discovery_and_monitoring_spec.rb +32 -59
- data/spec/mongo/server_selection_rtt_spec.rb +37 -57
- data/spec/mongo/server_selection_spec.rb +19 -9
- data/spec/mongo/server_selector/nearest_spec.rb +35 -27
- data/spec/mongo/server_selector/primary_preferred_spec.rb +32 -30
- data/spec/mongo/server_selector/primary_spec.rb +21 -14
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +28 -26
- data/spec/mongo/server_selector/secondary_spec.rb +24 -22
- data/spec/mongo/server_selector_spec.rb +87 -24
- data/spec/mongo/server_spec.rb +94 -8
- data/spec/mongo/socket/ssl_spec.rb +123 -13
- data/spec/mongo/socket/unix_spec.rb +52 -0
- data/spec/mongo/uri_spec.rb +295 -67
- data/spec/spec_helper.rb +40 -24
- data/spec/support/authorization.rb +23 -9
- data/spec/support/certificates/client.pem +4 -4
- data/spec/support/command_monitoring/bulkWrite.yml +73 -0
- data/spec/support/command_monitoring/command.yml +42 -0
- data/spec/support/command_monitoring/deleteMany.yml +55 -0
- data/spec/support/command_monitoring/deleteOne.yml +55 -0
- data/spec/support/command_monitoring/find.yml +219 -0
- data/spec/support/command_monitoring/insertMany.yml +81 -0
- data/spec/support/command_monitoring/insertOne.yml +51 -0
- data/spec/support/command_monitoring/updateMany.yml +67 -0
- data/spec/support/command_monitoring/updateOne.yml +95 -0
- data/spec/support/command_monitoring.rb +365 -0
- data/spec/support/connection_string.rb +228 -0
- data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
- data/spec/support/connection_string_tests/valid-auth.yml +256 -0
- data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
- data/spec/support/connection_string_tests/valid-options.yml +30 -0
- data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
- data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
- data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
- data/spec/support/crud/read.rb +22 -19
- data/spec/support/crud/write.rb +58 -27
- data/spec/support/crud.rb +10 -2
- data/spec/support/gridfs.rb +637 -0
- data/spec/support/gridfs_tests/delete.yml +157 -0
- data/spec/support/gridfs_tests/download.yml +210 -0
- data/spec/support/gridfs_tests/download_by_name.yml +113 -0
- data/spec/support/gridfs_tests/upload.yml +158 -0
- data/spec/support/matchers.rb +1 -1
- data/spec/support/sdam/rs/equal_electionids.yml +44 -0
- data/spec/support/sdam/rs/new_primary_new_electionid.yml +95 -0
- data/spec/support/sdam/rs/null_election_id.yml +144 -0
- data/spec/support/sdam/rs/primary_disconnect_electionid.yml +124 -0
- data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
- data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
- data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
- data/spec/support/sdam/sharded/mongos_disconnect.yml +104 -0
- 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/not_ok_response.yml +0 -1
- data/spec/support/server_discovery_and_monitoring.rb +22 -3
- data/spec/support/server_selection.rb +3 -1
- data/spec/support/shared/bulk_write.rb +218 -22
- data/spec/support/shared/server_selector.rb +80 -14
- data.tar.gz.sig +0 -0
- metadata +188 -59
- metadata.gz.sig +0 -0
- data/lib/mongo/bulk_write/bulk_writable.rb +0 -196
- data/lib/mongo/bulk_write/deletable.rb +0 -56
- data/lib/mongo/bulk_write/insertable.rb +0 -48
- data/lib/mongo/bulk_write/replacable.rb +0 -57
- data/lib/mongo/bulk_write/updatable.rb +0 -68
- data/lib/mongo/grid/fs.rb +0 -149
- data/lib/mongo/operation/list_collections/result.rb +0 -114
- data/lib/mongo/operation/list_indexes/result.rb +0 -118
- data/lib/mongo/operation/read/collections_info.rb +0 -68
- data/lib/mongo/operation/read/indexes.rb +0 -69
- data/lib/mongo/operation/read/list_collections.rb +0 -76
- data/lib/mongo/operation/read/list_indexes.rb +0 -78
- data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
- data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
- data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
- data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
- data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
- data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -162
- data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
- data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
- data/spec/mongo/bulk/bulk_write_spec.rb +0 -262
- data/spec/mongo/grid/fs_spec.rb +0 -160
- data/spec/mongo/loggable_spec.rb +0 -63
- data/spec/mongo/operation/aggregate_spec.rb +0 -127
- /data/lib/mongo/operation/{aggregate → commands/aggregate}/result.rb +0 -0
data/lib/mongo/server.rb
CHANGED
@@ -40,6 +40,9 @@ module Mongo
|
|
40
40
|
# @return [ Hash ] The options hash.
|
41
41
|
attr_reader :options
|
42
42
|
|
43
|
+
# @return [ Monitoring ] monitoring The monitoring.
|
44
|
+
attr_reader :monitoring
|
45
|
+
|
43
46
|
# Get the description from the monitor and scan on monitor.
|
44
47
|
def_delegators :monitor, :description, :scan!
|
45
48
|
|
@@ -89,6 +92,21 @@ module Mongo
|
|
89
92
|
Context.new(self)
|
90
93
|
end
|
91
94
|
|
95
|
+
# Determine if a connection to the server is able to be established and
|
96
|
+
# messages can be sent to it.
|
97
|
+
#
|
98
|
+
# @example Is the server connectable?
|
99
|
+
# server.connectable?
|
100
|
+
#
|
101
|
+
# @return [ true, false ] If the server is connectable.
|
102
|
+
#
|
103
|
+
# @since 2.1.0
|
104
|
+
def connectable?
|
105
|
+
context.with_connection do |connection|
|
106
|
+
connection.connectable?
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
92
110
|
# Disconnect the server from the connection.
|
93
111
|
#
|
94
112
|
# @example Disconnect the server.
|
@@ -98,27 +116,31 @@ module Mongo
|
|
98
116
|
#
|
99
117
|
# @since 2.0.0
|
100
118
|
def disconnect!
|
101
|
-
|
102
|
-
connection.disconnect!
|
103
|
-
end
|
119
|
+
pool.disconnect!
|
104
120
|
monitor.stop! and true
|
105
121
|
end
|
106
122
|
|
107
123
|
# Instantiate a new server object. Will start the background refresh and
|
108
124
|
# subscribe to the appropriate events.
|
109
125
|
#
|
126
|
+
# @api private
|
127
|
+
#
|
110
128
|
# @example Initialize the server.
|
111
|
-
# Mongo::Server.new('127.0.0.1:27017', cluster, listeners)
|
129
|
+
# Mongo::Server.new('127.0.0.1:27017', cluster, monitoring, listeners)
|
130
|
+
#
|
131
|
+
# @note Server must never be directly instantiated outside of a Cluster.
|
112
132
|
#
|
113
133
|
# @param [ Address ] address The host:port address to connect to.
|
114
134
|
# @param [ Cluster ] cluster The cluster the server belongs to.
|
135
|
+
# @param [ Monitoring ] monitoring The monitoring.
|
115
136
|
# @param [ Event::Listeners ] event_listeners The event listeners.
|
116
137
|
# @param [ Hash ] options The server options.
|
117
138
|
#
|
118
139
|
# @since 2.0.0
|
119
|
-
def initialize(address, cluster, event_listeners, options = {})
|
140
|
+
def initialize(address, cluster, monitoring, event_listeners, options = {})
|
120
141
|
@address = address
|
121
142
|
@cluster = cluster
|
143
|
+
@monitoring = monitoring
|
122
144
|
@options = options.freeze
|
123
145
|
@monitor = Monitor.new(address, event_listeners, options)
|
124
146
|
monitor.scan!
|
@@ -164,5 +186,17 @@ module Mongo
|
|
164
186
|
tags[k] && tags[k] == tag_set[k]
|
165
187
|
end
|
166
188
|
end
|
189
|
+
|
190
|
+
# Restart the server monitor.
|
191
|
+
#
|
192
|
+
# @example Restart the server monitor.
|
193
|
+
# server.reconnect!
|
194
|
+
#
|
195
|
+
# @return [ true ] Always true.
|
196
|
+
#
|
197
|
+
# @since 2.1.0
|
198
|
+
def reconnect!
|
199
|
+
monitor.restart! and true
|
200
|
+
end
|
167
201
|
end
|
168
202
|
end
|
@@ -20,17 +20,6 @@ module Mongo
|
|
20
20
|
# @since 2.0.0
|
21
21
|
module Selectable
|
22
22
|
|
23
|
-
# The max latency in seconds between the closest server and other servers
|
24
|
-
# considered for selection.
|
25
|
-
#
|
26
|
-
# @since 2.0.0
|
27
|
-
LOCAL_THRESHOLD = 0.015.freeze
|
28
|
-
|
29
|
-
# How long to block for server selection before throwing an exception.
|
30
|
-
#
|
31
|
-
# @since 2.0.0
|
32
|
-
SERVER_SELECTION_TIMEOUT = 30.freeze
|
33
|
-
|
34
23
|
# @return [ Hash ] options The options.
|
35
24
|
attr_reader :options
|
36
25
|
|
@@ -53,24 +42,29 @@ module Mongo
|
|
53
42
|
|
54
43
|
# Initialize the server selector.
|
55
44
|
#
|
56
|
-
# @example Initialize the
|
57
|
-
# Mongo::ServerSelector::Secondary.new([{
|
45
|
+
# @example Initialize the selector.
|
46
|
+
# Mongo::ServerSelector::Secondary.new(:tag_sets => [{'dc' => 'nyc'}])
|
58
47
|
#
|
59
48
|
# @example Initialize the preference with no options.
|
60
49
|
# Mongo::ServerSelector::Secondary.new
|
61
50
|
#
|
62
|
-
# @param [
|
51
|
+
# @param [ Hash ] options The server preference options.
|
63
52
|
#
|
64
|
-
# @
|
65
|
-
#
|
53
|
+
# @option options [ Integer ] :server_selection_timeout The timeout in seconds
|
54
|
+
# for selecting a server.
|
55
|
+
#
|
56
|
+
# @option options [ Integer ] :local_threshold The local threshold boundary for
|
57
|
+
# nearest selection in seconds.
|
58
|
+
#
|
59
|
+
# @raise [ Error::InvalidServerPreference ] If tag sets are specified
|
60
|
+
# but not allowed.
|
66
61
|
#
|
67
62
|
# @since 2.0.0
|
68
|
-
def initialize(
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
@tag_sets = tag_sets
|
73
|
-
@options = options
|
63
|
+
def initialize(options = {})
|
64
|
+
@options = (options || {}).freeze
|
65
|
+
tag_sets = options[:tag_sets] || []
|
66
|
+
validate_tag_sets!(tag_sets)
|
67
|
+
@tag_sets = tag_sets.freeze
|
74
68
|
end
|
75
69
|
|
76
70
|
# Select a server from eligible candidates.
|
@@ -86,14 +80,11 @@ module Mongo
|
|
86
80
|
def select_server(cluster)
|
87
81
|
deadline = Time.now + server_selection_timeout
|
88
82
|
while (deadline - Time.now) > 0
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
else
|
94
|
-
servers = select(cluster.servers)
|
83
|
+
servers = candidates(cluster)
|
84
|
+
if servers && !servers.compact.empty?
|
85
|
+
server = servers.first
|
86
|
+
return server if server.connectable?
|
95
87
|
end
|
96
|
-
return servers.first if servers && !servers.compact.empty?
|
97
88
|
cluster.scan!
|
98
89
|
end
|
99
90
|
raise Error::NoServerAvailable.new(self)
|
@@ -109,7 +100,7 @@ module Mongo
|
|
109
100
|
# @since 2.0.0
|
110
101
|
def server_selection_timeout
|
111
102
|
@server_selection_timeout ||=
|
112
|
-
(options[:server_selection_timeout] || SERVER_SELECTION_TIMEOUT)
|
103
|
+
(options[:server_selection_timeout] || ServerSelector::SERVER_SELECTION_TIMEOUT)
|
113
104
|
end
|
114
105
|
|
115
106
|
# Get the local threshold boundary for nearest selection in seconds.
|
@@ -121,11 +112,21 @@ module Mongo
|
|
121
112
|
#
|
122
113
|
# @since 2.0.0
|
123
114
|
def local_threshold
|
124
|
-
@local_threshold ||= (options[:local_threshold] || LOCAL_THRESHOLD)
|
115
|
+
@local_threshold ||= (options[:local_threshold] || ServerSelector::LOCAL_THRESHOLD)
|
125
116
|
end
|
126
117
|
|
127
118
|
private
|
128
119
|
|
120
|
+
def candidates(cluster)
|
121
|
+
if cluster.single?
|
122
|
+
cluster.servers
|
123
|
+
elsif cluster.sharded?
|
124
|
+
near_servers(cluster.servers)
|
125
|
+
else
|
126
|
+
select(cluster.servers)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
129
130
|
# Select the primary from a list of provided candidates.
|
130
131
|
#
|
131
132
|
# @param [ Array ] candidates List of candidate servers to select the
|
@@ -186,6 +187,14 @@ module Mongo
|
|
186
187
|
end
|
187
188
|
matches || []
|
188
189
|
end
|
190
|
+
|
191
|
+
private
|
192
|
+
|
193
|
+
def validate_tag_sets!(tag_sets)
|
194
|
+
if !tag_sets.all? { |set| set.empty? } && !tags_allowed?
|
195
|
+
raise Error::InvalidServerPreference.new(name)
|
196
|
+
end
|
197
|
+
end
|
189
198
|
end
|
190
199
|
end
|
191
200
|
end
|
@@ -27,6 +27,22 @@ module Mongo
|
|
27
27
|
module ServerSelector
|
28
28
|
extend self
|
29
29
|
|
30
|
+
# The max latency in seconds between the closest server and other servers
|
31
|
+
# considered for selection.
|
32
|
+
#
|
33
|
+
# @since 2.0.0
|
34
|
+
LOCAL_THRESHOLD = 0.015.freeze
|
35
|
+
|
36
|
+
# How long to block for server selection before throwing an exception.
|
37
|
+
#
|
38
|
+
# @since 2.0.0
|
39
|
+
SERVER_SELECTION_TIMEOUT = 30.freeze
|
40
|
+
|
41
|
+
# Primary read preference.
|
42
|
+
#
|
43
|
+
# @since 2.1.0
|
44
|
+
PRIMARY = Options::Redacted.new(mode: :primary).freeze
|
45
|
+
|
30
46
|
# Hash lookup for the selector classes based off the symbols
|
31
47
|
# provided in configuration.
|
32
48
|
#
|
@@ -43,20 +59,13 @@ module Mongo
|
|
43
59
|
#
|
44
60
|
# @example Get a server selector object for selecting a secondary with
|
45
61
|
# specific tag sets.
|
46
|
-
# Mongo::ServerSelector.get(
|
62
|
+
# Mongo::ServerSelector.get(:mode => :secondary, :tag_sets => [{'dc' => 'nyc'}])
|
47
63
|
#
|
48
64
|
# @param [ Hash ] preference The server preference.
|
49
|
-
# @param [ Hash ] options The preference options.
|
50
|
-
#
|
51
|
-
# @option preference :mode [ Symbol ] The preference mode.
|
52
|
-
# @option preference :tag_sets [ Array<Hash> ] The tag sets.
|
53
65
|
#
|
54
66
|
# @since 2.0.0
|
55
|
-
def get(preference = {}
|
56
|
-
PREFERENCES.fetch(preference[:mode] || :primary).new(
|
57
|
-
preference[:tag_sets] || [],
|
58
|
-
options
|
59
|
-
)
|
67
|
+
def get(preference = {})
|
68
|
+
PREFERENCES.fetch(preference[:mode] || :primary).new(preference)
|
60
69
|
end
|
61
70
|
end
|
62
71
|
end
|
data/lib/mongo/socket/ssl.rb
CHANGED
@@ -54,10 +54,10 @@ module Mongo
|
|
54
54
|
# @since 2.0.0
|
55
55
|
def connect!
|
56
56
|
Timeout.timeout(timeout, Error::SocketTimeoutError) do
|
57
|
-
@tcp_socket.connect(::Socket.pack_sockaddr_in(port, host))
|
57
|
+
handle_errors { @tcp_socket.connect(::Socket.pack_sockaddr_in(port, host)) }
|
58
58
|
@socket = OpenSSL::SSL::SSLSocket.new(@tcp_socket, context)
|
59
59
|
@socket.sync_close = true
|
60
|
-
@socket.connect
|
60
|
+
handle_errors { @socket.connect }
|
61
61
|
verify_certificate!(@socket)
|
62
62
|
self
|
63
63
|
end
|
@@ -100,22 +100,34 @@ module Mongo
|
|
100
100
|
|
101
101
|
def create_context(options)
|
102
102
|
context = OpenSSL::SSL::SSLContext.new
|
103
|
-
if options[:ssl_cert]
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
103
|
+
set_cert(context, options) if options[:ssl_cert]
|
104
|
+
set_key(context, options) if options[:ssl_key]
|
105
|
+
set_cert_verification(context, options) unless options[:ssl_verify] == false
|
106
|
+
context
|
107
|
+
end
|
108
|
+
|
109
|
+
def set_cert(context, options)
|
110
|
+
context.cert = OpenSSL::X509::Certificate.new(File.open(options[:ssl_cert]))
|
111
|
+
end
|
112
|
+
|
113
|
+
def set_key(context, options)
|
114
|
+
if options[:ssl_key_pass_phrase]
|
115
|
+
context.key = OpenSSL::PKey::RSA.new(File.open(options[:ssl_key]),
|
116
|
+
options[:ssl_key_pass_phrase])
|
117
|
+
else
|
118
|
+
context.key = OpenSSL::PKey::RSA.new(File.open(options[:ssl_key]))
|
113
119
|
end
|
114
|
-
|
115
|
-
|
116
|
-
|
120
|
+
end
|
121
|
+
|
122
|
+
def set_cert_verification(context, options)
|
123
|
+
context.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
124
|
+
cert_store = OpenSSL::X509::Store.new
|
125
|
+
if options[:ssl_ca_cert]
|
126
|
+
cert_store.add_file(options[:ssl_ca_cert])
|
127
|
+
else
|
128
|
+
cert_store.set_default_paths
|
117
129
|
end
|
118
|
-
context
|
130
|
+
context.cert_store = cert_store
|
119
131
|
end
|
120
132
|
|
121
133
|
def verify_certificate!(socket)
|
data/lib/mongo/socket/tcp.rb
CHANGED
@@ -43,7 +43,7 @@ module Mongo
|
|
43
43
|
def connect!
|
44
44
|
Timeout.timeout(timeout, Error::SocketTimeoutError) do
|
45
45
|
socket.setsockopt(IPPROTO_TCP, TCP_NODELAY, 1)
|
46
|
-
socket.connect(::Socket.pack_sockaddr_in(port, host))
|
46
|
+
handle_errors { socket.connect(::Socket.pack_sockaddr_in(port, host)) }
|
47
47
|
self
|
48
48
|
end
|
49
49
|
end
|
@@ -51,8 +51,8 @@ module Mongo
|
|
51
51
|
# Initializes a new TCP socket.
|
52
52
|
#
|
53
53
|
# @example Create the TCP socket.
|
54
|
-
# TCP.new('::1', 27017, 30)
|
55
|
-
# TCP.new('127.0.0.1', 27017, 30)
|
54
|
+
# TCP.new('::1', 27017, 30, Socket::PF_INET)
|
55
|
+
# TCP.new('127.0.0.1', 27017, 30, Socket::PF_INET)
|
56
56
|
#
|
57
57
|
# @param [ String ] host The hostname or IP address.
|
58
58
|
# @param [ Integer ] port The port number.
|
data/lib/mongo/socket/unix.rb
CHANGED
@@ -38,25 +38,22 @@ module Mongo
|
|
38
38
|
#
|
39
39
|
# @since 2.0.0
|
40
40
|
def connect!
|
41
|
-
|
42
|
-
socket.connect(path)
|
43
|
-
self
|
44
|
-
end
|
41
|
+
self
|
45
42
|
end
|
46
43
|
|
47
44
|
# Initializes a new Unix socket.
|
48
45
|
#
|
49
46
|
# @example Create the Unix socket.
|
50
|
-
# Unix.new('/path/to.sock',
|
47
|
+
# Unix.new('/path/to.sock', 5)
|
51
48
|
#
|
52
49
|
# @param [ String ] path The path.
|
53
50
|
# @param [ Float ] timeout The socket timeout value.
|
54
|
-
# @param [ Integer ] family The socket family.
|
55
51
|
#
|
56
52
|
# @since 2.0.0
|
57
|
-
def initialize(path, timeout
|
53
|
+
def initialize(path, timeout)
|
58
54
|
@path, @timeout = path, timeout
|
59
|
-
|
55
|
+
@socket = ::UNIXSocket.new(path)
|
56
|
+
set_socket_options(@socket)
|
60
57
|
end
|
61
58
|
end
|
62
59
|
end
|
data/lib/mongo/socket.rb
CHANGED
@@ -54,7 +54,7 @@ module Mongo
|
|
54
54
|
#
|
55
55
|
# @return [ true, false ] If the socket is alive.
|
56
56
|
#
|
57
|
-
# @
|
57
|
+
# @deprecated Use #connectable? on the connection instead.
|
58
58
|
def alive?
|
59
59
|
sock_arr = [ @socket ]
|
60
60
|
if Kernel::select(sock_arr, nil, sock_arr, 0)
|
@@ -172,11 +172,18 @@ module Mongo
|
|
172
172
|
@socket.read(length) || String.new
|
173
173
|
end
|
174
174
|
|
175
|
+
def unix_socket?(sock)
|
176
|
+
defined?(UNIXSocket) && sock.is_a?(UNIXSocket)
|
177
|
+
end
|
178
|
+
|
175
179
|
def set_socket_options(sock)
|
176
|
-
encoded_timeout = [ timeout, 0 ].pack(TIMEOUT_PACK)
|
177
180
|
sock.set_encoding(BSON::BINARY)
|
178
|
-
|
179
|
-
sock
|
181
|
+
|
182
|
+
unless unix_socket?(sock) && BSON::Environment.jruby?
|
183
|
+
encoded_timeout = [ timeout, 0 ].pack(TIMEOUT_PACK)
|
184
|
+
sock.setsockopt(SOL_SOCKET, SO_RCVTIMEO, encoded_timeout)
|
185
|
+
sock.setsockopt(SOL_SOCKET, SO_SNDTIMEO, encoded_timeout)
|
186
|
+
end
|
180
187
|
end
|
181
188
|
|
182
189
|
def handle_errors
|