mongo 2.23.0 → 2.24.1

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 (463) hide show
  1. checksums.yaml +4 -4
  2. data/bin/mongo_console +0 -1
  3. data/lib/mongo/active_support.rb +1 -2
  4. data/lib/mongo/address/ipv4.rb +3 -6
  5. data/lib/mongo/address/ipv6.rb +6 -10
  6. data/lib/mongo/address/unix.rb +1 -4
  7. data/lib/mongo/address/validator.rb +16 -28
  8. data/lib/mongo/address.rb +30 -40
  9. data/lib/mongo/auth/aws/conversation.rb +6 -10
  10. data/lib/mongo/auth/aws/credentials.rb +0 -1
  11. data/lib/mongo/auth/aws/credentials_cache.rb +0 -1
  12. data/lib/mongo/auth/aws/credentials_retriever.rb +45 -59
  13. data/lib/mongo/auth/aws/request.rb +20 -35
  14. data/lib/mongo/auth/aws.rb +1 -2
  15. data/lib/mongo/auth/base.rb +20 -29
  16. data/lib/mongo/auth/conversation_base.rb +14 -18
  17. data/lib/mongo/auth/cr/conversation.rb +0 -3
  18. data/lib/mongo/auth/cr.rb +1 -4
  19. data/lib/mongo/auth/credential_cache.rb +0 -2
  20. data/lib/mongo/auth/gssapi/conversation.rb +3 -8
  21. data/lib/mongo/auth/gssapi.rb +1 -4
  22. data/lib/mongo/auth/ldap/conversation.rb +0 -3
  23. data/lib/mongo/auth/ldap.rb +1 -4
  24. data/lib/mongo/auth/roles.rb +16 -19
  25. data/lib/mongo/auth/sasl_conversation_base.rb +7 -11
  26. data/lib/mongo/auth/scram/conversation.rb +2 -5
  27. data/lib/mongo/auth/scram.rb +5 -10
  28. data/lib/mongo/auth/scram256/conversation.rb +2 -5
  29. data/lib/mongo/auth/scram256.rb +1 -3
  30. data/lib/mongo/auth/scram_conversation_base.rb +18 -24
  31. data/lib/mongo/auth/stringprep/profiles/sasl.rb +17 -18
  32. data/lib/mongo/auth/stringprep/tables.rb +2209 -2210
  33. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +36 -38
  34. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1142 -1150
  35. data/lib/mongo/auth/stringprep.rb +9 -12
  36. data/lib/mongo/auth/user/view.rb +3 -5
  37. data/lib/mongo/auth/user.rb +14 -24
  38. data/lib/mongo/auth/x509/conversation.rb +0 -3
  39. data/lib/mongo/auth/x509.rb +7 -9
  40. data/lib/mongo/auth.rb +18 -30
  41. data/lib/mongo/background_thread.rb +9 -17
  42. data/lib/mongo/bson.rb +0 -2
  43. data/lib/mongo/bulk_write/combineable.rb +0 -3
  44. data/lib/mongo/bulk_write/ordered_combiner.rb +1 -3
  45. data/lib/mongo/bulk_write/result.rb +20 -17
  46. data/lib/mongo/bulk_write/result_combiner.rb +17 -13
  47. data/lib/mongo/bulk_write/transformable.rb +16 -19
  48. data/lib/mongo/bulk_write/unordered_combiner.rb +1 -3
  49. data/lib/mongo/bulk_write/validatable.rb +11 -18
  50. data/lib/mongo/bulk_write.rb +76 -91
  51. data/lib/mongo/caching_cursor.rb +2 -7
  52. data/lib/mongo/client.rb +230 -275
  53. data/lib/mongo/client_encryption.rb +4 -5
  54. data/lib/mongo/cluster/periodic_executor.rb +2 -5
  55. data/lib/mongo/cluster/reapers/cursor_reaper.rb +21 -29
  56. data/lib/mongo/cluster/reapers/socket_reaper.rb +1 -6
  57. data/lib/mongo/cluster/sdam_flow.rb +136 -159
  58. data/lib/mongo/cluster/topology/base.rb +15 -18
  59. data/lib/mongo/cluster/topology/load_balanced.rb +24 -14
  60. data/lib/mongo/cluster/topology/no_replica_set_options.rb +3 -6
  61. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +20 -23
  62. data/lib/mongo/cluster/topology/replica_set_with_primary.rb +0 -2
  63. data/lib/mongo/cluster/topology/sharded.rb +19 -9
  64. data/lib/mongo/cluster/topology/single.rb +24 -14
  65. data/lib/mongo/cluster/topology/unknown.rb +20 -10
  66. data/lib/mongo/cluster/topology.rb +29 -25
  67. data/lib/mongo/cluster.rb +148 -183
  68. data/lib/mongo/cluster_time.rb +14 -31
  69. data/lib/mongo/collection/helpers.rb +5 -8
  70. data/lib/mongo/collection/view/aggregation.rb +5 -10
  71. data/lib/mongo/collection/view/builder/aggregation.rb +6 -9
  72. data/lib/mongo/collection/view/builder/map_reduce.rb +18 -17
  73. data/lib/mongo/collection/view/builder.rb +0 -1
  74. data/lib/mongo/collection/view/change_stream/retryable.rb +3 -8
  75. data/lib/mongo/collection/view/change_stream.rb +59 -58
  76. data/lib/mongo/collection/view/explainable.rb +11 -20
  77. data/lib/mongo/collection/view/immutable.rb +1 -3
  78. data/lib/mongo/collection/view/iterable.rb +35 -28
  79. data/lib/mongo/collection/view/map_reduce.rb +20 -25
  80. data/lib/mongo/collection/view/readable.rb +50 -57
  81. data/lib/mongo/collection/view/writable.rb +56 -72
  82. data/lib/mongo/collection/view.rb +9 -8
  83. data/lib/mongo/collection.rb +63 -76
  84. data/lib/mongo/condition_variable.rb +4 -4
  85. data/lib/mongo/config/options.rb +0 -3
  86. data/lib/mongo/config/validators/option.rb +3 -5
  87. data/lib/mongo/config.rb +7 -4
  88. data/lib/mongo/crypt/auto_decryption_context.rb +0 -3
  89. data/lib/mongo/crypt/auto_encrypter.rb +34 -43
  90. data/lib/mongo/crypt/auto_encryption_context.rb +0 -3
  91. data/lib/mongo/crypt/binary.rb +5 -9
  92. data/lib/mongo/crypt/binding.rb +149 -155
  93. data/lib/mongo/crypt/context.rb +10 -17
  94. data/lib/mongo/crypt/data_key_context.rb +2 -7
  95. data/lib/mongo/crypt/encryption_io.rb +29 -39
  96. data/lib/mongo/crypt/explicit_decryption_context.rb +0 -3
  97. data/lib/mongo/crypt/explicit_encrypter.rb +1 -1
  98. data/lib/mongo/crypt/explicit_encryption_context.rb +19 -30
  99. data/lib/mongo/crypt/explicit_encryption_expression_context.rb +0 -2
  100. data/lib/mongo/crypt/handle.rb +42 -48
  101. data/lib/mongo/crypt/hooks.rb +12 -15
  102. data/lib/mongo/crypt/kms/aws/credentials.rb +12 -16
  103. data/lib/mongo/crypt/kms/aws/master_document.rb +6 -9
  104. data/lib/mongo/crypt/kms/aws.rb +0 -2
  105. data/lib/mongo/crypt/kms/azure/credentials_retriever.rb +2 -7
  106. data/lib/mongo/crypt/kms/azure/master_document.rb +15 -19
  107. data/lib/mongo/crypt/kms/azure.rb +0 -1
  108. data/lib/mongo/crypt/kms/credentials.rb +13 -27
  109. data/lib/mongo/crypt/kms/gcp/credentials.rb +12 -14
  110. data/lib/mongo/crypt/kms/gcp/credentials_retriever.rb +7 -9
  111. data/lib/mongo/crypt/kms/gcp/master_document.rb +12 -16
  112. data/lib/mongo/crypt/kms/gcp.rb +0 -2
  113. data/lib/mongo/crypt/kms/kmip/credentials.rb +7 -8
  114. data/lib/mongo/crypt/kms/kmip/master_document.rb +3 -5
  115. data/lib/mongo/crypt/kms/kmip.rb +0 -1
  116. data/lib/mongo/crypt/kms/local/credentials.rb +7 -8
  117. data/lib/mongo/crypt/kms/local/master_document.rb +2 -6
  118. data/lib/mongo/crypt/kms/local.rb +0 -1
  119. data/lib/mongo/crypt/kms/master_key_document.rb +11 -15
  120. data/lib/mongo/crypt/kms.rb +14 -16
  121. data/lib/mongo/crypt/kms_context.rb +0 -2
  122. data/lib/mongo/crypt/rewrap_many_data_key_context.rb +2 -7
  123. data/lib/mongo/crypt/rewrap_many_data_key_result.rb +2 -4
  124. data/lib/mongo/crypt/status.rb +12 -14
  125. data/lib/mongo/crypt.rb +0 -1
  126. data/lib/mongo/csot_timeout_holder.rb +3 -2
  127. data/lib/mongo/cursor/kill_spec.rb +7 -10
  128. data/lib/mongo/cursor.rb +74 -64
  129. data/lib/mongo/cursor_host.rb +8 -10
  130. data/lib/mongo/database/view.rb +16 -37
  131. data/lib/mongo/database.rb +52 -56
  132. data/lib/mongo/dbref.rb +0 -1
  133. data/lib/mongo/distinguishing_semaphore.rb +0 -1
  134. data/lib/mongo/error/auth_error.rb +0 -2
  135. data/lib/mongo/error/bad_load_balancer_target.rb +0 -2
  136. data/lib/mongo/error/bulk_write_error.rb +35 -10
  137. data/lib/mongo/error/change_stream_resumable.rb +0 -2
  138. data/lib/mongo/error/client_closed.rb +0 -2
  139. data/lib/mongo/error/closed_stream.rb +1 -4
  140. data/lib/mongo/error/connection_check_out_timeout.rb +3 -6
  141. data/lib/mongo/error/connection_perished.rb +0 -2
  142. data/lib/mongo/error/connection_unavailable.rb +0 -2
  143. data/lib/mongo/error/credential_check_error.rb +0 -2
  144. data/lib/mongo/error/crypt_error.rb +0 -2
  145. data/lib/mongo/error/extra_file_chunk.rb +1 -4
  146. data/lib/mongo/error/failed_string_prep_validation.rb +5 -6
  147. data/lib/mongo/error/file_not_found.rb +0 -3
  148. data/lib/mongo/error/handshake_error.rb +0 -2
  149. data/lib/mongo/error/insufficient_iteration_count.rb +1 -4
  150. data/lib/mongo/error/internal_driver_error.rb +0 -2
  151. data/lib/mongo/error/invalid_address.rb +0 -2
  152. data/lib/mongo/error/invalid_application_name.rb +0 -3
  153. data/lib/mongo/error/invalid_bulk_operation.rb +1 -4
  154. data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -4
  155. data/lib/mongo/error/invalid_collection_name.rb +1 -4
  156. data/lib/mongo/error/invalid_config_option.rb +0 -3
  157. data/lib/mongo/error/invalid_cursor_operation.rb +0 -2
  158. data/lib/mongo/error/invalid_database_name.rb +1 -4
  159. data/lib/mongo/error/invalid_document.rb +1 -4
  160. data/lib/mongo/error/invalid_file.rb +0 -3
  161. data/lib/mongo/error/invalid_file_revision.rb +0 -3
  162. data/lib/mongo/error/invalid_min_pool_size.rb +0 -3
  163. data/lib/mongo/error/invalid_nonce.rb +0 -3
  164. data/lib/mongo/error/invalid_read_concern.rb +2 -4
  165. data/lib/mongo/error/invalid_read_option.rb +0 -3
  166. data/lib/mongo/error/invalid_replacement_document.rb +2 -5
  167. data/lib/mongo/error/invalid_server_auth_host.rb +0 -2
  168. data/lib/mongo/error/invalid_server_auth_response.rb +0 -2
  169. data/lib/mongo/error/invalid_server_preference.rb +10 -16
  170. data/lib/mongo/error/invalid_session.rb +1 -4
  171. data/lib/mongo/error/invalid_signature.rb +0 -3
  172. data/lib/mongo/error/invalid_transaction_operation.rb +5 -8
  173. data/lib/mongo/error/invalid_txt_record.rb +0 -2
  174. data/lib/mongo/error/invalid_update_document.rb +2 -5
  175. data/lib/mongo/error/invalid_uri.rb +1 -4
  176. data/lib/mongo/error/invalid_write_concern.rb +2 -5
  177. data/lib/mongo/error/kms_error.rb +0 -2
  178. data/lib/mongo/error/labelable.rb +0 -3
  179. data/lib/mongo/error/lint_error.rb +0 -2
  180. data/lib/mongo/error/max_bson_size.rb +8 -11
  181. data/lib/mongo/error/max_message_size.rb +2 -5
  182. data/lib/mongo/error/mismatched_domain.rb +0 -2
  183. data/lib/mongo/error/missing_connection.rb +0 -2
  184. data/lib/mongo/error/missing_file_chunk.rb +0 -3
  185. data/lib/mongo/error/missing_password.rb +0 -2
  186. data/lib/mongo/error/missing_resume_token.rb +1 -4
  187. data/lib/mongo/error/missing_scram_server_signature.rb +2 -4
  188. data/lib/mongo/error/missing_service_id.rb +0 -2
  189. data/lib/mongo/error/mongocryptd_spawn_error.rb +0 -2
  190. data/lib/mongo/error/multi_index_drop.rb +0 -3
  191. data/lib/mongo/error/need_primary_server.rb +0 -2
  192. data/lib/mongo/error/no_server_available.rb +3 -8
  193. data/lib/mongo/error/no_service_connection_available.rb +1 -3
  194. data/lib/mongo/error/no_srv_records.rb +0 -2
  195. data/lib/mongo/error/notable.rb +8 -16
  196. data/lib/mongo/error/operation_failure.rb +62 -36
  197. data/lib/mongo/error/parser.rb +33 -75
  198. data/lib/mongo/error/pool_cleared_error.rb +1 -3
  199. data/lib/mongo/error/pool_closed_error.rb +0 -3
  200. data/lib/mongo/error/pool_error.rb +0 -3
  201. data/lib/mongo/error/pool_paused_error.rb +0 -2
  202. data/lib/mongo/error/raise_original_error.rb +1 -3
  203. data/lib/mongo/error/read_write_retryable.rb +14 -17
  204. data/lib/mongo/error/sdam_error_detection.rb +3 -5
  205. data/lib/mongo/error/server_api_conflict.rb +0 -2
  206. data/lib/mongo/error/server_certificate_revoked.rb +0 -2
  207. data/lib/mongo/error/server_not_usable.rb +0 -2
  208. data/lib/mongo/error/session_ended.rb +1 -3
  209. data/lib/mongo/error/session_not_materialized.rb +1 -3
  210. data/lib/mongo/error/sessions_not_supported.rb +1 -4
  211. data/lib/mongo/error/snapshot_session_invalid_server_version.rb +1 -4
  212. data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +1 -4
  213. data/lib/mongo/error/socket_error.rb +0 -2
  214. data/lib/mongo/error/socket_timeout_error.rb +0 -2
  215. data/lib/mongo/error/transactions_not_supported.rb +3 -6
  216. data/lib/mongo/error/unchangeable_collection_option.rb +1 -4
  217. data/lib/mongo/error/unexpected_chunk_length.rb +0 -3
  218. data/lib/mongo/error/unexpected_response.rb +1 -4
  219. data/lib/mongo/error/unknown_payload_type.rb +0 -3
  220. data/lib/mongo/error/unmet_dependency.rb +0 -2
  221. data/lib/mongo/error/unsupported_array_filters.rb +3 -24
  222. data/lib/mongo/error/unsupported_collation.rb +3 -24
  223. data/lib/mongo/error/unsupported_features.rb +0 -2
  224. data/lib/mongo/error/unsupported_message_type.rb +0 -2
  225. data/lib/mongo/error/unsupported_option.rb +19 -21
  226. data/lib/mongo/error/write_retryable.rb +0 -2
  227. data/lib/mongo/error.rb +10 -24
  228. data/lib/mongo/event/base.rb +0 -2
  229. data/lib/mongo/event/listeners.rb +0 -3
  230. data/lib/mongo/event/publisher.rb +0 -3
  231. data/lib/mongo/event/subscriber.rb +0 -4
  232. data/lib/mongo/event.rb +4 -6
  233. data/lib/mongo/grid/file/chunk.rb +7 -10
  234. data/lib/mongo/grid/file/info.rb +20 -24
  235. data/lib/mongo/grid/file.rb +7 -8
  236. data/lib/mongo/grid/fs_bucket.rb +40 -48
  237. data/lib/mongo/grid/stream/read.rb +25 -35
  238. data/lib/mongo/grid/stream/write.rb +17 -22
  239. data/lib/mongo/grid/stream.rb +2 -4
  240. data/lib/mongo/grid.rb +0 -1
  241. data/lib/mongo/id.rb +0 -1
  242. data/lib/mongo/index/view.rb +49 -48
  243. data/lib/mongo/index.rb +7 -10
  244. data/lib/mongo/lint.rb +31 -37
  245. data/lib/mongo/loggable.rb +5 -8
  246. data/lib/mongo/logger.rb +1 -7
  247. data/lib/mongo/monitoring/cmap_log_subscriber.rb +0 -2
  248. data/lib/mongo/monitoring/command_log_subscriber.rb +25 -33
  249. data/lib/mongo/monitoring/event/cmap/base.rb +0 -2
  250. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -4
  251. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +0 -3
  252. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +1 -4
  253. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +2 -5
  254. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +1 -4
  255. data/lib/mongo/monitoring/event/cmap/connection_created.rb +1 -4
  256. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +1 -4
  257. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +0 -3
  258. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +1 -4
  259. data/lib/mongo/monitoring/event/cmap/pool_created.rb +1 -4
  260. data/lib/mongo/monitoring/event/cmap/pool_ready.rb +1 -4
  261. data/lib/mongo/monitoring/event/cmap.rb +0 -1
  262. data/lib/mongo/monitoring/event/command_failed.rb +5 -9
  263. data/lib/mongo/monitoring/event/command_started.rb +8 -12
  264. data/lib/mongo/monitoring/event/command_succeeded.rb +7 -15
  265. data/lib/mongo/monitoring/event/secure.rb +15 -20
  266. data/lib/mongo/monitoring/event/server_closed.rb +1 -4
  267. data/lib/mongo/monitoring/event/server_description_changed.rb +4 -8
  268. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +5 -10
  269. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +1 -4
  270. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +3 -8
  271. data/lib/mongo/monitoring/event/server_opening.rb +1 -4
  272. data/lib/mongo/monitoring/event/topology_changed.rb +2 -5
  273. data/lib/mongo/monitoring/event/topology_closed.rb +1 -4
  274. data/lib/mongo/monitoring/event/topology_opening.rb +1 -4
  275. data/lib/mongo/monitoring/event.rb +0 -1
  276. data/lib/mongo/monitoring/publishable.rb +20 -30
  277. data/lib/mongo/monitoring/sdam_log_subscriber.rb +0 -2
  278. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +0 -3
  279. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +2 -3
  280. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +0 -3
  281. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +8 -8
  282. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +0 -3
  283. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +0 -3
  284. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +1 -3
  285. data/lib/mongo/monitoring.rb +38 -39
  286. data/lib/mongo/operation/aggregate/op_msg.rb +0 -2
  287. data/lib/mongo/operation/aggregate/result.rb +3 -6
  288. data/lib/mongo/operation/aggregate.rb +0 -2
  289. data/lib/mongo/operation/collections_info/result.rb +0 -3
  290. data/lib/mongo/operation/collections_info.rb +0 -2
  291. data/lib/mongo/operation/command/op_msg.rb +1 -4
  292. data/lib/mongo/operation/command.rb +0 -2
  293. data/lib/mongo/operation/context.rb +13 -16
  294. data/lib/mongo/operation/count/op_msg.rb +2 -4
  295. data/lib/mongo/operation/count.rb +0 -2
  296. data/lib/mongo/operation/create/op_msg.rb +2 -5
  297. data/lib/mongo/operation/create.rb +0 -2
  298. data/lib/mongo/operation/create_index/op_msg.rb +3 -7
  299. data/lib/mongo/operation/create_index.rb +0 -2
  300. data/lib/mongo/operation/create_user/op_msg.rb +2 -4
  301. data/lib/mongo/operation/create_user.rb +0 -2
  302. data/lib/mongo/operation/delete/bulk_result.rb +2 -3
  303. data/lib/mongo/operation/delete/op_msg.rb +3 -10
  304. data/lib/mongo/operation/delete/result.rb +0 -3
  305. data/lib/mongo/operation/delete.rb +1 -5
  306. data/lib/mongo/operation/distinct/op_msg.rb +2 -5
  307. data/lib/mongo/operation/distinct.rb +0 -2
  308. data/lib/mongo/operation/drop/op_msg.rb +0 -2
  309. data/lib/mongo/operation/drop.rb +0 -2
  310. data/lib/mongo/operation/drop_database/op_msg.rb +0 -2
  311. data/lib/mongo/operation/drop_database.rb +0 -2
  312. data/lib/mongo/operation/drop_index/op_msg.rb +4 -6
  313. data/lib/mongo/operation/drop_index.rb +0 -2
  314. data/lib/mongo/operation/explain/op_msg.rb +0 -2
  315. data/lib/mongo/operation/explain/result.rb +0 -3
  316. data/lib/mongo/operation/explain.rb +0 -2
  317. data/lib/mongo/operation/find/builder/command.rb +4 -12
  318. data/lib/mongo/operation/find/builder/flags.rb +9 -15
  319. data/lib/mongo/operation/find/builder/modifiers.rb +1 -4
  320. data/lib/mongo/operation/find/builder.rb +0 -1
  321. data/lib/mongo/operation/find/op_msg.rb +4 -12
  322. data/lib/mongo/operation/find/result.rb +0 -3
  323. data/lib/mongo/operation/find.rb +0 -2
  324. data/lib/mongo/operation/get_more/command_builder.rb +1 -6
  325. data/lib/mongo/operation/get_more/op_msg.rb +10 -4
  326. data/lib/mongo/operation/get_more/result.rb +0 -3
  327. data/lib/mongo/operation/get_more.rb +0 -2
  328. data/lib/mongo/operation/indexes/op_msg.rb +0 -2
  329. data/lib/mongo/operation/indexes/result.rb +1 -5
  330. data/lib/mongo/operation/indexes.rb +0 -2
  331. data/lib/mongo/operation/insert/bulk_result.rb +2 -6
  332. data/lib/mongo/operation/insert/op_msg.rb +2 -4
  333. data/lib/mongo/operation/insert/result.rb +0 -3
  334. data/lib/mongo/operation/insert.rb +2 -5
  335. data/lib/mongo/operation/kill_cursors/command_builder.rb +0 -3
  336. data/lib/mongo/operation/kill_cursors/op_msg.rb +1 -3
  337. data/lib/mongo/operation/kill_cursors.rb +0 -2
  338. data/lib/mongo/operation/list_collections/op_msg.rb +4 -6
  339. data/lib/mongo/operation/list_collections/result.rb +1 -4
  340. data/lib/mongo/operation/list_collections.rb +0 -2
  341. data/lib/mongo/operation/map_reduce/op_msg.rb +0 -2
  342. data/lib/mongo/operation/map_reduce/result.rb +3 -6
  343. data/lib/mongo/operation/map_reduce.rb +0 -2
  344. data/lib/mongo/operation/op_msg_base.rb +0 -1
  345. data/lib/mongo/operation/parallel_scan/op_msg.rb +4 -5
  346. data/lib/mongo/operation/parallel_scan/result.rb +2 -5
  347. data/lib/mongo/operation/parallel_scan.rb +0 -2
  348. data/lib/mongo/operation/remove_user/op_msg.rb +2 -4
  349. data/lib/mongo/operation/remove_user.rb +0 -2
  350. data/lib/mongo/operation/result.rb +38 -47
  351. data/lib/mongo/operation/shared/bypass_document_validation.rb +3 -7
  352. data/lib/mongo/operation/shared/causal_consistency_supported.rb +0 -3
  353. data/lib/mongo/operation/shared/executable.rb +20 -29
  354. data/lib/mongo/operation/shared/executable_no_validate.rb +0 -3
  355. data/lib/mongo/operation/shared/executable_transaction_label.rb +0 -2
  356. data/lib/mongo/operation/shared/idable.rb +3 -6
  357. data/lib/mongo/operation/shared/limited.rb +0 -3
  358. data/lib/mongo/operation/shared/object_id_generator.rb +0 -3
  359. data/lib/mongo/operation/shared/op_msg_executable.rb +0 -2
  360. data/lib/mongo/operation/shared/polymorphic_lookup.rb +0 -2
  361. data/lib/mongo/operation/shared/polymorphic_result.rb +2 -4
  362. data/lib/mongo/operation/shared/read_preference_supported.rb +10 -15
  363. data/lib/mongo/operation/shared/response_handling.rb +13 -26
  364. data/lib/mongo/operation/shared/result/aggregatable.rb +12 -13
  365. data/lib/mongo/operation/shared/sessions_supported.rb +87 -99
  366. data/lib/mongo/operation/shared/specifiable.rb +32 -58
  367. data/lib/mongo/operation/shared/write.rb +12 -17
  368. data/lib/mongo/operation/shared/write_concern_supported.rb +4 -7
  369. data/lib/mongo/operation/update/bulk_result.rb +13 -17
  370. data/lib/mongo/operation/update/op_msg.rb +2 -5
  371. data/lib/mongo/operation/update/result.rb +5 -5
  372. data/lib/mongo/operation/update.rb +1 -5
  373. data/lib/mongo/operation/update_user/op_msg.rb +2 -4
  374. data/lib/mongo/operation/update_user.rb +0 -2
  375. data/lib/mongo/operation/users_info/op_msg.rb +2 -4
  376. data/lib/mongo/operation/users_info/result.rb +1 -4
  377. data/lib/mongo/operation/users_info.rb +0 -2
  378. data/lib/mongo/operation/write_command/op_msg.rb +2 -10
  379. data/lib/mongo/operation/write_command.rb +0 -2
  380. data/lib/mongo/operation.rb +9 -14
  381. data/lib/mongo/options/mapper.rb +8 -15
  382. data/lib/mongo/options/redacted.rb +7 -9
  383. data/lib/mongo/options.rb +0 -1
  384. data/lib/mongo/protocol/bit_vector.rb +3 -5
  385. data/lib/mongo/protocol/caching_hash.rb +2 -7
  386. data/lib/mongo/protocol/compressed.rb +5 -10
  387. data/lib/mongo/protocol/get_more.rb +2 -8
  388. data/lib/mongo/protocol/kill_cursors.rb +2 -8
  389. data/lib/mongo/protocol/message.rb +103 -105
  390. data/lib/mongo/protocol/msg.rb +48 -63
  391. data/lib/mongo/protocol/query.rb +32 -41
  392. data/lib/mongo/protocol/registry.rb +2 -5
  393. data/lib/mongo/protocol/reply.rb +10 -16
  394. data/lib/mongo/protocol/serializers.rb +41 -59
  395. data/lib/mongo/protocol.rb +0 -1
  396. data/lib/mongo/query_cache.rb +7 -15
  397. data/lib/mongo/retryable/backpressure.rb +31 -0
  398. data/lib/mongo/retryable/base_worker.rb +39 -13
  399. data/lib/mongo/retryable/read_worker.rb +77 -21
  400. data/lib/mongo/retryable/retry_policy.rb +59 -0
  401. data/lib/mongo/retryable/write_worker.rb +155 -56
  402. data/lib/mongo/retryable.rb +70 -9
  403. data/lib/mongo/search_index/view.rb +1 -1
  404. data/lib/mongo/semaphore.rb +0 -1
  405. data/lib/mongo/server/app_metadata/environment.rb +3 -3
  406. data/lib/mongo/server/app_metadata.rb +4 -5
  407. data/lib/mongo/server/connection.rb +61 -61
  408. data/lib/mongo/server/connection_base.rb +43 -53
  409. data/lib/mongo/server/connection_common.rb +41 -64
  410. data/lib/mongo/server/connection_pool/generation_manager.rb +6 -11
  411. data/lib/mongo/server/connection_pool/populator.rb +1 -4
  412. data/lib/mongo/server/connection_pool.rb +250 -175
  413. data/lib/mongo/server/description/features.rb +23 -60
  414. data/lib/mongo/server/description/load_balancer.rb +0 -2
  415. data/lib/mongo/server/description.rb +138 -137
  416. data/lib/mongo/server/monitor/app_metadata.rb +3 -4
  417. data/lib/mongo/server/monitor/connection.rb +28 -35
  418. data/lib/mongo/server/monitor.rb +65 -60
  419. data/lib/mongo/server/pending_connection.rb +70 -71
  420. data/lib/mongo/server/push_monitor/connection.rb +0 -3
  421. data/lib/mongo/server/push_monitor.rb +21 -29
  422. data/lib/mongo/server/round_trip_time_calculator.rb +11 -17
  423. data/lib/mongo/server.rb +60 -93
  424. data/lib/mongo/server_selector/base.rb +146 -157
  425. data/lib/mongo/server_selector/nearest.rb +5 -5
  426. data/lib/mongo/server_selector/primary.rb +4 -5
  427. data/lib/mongo/server_selector/primary_preferred.rb +5 -6
  428. data/lib/mongo/server_selector/secondary.rb +5 -6
  429. data/lib/mongo/server_selector/secondary_preferred.rb +4 -5
  430. data/lib/mongo/server_selector.rb +3 -4
  431. data/lib/mongo/session/server_session.rb +6 -7
  432. data/lib/mongo/session/session_pool.rb +20 -34
  433. data/lib/mongo/session.rb +321 -189
  434. data/lib/mongo/socket/ocsp_cache.rb +8 -13
  435. data/lib/mongo/socket/ocsp_verifier.rb +69 -70
  436. data/lib/mongo/socket/ssl.rb +44 -43
  437. data/lib/mongo/socket/tcp.rb +5 -8
  438. data/lib/mongo/socket/unix.rb +0 -4
  439. data/lib/mongo/socket.rb +80 -102
  440. data/lib/mongo/srv/monitor.rb +6 -11
  441. data/lib/mongo/srv/resolver.rb +15 -24
  442. data/lib/mongo/srv/result.rb +18 -24
  443. data/lib/mongo/srv.rb +0 -1
  444. data/lib/mongo/timeout.rb +4 -11
  445. data/lib/mongo/topology_version.rb +8 -13
  446. data/lib/mongo/tracing/open_telemetry/command_tracer.rb +28 -1
  447. data/lib/mongo/tracing/open_telemetry/operation_tracer.rb +1 -1
  448. data/lib/mongo/tracing/open_telemetry/tracer.rb +1 -1
  449. data/lib/mongo/uri/options_mapper.rb +135 -126
  450. data/lib/mongo/uri/srv_protocol.rb +25 -38
  451. data/lib/mongo/uri.rb +95 -139
  452. data/lib/mongo/utils.rb +5 -12
  453. data/lib/mongo/version.rb +1 -1
  454. data/lib/mongo/write_concern/acknowledged.rb +0 -2
  455. data/lib/mongo/write_concern/base.rb +6 -6
  456. data/lib/mongo/write_concern/unacknowledged.rb +0 -2
  457. data/lib/mongo/write_concern.rb +14 -15
  458. data/lib/mongo.rb +2 -3
  459. data/mongo.gemspec +17 -17
  460. metadata +5 -5
  461. data/lib/mongo/error/server_api_not_supported.rb +0 -27
  462. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +0 -32
  463. data/lib/mongo/operation/shared/validatable.rb +0 -87
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2014-2020 MongoDB Inc.
5
4
  #
@@ -19,7 +18,6 @@ require 'mongo/cursor/nontailable'
19
18
 
20
19
  module Mongo
21
20
  class Database
22
-
23
21
  # A class representing a view of a database.
24
22
  #
25
23
  # @since 2.0.0
@@ -82,19 +80,13 @@ module Mongo
82
80
  session: session,
83
81
  operation_timeouts: operation_timeouts(options)
84
82
  )
83
+
85
84
  cursor = read_with_retry_cursor(session, ServerSelector.primary, self, context: context) do |server|
86
85
  send_initial_query(server, session, context, options.merge(name_only: true))
87
86
  end
88
- cursor.map do |info|
89
- if cursor.initial_result.connection_description.features.list_collections_enabled?
90
- info['name']
91
- else
92
- (info['name'] &&
93
- info['name'].sub("#{@database.name}.", ''))
94
- end
95
- end.reject do |name|
96
- name.start_with?('system.') || name.include?('$')
97
- end
87
+
88
+ cursor.map { |info| info['name'] }
89
+ .reject { |name| name.start_with?('system.') || name.include?('$') }
98
90
  end
99
91
 
100
92
  # Get info on all the collections in the database.
@@ -154,7 +146,7 @@ module Mongo
154
146
 
155
147
  validate_timeout_mode!(options)
156
148
 
157
- @batch_size = nil
149
+ @batch_size = nil
158
150
  @limit = nil
159
151
  @collection = @database[Database::COMMAND]
160
152
  end
@@ -209,7 +201,8 @@ module Mongo
209
201
 
210
202
  private
211
203
 
212
- def collections_info(session, server_selector, options = {}, &block)
204
+ def collections_info(session, server_selector, options = {})
205
+ @batch_size = options[:batch_size] if options[:batch_size]
213
206
  description = nil
214
207
  context = Operation::Context.new(
215
208
  client: client,
@@ -219,27 +212,15 @@ module Mongo
219
212
  op = initial_query_op(session, options)
220
213
  tracer.trace_operation(op, context, op_name: 'listCollections') do
221
214
  cursor = read_with_retry_cursor(session, server_selector, self, context: context) do |server|
222
- # TODO take description from the connection used to send the query
215
+ # TODO: take description from the connection used to send the query
223
216
  # once https://jira.mongodb.org/browse/RUBY-1601 is fixed.
224
217
  description = server.description
225
218
  send_initial_query(server, session, context, options)
226
219
  end
227
- # On 3.0+ servers, we get just the collection names.
228
- # On 2.6 server, we get collection names prefixed with the database
229
- # name. We need to filter system collections out here because
230
- # in the caller we don't know which server version executed the
231
- # command and thus what the proper filtering logic should be
232
- # (it is valid for collection names to have dots, thus filtering out
233
- # collections named system.* here for 2.6 servers would actually
234
- # filter out collections in the system database).
235
- if description.server_version_gte?('3.0')
236
- cursor.reject do |doc|
237
- doc['name'].start_with?('system.') || doc['name'].include?('$')
238
- end
239
- else
240
- cursor.reject do |doc|
241
- doc['name'].start_with?("#{database.name}.system") || doc['name'].include?('$')
242
- end
220
+
221
+ # Filter out the system collections
222
+ cursor.reject do |doc|
223
+ doc['name'].start_with?('system.') || doc['name'].include?('$')
243
224
  end
244
225
  end
245
226
  end
@@ -247,10 +228,10 @@ module Mongo
247
228
  def collections_info_spec(session, options = {})
248
229
  { selector: {
249
230
  listCollections: 1,
250
- cursor: batch_size ? { batchSize: batch_size } : {} },
231
+ cursor: batch_size ? { batchSize: batch_size } : {}
232
+ },
251
233
  db_name: @database.name,
252
- session: session
253
- }.tap do |spec|
234
+ session: session }.tap do |spec|
254
235
  spec[:selector][:nameOnly] = true if options[:name_only]
255
236
  spec[:selector][:filter] = options[:filter] if options[:filter]
256
237
  spec[:selector][:authorizedCollections] = true if options[:authorized_collections]
@@ -290,9 +271,7 @@ module Mongo
290
271
  def send_initial_query(server, session, context, options = {})
291
272
  opts = options.dup
292
273
  execution_opts = {}
293
- if opts.key?(:deserialize_as_bson)
294
- execution_opts[:deserialize_as_bson] = opts.delete(:deserialize_as_bson)
295
- end
274
+ execution_opts[:deserialize_as_bson] = opts.delete(:deserialize_as_bson) if opts.key?(:deserialize_as_bson)
296
275
  if server.load_balancer?
297
276
  connection = server.pool.check_out(context: context)
298
277
  initial_query_op(session, opts).execute_with_connection(
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2014-2020 MongoDB Inc.
5
4
  #
@@ -18,7 +17,6 @@
18
17
  require 'mongo/database/view'
19
18
 
20
19
  module Mongo
21
-
22
20
  # Represents a database on the db server and operations that can execute on
23
21
  # it at this level.
24
22
  #
@@ -30,33 +28,33 @@ module Mongo
30
28
  # The admin database name.
31
29
  #
32
30
  # @since 2.0.0
33
- ADMIN = 'admin'.freeze
31
+ ADMIN = 'admin'
34
32
 
35
33
  # The "collection" that database commands operate against.
36
34
  #
37
35
  # @since 2.0.0
38
- COMMAND = '$cmd'.freeze
36
+ COMMAND = '$cmd'
39
37
 
40
38
  # The default database options.
41
39
  #
42
40
  # @since 2.0.0
43
- DEFAULT_OPTIONS = Options::Redacted.new(:database => ADMIN).freeze
41
+ DEFAULT_OPTIONS = Options::Redacted.new(database: ADMIN).freeze
44
42
 
45
43
  # Database name field constant.
46
44
  #
47
45
  # @since 2.1.0
48
46
  # @deprecated
49
- NAME = 'name'.freeze
47
+ NAME = 'name'
50
48
 
51
49
  # Databases constant.
52
50
  #
53
51
  # @since 2.1.0
54
- DATABASES = 'databases'.freeze
52
+ DATABASES = 'databases'
55
53
 
56
54
  # The name of the collection that holds all the collection names.
57
55
  #
58
56
  # @since 2.0.0
59
- NAMESPACES = 'system.namespaces'.freeze
57
+ NAMESPACES = 'system.namespaces'
60
58
 
61
59
  # @return [ Client ] client The database client.
62
60
  attr_reader :client
@@ -94,6 +92,7 @@ module Mongo
94
92
  # @since 2.0.0
95
93
  def ==(other)
96
94
  return false unless other.is_a?(Database)
95
+
97
96
  name == other.name
98
97
  end
99
98
 
@@ -110,11 +109,13 @@ module Mongo
110
109
  # @since 2.0.0
111
110
  def [](collection_name, options = {})
112
111
  if options[:server_api]
113
- raise ArgumentError, 'The :server_api option cannot be specified for collection objects. It can only be specified on Client level'
112
+ raise ArgumentError,
113
+ 'The :server_api option cannot be specified for collection objects. It can only be specified on Client level'
114
114
  end
115
+
115
116
  Collection.new(self, collection_name, options)
116
117
  end
117
- alias_method :collection, :[]
118
+ alias collection []
118
119
 
119
120
  # Get all the names of the non-system collections in the database.
120
121
  #
@@ -223,7 +224,7 @@ module Mongo
223
224
  # executes this command. This is an internal option and is subject to
224
225
  # change.
225
226
  # - :deserialize_as_bson [ Boolean ] Whether to deserialize the response
226
- # to this command using BSON types intead of native Ruby types wherever
227
+ # to this command using BSON types instead of native Ruby types wherever
227
228
  # possible.
228
229
  #
229
230
  # @return [ Mongo::Operation::Result ] The result of the command execution.
@@ -231,31 +232,30 @@ module Mongo
231
232
  opts = opts.dup
232
233
  execution_opts = opts.delete(:execution_options) || {}
233
234
 
234
- txn_read_pref = if opts[:session] && opts[:session].in_transaction?
235
- opts[:session].txn_read_preference
236
- else
237
- nil
238
- end
235
+ txn_read_pref = (opts[:session].txn_read_preference if opts[:session] && opts[:session].in_transaction?)
239
236
  txn_read_pref ||= opts[:read] || ServerSelector::PRIMARY
240
237
  Lint.validate_underscore_read_preference(txn_read_pref)
241
238
  selector = ServerSelector.get(txn_read_pref)
242
239
 
243
240
  client.with_session(opts) do |session|
244
- server = selector.select_server(cluster, nil, session)
241
+ context = Operation::Context.new(
242
+ client: client,
243
+ session: session,
244
+ operation_timeouts: operation_timeouts(opts)
245
+ )
245
246
  op = Operation::Command.new(
246
- :selector => operation,
247
- :db_name => name,
248
- :read => selector,
249
- :session => session
247
+ selector: operation,
248
+ db_name: name,
249
+ read: selector,
250
+ session: session
250
251
  )
251
252
 
252
- op.execute(server,
253
- context: Operation::Context.new(
254
- client: client,
255
- session: session,
256
- operation_timeouts: operation_timeouts(opts)
257
- ),
258
- options: execution_opts)
253
+ retry_enabled = client.options[:retry_reads] != false &&
254
+ client.options[:retry_writes] != false
255
+ with_overload_retry(context: context, retry_enabled: retry_enabled) do
256
+ server = selector.select_server(cluster, nil, session)
257
+ op.execute(server, context: context, options: execution_opts)
258
+ end
259
259
  end
260
260
  end
261
261
 
@@ -278,11 +278,7 @@ module Mongo
278
278
  # @return [ Hash ] The result of the command execution.
279
279
  # @api private
280
280
  def read_command(operation, opts = {})
281
- txn_read_pref = if opts[:session] && opts[:session].in_transaction?
282
- opts[:session].txn_read_preference
283
- else
284
- nil
285
- end
281
+ txn_read_pref = (opts[:session].txn_read_preference if opts[:session] && opts[:session].in_transaction?)
286
282
  txn_read_pref ||= opts[:read] || ServerSelector::PRIMARY
287
283
  Lint.validate_underscore_read_preference(txn_read_pref)
288
284
  preference = ServerSelector.get(txn_read_pref)
@@ -298,7 +294,7 @@ module Mongo
298
294
  db_name: name,
299
295
  read: preference,
300
296
  session: session,
301
- comment: opts[:comment],
297
+ comment: opts[:comment]
302
298
  )
303
299
  op_name = opts[:op_name] || 'command'
304
300
  tracer.trace_operation(operation, context, op_name: op_name) do
@@ -327,26 +323,26 @@ module Mongo
327
323
  #
328
324
  # @since 2.0.0
329
325
  def drop(options = {})
330
- operation = { :dropDatabase => 1 }
326
+ operation = { dropDatabase: 1 }
331
327
  client.with_session(options) do |session|
332
328
  write_concern = if options[:write_concern]
333
- WriteConcern.get(options[:write_concern])
334
- else
335
- self.write_concern
336
- end
329
+ WriteConcern.get(options[:write_concern])
330
+ else
331
+ self.write_concern
332
+ end
337
333
  Operation::DropDatabase.new({
338
- selector: operation,
339
- db_name: name,
340
- write_concern: write_concern,
341
- session: session
342
- }).execute(
343
- next_primary(nil, session),
344
- context: Operation::Context.new(
345
- client: client,
346
- session: session,
347
- operation_timeouts: operation_timeouts(options)
348
- )
349
- )
334
+ selector: operation,
335
+ db_name: name,
336
+ write_concern: write_concern,
337
+ session: session
338
+ }).execute(
339
+ next_primary(nil, session),
340
+ context: Operation::Context.new(
341
+ client: client,
342
+ session: session,
343
+ operation_timeouts: operation_timeouts(options)
344
+ )
345
+ )
350
346
  end
351
347
  end
352
348
 
@@ -371,6 +367,7 @@ module Mongo
371
367
  if Lint.enabled? && !(name.is_a?(String) || name.is_a?(Symbol))
372
368
  raise "Database name must be a string or a symbol: #{name}"
373
369
  end
370
+
374
371
  @client = client
375
372
  @name = name.to_s.freeze
376
373
  @options = options.freeze
@@ -458,9 +455,8 @@ module Mongo
458
455
  View.new(self, options).aggregate(pipeline, options)
459
456
  end
460
457
 
461
- # As of version 3.6 of the MongoDB server, a ``$changeStream`` pipeline stage is supported
462
- # in the aggregation framework. As of version 4.0, this stage allows users to request that
463
- # notifications are sent for all changes that occur in the client's database.
458
+ # Allows users to request that notifications are sent for all changes that
459
+ # occur in the client's database.
464
460
  #
465
461
  # @example Get change notifications for a given database..
466
462
  # database.watch([{ '$match' => { operationType: { '$in' => ['insert', 'replace'] } } }])
@@ -507,7 +503,6 @@ module Mongo
507
503
  # @option options [ BSON::Timestamp ] :start_at_operation_time Only return
508
504
  # changes that occurred after the specified timestamp. Any command run
509
505
  # against the server will return a cluster time that can be used here.
510
- # Only recognized by server versions 4.0+.
511
506
  # @option options [ Object ] :comment A user-provided
512
507
  # comment to attach to this command.
513
508
  # @option options [ Boolean ] :show_expanded_events Enables the server to
@@ -531,7 +526,8 @@ module Mongo
531
526
  Mongo::Collection::View.new(collection("#{COMMAND}.aggregate"), {}, view_options),
532
527
  pipeline,
533
528
  Mongo::Collection::View::ChangeStream::DATABASE,
534
- options)
529
+ options
530
+ )
535
531
  end
536
532
 
537
533
  # Create a database for the provided client, for use when we don't want the
data/lib/mongo/dbref.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2015-2020 MongoDB Inc.
5
4
  #
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2020 MongoDB Inc.
5
4
  #
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2018-2020 MongoDB Inc.
5
4
  #
@@ -17,7 +16,6 @@
17
16
 
18
17
  module Mongo
19
18
  class Error
20
-
21
19
  # Raised when authentication fails.
22
20
  #
23
21
  # Note: This class is derived from RuntimeError for
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2021 MongoDB Inc.
5
4
  #
@@ -17,7 +16,6 @@
17
16
 
18
17
  module Mongo
19
18
  class Error
20
-
21
19
  # Raised when the driver is in load-balancing mode but a connection
22
20
  # is established to something other than a mongos.
23
21
  class BadLoadBalancerTarget < Error
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2014-2020 MongoDB Inc.
5
4
  #
@@ -17,7 +16,6 @@
17
16
 
18
17
  module Mongo
19
18
  class Error
20
-
21
19
  # Exception raised if there are write errors upon executing a bulk
22
20
  # operation.
23
21
  #
@@ -33,10 +31,14 @@ module Mongo
33
31
  #
34
32
  # @since 2.0.0
35
33
  class BulkWriteError < Error
36
-
37
34
  # @return [ BSON::Document ] result The error result.
38
35
  attr_reader :result
39
36
 
37
+ # @return [ Array<String> ] Deduplicated list of "host:port" addresses of
38
+ # the servers that produced this bulk write error. Empty when no
39
+ # addresses were supplied.
40
+ attr_reader :server_addresses
41
+
40
42
  # Instantiate the new exception.
41
43
  #
42
44
  # @example Instantiate the exception.
@@ -44,13 +46,19 @@ module Mongo
44
46
  #
45
47
  # @param [ Hash ] result A processed response from the server
46
48
  # reporting results of the operation.
49
+ # @param [ Array<String | Mongo::Address | Mongo::Server::Description> ]
50
+ # server_addresses Addresses of the servers that produced this error.
51
+ # Entries are normalized to "host:port" strings.
47
52
  #
48
53
  # @since 2.0.0
49
- def initialize(result)
54
+ def initialize(result, server_addresses: nil)
50
55
  @result = result
56
+ @server_addresses = normalize_server_addresses(server_addresses)
57
+
51
58
  # Exception constructor behaves differently for a nil argument and
52
59
  # for no argument. Avoid passing nil explicitly.
53
- super(*[build_message])
60
+ message = build_message
61
+ message ? super(message) : super()
54
62
  end
55
63
 
56
64
  private
@@ -77,27 +85,44 @@ module Mongo
77
85
  errors = @result['writeErrors']
78
86
  return nil unless errors
79
87
 
80
- fragment = ""
88
+ fragment = ''
81
89
  cut_short = false
82
90
  errors.first(10).each_with_index do |error, i|
83
- fragment += "; " if fragment.length > 0
91
+ fragment += '; ' if fragment.length > 0
84
92
  fragment += "[#{error['code']}]: #{error['errmsg']}"
85
93
  fragment += " -- #{error['errInfo'].to_json}" if error['errInfo']
86
94
 
87
95
  if fragment.length > 3000
88
- cut_short = i < [9, errors.length].min
96
+ cut_short = i < [ 9, errors.length ].min
89
97
  break
90
98
  end
91
99
  end
92
100
 
93
101
  fragment += '...' if errors.length > 10 || cut_short
94
102
 
95
- if errors.length > 1
96
- fragment = "Multiple errors: #{fragment}"
103
+ fragment = "Multiple errors: #{fragment}" if errors.length > 1
104
+
105
+ if Mongo.include_server_address_in_errors && @server_addresses.any?
106
+ fragment = "#{fragment} (on #{@server_addresses.join(', ')})"
97
107
  end
98
108
 
99
109
  fragment
100
110
  end
111
+
112
+ def normalize_server_addresses(value)
113
+ return [] if value.nil?
114
+
115
+ Array(value).filter_map do |entry|
116
+ case entry
117
+ when String then entry
118
+ when Mongo::Address then entry.seed
119
+ when Mongo::Server::Description then entry.address&.seed
120
+ else
121
+ raise ArgumentError,
122
+ "server_addresses entries must be String, Mongo::Address, or Mongo::Server::Description; got #{entry.class}"
123
+ end
124
+ end.uniq
125
+ end
101
126
  end
102
127
  end
103
128
  end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2018-2020 MongoDB Inc.
5
4
  #
@@ -17,7 +16,6 @@
17
16
 
18
17
  module Mongo
19
18
  class Error
20
-
21
19
  # A module signifying the error will always cause change stream to
22
20
  # resume once.
23
21
  #
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2022 MongoDB Inc.
5
4
  #
@@ -17,7 +16,6 @@
17
16
 
18
17
  module Mongo
19
18
  class Error
20
-
21
19
  class ClientClosed < Error
22
20
  end
23
21
  end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2014-2020 MongoDB Inc.
5
4
  #
@@ -17,12 +16,10 @@
17
16
 
18
17
  module Mongo
19
18
  class Error
20
-
21
19
  # Raised if the Grid::FSBucket::Stream object is closed and an operation is attempted.
22
20
  #
23
21
  # @since 2.1.0
24
22
  class ClosedStream < Error
25
-
26
23
  # Create the new exception.
27
24
  #
28
25
  # @example Create the new exception.
@@ -30,7 +27,7 @@ module Mongo
30
27
  #
31
28
  # @since 2.1.0
32
29
  def initialize
33
- super("The stream is closed and cannot be written to or read from.")
30
+ super('The stream is closed and cannot be written to or read from.')
34
31
  end
35
32
  end
36
33
  end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2019-2020 MongoDB Inc.
5
4
  #
@@ -17,7 +16,6 @@
17
16
 
18
17
  module Mongo
19
18
  class Error
20
-
21
19
  # Exception raised when trying to check out a connection from a connection
22
20
  # pool, the pool is at its max size and no connections become available
23
21
  # within the configured wait timeout.
@@ -27,7 +25,6 @@ module Mongo
27
25
  #
28
26
  # @since 2.9.0
29
27
  class ConnectionCheckOutTimeout < ::Timeout::Error
30
-
31
28
  # @return [ Mongo::Address ] address The address of the server the
32
29
  # pool's connections connect to.
33
30
  #
@@ -42,9 +39,9 @@ module Mongo
42
39
  def initialize(msg, options)
43
40
  super(msg)
44
41
  @address = options[:address]
45
- unless @address
46
- raise ArgumentError, 'Address argument is required'
47
- end
42
+ return if @address
43
+
44
+ raise ArgumentError, 'Address argument is required'
48
45
  end
49
46
  end
50
47
  end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2020 MongoDB Inc.
5
4
  #
@@ -17,7 +16,6 @@
17
16
 
18
17
  module Mongo
19
18
  class Error
20
-
21
19
  # Exception raised when trying to perform operations on a connection that
22
20
  # experienced a network error.
23
21
  class ConnectionPerished < Error
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2022 MongoDB Inc.
5
4
  #
@@ -17,7 +16,6 @@
17
16
 
18
17
  module Mongo
19
18
  class Error
20
-
21
19
  # Exception raised when trying to check out a connection with a specific
22
20
  # global id, and the connection for that global id no longer exists in the
23
21
  # pool.
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2020 MongoDB Inc.
5
4
  #
@@ -17,7 +16,6 @@
17
16
 
18
17
  module Mongo
19
18
  class Error
20
-
21
19
  # Credential check for MONGODB-AWS authentication mechanism failed.
22
20
  #
23
21
  # This exception is raised when the driver attempts to verify the
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2020 MongoDB Inc.
5
4
  #
@@ -17,7 +16,6 @@
17
16
 
18
17
  module Mongo
19
18
  class Error
20
-
21
19
  # An error related to client-side encryption.
22
20
  class CryptError < Mongo::Error
23
21
  # Create a new CryptError
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2014-2020 MongoDB Inc.
5
4
  #
@@ -17,12 +16,10 @@
17
16
 
18
17
  module Mongo
19
18
  class Error
20
-
21
19
  # Raised if an extra chunk is found.
22
20
  #
23
21
  # @since 2.1.0
24
22
  class ExtraFileChunk < Error
25
-
26
23
  # Create the new exception.
27
24
  #
28
25
  # @example Create the new exception.
@@ -30,7 +27,7 @@ module Mongo
30
27
  #
31
28
  # @since 2.1.0
32
29
  def initialize
33
- super("Extra file chunk found.")
30
+ super('Extra file chunk found.')
34
31
  end
35
32
  end
36
33
  end