mongo 1.12.5 → 2.0.0.beta

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 (437) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CONTRIBUTING.md +64 -0
  5. data/LICENSE +1 -1
  6. data/README.md +23 -125
  7. data/Rakefile +26 -21
  8. data/bin/mongo_console +6 -38
  9. data/lib/mongo.rb +23 -82
  10. data/lib/mongo/address.rb +111 -0
  11. data/lib/mongo/address/ipv4.rb +85 -0
  12. data/lib/mongo/address/ipv6.rb +85 -0
  13. data/lib/mongo/address/unix.rb +76 -0
  14. data/lib/mongo/auth.rb +108 -0
  15. data/lib/mongo/auth/cr.rb +44 -0
  16. data/lib/mongo/auth/cr/conversation.rb +119 -0
  17. data/lib/mongo/auth/executable.rb +52 -0
  18. data/lib/mongo/auth/ldap.rb +48 -0
  19. data/lib/mongo/auth/ldap/conversation.rb +92 -0
  20. data/lib/mongo/auth/roles.rb +104 -0
  21. data/lib/mongo/auth/scram.rb +53 -0
  22. data/lib/mongo/auth/scram/conversation.rb +450 -0
  23. data/lib/mongo/auth/user.rb +159 -0
  24. data/lib/mongo/auth/user/view.rb +102 -0
  25. data/lib/mongo/auth/x509.rb +48 -0
  26. data/lib/mongo/auth/x509/conversation.rb +92 -0
  27. data/lib/mongo/{gridfs.rb → bulk.rb} +2 -5
  28. data/lib/mongo/bulk/bulk_write.rb +307 -0
  29. data/lib/mongo/client.rb +233 -0
  30. data/lib/mongo/cluster.rb +203 -0
  31. data/lib/mongo/cluster/topology.rb +60 -0
  32. data/lib/mongo/cluster/topology/replica_set.rb +160 -0
  33. data/lib/mongo/cluster/topology/sharded.rb +132 -0
  34. data/lib/mongo/cluster/topology/standalone.rb +132 -0
  35. data/lib/mongo/cluster/topology/unknown.rb +155 -0
  36. data/lib/mongo/collection.rb +130 -1101
  37. data/lib/mongo/collection/view.rb +169 -0
  38. data/lib/mongo/collection/view/aggregation.rb +108 -0
  39. data/lib/mongo/collection/view/explainable.rb +49 -0
  40. data/lib/mongo/collection/view/immutable.rb +43 -0
  41. data/lib/mongo/collection/view/iterable.rb +48 -0
  42. data/lib/mongo/collection/view/map_reduce.rb +191 -0
  43. data/lib/mongo/collection/view/readable.rb +363 -0
  44. data/lib/mongo/collection/view/writable.rb +169 -0
  45. data/lib/mongo/cursor.rb +79 -680
  46. data/lib/mongo/database.rb +224 -0
  47. data/lib/mongo/database/view.rb +101 -0
  48. data/lib/mongo/error.rb +81 -0
  49. data/lib/mongo/error/bulk_write_failure.rb +41 -0
  50. data/lib/mongo/{utils/thread_local_variable_manager.rb → error/empty_batch.rb} +22 -8
  51. data/{test/functional/db_connection_test.rb → lib/mongo/error/invalid_bulk_operation.rb} +19 -8
  52. data/lib/mongo/error/invalid_collection_name.rb +39 -0
  53. data/lib/mongo/error/invalid_database_name.rb +39 -0
  54. data/{test/replica_set/ssl_test.rb → lib/mongo/error/invalid_document.rb} +21 -14
  55. data/lib/mongo/error/invalid_file.rb +38 -0
  56. data/lib/mongo/error/invalid_nonce.rb +46 -0
  57. data/lib/mongo/error/invalid_replacement_document.rb +39 -0
  58. data/lib/mongo/error/invalid_signature.rb +47 -0
  59. data/{test/functional/ssl_test.rb → lib/mongo/error/invalid_update_document.rb} +22 -12
  60. data/lib/mongo/error/max_bson_size.rb +40 -0
  61. data/lib/mongo/error/max_message_size.rb +42 -0
  62. data/lib/mongo/{utils.rb → error/need_primary_server.rb} +10 -6
  63. data/lib/mongo/{connection.rb → error/operation_failure.rb} +10 -6
  64. data/lib/mongo/error/parser.rb +77 -0
  65. data/lib/mongo/{connection/socket.rb → error/socket_error.rb} +10 -5
  66. data/lib/mongo/error/socket_timeout_error.rb +23 -0
  67. data/lib/mongo/error/unsupported_features.rb +43 -0
  68. data/lib/mongo/event.rb +40 -0
  69. data/lib/mongo/event/listeners.rb +63 -0
  70. data/lib/mongo/event/primary_elected.rb +53 -0
  71. data/lib/mongo/event/publisher.rb +42 -0
  72. data/lib/mongo/event/server_added.rb +53 -0
  73. data/lib/mongo/event/server_removed.rb +53 -0
  74. data/lib/mongo/event/subscriber.rb +41 -0
  75. data/lib/mongo/grid.rb +16 -0
  76. data/lib/mongo/grid/file.rb +94 -0
  77. data/lib/mongo/grid/file/chunk.rb +184 -0
  78. data/lib/mongo/grid/file/metadata.rb +223 -0
  79. data/lib/mongo/grid/fs.rb +149 -0
  80. data/lib/mongo/index.rb +64 -0
  81. data/lib/mongo/index/view.rb +205 -0
  82. data/lib/mongo/loggable.rb +126 -0
  83. data/lib/mongo/logger.rb +132 -0
  84. data/lib/mongo/operation.rb +26 -0
  85. data/lib/mongo/operation/aggregate.rb +100 -0
  86. data/lib/mongo/operation/aggregate/result.rb +84 -0
  87. data/lib/mongo/operation/batchable.rb +103 -0
  88. data/lib/mongo/operation/bulk_delete/result.rb +197 -0
  89. data/lib/mongo/operation/bulk_insert/result.rb +195 -0
  90. data/lib/mongo/operation/bulk_update/result.rb +295 -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 +116 -0
  96. data/lib/mongo/operation/list_indexes/result.rb +118 -0
  97. data/lib/mongo/operation/map_reduce.rb +96 -0
  98. data/lib/mongo/operation/map_reduce/result.rb +122 -0
  99. data/lib/mongo/{functional.rb → operation/read.rb} +7 -7
  100. data/lib/mongo/operation/read/collections_info.rb +67 -0
  101. data/lib/mongo/operation/read/get_more.rb +71 -0
  102. data/lib/mongo/operation/read/indexes.rb +68 -0
  103. data/lib/mongo/operation/read/list_collections.rb +75 -0
  104. data/lib/mongo/operation/read/list_indexes.rb +77 -0
  105. data/lib/mongo/operation/read/query.rb +71 -0
  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 +380 -0
  109. data/lib/mongo/operation/write.rb +25 -0
  110. data/lib/mongo/operation/write/bulk_delete.rb +158 -0
  111. data/lib/mongo/operation/write/bulk_insert.rb +160 -0
  112. data/lib/mongo/operation/write/bulk_update.rb +167 -0
  113. data/lib/mongo/{connection/socket/socket_util.rb → operation/write/command.rb} +9 -24
  114. data/lib/mongo/operation/write/command/create_user.rb +43 -0
  115. data/lib/mongo/operation/write/command/delete.rb +56 -0
  116. data/lib/mongo/operation/write/command/drop_index.rb +51 -0
  117. data/lib/mongo/operation/write/command/ensure_index.rb +55 -0
  118. data/lib/mongo/operation/write/command/insert.rb +55 -0
  119. data/lib/mongo/operation/write/command/remove_user.rb +42 -0
  120. data/lib/mongo/operation/write/command/update.rb +60 -0
  121. data/lib/mongo/operation/write/command/writable.rb +61 -0
  122. data/lib/mongo/operation/write/create_index.rb +84 -0
  123. data/lib/mongo/operation/write/create_user.rb +75 -0
  124. data/lib/mongo/operation/write/delete.rb +91 -0
  125. data/lib/mongo/operation/write/drop_index.rb +62 -0
  126. data/lib/mongo/operation/write/insert.rb +88 -0
  127. data/lib/mongo/operation/write/remove_user.rb +70 -0
  128. data/lib/mongo/operation/write/update.rb +98 -0
  129. data/lib/mongo/protocol.rb +15 -0
  130. data/lib/mongo/protocol/bit_vector.rb +61 -0
  131. data/lib/mongo/protocol/delete.rb +94 -0
  132. data/lib/mongo/protocol/get_more.rb +99 -0
  133. data/lib/mongo/protocol/insert.rb +99 -0
  134. data/lib/mongo/protocol/kill_cursors.rb +74 -0
  135. data/lib/mongo/protocol/message.rb +252 -0
  136. data/lib/mongo/protocol/query.rb +147 -0
  137. data/lib/mongo/protocol/reply.rb +72 -0
  138. data/lib/mongo/protocol/serializers.rb +180 -0
  139. data/lib/mongo/protocol/update.rb +111 -0
  140. data/lib/mongo/server.rb +163 -0
  141. data/lib/mongo/server/connectable.rb +99 -0
  142. data/lib/mongo/server/connection.rb +133 -0
  143. data/lib/mongo/server/connection_pool.rb +141 -0
  144. data/lib/mongo/server/connection_pool/queue.rb +182 -0
  145. data/lib/mongo/server/context.rb +66 -0
  146. data/lib/mongo/server/description.rb +450 -0
  147. data/lib/mongo/server/description/features.rb +85 -0
  148. data/lib/mongo/server/description/inspector.rb +79 -0
  149. data/lib/mongo/server/description/inspector/primary_elected.rb +58 -0
  150. data/lib/mongo/server/description/inspector/server_added.rb +59 -0
  151. data/lib/mongo/server/description/inspector/server_removed.rb +59 -0
  152. data/lib/mongo/server/monitor.rb +160 -0
  153. data/lib/mongo/server/monitor/connection.rb +88 -0
  154. data/lib/mongo/server_selector.rb +81 -0
  155. data/lib/mongo/server_selector/nearest.rb +94 -0
  156. data/lib/mongo/server_selector/primary.rb +88 -0
  157. data/lib/mongo/server_selector/primary_preferred.rb +94 -0
  158. data/lib/mongo/server_selector/secondary.rb +91 -0
  159. data/lib/mongo/server_selector/secondary_preferred.rb +96 -0
  160. data/lib/mongo/server_selector/selectable.rb +209 -0
  161. data/lib/mongo/socket.rb +179 -0
  162. data/lib/mongo/socket/ssl.rb +108 -0
  163. data/lib/mongo/socket/tcp.rb +69 -0
  164. data/lib/mongo/socket/unix.rb +66 -0
  165. data/lib/mongo/uri.rb +504 -0
  166. data/lib/mongo/version.rb +21 -0
  167. data/lib/mongo/write_concern.rb +99 -0
  168. data/lib/mongo/write_concern/acknowledged.rb +38 -0
  169. data/lib/mongo/write_concern/normalizable.rb +73 -0
  170. data/lib/mongo/write_concern/unacknowledged.rb +43 -0
  171. data/mongo.gemspec +17 -14
  172. data/spec/mongo/address/ipv4_spec.rb +74 -0
  173. data/spec/mongo/address/ipv6_spec.rb +74 -0
  174. data/spec/mongo/address/unix_spec.rb +30 -0
  175. data/spec/mongo/address_spec.rb +206 -0
  176. data/spec/mongo/auth/cr_spec.rb +59 -0
  177. data/spec/mongo/auth/ldap_spec.rb +40 -0
  178. data/spec/mongo/auth/scram/conversation_spec.rb +197 -0
  179. data/spec/mongo/auth/scram_spec.rb +55 -0
  180. data/spec/mongo/auth/user/view_spec.rb +76 -0
  181. data/spec/mongo/auth/user_spec.rb +190 -0
  182. data/spec/mongo/auth/x509_spec.rb +40 -0
  183. data/spec/mongo/auth_spec.rb +65 -0
  184. data/spec/mongo/bulk/bulk_write_spec.rb +175 -0
  185. data/spec/mongo/client_spec.rb +564 -0
  186. data/spec/mongo/cluster/topology/replica_set_spec.rb +101 -0
  187. data/spec/mongo/cluster/topology/sharded_spec.rb +74 -0
  188. data/spec/mongo/cluster/topology/standalone_spec.rb +79 -0
  189. data/spec/mongo/cluster/topology_spec.rb +65 -0
  190. data/spec/mongo/cluster_spec.rb +129 -0
  191. data/spec/mongo/collection/view/aggregation_spec.rb +135 -0
  192. data/spec/mongo/collection/view/explainable_spec.rb +32 -0
  193. data/spec/mongo/collection/view/map_reduce_spec.rb +242 -0
  194. data/spec/mongo/collection/view/readable_spec.rb +603 -0
  195. data/spec/mongo/collection/view/writable_spec.rb +504 -0
  196. data/spec/mongo/collection/view_spec.rb +521 -0
  197. data/spec/mongo/collection_spec.rb +362 -0
  198. data/spec/mongo/cursor_spec.rb +295 -0
  199. data/spec/mongo/database_spec.rb +306 -0
  200. data/spec/mongo/error/parser_spec.rb +119 -0
  201. data/spec/mongo/event/publisher_spec.rb +50 -0
  202. data/spec/mongo/event/subscriber_spec.rb +34 -0
  203. data/spec/mongo/grid/file/chunk_spec.rb +226 -0
  204. data/spec/mongo/grid/file/metadata_spec.rb +69 -0
  205. data/spec/mongo/grid/file_spec.rb +138 -0
  206. data/spec/mongo/grid/fs_spec.rb +129 -0
  207. data/spec/mongo/index/view_spec.rb +226 -0
  208. data/spec/mongo/loggable_spec.rb +62 -0
  209. data/spec/mongo/logger_spec.rb +97 -0
  210. data/spec/mongo/operation/aggregate/result_spec.rb +80 -0
  211. data/spec/mongo/operation/aggregate_spec.rb +135 -0
  212. data/spec/mongo/operation/command_spec.rb +106 -0
  213. data/spec/mongo/operation/kill_cursors_spec.rb +66 -0
  214. data/spec/mongo/operation/limited_spec.rb +50 -0
  215. data/spec/mongo/operation/map_reduce_spec.rb +143 -0
  216. data/spec/mongo/operation/read/collections_info_spec.rb +40 -0
  217. data/spec/mongo/operation/read/get_more_spec.rb +81 -0
  218. data/spec/mongo/operation/read/indexes_spec.rb +31 -0
  219. data/spec/mongo/operation/read/query_spec.rb +84 -0
  220. data/spec/mongo/operation/result_spec.rb +275 -0
  221. data/spec/mongo/operation/specifiable_spec.rb +53 -0
  222. data/spec/mongo/operation/write/bulk_delete_spec.rb +473 -0
  223. data/spec/mongo/operation/write/bulk_insert_spec.rb +466 -0
  224. data/spec/mongo/operation/write/bulk_update_spec.rb +524 -0
  225. data/spec/mongo/operation/write/command/delete_spec.rb +116 -0
  226. data/spec/mongo/operation/write/command/insert_spec.rb +117 -0
  227. data/spec/mongo/operation/write/command/update_spec.rb +123 -0
  228. data/spec/mongo/operation/write/create_user_spec.rb +44 -0
  229. data/spec/mongo/operation/write/delete_spec.rb +178 -0
  230. data/spec/mongo/operation/write/drop_index_spec.rb +51 -0
  231. data/spec/mongo/operation/write/ensure_index_spec.rb +81 -0
  232. data/spec/mongo/operation/write/insert_spec.rb +231 -0
  233. data/spec/mongo/operation/write/remove_user_spec.rb +46 -0
  234. data/spec/mongo/operation/write/response_spec.rb +85 -0
  235. data/spec/mongo/operation/write/update_spec.rb +177 -0
  236. data/spec/mongo/protocol/delete_spec.rb +167 -0
  237. data/spec/mongo/protocol/get_more_spec.rb +146 -0
  238. data/spec/mongo/protocol/insert_spec.rb +161 -0
  239. data/spec/mongo/protocol/kill_cursors_spec.rb +101 -0
  240. data/spec/mongo/protocol/query_spec.rb +285 -0
  241. data/spec/mongo/protocol/reply_spec.rb +157 -0
  242. data/spec/mongo/protocol/update_spec.rb +186 -0
  243. data/spec/mongo/server/connection_pool/queue_spec.rb +170 -0
  244. data/spec/mongo/server/connection_pool_spec.rb +120 -0
  245. data/spec/mongo/server/connection_spec.rb +289 -0
  246. data/spec/mongo/server/description/features_spec.rb +138 -0
  247. data/spec/mongo/server/description/inspector/primary_elected_spec.rb +94 -0
  248. data/spec/mongo/server/description/inspector/server_added_spec.rb +92 -0
  249. data/spec/mongo/server/description/inspector/server_removed_spec.rb +95 -0
  250. data/spec/mongo/server/description_spec.rb +510 -0
  251. data/spec/mongo/server/monitor_spec.rb +130 -0
  252. data/spec/mongo/server_discovery_and_monitoring_spec.rb +103 -0
  253. data/spec/mongo/server_selection_rtt_spec.rb +104 -0
  254. data/spec/mongo/server_selection_spec.rb +89 -0
  255. data/spec/mongo/server_selector/nearest_spec.rb +250 -0
  256. data/spec/mongo/server_selector/primary_preferred_spec.rb +290 -0
  257. data/spec/mongo/server_selector/primary_spec.rb +114 -0
  258. data/spec/mongo/server_selector/secondary_preferred_spec.rb +252 -0
  259. data/spec/mongo/server_selector/secondary_spec.rb +196 -0
  260. data/spec/mongo/server_selector_spec.rb +101 -0
  261. data/spec/mongo/server_spec.rb +131 -0
  262. data/spec/mongo/uri_spec.rb +517 -0
  263. data/spec/mongo/write_concern/acknowledged_spec.rb +44 -0
  264. data/spec/mongo/write_concern/unacknowledged_spec.rb +15 -0
  265. data/spec/mongo_orchestration_spec.rb +70 -0
  266. data/spec/spec_helper.rb +148 -0
  267. data/spec/support/authorization.rb +245 -0
  268. data/spec/support/helpers.rb +140 -0
  269. data/spec/support/matchers.rb +37 -0
  270. data/spec/support/mongo_orchestration.rb +61 -0
  271. data/spec/support/mongo_orchestration/requestable.rb +109 -0
  272. data/spec/support/mongo_orchestration/standalone.rb +57 -0
  273. data/spec/support/sdam/rs/discover_arbiters.yml +41 -0
  274. data/spec/support/sdam/rs/discover_passives.yml +41 -0
  275. data/spec/support/sdam/rs/discover_primary.yml +40 -0
  276. data/spec/support/sdam/rs/discover_secondary.yml +41 -0
  277. data/spec/support/sdam/rs/discovery.yml +195 -0
  278. data/spec/support/sdam/rs/ghost_discovered.yml +39 -0
  279. data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +34 -0
  280. data/spec/support/sdam/rs/member_reconfig.yml +68 -0
  281. data/spec/support/sdam/rs/member_standalone.yml +60 -0
  282. data/spec/support/sdam/rs/new_primary.yml +74 -0
  283. data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +71 -0
  284. data/spec/support/sdam/rs/non_rs_member.yml +31 -0
  285. data/spec/support/sdam/rs/normalize_case.yml +49 -0
  286. data/spec/support/sdam/rs/primary_becomes_standalone.yml +52 -0
  287. data/spec/support/sdam/rs/primary_changes_set_name.yml +57 -0
  288. data/spec/support/sdam/rs/primary_disconnect.yml +56 -0
  289. data/spec/support/sdam/rs/primary_wrong_set_name.yml +27 -0
  290. data/spec/support/sdam/rs/response_from_removed.yml +63 -0
  291. data/spec/support/sdam/rs/rsother_discovered.yml +41 -0
  292. data/spec/support/sdam/rs/sec_not_auth.yml +49 -0
  293. data/spec/support/sdam/rs/secondary_wrong_set_name.yml +28 -0
  294. data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +69 -0
  295. data/spec/support/sdam/rs/unexpected_mongos.yml +26 -0
  296. data/spec/support/sdam/rs/wrong_set_name.yml +35 -0
  297. data/spec/support/sdam/sharded/multiple_mongoses.yml +46 -0
  298. data/spec/support/sdam/sharded/non_mongos_removed.yml +41 -0
  299. data/spec/support/sdam/sharded/normalize_uri_case.yml +32 -0
  300. data/spec/support/sdam/single/direct_connection_external_ip.yml +34 -0
  301. data/spec/support/sdam/single/direct_connection_mongos.yml +33 -0
  302. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +35 -0
  303. data/spec/support/sdam/single/direct_connection_rsprimary.yml +34 -0
  304. data/spec/support/sdam/single/direct_connection_rssecondary.yml +35 -0
  305. data/spec/support/sdam/single/direct_connection_slave.yml +32 -0
  306. data/spec/support/sdam/single/direct_connection_standalone.yml +32 -0
  307. data/spec/support/sdam/single/not_ok_response.yml +39 -0
  308. data/spec/support/sdam/single/standalone_removed.yml +32 -0
  309. data/spec/support/sdam/single/unavailable_seed.yml +28 -0
  310. data/spec/support/server_discovery_and_monitoring.rb +167 -0
  311. data/spec/support/server_selection.rb +140 -0
  312. data/spec/support/server_selection/rtt/first_value.yml +4 -0
  313. data/spec/support/server_selection/rtt/first_value_zero.yml +4 -0
  314. data/spec/support/server_selection/rtt/value_test_1.yml +4 -0
  315. data/spec/support/server_selection/rtt/value_test_2.yml +4 -0
  316. data/spec/support/server_selection/rtt/value_test_3.yml +4 -0
  317. data/spec/support/server_selection/rtt/value_test_4.yml +4 -0
  318. data/spec/support/server_selection/rtt/value_test_5.yml +4 -0
  319. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest.yml +32 -0
  320. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +27 -0
  321. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +23 -0
  322. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +32 -0
  323. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +27 -0
  324. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +32 -0
  325. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +32 -0
  326. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +27 -0
  327. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +27 -0
  328. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +41 -0
  329. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +34 -0
  330. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +33 -0
  331. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +39 -0
  332. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +36 -0
  333. data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +32 -0
  334. data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +23 -0
  335. data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +13 -0
  336. data/spec/support/server_selection_rtt.rb +41 -0
  337. data/spec/support/shared/bulk_write.rb +498 -0
  338. data/spec/support/shared/cursor.rb +38 -0
  339. data/spec/support/shared/operation.rb +77 -0
  340. data/spec/support/shared/protocol.rb +31 -0
  341. data/spec/support/shared/server_selector.rb +111 -0
  342. data/spec/support/shared/socket.rb +82 -0
  343. data/spec/support/travis.rb +14 -0
  344. metadata +523 -189
  345. metadata.gz.sig +0 -0
  346. data/VERSION +0 -1
  347. data/lib/mongo/bulk_write_collection_view.rb +0 -387
  348. data/lib/mongo/collection_writer.rb +0 -364
  349. data/lib/mongo/connection/node.rb +0 -249
  350. data/lib/mongo/connection/pool.rb +0 -340
  351. data/lib/mongo/connection/pool_manager.rb +0 -320
  352. data/lib/mongo/connection/sharding_pool_manager.rb +0 -67
  353. data/lib/mongo/connection/socket/ssl_socket.rb +0 -95
  354. data/lib/mongo/connection/socket/tcp_socket.rb +0 -87
  355. data/lib/mongo/connection/socket/unix_socket.rb +0 -39
  356. data/lib/mongo/db.rb +0 -808
  357. data/lib/mongo/exception.rb +0 -145
  358. data/lib/mongo/functional/authentication.rb +0 -455
  359. data/lib/mongo/functional/logging.rb +0 -85
  360. data/lib/mongo/functional/read_preference.rb +0 -183
  361. data/lib/mongo/functional/scram.rb +0 -556
  362. data/lib/mongo/functional/uri_parser.rb +0 -409
  363. data/lib/mongo/functional/write_concern.rb +0 -66
  364. data/lib/mongo/gridfs/grid.rb +0 -112
  365. data/lib/mongo/gridfs/grid_ext.rb +0 -53
  366. data/lib/mongo/gridfs/grid_file_system.rb +0 -163
  367. data/lib/mongo/gridfs/grid_io.rb +0 -484
  368. data/lib/mongo/legacy.rb +0 -140
  369. data/lib/mongo/mongo_client.rb +0 -697
  370. data/lib/mongo/mongo_replica_set_client.rb +0 -535
  371. data/lib/mongo/mongo_sharded_client.rb +0 -159
  372. data/lib/mongo/networking.rb +0 -372
  373. data/lib/mongo/utils/conversions.rb +0 -110
  374. data/lib/mongo/utils/core_ext.rb +0 -70
  375. data/lib/mongo/utils/server_version.rb +0 -69
  376. data/lib/mongo/utils/support.rb +0 -80
  377. data/test/functional/authentication_test.rb +0 -39
  378. data/test/functional/bulk_api_stress_test.rb +0 -133
  379. data/test/functional/bulk_write_collection_view_test.rb +0 -1198
  380. data/test/functional/client_test.rb +0 -627
  381. data/test/functional/collection_test.rb +0 -2175
  382. data/test/functional/collection_writer_test.rb +0 -83
  383. data/test/functional/conversions_test.rb +0 -163
  384. data/test/functional/cursor_fail_test.rb +0 -57
  385. data/test/functional/cursor_message_test.rb +0 -56
  386. data/test/functional/cursor_test.rb +0 -683
  387. data/test/functional/db_api_test.rb +0 -835
  388. data/test/functional/db_test.rb +0 -348
  389. data/test/functional/grid_file_system_test.rb +0 -285
  390. data/test/functional/grid_io_test.rb +0 -252
  391. data/test/functional/grid_test.rb +0 -273
  392. data/test/functional/pool_test.rb +0 -136
  393. data/test/functional/safe_test.rb +0 -98
  394. data/test/functional/support_test.rb +0 -62
  395. data/test/functional/timeout_test.rb +0 -60
  396. data/test/functional/uri_test.rb +0 -446
  397. data/test/functional/write_concern_test.rb +0 -118
  398. data/test/helpers/general.rb +0 -50
  399. data/test/helpers/test_unit.rb +0 -476
  400. data/test/replica_set/authentication_test.rb +0 -37
  401. data/test/replica_set/basic_test.rb +0 -189
  402. data/test/replica_set/client_test.rb +0 -393
  403. data/test/replica_set/connection_test.rb +0 -138
  404. data/test/replica_set/count_test.rb +0 -66
  405. data/test/replica_set/cursor_test.rb +0 -220
  406. data/test/replica_set/insert_test.rb +0 -157
  407. data/test/replica_set/max_values_test.rb +0 -151
  408. data/test/replica_set/pinning_test.rb +0 -105
  409. data/test/replica_set/query_test.rb +0 -73
  410. data/test/replica_set/read_preference_test.rb +0 -219
  411. data/test/replica_set/refresh_test.rb +0 -211
  412. data/test/replica_set/replication_ack_test.rb +0 -95
  413. data/test/sharded_cluster/basic_test.rb +0 -203
  414. data/test/shared/authentication/basic_auth_shared.rb +0 -260
  415. data/test/shared/authentication/bulk_api_auth_shared.rb +0 -249
  416. data/test/shared/authentication/gssapi_shared.rb +0 -176
  417. data/test/shared/authentication/sasl_plain_shared.rb +0 -96
  418. data/test/shared/authentication/scram_shared.rb +0 -92
  419. data/test/shared/ssl_shared.rb +0 -235
  420. data/test/test_helper.rb +0 -61
  421. data/test/threading/basic_test.rb +0 -120
  422. data/test/tools/mongo_config.rb +0 -708
  423. data/test/tools/mongo_config_test.rb +0 -160
  424. data/test/unit/client_test.rb +0 -381
  425. data/test/unit/collection_test.rb +0 -166
  426. data/test/unit/connection_test.rb +0 -335
  427. data/test/unit/cursor_test.rb +0 -307
  428. data/test/unit/db_test.rb +0 -136
  429. data/test/unit/grid_test.rb +0 -76
  430. data/test/unit/mongo_sharded_client_test.rb +0 -48
  431. data/test/unit/node_test.rb +0 -93
  432. data/test/unit/pool_manager_test.rb +0 -111
  433. data/test/unit/read_pref_test.rb +0 -406
  434. data/test/unit/read_test.rb +0 -159
  435. data/test/unit/safe_test.rb +0 -158
  436. data/test/unit/sharding_pool_manager_test.rb +0 -84
  437. data/test/unit/write_concern_test.rb +0 -175
@@ -1,249 +0,0 @@
1
- # Copyright (C) 2009-2013 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 Node
17
-
18
- attr_accessor :host, :port, :address, :client, :socket, :last_state
19
-
20
- def initialize(client, host_port)
21
- @client = client
22
- @manager = @client.local_manager
23
- @host, @port = Support.normalize_seeds(host_port)
24
- @address = "#{@host}:#{@port}"
25
- @config = nil
26
- @socket = nil
27
- @node_mutex = Monitor.new
28
- end
29
-
30
- def eql?(other)
31
- (other.is_a?(Node) && @address == other.address)
32
- end
33
- alias :== :eql?
34
-
35
- def =~(other)
36
- if other.is_a?(String)
37
- h, p = Support.normalize_seeds(other)
38
- h == @host && p == @port
39
- else
40
- false
41
- end
42
- end
43
-
44
- def host_string
45
- address
46
- end
47
-
48
- def config
49
- connect unless connected?
50
- set_config unless @config || !connected?
51
- @config
52
- end
53
-
54
- def inspect
55
- "<Mongo::Node:0x#{self.object_id.to_s(16)} @host=#{@host} @port=#{@port}>"
56
- end
57
-
58
- # Create a connection to the provided node,
59
- # and, if successful, return the socket. Otherwise,
60
- # return nil.
61
- def connect
62
- @node_mutex.synchronize do
63
- begin
64
- @socket = @client.socket_class.new(@host, @port,
65
- @client.op_timeout,
66
- @client.connect_timeout,
67
- @client.socket_opts)
68
- rescue ConnectionTimeoutError, OperationTimeout, ConnectionFailure, OperationFailure,
69
- SocketError, SystemCallError, IOError => ex
70
- @client.log(:debug, "Failed connection to #{host_string} with #{ex.class}, #{ex.message}.")
71
- close
72
- end
73
- end
74
- end
75
-
76
- # This should only be called within a mutex
77
- def close
78
- if @socket && !@socket.closed?
79
- @socket.close
80
- end
81
- @socket = nil
82
- @config = nil
83
- end
84
-
85
- def connected?
86
- @socket != nil && !@socket.closed?
87
- end
88
-
89
- def active?
90
- begin
91
- result = @client['admin'].command({:ping => 1}, :socket => usable_socket)
92
- rescue OperationFailure, SocketError, SystemCallError, IOError
93
- return nil
94
- end
95
- result['ok'] == 1
96
- end
97
-
98
- # Get the configuration for the provided node as returned by the
99
- # ismaster command. Additionally, check that the replica set name
100
- # matches with the name provided.
101
- def set_config
102
- @node_mutex.synchronize do
103
- begin
104
- if @config
105
- @last_state = @config['ismaster'] ? :primary : :other
106
- end
107
-
108
- if @client.connect_timeout
109
- Timeout::timeout(@client.connect_timeout, OperationTimeout) do
110
- @config = @client['admin'].command({:ismaster => 1}, :socket => usable_socket)
111
- end
112
- else
113
- @config = @client['admin'].command({:ismaster => 1}, :socket => usable_socket)
114
- end
115
-
116
- update_max_sizes
117
-
118
- if @config['msg']
119
- @client.log(:warn, "#{config['msg']}")
120
- end
121
-
122
- unless @client.mongos?
123
- check_set_membership(@config)
124
- check_set_name(@config)
125
- end
126
- rescue ConnectionFailure, OperationFailure, OperationTimeout, SocketError, SystemCallError, IOError => ex
127
- @client.log(:warn, "Attempted connection to node #{host_string} raised " +
128
- "#{ex.class}: #{ex.message}")
129
- # Socket may already be nil from issuing command
130
- close
131
- end
132
- end
133
- end
134
-
135
- # Return a list of replica set nodes from the config.
136
- # Note: this excludes arbiters.
137
- def node_list
138
- nodes = []
139
- nodes += config['hosts'] if config['hosts']
140
- nodes += config['passives'] if config['passives']
141
- nodes += ["#{@host}:#{@port}"] if @client.mongos?
142
- nodes
143
- end
144
-
145
- def arbiters
146
- return [] unless config['arbiters']
147
- config['arbiters'].map do |arbiter|
148
- Support.normalize_seeds(arbiter)
149
- end
150
- end
151
-
152
- def primary?
153
- config['ismaster'] == true || config['ismaster'] == 1
154
- end
155
-
156
- def secondary?
157
- config['secondary'] == true || config['secondary'] == 1
158
- end
159
-
160
- def tags
161
- config['tags'] || {}
162
- end
163
-
164
- def host_port
165
- [@host, @port]
166
- end
167
-
168
- def hash
169
- address.hash
170
- end
171
-
172
- def healthy?
173
- connected? && config
174
- end
175
-
176
- def max_bson_size
177
- @max_bson_size || DEFAULT_MAX_BSON_SIZE
178
- end
179
-
180
- def max_message_size
181
- @max_message_size || max_bson_size * MESSAGE_SIZE_FACTOR
182
- end
183
-
184
- def max_wire_version
185
- @max_wire_version || 0
186
- end
187
-
188
- def min_wire_version
189
- @min_wire_version || 0
190
- end
191
-
192
- def wire_version_feature?(feature)
193
- min_wire_version <= feature && feature <= max_wire_version
194
- end
195
-
196
- def max_write_batch_size
197
- @max_write_batch_size || Mongo::MongoClient::DEFAULT_MAX_WRITE_BATCH_SIZE
198
- end
199
-
200
- protected
201
-
202
- # Ensure that this node is a healthy member of a replica set.
203
- def check_set_membership(config)
204
- if !config.has_key?('hosts')
205
- message = "Will not connect to #{host_string} because it's not a member " +
206
- "of a replica set."
207
- raise ConnectionFailure, message
208
- elsif config['hosts'].length == 1 && !config['ismaster'] &&
209
- !config['secondary']
210
- message = "Attempting to connect to an unhealthy, single-node replica set."
211
- raise ConnectionFailure, message
212
- end
213
- end
214
-
215
- # Ensure that this node is part of a replica set of the expected name.
216
- def check_set_name(config)
217
- if @client.replica_set_name
218
- if !config['setName']
219
- @client.log(:warn, "Could not verify replica set name for member #{host_string} " +
220
- "because ismaster does not return name in this version of MongoDB")
221
- elsif @client.replica_set_name != config['setName']
222
- message = "Attempting to connect to replica set '#{config['setName']}' on member #{host_string} " +
223
- "but expected '#{@client.replica_set_name}'"
224
- raise ReplicaSetConnectionError, message
225
- end
226
- end
227
- end
228
-
229
- private
230
-
231
- def usable_socket
232
- if @socket && @socket.pid != Process.pid
233
- @socket.close
234
- @socket = nil
235
- connect
236
- else
237
- @socket
238
- end
239
- end
240
-
241
- def update_max_sizes
242
- @max_bson_size = config['maxBsonObjectSize'] || DEFAULT_MAX_BSON_SIZE
243
- @max_message_size = config['maxMessageSizeBytes'] || @max_bson_size * MESSAGE_SIZE_FACTOR
244
- @max_wire_version = config['maxWireVersion'] || 0
245
- @min_wire_version = config['minWireVersion'] || 0
246
- @max_write_batch_size = config['maxWriteBatchSize'] || Mongo::MongoClient::DEFAULT_MAX_WRITE_BATCH_SIZE
247
- end
248
- end
249
- end
@@ -1,340 +0,0 @@
1
- # Copyright (C) 2009-2013 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 Pool
17
- PING_ATTEMPTS = 6
18
- MAX_PING_TIME = 1_000_000
19
- PRUNE_INTERVAL = 10_000
20
-
21
- attr_accessor :host,
22
- :port,
23
- :address,
24
- :size,
25
- :timeout,
26
- :checked_out,
27
- :client,
28
- :node
29
-
30
- # Create a new pool of connections.
31
- def initialize(client, host, port, opts={})
32
- @client = client
33
-
34
- @host, @port = host, port
35
-
36
- # A Mongo::Node object.
37
- @node = opts[:node]
38
-
39
- # The string address
40
- @address = "#{@host}:#{@port}"
41
-
42
- # Pool size and timeout.
43
- @size = opts.fetch(:size, 20)
44
- @timeout = opts.fetch(:timeout, 30)
45
-
46
- # Mutex for synchronizing pool access
47
- @connection_mutex = Mutex.new
48
-
49
- # Mutex for synchronizing pings
50
- @ping_mutex = Mutex.new
51
-
52
- # Condition variable for signal and wait
53
- @queue = ConditionVariable.new
54
-
55
- @sockets = []
56
- @checked_out = []
57
- @ping_time = nil
58
- @last_ping = nil
59
- @closed = false
60
- @thread_ids_to_sockets = {}
61
- @checkout_counter = 0
62
- end
63
-
64
- # Close this pool.
65
- #
66
- # @option opts [Boolean]:soft (false) If true,
67
- # close only those sockets that are not checked out.
68
- def close(opts={})
69
- @connection_mutex.synchronize do
70
- if opts[:soft] && !@checked_out.empty?
71
- @closing = true
72
- close_sockets(@sockets - @checked_out)
73
- else
74
- close_sockets(@sockets)
75
- @closed = true
76
- end
77
- @node.close if @node
78
- end
79
- true
80
- end
81
-
82
- def tags
83
- @node.tags
84
- end
85
-
86
- def healthy?
87
- close if @sockets.all?(&:closed?)
88
- !closed? && node.healthy?
89
- end
90
-
91
- def closed?
92
- @closed
93
- end
94
-
95
- def up?
96
- !@closed
97
- end
98
-
99
- def inspect
100
- "#<Mongo::Pool:0x#{self.object_id.to_s(16)} @host=#{@host} @port=#{port} " +
101
- "@ping_time=#{@ping_time} #{@checked_out.size}/#{@size} sockets available " +
102
- "up=#{!closed?}>"
103
- end
104
-
105
- def host_string
106
- "#{@host}:#{@port}"
107
- end
108
-
109
- def host_port
110
- [@host, @port]
111
- end
112
-
113
- # Refresh ping time only if we haven't
114
- # checked within the last five minutes.
115
- def ping_time
116
- @ping_mutex.synchronize do
117
- if !@last_ping || (Time.now - @last_ping) > 300
118
- @ping_time = refresh_ping_time
119
- @last_ping = Time.now
120
- end
121
- end
122
- @ping_time
123
- end
124
-
125
- # Return the time it takes on average
126
- # to do a round-trip against this node.
127
- def refresh_ping_time
128
- trials = []
129
- PING_ATTEMPTS.times do
130
- t1 = Time.now
131
- if !self.ping
132
- return MAX_PING_TIME
133
- end
134
- trials << (Time.now - t1) * 1000
135
- end
136
-
137
- trials.sort!
138
-
139
- # Delete shortest and longest times
140
- trials.delete_at(trials.length-1)
141
- trials.delete_at(0)
142
-
143
- total = 0.0
144
- trials.each { |t| total += t }
145
-
146
- (total / trials.length).ceil
147
- end
148
-
149
- def ping
150
- begin
151
- return self.client['admin'].command({:ping => 1}, :socket => @node.socket,
152
- :timeout => client.op_timeout || MongoClient::DEFAULT_OP_TIMEOUT)
153
- rescue ConnectionFailure, OperationFailure, SocketError, SystemCallError, IOError
154
- return false
155
- end
156
- end
157
-
158
- # Return a socket to the pool.
159
- def checkin(socket)
160
- @connection_mutex.synchronize do
161
- if @checked_out.delete(socket)
162
- @queue.broadcast
163
- else
164
- return false
165
- end
166
- end
167
- true
168
- end
169
-
170
- # Adds a new socket to the pool and checks it out.
171
- #
172
- # This method is called exclusively from #checkout;
173
- # therefore, it runs within a mutex.
174
- def checkout_new_socket
175
- begin
176
- socket = @client.socket_class.new(@host, @port, @client.op_timeout,
177
- @client.connect_timeout,
178
- @client.socket_opts)
179
- socket.pool = self
180
- rescue => ex
181
- socket.close if socket
182
- @node.close if @node
183
- raise ConnectionFailure, "Failed to connect to host #{@host} and port #{@port}: #{ex}"
184
- end
185
-
186
- @sockets << socket
187
- @checked_out << socket
188
- @thread_ids_to_sockets[Thread.current.object_id] = socket
189
- socket
190
- end
191
-
192
- # If a user calls DB#authenticate, and several sockets exist,
193
- # then we need a way to apply the authentication on each socket.
194
- # So we store the apply_authentication method, and this will be
195
- # applied right before the next use of each socket.
196
- #
197
- # @deprecated This method has been replaced by Pool#check_auths (private)
198
- # and it isn't necessary to ever invoke this method directly.
199
- # Authentication of sockets is handled upon checkout and checkin.
200
- def authenticate_existing
201
- end
202
-
203
- # Store the logout op for each existing socket to be applied before
204
- # the next use of each socket.
205
- #
206
- # @deprecated This method has been replaced by Pool#check_auths (private)
207
- # and it isn't necessary to ever invoke this method directly.
208
- # Authentication of sockets is handled upon checkout and checkin.
209
- def logout_existing(database)
210
- end
211
-
212
- # Checks out the first available socket from the pool.
213
- #
214
- # If the pid has changed, remove the socket and check out
215
- # new one.
216
- #
217
- # This method is called exclusively from #checkout;
218
- # therefore, it runs within a mutex.
219
- def checkout_existing_socket(socket=nil)
220
- if !socket
221
- available = @sockets - @checked_out
222
- socket = available[rand(available.length)]
223
- end
224
-
225
- if socket.pid != Process.pid
226
- @sockets.delete(socket)
227
- if socket
228
- socket.close unless socket.closed?
229
- end
230
- checkout_new_socket
231
- else
232
- @checked_out << socket
233
- @thread_ids_to_sockets[Thread.current.object_id] = socket
234
- socket
235
- end
236
- end
237
-
238
- def prune_threads
239
- live_threads = Thread.list.map(&:object_id)
240
- @thread_ids_to_sockets.reject! do |key, value|
241
- !live_threads.include?(key)
242
- end
243
- end
244
-
245
- def check_prune
246
- if @checkout_counter > PRUNE_INTERVAL
247
- @checkout_counter = 0
248
- prune_threads
249
- else
250
- @checkout_counter += 1
251
- end
252
- end
253
-
254
- # Check out an existing socket or create a new socket if the maximum
255
- # pool size has not been exceeded. Otherwise, wait for the next
256
- # available socket.
257
- def checkout
258
- @client.connect if !@client.connected?
259
- start_time = Time.now
260
- loop do
261
- if (Time.now - start_time) > @timeout
262
- raise ConnectionTimeoutError, "could not obtain connection within " +
263
- "#{@timeout} seconds. The max pool size is currently #{@size}; " +
264
- "consider increasing the pool size or timeout."
265
- end
266
-
267
- @connection_mutex.synchronize do
268
- check_prune
269
- socket = nil
270
- if socket_for_thread = @thread_ids_to_sockets[Thread.current.object_id]
271
- if !@checked_out.include?(socket_for_thread)
272
- socket = checkout_existing_socket(socket_for_thread)
273
- end
274
- else
275
- if @sockets.size < @size
276
- socket = checkout_new_socket
277
- elsif @checked_out.size < @sockets.size
278
- socket = checkout_existing_socket
279
- end
280
- end
281
-
282
- if socket
283
- if !socket.closed?
284
- begin
285
- check_auths(socket)
286
- return socket
287
- rescue ConnectionFailure
288
- # Socket failed authentication and will be cleaned up below
289
- end
290
- end
291
-
292
- # Socket was closed from earlier network error, or just now from
293
- # a network error when authenticating.
294
- @checked_out.delete(socket)
295
- @sockets.delete(socket)
296
- @thread_ids_to_sockets.delete(Thread.current.object_id)
297
- else
298
- # Otherwise, wait
299
- @queue.wait(@connection_mutex)
300
- end
301
- end
302
- end
303
- end
304
-
305
- private
306
-
307
- # Helper method to handle keeping track of auths/logouts for sockets.
308
- #
309
- # @param socket [Socket] The socket instance to be checked.
310
- #
311
- # @return [Socket] The authenticated socket instance.
312
- def check_auths(socket)
313
- # find and handle logouts
314
- (socket.auths - @client.auths).each do |auth|
315
- @client.issue_logout(auth[:source], :socket => socket)
316
- socket.auths.delete(auth)
317
- end
318
-
319
- # find and handle new auths
320
- (@client.auths - socket.auths).each do |auth|
321
- @client.issue_authentication(auth, :socket => socket)
322
- socket.auths.add(auth)
323
- end
324
-
325
- socket
326
- end
327
-
328
- def close_sockets(sockets)
329
- sockets.each do |socket|
330
- @sockets.delete(socket)
331
- begin
332
- socket.close unless socket.closed?
333
- rescue IOError => ex
334
- warn "IOError when attempting to close socket connected to #{@host}:#{@port}: #{ex.inspect}"
335
- end
336
- end
337
- end
338
-
339
- end
340
- end