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,26 @@
1
+ ---
2
+ topology_description:
3
+ type: ReplicaSetNoPrimary
4
+ servers:
5
+ - &1
6
+ address: b:27017
7
+ avg_rtt_ms: 5
8
+ type: RSSecondary
9
+ tags:
10
+ data_center: nyc
11
+ - &2
12
+ address: c:27017
13
+ avg_rtt_ms: 100
14
+ type: RSSecondary
15
+ tags:
16
+ data_center: nyc
17
+ operation: read
18
+ read_preference:
19
+ mode: SecondaryPreferred
20
+ tag_sets:
21
+ - data_center: nyc
22
+ suitable_servers:
23
+ - *1
24
+ - *2
25
+ in_latency_window:
26
+ - *1
@@ -0,0 +1,21 @@
1
+ ---
2
+ topology_description:
3
+ type: ReplicaSetNoPrimary
4
+ servers:
5
+ - address: b:27017
6
+ avg_rtt_ms: 5
7
+ type: RSSecondary
8
+ tags:
9
+ data_center: nyc
10
+ - address: c:27017
11
+ avg_rtt_ms: 100
12
+ type: RSSecondary
13
+ tags:
14
+ data_center: nyc
15
+ operation: read
16
+ read_preference:
17
+ mode: SecondaryPreferred
18
+ tag_sets:
19
+ - data_center: sf
20
+ suitable_servers: []
21
+ in_latency_window: []
@@ -0,0 +1,21 @@
1
+ ---
2
+ topology_description:
3
+ type: ReplicaSetNoPrimary
4
+ servers:
5
+ - address: b:27017
6
+ avg_rtt_ms: 5
7
+ type: RSSecondary
8
+ tags:
9
+ data_center: nyc
10
+ - address: c:27017
11
+ avg_rtt_ms: 100
12
+ type: RSSecondary
13
+ tags:
14
+ data_center: nyc
15
+ operation: read
16
+ read_preference:
17
+ mode: Secondary
18
+ tag_sets:
19
+ - data_center: sf
20
+ suitable_servers: []
21
+ in_latency_window: []
@@ -0,0 +1,33 @@
1
+ ---
2
+ topology_description:
3
+ type: ReplicaSetWithPrimary
4
+ servers:
5
+ - &1
6
+ address: b:27017
7
+ avg_rtt_ms: 5
8
+ type: RSSecondary
9
+ tags:
10
+ data_center: nyc
11
+ - &3
12
+ address: c:27017
13
+ avg_rtt_ms: 100
14
+ type: RSSecondary
15
+ tags:
16
+ data_center: nyc
17
+ - &2
18
+ address: a:27017
19
+ avg_rtt_ms: 26
20
+ type: RSPrimary
21
+ tags:
22
+ data_center: nyc
23
+ operation: read
24
+ read_preference:
25
+ mode: Nearest
26
+ tag_sets:
27
+ - data_center: nyc
28
+ suitable_servers:
29
+ - *1
30
+ - *2
31
+ - *3
32
+ in_latency_window:
33
+ - *1
@@ -0,0 +1,26 @@
1
+ ---
2
+ topology_description:
3
+ type: ReplicaSetWithPrimary
4
+ servers:
5
+ - address: b:27017
6
+ avg_rtt_ms: 5
7
+ type: RSSecondary
8
+ tags:
9
+ data_center: nyc
10
+ - address: c:27017
11
+ avg_rtt_ms: 100
12
+ type: RSSecondary
13
+ tags:
14
+ data_center: nyc
15
+ - address: a:27017
16
+ avg_rtt_ms: 26
17
+ type: RSPrimary
18
+ tags:
19
+ data_center: nyc
20
+ operation: read
21
+ read_preference:
22
+ mode: Nearest
23
+ tag_sets:
24
+ - data_center: sf
25
+ suitable_servers: []
26
+ in_latency_window: []
@@ -0,0 +1,29 @@
1
+ ---
2
+ topology_description:
3
+ type: ReplicaSetWithPrimary
4
+ servers:
5
+ - address: b:27017
6
+ avg_rtt_ms: 5
7
+ type: RSSecondary
8
+ tags:
9
+ data_center: nyc
10
+ - address: c:27017
11
+ avg_rtt_ms: 100
12
+ type: RSSecondary
13
+ tags:
14
+ data_center: nyc
15
+ - &1
16
+ address: a:27017
17
+ avg_rtt_ms: 26
18
+ type: RSPrimary
19
+ tags:
20
+ data_center: nyc
21
+ operation: read
22
+ read_preference:
23
+ mode: Primary
24
+ tag_sets:
25
+ - {}
26
+ suitable_servers:
27
+ - *1
28
+ in_latency_window:
29
+ - *1
@@ -0,0 +1,29 @@
1
+ ---
2
+ topology_description:
3
+ type: ReplicaSetWithPrimary
4
+ servers:
5
+ - address: b:27017
6
+ avg_rtt_ms: 5
7
+ type: RSSecondary
8
+ tags:
9
+ data_center: nyc
10
+ - address: c:27017
11
+ avg_rtt_ms: 100
12
+ type: RSSecondary
13
+ tags:
14
+ data_center: nyc
15
+ - &1
16
+ address: a:27017
17
+ avg_rtt_ms: 26
18
+ type: RSPrimary
19
+ tags:
20
+ data_center: nyc
21
+ operation: read
22
+ read_preference:
23
+ mode: PrimaryPreferred
24
+ tag_sets:
25
+ - {}
26
+ suitable_servers:
27
+ - *1
28
+ in_latency_window:
29
+ - *1
@@ -0,0 +1,29 @@
1
+ ---
2
+ topology_description:
3
+ type: ReplicaSetWithPrimary
4
+ servers:
5
+ - address: b:27017
6
+ avg_rtt_ms: 5
7
+ type: RSSecondary
8
+ tags:
9
+ data_center: nyc
10
+ - address: c:27017
11
+ avg_rtt_ms: 100
12
+ type: RSSecondary
13
+ tags:
14
+ data_center: nyc
15
+ - &1
16
+ address: a:27017
17
+ avg_rtt_ms: 26
18
+ type: RSPrimary
19
+ tags:
20
+ data_center: nyc
21
+ operation: read
22
+ read_preference:
23
+ mode: PrimaryPreferred
24
+ tag_sets:
25
+ - data_center: sf
26
+ suitable_servers:
27
+ - *1
28
+ in_latency_window:
29
+ - *1
@@ -0,0 +1,31 @@
1
+ ---
2
+ topology_description:
3
+ type: ReplicaSetWithPrimary
4
+ servers:
5
+ - &1
6
+ address: b:27017
7
+ avg_rtt_ms: 5
8
+ type: RSSecondary
9
+ tags:
10
+ data_center: nyc
11
+ - &2
12
+ address: c:27017
13
+ avg_rtt_ms: 100
14
+ type: RSSecondary
15
+ tags:
16
+ data_center: nyc
17
+ - address: a:27017
18
+ avg_rtt_ms: 26
19
+ type: RSPrimary
20
+ tags:
21
+ data_center: nyc
22
+ operation: read
23
+ read_preference:
24
+ mode: Secondary
25
+ tag_sets:
26
+ - data_center: nyc
27
+ suitable_servers:
28
+ - *1
29
+ - *2
30
+ in_latency_window:
31
+ - *1
@@ -0,0 +1,31 @@
1
+ ---
2
+ topology_description:
3
+ type: ReplicaSetWithPrimary
4
+ servers:
5
+ - &1
6
+ address: b:27017
7
+ avg_rtt_ms: 5
8
+ type: RSSecondary
9
+ tags:
10
+ data_center: nyc
11
+ - &2
12
+ address: c:27017
13
+ avg_rtt_ms: 100
14
+ type: RSSecondary
15
+ tags:
16
+ data_center: nyc
17
+ - address: a:27017
18
+ avg_rtt_ms: 26
19
+ type: RSPrimary
20
+ tags:
21
+ data_center: nyc
22
+ operation: read
23
+ read_preference:
24
+ mode: SecondaryPreferred
25
+ tag_sets:
26
+ - data_center: nyc
27
+ suitable_servers:
28
+ - *1
29
+ - *2
30
+ in_latency_window:
31
+ - *1
@@ -0,0 +1,29 @@
1
+ ---
2
+ topology_description:
3
+ type: ReplicaSetWithPrimary
4
+ servers:
5
+ - address: b:27017
6
+ avg_rtt_ms: 5
7
+ type: RSSecondary
8
+ tags:
9
+ data_center: nyc
10
+ - address: c:27017
11
+ avg_rtt_ms: 100
12
+ type: RSSecondary
13
+ tags:
14
+ data_center: nyc
15
+ - &1
16
+ address: a:27017
17
+ avg_rtt_ms: 26
18
+ type: RSPrimary
19
+ tags:
20
+ data_center: nyc
21
+ operation: read
22
+ read_preference:
23
+ mode: SecondaryPreferred
24
+ tag_sets:
25
+ - data_center: sf
26
+ suitable_servers:
27
+ - *1
28
+ in_latency_window:
29
+ - *1
@@ -0,0 +1,26 @@
1
+ ---
2
+ topology_description:
3
+ type: ReplicaSetWithPrimary
4
+ servers:
5
+ - address: b:27017
6
+ avg_rtt_ms: 5
7
+ type: RSSecondary
8
+ tags:
9
+ data_center: nyc
10
+ - address: c:27017
11
+ avg_rtt_ms: 100
12
+ type: RSSecondary
13
+ tags:
14
+ data_center: nyc
15
+ - address: a:27017
16
+ avg_rtt_ms: 26
17
+ type: RSPrimary
18
+ tags:
19
+ data_center: nyc
20
+ operation: read
21
+ read_preference:
22
+ mode: Secondary
23
+ tag_sets:
24
+ - data_center: sf
25
+ suitable_servers: []
26
+ in_latency_window: []
@@ -0,0 +1,26 @@
1
+ ---
2
+ topology_description:
3
+ type: Sharded
4
+ servers:
5
+ - &1
6
+ address: g:27017
7
+ avg_rtt_ms: 5
8
+ type: Mongos
9
+ tags:
10
+ data_center: nyc
11
+ - &2
12
+ address: h:27017
13
+ avg_rtt_ms: 35
14
+ type: Mongos
15
+ tags:
16
+ data_center: dc
17
+ operation: read
18
+ read_preference:
19
+ mode: SecondaryPreferred
20
+ tag_sets:
21
+ - data_center: nyc
22
+ suitable_servers:
23
+ - *1
24
+ - *2
25
+ in_latency_window:
26
+ - *1
@@ -0,0 +1,19 @@
1
+ ---
2
+ topology_description:
3
+ type: Single
4
+ servers:
5
+ - &1
6
+ address: a:27017
7
+ avg_rtt_ms: 5
8
+ type: Standalone
9
+ tags:
10
+ data_center: dc
11
+ operation: read
12
+ read_preference:
13
+ mode: SecondaryPreferred
14
+ tag_sets:
15
+ - data_center: nyc
16
+ suitable_servers:
17
+ - *1
18
+ in_latency_window:
19
+ - *1
@@ -0,0 +1,11 @@
1
+ ---
2
+ topology_description:
3
+ type: Unknown
4
+ servers: []
5
+ operation: read
6
+ read_preference:
7
+ mode: SecondaryPreferred
8
+ tag_sets:
9
+ - data_center: nyc
10
+ suitable_servers: []
11
+ in_latency_window: []
@@ -0,0 +1,157 @@
1
+ module Mongo
2
+ module ServerSelection
3
+ module Read
4
+
5
+ # Represents a Server Selection specification test.
6
+ #
7
+ # @since 2.0.0
8
+ class Spec
9
+
10
+ # Mapping of topology description strings to topology type classes.
11
+ #
12
+ # @since 2.0.0
13
+ TOPOLOGY_TYPES = {
14
+ 'ReplicaSetNoPrimary' => Mongo::Cluster::Topology::ReplicaSet,
15
+ 'ReplicaSetWithPrimary' => Mongo::Cluster::Topology::ReplicaSet,
16
+ 'Sharded' => Mongo::Cluster::Topology::Sharded,
17
+ 'Single' => Mongo::Cluster::Topology::Standalone,
18
+ 'Unknown' => Mongo::Cluster::Topology::Unknown
19
+ }
20
+
21
+ # Mapping of read preference modes.
22
+ #
23
+ # @since 2.0.0
24
+ READ_PREFERENCES = {
25
+ 'Primary' => :primary,
26
+ 'Secondary' => :secondary,
27
+ 'PrimaryPreferred' => :primary_preferred,
28
+ 'SecondaryPreferred' => :secondary_preferred,
29
+ 'Nearest' => :nearest,
30
+ }
31
+
32
+ # @return [ String ] description The spec description.
33
+ #
34
+ # @since 2.0.0
35
+ attr_reader :description
36
+
37
+ # @return [ Hash ] read_preference The read preference to be used for selection.
38
+ #
39
+ # @since 2.0.0
40
+ attr_reader :read_preference
41
+
42
+ # @return [ Array<Hash> ] candidate_servers The candidate servers.
43
+ #
44
+ # @since 2.0.0
45
+ attr_reader :candidate_servers
46
+
47
+ # @return [ Array<Hash> ] eligible_servers The eligible servers before the latency
48
+ # window is taken into account.
49
+ #
50
+ # @since 2.0.0
51
+ attr_reader :eligible_servers
52
+
53
+ # @return [ Array<Hash> ] suitable_servers The set of servers matching all server
54
+ # selection logic. May be a subset of eligible_servers and/or candidate_servers.
55
+ #
56
+ # @since 2.0.0
57
+ attr_reader :suitable_servers
58
+
59
+ # @return [ Mongo::Cluster::Topology ] type The topology type.
60
+ #
61
+ # @since 2.0.0
62
+ attr_reader :type
63
+
64
+ # Instantiate the new spec.
65
+ #
66
+ # @example Create the spec.
67
+ # Spec.new(file)
68
+ #
69
+ # @param [ String ] file The name of the file.
70
+ #
71
+ # @since 2.0.0
72
+ def initialize(file)
73
+ @test = YAML.load(ERB.new(File.new(file).read).result)
74
+ @description = "#{@test['topology_description']['type']}: #{File.basename(file)}"
75
+ @read_preference = @test['read_preference']
76
+ @read_preference['mode'] = READ_PREFERENCES[@read_preference['mode']]
77
+ @candidate_servers = @test['topology_description']['servers']
78
+ @suitable_servers = @test['suitable_servers']
79
+ @in_latency_window = @test['in_latency_window']
80
+ @type = TOPOLOGY_TYPES[@test['topology_description']['type']]
81
+ end
82
+
83
+ # Whether this spec describes a replica set.
84
+ #
85
+ # @example Determine if the spec describes a replica set.
86
+ # spec.replica_set?
87
+ #
88
+ # @return [true, false] If the spec describes a replica set.
89
+ #
90
+ # @since 2.0.0
91
+ def replica_set?
92
+ type == Mongo::Cluster::Topology::ReplicaSet
93
+ end
94
+
95
+ # Does this spec raise an exception.
96
+ #
97
+ # @example Determine if the spec raises an exception.
98
+ # spec.raises_exception?
99
+ #
100
+ # @return [true, false] If the spec raises an exception.
101
+ #
102
+ # @since 2.0.0
103
+ def raises_exception?
104
+ !server_available? || invalid_server_preference?
105
+ end
106
+
107
+ # Does this spec expect a server to be found.
108
+ #
109
+ # @example Will a server be found with this spec.
110
+ # spec.server_available?
111
+ #
112
+ # @return [true, false] If a server will be found with this spec.
113
+ #
114
+ # @since 2.0.0
115
+ def server_available?
116
+ !in_latency_window.empty?
117
+ end
118
+
119
+ # Is the read preference defined in the spec invalid.
120
+ #
121
+ # @example Determine if the spec's read preference is invalid.
122
+ # spec.invalid_server_preference?
123
+ #
124
+ # @return [true, false] If the spec's read preference is invalid.
125
+ #
126
+ # @since 2.0.0
127
+ def invalid_server_preference?
128
+ read_preference['mode'] == 'Primary' && read_preference['tag_sets']
129
+ end
130
+
131
+ # The subset of suitable servers that falls within the allowable latency
132
+ # window.
133
+ # We have to correct for our server selection algorithm that adds the primary
134
+ # to the end of the list for SecondaryPreferred read preference mode.
135
+ #
136
+ # @example Get the list of suitable servers within the latency window.
137
+ # spec.in_latency_window
138
+ #
139
+ # @return [ Array<Hash> ] The servers within the latency window.
140
+ #
141
+ # @since 2.0.0
142
+ def in_latency_window
143
+ if read_preference['mode'] == :secondary_preferred && primary
144
+ return @in_latency_window.push(primary).uniq
145
+ end
146
+ @in_latency_window
147
+ end
148
+
149
+ private
150
+
151
+ def primary
152
+ @candidate_servers.find { |s| s['type'] == 'RSPrimary' }
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,41 @@
1
+ module Mongo
2
+ module ServerSelection
3
+ module RTT
4
+
5
+ # Represents a specification.
6
+ #
7
+ # @since 2.0.0
8
+ class Spec
9
+
10
+ # @return [ String ] description The spec description.
11
+ attr_reader :description
12
+
13
+ # @return [ Float ] avg_rtt_ms The starting average round trip time.
14
+ attr_reader :avg_rtt_ms
15
+
16
+ # @return [ Float ] new_rtt_ms The new round trip time for ismaster.
17
+ attr_reader :new_rtt_ms
18
+
19
+ # @return [ Float ] new_avg_rtt The newly calculated moving average round trip time.
20
+ attr_reader :new_avg_rtt
21
+
22
+ # Instantiate the new spec.
23
+ #
24
+ # @example Create the spec.
25
+ # Spec.new(file)
26
+ #
27
+ # @param [ String ] file The name of the file.
28
+ #
29
+ # @since 2.0.0
30
+ def initialize(file)
31
+ @test = YAML.load(ERB.new(File.new(file).read).result)
32
+ @description = "avg_rtt_ms: #{@test['avg_rtt_ms']}, new_rtt_ms: #{@test['new_rtt_ms']}," +
33
+ " new_avg_rtt: #{@test['new_avg_rtt']}"
34
+ @avg_rtt_ms = @test['avg_rtt_ms'] == 'NULL' ? nil : @test['avg_rtt_ms'].to_f
35
+ @new_rtt_ms = @test['new_rtt_ms'].to_f
36
+ @new_avg_rtt = @test['new_avg_rtt'].to_f
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end