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.
Files changed (317) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +5 -2
  3. data/lib/mongo/address/ipv4.rb +6 -1
  4. data/lib/mongo/address/unix.rb +2 -2
  5. data/lib/mongo/address.rb +18 -10
  6. data/lib/mongo/auth/cr/conversation.rb +1 -1
  7. data/lib/mongo/auth/ldap/conversation.rb +7 -3
  8. data/lib/mongo/auth/scram/conversation.rb +9 -3
  9. data/lib/mongo/auth/user/view.rb +23 -2
  10. data/lib/mongo/auth/x509/conversation.rb +1 -1
  11. data/lib/mongo/bulk_write/combineable.rb +51 -0
  12. data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
  13. data/lib/mongo/bulk_write/result.rb +191 -0
  14. data/lib/mongo/bulk_write/result_combiner.rb +117 -0
  15. data/lib/mongo/bulk_write/transformable.rb +132 -0
  16. data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
  17. data/lib/mongo/bulk_write/validatable.rb +62 -0
  18. data/lib/mongo/bulk_write.rb +159 -23
  19. data/lib/mongo/client.rb +52 -16
  20. data/lib/mongo/cluster/topology/replica_set.rb +27 -9
  21. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  22. data/lib/mongo/cluster/topology/unknown.rb +5 -2
  23. data/lib/mongo/cluster.rb +42 -7
  24. data/lib/mongo/collection/view/aggregation.rb +48 -9
  25. data/lib/mongo/collection/view/immutable.rb +6 -6
  26. data/lib/mongo/collection/view/iterable.rb +18 -4
  27. data/lib/mongo/collection/view/map_reduce.rb +58 -17
  28. data/lib/mongo/collection/view/readable.rb +173 -42
  29. data/lib/mongo/collection/view/writable.rb +37 -23
  30. data/lib/mongo/collection/view.rb +2 -2
  31. data/lib/mongo/collection.rb +370 -33
  32. data/lib/mongo/cursor.rb +15 -3
  33. data/lib/mongo/database/view.rb +5 -4
  34. data/lib/mongo/database.rb +14 -4
  35. data/lib/mongo/dbref.rb +113 -0
  36. data/lib/mongo/error/closed_stream.rb +34 -0
  37. data/lib/mongo/error/extra_file_chunk.rb +34 -0
  38. data/lib/mongo/error/{invalid_uri_option.rb → file_not_found.rb} +11 -12
  39. data/lib/mongo/error/invalid_file.rb +2 -2
  40. data/lib/mongo/error/invalid_file_revision.rb +37 -0
  41. data/lib/mongo/error/invalid_uri.rb +5 -4
  42. data/lib/mongo/error/missing_file_chunk.rb +38 -0
  43. data/lib/mongo/error/operation_failure.rb +1 -1
  44. data/lib/mongo/error/parser.rb +1 -1
  45. data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
  46. data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
  47. data/lib/mongo/error.rb +13 -2
  48. data/lib/mongo/event/description_changed.rb +1 -1
  49. data/lib/mongo/grid/file/chunk.rb +6 -6
  50. data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
  51. data/lib/mongo/grid/file.rb +13 -10
  52. data/lib/mongo/grid/fs_bucket.rb +448 -0
  53. data/lib/mongo/grid/stream/read.rb +208 -0
  54. data/lib/mongo/grid/stream/write.rb +187 -0
  55. data/lib/mongo/grid/stream.rb +64 -0
  56. data/lib/mongo/grid.rb +2 -1
  57. data/lib/mongo/index/view.rb +3 -3
  58. data/lib/mongo/index.rb +5 -0
  59. data/lib/mongo/loggable.rb +34 -57
  60. data/lib/mongo/logger.rb +16 -78
  61. data/lib/mongo/monitoring/command_log_subscriber.rb +112 -0
  62. data/lib/mongo/monitoring/event/command_failed.rb +96 -0
  63. data/lib/mongo/monitoring/event/command_started.rb +89 -0
  64. data/lib/mongo/monitoring/event/command_succeeded.rb +118 -0
  65. data/lib/mongo/monitoring/event/secure.rb +58 -0
  66. data/lib/mongo/monitoring/event.rb +18 -0
  67. data/lib/mongo/monitoring/publishable.rb +106 -0
  68. data/lib/mongo/monitoring.rb +195 -0
  69. data/lib/mongo/operation/{aggregate.rb → commands/aggregate.rb} +3 -41
  70. data/lib/mongo/operation/commands/collections_info/result.rb +39 -0
  71. data/lib/mongo/operation/commands/collections_info.rb +68 -0
  72. data/lib/mongo/operation/{command.rb → commands/command.rb} +2 -18
  73. data/lib/mongo/operation/commands/indexes.rb +70 -0
  74. data/lib/mongo/operation/commands/list_collections/result.rb +112 -0
  75. data/lib/mongo/operation/commands/list_collections.rb +54 -0
  76. data/lib/mongo/operation/commands/list_indexes/result.rb +116 -0
  77. data/lib/mongo/operation/commands/list_indexes.rb +56 -0
  78. data/lib/mongo/operation/{map_reduce → commands/map_reduce}/result.rb +1 -1
  79. data/lib/mongo/operation/{map_reduce.rb → commands/map_reduce.rb} +3 -41
  80. data/lib/mongo/operation/commands/parallel_scan/result.rb +72 -0
  81. data/lib/mongo/operation/commands/parallel_scan.rb +56 -0
  82. data/lib/mongo/operation/commands/user_query.rb +69 -0
  83. data/lib/mongo/{bulk_write/ordered_bulk_write.rb → operation/commands/users_info/result.rb} +18 -30
  84. data/lib/mongo/operation/commands/users_info.rb +53 -0
  85. data/lib/mongo/operation/commands.rb +24 -0
  86. data/lib/mongo/operation/executable.rb +4 -68
  87. data/lib/mongo/operation/kill_cursors.rb +3 -3
  88. data/lib/mongo/operation/read/get_more.rb +2 -22
  89. data/lib/mongo/{bulk_write/unordered_bulk_write.rb → operation/read/query/result.rb} +20 -26
  90. data/lib/mongo/operation/read/query.rb +4 -21
  91. data/lib/mongo/operation/read.rb +0 -4
  92. data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
  93. data/lib/mongo/operation/result.rb +13 -1
  94. data/lib/mongo/operation/specifiable.rb +42 -0
  95. data/lib/mongo/operation/write/bulk/bulkable.rb +82 -0
  96. data/lib/mongo/operation/write/bulk/delete/result.rb +74 -0
  97. data/lib/mongo/operation/write/bulk/delete.rb +71 -0
  98. data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
  99. data/lib/mongo/operation/write/bulk/insert.rb +96 -0
  100. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
  101. data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
  102. data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
  103. data/lib/mongo/operation/write/bulk/update.rb +81 -0
  104. data/lib/mongo/operation/write/bulk.rb +6 -3
  105. data/lib/mongo/operation/write/command/create_index.rb +0 -1
  106. data/lib/mongo/operation/write/command/create_user.rb +0 -1
  107. data/lib/mongo/operation/write/command/delete.rb +0 -1
  108. data/lib/mongo/operation/write/command/drop_index.rb +0 -1
  109. data/lib/mongo/operation/write/command/insert.rb +0 -1
  110. data/lib/mongo/operation/write/command/remove_user.rb +0 -1
  111. data/lib/mongo/operation/write/command/update.rb +0 -1
  112. data/lib/mongo/operation/write/command/update_user.rb +0 -1
  113. data/lib/mongo/operation/write/command/writable.rb +13 -18
  114. data/lib/mongo/operation/write/create_index.rb +4 -27
  115. data/lib/mongo/operation/write/create_user.rb +4 -30
  116. data/lib/mongo/operation/write/delete.rb +6 -29
  117. data/lib/mongo/operation/write/drop_index.rb +3 -3
  118. data/lib/mongo/operation/write/gle.rb +48 -0
  119. data/lib/mongo/operation/write/idable.rb +5 -0
  120. data/lib/mongo/operation/write/insert.rb +2 -24
  121. data/lib/mongo/operation/write/remove_user.rb +4 -27
  122. data/lib/mongo/operation/write/update.rb +13 -36
  123. data/lib/mongo/operation/write/update_user.rb +4 -30
  124. data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
  125. data/lib/mongo/operation/write.rb +2 -0
  126. data/lib/mongo/operation.rb +32 -4
  127. data/lib/mongo/options/mapper.rb +4 -2
  128. data/lib/mongo/options/redacted.rb +156 -0
  129. data/lib/mongo/options.rb +1 -0
  130. data/lib/mongo/protocol/delete.rb +75 -15
  131. data/lib/mongo/protocol/get_more.rb +65 -13
  132. data/lib/mongo/protocol/insert.rb +85 -13
  133. data/lib/mongo/protocol/kill_cursors.rb +59 -14
  134. data/lib/mongo/protocol/message.rb +12 -12
  135. data/lib/mongo/protocol/query.rb +163 -37
  136. data/lib/mongo/protocol/reply.rb +103 -0
  137. data/lib/mongo/protocol/serializers.rb +1 -1
  138. data/lib/mongo/protocol/update.rb +82 -14
  139. data/lib/mongo/retryable.rb +83 -0
  140. data/lib/mongo/server/connectable.rb +21 -25
  141. data/lib/mongo/server/connection.rb +75 -4
  142. data/lib/mongo/server/connection_pool/queue.rb +15 -0
  143. data/lib/mongo/server/connection_pool.rb +12 -0
  144. data/lib/mongo/server/description/features.rb +2 -1
  145. data/lib/mongo/server/description.rb +52 -1
  146. data/lib/mongo/server/monitor/connection.rb +26 -2
  147. data/lib/mongo/server/monitor.rb +19 -3
  148. data/lib/mongo/server.rb +39 -5
  149. data/lib/mongo/server_selector/selectable.rb +40 -31
  150. data/lib/mongo/server_selector.rb +19 -10
  151. data/lib/mongo/socket/ssl.rb +28 -16
  152. data/lib/mongo/socket/tcp.rb +3 -3
  153. data/lib/mongo/socket/unix.rb +5 -8
  154. data/lib/mongo/socket.rb +11 -4
  155. data/lib/mongo/uri.rb +248 -137
  156. data/lib/mongo/version.rb +1 -1
  157. data/lib/mongo.rb +5 -3
  158. data/spec/mongo/address/unix_spec.rb +1 -1
  159. data/spec/mongo/address_spec.rb +25 -0
  160. data/spec/mongo/auth/cr_spec.rb +9 -1
  161. data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
  162. data/spec/mongo/auth/ldap_spec.rb +9 -1
  163. data/spec/mongo/auth/scram_spec.rb +9 -1
  164. data/spec/mongo/auth/user/view_spec.rb +26 -1
  165. data/spec/mongo/auth/x509_spec.rb +9 -1
  166. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +271 -0
  167. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
  168. data/spec/mongo/bulk_write_spec.rb +428 -0
  169. data/spec/mongo/client_spec.rb +167 -17
  170. data/spec/mongo/cluster/topology/replica_set_spec.rb +18 -9
  171. data/spec/mongo/cluster/topology/sharded_spec.rb +11 -3
  172. data/spec/mongo/cluster/topology/single_spec.rb +12 -4
  173. data/spec/mongo/cluster_spec.rb +55 -10
  174. data/spec/mongo/collection/view/aggregation_spec.rb +188 -1
  175. data/spec/mongo/collection/view/explainable_spec.rb +1 -1
  176. data/spec/mongo/collection/view/immutable_spec.rb +103 -0
  177. data/spec/mongo/collection/view/map_reduce_spec.rb +99 -4
  178. data/spec/mongo/collection/view/readable_spec.rb +238 -6
  179. data/spec/mongo/collection/view/writable_spec.rb +4 -4
  180. data/spec/mongo/collection/view_spec.rb +459 -71
  181. data/spec/mongo/collection_spec.rb +1291 -9
  182. data/spec/mongo/command_monitoring_spec.rb +51 -0
  183. data/spec/mongo/connection_string_spec.rb +115 -0
  184. data/spec/mongo/crud_spec.rb +2 -2
  185. data/spec/mongo/cursor_spec.rb +3 -3
  186. data/spec/mongo/database_spec.rb +47 -11
  187. data/spec/mongo/dbref_spec.rb +149 -0
  188. data/spec/mongo/grid/file/chunk_spec.rb +5 -5
  189. data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
  190. data/spec/mongo/grid/file_spec.rb +8 -8
  191. data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
  192. data/spec/mongo/grid/stream/read_spec.rb +275 -0
  193. data/spec/mongo/grid/stream/write_spec.rb +440 -0
  194. data/spec/mongo/grid/stream_spec.rb +48 -0
  195. data/spec/mongo/gridfs_spec.rb +50 -0
  196. data/spec/mongo/logger_spec.rb +0 -40
  197. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
  198. data/spec/mongo/monitoring/event/command_started_spec.rb +26 -0
  199. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +26 -0
  200. data/spec/mongo/monitoring/event/secure_spec.rb +57 -0
  201. data/spec/mongo/monitoring_spec.rb +168 -0
  202. data/spec/mongo/operation/commands/aggregate_spec.rb +69 -0
  203. data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
  204. data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +0 -18
  205. data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
  206. data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +1 -19
  207. data/spec/mongo/operation/kill_cursors_spec.rb +1 -17
  208. data/spec/mongo/operation/read/get_more_spec.rb +0 -16
  209. data/spec/mongo/operation/read/query_spec.rb +19 -16
  210. data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
  211. data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +18 -29
  212. data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +3 -14
  213. data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +8 -19
  214. data/spec/mongo/operation/write/command/delete_spec.rb +0 -16
  215. data/spec/mongo/operation/write/command/insert_spec.rb +0 -16
  216. data/spec/mongo/operation/write/command/update_spec.rb +0 -16
  217. data/spec/mongo/operation/write/delete_spec.rb +4 -4
  218. data/spec/mongo/operation/write/insert_spec.rb +2 -13
  219. data/spec/mongo/operation/write/update_spec.rb +7 -7
  220. data/spec/mongo/options/redacted_spec.rb +350 -0
  221. data/spec/mongo/protocol/kill_cursors_spec.rb +5 -3
  222. data/spec/mongo/protocol/query_spec.rb +15 -30
  223. data/spec/mongo/retryable_spec.rb +147 -0
  224. data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
  225. data/spec/mongo/server/connection_pool_spec.rb +50 -6
  226. data/spec/mongo/server/connection_spec.rb +49 -4
  227. data/spec/mongo/server/description_spec.rb +49 -3
  228. data/spec/mongo/server/monitor_spec.rb +51 -0
  229. data/spec/mongo/server_discovery_and_monitoring_spec.rb +32 -59
  230. data/spec/mongo/server_selection_rtt_spec.rb +37 -57
  231. data/spec/mongo/server_selection_spec.rb +19 -9
  232. data/spec/mongo/server_selector/nearest_spec.rb +35 -27
  233. data/spec/mongo/server_selector/primary_preferred_spec.rb +32 -30
  234. data/spec/mongo/server_selector/primary_spec.rb +21 -14
  235. data/spec/mongo/server_selector/secondary_preferred_spec.rb +28 -26
  236. data/spec/mongo/server_selector/secondary_spec.rb +24 -22
  237. data/spec/mongo/server_selector_spec.rb +87 -24
  238. data/spec/mongo/server_spec.rb +94 -8
  239. data/spec/mongo/socket/ssl_spec.rb +123 -13
  240. data/spec/mongo/socket/unix_spec.rb +52 -0
  241. data/spec/mongo/uri_spec.rb +295 -67
  242. data/spec/spec_helper.rb +40 -24
  243. data/spec/support/authorization.rb +23 -9
  244. data/spec/support/certificates/client.pem +4 -4
  245. data/spec/support/command_monitoring/bulkWrite.yml +73 -0
  246. data/spec/support/command_monitoring/command.yml +42 -0
  247. data/spec/support/command_monitoring/deleteMany.yml +55 -0
  248. data/spec/support/command_monitoring/deleteOne.yml +55 -0
  249. data/spec/support/command_monitoring/find.yml +219 -0
  250. data/spec/support/command_monitoring/insertMany.yml +81 -0
  251. data/spec/support/command_monitoring/insertOne.yml +51 -0
  252. data/spec/support/command_monitoring/updateMany.yml +67 -0
  253. data/spec/support/command_monitoring/updateOne.yml +95 -0
  254. data/spec/support/command_monitoring.rb +365 -0
  255. data/spec/support/connection_string.rb +228 -0
  256. data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
  257. data/spec/support/connection_string_tests/valid-auth.yml +256 -0
  258. data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
  259. data/spec/support/connection_string_tests/valid-options.yml +30 -0
  260. data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
  261. data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
  262. data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
  263. data/spec/support/crud/read.rb +22 -19
  264. data/spec/support/crud/write.rb +58 -27
  265. data/spec/support/crud.rb +10 -2
  266. data/spec/support/gridfs.rb +637 -0
  267. data/spec/support/gridfs_tests/delete.yml +157 -0
  268. data/spec/support/gridfs_tests/download.yml +210 -0
  269. data/spec/support/gridfs_tests/download_by_name.yml +113 -0
  270. data/spec/support/gridfs_tests/upload.yml +158 -0
  271. data/spec/support/matchers.rb +1 -1
  272. data/spec/support/sdam/rs/equal_electionids.yml +44 -0
  273. data/spec/support/sdam/rs/new_primary_new_electionid.yml +95 -0
  274. data/spec/support/sdam/rs/null_election_id.yml +144 -0
  275. data/spec/support/sdam/rs/primary_disconnect_electionid.yml +124 -0
  276. data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
  277. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
  278. data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
  279. data/spec/support/sdam/sharded/mongos_disconnect.yml +104 -0
  280. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  281. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  282. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  283. data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
  284. data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
  285. data/spec/support/sdam/single/not_ok_response.yml +0 -1
  286. data/spec/support/server_discovery_and_monitoring.rb +22 -3
  287. data/spec/support/server_selection.rb +3 -1
  288. data/spec/support/shared/bulk_write.rb +218 -22
  289. data/spec/support/shared/server_selector.rb +80 -14
  290. data.tar.gz.sig +0 -0
  291. metadata +188 -59
  292. metadata.gz.sig +0 -0
  293. data/lib/mongo/bulk_write/bulk_writable.rb +0 -196
  294. data/lib/mongo/bulk_write/deletable.rb +0 -56
  295. data/lib/mongo/bulk_write/insertable.rb +0 -48
  296. data/lib/mongo/bulk_write/replacable.rb +0 -57
  297. data/lib/mongo/bulk_write/updatable.rb +0 -68
  298. data/lib/mongo/grid/fs.rb +0 -149
  299. data/lib/mongo/operation/list_collections/result.rb +0 -114
  300. data/lib/mongo/operation/list_indexes/result.rb +0 -118
  301. data/lib/mongo/operation/read/collections_info.rb +0 -68
  302. data/lib/mongo/operation/read/indexes.rb +0 -69
  303. data/lib/mongo/operation/read/list_collections.rb +0 -76
  304. data/lib/mongo/operation/read/list_indexes.rb +0 -78
  305. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
  306. data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
  307. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
  308. data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
  309. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
  310. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -162
  311. data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
  312. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
  313. data/spec/mongo/bulk/bulk_write_spec.rb +0 -262
  314. data/spec/mongo/grid/fs_spec.rb +0 -160
  315. data/spec/mongo/loggable_spec.rb +0 -63
  316. data/spec/mongo/operation/aggregate_spec.rb +0 -127
  317. /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
- context.with_connection do |connection|
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 preference with tag sets.
57
- # Mongo::ServerSelector::Secondary.new([{ 'tag' => 'set' }])
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 [ Array ] tag_sets The tag sets used to select servers.
51
+ # @param [ Hash ] options The server preference options.
63
52
  #
64
- # @todo: document specific error
65
- # @raise [ Exception ] If tag sets are specified but not allowed.
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(tag_sets = [], options = {})
69
- if !tag_sets.all? { |set| set.empty? } && !tags_allowed?
70
- raise Error::InvalidServerPreference.new(name)
71
- end
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
- if cluster.single?
90
- servers = cluster.servers
91
- elsif cluster.sharded?
92
- servers = near_servers(cluster.servers)
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({ :mode => :secondary, :tag_sets => [{'dc' => 'nyc'}] })
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 = {}, options = {})
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
@@ -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
- context.cert = OpenSSL::X509::Certificate.new(File.open(options[:ssl_cert]))
105
- end
106
- if options[:ssl_key]
107
- if options[:ssl_key_pass_phrase]
108
- context.key = OpenSSL::PKey::RSA.new(File.open(options[:ssl_key]),
109
- options[:ssl_key_pass_phrase])
110
- else
111
- context.key = OpenSSL::PKey::RSA.new(File.open(options[:ssl_key]))
112
- end
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
- if options[:ssl_verify] || options[:ssl_ca_cert]
115
- context.ca_file = options[:ssl_ca_cert]
116
- context.verify_mode = OpenSSL::SSL::VERIFY_PEER
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)
@@ -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.
@@ -38,25 +38,22 @@ module Mongo
38
38
  #
39
39
  # @since 2.0.0
40
40
  def connect!
41
- Timeout.timeout(timeout, Error::SocketTimeoutError) do
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', 27017, 30)
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, family)
53
+ def initialize(path, timeout)
58
54
  @path, @timeout = path, timeout
59
- super(family)
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
- # @since 2.0.0
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
- sock.setsockopt(SOL_SOCKET, SO_RCVTIMEO, encoded_timeout)
179
- sock.setsockopt(SOL_SOCKET, SO_SNDTIMEO, encoded_timeout)
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