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
  #
@@ -17,16 +16,14 @@
17
16
 
18
17
  module Mongo
19
18
  class Error
20
-
21
19
  # Exception raised if the object is not a valid update document.
22
20
  #
23
21
  # @since 2.0.0
24
22
  class InvalidUpdateDocument < Error
25
-
26
23
  # The error message.
27
24
  #
28
25
  # @deprecated
29
- MESSAGE = 'Invalid update document provided'.freeze
26
+ MESSAGE = 'Invalid update document provided'
30
27
 
31
28
  # Construct the error message.
32
29
  #
@@ -36,7 +33,7 @@ module Mongo
36
33
  #
37
34
  # @api private
38
35
  def self.message(key)
39
- message = "Invalid update document provided. Updates documents must only "
36
+ message = 'Invalid update document provided. Update documents must only '
40
37
  message += "contain only atomic modifiers. The \"#{key}\" key is invalid."
41
38
  message
42
39
  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,13 +16,11 @@
17
16
 
18
17
  module Mongo
19
18
  class Error
20
-
21
19
  # Exception that is raised when trying to parse a URI that does not match
22
20
  # the specification.
23
21
  #
24
22
  # @since 2.0.0
25
23
  class InvalidURI < Error
26
-
27
24
  # Instantiate the new exception.
28
25
  #
29
26
  # @example Instantiate the exception.
@@ -32,7 +29,7 @@ module Mongo
32
29
  # @since 2.0.0
33
30
  def initialize(uri, details, format = nil)
34
31
  message = "Bad URI: #{uri}\n" +
35
- "#{details}\n"
32
+ "#{details}\n"
36
33
  message += "MongoDB URI must be in the following format: #{format}\n" if format
37
34
  message += "Please see the following URL for more information: #{Mongo::URI::HELP}\n"
38
35
  super(message)
@@ -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 when an invalid write concern is provided.
22
20
  #
23
21
  # @since 2.2.0
24
22
  class InvalidWriteConcern < Error
25
-
26
23
  # Instantiate the new exception.
27
24
  #
28
25
  # @example Instantiate the exception.
@@ -30,8 +27,8 @@ module Mongo
30
27
  #
31
28
  # @since 2.2.0
32
29
  def initialize(msg = nil)
33
- super(msg || 'Invalid write concern options. If w is an Integer, it must be greater than or equal to 0. ' +
34
- 'If w is 0, it cannot be combined with a true value for fsync or j (journal).')
30
+ super(msg || ('Invalid write concern options. If w is an Integer, it must be greater than or equal to 0. ' +
31
+ 'If w is 0, it cannot be combined with a true value for fsync or j (journal).'))
35
32
  end
36
33
  end
37
34
  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
  # A KMS-related error during client-side encryption.
22
20
  class KmsError < CryptError
23
21
  def initialize(message, code: nil, network_error: nil)
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2019-2022 MongoDB Inc.
5
4
  #
@@ -17,7 +16,6 @@
17
16
 
18
17
  module Mongo
19
18
  class Error
20
-
21
19
  # A module encapsulating functionality to manage labels added to errors.
22
20
  #
23
21
  # @note Although methods of this module are part of the public API,
@@ -26,7 +24,6 @@ module Mongo
26
24
  #
27
25
  # @api semipublic
28
26
  module Labelable
29
-
30
27
  # Does the error have the given label?
31
28
  #
32
29
  # @example
@@ -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 the driver is used incorrectly.
22
20
  #
23
21
  # Normally the driver passes certain data to the server and lets the
@@ -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,17 +16,15 @@
17
16
 
18
17
  module Mongo
19
18
  class Error
20
-
21
19
  # Exception that is raised when trying to serialize a document that
22
20
  # exceeds max BSON object size.
23
21
  #
24
22
  # @since 2.0.0
25
23
  class MaxBSONSize < Error
26
-
27
24
  # The message is constant.
28
25
  #
29
26
  # @since 2.0.0
30
- MESSAGE = "The document exceeds maximum allowed BSON size".freeze
27
+ MESSAGE = 'The document exceeds maximum allowed BSON size'
31
28
 
32
29
  # Instantiate the new exception.
33
30
  #
@@ -40,13 +37,13 @@ module Mongo
40
37
  #
41
38
  # @since 2.0.0
42
39
  def initialize(max_size_or_msg = nil)
43
- if max_size_or_msg.is_a?(Numeric)
44
- msg = "#{MESSAGE}. The maximum allowed size is #{max_size_or_msg}"
45
- elsif max_size_or_msg
46
- msg = max_size_or_msg
47
- else
48
- msg = MESSAGE
49
- end
40
+ msg = if max_size_or_msg.is_a?(Numeric)
41
+ "#{MESSAGE}. The maximum allowed size is #{max_size_or_msg}"
42
+ elsif max_size_or_msg
43
+ max_size_or_msg
44
+ else
45
+ MESSAGE
46
+ end
50
47
  super(msg)
51
48
  end
52
49
  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,17 +16,15 @@
17
16
 
18
17
  module Mongo
19
18
  class Error
20
-
21
19
  # Exception that is raised when trying to send a message that exceeds max
22
20
  # message size.
23
21
  #
24
22
  # @since 2.0.0
25
23
  class MaxMessageSize < Error
26
-
27
24
  # The message is constant.
28
25
  #
29
26
  # @since 2.0.0
30
- MESSAGE = "Message exceeds allowed max message size.".freeze
27
+ MESSAGE = 'Message exceeds allowed max message size.'
31
28
 
32
29
  # Instantiate the new exception.
33
30
  #
@@ -38,7 +35,7 @@ module Mongo
38
35
  #
39
36
  # @since 2.0.0
40
37
  def initialize(max_size = nil)
41
- super(max_size ? MESSAGE + " The max is #{max_size}." : MESSAGE)
38
+ super(max_size ? MESSAGE + " The max is #{max_size}." : MESSAGE)
42
39
  end
43
40
  end
44
41
  end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2017-2020 MongoDB Inc.
5
4
  #
@@ -17,7 +16,6 @@
17
16
 
18
17
  module Mongo
19
18
  class Error
20
-
21
19
  # This exception is raised when the URI Parser's DNS query returns SRV record(s)
22
20
  # whose parent domain does not match the hostname used for the query.
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
  # 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) 2014-2020 MongoDB Inc.
5
4
  #
@@ -17,13 +16,11 @@
17
16
 
18
17
  module Mongo
19
18
  class Error
20
-
21
19
  # Raised if the next chunk when reading from a GridFSBucket does not have the
22
20
  # expected sequence number (n).
23
21
  #
24
22
  # @since 2.1.0
25
23
  class MissingFileChunk < Error
26
-
27
24
  # Create the new exception.
28
25
  #
29
26
  # @example Create the new exception.
@@ -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
  # Raised when the operations that require a password (e.g. retrieving
22
20
  # a salted or hashed password) are attempted on a User object that was
23
21
  # not created with a password.
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2017-2020 MongoDB Inc.
5
4
  #
@@ -17,16 +16,14 @@
17
16
 
18
17
  module Mongo
19
18
  class Error
20
-
21
19
  # Raised if a change stream document is returned without a resume token.
22
20
  #
23
21
  # @since 2.5.0
24
22
  class MissingResumeToken < Error
25
-
26
23
  # The error message.
27
24
  #
28
25
  # @since 2.5.0
29
- MESSAGE = 'Cannot provide resume functionality when the resume token is missing'.freeze
26
+ MESSAGE = 'Cannot provide resume functionality when the resume token is missing'
30
27
 
31
28
  # Create the new exception.
32
29
  #
@@ -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,13 +16,12 @@
17
16
 
18
17
  module Mongo
19
18
  class Error
20
-
21
19
  # This exception is raised when the server returned +{done: true}+ in a
22
20
  # SCRAM conversation but did not provide a ServerSignature.
23
21
  class MissingScramServerSignature < Error
24
22
  def initialize(msg = nil)
25
- msg ||= "Server signaled completion of SCRAM conversation without providing ServerSignature"
26
- super(msg)
23
+ msg ||= 'Server signaled completion of SCRAM conversation without providing ServerSignature'
24
+ super
27
25
  end
28
26
  end
29
27
  end
@@ -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 via the URI option
22
20
  # but a connection does not report a value in the serviceId field.
23
21
  class MissingServiceId < Error
@@ -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 spawning mongocryptd for client-side encryption.
22
20
  class MongocryptdSpawnError < CryptError
23
21
  end
@@ -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
  #
@@ -17,12 +16,10 @@
17
16
 
18
17
  module Mongo
19
18
  class Error
20
-
21
19
  # Exception raised if '*' is passed to drop_one on indexes.
22
20
  #
23
21
  # @since 2.0.0
24
22
  class MultiIndexDrop < Error
25
-
26
23
  # Instantiate the new exception.
27
24
  #
28
25
  # @example Instantiate the exception.
@@ -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
  # Raised when a primary server is needed but not found.
22
20
  #
23
21
  # @since 2.0.0
@@ -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 there are no servers available matching the preference.
22
20
  #
23
21
  # @since 2.0.0
24
22
  class NoServerAvailable < Error
25
-
26
23
  # Instantiate the new exception.
27
24
  #
28
25
  # @example Instantiate the exception.
@@ -34,14 +31,12 @@ module Mongo
34
31
  # performed on. (added in 2.7.0)
35
32
  #
36
33
  # @since 2.0.0
37
- def initialize(server_selector, cluster=nil, msg=nil)
34
+ def initialize(server_selector, cluster = nil, msg = nil)
38
35
  unless msg
39
36
  msg = "No #{server_selector.name} server is available"
40
- if cluster
41
- msg += " in cluster: #{cluster.summary}"
42
- end
37
+ msg += " in cluster: #{cluster.summary}" if cluster
43
38
  msg += " with timeout=#{server_selector.server_selection_timeout}, " +
44
- "LT=#{server_selector.local_threshold}"
39
+ "LT=#{server_selector.local_threshold}"
45
40
  end
46
41
 
47
42
  super(msg)
@@ -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 requires a connection to a particular service
22
20
  # but no matching connections exist in the connection pool.
23
21
  class NoServiceConnectionAvailable < Error
@@ -41,7 +39,7 @@ module Mongo
41
39
  new(
42
40
  "The connection pool for #{address} does not have a connection for service #{service_id}",
43
41
  address: address,
44
- service_id: service_id,
42
+ service_id: service_id
45
43
  )
46
44
  end
47
45
  end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2017-2020 MongoDB Inc.
5
4
  #
@@ -17,7 +16,6 @@
17
16
 
18
17
  module Mongo
19
18
  class Error
20
-
21
19
  # This exception is raised when the URI Parser's DNS query returns no SRV records.
22
20
  #
23
21
  # @example Instantiate the exception.
@@ -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 < StandardError
20
-
21
19
  # A module encapsulating functionality to manage data attached to
22
20
  # exceptions in the driver, since the driver does not currently have a
23
21
  # single exception hierarchy root.
@@ -25,7 +23,6 @@ module Mongo
25
23
  # @since 2.11.0
26
24
  # @api private
27
25
  module Notable
28
-
29
26
  # Returns an array of strings with additional information about the
30
27
  # exception.
31
28
  #
@@ -43,17 +40,14 @@ module Mongo
43
40
 
44
41
  # @api private
45
42
  def add_note(note)
46
- unless @notes
47
- @notes = []
48
- end
49
- if Lint.enabled?
50
- if @notes.include?(note)
51
- # The driver makes an effort to not add duplicated notes, by
52
- # keeping track of *when* a particular exception should have the
53
- # particular notes attached to it throughout the call stack.
54
- raise Error::LintError, "Adding a note which already exists in exception #{self}: #{note}"
55
- end
43
+ @notes ||= []
44
+ if Lint.enabled? && @notes.include?(note)
45
+ # The driver makes an effort to not add duplicated notes, by
46
+ # keeping track of *when* a particular exception should have the
47
+ # particular notes attached to it throughout the call stack.
48
+ raise Error::LintError, "Adding a note which already exists in exception #{self}: #{note}"
56
49
  end
50
+
57
51
  @notes << note
58
52
  end
59
53
 
@@ -94,9 +88,7 @@ module Mongo
94
88
  # @api private
95
89
  def notes_tail
96
90
  msg = ''
97
- unless notes.empty?
98
- msg += " (#{notes.join(', ')})"
99
- end
91
+ msg += " (#{notes.join(', ')})" unless notes.empty?
100
92
  msg
101
93
  end
102
94
  end
@@ -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
  #
@@ -54,29 +53,33 @@ module Mongo
54
53
  # @api experimental
55
54
  attr_reader :server_message
56
55
 
56
+ # @return [ String | nil ] The address ("host:port") of the server
57
+ # that produced this error, if known.
58
+ attr_reader :server_address
59
+
57
60
  # Error codes and code names that should result in a failing getMore
58
61
  # command on a change stream NOT being resumed.
59
62
  #
60
63
  # @api private
61
64
  CHANGE_STREAM_RESUME_ERRORS = [
62
- {code_name: 'HostUnreachable', code: 6},
63
- {code_name: 'HostNotFound', code: 7},
64
- {code_name: 'NetworkTimeout', code: 89},
65
- {code_name: 'ShutdownInProgress', code: 91},
66
- {code_name: 'PrimarySteppedDown', code: 189},
67
- {code_name: 'ExceededTimeLimit', code: 262},
68
- {code_name: 'SocketException', code: 9001},
69
- {code_name: 'NotMaster', code: 10107},
70
- {code_name: 'InterruptedAtShutdown', code: 11600},
71
- {code_name: 'InterruptedDueToReplStateChange', code: 11602},
72
- {code_name: 'NotPrimaryNoSecondaryOk', code: 13435},
73
- {code_name: 'NotMasterOrSecondary', code: 13436},
74
-
75
- {code_name: 'StaleShardVersion', code: 63},
76
- {code_name: 'FailedToSatisfyReadPreference', code: 133},
77
- {code_name: 'StaleEpoch', code: 150},
78
- {code_name: 'RetryChangeStream', code: 234},
79
- {code_name: 'StaleConfig', code: 13388},
65
+ { code_name: 'HostUnreachable', code: 6 },
66
+ { code_name: 'HostNotFound', code: 7 },
67
+ { code_name: 'NetworkTimeout', code: 89 },
68
+ { code_name: 'ShutdownInProgress', code: 91 },
69
+ { code_name: 'PrimarySteppedDown', code: 189 },
70
+ { code_name: 'ExceededTimeLimit', code: 262 },
71
+ { code_name: 'SocketException', code: 9001 },
72
+ { code_name: 'NotMaster', code: 10_107 },
73
+ { code_name: 'InterruptedAtShutdown', code: 11_600 },
74
+ { code_name: 'InterruptedDueToReplStateChange', code: 11_602 },
75
+ { code_name: 'NotPrimaryNoSecondaryOk', code: 13_435 },
76
+ { code_name: 'NotMasterOrSecondary', code: 13_436 },
77
+
78
+ { code_name: 'StaleShardVersion', code: 63 },
79
+ { code_name: 'FailedToSatisfyReadPreference', code: 133 },
80
+ { code_name: 'StaleEpoch', code: 150 },
81
+ { code_name: 'RetryChangeStream', code: 234 },
82
+ { code_name: 'StaleConfig', code: 13_388 },
80
83
  ].freeze
81
84
 
82
85
  # Change stream can be resumed when these error messages are encountered.
@@ -173,6 +176,8 @@ module Mongo
173
176
  # error document.
174
177
  # @option options [ String ] server_message The server-returned
175
178
  # error message parsed from the response.
179
+ # @option options [ nil | String | Mongo::Address | Mongo::Server::Description ]
180
+ # :server_address The address of the server that produced the error.
176
181
  # @option options [ Hash ] :write_concern_error_document The
177
182
  # server-supplied write concern error document, if any.
178
183
  # @option options [ Integer ] :write_concern_error_code Error code for
@@ -186,7 +191,8 @@ module Mongo
186
191
  # @option options [ true | false ] :wtimeout Whether the error is a wtimeout.
187
192
  def initialize(message = nil, result = nil, options = {})
188
193
  @details = retrieve_details(options[:document])
189
- super(append_details(message, @details))
194
+ @server_address = normalize_server_address(options[:server_address])
195
+ super(append_server_address(append_details(message, @details)))
190
196
 
191
197
  @result = result
192
198
  @code = options[:code]
@@ -219,20 +225,6 @@ module Mongo
219
225
  code == 50 # MaxTimeMSExpired
220
226
  end
221
227
 
222
- # Whether the error is caused by an attempted retryable write
223
- # on a storage engine that does not support retryable writes.
224
- #
225
- # @return [ true | false ] Whether the error is caused by an attempted
226
- # retryable write on a storage engine that does not support retryable writes.
227
- #
228
- # @since 2.10.0
229
- def unsupported_retryable_write?
230
- # code 20 is IllegalOperation.
231
- # Note that the document is expected to be a BSON::Document, thus
232
- # either having string keys or providing indifferent access.
233
- code == 20 && server_message&.start_with?("Transaction numbers") || false
234
- end
235
-
236
228
  private
237
229
 
238
230
  # Retrieve the details from a document
@@ -240,10 +232,11 @@ module Mongo
240
232
  # @return [ Hash | nil ] the details extracted from the document
241
233
  def retrieve_details(document)
242
234
  return nil unless document
235
+
243
236
  if wce = document['writeConcernError']
244
- return wce['errInfo']
237
+ wce['errInfo']
245
238
  elsif we = document['writeErrors']&.first
246
- return we['errInfo']
239
+ we['errInfo']
247
240
  end
248
241
  end
249
242
 
@@ -252,8 +245,41 @@ module Mongo
252
245
  # @return [ String ] the message with the details appended to it
253
246
  def append_details(message, details)
254
247
  return message unless details && message
248
+
255
249
  message + " -- #{details.to_json}"
256
250
  end
251
+
252
+ # Append the server address suffix to the message when the
253
+ # Mongo.include_server_address_in_errors flag is enabled and
254
+ # a server address is known.
255
+ #
256
+ # @return [ String | nil ] the message with the suffix appended,
257
+ # or the original message unchanged.
258
+ def append_server_address(message)
259
+ return message unless Mongo.include_server_address_in_errors
260
+ return message if @server_address.nil?
261
+ return "(on #{@server_address})" if message.nil? || message.empty?
262
+
263
+ "#{message} (on #{@server_address})"
264
+ end
265
+
266
+ # Normalize a server_address option into a String "host:port" form.
267
+ #
268
+ # @param [ nil | String | Mongo::Address | Mongo::Server::Description ] value
269
+ #
270
+ # @return [ String | nil ] The normalized address, or nil.
271
+ def normalize_server_address(value)
272
+ case value
273
+ when nil then nil
274
+ when String then value
275
+ when Mongo::Address then value.seed
276
+ when Mongo::Server::Description
277
+ value.address.is_a?(Mongo::Address) ? value.address.seed : nil
278
+ else
279
+ raise ArgumentError,
280
+ "server_address must be nil, String, Mongo::Address, or Mongo::Server::Description; got #{value.class}"
281
+ end
282
+ end
257
283
  end
258
284
 
259
285
  # OperationFailure is the canonical implementor of the