mongo 1.12.5 → 2.0.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 (475) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CONTRIBUTING.md +64 -0
  4. data/LICENSE +1 -1
  5. data/README.md +21 -126
  6. data/Rakefile +39 -21
  7. data/bin/mongo_console +6 -38
  8. data/lib/mongo/address/ipv4.rb +85 -0
  9. data/lib/mongo/address/ipv6.rb +85 -0
  10. data/lib/mongo/address/unix.rb +76 -0
  11. data/lib/mongo/address.rb +111 -0
  12. data/lib/mongo/auth/cr/conversation.rb +119 -0
  13. data/lib/mongo/auth/cr.rb +44 -0
  14. data/lib/mongo/auth/executable.rb +52 -0
  15. data/lib/mongo/auth/ldap/conversation.rb +92 -0
  16. data/lib/mongo/auth/ldap.rb +48 -0
  17. data/lib/mongo/auth/roles.rb +104 -0
  18. data/lib/mongo/auth/scram/conversation.rb +450 -0
  19. data/lib/mongo/auth/scram.rb +53 -0
  20. data/lib/mongo/auth/user/view.rb +102 -0
  21. data/lib/mongo/auth/user.rb +159 -0
  22. data/lib/mongo/auth/x509/conversation.rb +92 -0
  23. data/lib/mongo/auth/x509.rb +48 -0
  24. data/lib/mongo/auth.rb +108 -0
  25. data/lib/mongo/bulk_write/bulk_writable.rb +191 -0
  26. data/lib/mongo/bulk_write/deletable.rb +60 -0
  27. data/lib/mongo/bulk_write/insertable.rb +52 -0
  28. data/lib/mongo/bulk_write/ordered_bulk_write.rb +48 -0
  29. data/lib/mongo/bulk_write/replacable.rb +57 -0
  30. data/lib/mongo/bulk_write/unordered_bulk_write.rb +46 -0
  31. data/lib/mongo/bulk_write/updatable.rb +68 -0
  32. data/lib/mongo/bulk_write.rb +52 -0
  33. data/lib/mongo/client.rb +246 -0
  34. data/lib/mongo/cluster/topology/replica_set.rb +160 -0
  35. data/lib/mongo/cluster/topology/sharded.rb +132 -0
  36. data/lib/mongo/cluster/topology/standalone.rb +132 -0
  37. data/lib/mongo/cluster/topology/unknown.rb +155 -0
  38. data/lib/mongo/cluster/topology.rb +60 -0
  39. data/lib/mongo/cluster.rb +203 -0
  40. data/lib/mongo/collection/view/aggregation.rb +108 -0
  41. data/lib/mongo/collection/view/explainable.rb +49 -0
  42. data/lib/mongo/collection/view/immutable.rb +43 -0
  43. data/lib/mongo/collection/view/iterable.rb +48 -0
  44. data/lib/mongo/collection/view/map_reduce.rb +191 -0
  45. data/lib/mongo/collection/view/readable.rb +363 -0
  46. data/lib/mongo/collection/view/writable.rb +185 -0
  47. data/lib/mongo/collection/view.rb +169 -0
  48. data/lib/mongo/collection.rb +130 -1101
  49. data/lib/mongo/cursor.rb +78 -681
  50. data/lib/mongo/database/view.rb +101 -0
  51. data/lib/mongo/database.rb +224 -0
  52. data/lib/mongo/error/bulk_write_error.rb +41 -0
  53. data/lib/mongo/error/invalid_bulk_operation.rb +36 -0
  54. data/lib/mongo/error/invalid_bulk_operation_type.rb +36 -0
  55. data/lib/mongo/error/invalid_collection_name.rb +39 -0
  56. data/lib/mongo/error/invalid_database_name.rb +39 -0
  57. data/{test/replica_set/ssl_test.rb → lib/mongo/error/invalid_document.rb} +21 -14
  58. data/lib/mongo/error/invalid_file.rb +38 -0
  59. data/lib/mongo/error/invalid_nonce.rb +46 -0
  60. data/lib/mongo/error/invalid_replacement_document.rb +39 -0
  61. data/lib/mongo/error/invalid_signature.rb +47 -0
  62. data/{test/functional/ssl_test.rb → lib/mongo/error/invalid_update_document.rb} +22 -12
  63. data/lib/mongo/error/max_bson_size.rb +40 -0
  64. data/lib/mongo/error/max_message_size.rb +42 -0
  65. data/{test/functional/db_connection_test.rb → lib/mongo/error/multi_index_drop.rb} +17 -8
  66. data/lib/mongo/{utils.rb → error/need_primary_server.rb} +10 -6
  67. data/lib/mongo/{connection.rb → error/operation_failure.rb} +10 -6
  68. data/lib/mongo/error/parser.rb +77 -0
  69. data/lib/mongo/{connection/socket.rb → error/socket_error.rb} +10 -5
  70. data/lib/mongo/error/socket_timeout_error.rb +23 -0
  71. data/lib/mongo/error/unsupported_features.rb +43 -0
  72. data/lib/mongo/error.rb +82 -0
  73. data/lib/mongo/event/listeners.rb +63 -0
  74. data/lib/mongo/event/primary_elected.rb +53 -0
  75. data/lib/mongo/event/publisher.rb +42 -0
  76. data/lib/mongo/event/server_added.rb +53 -0
  77. data/lib/mongo/event/server_removed.rb +53 -0
  78. data/lib/mongo/event/subscriber.rb +41 -0
  79. data/lib/mongo/event.rb +40 -0
  80. data/lib/mongo/grid/file/chunk.rb +184 -0
  81. data/lib/mongo/grid/file/metadata.rb +229 -0
  82. data/lib/mongo/grid/file.rb +106 -0
  83. data/lib/mongo/grid/fs.rb +149 -0
  84. data/lib/mongo/{gridfs.rb → grid.rb} +3 -5
  85. data/lib/mongo/index/view.rb +261 -0
  86. data/lib/mongo/index.rb +64 -0
  87. data/lib/mongo/loggable.rb +126 -0
  88. data/lib/mongo/logger.rb +132 -0
  89. data/lib/mongo/operation/aggregate/result.rb +88 -0
  90. data/lib/mongo/operation/aggregate.rb +100 -0
  91. data/lib/mongo/operation/command.rb +62 -0
  92. data/lib/mongo/operation/executable.rb +105 -0
  93. data/lib/mongo/operation/kill_cursors.rb +39 -0
  94. data/lib/mongo/operation/limited.rb +37 -0
  95. data/lib/mongo/operation/list_collections/result.rb +114 -0
  96. data/lib/mongo/operation/list_indexes/result.rb +118 -0
  97. data/lib/mongo/operation/map_reduce/result.rb +122 -0
  98. data/lib/mongo/operation/map_reduce.rb +96 -0
  99. data/lib/mongo/operation/read/collections_info.rb +67 -0
  100. data/lib/mongo/operation/read/get_more.rb +71 -0
  101. data/lib/mongo/operation/read/indexes.rb +68 -0
  102. data/lib/mongo/operation/read/list_collections.rb +75 -0
  103. data/lib/mongo/operation/read/list_indexes.rb +77 -0
  104. data/lib/mongo/operation/read/query.rb +71 -0
  105. data/lib/mongo/{functional.rb → operation/read.rb} +7 -7
  106. data/lib/mongo/operation/read_preferrable.rb +34 -0
  107. data/lib/mongo/operation/result.rb +259 -0
  108. data/lib/mongo/operation/specifiable.rb +397 -0
  109. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +75 -0
  110. data/lib/mongo/operation/write/bulk/bulk_delete.rb +144 -0
  111. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +68 -0
  112. data/lib/mongo/operation/write/bulk/bulk_insert.rb +129 -0
  113. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +67 -0
  114. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +162 -0
  115. data/lib/mongo/operation/write/bulk/bulk_update.rb +153 -0
  116. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +83 -0
  117. data/lib/mongo/operation/write/bulk.rb +17 -0
  118. data/lib/mongo/operation/write/command/create_index.rb +50 -0
  119. data/lib/mongo/operation/write/command/create_user.rb +43 -0
  120. data/lib/mongo/operation/write/command/delete.rb +56 -0
  121. data/lib/mongo/operation/write/command/drop_index.rb +51 -0
  122. data/lib/mongo/operation/write/command/insert.rb +55 -0
  123. data/lib/mongo/operation/write/command/remove_user.rb +42 -0
  124. data/lib/mongo/operation/write/command/update.rb +60 -0
  125. data/lib/mongo/operation/write/command/writable.rb +61 -0
  126. data/lib/mongo/operation/write/command.rb +22 -0
  127. data/lib/mongo/operation/write/create_index.rb +89 -0
  128. data/lib/mongo/operation/write/create_user.rb +75 -0
  129. data/lib/mongo/operation/write/delete/result.rb +40 -0
  130. data/lib/mongo/operation/write/delete.rb +93 -0
  131. data/lib/mongo/operation/write/drop_index.rb +62 -0
  132. data/lib/mongo/{utils/thread_local_variable_manager.rb → operation/write/insert/result.rb} +15 -8
  133. data/lib/mongo/operation/write/insert.rb +90 -0
  134. data/lib/mongo/operation/write/remove_user.rb +70 -0
  135. data/lib/mongo/operation/write/update/result.rb +160 -0
  136. data/lib/mongo/operation/write/update.rb +103 -0
  137. data/lib/mongo/{connection/socket/socket_util.rb → operation/write.rb} +10 -24
  138. data/lib/mongo/operation.rb +25 -0
  139. data/lib/mongo/options/mapper.rb +78 -0
  140. data/lib/mongo/options.rb +15 -0
  141. data/lib/mongo/protocol/bit_vector.rb +61 -0
  142. data/lib/mongo/protocol/delete.rb +94 -0
  143. data/lib/mongo/protocol/get_more.rb +99 -0
  144. data/lib/mongo/protocol/insert.rb +99 -0
  145. data/lib/mongo/protocol/kill_cursors.rb +74 -0
  146. data/lib/mongo/protocol/message.rb +252 -0
  147. data/lib/mongo/protocol/query.rb +147 -0
  148. data/lib/mongo/protocol/reply.rb +72 -0
  149. data/lib/mongo/protocol/serializers.rb +180 -0
  150. data/lib/mongo/protocol/update.rb +111 -0
  151. data/lib/mongo/protocol.rb +15 -0
  152. data/lib/mongo/server/connectable.rb +110 -0
  153. data/lib/mongo/server/connection.rb +134 -0
  154. data/lib/mongo/server/connection_pool/queue.rb +182 -0
  155. data/lib/mongo/server/connection_pool.rb +141 -0
  156. data/lib/mongo/server/context.rb +66 -0
  157. data/lib/mongo/server/description/features.rb +85 -0
  158. data/lib/mongo/server/description/inspector/primary_elected.rb +58 -0
  159. data/lib/mongo/server/description/inspector/server_added.rb +59 -0
  160. data/lib/mongo/server/description/inspector/server_removed.rb +59 -0
  161. data/lib/mongo/server/description/inspector.rb +79 -0
  162. data/lib/mongo/server/description.rb +450 -0
  163. data/lib/mongo/server/monitor/connection.rb +89 -0
  164. data/lib/mongo/server/monitor.rb +176 -0
  165. data/lib/mongo/server.rb +163 -0
  166. data/lib/mongo/server_selector/nearest.rb +94 -0
  167. data/lib/mongo/server_selector/primary.rb +88 -0
  168. data/lib/mongo/server_selector/primary_preferred.rb +94 -0
  169. data/lib/mongo/server_selector/secondary.rb +91 -0
  170. data/lib/mongo/server_selector/secondary_preferred.rb +96 -0
  171. data/lib/mongo/server_selector/selectable.rb +209 -0
  172. data/lib/mongo/server_selector.rb +81 -0
  173. data/lib/mongo/socket/ssl.rb +130 -0
  174. data/lib/mongo/socket/tcp.rb +69 -0
  175. data/lib/mongo/socket/unix.rb +64 -0
  176. data/lib/mongo/socket.rb +179 -0
  177. data/lib/mongo/uri.rb +504 -0
  178. data/lib/mongo/version.rb +21 -0
  179. data/lib/mongo/write_concern/acknowledged.rb +52 -0
  180. data/lib/mongo/write_concern/normalizable.rb +51 -0
  181. data/lib/mongo/write_concern/unacknowledged.rb +55 -0
  182. data/lib/mongo/write_concern.rb +99 -0
  183. data/lib/mongo.rb +24 -82
  184. data/mongo.gemspec +17 -14
  185. data/spec/certificates/ca.pem +17 -0
  186. data/spec/certificates/client.pem +101 -0
  187. data/spec/certificates/crl.pem +10 -0
  188. data/spec/certificates/crl_client_revoked.pem +12 -0
  189. data/spec/certificates/password_protected.pem +51 -0
  190. data/spec/certificates/server.pem +34 -0
  191. data/spec/mongo/address/ipv4_spec.rb +74 -0
  192. data/spec/mongo/address/ipv6_spec.rb +74 -0
  193. data/spec/mongo/address/unix_spec.rb +30 -0
  194. data/spec/mongo/address_spec.rb +206 -0
  195. data/spec/mongo/auth/cr_spec.rb +59 -0
  196. data/spec/mongo/auth/ldap_spec.rb +40 -0
  197. data/spec/mongo/auth/scram/conversation_spec.rb +197 -0
  198. data/spec/mongo/auth/scram_spec.rb +55 -0
  199. data/spec/mongo/auth/user/view_spec.rb +76 -0
  200. data/spec/mongo/auth/user_spec.rb +190 -0
  201. data/spec/mongo/auth/x509_spec.rb +40 -0
  202. data/spec/mongo/auth_spec.rb +65 -0
  203. data/spec/mongo/bulk/bulk_write_spec.rb +262 -0
  204. data/spec/mongo/client_spec.rb +564 -0
  205. data/spec/mongo/cluster/topology/replica_set_spec.rb +101 -0
  206. data/spec/mongo/cluster/topology/sharded_spec.rb +74 -0
  207. data/spec/mongo/cluster/topology/standalone_spec.rb +79 -0
  208. data/spec/mongo/cluster/topology_spec.rb +65 -0
  209. data/spec/mongo/cluster_spec.rb +129 -0
  210. data/spec/mongo/collection/view/aggregation_spec.rb +148 -0
  211. data/spec/mongo/collection/view/explainable_spec.rb +32 -0
  212. data/spec/mongo/collection/view/map_reduce_spec.rb +242 -0
  213. data/spec/mongo/collection/view/readable_spec.rb +603 -0
  214. data/spec/mongo/collection/view/writable_spec.rb +679 -0
  215. data/spec/mongo/collection/view_spec.rb +530 -0
  216. data/spec/mongo/collection_spec.rb +362 -0
  217. data/spec/mongo/crud_spec.rb +42 -0
  218. data/spec/mongo/cursor_spec.rb +295 -0
  219. data/spec/mongo/database_spec.rb +302 -0
  220. data/spec/mongo/error/parser_spec.rb +119 -0
  221. data/spec/mongo/event/publisher_spec.rb +50 -0
  222. data/spec/mongo/event/subscriber_spec.rb +34 -0
  223. data/spec/mongo/grid/file/chunk_spec.rb +226 -0
  224. data/spec/mongo/grid/file/metadata_spec.rb +92 -0
  225. data/spec/mongo/grid/file_spec.rb +172 -0
  226. data/spec/mongo/grid/fs_spec.rb +129 -0
  227. data/spec/mongo/index/view_spec.rb +330 -0
  228. data/spec/mongo/loggable_spec.rb +62 -0
  229. data/spec/mongo/logger_spec.rb +97 -0
  230. data/spec/mongo/operation/aggregate/result_spec.rb +80 -0
  231. data/spec/mongo/operation/aggregate_spec.rb +127 -0
  232. data/spec/mongo/operation/command_spec.rb +98 -0
  233. data/spec/mongo/operation/kill_cursors_spec.rb +66 -0
  234. data/spec/mongo/operation/limited_spec.rb +50 -0
  235. data/spec/mongo/operation/map_reduce_spec.rb +143 -0
  236. data/spec/mongo/operation/read/collections_info_spec.rb +40 -0
  237. data/spec/mongo/operation/read/get_more_spec.rb +81 -0
  238. data/spec/mongo/operation/read/indexes_spec.rb +31 -0
  239. data/spec/mongo/operation/read/query_spec.rb +84 -0
  240. data/spec/mongo/operation/result_spec.rb +275 -0
  241. data/spec/mongo/operation/specifiable_spec.rb +53 -0
  242. data/spec/mongo/operation/write/bulk_delete_spec.rb +235 -0
  243. data/spec/mongo/operation/write/bulk_insert_spec.rb +235 -0
  244. data/spec/mongo/operation/write/bulk_update_spec.rb +236 -0
  245. data/spec/mongo/operation/write/command/delete_spec.rb +103 -0
  246. data/spec/mongo/operation/write/command/insert_spec.rb +103 -0
  247. data/spec/mongo/operation/write/command/update_spec.rb +109 -0
  248. data/spec/mongo/operation/write/create_index_spec.rb +63 -0
  249. data/spec/mongo/operation/write/create_user_spec.rb +44 -0
  250. data/spec/mongo/operation/write/delete_spec.rb +186 -0
  251. data/spec/mongo/operation/write/drop_index_spec.rb +51 -0
  252. data/spec/mongo/operation/write/insert_spec.rb +244 -0
  253. data/spec/mongo/operation/write/remove_user_spec.rb +46 -0
  254. data/spec/mongo/operation/write/response_spec.rb +85 -0
  255. data/spec/mongo/operation/write/update_spec.rb +228 -0
  256. data/spec/mongo/protocol/delete_spec.rb +167 -0
  257. data/spec/mongo/protocol/get_more_spec.rb +146 -0
  258. data/spec/mongo/protocol/insert_spec.rb +161 -0
  259. data/spec/mongo/protocol/kill_cursors_spec.rb +101 -0
  260. data/spec/mongo/protocol/query_spec.rb +285 -0
  261. data/spec/mongo/protocol/reply_spec.rb +157 -0
  262. data/spec/mongo/protocol/update_spec.rb +186 -0
  263. data/spec/mongo/server/connection_pool/queue_spec.rb +170 -0
  264. data/spec/mongo/server/connection_pool_spec.rb +120 -0
  265. data/spec/mongo/server/connection_spec.rb +312 -0
  266. data/spec/mongo/server/description/features_spec.rb +138 -0
  267. data/spec/mongo/server/description/inspector/primary_elected_spec.rb +94 -0
  268. data/spec/mongo/server/description/inspector/server_added_spec.rb +92 -0
  269. data/spec/mongo/server/description/inspector/server_removed_spec.rb +95 -0
  270. data/spec/mongo/server/description_spec.rb +510 -0
  271. data/spec/mongo/server/monitor_spec.rb +144 -0
  272. data/spec/mongo/server_discovery_and_monitoring_spec.rb +103 -0
  273. data/spec/mongo/server_selection_rtt_spec.rb +104 -0
  274. data/spec/mongo/server_selection_spec.rb +89 -0
  275. data/spec/mongo/server_selector/nearest_spec.rb +250 -0
  276. data/spec/mongo/server_selector/primary_preferred_spec.rb +290 -0
  277. data/spec/mongo/server_selector/primary_spec.rb +114 -0
  278. data/spec/mongo/server_selector/secondary_preferred_spec.rb +252 -0
  279. data/spec/mongo/server_selector/secondary_spec.rb +196 -0
  280. data/spec/mongo/server_selector_spec.rb +101 -0
  281. data/spec/mongo/server_spec.rb +131 -0
  282. data/spec/mongo/uri_spec.rb +517 -0
  283. data/spec/mongo/write_concern/acknowledged_spec.rb +44 -0
  284. data/spec/mongo/write_concern/unacknowledged_spec.rb +15 -0
  285. data/spec/spec_helper.rb +133 -0
  286. data/spec/support/authorization.rb +247 -0
  287. data/spec/support/crud/read.rb +144 -0
  288. data/spec/support/crud/write.rb +214 -0
  289. data/spec/support/crud.rb +203 -0
  290. data/spec/support/crud_tests/read/aggregate.yml +43 -0
  291. data/spec/support/crud_tests/read/count.yml +37 -0
  292. data/spec/support/crud_tests/read/distinct.yml +33 -0
  293. data/spec/support/crud_tests/read/find.yml +50 -0
  294. data/spec/support/crud_tests/write/deleteMany.yml +36 -0
  295. data/spec/support/crud_tests/write/deleteOne.yml +49 -0
  296. data/spec/support/crud_tests/write/findOneAndDelete.yml +54 -0
  297. data/spec/support/crud_tests/write/findOneAndReplace.yml +153 -0
  298. data/spec/support/crud_tests/write/findOneAndUpdate.yml +161 -0
  299. data/spec/support/crud_tests/write/insertMany.yml +24 -0
  300. data/spec/support/crud_tests/write/insertOne.yml +19 -0
  301. data/spec/support/crud_tests/write/replaceOne.yml +96 -0
  302. data/spec/support/crud_tests/write/updateMany.yml +83 -0
  303. data/spec/support/crud_tests/write/updateOne.yml +80 -0
  304. data/spec/support/helpers.rb +140 -0
  305. data/spec/support/matchers.rb +37 -0
  306. data/spec/support/sdam/rs/discover_arbiters.yml +41 -0
  307. data/spec/support/sdam/rs/discover_passives.yml +41 -0
  308. data/spec/support/sdam/rs/discover_primary.yml +40 -0
  309. data/spec/support/sdam/rs/discover_secondary.yml +41 -0
  310. data/spec/support/sdam/rs/discovery.yml +195 -0
  311. data/spec/support/sdam/rs/ghost_discovered.yml +39 -0
  312. data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +34 -0
  313. data/spec/support/sdam/rs/member_reconfig.yml +68 -0
  314. data/spec/support/sdam/rs/member_standalone.yml +60 -0
  315. data/spec/support/sdam/rs/new_primary.yml +74 -0
  316. data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +71 -0
  317. data/spec/support/sdam/rs/non_rs_member.yml +31 -0
  318. data/spec/support/sdam/rs/normalize_case.yml +49 -0
  319. data/spec/support/sdam/rs/primary_becomes_standalone.yml +52 -0
  320. data/spec/support/sdam/rs/primary_changes_set_name.yml +57 -0
  321. data/spec/support/sdam/rs/primary_disconnect.yml +56 -0
  322. data/spec/support/sdam/rs/primary_wrong_set_name.yml +27 -0
  323. data/spec/support/sdam/rs/response_from_removed.yml +63 -0
  324. data/spec/support/sdam/rs/rsother_discovered.yml +41 -0
  325. data/spec/support/sdam/rs/sec_not_auth.yml +49 -0
  326. data/spec/support/sdam/rs/secondary_wrong_set_name.yml +28 -0
  327. data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +69 -0
  328. data/spec/support/sdam/rs/unexpected_mongos.yml +26 -0
  329. data/spec/support/sdam/rs/wrong_set_name.yml +35 -0
  330. data/spec/support/sdam/sharded/multiple_mongoses.yml +46 -0
  331. data/spec/support/sdam/sharded/non_mongos_removed.yml +41 -0
  332. data/spec/support/sdam/sharded/normalize_uri_case.yml +32 -0
  333. data/spec/support/sdam/single/direct_connection_external_ip.yml +34 -0
  334. data/spec/support/sdam/single/direct_connection_mongos.yml +33 -0
  335. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +35 -0
  336. data/spec/support/sdam/single/direct_connection_rsprimary.yml +34 -0
  337. data/spec/support/sdam/single/direct_connection_rssecondary.yml +35 -0
  338. data/spec/support/sdam/single/direct_connection_slave.yml +32 -0
  339. data/spec/support/sdam/single/direct_connection_standalone.yml +32 -0
  340. data/spec/support/sdam/single/not_ok_response.yml +39 -0
  341. data/spec/support/sdam/single/standalone_removed.yml +32 -0
  342. data/spec/support/sdam/single/unavailable_seed.yml +28 -0
  343. data/spec/support/server_discovery_and_monitoring.rb +167 -0
  344. data/spec/support/server_selection/rtt/first_value.yml +4 -0
  345. data/spec/support/server_selection/rtt/first_value_zero.yml +4 -0
  346. data/spec/support/server_selection/rtt/value_test_1.yml +4 -0
  347. data/spec/support/server_selection/rtt/value_test_2.yml +4 -0
  348. data/spec/support/server_selection/rtt/value_test_3.yml +4 -0
  349. data/spec/support/server_selection/rtt/value_test_4.yml +4 -0
  350. data/spec/support/server_selection/rtt/value_test_5.yml +4 -0
  351. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest.yml +26 -0
  352. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +21 -0
  353. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +21 -0
  354. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +26 -0
  355. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +21 -0
  356. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +26 -0
  357. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +26 -0
  358. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +21 -0
  359. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +21 -0
  360. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +33 -0
  361. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +26 -0
  362. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +29 -0
  363. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +29 -0
  364. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +29 -0
  365. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary.yml +31 -0
  366. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred.yml +31 -0
  367. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml +29 -0
  368. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary_non_matching.yml +26 -0
  369. data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +26 -0
  370. data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +19 -0
  371. data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +11 -0
  372. data/spec/support/server_selection.rb +157 -0
  373. data/spec/support/server_selection_rtt.rb +41 -0
  374. data/spec/support/shared/bulk_write.rb +535 -0
  375. data/spec/support/shared/cursor.rb +38 -0
  376. data/spec/support/shared/operation.rb +77 -0
  377. data/spec/support/shared/protocol.rb +31 -0
  378. data/spec/support/shared/server_selector.rb +111 -0
  379. data/spec/support/shared/socket.rb +82 -0
  380. data/spec/support/travis.rb +14 -0
  381. data.tar.gz.sig +2 -3
  382. metadata +583 -186
  383. metadata.gz.sig +0 -0
  384. data/VERSION +0 -1
  385. data/lib/mongo/bulk_write_collection_view.rb +0 -387
  386. data/lib/mongo/collection_writer.rb +0 -364
  387. data/lib/mongo/connection/node.rb +0 -249
  388. data/lib/mongo/connection/pool.rb +0 -340
  389. data/lib/mongo/connection/pool_manager.rb +0 -320
  390. data/lib/mongo/connection/sharding_pool_manager.rb +0 -67
  391. data/lib/mongo/connection/socket/ssl_socket.rb +0 -95
  392. data/lib/mongo/connection/socket/tcp_socket.rb +0 -87
  393. data/lib/mongo/connection/socket/unix_socket.rb +0 -39
  394. data/lib/mongo/db.rb +0 -808
  395. data/lib/mongo/exception.rb +0 -145
  396. data/lib/mongo/functional/authentication.rb +0 -455
  397. data/lib/mongo/functional/logging.rb +0 -85
  398. data/lib/mongo/functional/read_preference.rb +0 -183
  399. data/lib/mongo/functional/scram.rb +0 -556
  400. data/lib/mongo/functional/uri_parser.rb +0 -409
  401. data/lib/mongo/functional/write_concern.rb +0 -66
  402. data/lib/mongo/gridfs/grid.rb +0 -112
  403. data/lib/mongo/gridfs/grid_ext.rb +0 -53
  404. data/lib/mongo/gridfs/grid_file_system.rb +0 -163
  405. data/lib/mongo/gridfs/grid_io.rb +0 -484
  406. data/lib/mongo/legacy.rb +0 -140
  407. data/lib/mongo/mongo_client.rb +0 -697
  408. data/lib/mongo/mongo_replica_set_client.rb +0 -535
  409. data/lib/mongo/mongo_sharded_client.rb +0 -159
  410. data/lib/mongo/networking.rb +0 -372
  411. data/lib/mongo/utils/conversions.rb +0 -110
  412. data/lib/mongo/utils/core_ext.rb +0 -70
  413. data/lib/mongo/utils/server_version.rb +0 -69
  414. data/lib/mongo/utils/support.rb +0 -80
  415. data/test/functional/authentication_test.rb +0 -39
  416. data/test/functional/bulk_api_stress_test.rb +0 -133
  417. data/test/functional/bulk_write_collection_view_test.rb +0 -1198
  418. data/test/functional/client_test.rb +0 -627
  419. data/test/functional/collection_test.rb +0 -2175
  420. data/test/functional/collection_writer_test.rb +0 -83
  421. data/test/functional/conversions_test.rb +0 -163
  422. data/test/functional/cursor_fail_test.rb +0 -57
  423. data/test/functional/cursor_message_test.rb +0 -56
  424. data/test/functional/cursor_test.rb +0 -683
  425. data/test/functional/db_api_test.rb +0 -835
  426. data/test/functional/db_test.rb +0 -348
  427. data/test/functional/grid_file_system_test.rb +0 -285
  428. data/test/functional/grid_io_test.rb +0 -252
  429. data/test/functional/grid_test.rb +0 -273
  430. data/test/functional/pool_test.rb +0 -136
  431. data/test/functional/safe_test.rb +0 -98
  432. data/test/functional/support_test.rb +0 -62
  433. data/test/functional/timeout_test.rb +0 -60
  434. data/test/functional/uri_test.rb +0 -446
  435. data/test/functional/write_concern_test.rb +0 -118
  436. data/test/helpers/general.rb +0 -50
  437. data/test/helpers/test_unit.rb +0 -476
  438. data/test/replica_set/authentication_test.rb +0 -37
  439. data/test/replica_set/basic_test.rb +0 -189
  440. data/test/replica_set/client_test.rb +0 -393
  441. data/test/replica_set/connection_test.rb +0 -138
  442. data/test/replica_set/count_test.rb +0 -66
  443. data/test/replica_set/cursor_test.rb +0 -220
  444. data/test/replica_set/insert_test.rb +0 -157
  445. data/test/replica_set/max_values_test.rb +0 -151
  446. data/test/replica_set/pinning_test.rb +0 -105
  447. data/test/replica_set/query_test.rb +0 -73
  448. data/test/replica_set/read_preference_test.rb +0 -219
  449. data/test/replica_set/refresh_test.rb +0 -211
  450. data/test/replica_set/replication_ack_test.rb +0 -95
  451. data/test/sharded_cluster/basic_test.rb +0 -203
  452. data/test/shared/authentication/basic_auth_shared.rb +0 -260
  453. data/test/shared/authentication/bulk_api_auth_shared.rb +0 -249
  454. data/test/shared/authentication/gssapi_shared.rb +0 -176
  455. data/test/shared/authentication/sasl_plain_shared.rb +0 -96
  456. data/test/shared/authentication/scram_shared.rb +0 -92
  457. data/test/shared/ssl_shared.rb +0 -235
  458. data/test/test_helper.rb +0 -61
  459. data/test/threading/basic_test.rb +0 -120
  460. data/test/tools/mongo_config.rb +0 -708
  461. data/test/tools/mongo_config_test.rb +0 -160
  462. data/test/unit/client_test.rb +0 -381
  463. data/test/unit/collection_test.rb +0 -166
  464. data/test/unit/connection_test.rb +0 -335
  465. data/test/unit/cursor_test.rb +0 -307
  466. data/test/unit/db_test.rb +0 -136
  467. data/test/unit/grid_test.rb +0 -76
  468. data/test/unit/mongo_sharded_client_test.rb +0 -48
  469. data/test/unit/node_test.rb +0 -93
  470. data/test/unit/pool_manager_test.rb +0 -111
  471. data/test/unit/read_pref_test.rb +0 -406
  472. data/test/unit/read_test.rb +0 -159
  473. data/test/unit/safe_test.rb +0 -158
  474. data/test/unit/sharding_pool_manager_test.rb +0 -84
  475. data/test/unit/write_concern_test.rb +0 -175
@@ -0,0 +1,132 @@
1
+ # Copyright (C) 2014-2015 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ class Cluster
17
+ module Topology
18
+
19
+ # Defines behaviour for when a cluster is in sharded topology.
20
+ #
21
+ # @since 2.0.0
22
+ class Sharded
23
+
24
+ # The display name for the topology.
25
+ #
26
+ # @since 2.0.0
27
+ NAME = 'Sharded'.freeze
28
+
29
+ # Get the display name.
30
+ #
31
+ # @example Get the display name.
32
+ # Sharded.display_name
33
+ #
34
+ # @return [ String ] The display name.
35
+ #
36
+ # @since 2.0.0
37
+ def display_name
38
+ NAME
39
+ end
40
+
41
+ # Elect a primary server within this topology.
42
+ #
43
+ # @example Elect a primary server.
44
+ # topology.elect_primary(description, servers)
45
+ #
46
+ # @param [ Server::Description ] description The description of the
47
+ # elected primary.
48
+ # @param [ Array<Server> ] servers The list of known servers to the
49
+ # cluster.
50
+ #
51
+ # @return [ Sharded ] The topology.
52
+ def elect_primary(description, servers); self; end
53
+
54
+ # Initialize the topology with the options.
55
+ #
56
+ # @example Initialize the topology.
57
+ # Sharded.new(options)
58
+ #
59
+ # @param [ Hash ] options The options.
60
+ #
61
+ # @since 2.0.0
62
+ def initialize(options)
63
+ @options = options
64
+ end
65
+
66
+ # A sharded topology is not a replica set.
67
+ #
68
+ # @example Is the topology a replica set?
69
+ # Sharded.replica_set?
70
+ #
71
+ # @return [ false ] Always false.
72
+ #
73
+ # @since 2.0.0
74
+ def replica_set?; false; end
75
+
76
+ # Sharded topologies have no replica set name.
77
+ #
78
+ # @example Get the replica set name.
79
+ # sharded.replica_set_name
80
+ #
81
+ # @return [ nil ] Always nil.
82
+ #
83
+ # @since 2.0.0
84
+ def replica_set_name; nil; end
85
+
86
+ # Select appropriate servers for this topology.
87
+ #
88
+ # @example Select the servers.
89
+ # Sharded.servers(servers)
90
+ #
91
+ # @param [ Array<Server> ] servers The known servers.
92
+ #
93
+ # @return [ Array<Server> ] The mongos servers.
94
+ #
95
+ # @since 2.0.0
96
+ def servers(servers)
97
+ servers.select{ |server| server.mongos? }
98
+ end
99
+
100
+ # A sharded topology is sharded.
101
+ #
102
+ # @example Is the topology sharded?
103
+ # Sharded.sharded?
104
+ #
105
+ # @return [ true ] Always true.
106
+ #
107
+ # @since 2.0.0
108
+ def sharded?; true; end
109
+
110
+ # A sharded topology is not standalone.
111
+ #
112
+ # @example Is the topology standalone?
113
+ # Sharded.standalone?
114
+ #
115
+ # @return [ false ] Always false.
116
+ #
117
+ # @since 2.0.0
118
+ def standalone?; false; end
119
+
120
+ # A sharded topology is not unknown.
121
+ #
122
+ # @example Is the topology unknown?
123
+ # Sharded.unknown?
124
+ #
125
+ # @return [ false ] Always false.
126
+ #
127
+ # @since 2.0.0
128
+ def unknown?; false; end
129
+ end
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,132 @@
1
+ # Copyright (C) 2014-2015 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ class Cluster
17
+ module Topology
18
+
19
+ # Defines behaviour for when a cluster is in standalone topology.
20
+ #
21
+ # @since 2.0.0
22
+ class Standalone
23
+
24
+ # The display name for the topology.
25
+ #
26
+ # @since 2.0.0
27
+ NAME = 'Standalone'.freeze
28
+
29
+ # Get the display name.
30
+ #
31
+ # @example Get the display name.
32
+ # Standalone.display_name
33
+ #
34
+ # @return [ String ] The display name.
35
+ #
36
+ # @since 2.0.0
37
+ def display_name
38
+ NAME
39
+ end
40
+
41
+ # Elect a primary server within this topology.
42
+ #
43
+ # @example Elect a primary server.
44
+ # topology.elect_primary(description, servers)
45
+ #
46
+ # @param [ Server::Description ] description The description of the
47
+ # elected primary.
48
+ # @param [ Array<Server> ] servers The list of known servers to the
49
+ # cluster.
50
+ #
51
+ # @return [ Standalone ] The topology.
52
+ def elect_primary(description, servers); self; end
53
+
54
+ # Initialize the topology with the options.
55
+ #
56
+ # @example Initialize the topology.
57
+ # Standalone.new(options)
58
+ #
59
+ # @param [ Hash ] options The options.
60
+ #
61
+ # @since 2.0.0
62
+ def initialize(options)
63
+ @options = options
64
+ end
65
+
66
+ # A standalone topology is not a replica set.
67
+ #
68
+ # @example Is the topology a replica set?
69
+ # Sharded.replica_set?
70
+ #
71
+ # @return [ false ] Always false.
72
+ #
73
+ # @since 2.0.0
74
+ def replica_set?; false; end
75
+
76
+ # Standalone topologies have no replica set name.
77
+ #
78
+ # @example Get the replica set name.
79
+ # standalone.replica_set_name
80
+ #
81
+ # @return [ nil ] Always nil.
82
+ #
83
+ # @since 2.0.0
84
+ def replica_set_name; nil; end
85
+
86
+ # Select appropriate servers for this topology.
87
+ #
88
+ # @example Select the servers.
89
+ # Standalone.servers(servers, 'test')
90
+ #
91
+ # @param [ Array<Server> ] servers The known servers.
92
+ #
93
+ # @return [ Array<Server> ] The standalone servers.
94
+ #
95
+ # @since 2.0.0
96
+ def servers(servers, name = nil)
97
+ [ servers.detect{ |server| server.standalone? } ]
98
+ end
99
+
100
+ # A standalone topology is not sharded.
101
+ #
102
+ # @example Is the topology sharded?
103
+ # Standalone.sharded?
104
+ #
105
+ # @return [ false ] Always false.
106
+ #
107
+ # @since 2.0.0
108
+ def sharded?; false; end
109
+
110
+ # A standalone topology is standalone.
111
+ #
112
+ # @example Is the topology standalone?
113
+ # Standalone.standalone?
114
+ #
115
+ # @return [ true ] Always true.
116
+ #
117
+ # @since 2.0.0
118
+ def standalone?; true; end
119
+
120
+ # An standalone topology is not unknown.
121
+ #
122
+ # @example Is the topology unknown?
123
+ # Standalone.unknown?
124
+ #
125
+ # @return [ false ] Always false.
126
+ #
127
+ # @since 2.0.0
128
+ def unknown?; false; end
129
+ end
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,155 @@
1
+ # Copyright (C) 2015 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ class Cluster
17
+ module Topology
18
+
19
+ # Defines behaviour for when a cluster is in an unknown state.
20
+ #
21
+ # @since 2.0.0
22
+ class Unknown
23
+ include Loggable
24
+
25
+ # The display name for the topology.
26
+ #
27
+ # @since 2.0.0
28
+ NAME = 'Unknown'.freeze
29
+
30
+ # @return [ Hash ] options The options.
31
+ attr_reader :options
32
+
33
+ # Get the display name.
34
+ #
35
+ # @example Get the display name.
36
+ # Unknown.display_name
37
+ #
38
+ # @return [ String ] The display name.
39
+ #
40
+ # @since 2.0.0
41
+ def display_name
42
+ NAME
43
+ end
44
+
45
+ # Elect a primary server within this topology.
46
+ #
47
+ # @example Elect a primary server.
48
+ # topology.elect_primary(description, servers)
49
+ #
50
+ # @param [ Server::Description ] description The description of the
51
+ # elected primary.
52
+ # @param [ Array<Server> ] servers The list of known servers to the
53
+ # cluster.
54
+ #
55
+ # @return [ Sharded, ReplicaSet ] The new topology.
56
+ def elect_primary(description, servers)
57
+ if description.mongos?
58
+ log_debug([ "Mongos #{description.address.to_s} discovered." ])
59
+ Sharded.new(options)
60
+ else
61
+ initialize_replica_set(description, servers)
62
+ end
63
+ end
64
+
65
+ # Initialize the topology with the options.
66
+ #
67
+ # @example Initialize the topology.
68
+ # Unknown.new(options)
69
+ #
70
+ # @param [ Hash ] options The options.
71
+ #
72
+ # @since 2.0.0
73
+ def initialize(options)
74
+ @options = options
75
+ end
76
+
77
+ # An unknown topology is not a replica set.
78
+ #
79
+ # @example Is the topology a replica set?
80
+ # Unknown.replica_set?
81
+ #
82
+ # @return [ false ] Always false.
83
+ #
84
+ # @since 2.0.0
85
+ def replica_set?; false; end
86
+
87
+ # Unknown topologies have no replica set name.
88
+ #
89
+ # @example Get the replica set name.
90
+ # unknown.replica_set_name
91
+ #
92
+ # @return [ nil ] Always nil.
93
+ #
94
+ # @since 2.0.0
95
+ def replica_set_name; nil; end
96
+
97
+ # Select appropriate servers for this topology.
98
+ #
99
+ # @example Select the servers.
100
+ # Unknown.servers(servers)
101
+ #
102
+ # @param [ Array<Server> ] servers The known servers.
103
+ #
104
+ # @raise [ Unknown ] Cannot select servers when the topology is
105
+ # unknown.
106
+ #
107
+ # @since 2.0.0
108
+ def servers(servers)
109
+ end
110
+
111
+ # An unknown topology is not sharded.
112
+ #
113
+ # @example Is the topology sharded?
114
+ # Unknown.sharded?
115
+ #
116
+ # @return [ false ] Always false.
117
+ #
118
+ # @since 2.0.0
119
+ def sharded?; false; end
120
+
121
+ # An unknown topology is not standalone.
122
+ #
123
+ # @example Is the topology standalone?
124
+ # Unknown.standalone?
125
+ #
126
+ # @return [ true ] Always false.
127
+ #
128
+ # @since 2.0.0
129
+ def standalone?; false; end
130
+
131
+ # An unknown topology is unknown.
132
+ #
133
+ # @example Is the topology unknown?
134
+ # Unknown.unknown?
135
+ #
136
+ # @return [ true ] Always true.
137
+ #
138
+ # @since 2.0.0
139
+ def unknown?; true; end
140
+
141
+ private
142
+
143
+ def initialize_replica_set(description, servers)
144
+ log_debug([ "Server #{description.address.to_s} discovered as primary." ])
145
+ servers.each do |server|
146
+ if server.standalone? && server.address != description.address
147
+ server.description.unknown!
148
+ end
149
+ end
150
+ ReplicaSet.new(options.merge(:replica_set => description.replica_set_name))
151
+ end
152
+ end
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,60 @@
1
+ # Copyright (C) 2014-2015 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'mongo/cluster/topology/replica_set'
16
+ require 'mongo/cluster/topology/sharded'
17
+ require 'mongo/cluster/topology/standalone'
18
+ require 'mongo/cluster/topology/unknown'
19
+
20
+ module Mongo
21
+ class Cluster
22
+
23
+ # Defines behaviour for getting servers.
24
+ #
25
+ # @since 2.0.0
26
+ module Topology
27
+ extend self
28
+
29
+ # The 2 various topologies for server selection.
30
+ #
31
+ # @since 2.0.0
32
+ OPTIONS = {
33
+ replica_set: ReplicaSet,
34
+ sharded: Sharded,
35
+ direct: Standalone
36
+ }
37
+
38
+ # Get the initial cluster topology for the provided options.
39
+ #
40
+ # @example Get the initial cluster topology.
41
+ # Topology.initial(topology: :replica_set)
42
+ #
43
+ # @param [ Hash ] options The cluster options.
44
+ #
45
+ # @return [ ReplicaSet, Sharded, Standalone ] The topology.
46
+ #
47
+ # @since 2.0.0
48
+ def initial(seeds, options)
49
+ if options.has_key?(:connect)
50
+ return OPTIONS.fetch(options[:connect]).new(options)
51
+ end
52
+ if options.has_key?(:replica_set)
53
+ ReplicaSet.new(options)
54
+ else
55
+ seeds.size > 1 ? Unknown.new(options) : Standalone.new(options)
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,203 @@
1
+ # Copyright (C) 2014-2015 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'mongo/cluster/topology'
16
+
17
+ module Mongo
18
+
19
+ # Represents a group of servers on the server side, either as a single server, a
20
+ # replica set, or a single or multiple mongos.
21
+ #
22
+ # @since 2.0.0
23
+ class Cluster
24
+ extend Forwardable
25
+ include Event::Subscriber
26
+ include Loggable
27
+
28
+ # @return [ Array<String> ] The provided seed addresses.
29
+ attr_reader :addresses
30
+
31
+ # @return [ Hash ] The options hash.
32
+ attr_reader :options
33
+
34
+ # @return [ Object ] The cluster topology.
35
+ attr_reader :topology
36
+
37
+ def_delegators :topology, :replica_set?, :replica_set_name, :sharded?, :standalone?, :unknown?
38
+
39
+ # Determine if this cluster of servers is equal to another object. Checks the
40
+ # servers currently in the cluster, not what was configured.
41
+ #
42
+ # @example Is the cluster equal to the object?
43
+ # cluster == other
44
+ #
45
+ # @param [ Object ] other The object to compare to.
46
+ #
47
+ # @return [ true, false ] If the objects are equal.
48
+ #
49
+ # @since 2.0.0
50
+ def ==(other)
51
+ return false unless other.is_a?(Cluster)
52
+ addresses == other.addresses && options == other.options
53
+ end
54
+
55
+ # Add a server to the cluster with the provided address. Useful in
56
+ # auto-discovery of new servers when an existing server executes an ismaster
57
+ # and potentially non-configured servers were included.
58
+ #
59
+ # @example Add the server for the address to the cluster.
60
+ # cluster.add('127.0.0.1:27018')
61
+ #
62
+ # @param [ String ] host The address of the server to add.
63
+ #
64
+ # @return [ Server ] The newly added server, if not present already.
65
+ #
66
+ # @since 2.0.0
67
+ def add(host)
68
+ address = Address.new(host)
69
+ unless addresses.include?(address)
70
+ log_debug([ "Adding #{address.to_s} to the cluster." ])
71
+ addresses.push(address)
72
+ server = Server.new(address, event_listeners, options)
73
+ @servers.push(server)
74
+ server
75
+ end
76
+ end
77
+
78
+ # Instantiate the new cluster.
79
+ #
80
+ # @example Instantiate the cluster.
81
+ # Mongo::Cluster.new(["127.0.0.1:27017"])
82
+ #
83
+ # @param [ Array<String> ] seeds The addresses of the configured servers.
84
+ # @param [ Hash ] options The options.
85
+ #
86
+ # @since 2.0.0
87
+ def initialize(seeds, options = {})
88
+ @addresses = []
89
+ @servers = []
90
+ @event_listeners = Event::Listeners.new
91
+ @options = options.freeze
92
+ @topology = Topology.initial(seeds, options)
93
+
94
+ subscribe_to(Event::SERVER_ADDED, Event::ServerAdded.new(self))
95
+ subscribe_to(Event::SERVER_REMOVED, Event::ServerRemoved.new(self))
96
+ subscribe_to(Event::PRIMARY_ELECTED, Event::PrimaryElected.new(self))
97
+
98
+ seeds.each{ |seed| add(seed) }
99
+ end
100
+
101
+ # Get the nicer formatted string for use in inspection.
102
+ #
103
+ # @example Inspect the cluster.
104
+ # cluster.inspect
105
+ #
106
+ # @return [ String ] The cluster inspection.
107
+ #
108
+ # @since 2.0.0
109
+ def inspect
110
+ "#<Mongo::Cluster:0x#{object_id} servers=#{servers} topology=#{topology.display_name}>"
111
+ end
112
+
113
+ # Get the next primary server we can send an operation to.
114
+ #
115
+ # @example Get the next primary server.
116
+ # cluster.next_primary
117
+ #
118
+ # @return [ Mongo::Server ] A primary server.
119
+ #
120
+ # @since 2.0.0
121
+ def next_primary
122
+ ServerSelector.get({ mode: :primary }, options).select_server(self)
123
+ end
124
+
125
+ # Elect a primary server from the description that has just changed to a
126
+ # primary.
127
+ #
128
+ # @example Elect a primary server.
129
+ # cluster.elect_primary!(description)
130
+ #
131
+ # @param [ Server::Description ] description The newly elected primary.
132
+ #
133
+ # @return [ Topology ] The cluster topology.
134
+ #
135
+ # @since 2.0.0
136
+ def elect_primary!(description)
137
+ @topology = topology.elect_primary(description, @servers)
138
+ end
139
+
140
+ # Removed the server from the cluster for the provided address, if it
141
+ # exists.
142
+ #
143
+ # @example Remove the server from the cluster.
144
+ # server.remove('127.0.0.1:27017')
145
+ #
146
+ # @param [ String ] host The host/port or socket address.
147
+ #
148
+ # @since 2.0.0
149
+ def remove(host)
150
+ log_debug([ "#{host} being removed from the cluster." ])
151
+ address = Address.new(host)
152
+ removed_servers = @servers.reject!{ |server| server.address == address }
153
+ removed_servers.each{ |server| server.disconnect! } if removed_servers
154
+ addresses.reject!{ |addr| addr == address }
155
+ end
156
+
157
+ # Force a scan of all known servers in the cluster.
158
+ #
159
+ # @example Force a full cluster scan.
160
+ # cluster.scan!
161
+ #
162
+ # @note This operation is done synchronously. If servers in the cluster are
163
+ # down or slow to respond this can potentially be a slow operation.
164
+ #
165
+ # @return [ true ] Always true.
166
+ #
167
+ # @since 2.0.0
168
+ def scan!
169
+ @servers.each{ |server| server.scan! } and true
170
+ end
171
+
172
+ # Get a list of server candidates from the cluster that can have operations
173
+ # executed on them.
174
+ #
175
+ # @example Get the server candidates for an operation.
176
+ # cluster.servers
177
+ #
178
+ # @return [ Array<Server> ] The candidate servers.
179
+ #
180
+ # @since 2.0.0
181
+ def servers
182
+ topology.servers(@servers)
183
+ end
184
+
185
+ # Create a cluster for the provided client, for use when we don't want the
186
+ # client's original cluster instance to be the same.
187
+ #
188
+ # @api private
189
+ #
190
+ # @example Create a cluster for the client.
191
+ # Cluster.create(client)
192
+ #
193
+ # @param [ Client ] client The client to create on.
194
+ #
195
+ # @return [ Cluster ] The cluster.
196
+ #
197
+ # @since 2.0.0
198
+ def self.create(client)
199
+ cluster = Cluster.new(client.cluster.addresses.map(&:to_s), client.options)
200
+ client.instance_variable_set(:@cluster, cluster)
201
+ end
202
+ end
203
+ end