mongo 2.1.0.beta → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/README.md +10 -3
- data/Rakefile +1 -7
- data/lib/mongo/address/ipv4.rb +6 -1
- data/lib/mongo/address/unix.rb +2 -2
- data/lib/mongo/address.rb +32 -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 +61 -8
- 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 +164 -23
- data/lib/mongo/client.rb +75 -18
- data/lib/mongo/cluster/topology/replica_set.rb +8 -6
- data/lib/mongo/cluster/topology/unknown.rb +5 -2
- data/lib/mongo/cluster.rb +85 -5
- data/lib/mongo/collection/view/aggregation.rb +19 -45
- data/lib/mongo/collection/view/builder/aggregation.rb +98 -0
- data/lib/mongo/collection/view/builder/find_command.rb +111 -0
- data/lib/mongo/collection/view/builder/flags.rb +62 -0
- data/lib/mongo/collection/view/builder/map_reduce.rb +134 -0
- data/lib/mongo/collection/view/builder/modifiers.rb +80 -0
- data/lib/mongo/collection/view/builder/op_query.rb +83 -0
- data/lib/mongo/collection/view/builder.rb +20 -0
- data/lib/mongo/collection/view/explainable.rb +15 -0
- data/lib/mongo/collection/view/immutable.rb +4 -11
- data/lib/mongo/collection/view/iterable.rb +40 -5
- data/lib/mongo/collection/view/map_reduce.rb +67 -37
- data/lib/mongo/collection/view/readable.rb +114 -100
- data/lib/mongo/collection/view/writable.rb +46 -22
- data/lib/mongo/collection/view.rb +25 -22
- data/lib/mongo/collection.rb +130 -12
- data/lib/mongo/cursor/builder/get_more_command.rb +71 -0
- data/lib/mongo/cursor/builder/kill_cursors_command.rb +62 -0
- data/lib/mongo/cursor/builder/op_get_more.rb +61 -0
- data/lib/mongo/cursor/builder/op_kill_cursors.rb +56 -0
- data/lib/mongo/cursor/builder.rb +18 -0
- data/lib/mongo/cursor.rb +76 -21
- data/lib/mongo/database/view.rb +11 -6
- data/lib/mongo/database.rb +16 -6
- data/lib/mongo/dbref.rb +9 -9
- data/lib/mongo/{bulk_write/unordered_bulk_write.rb → error/closed_stream.rb} +12 -21
- data/lib/mongo/{bulk_write/ordered_bulk_write.rb → error/extra_file_chunk.rb} +13 -27
- data/lib/mongo/error/file_not_found.rb +37 -0
- 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/invalid_write_concern.rb +35 -0
- data/lib/mongo/error/missing_file_chunk.rb +38 -0
- data/lib/mongo/error/operation_failure.rb +33 -2
- 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 +8 -0
- data/lib/mongo/grid/file/chunk.rb +9 -9
- data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
- data/lib/mongo/grid/file.rb +12 -9
- 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 +7 -4
- 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 +38 -14
- data/lib/mongo/monitoring/event/command_started.rb +2 -1
- data/lib/mongo/monitoring/event/command_succeeded.rb +24 -2
- data/lib/mongo/monitoring/event/secure.rb +58 -0
- data/lib/mongo/monitoring/event.rb +1 -0
- data/lib/mongo/monitoring/publishable.rb +22 -12
- data/lib/mongo/monitoring.rb +1 -5
- data/lib/mongo/operation/commands/aggregate/result.rb +89 -0
- data/lib/mongo/operation/commands/aggregate.rb +64 -0
- data/lib/mongo/operation/commands/collections_info/result.rb +41 -0
- data/lib/mongo/operation/{read → commands}/collections_info.rb +5 -3
- data/lib/mongo/operation/commands/command.rb +47 -0
- data/lib/mongo/operation/commands/find/result.rb +62 -0
- data/lib/mongo/operation/commands/find.rb +27 -0
- data/lib/mongo/operation/commands/get_more/result.rb +62 -0
- data/lib/mongo/operation/commands/get_more.rb +27 -0
- data/lib/mongo/operation/{read → commands}/indexes.rb +9 -6
- data/lib/mongo/operation/{list_collections → commands/list_collections}/result.rb +1 -21
- data/lib/mongo/operation/{read → commands}/list_collections.rb +4 -32
- data/lib/mongo/operation/{list_indexes → commands/list_indexes}/result.rb +1 -21
- data/lib/mongo/operation/{read → commands}/list_indexes.rb +3 -33
- data/lib/mongo/operation/commands/map_reduce/result.rb +119 -0
- data/lib/mongo/operation/commands/map_reduce.rb +49 -0
- data/lib/mongo/operation/commands/parallel_scan/result.rb +64 -0
- data/lib/mongo/operation/commands/parallel_scan.rb +52 -0
- data/lib/mongo/operation/commands/user_query.rb +71 -0
- data/lib/mongo/operation/commands/users_info/result.rb +38 -0
- data/lib/mongo/operation/commands/users_info.rb +48 -0
- data/lib/mongo/operation/commands.rb +26 -0
- data/lib/mongo/operation/executable.rb +4 -68
- data/lib/mongo/operation/kill_cursors.rb +3 -3
- data/lib/mongo/operation/object_id_generator.rb +36 -0
- data/lib/mongo/operation/read/get_more.rb +2 -22
- data/lib/mongo/operation/read/query/result.rb +40 -0
- 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 +43 -1
- data/lib/mongo/operation/specifiable.rb +59 -1
- data/lib/mongo/operation/write/bulk/bulkable.rb +83 -0
- data/lib/mongo/operation/write/bulk/delete/result.rb +67 -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 +3 -3
- data/lib/mongo/operation/write/command/drop_index.rb +0 -1
- data/lib/mongo/operation/write/command/insert.rb +4 -3
- data/lib/mongo/operation/write/command/remove_user.rb +0 -1
- data/lib/mongo/operation/write/command/update.rb +6 -4
- 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 +49 -0
- data/lib/mongo/operation/write/idable.rb +24 -2
- 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 +33 -5
- data/lib/mongo/options/mapper.rb +26 -2
- data/lib/mongo/options/redacted.rb +156 -0
- data/lib/mongo/options.rb +1 -0
- data/lib/mongo/protocol/bit_vector.rb +11 -9
- data/lib/mongo/protocol/delete.rb +78 -3
- data/lib/mongo/protocol/get_more.rb +59 -2
- data/lib/mongo/protocol/insert.rb +73 -1
- data/lib/mongo/protocol/kill_cursors.rb +66 -4
- data/lib/mongo/protocol/message.rb +44 -20
- data/lib/mongo/protocol/query.rb +153 -65
- data/lib/mongo/protocol/reply.rb +92 -1
- data/lib/mongo/protocol/serializers.rb +49 -40
- data/lib/mongo/protocol/update.rb +93 -1
- data/lib/mongo/retryable.rb +101 -0
- data/lib/mongo/server/connectable.rb +28 -8
- data/lib/mongo/server/connection.rb +52 -10
- data/lib/mongo/server/connection_pool/queue.rb +15 -0
- data/lib/mongo/server/connection_pool.rb +12 -15
- data/lib/mongo/server/description/features.rb +4 -2
- data/lib/mongo/server/description.rb +39 -3
- data/lib/mongo/server/monitor/connection.rb +49 -28
- data/lib/mongo/server/monitor.rb +3 -14
- data/lib/mongo/server.rb +31 -4
- data/lib/mongo/server_selector/selectable.rb +58 -32
- data/lib/mongo/server_selector.rb +19 -10
- data/lib/mongo/socket/ssl.rb +4 -1
- data/lib/mongo/socket/tcp.rb +2 -2
- data/lib/mongo/socket/unix.rb +5 -8
- data/lib/mongo/socket.rb +11 -4
- data/lib/mongo/uri.rb +245 -139
- data/lib/mongo/version.rb +1 -1
- data/lib/mongo/write_concern.rb +21 -6
- data/lib/mongo.rb +4 -4
- data/mongo.gemspec +1 -2
- data/spec/mongo/address/unix_spec.rb +1 -1
- data/spec/mongo/address_spec.rb +25 -0
- data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
- data/spec/mongo/auth/user/view_spec.rb +26 -1
- data/spec/mongo/bulk_write/ordered_combiner_spec.rb +284 -0
- data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
- data/spec/mongo/bulk_write_spec.rb +385 -161
- data/spec/mongo/client_spec.rb +193 -23
- data/spec/mongo/cluster/topology/replica_set_spec.rb +2 -0
- data/spec/mongo/collection/view/aggregation_spec.rb +65 -0
- data/spec/mongo/collection/view/builder/find_command_spec.rb +167 -0
- data/spec/mongo/collection/view/builder/flags_spec.rb +106 -0
- data/spec/mongo/collection/view/builder/modifiers_spec.rb +210 -0
- data/spec/mongo/collection/view/builder/op_query_spec.rb +154 -0
- data/spec/mongo/collection/view/explainable_spec.rb +1 -2
- data/spec/mongo/collection/view/immutable_spec.rb +54 -0
- data/spec/mongo/collection/view/map_reduce_spec.rb +104 -9
- data/spec/mongo/collection/view/readable_spec.rb +109 -112
- data/spec/mongo/collection/view_spec.rb +119 -487
- data/spec/mongo/collection_spec.rb +1002 -33
- data/spec/mongo/command_monitoring_spec.rb +64 -0
- data/spec/mongo/connection_string_spec.rb +115 -0
- data/spec/mongo/cursor/builder/get_more_command_spec.rb +160 -0
- data/spec/mongo/cursor/builder/op_get_more_spec.rb +52 -0
- data/spec/mongo/cursor_spec.rb +10 -60
- data/spec/mongo/database_spec.rb +81 -12
- data/spec/mongo/dbref_spec.rb +4 -4
- data/spec/mongo/grid/file/chunk_spec.rb +6 -6
- 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/index/view_spec.rb +41 -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/operation/{aggregate → commands/aggregate}/result_spec.rb +1 -1
- 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} +1 -19
- 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/result_spec.rb +19 -0
- data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +17 -28
- data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +1 -12
- data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +7 -18
- data/spec/mongo/operation/write/command/delete_spec.rb +18 -9
- data/spec/mongo/operation/write/command/insert_spec.rb +18 -9
- data/spec/mongo/operation/write/command/update_spec.rb +18 -9
- data/spec/mongo/operation/write/delete_spec.rb +3 -3
- data/spec/mongo/operation/write/insert_spec.rb +0 -11
- data/spec/mongo/operation/write/update_spec.rb +6 -6
- data/spec/mongo/options/redacted_spec.rb +350 -0
- data/spec/mongo/protocol/delete_spec.rb +4 -4
- data/spec/mongo/protocol/get_more_spec.rb +4 -4
- data/spec/mongo/protocol/insert_spec.rb +3 -3
- data/spec/mongo/protocol/kill_cursors_spec.rb +8 -6
- data/spec/mongo/protocol/query_spec.rb +21 -7
- data/spec/mongo/protocol/update_spec.rb +5 -5
- data/spec/mongo/retryable_spec.rb +221 -0
- data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
- data/spec/mongo/server/connection_pool_spec.rb +42 -6
- data/spec/mongo/server/connection_spec.rb +86 -1
- data/spec/mongo/server/description/features_spec.rb +25 -0
- data/spec/mongo/server/description_spec.rb +42 -0
- data/spec/mongo/server/monitor_spec.rb +44 -0
- data/spec/mongo/server_discovery_and_monitoring_spec.rb +25 -59
- data/spec/mongo/server_selection_rtt_spec.rb +37 -57
- data/spec/mongo/server_selection_spec.rb +5 -3
- 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 +78 -15
- data/spec/mongo/socket/ssl_spec.rb +101 -57
- data/spec/mongo/socket/unix_spec.rb +52 -0
- data/spec/mongo/uri_spec.rb +271 -59
- data/spec/mongo/write_concern_spec.rb +126 -0
- data/spec/spec_helper.rb +29 -23
- data/spec/support/authorization.rb +4 -5
- 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 +268 -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 +373 -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 +14 -10
- data/spec/support/crud/write.rb +36 -9
- 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 +2 -2
- data/spec/support/sdam/rs/equal_electionids.yml +1 -2
- data/spec/support/sdam/rs/new_primary_new_electionid.yml +0 -3
- 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/rsother_discovered.yml +24 -3
- data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
- data/spec/support/sdam/rs/stepdown_change_set_name.yml +59 -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 +3 -1
- data/spec/support/server_selection.rb +3 -1
- data/spec/support/shared/bulk_write.rb +192 -0
- data/spec/support/shared/protocol.rb +5 -5
- data/spec/support/shared/server_selector.rb +78 -13
- data/spec/support/travis.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +211 -72
- metadata.gz.sig +0 -0
- data/lib/mongo/bulk_write/bulk_writable.rb +0 -252
- data/lib/mongo/bulk_write/deletable.rb +0 -57
- data/lib/mongo/bulk_write/insertable.rb +0 -49
- data/lib/mongo/bulk_write/replacable.rb +0 -58
- data/lib/mongo/bulk_write/updatable.rb +0 -69
- data/lib/mongo/grid/fs.rb +0 -146
- data/lib/mongo/operation/aggregate/result.rb +0 -103
- data/lib/mongo/operation/aggregate.rb +0 -108
- data/lib/mongo/operation/command.rb +0 -61
- data/lib/mongo/operation/map_reduce/result.rb +0 -122
- data/lib/mongo/operation/map_reduce.rb +0 -95
- data/lib/mongo/operation/parallel_scan/result.rb +0 -72
- data/lib/mongo/operation/parallel_scan.rb +0 -76
- 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 -174
- 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/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/server/monitor.rb
CHANGED
@@ -35,16 +35,6 @@ module Mongo
|
|
35
35
|
# @since 2.0.0
|
36
36
|
MIN_SCAN_FREQUENCY = 0.5.freeze
|
37
37
|
|
38
|
-
# The command used for determining server status.
|
39
|
-
#
|
40
|
-
# @since 2.0.0
|
41
|
-
STATUS = { :ismaster => 1 }.freeze
|
42
|
-
|
43
|
-
# The constant for the ismaster command.
|
44
|
-
#
|
45
|
-
# @since 2.0.0
|
46
|
-
ISMASTER = Protocol::Query.new(Database::ADMIN, Database::COMMAND, STATUS, :limit => -1)
|
47
|
-
|
48
38
|
# The weighting factor (alpha) for calculating the average moving round trip time.
|
49
39
|
#
|
50
40
|
# @since 2.0.0
|
@@ -140,7 +130,7 @@ module Mongo
|
|
140
130
|
#
|
141
131
|
# @since 2.0.0
|
142
132
|
def stop!
|
143
|
-
@thread.kill && @thread.stop?
|
133
|
+
connection.disconnect! && @thread.kill && @thread.stop?
|
144
134
|
end
|
145
135
|
|
146
136
|
# Restarts the server monitor unless the current thread is alive.
|
@@ -170,10 +160,9 @@ module Mongo
|
|
170
160
|
@mutex.synchronize do
|
171
161
|
start = Time.now
|
172
162
|
begin
|
173
|
-
|
174
|
-
return result, calculate_average_round_trip_time(start)
|
163
|
+
return connection.ismaster, calculate_average_round_trip_time(start)
|
175
164
|
rescue Exception => e
|
176
|
-
log_debug(
|
165
|
+
log_debug(e.message)
|
177
166
|
return {}, calculate_average_round_trip_time(start)
|
178
167
|
end
|
179
168
|
end
|
data/lib/mongo/server.rb
CHANGED
@@ -92,6 +92,21 @@ module Mongo
|
|
92
92
|
Context.new(self)
|
93
93
|
end
|
94
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
|
+
|
95
110
|
# Disconnect the server from the connection.
|
96
111
|
#
|
97
112
|
# @example Disconnect the server.
|
@@ -101,12 +116,23 @@ module Mongo
|
|
101
116
|
#
|
102
117
|
# @since 2.0.0
|
103
118
|
def disconnect!
|
104
|
-
|
105
|
-
connection.disconnect!
|
106
|
-
end
|
119
|
+
pool.disconnect!
|
107
120
|
monitor.stop! and true
|
108
121
|
end
|
109
122
|
|
123
|
+
# When the server is flagged for garbage collection, stop the monitor
|
124
|
+
# thread.
|
125
|
+
#
|
126
|
+
# @example Finalize the object.
|
127
|
+
# Server.finalize(monitor)
|
128
|
+
#
|
129
|
+
# @param [ Server::Monitor ] monitor The server monitor.
|
130
|
+
#
|
131
|
+
# @since 2.2.0
|
132
|
+
def self.finalize(monitor)
|
133
|
+
proc { monitor.stop! }
|
134
|
+
end
|
135
|
+
|
110
136
|
# Instantiate a new server object. Will start the background refresh and
|
111
137
|
# subscribe to the appropriate events.
|
112
138
|
#
|
@@ -132,6 +158,7 @@ module Mongo
|
|
132
158
|
@monitor = Monitor.new(address, event_listeners, options)
|
133
159
|
monitor.scan!
|
134
160
|
monitor.run!
|
161
|
+
ObjectSpace.define_finalizer(self, self.class.finalize(monitor))
|
135
162
|
end
|
136
163
|
|
137
164
|
# Get a pretty printed server inspection.
|
@@ -155,7 +182,7 @@ module Mongo
|
|
155
182
|
#
|
156
183
|
# @since 2.0.0
|
157
184
|
def pool
|
158
|
-
@pool ||=
|
185
|
+
@pool ||= cluster.pool(self)
|
159
186
|
end
|
160
187
|
|
161
188
|
# Determine if the provided tags are a subset of the server's tags.
|
@@ -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,42 @@ 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
|
-
|
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
|
68
|
+
end
|
69
|
+
|
70
|
+
# Inspect the server selector.
|
71
|
+
#
|
72
|
+
# @example Inspect the server selector.
|
73
|
+
# selector.inspect
|
74
|
+
#
|
75
|
+
# @return [ String ] The inspection.
|
76
|
+
#
|
77
|
+
# @since 2.2.0
|
78
|
+
def inspect
|
79
|
+
"#<#{self.class.name}:0x#{object_id} tag_sets=#{tag_sets.inspect} " +
|
80
|
+
"server_selection_timeout=#{server_selection_timeout} local_threshold=#{local_threshold}>"
|
74
81
|
end
|
75
82
|
|
76
83
|
# Select a server from eligible candidates.
|
@@ -83,17 +90,20 @@ module Mongo
|
|
83
90
|
# @return [ Mongo::Server ] A server matching the server preference.
|
84
91
|
#
|
85
92
|
# @since 2.0.0
|
86
|
-
def select_server(cluster)
|
93
|
+
def select_server(cluster, ping = true)
|
87
94
|
deadline = Time.now + server_selection_timeout
|
88
95
|
while (deadline - Time.now) > 0
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
96
|
+
servers = candidates(cluster)
|
97
|
+
if servers && !servers.compact.empty?
|
98
|
+
server = servers.first
|
99
|
+
# There is no point pinging a standalone as the subsequent scan is
|
100
|
+
# not going to change anything about the cluster.
|
101
|
+
if ping && !cluster.single?
|
102
|
+
return server if server.connectable?
|
103
|
+
else
|
104
|
+
return server
|
105
|
+
end
|
95
106
|
end
|
96
|
-
return servers.first if servers && !servers.compact.empty?
|
97
107
|
cluster.scan!
|
98
108
|
end
|
99
109
|
raise Error::NoServerAvailable.new(self)
|
@@ -109,7 +119,7 @@ module Mongo
|
|
109
119
|
# @since 2.0.0
|
110
120
|
def server_selection_timeout
|
111
121
|
@server_selection_timeout ||=
|
112
|
-
(options[:server_selection_timeout] || SERVER_SELECTION_TIMEOUT)
|
122
|
+
(options[:server_selection_timeout] || ServerSelector::SERVER_SELECTION_TIMEOUT)
|
113
123
|
end
|
114
124
|
|
115
125
|
# Get the local threshold boundary for nearest selection in seconds.
|
@@ -121,11 +131,21 @@ module Mongo
|
|
121
131
|
#
|
122
132
|
# @since 2.0.0
|
123
133
|
def local_threshold
|
124
|
-
@local_threshold ||= (options[:local_threshold] || LOCAL_THRESHOLD)
|
134
|
+
@local_threshold ||= (options[:local_threshold] || ServerSelector::LOCAL_THRESHOLD)
|
125
135
|
end
|
126
136
|
|
127
137
|
private
|
128
138
|
|
139
|
+
def candidates(cluster)
|
140
|
+
if cluster.single?
|
141
|
+
cluster.servers
|
142
|
+
elsif cluster.sharded?
|
143
|
+
near_servers(cluster.servers)
|
144
|
+
else
|
145
|
+
select(cluster.servers)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
129
149
|
# Select the primary from a list of provided candidates.
|
130
150
|
#
|
131
151
|
# @param [ Array ] candidates List of candidate servers to select the
|
@@ -186,6 +206,12 @@ module Mongo
|
|
186
206
|
end
|
187
207
|
matches || []
|
188
208
|
end
|
209
|
+
|
210
|
+
def validate_tag_sets!(tag_sets)
|
211
|
+
if !tag_sets.all? { |set| set.empty? } && !tags_allowed?
|
212
|
+
raise Error::InvalidServerPreference.new(name)
|
213
|
+
end
|
214
|
+
end
|
189
215
|
end
|
190
216
|
end
|
191
217
|
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
data/lib/mongo/socket/tcp.rb
CHANGED
@@ -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
|
-
handle_errors { 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
|