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,89 @@
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 Server
17
+ class Monitor
18
+
19
+ # This class models the monitor connections and their behavior.
20
+ #
21
+ # @since 2.0.0
22
+ class Connection
23
+ include Connectable
24
+
25
+ # Tell the underlying socket to establish a connection to the host.
26
+ #
27
+ # @example Connect to the host.
28
+ # connection.connect!
29
+ #
30
+ # @note This method mutates the connection class by setting a socket if
31
+ # one previously did not exist.
32
+ #
33
+ # @return [ true ] If the connection succeeded.
34
+ #
35
+ # @since 2.0.0
36
+ def connect!
37
+ unless socket
38
+ @socket = address.socket(timeout, ssl_options)
39
+ @socket.connect!
40
+ end
41
+ true
42
+ end
43
+
44
+ # Disconnect the connection.
45
+ #
46
+ # @example Disconnect from the host.
47
+ # connection.disconnect!
48
+ #
49
+ # @note This method mutates the connection by setting the socket to nil
50
+ # if the closing succeeded.
51
+ #
52
+ # @return [ true ] If the disconnect succeeded.
53
+ #
54
+ # @since 2.0.0
55
+ def disconnect!
56
+ if socket
57
+ socket.close
58
+ @socket = nil
59
+ end
60
+ true
61
+ end
62
+
63
+ # Initialize a new socket connection from the client to the server.
64
+ #
65
+ # @example Create the connection.
66
+ # Connection.new(address)
67
+ #
68
+ # @param [ Mongo::Address ] address The address the connection is for.
69
+ # @param [ Hash ] options The connection options.
70
+ #
71
+ # @since 2.0.0
72
+ def initialize(address, options = {})
73
+ @address = address
74
+ @options = options.freeze
75
+ @ssl_options = options.reject { |k, v| !k.to_s.start_with?('ssl') }
76
+ @socket = nil
77
+ @pid = Process.pid
78
+ end
79
+
80
+ private
81
+
82
+ def write(messages, buffer = '')
83
+ messages.each{ |message| message.serialize(buffer) }
84
+ ensure_connected{ |socket| socket.write(buffer) }
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,176 @@
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/server/monitor/connection'
16
+
17
+ module Mongo
18
+ class Server
19
+
20
+ # This object is responsible for keeping server status up to date, running in
21
+ # a separate thread as to not disrupt other operations.
22
+ #
23
+ # @since 2.0.0
24
+ class Monitor
25
+ include Loggable
26
+
27
+ # The default time for a server to refresh its status is 10 seconds.
28
+ #
29
+ # @since 2.0.0
30
+ HEARTBEAT_FREQUENCY = 10.freeze
31
+
32
+ # The minimum time between forced server scans. Is
33
+ # minHeartbeatFrequencyMS in the SDAM spec.
34
+ #
35
+ # @since 2.0.0
36
+ MIN_SCAN_FREQUENCY = 0.5.freeze
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
+ # The weighting factor (alpha) for calculating the average moving round trip time.
49
+ #
50
+ # @since 2.0.0
51
+ RTT_WEIGHT_FACTOR = 0.2.freeze
52
+
53
+ # @return [ Mongo::Connection ] connection The connection to use.
54
+ attr_reader :connection
55
+
56
+ # @return [ Server::Description ] description The server
57
+ # description the monitor refreshes.
58
+ attr_reader :description
59
+
60
+ # @return [ Description::Inspector ] inspector The description inspector.
61
+ attr_reader :inspector
62
+
63
+ # @return [ Hash ] options The server options.
64
+ attr_reader :options
65
+
66
+ # Force the monitor to immediately do a check of its server.
67
+ #
68
+ # @example Force a scan.
69
+ # monitor.scan!
70
+ #
71
+ # @return [ Description ] The updated description.
72
+ #
73
+ # @since 2.0.0
74
+ def scan!
75
+ throttle_scan_frequency!
76
+ @description = inspector.run(description, *ismaster)
77
+ end
78
+
79
+ # Get the refresh interval for the server. This will be defined via an option
80
+ # or will default to 5.
81
+ #
82
+ # @example Get the refresh interval.
83
+ # server.heartbeat_frequency
84
+ #
85
+ # @return [ Integer ] The heartbeat frequency, in seconds.
86
+ #
87
+ # @since 2.0.0
88
+ def heartbeat_frequency
89
+ @heartbeat_frequency ||= options[:heartbeat_frequency] || HEARTBEAT_FREQUENCY
90
+ end
91
+
92
+ # Create the new server monitor.
93
+ #
94
+ # @example Create the server monitor.
95
+ # Mongo::Server::Monitor.new(address, listeners)
96
+ #
97
+ # @param [ Address ] address The address to monitor.
98
+ # @param [ Event::Listeners ] listeners The event listeners.
99
+ # @param [ Hash ] options The options.
100
+ #
101
+ # @since 2.0.0
102
+ def initialize(address, listeners, options = {})
103
+ @description = Description.new(address, {})
104
+ @inspector = Description::Inspector.new(listeners)
105
+ @options = options.freeze
106
+ @connection = Connection.new(address, options)
107
+ @last_round_trip_time = nil
108
+ @mutex = Mutex.new
109
+ end
110
+
111
+ # Runs the server monitor. Refreshing happens on a separate thread per
112
+ # server.
113
+ #
114
+ # @example Run the monitor.
115
+ # monito.run
116
+ #
117
+ # @return [ Thread ] The thread the monitor runs on.
118
+ #
119
+ # @since 2.0.0
120
+ def run!
121
+ @thread = Thread.new(heartbeat_frequency) do |i|
122
+ loop do
123
+ sleep(i)
124
+ scan!
125
+ end
126
+ end
127
+ end
128
+
129
+ # Stops the server monitor. Kills the thread so it doesn't continue
130
+ # taking memory and sending commands to the connection.
131
+ #
132
+ # @example Stop the monitor.
133
+ # monitor.stop!
134
+ #
135
+ # @return [ Boolean ] Is the Thread stopped?
136
+ #
137
+ # @since 2.0.0
138
+ def stop!
139
+ @thread.kill && @thread.stop?
140
+ end
141
+
142
+ private
143
+
144
+ def average_round_trip_time(start)
145
+ new_rtt = Time.now - start
146
+ RTT_WEIGHT_FACTOR * new_rtt + (1 - RTT_WEIGHT_FACTOR) * (@last_round_trip_time || new_rtt)
147
+ end
148
+
149
+ def calculate_average_round_trip_time(start)
150
+ @last_round_trip_time = average_round_trip_time(start)
151
+ end
152
+
153
+ def ismaster
154
+ @mutex.synchronize do
155
+ start = Time.now
156
+ begin
157
+ result = connection.dispatch([ ISMASTER ]).documents[0]
158
+ return result, calculate_average_round_trip_time(start)
159
+ rescue Exception => e
160
+ log_debug([ e.message ])
161
+ return {}, calculate_average_round_trip_time(start)
162
+ end
163
+ end
164
+ end
165
+
166
+ def throttle_scan_frequency!
167
+ if @last_scan
168
+ difference = (Time.now - @last_scan)
169
+ throttle_time = (MIN_SCAN_FREQUENCY - difference)
170
+ sleep(throttle_time) if throttle_time > 0
171
+ end
172
+ @last_scan = Time.now
173
+ end
174
+ end
175
+ end
176
+ end
@@ -0,0 +1,163 @@
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/server/connectable'
16
+ require 'mongo/server/connection'
17
+ require 'mongo/server/connection_pool'
18
+ require 'mongo/server/context'
19
+ require 'mongo/server/description'
20
+ require 'mongo/server/monitor'
21
+
22
+ module Mongo
23
+
24
+ # Represents a single server on the server side that can be standalone, part of
25
+ # a replica set, or a mongos.
26
+ #
27
+ # @since 2.0.0
28
+ class Server
29
+ extend Forwardable
30
+
31
+ # @return [ String ] The configured address for the server.
32
+ attr_reader :address
33
+
34
+ # @return [ Monitor ] monitor The server monitor.
35
+ attr_reader :monitor
36
+
37
+ # @return [ Hash ] The options hash.
38
+ attr_reader :options
39
+
40
+ # Get the description from the monitor and scan on monitor.
41
+ def_delegators :monitor, :description, :scan!
42
+
43
+ # Delegate convenience methods to the monitor description.
44
+ def_delegators :description,
45
+ :arbiter?,
46
+ :features,
47
+ :ghost?,
48
+ :max_wire_version,
49
+ :max_write_batch_size,
50
+ :max_bson_object_size,
51
+ :max_message_size,
52
+ :tags,
53
+ :average_round_trip_time,
54
+ :mongos?,
55
+ :other?,
56
+ :primary?,
57
+ :replica_set_name,
58
+ :secondary?,
59
+ :standalone?,
60
+ :unknown?
61
+
62
+ # Is this server equal to another?
63
+ #
64
+ # @example Is the server equal to the other?
65
+ # server == other
66
+ #
67
+ # @param [ Object ] other The object to compare to.
68
+ #
69
+ # @return [ true, false ] If the servers are equal.
70
+ #
71
+ # @since 2.0.0
72
+ def ==(other)
73
+ return false unless other.is_a?(Server)
74
+ address == other.address
75
+ end
76
+
77
+ # Get a new context for this server in which to send messages.
78
+ #
79
+ # @example Get the server context.
80
+ # server.context
81
+ #
82
+ # @return [ Mongo::Server::Context ] context The server context.
83
+ #
84
+ # @since 2.0.0
85
+ def context
86
+ Context.new(self)
87
+ end
88
+
89
+ # Disconnect the server from the connection.
90
+ #
91
+ # @example Disconnect the server.
92
+ # server.disconnect!
93
+ #
94
+ # @return [ true ] Always tru with no exception.
95
+ #
96
+ # @since 2.0.0
97
+ def disconnect!
98
+ context.with_connection do |connection|
99
+ connection.disconnect!
100
+ end
101
+ monitor.stop! and true
102
+ end
103
+
104
+ # Instantiate a new server object. Will start the background refresh and
105
+ # subscribe to the appropriate events.
106
+ #
107
+ # @example Initialize the server.
108
+ # Mongo::Server.new('127.0.0.1:27017', listeners)
109
+ #
110
+ # @param [ Address ] address The host:port address to connect to.
111
+ # @param [ Event::Listeners ] event_listeners The event listeners.
112
+ # @param [ Hash ] options The server options.
113
+ #
114
+ # @since 2.0.0
115
+ def initialize(address, event_listeners, options = {})
116
+ @address = address
117
+ @options = options.freeze
118
+ @monitor = Monitor.new(address, event_listeners, options)
119
+ monitor.scan!
120
+ monitor.run!
121
+ end
122
+
123
+ # Get a pretty printed server inspection.
124
+ #
125
+ # @example Get the server inspection.
126
+ # server.inspec
127
+ #
128
+ # @return [ String ] The nice inspection string.
129
+ #
130
+ # @since 2.0.0
131
+ def inspect
132
+ "#<Mongo::Server:0x#{object_id} address=#{address.host}:#{address.port}>"
133
+ end
134
+
135
+ # Get the connection pool for this server.
136
+ #
137
+ # @example Get the connection pool for the server.
138
+ # server.pool
139
+ #
140
+ # @return [ Mongo::Pool ] The connection pool.
141
+ #
142
+ # @since 2.0.0
143
+ def pool
144
+ @pool ||= ConnectionPool.get(self)
145
+ end
146
+
147
+ # Determine if the provided tags are a subset of the server's tags.
148
+ #
149
+ # @example Are the provided tags a subset of the server's tags.
150
+ # server.matches_tag_set?({ 'rack' => 'a', 'dc' => 'nyc' })
151
+ #
152
+ # @param [ Hash ] tag_set The tag set to compare to the server's tags.
153
+ #
154
+ # @return [ true, false ] If the provided tags are a subset of the server's tags.
155
+ #
156
+ # @since 2.0.0
157
+ def matches_tag_set?(tag_set)
158
+ tag_set.keys.all? do |k|
159
+ tags[k] && tags[k] == tag_set[k]
160
+ end
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,94 @@
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
+ module ServerSelector
17
+
18
+ # Encapsulates specifications for selecting near servers given a list
19
+ # of candidates.
20
+ #
21
+ # @since 2.0.0
22
+ class Nearest
23
+ include Selectable
24
+
25
+ # Get the name of the server mode type.
26
+ #
27
+ # @example Get the name of the server mode for this preference.
28
+ # preference.name
29
+ #
30
+ # @return [ Symbol ] :nearest
31
+ #
32
+ # @since 2.0.0
33
+ def name
34
+ :nearest
35
+ end
36
+
37
+ # Whether the slaveOk bit should be set on wire protocol messages.
38
+ # I.e. whether the operation can be performed on a secondary server.
39
+ #
40
+ # @return [ true ] true
41
+ #
42
+ # @since 2.0.0
43
+ def slave_ok?
44
+ true
45
+ end
46
+
47
+ # Whether tag sets are allowed to be defined for this server preference.
48
+ #
49
+ # @return [ true ] true
50
+ #
51
+ # @since 2.0.0
52
+ def tags_allowed?
53
+ true
54
+ end
55
+
56
+ # Convert this server preference definition into a format appropriate
57
+ # for a mongos server.
58
+ #
59
+ # @example Convert this server preference definition into a format
60
+ # for mongos.
61
+ # preference = Mongo::ServerSelector::Nearest.new
62
+ # preference.to_mongos
63
+ #
64
+ # @return [ Hash ] The server preference formatted for a mongos server.
65
+ #
66
+ # @since 2.0.0
67
+ def to_mongos
68
+ preference = { :mode => 'nearest' }
69
+ preference.merge!({ :tags => tag_sets }) unless tag_sets.empty?
70
+ preference
71
+ end
72
+
73
+ private
74
+
75
+ # Select the near servers taking into account any defined tag sets and
76
+ # local threshold between the nearest server and other servers.
77
+ #
78
+ # @example Select nearest servers given a list of candidates.
79
+ # preference = Mongo::Serverreference::Nearest.new
80
+ # preference.select_server(cluster)
81
+ #
82
+ # @return [ Array ] The nearest servers from the list of candidates.
83
+ #
84
+ # @since 2.0.0
85
+ def select(candidates)
86
+ if tag_sets.empty?
87
+ near_servers(candidates)
88
+ else
89
+ near_servers(match_tag_sets(candidates))
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,88 @@
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
+
17
+ module ServerSelector
18
+
19
+ # Encapsulates specifications for selecting the primary server given a list
20
+ # of candidates.
21
+ #
22
+ # @since 2.0.0
23
+ class Primary
24
+ include Selectable
25
+
26
+ # Get the name of the server mode type.
27
+ #
28
+ # @example Get the name of the server mode for this preference.
29
+ # preference.name
30
+ #
31
+ # @return [ Symbol ] :primary
32
+ #
33
+ # @since 2.0.0
34
+ def name
35
+ :primary
36
+ end
37
+
38
+ # Whether the slaveOk bit should be set on wire protocol messages.
39
+ # I.e. whether the operation can be performed on a secondary server.
40
+ #
41
+ # @return [ false ] false
42
+ #
43
+ # @since 2.0.0
44
+ def slave_ok?
45
+ false
46
+ end
47
+
48
+ # Whether tag sets are allowed to be defined for this server preference.
49
+ #
50
+ # @return [ false ] false
51
+ #
52
+ # @since 2.0.0
53
+ def tags_allowed?
54
+ false
55
+ end
56
+
57
+ # Convert this server preference definition into a format appropriate
58
+ # for a mongos server.
59
+ #
60
+ # @example Convert this server preference definition into a format
61
+ # for mongos.
62
+ # preference = Mongo::ServerSelector::Primary.new
63
+ # preference.to_mongos
64
+ #
65
+ # @return [ nil ] nil
66
+ #
67
+ # @since 2.0.0
68
+ def to_mongos
69
+ nil
70
+ end
71
+
72
+ private
73
+
74
+ # Select the primary server from a list of candidates.
75
+ #
76
+ # @example Select the primary server given a list of candidates.
77
+ # preference = Mongo::ServerSelector::Primary.new
78
+ # preference.select([candidate_1, candidate_2])
79
+ #
80
+ # @return [ Array ] The primary server from the list of candidates.
81
+ #
82
+ # @since 2.0.0
83
+ def select(candidates)
84
+ primary(candidates)
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,94 @@
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
+
17
+ module ServerSelector
18
+
19
+ # Encapsulates specifications for selecting servers, with the
20
+ # primary preferred, given a list of candidates.
21
+ #
22
+ # @since 2.0.0
23
+ class PrimaryPreferred
24
+ include Selectable
25
+
26
+ # Get the name of the server mode type.
27
+ #
28
+ # @example Get the name of the server mode for this preference.
29
+ # preference.name
30
+ #
31
+ # @return [ Symbol ] :primary_preferred
32
+ #
33
+ # @since 2.0.0
34
+ def name
35
+ :primary_preferred
36
+ end
37
+
38
+ # Whether the slaveOk bit should be set on wire protocol messages.
39
+ # I.e. whether the operation can be performed on a secondary server.
40
+ #
41
+ # @return [ true ] true
42
+ #
43
+ # @since 2.0.0
44
+ def slave_ok?
45
+ true
46
+ end
47
+
48
+ # Whether tag sets are allowed to be defined for this server preference.
49
+ #
50
+ # @return [ true ] true
51
+ #
52
+ # @since 2.0.0
53
+ def tags_allowed?
54
+ true
55
+ end
56
+
57
+ # Convert this server preference definition into a format appropriate
58
+ # for a mongos server.
59
+ #
60
+ # @example Convert this server preference definition into a format
61
+ # for mongos.
62
+ # preference = Mongo::ServerSelector::PrimaryPreferred.new
63
+ # preference.to_mongos
64
+ #
65
+ # @return [ Hash ] The server preference formatted for a mongos server.
66
+ #
67
+ # @since 2.0.0
68
+ def to_mongos
69
+ preference = { :mode => 'primaryPreferred' }
70
+ preference.merge!({ :tags => tag_sets }) unless tag_sets.empty?
71
+ preference
72
+ end
73
+
74
+ private
75
+
76
+ # Select servers taking into account any defined tag sets and
77
+ # local threshold, with the primary preferred.
78
+ #
79
+ # @example Select servers given a list of candidates,
80
+ # with the primary preferred.
81
+ # preference = Mongo::ServerSelector::PrimaryPreferred.new
82
+ # preference.select([candidate_1, candidate_2])
83
+ #
84
+ # @return [ Array ] A list of servers matching tag sets and acceptable
85
+ # latency with the primary preferred.
86
+ #
87
+ # @since 2.0.0
88
+ def select(candidates)
89
+ primary = primary(candidates)
90
+ primary.first ? primary : near_servers(secondaries(candidates))
91
+ end
92
+ end
93
+ end
94
+ end