mongo 2.5.3 → 2.6.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 (394) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/LICENSE +1 -1
  5. data/README.md +3 -2
  6. data/lib/mongo.rb +2 -2
  7. data/lib/mongo/address.rb +10 -2
  8. data/lib/mongo/address/ipv4.rb +1 -1
  9. data/lib/mongo/address/ipv6.rb +26 -5
  10. data/lib/mongo/address/unix.rb +1 -1
  11. data/lib/mongo/auth.rb +10 -3
  12. data/lib/mongo/auth/cr.rb +4 -1
  13. data/lib/mongo/auth/cr/conversation.rb +4 -1
  14. data/lib/mongo/auth/ldap.rb +1 -1
  15. data/lib/mongo/auth/ldap/conversation.rb +1 -1
  16. data/lib/mongo/auth/roles.rb +1 -1
  17. data/lib/mongo/auth/scram.rb +24 -7
  18. data/lib/mongo/auth/scram/conversation.rb +52 -19
  19. data/lib/mongo/auth/stringprep.rb +114 -0
  20. data/lib/mongo/auth/stringprep/profiles/sasl.rb +73 -0
  21. data/lib/mongo/auth/stringprep/tables.rb +3232 -0
  22. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +174 -0
  23. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1170 -0
  24. data/lib/mongo/auth/user.rb +14 -3
  25. data/lib/mongo/auth/user/view.rb +1 -1
  26. data/lib/mongo/auth/x509.rb +1 -1
  27. data/lib/mongo/auth/x509/conversation.rb +1 -1
  28. data/lib/mongo/bson.rb +1 -1
  29. data/lib/mongo/bulk_write.rb +8 -8
  30. data/lib/mongo/bulk_write/combineable.rb +1 -1
  31. data/lib/mongo/bulk_write/ordered_combiner.rb +1 -1
  32. data/lib/mongo/bulk_write/result.rb +1 -1
  33. data/lib/mongo/bulk_write/result_combiner.rb +4 -4
  34. data/lib/mongo/bulk_write/transformable.rb +1 -1
  35. data/lib/mongo/bulk_write/unordered_combiner.rb +1 -1
  36. data/lib/mongo/bulk_write/validatable.rb +1 -1
  37. data/lib/mongo/client.rb +115 -24
  38. data/lib/mongo/cluster.rb +17 -10
  39. data/lib/mongo/cluster/app_metadata.rb +7 -1
  40. data/lib/mongo/cluster/periodic_executor.rb +1 -1
  41. data/lib/mongo/cluster/reapers/socket_reaper.rb +1 -1
  42. data/lib/mongo/cluster/topology.rb +12 -2
  43. data/lib/mongo/cluster/topology/replica_set.rb +9 -1
  44. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  45. data/lib/mongo/cluster/topology/single.rb +1 -1
  46. data/lib/mongo/cluster/topology/unknown.rb +1 -1
  47. data/lib/mongo/collection.rb +75 -19
  48. data/lib/mongo/collection/view.rb +1 -1
  49. data/lib/mongo/collection/view/aggregation.rb +1 -1
  50. data/lib/mongo/collection/view/builder.rb +1 -1
  51. data/lib/mongo/collection/view/builder/aggregation.rb +3 -3
  52. data/lib/mongo/collection/view/builder/find_command.rb +1 -1
  53. data/lib/mongo/collection/view/builder/flags.rb +1 -1
  54. data/lib/mongo/collection/view/builder/map_reduce.rb +1 -1
  55. data/lib/mongo/collection/view/builder/modifiers.rb +1 -1
  56. data/lib/mongo/collection/view/builder/op_query.rb +1 -1
  57. data/lib/mongo/collection/view/change_stream.rb +193 -17
  58. data/lib/mongo/collection/view/change_stream/retryable.rb +3 -20
  59. data/lib/mongo/collection/view/explainable.rb +1 -1
  60. data/lib/mongo/collection/view/immutable.rb +1 -1
  61. data/lib/mongo/collection/view/iterable.rb +2 -2
  62. data/lib/mongo/collection/view/map_reduce.rb +1 -1
  63. data/lib/mongo/collection/view/readable.rb +108 -29
  64. data/lib/mongo/collection/view/writable.rb +3 -3
  65. data/lib/mongo/cursor.rb +44 -4
  66. data/lib/mongo/cursor/builder.rb +1 -1
  67. data/lib/mongo/cursor/builder/get_more_command.rb +1 -1
  68. data/lib/mongo/cursor/builder/kill_cursors_command.rb +1 -1
  69. data/lib/mongo/cursor/builder/op_get_more.rb +1 -1
  70. data/lib/mongo/cursor/builder/op_kill_cursors.rb +1 -1
  71. data/lib/mongo/database.rb +46 -3
  72. data/lib/mongo/database/view.rb +11 -11
  73. data/lib/mongo/dbref.rb +1 -1
  74. data/lib/mongo/error.rb +57 -1
  75. data/lib/mongo/error/bulk_write_error.rb +2 -2
  76. data/lib/mongo/error/change_stream_resumable.rb +37 -0
  77. data/lib/mongo/error/closed_stream.rb +1 -1
  78. data/lib/mongo/error/extra_file_chunk.rb +1 -1
  79. data/lib/mongo/error/failed_stringprep_validation.rb +38 -0
  80. data/lib/mongo/error/file_not_found.rb +1 -1
  81. data/lib/mongo/error/insufficient_iteration_count.rb +38 -0
  82. data/lib/mongo/error/invalid_application_name.rb +1 -1
  83. data/lib/mongo/error/invalid_bulk_operation.rb +1 -1
  84. data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -1
  85. data/lib/mongo/error/invalid_collection_name.rb +1 -1
  86. data/lib/mongo/error/invalid_database_name.rb +1 -1
  87. data/lib/mongo/error/invalid_document.rb +1 -1
  88. data/lib/mongo/error/invalid_file.rb +1 -1
  89. data/lib/mongo/error/invalid_file_revision.rb +1 -1
  90. data/lib/mongo/error/invalid_min_pool_size.rb +1 -1
  91. data/lib/mongo/error/invalid_nonce.rb +1 -1
  92. data/lib/mongo/error/invalid_read_option.rb +35 -0
  93. data/lib/mongo/error/invalid_replacement_document.rb +1 -1
  94. data/lib/mongo/error/invalid_server_preference.rb +1 -1
  95. data/lib/mongo/error/invalid_session.rb +1 -1
  96. data/lib/mongo/error/invalid_signature.rb +1 -1
  97. data/lib/mongo/error/invalid_transaction_operation.rb +82 -0
  98. data/lib/mongo/error/invalid_txt_record.rb +1 -1
  99. data/lib/mongo/error/invalid_update_document.rb +1 -1
  100. data/lib/mongo/error/invalid_uri.rb +1 -1
  101. data/lib/mongo/error/invalid_write_concern.rb +1 -1
  102. data/lib/mongo/error/max_bson_size.rb +1 -1
  103. data/lib/mongo/error/max_message_size.rb +1 -1
  104. data/lib/mongo/error/mismatched_domain.rb +1 -1
  105. data/lib/mongo/error/missing_file_chunk.rb +1 -1
  106. data/lib/mongo/error/missing_resume_token.rb +1 -1
  107. data/lib/mongo/error/multi_index_drop.rb +1 -1
  108. data/lib/mongo/error/need_primary_server.rb +1 -1
  109. data/lib/mongo/error/no_server_available.rb +1 -1
  110. data/lib/mongo/error/no_srv_records.rb +1 -1
  111. data/lib/mongo/error/operation_failure.rb +108 -14
  112. data/lib/mongo/error/parser.rb +50 -1
  113. data/lib/mongo/error/socket_error.rb +5 -2
  114. data/lib/mongo/error/socket_timeout_error.rb +5 -2
  115. data/lib/mongo/error/unchangeable_collection_option.rb +1 -1
  116. data/lib/mongo/error/unexpected_chunk_length.rb +1 -1
  117. data/lib/mongo/error/unexpected_response.rb +1 -1
  118. data/lib/mongo/error/unknown_payload_type.rb +1 -1
  119. data/lib/mongo/error/unsupported_array_filters.rb +1 -1
  120. data/lib/mongo/error/unsupported_collation.rb +1 -1
  121. data/lib/mongo/error/unsupported_features.rb +1 -1
  122. data/lib/mongo/error/unsupported_message_type.rb +1 -1
  123. data/lib/mongo/error/write_retryable.rb +27 -0
  124. data/lib/mongo/event.rb +10 -9
  125. data/lib/mongo/event/base.rb +33 -0
  126. data/lib/mongo/event/description_changed.rb +2 -2
  127. data/lib/mongo/event/listeners.rb +1 -1
  128. data/lib/mongo/event/member_discovered.rb +4 -2
  129. data/lib/mongo/event/primary_elected.rb +2 -2
  130. data/lib/mongo/event/publisher.rb +1 -1
  131. data/lib/mongo/event/standalone_discovered.rb +2 -2
  132. data/lib/mongo/event/subscriber.rb +1 -1
  133. data/lib/mongo/grid.rb +1 -1
  134. data/lib/mongo/grid/file.rb +1 -1
  135. data/lib/mongo/grid/file/chunk.rb +3 -3
  136. data/lib/mongo/grid/file/info.rb +26 -3
  137. data/lib/mongo/grid/fs_bucket.rb +1 -1
  138. data/lib/mongo/grid/stream.rb +1 -1
  139. data/lib/mongo/grid/stream/read.rb +1 -1
  140. data/lib/mongo/grid/stream/write.rb +1 -1
  141. data/lib/mongo/index.rb +1 -1
  142. data/lib/mongo/index/view.rb +1 -1
  143. data/lib/mongo/loggable.rb +1 -1
  144. data/lib/mongo/logger.rb +1 -1
  145. data/lib/mongo/monitoring.rb +99 -62
  146. data/lib/mongo/monitoring/command_log_subscriber.rb +2 -2
  147. data/lib/mongo/monitoring/event.rb +2 -1
  148. data/lib/mongo/monitoring/event/command_failed.rb +19 -6
  149. data/lib/mongo/monitoring/event/command_started.rb +14 -3
  150. data/lib/mongo/monitoring/event/command_succeeded.rb +5 -3
  151. data/lib/mongo/monitoring/event/secure.rb +1 -1
  152. data/lib/mongo/monitoring/event/server_closed.rb +2 -2
  153. data/lib/mongo/monitoring/event/server_description_changed.rb +2 -2
  154. data/lib/mongo/monitoring/event/server_opening.rb +11 -2
  155. data/lib/mongo/monitoring/event/topology_changed.rb +13 -2
  156. data/lib/mongo/monitoring/event/topology_closed.rb +2 -2
  157. data/lib/mongo/monitoring/event/topology_opening.rb +11 -2
  158. data/lib/mongo/monitoring/publishable.rb +10 -6
  159. data/lib/mongo/monitoring/sdam_log_subscriber.rb +1 -1
  160. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +1 -1
  161. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +1 -1
  162. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +1 -1
  163. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +1 -1
  164. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +1 -1
  165. data/lib/mongo/operation/aggregate/op_msg.rb +3 -0
  166. data/lib/mongo/operation/create/op_msg.rb +9 -0
  167. data/lib/mongo/operation/create_index/op_msg.rb +9 -0
  168. data/lib/mongo/operation/create_user/command.rb +1 -1
  169. data/lib/mongo/operation/create_user/op_msg.rb +10 -1
  170. data/lib/mongo/operation/delete/op_msg.rb +3 -0
  171. data/lib/mongo/operation/distinct/op_msg.rb +9 -0
  172. data/lib/mongo/operation/drop/op_msg.rb +9 -0
  173. data/lib/mongo/operation/drop_database/op_msg.rb +9 -0
  174. data/lib/mongo/operation/drop_index/op_msg.rb +9 -0
  175. data/lib/mongo/operation/explain/op_msg.rb +3 -0
  176. data/lib/mongo/operation/find/op_msg.rb +3 -0
  177. data/lib/mongo/operation/get_more.rb +1 -1
  178. data/lib/mongo/operation/get_more/command.rb +1 -1
  179. data/lib/mongo/operation/get_more/legacy.rb +1 -1
  180. data/lib/mongo/operation/get_more/op_msg.rb +3 -0
  181. data/lib/mongo/operation/indexes/op_msg.rb +3 -0
  182. data/lib/mongo/operation/indexes/result.rb +1 -1
  183. data/lib/mongo/operation/insert/bulk_result.rb +32 -2
  184. data/lib/mongo/operation/insert/op_msg.rb +3 -0
  185. data/lib/mongo/operation/insert/result.rb +1 -1
  186. data/lib/mongo/operation/kill_cursors/op_msg.rb +9 -0
  187. data/lib/mongo/operation/list_collections/op_msg.rb +3 -0
  188. data/lib/mongo/operation/list_collections/result.rb +5 -1
  189. data/lib/mongo/operation/map_reduce/op_msg.rb +3 -0
  190. data/lib/mongo/operation/map_reduce/result.rb +1 -1
  191. data/lib/mongo/operation/parallel_scan/op_msg.rb +3 -0
  192. data/lib/mongo/operation/remove_user/op_msg.rb +9 -0
  193. data/lib/mongo/operation/result.rb +27 -14
  194. data/lib/mongo/operation/shared/executable.rb +1 -0
  195. data/lib/mongo/operation/shared/sessions_supported.rb +78 -7
  196. data/lib/mongo/operation/shared/specifiable.rb +18 -2
  197. data/lib/mongo/operation/shared/write_concern_supported.rb +1 -1
  198. data/lib/mongo/operation/update/op_msg.rb +3 -0
  199. data/lib/mongo/operation/update_user/command.rb +1 -1
  200. data/lib/mongo/operation/update_user/op_msg.rb +10 -1
  201. data/lib/mongo/operation/users_info/op_msg.rb +3 -0
  202. data/lib/mongo/options.rb +1 -1
  203. data/lib/mongo/options/mapper.rb +1 -1
  204. data/lib/mongo/options/redacted.rb +1 -1
  205. data/lib/mongo/protocol/bit_vector.rb +1 -1
  206. data/lib/mongo/protocol/compressed.rb +1 -1
  207. data/lib/mongo/protocol/delete.rb +1 -1
  208. data/lib/mongo/protocol/get_more.rb +7 -7
  209. data/lib/mongo/protocol/insert.rb +1 -1
  210. data/lib/mongo/protocol/kill_cursors.rb +1 -1
  211. data/lib/mongo/protocol/message.rb +5 -5
  212. data/lib/mongo/protocol/msg.rb +9 -7
  213. data/lib/mongo/protocol/query.rb +1 -1
  214. data/lib/mongo/protocol/registry.rb +1 -1
  215. data/lib/mongo/protocol/reply.rb +10 -10
  216. data/lib/mongo/protocol/serializers.rb +1 -1
  217. data/lib/mongo/protocol/update.rb +1 -1
  218. data/lib/mongo/retryable.rb +22 -14
  219. data/lib/mongo/server.rb +1 -1
  220. data/lib/mongo/server/connectable.rb +1 -1
  221. data/lib/mongo/server/connection.rb +16 -4
  222. data/lib/mongo/server/connection_pool.rb +1 -1
  223. data/lib/mongo/server/connection_pool/queue.rb +1 -1
  224. data/lib/mongo/server/context.rb +1 -1
  225. data/lib/mongo/server/description.rb +14 -2
  226. data/lib/mongo/server/description/features.rb +10 -9
  227. data/lib/mongo/server/description/inspector.rb +1 -1
  228. data/lib/mongo/server/description/inspector/description_changed.rb +1 -1
  229. data/lib/mongo/server/description/inspector/member_discovered.rb +1 -1
  230. data/lib/mongo/server/description/inspector/primary_elected.rb +1 -1
  231. data/lib/mongo/server/description/inspector/standalone_discovered.rb +1 -1
  232. data/lib/mongo/server/monitor.rb +15 -3
  233. data/lib/mongo/server/monitor/connection.rb +1 -1
  234. data/lib/mongo/server_selector.rb +1 -1
  235. data/lib/mongo/server_selector/nearest.rb +1 -1
  236. data/lib/mongo/server_selector/primary.rb +1 -1
  237. data/lib/mongo/server_selector/primary_preferred.rb +1 -1
  238. data/lib/mongo/server_selector/secondary.rb +1 -1
  239. data/lib/mongo/server_selector/secondary_preferred.rb +1 -1
  240. data/lib/mongo/server_selector/selectable.rb +7 -2
  241. data/lib/mongo/session.rb +389 -12
  242. data/lib/mongo/session/server_session.rb +7 -2
  243. data/lib/mongo/session/session_pool.rb +1 -1
  244. data/lib/mongo/socket.rb +1 -1
  245. data/lib/mongo/socket/ssl.rb +1 -1
  246. data/lib/mongo/socket/tcp.rb +1 -1
  247. data/lib/mongo/socket/unix.rb +1 -1
  248. data/lib/mongo/uri.rb +6 -4
  249. data/lib/mongo/uri/srv_protocol.rb +1 -1
  250. data/lib/mongo/version.rb +2 -2
  251. data/lib/mongo/write_concern.rb +1 -1
  252. data/lib/mongo/write_concern/acknowledged.rb +1 -1
  253. data/lib/mongo/write_concern/normalizable.rb +1 -1
  254. data/lib/mongo/write_concern/unacknowledged.rb +1 -1
  255. data/mongo.gemspec +4 -1
  256. data/spec/atlas/atlas_connectivity_spec.rb +54 -0
  257. data/spec/integration/bulk_insert_spec.rb +78 -0
  258. data/spec/integration/change_stream_spec.rb +365 -0
  259. data/spec/integration/command_monitoring_spec.rb +92 -0
  260. data/spec/lite_spec_helper.rb +63 -0
  261. data/spec/mongo/address/ipv6_spec.rb +29 -1
  262. data/spec/mongo/address_spec.rb +34 -0
  263. data/spec/mongo/auth/scram/conversation_spec.rb +326 -120
  264. data/spec/mongo/auth/scram/negotiation_spec.rb +574 -0
  265. data/spec/mongo/auth/scram_spec.rb +107 -38
  266. data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +113 -0
  267. data/spec/mongo/auth/stringprep_spec.rb +188 -0
  268. data/spec/mongo/auth/user/view_spec.rb +5 -2
  269. data/spec/mongo/auth/user_spec.rb +1 -1
  270. data/spec/mongo/bulk_write/result_spec.rb +120 -0
  271. data/spec/mongo/bulk_write_spec.rb +42 -2
  272. data/spec/mongo/client_spec.rb +121 -9
  273. data/spec/mongo/cluster/app_metadata_spec.rb +14 -1
  274. data/spec/mongo/cluster/topology_spec.rb +1 -23
  275. data/spec/mongo/collection/view/change_stream_spec.rb +62 -180
  276. data/spec/mongo/collection_spec.rb +45 -12
  277. data/spec/mongo/cursor/builder/get_more_command_spec.rb +7 -7
  278. data/spec/mongo/cursor_spec.rb +2 -2
  279. data/spec/mongo/database_spec.rb +3 -3
  280. data/spec/mongo/docs_examples_spec.rb +194 -0
  281. data/spec/mongo/error/operation_failure_spec.rb +152 -0
  282. data/spec/mongo/error/parser_spec.rb +127 -0
  283. data/spec/mongo/grid/fs_bucket_spec.rb +32 -0
  284. data/spec/mongo/grid/stream/write_spec.rb +40 -1
  285. data/spec/mongo/monitoring/event/command_failed_spec.rb +30 -0
  286. data/spec/mongo/monitoring/event/command_started_spec.rb +26 -4
  287. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +29 -7
  288. data/spec/mongo/monitoring_spec.rb +28 -3
  289. data/spec/mongo/protocol/get_more_spec.rb +2 -2
  290. data/spec/mongo/retryable_spec.rb +252 -34
  291. data/spec/mongo/retryable_writes_spec.rb +468 -544
  292. data/spec/mongo/server/connection_spec.rb +5 -5
  293. data/spec/mongo/server/description_spec.rb +23 -6
  294. data/spec/mongo/session/server_session_spec.rb +2 -2
  295. data/spec/mongo/session/session_pool_spec.rb +2 -2
  296. data/spec/mongo/transactions_examples_spec.rb +227 -0
  297. data/spec/mongo/transactions_spec.rb +44 -0
  298. data/spec/spec_helper.rb +135 -49
  299. data/spec/spec_tests/change_streams_spec.rb +42 -0
  300. data/spec/{mongo → spec_tests}/command_monitoring_spec.rb +8 -2
  301. data/spec/{mongo → spec_tests}/connection_string_spec.rb +1 -1
  302. data/spec/{mongo → spec_tests}/crud_spec.rb +5 -7
  303. data/spec/{mongo → spec_tests}/dns_seedlist_discovery_spec.rb +1 -1
  304. data/spec/{mongo → spec_tests}/gridfs_spec.rb +0 -0
  305. data/spec/{mongo → spec_tests}/max_staleness_spec.rb +0 -0
  306. data/spec/spec_tests/retryable_writes_spec.rb +78 -0
  307. data/spec/{mongo → spec_tests}/sdam_monitoring_spec.rb +4 -3
  308. data/spec/{mongo → spec_tests}/sdam_spec.rb +7 -7
  309. data/spec/{mongo → spec_tests}/server_selection_rtt_spec.rb +0 -0
  310. data/spec/{mongo → spec_tests}/server_selection_spec.rb +0 -0
  311. data/spec/support/authorization.rb +18 -6
  312. data/spec/support/change_streams.rb +265 -0
  313. data/spec/support/change_streams/operation.rb +62 -0
  314. data/spec/support/change_streams_tests/change-streams-errors.yml +53 -0
  315. data/spec/support/change_streams_tests/change-streams.yml +299 -0
  316. data/spec/support/command_monitoring.rb +1 -1
  317. data/spec/support/command_monitoring/bulkWrite.yml +4 -28
  318. data/spec/support/command_monitoring/command.yml +19 -0
  319. data/spec/support/command_monitoring/find.yml +17 -19
  320. data/spec/support/command_monitoring/insertMany.yml +2 -8
  321. data/spec/support/command_monitoring/unacknowledgedBulkWrite.yml +34 -0
  322. data/spec/support/connection_string.rb +1 -1
  323. data/spec/support/constraints.rb +56 -0
  324. data/spec/support/crud.rb +9 -4
  325. data/spec/support/crud/read.rb +24 -3
  326. data/spec/support/crud/write.rb +7 -2
  327. data/spec/support/crud_tests/read/count-collation.yml +12 -2
  328. data/spec/support/crud_tests/read/count.yml +43 -5
  329. data/spec/support/gridfs.rb +1 -1
  330. data/spec/support/primary_socket.rb +21 -0
  331. data/spec/support/retryable_writes_tests/bulkWrite-serverErrors.yml +90 -0
  332. data/spec/support/retryable_writes_tests/bulkWrite.yml +99 -1
  333. data/spec/support/retryable_writes_tests/deleteOne-serverErrors.yml +50 -0
  334. data/spec/support/retryable_writes_tests/deleteOne.yml +10 -1
  335. data/spec/support/retryable_writes_tests/findOneAndDelete-serverErrors.yml +50 -0
  336. data/spec/support/retryable_writes_tests/findOneAndDelete.yml +39 -30
  337. data/spec/support/retryable_writes_tests/findOneAndReplace-serverErrors.yml +54 -0
  338. data/spec/support/retryable_writes_tests/findOneAndReplace.yml +9 -0
  339. data/spec/support/retryable_writes_tests/findOneAndUpdate-serverErrors.yml +54 -0
  340. data/spec/support/retryable_writes_tests/findOneAndUpdate.yml +9 -0
  341. data/spec/support/retryable_writes_tests/insertMany-serverErrors.yml +59 -0
  342. data/spec/support/retryable_writes_tests/insertMany.yml +11 -6
  343. data/spec/support/retryable_writes_tests/insertOne-serverErrors.yml +471 -0
  344. data/spec/support/retryable_writes_tests/insertOne.yml +9 -0
  345. data/spec/support/retryable_writes_tests/replaceOne-serverErrors.yml +58 -0
  346. data/spec/support/retryable_writes_tests/replaceOne.yml +9 -0
  347. data/spec/support/retryable_writes_tests/updateOne-serverErrors.yml +58 -0
  348. data/spec/support/retryable_writes_tests/updateOne.yml +71 -53
  349. data/spec/support/sdam/rs/normalize_case_me.yml +100 -0
  350. data/spec/support/sdam/sharded/compatible.yml +38 -0
  351. data/spec/support/sdam/sharded/mongos_disconnect.yml +9 -3
  352. data/spec/support/sdam/sharded/multiple_mongoses.yml +6 -2
  353. data/spec/support/sdam/sharded/non_mongos_removed.yml +6 -2
  354. data/spec/support/sdam/sharded/too_new.yml +36 -0
  355. data/spec/support/sdam/sharded/too_old.yml +36 -0
  356. data/spec/support/sdam/single/compatible.yml +26 -0
  357. data/spec/support/sdam/single/direct_connection_external_ip.yml +3 -1
  358. data/spec/support/sdam/single/direct_connection_mongos.yml +3 -1
  359. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +3 -1
  360. data/spec/support/sdam/single/direct_connection_rsprimary.yml +3 -1
  361. data/spec/support/sdam/single/direct_connection_rssecondary.yml +3 -1
  362. data/spec/support/sdam/single/direct_connection_slave.yml +3 -1
  363. data/spec/support/sdam/single/direct_connection_standalone.yml +3 -1
  364. data/spec/support/sdam/single/not_ok_response.yml +6 -2
  365. data/spec/support/sdam/single/standalone_removed.yml +3 -1
  366. data/spec/support/sdam/single/too_new.yml +26 -0
  367. data/spec/support/sdam/single/too_old.yml +24 -0
  368. data/spec/support/shared/session.rb +107 -0
  369. data/spec/support/transactions.rb +391 -0
  370. data/spec/support/transactions/operation.rb +373 -0
  371. data/spec/support/transactions_tests/abort.yml +403 -0
  372. data/spec/support/transactions_tests/bulk.yml +267 -0
  373. data/spec/support/transactions_tests/causal-consistency.yml +173 -0
  374. data/spec/support/transactions_tests/commit.yml +593 -0
  375. data/spec/support/transactions_tests/delete.yml +184 -0
  376. data/spec/support/transactions_tests/error-labels.yml +948 -0
  377. data/spec/support/transactions_tests/errors.yml +125 -0
  378. data/spec/support/transactions_tests/findOneAndDelete.yml +126 -0
  379. data/spec/support/transactions_tests/findOneAndReplace.yml +140 -0
  380. data/spec/support/transactions_tests/findOneAndUpdate.yml +228 -0
  381. data/spec/support/transactions_tests/insert.yml +264 -0
  382. data/spec/support/transactions_tests/isolation.yml +125 -0
  383. data/spec/support/transactions_tests/read-pref.yml +340 -0
  384. data/spec/support/transactions_tests/reads.yml +298 -0
  385. data/spec/support/transactions_tests/retryable-abort.yml +1292 -0
  386. data/spec/support/transactions_tests/retryable-commit.yml +1332 -0
  387. data/spec/support/transactions_tests/retryable-writes.yml +208 -0
  388. data/spec/support/transactions_tests/run-command.yml +189 -0
  389. data/spec/support/transactions_tests/transaction-options.yml +877 -0
  390. data/spec/support/transactions_tests/update.yml +246 -0
  391. data/spec/support/transactions_tests/write-concern.yml +236 -0
  392. metadata +494 -359
  393. metadata.gz.sig +0 -0
  394. data/lib/csasl/csasl.bundle +0 -0
@@ -26,6 +26,15 @@ module Mongo
26
26
  include Executable
27
27
  include SessionsSupported
28
28
 
29
+ def execute(server)
30
+ result = Result.new(dispatch_message(server))
31
+ process_result(result, server)
32
+ result.validate!
33
+ rescue Mongo::Error::SocketError => e
34
+ e.send(:add_label, Mongo::Error::TRANSIENT_TRANSACTION_ERROR_LABEL) if session.in_transaction?
35
+ raise e
36
+ end
37
+
29
38
  private
30
39
 
31
40
  def selector(server)
@@ -30,7 +30,7 @@ module Mongo
30
30
  private
31
31
 
32
32
  def selector(server)
33
- { :createUser => user.name, :digestPassword => false }.merge(user.spec)
33
+ { :createUser => user.name }.merge(user.spec)
34
34
  end
35
35
 
36
36
  def message(server)
@@ -26,10 +26,19 @@ module Mongo
26
26
  include Executable
27
27
  include SessionsSupported
28
28
 
29
+ def execute(server)
30
+ result = Result.new(dispatch_message(server))
31
+ process_result(result, server)
32
+ result.validate!
33
+ rescue Mongo::Error::SocketError => e
34
+ e.send(:add_label, Mongo::Error::TRANSIENT_TRANSACTION_ERROR_LABEL) if session.in_transaction?
35
+ raise e
36
+ end
37
+
29
38
  private
30
39
 
31
40
  def selector(server)
32
- { :createUser => user.name, :digestPassword => false }.merge(user.spec)
41
+ { :createUser => user.name }.merge(user.spec)
33
42
  end
34
43
 
35
44
  def message(server)
@@ -40,6 +40,9 @@ module Mongo
40
40
  def execute(server)
41
41
  result = Result.new(dispatch_message(server))
42
42
  process_result(result, server)
43
+ rescue Mongo::Error::SocketError => e
44
+ e.send(:add_label, Mongo::Error::TRANSIENT_TRANSACTION_ERROR_LABEL) if session.in_transaction?
45
+ raise e
43
46
  end
44
47
 
45
48
  private
@@ -27,6 +27,15 @@ module Mongo
27
27
  include SessionsSupported
28
28
  include CausalConsistencySupported
29
29
 
30
+ def execute(server)
31
+ result = Result.new(dispatch_message(server))
32
+ process_result(result, server)
33
+ result.validate!
34
+ rescue Mongo::Error::SocketError => e
35
+ e.send(:add_label, Mongo::Error::TRANSIENT_TRANSACTION_ERROR_LABEL) if session.in_transaction?
36
+ raise e
37
+ end
38
+
30
39
  private
31
40
 
32
41
  def message(server)
@@ -26,6 +26,15 @@ module Mongo
26
26
  include Executable
27
27
  include SessionsSupported
28
28
 
29
+ def execute(server)
30
+ result = Result.new(dispatch_message(server))
31
+ process_result(result, server)
32
+ result.validate!
33
+ rescue Mongo::Error::SocketError => e
34
+ e.send(:add_label, Mongo::Error::TRANSIENT_TRANSACTION_ERROR_LABEL) if session.in_transaction?
35
+ raise e
36
+ end
37
+
29
38
  private
30
39
 
31
40
  def message(server)
@@ -26,6 +26,15 @@ module Mongo
26
26
  include Executable
27
27
  include SessionsSupported
28
28
 
29
+ def execute(server)
30
+ result = Result.new(dispatch_message(server))
31
+ process_result(result, server)
32
+ result.validate!
33
+ rescue Mongo::Error::SocketError => e
34
+ e.send(:add_label, Mongo::Error::TRANSIENT_TRANSACTION_ERROR_LABEL) if session.in_transaction?
35
+ raise e
36
+ end
37
+
29
38
  private
30
39
 
31
40
  def message(server)
@@ -26,6 +26,15 @@ module Mongo
26
26
  include Executable
27
27
  include SessionsSupported
28
28
 
29
+ def execute(server)
30
+ result = Result.new(dispatch_message(server))
31
+ process_result(result, server)
32
+ result.validate!
33
+ rescue Mongo::Error::SocketError => e
34
+ e.send(:add_label, Mongo::Error::TRANSIENT_TRANSACTION_ERROR_LABEL) if session.in_transaction?
35
+ raise e
36
+ end
37
+
29
38
  private
30
39
 
31
40
  def selector(server)
@@ -41,6 +41,9 @@ module Mongo
41
41
  result = Result.new(dispatch_message(server))
42
42
  process_result(result, server)
43
43
  result.validate!
44
+ rescue Mongo::Error::SocketError => e
45
+ e.send(:add_label, Mongo::Error::TRANSIENT_TRANSACTION_ERROR_LABEL) if session.in_transaction?
46
+ raise e
44
47
  end
45
48
 
46
49
  private
@@ -46,6 +46,9 @@ module Mongo
46
46
  result = Result.new(dispatch_message(server))
47
47
  process_result(result, server)
48
48
  result.validate!
49
+ rescue Mongo::Error::SocketError => e
50
+ e.send(:add_label, Mongo::Error::TRANSIENT_TRANSACTION_ERROR_LABEL) if session.in_transaction?
51
+ raise e
49
52
  end
50
53
 
51
54
  private
@@ -20,7 +20,7 @@ require 'mongo/operation/get_more/result'
20
20
  module Mongo
21
21
  module Operation
22
22
 
23
- # A MongoDB getmore operation.
23
+ # A MongoDB getMore operation.
24
24
  #
25
25
  # @api private
26
26
  #
@@ -16,7 +16,7 @@ module Mongo
16
16
  module Operation
17
17
  class GetMore
18
18
 
19
- # A MongoDB getmore operation sent as a command message.
19
+ # A MongoDB getMore operation sent as a command message.
20
20
  #
21
21
  # @api private
22
22
  #
@@ -16,7 +16,7 @@ module Mongo
16
16
  module Operation
17
17
  class GetMore
18
18
 
19
- # A MongoDB getmore operation sent as a legacy wire protocol message.
19
+ # A MongoDB getMore operation sent as a legacy wire protocol message.
20
20
  #
21
21
  # @api private
22
22
  #
@@ -45,6 +45,9 @@ module Mongo
45
45
  result = Result.new(dispatch_message(server))
46
46
  process_result(result, server)
47
47
  result.validate!
48
+ rescue Mongo::Error::SocketError => e
49
+ e.send(:add_label, Mongo::Error::TRANSIENT_TRANSACTION_ERROR_LABEL) if session.in_transaction?
50
+ raise e
48
51
  end
49
52
 
50
53
  private
@@ -41,6 +41,9 @@ module Mongo
41
41
  result = Result.new(dispatch_message(server))
42
42
  process_result(result, server)
43
43
  result.validate!
44
+ rescue Mongo::Error::SocketError => e
45
+ e.send(:add_label, Mongo::Error::TRANSIENT_TRANSACTION_ERROR_LABEL) if session.in_transaction?
46
+ raise e
44
47
  end
45
48
 
46
49
  private
@@ -78,7 +78,7 @@ module Mongo
78
78
  #
79
79
  # @since 2.0.0
80
80
  def validate!
81
- !successful? ? raise(Error::OperationFailure.new(parser.message, self)) : self
81
+ !successful? ? raise_operation_failure : self
82
82
  end
83
83
 
84
84
  private
@@ -32,13 +32,43 @@ module Mongo
32
32
  # @example Instantiate the result.
33
33
  # Result.new(replies, inserted_ids)
34
34
  #
35
- # @param [ Protocol::Message ] replies The wire protocol replies.
35
+ # @param [ Array<Protocol::Message> | nil ] replies The wire protocol replies, if any.
36
36
  # @param [ Array<Object> ] ids The ids of the inserted documents.
37
37
  #
38
38
  # @since 2.0.0
39
39
  def initialize(replies, ids)
40
40
  @replies = [*replies] if replies
41
- @inserted_ids = ids
41
+ if replies && replies.first && (doc = replies.first.documents.first)
42
+ if errors = doc['writeErrors']
43
+ # some documents were potentially inserted
44
+ bad_indices = {}
45
+ errors.map do |error|
46
+ bad_indices[error['index']] = true
47
+ end
48
+ @inserted_ids = []
49
+ ids.each_with_index do |id, index|
50
+ if bad_indices[index].nil?
51
+ @inserted_ids << id
52
+ end
53
+ end
54
+ # I don't know if acknowledged? check here is necessary,
55
+ # as best as I can tell it doesn't hurt
56
+ elsif acknowledged? && successful?
57
+ # We have a reply and the reply is successful and the
58
+ # reply has no writeErrors - everything got inserted
59
+ @inserted_ids = ids
60
+ else
61
+ # We have a reply and the reply is not successful and
62
+ # it has no writeErrors - nothing got inserted.
63
+ # If something got inserted the reply will be not successful
64
+ # but will have writeErrors
65
+ @inserted_ids = []
66
+ end
67
+ else
68
+ # I don't think we should ever get here but who knows,
69
+ # make this behave as old drivers did
70
+ @inserted_ids = ids
71
+ end
42
72
  end
43
73
 
44
74
  # Gets the number of documents inserted.
@@ -41,6 +41,9 @@ module Mongo
41
41
  def execute(server)
42
42
  result = Result.new(dispatch_message(server), @ids)
43
43
  process_result(result, server)
44
+ rescue Mongo::Error::SocketError => e
45
+ e.send(:add_label, Mongo::Error::TRANSIENT_TRANSACTION_ERROR_LABEL) if session.in_transaction?
46
+ raise e
44
47
  end
45
48
 
46
49
  private
@@ -34,7 +34,7 @@ module Mongo
34
34
  # @example Instantiate the result.
35
35
  # Result.new(replies, inserted_ids)
36
36
  #
37
- # @param [ Protocol::Message ] replies The wire protocol replies.
37
+ # @param [ Array<Protocol::Message> | nil ] replies The wire protocol replies, if any.
38
38
  # @param [ Array<Object> ] ids The ids of the inserted documents.
39
39
  #
40
40
  # @since 2.0.0
@@ -26,6 +26,15 @@ module Mongo
26
26
  include Executable
27
27
  include SessionsSupported
28
28
 
29
+ def execute(server)
30
+ result = Result.new(dispatch_message(server))
31
+ process_result(result, server)
32
+ result.validate!
33
+ rescue Mongo::Error::SocketError => e
34
+ e.send(:add_label, Mongo::Error::TRANSIENT_TRANSACTION_ERROR_LABEL) if session.in_transaction?
35
+ raise e
36
+ end
37
+
29
38
  private
30
39
 
31
40
  def message(server)
@@ -40,6 +40,9 @@ module Mongo
40
40
  result = Result.new(dispatch_message(server))
41
41
  process_result(result, server)
42
42
  result.validate!
43
+ rescue Mongo::Error::SocketError => e
44
+ e.send(:add_label, Mongo::Error::TRANSIENT_TRANSACTION_ERROR_LABEL) if session.in_transaction?
45
+ raise e
43
46
  end
44
47
 
45
48
  private
@@ -74,7 +74,11 @@ module Mongo
74
74
  #
75
75
  # @since 2.0.0
76
76
  def validate!
77
- !successful? ? raise(Error::OperationFailure.new(parser.message, self)) : self
77
+ if successful?
78
+ self
79
+ else
80
+ raise(Error::OperationFailure.new(parser.message, self))
81
+ end
78
82
  end
79
83
 
80
84
  private
@@ -41,6 +41,9 @@ module Mongo
41
41
  result = Result.new(dispatch_message(server))
42
42
  process_result(result, server)
43
43
  result.validate!
44
+ rescue Mongo::Error::SocketError => e
45
+ e.send(:add_label, Mongo::Error::TRANSIENT_TRANSACTION_ERROR_LABEL) if session.in_transaction?
46
+ raise e
44
47
  end
45
48
 
46
49
  private
@@ -103,7 +103,7 @@ module Mongo
103
103
  #
104
104
  # @since 2.0.0
105
105
  def validate!
106
- documents.nil? ? raise(Error::OperationFailure.new(parser.message, self)) : self
106
+ documents.nil? ? raise_operation_failure : self
107
107
  end
108
108
 
109
109
  # Get the cursor id.
@@ -41,6 +41,9 @@ module Mongo
41
41
  result = Result.new(dispatch_message(server))
42
42
  process_result(result, server)
43
43
  result.validate!
44
+ rescue Mongo::Error::SocketError => e
45
+ e.send(:add_label, Mongo::Error::TRANSIENT_TRANSACTION_ERROR_LABEL) if session.in_transaction?
46
+ raise e
44
47
  end
45
48
 
46
49
  private
@@ -26,6 +26,15 @@ module Mongo
26
26
  include Executable
27
27
  include SessionsSupported
28
28
 
29
+ def execute(server)
30
+ result = Result.new(dispatch_message(server))
31
+ process_result(result, server)
32
+ result.validate!
33
+ rescue Mongo::Error::SocketError => e
34
+ e.send(:add_label, Mongo::Error::TRANSIENT_TRANSACTION_ERROR_LABEL) if session.in_transaction?
35
+ raise e
36
+ end
37
+
29
38
  private
30
39
 
31
40
  def selector(server)
@@ -64,6 +64,18 @@ module Mongo
64
64
  # @since 2.2.0
65
65
  RESULT = 'result'.freeze
66
66
 
67
+ # Initialize a new result.
68
+ #
69
+ # @example Instantiate the result.
70
+ # Result.new(replies)
71
+ #
72
+ # @param [ Protocol::Reply ] replies The wire protocol replies.
73
+ #
74
+ # @since 2.0.0
75
+ def initialize(replies)
76
+ @replies = [ *replies ] if replies
77
+ end
78
+
67
79
  # @return [ Array<Protocol::Reply> ] replies The wrapped wire protocol replies.
68
80
  attr_reader :replies
69
81
 
@@ -151,18 +163,6 @@ module Mongo
151
163
  documents.each(&block)
152
164
  end
153
165
 
154
- # Initialize a new result.
155
- #
156
- # @example Instantiate the result.
157
- # Result.new(replies)
158
- #
159
- # @param [ Protocol::Reply ] replies The wire protocol replies.
160
- #
161
- # @since 2.0.0
162
- def initialize(replies)
163
- @replies = [ *replies ] if replies
164
- end
165
-
166
166
  # Get the pretty formatted inspection of the result.
167
167
  #
168
168
  # @example Inspect the result.
@@ -172,7 +172,7 @@ module Mongo
172
172
  #
173
173
  # @since 2.0.0
174
174
  def inspect
175
- "#<Mongo::Operation::Result:#{object_id} documents=#{documents}>"
175
+ "#<#{self.class.name}:0x#{object_id} documents=#{documents}>"
176
176
  end
177
177
 
178
178
  # Get the first reply from the result.
@@ -237,6 +237,11 @@ module Mongo
237
237
  #
238
238
  # @since 2.1.0
239
239
  def ok?
240
+ # first_document[OK] is a float, and the server can return
241
+ # ok as a BSON int32, BSON int64 or a BSON double.
242
+ # The number 1 is exactly representable in a float, hence
243
+ # 1.0 == 1 is going to perform correctly all of the time
244
+ # (until the server returns something other than 1 for success, that is)
240
245
  first_document[OK] == 1
241
246
  end
242
247
 
@@ -255,8 +260,16 @@ module Mongo
255
260
  #
256
261
  # @since 2.0.0
257
262
  def validate!
258
- !successful? ? raise(Error::OperationFailure.new(parser.message, self)) : self
263
+ !successful? ? raise_operation_failure : self
264
+ end
265
+
266
+ def raise_operation_failure
267
+ raise Error::OperationFailure.new(
268
+ parser.message,
269
+ self,
270
+ :code => parser.code, :code_name => parser.code_name)
259
271
  end
272
+ private :raise_operation_failure
260
273
 
261
274
  # Get the number of documents written by the server.
262
275
  #
@@ -28,6 +28,7 @@ module Mongo
28
28
 
29
29
  private
30
30
 
31
+ # Returns a Protocol::Message or nil
31
32
  def dispatch_message(server)
32
33
  server.with_connection do |connection|
33
34
  connection.dispatch([ message(server) ], operation_id)