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,138 +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
- require 'test_helper'
16
-
17
- class ReplicaSetConnectionTest < Test::Unit::TestCase
18
-
19
- def setup
20
- ensure_cluster(:rs)
21
- end
22
-
23
- def test_connect_with_deprecated_multi
24
- silently do
25
- @connection = Connection.multi(@rs.repl_set_seeds_old, :name => @rs.repl_set_name)
26
- end
27
- assert !@connection.nil?
28
- assert @connection.connected?
29
- end
30
-
31
- def test_connect_bad_name
32
- assert_raise_error(ReplicaSetConnectionError, "-wrong") do
33
- @connection = ReplSetConnection.new(@rs.repl_set_seeds, :safe => true, :name => @rs.repl_set_name + "-wrong")
34
- end
35
- end
36
-
37
- def test_connect_with_first_secondary_node_terminated
38
- @rs.secondaries.first.stop
39
-
40
- rescue_connection_failure do
41
- @connection = ReplSetConnection.new @rs.repl_set_seeds
42
- end
43
- assert @connection.connected?
44
- end
45
-
46
- def test_connect_with_last_secondary_node_terminated
47
- @rs.secondaries.last.stop
48
-
49
- rescue_connection_failure do
50
- @connection = ReplSetConnection.new @rs.repl_set_seeds
51
- end
52
- assert @connection.connected?
53
- end
54
-
55
- def test_connect_with_connection_string
56
- @connection = Connection.from_uri("mongodb://#{@rs.repl_set_seeds_uri}?replicaset=#{@rs.repl_set_name}")
57
- assert !@connection.nil?
58
- assert @connection.connected?
59
- end
60
-
61
- def test_connect_with_connection_string_in_env_var
62
- uri = "mongodb://#{@rs.repl_set_seeds_uri}?replicaset=#{@rs.repl_set_name}"
63
- with_preserved_env_uri(uri) do
64
- @connection = ReplSetConnection.new
65
- assert !@connection.nil?
66
- assert_equal 3, @connection.seeds.length
67
- assert_equal @rs.replicas[0].host, @connection.seeds[0][0]
68
- assert_equal @rs.replicas[1].host, @connection.seeds[1][0]
69
- assert_equal @rs.replicas[2].host, @connection.seeds[2][0]
70
- assert_equal @rs.replicas[0].port, @connection.seeds[0][1]
71
- assert_equal @rs.replicas[1].port, @connection.seeds[1][1]
72
- assert_equal @rs.replicas[2].port, @connection.seeds[2][1]
73
- assert_equal @rs.repl_set_name, @connection.replica_set_name
74
- assert @connection.connected?
75
- end
76
- end
77
-
78
- def test_connect_with_connection_string_in_implicit_mongodb_uri
79
- uri = "mongodb://#{@rs.repl_set_seeds_uri}?replicaset=#{@rs.repl_set_name}"
80
- with_preserved_env_uri(uri) do
81
- @connection = Connection.from_uri
82
- assert !@connection.nil?
83
- assert_equal 3, @connection.seeds.length
84
- assert_equal @rs.replicas[0].host, @connection.seeds[0][0]
85
- assert_equal @rs.replicas[1].host, @connection.seeds[1][0]
86
- assert_equal @rs.replicas[2].host, @connection.seeds[2][0]
87
- assert_equal @rs.replicas[0].port, @connection.seeds[0][1]
88
- assert_equal @rs.replicas[1].port, @connection.seeds[1][1]
89
- assert_equal @rs.replicas[2].port, @connection.seeds[2][1]
90
- assert_equal @rs.repl_set_name, @connection.replica_set_name
91
- assert @connection.connected?
92
- end
93
- end
94
-
95
- def test_connect_with_new_seed_format
96
- @connection = ReplSetConnection.new @rs.repl_set_seeds
97
- assert @connection.connected?
98
- end
99
-
100
- def test_connect_with_old_seed_format
101
- silently do
102
- @connection = ReplSetConnection.new(@rs.repl_set_seeds_old)
103
- end
104
- assert @connection.connected?
105
- end
106
-
107
- def test_connect_with_full_connection_string
108
- @connection = Connection.from_uri("mongodb://#{@rs.repl_set_seeds_uri}?replicaset=#{@rs.repl_set_name};safe=true;w=2;fsync=true;slaveok=true")
109
- assert !@connection.nil?
110
- assert @connection.connected?
111
- assert_equal 2, @connection.write_concern[:w]
112
- assert @connection.write_concern[:fsync]
113
- assert @connection.read_pool
114
- end
115
-
116
- def test_connect_with_full_connection_string_in_env_var
117
- uri = "mongodb://#{@rs.repl_set_seeds_uri}?replicaset=#{@rs.repl_set_name};safe=true;w=2;fsync=true;slaveok=true"
118
- with_preserved_env_uri(uri) do
119
- @connection = ReplSetConnection.new
120
- assert !@connection.nil?
121
- assert @connection.connected?
122
- assert_equal 2, @connection.write_concern[:w]
123
- assert @connection.write_concern[:fsync]
124
- assert @connection.read_pool
125
- end
126
- end
127
-
128
- def test_connect_options_override_env_var
129
- uri = "mongodb://#{@rs.repl_set_seeds_uri}?replicaset=#{@rs.repl_set_name};safe=true;w=2;fsync=true;slaveok=true"
130
- with_preserved_env_uri(uri) do
131
- @connection = ReplSetConnection.new({:safe => {:w => 1}})
132
- assert !@connection.nil?
133
- assert @connection.connected?
134
- assert_equal 1, @connection.write_concern[:w]
135
- end
136
- end
137
-
138
- end
@@ -1,66 +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
- require 'test_helper'
16
-
17
- class ReplicaSetCountTest < Test::Unit::TestCase
18
-
19
- def setup
20
- ensure_cluster(:rs)
21
- @client = MongoReplicaSetClient.new(@rs.repl_set_seeds, :read => :primary_preferred, :op_timeout => TEST_OP_TIMEOUT)
22
- authenticate_client(@client)
23
- assert @client.primary_pool
24
- @primary = MongoClient.new(@client.primary_pool.host, @client.primary_pool.port)
25
- authenticate_client(@primary)
26
- @db = @client.db(TEST_DB)
27
- @db.drop_collection("test-sets")
28
- @coll = @db.collection("test-sets")
29
- end
30
-
31
- def teardown
32
- @client.close if @conn
33
- end
34
-
35
- def test_correct_count_after_insertion_reconnect
36
- @coll.insert({:a => 20}, :w => 3, :wtimeout => 10000)
37
- assert_equal 1, @coll.count
38
-
39
- # Kill the current master node
40
- @rs.primary.stop
41
-
42
- rescue_connection_failure do
43
- @coll.insert({:a => 30})
44
- end
45
-
46
- @coll.insert({:a => 40})
47
- assert_equal 3, @coll.count, "Second count failed"
48
- end
49
-
50
- def test_count_command_sent_to_primary
51
- @coll.insert({:a => 20}, :w => 3, :wtimeout => 10000)
52
- count_before = @primary['admin'].command({:serverStatus => 1})['opcounters']['command']
53
- assert_equal 1, @coll.count
54
- count_after = @primary['admin'].command({:serverStatus => 1})['opcounters']['command']
55
- assert_equal 2, count_after - count_before
56
- end
57
-
58
- def test_count_with_read
59
- @coll.insert({:a => 20}, :w => 3, :wtimeout => 10000)
60
- count_before = @primary['admin'].command({:serverStatus => 1})['opcounters']['command']
61
- assert_equal 1, @coll.count(:read => :secondary)
62
- assert_equal 1, @coll.find({}, :read => :secondary).count()
63
- count_after = @primary['admin'].command({:serverStatus => 1})['opcounters']['command']
64
- assert_equal 1, count_after - count_before
65
- end
66
- end
@@ -1,220 +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
- require 'test_helper'
16
-
17
- class ReplicaSetCursorTest < Test::Unit::TestCase
18
-
19
- def setup
20
- ensure_cluster(:rs)
21
- end
22
-
23
- def test_get_more_primary
24
- setup_client(:primary)
25
- cursor_get_more_test(:primary)
26
- end
27
-
28
- def test_get_more_secondary
29
- setup_client(:secondary)
30
- cursor_get_more_test(:secondary)
31
- end
32
-
33
- def test_close_primary
34
- setup_client(:primary)
35
- kill_cursor_test(:primary)
36
- end
37
-
38
- def test_close_secondary
39
- setup_client(:secondary)
40
- kill_cursor_test(:secondary)
41
- end
42
-
43
- def test_cursors_get_closed
44
- setup_client
45
- assert_cursors_on_members
46
- end
47
-
48
- def test_cursors_get_closed_secondary
49
- setup_client(:secondary)
50
- assert_cursors_on_members(:secondary)
51
- end
52
-
53
- def test_cursors_get_closed_secondary_query
54
- setup_client(:primary)
55
- assert_cursors_on_members(:secondary)
56
- end
57
-
58
- def test_intervening_query_secondary
59
- setup_client(:primary)
60
- refresh_while_iterating(:secondary)
61
- end
62
-
63
- private
64
-
65
- def setup_client(read=:primary)
66
- route_read ||= read
67
- # Setup ReplicaSet Connection
68
- @client = MongoReplicaSetClient.new(@rs.repl_set_seeds, :read => read, :op_timeout => TEST_OP_TIMEOUT)
69
- authenticate_client(@client)
70
-
71
- @db = @client.db(TEST_DB)
72
- @db.drop_collection("cursor_tests")
73
- @coll = @db.collection("cursor_tests")
74
- insert_docs
75
-
76
- # Setup Direct Connections
77
- @primary = Mongo::MongoClient.new(*@client.manager.primary)
78
- authenticate_client(@primary)
79
- end
80
-
81
- def insert_docs
82
- @n_docs = 102 # batch size is 101
83
- @n_docs.times do |i|
84
- @coll.insert({ "x" => i }, :w => 3)
85
- end
86
- end
87
-
88
- def set_read_client_and_tag(read)
89
- read_opts = {:read => read}
90
- @tag = (0...3).map{|i|i.to_s}.detect do |tag|
91
- begin
92
- read_opts[:tag_sets] = [{:node => tag}] unless read == :primary
93
- cursor = @coll.find({}, read_opts)
94
- cursor.next
95
- pool = cursor.instance_variable_get(:@pool)
96
- cursor.close
97
- @read = Mongo::MongoClient.new(pool.host, pool.port, :slave_ok => true)
98
- authenticate_client(@read)
99
- tag
100
- rescue Mongo::ConnectionFailure
101
- false
102
- end
103
- end
104
- end
105
-
106
- def route_query(read)
107
- read_opts = {:read => read}
108
- read_opts[:tag_sets] = [{:node => @tag}] unless read == :primary
109
- object_id = BSON::ObjectId.new
110
- read_opts[:comment] = object_id
111
-
112
- # set profiling level to 2 on client and member to which the query will be routed
113
- @client.db(TEST_DB).profiling_level = :all
114
- @client.secondaries.each do |node|
115
- node = Mongo::MongoClient.new(node[0], node[1], :slave_ok => true)
116
- authenticate_client(node)
117
- node.db(TEST_DB).profiling_level = :all
118
- end
119
-
120
- @cursor = @coll.find({}, read_opts)
121
- @cursor.next
122
-
123
- # on client and other members set profiling level to 0
124
- @client.db(TEST_DB).profiling_level = :off
125
- @client.secondaries.each do |node|
126
- node = Mongo::MongoClient.new(node[0], node[1], :slave_ok => true)
127
- authenticate_client(node)
128
- node.db(TEST_DB).profiling_level = :off
129
- end
130
- # do a query on system.profile of the reader to see if it was used for the query
131
- profiled_queries = @read.db(TEST_DB).collection('system.profile').find({
132
- 'ns' => "#{TEST_DB}.cursor_tests", "query.$comment" => object_id })
133
-
134
- assert_equal 1, profiled_queries.count
135
- end
136
-
137
- # batch from send_initial_query is 101 documents
138
- # check that you get n_docs back from the query, with the same port
139
- def cursor_get_more_test(read=:primary)
140
- return if subject_to_server_4754?(@client)
141
- set_read_client_and_tag(read)
142
- 10.times do
143
- # assert that the query went to the correct member
144
- route_query(read)
145
- docs_count = 1
146
- port = @cursor.instance_variable_get(:@pool).port
147
- assert @cursor.alive?
148
- while @cursor.has_next?
149
- docs_count += 1
150
- @cursor.next
151
- assert_equal port, @cursor.instance_variable_get(:@pool).port
152
- end
153
- assert !@cursor.alive?
154
- assert_equal @n_docs, docs_count
155
- @cursor.close #cursor is already closed
156
- end
157
- end
158
-
159
- # batch from get_more can be huge, so close after send_initial_query
160
- def kill_cursor_test(read=:primary)
161
- return if subject_to_server_4754?(@client)
162
- set_read_client_and_tag(read)
163
- 10.times do
164
- # assert that the query went to the correct member
165
- route_query(read)
166
- cursor_id = @cursor.cursor_id
167
- cursor_clone = @cursor.clone
168
- assert_equal cursor_id, cursor_clone.cursor_id
169
- assert @cursor.instance_variable_get(:@pool)
170
- # .next was called once already and leave one for get more
171
- (@n_docs-2).times { @cursor.next }
172
- @cursor.close
173
- # an exception confirms the cursor has indeed been closed
174
- assert_raise Mongo::OperationFailure do
175
- cursor_clone.next
176
- end
177
- end
178
- end
179
-
180
- def assert_cursors_on_members(read=:primary)
181
- return if subject_to_server_4754?(@client)
182
- set_read_client_and_tag(read)
183
- # assert that the query went to the correct member
184
- route_query(read)
185
- cursor_id = @cursor.cursor_id
186
- cursor_clone = @cursor.clone
187
- assert_equal cursor_id, cursor_clone.cursor_id
188
- assert @cursor.instance_variable_get(:@pool)
189
- port = @cursor.instance_variable_get(:@pool).port
190
- while @cursor.has_next?
191
- @cursor.next
192
- assert_equal port, @cursor.instance_variable_get(:@pool).port
193
- end
194
- # an exception confirms the cursor has indeed been closed after query
195
- assert_raise Mongo::OperationFailure do
196
- cursor_clone.next
197
- end
198
- end
199
-
200
- def refresh_while_iterating(read)
201
- set_read_client_and_tag(read)
202
-
203
- read_opts = {:read => read}
204
- read_opts[:tag_sets] = [{:node => @tag}]
205
- read_opts[:batch_size] = 2
206
- cursor = @coll.find({}, read_opts)
207
-
208
- 2.times { cursor.next }
209
- port = cursor.instance_variable_get(:@pool).port
210
- host = cursor.instance_variable_get(:@pool).host
211
- # Refresh connection
212
- @client.refresh
213
- assert_nothing_raised do
214
- cursor.next
215
- end
216
-
217
- assert_equal port, cursor.instance_variable_get(:@pool).port
218
- assert_equal host, cursor.instance_variable_get(:@pool).host
219
- end
220
- end
@@ -1,157 +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
- require 'test_helper'
16
-
17
- class ReplicaSetInsertTest < Test::Unit::TestCase
18
-
19
- def setup
20
- ensure_cluster(:rs)
21
- @client = MongoReplicaSetClient.from_uri(@uri, :op_timeout => TEST_OP_TIMEOUT)
22
- @version = @client.server_version
23
- @db = @client.db(TEST_DB)
24
- @db.drop_collection("test-sets")
25
- @coll = @db.collection("test-sets")
26
- end
27
-
28
- def teardown
29
- @client.close if @conn
30
- end
31
-
32
- def test_insert
33
- @coll.save({:a => 20}, :w => 3)
34
-
35
- @rs.primary.stop
36
-
37
- rescue_connection_failure do
38
- @coll.save({:a => 30}, :w => 1)
39
- end
40
-
41
- @coll.save({:a => 40}, :w => 1)
42
- @coll.save({:a => 50}, :w => 1)
43
- @coll.save({:a => 60}, :w => 1)
44
- @coll.save({:a => 70}, :w => 1)
45
-
46
- # Restart the old master and wait for sync
47
- @rs.start
48
- sleep(5)
49
- results = []
50
-
51
- rescue_connection_failure do
52
- @coll.find.each {|r| results << r}
53
- [20, 30, 40, 50, 60, 70].each do |a|
54
- assert results.any? {|r| r['a'] == a}, "Could not find record for a => #{a}"
55
- end
56
- end
57
-
58
- @coll.save({:a => 80}, :w => 3)
59
- @coll.find.each {|r| results << r}
60
- [20, 30, 40, 50, 60, 70, 80].each do |a|
61
- assert results.any? {|r| r['a'] == a}, "Could not find record for a => #{a} on second find"
62
- end
63
- end
64
-
65
- context "Bulk API CollectionView" do
66
- setup do
67
- setup
68
- end
69
-
70
- should "handle error with deferred write concern error - spec Merging Results" do
71
- if @client.wire_version_feature?(MongoClient::MONGODB_3_0)
72
- @coll.remove
73
- @coll.ensure_index(BSON::OrderedHash[:a, Mongo::ASCENDING], {:unique => true})
74
- bulk = @coll.initialize_ordered_bulk_op
75
- bulk.insert({:a => 1})
76
- bulk.find({:a => 2}).upsert.update({'$set' => {:a => 2}})
77
- bulk.insert({:a => 1})
78
- secondary = MongoClient.new(@rs.secondaries.first.host, @rs.secondaries.first.port)
79
- cmd = BSON::OrderedHash[:configureFailPoint, 'rsSyncApplyStop', :mode, 'alwaysOn']
80
- secondary['admin'].command(cmd)
81
- ex = assert_raise BulkWriteError do
82
- bulk.execute({:w => @rs.servers.size, :wtimeout => 1})
83
- end
84
- cmd = BSON::OrderedHash[:configureFailPoint, 'rsSyncApplyStop', :mode, 'off']
85
- secondary['admin'].command(cmd)
86
- else
87
- with_write_commands_and_operations(@db.connection) do |wire_version|
88
- @coll.remove
89
- @coll.ensure_index(BSON::OrderedHash[:a, Mongo::ASCENDING], {:unique => true})
90
- bulk = @coll.initialize_ordered_bulk_op
91
- bulk.insert({:a => 1})
92
- bulk.find({:a => 2}).upsert.update({'$set' => {:a => 2}})
93
- bulk.insert({:a => 1})
94
- ex = assert_raise BulkWriteError do
95
- bulk.execute({:w => 5, :wtimeout => 1})
96
- end
97
- end
98
- end
99
- result = ex.result
100
- assert_match_document(
101
- {
102
- "ok" => 1,
103
- "n" => 2,
104
- "writeErrors" => [
105
- {
106
- "index" => 2,
107
- "code" => 11000,
108
- "errmsg" => /duplicate key error/,
109
- }
110
- ],
111
- "writeConcernError" => [
112
- {
113
- "errmsg" => /waiting for replication timed out|timed out waiting for slaves|timeout/,
114
- "code" => 64,
115
- "errInfo" => {"wtimeout" => true},
116
- "index" => 0
117
- },
118
- {
119
- "errmsg" => /waiting for replication timed out|timed out waiting for slaves|timeout/,
120
- "code" => 64,
121
- "errInfo" => {"wtimeout" => true},
122
- "index" => 1
123
- }
124
- ],
125
- "code" => 65,
126
- "errmsg" => "batch item errors occurred",
127
- "nInserted" => 1
128
- }, result)
129
- assert_equal 2, @coll.find.to_a.size
130
- end
131
-
132
- should "handle unordered errors with deferred write concern error - spec Merging Results" do # TODO - spec review
133
- with_write_commands_and_operations(@db.connection) do |wire_version|
134
- @coll.remove
135
- @coll.ensure_index(BSON::OrderedHash[:a, Mongo::ASCENDING], {:unique => true})
136
- bulk = @coll.initialize_unordered_bulk_op
137
- bulk.insert({:a => 1})
138
- bulk.find({:a => 2}).upsert.update({'$set' => {:a => 1}})
139
- bulk.insert({:a => 3})
140
- ex = assert_raise BulkWriteError do
141
- bulk.execute({:w => 5, :wtimeout => 1})
142
- end
143
- result = ex.result # unordered varies, don't use assert_bulk_exception
144
- assert_equal(1, result["ok"], "wire_version:#{wire_version}")
145
- assert_equal(2, result["n"], "wire_version:#{wire_version}")
146
- assert(result["nInserted"] >= 1, "wire_version:#{wire_version}")
147
- assert_equal(65, result["code"], "wire_version:#{wire_version}")
148
- assert_equal("batch item errors occurred", result["errmsg"], "wire_version:#{wire_version}")
149
- assert(result["writeErrors"].size >= 1, "wire_version:#{wire_version}")
150
- assert(result["writeConcernError"].size >= 1, "wire_version:#{wire_version}") if wire_version >= 2
151
- assert(@coll.size >= 1, "wire_version:#{wire_version}")
152
- end
153
- end
154
-
155
- end
156
-
157
- end