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) 2015-2020 MongoDB Inc.
5
4
  #
@@ -18,7 +17,6 @@
18
17
  module Mongo
19
18
  class Server
20
19
  class Monitor
21
-
22
20
  # This class models the monitor connections and their behavior.
23
21
  #
24
22
  # @since 2.0.0
@@ -58,9 +56,8 @@ module Mongo
58
56
  def initialize(address, options = {})
59
57
  @address = address
60
58
  @options = options.dup.freeze
61
- unless @app_metadata = options[:app_metadata]
62
- raise ArgumentError, 'App metadata is required'
63
- end
59
+ raise ArgumentError, 'App metadata is required' unless @app_metadata = options[:app_metadata]
60
+
64
61
  @socket = nil
65
62
  @pid = Process.pid
66
63
  @compressor = nil
@@ -109,14 +106,12 @@ module Mongo
109
106
  def dispatch_bytes(bytes, **opts)
110
107
  write_bytes(bytes)
111
108
  read_response(
112
- socket_timeout: opts[:read_socket_timeout],
109
+ socket_timeout: opts[:read_socket_timeout]
113
110
  )
114
111
  end
115
112
 
116
113
  def write_bytes(bytes)
117
- unless connected?
118
- raise ArgumentError, "Trying to dispatch on an unconnected connection #{self}"
119
- end
114
+ raise ArgumentError, "Trying to dispatch on an unconnected connection #{self}" unless connected?
120
115
 
121
116
  add_server_connection_id do
122
117
  add_server_diagnostics do
@@ -128,16 +123,14 @@ module Mongo
128
123
  # @option opts [ Numeric ] :socket_timeout The timeout to use for
129
124
  # each read operation.
130
125
  def read_response(**opts)
131
- unless connected?
132
- raise ArgumentError, "Trying to read on an unconnected connection #{self}"
133
- end
126
+ raise ArgumentError, "Trying to read on an unconnected connection #{self}" unless connected?
134
127
 
135
128
  add_server_connection_id do
136
129
  add_server_diagnostics do
137
130
  Protocol::Message.deserialize(socket,
138
- Protocol::Message::MAX_MESSAGE_SIZE,
139
- nil,
140
- **opts)
131
+ Protocol::Message::MAX_MESSAGE_SIZE,
132
+ nil,
133
+ **opts)
141
134
  end
142
135
  end
143
136
  end
@@ -156,13 +149,12 @@ module Mongo
156
149
  #
157
150
  # @since 2.0.0
158
151
  def connect!
159
- if @socket
160
- raise ArgumentError, 'Monitoring connection already connected'
161
- end
152
+ raise ArgumentError, 'Monitoring connection already connected' if @socket
162
153
 
163
154
  @socket = add_server_diagnostics do
164
155
  address.socket(socket_timeout, ssl_options.merge(
165
- connection_address: address, monitor: true))
156
+ connection_address: address, monitor: true
157
+ ))
166
158
  end
167
159
  true
168
160
  end
@@ -181,9 +173,13 @@ module Mongo
181
173
  # @return [ true ] If the disconnect succeeded.
182
174
  #
183
175
  # @since 2.0.0
184
- def disconnect!(options = nil)
176
+ def disconnect!(_options = nil)
185
177
  if socket
186
- socket.close rescue nil
178
+ begin
179
+ socket.close
180
+ rescue StandardError
181
+ nil
182
+ end
187
183
  @socket = nil
188
184
  end
189
185
  true
@@ -210,13 +206,12 @@ module Mongo
210
206
  set_hello_ok!(reply)
211
207
  @server_connection_id = reply['connectionId']
212
208
  reply
213
- rescue => exc
209
+ rescue StandardError => e
214
210
  msg = "Failed to handshake with #{address}"
215
- Utils.warn_bg_exception(msg, exc,
216
- logger: options[:logger],
217
- log_prefix: options[:log_prefix],
218
- bg_error_backtrace: options[:bg_error_backtrace],
219
- )
211
+ Utils.warn_bg_exception(msg, e,
212
+ logger: options[:logger],
213
+ log_prefix: options[:log_prefix],
214
+ bg_error_backtrace: options[:bg_error_backtrace])
220
215
  raise
221
216
  end
222
217
 
@@ -229,14 +224,12 @@ module Mongo
229
224
  def check_document
230
225
  server_api = @app_metadata.server_api || options[:server_api]
231
226
  doc = if hello_ok? || server_api
232
- _doc = HELLO_DOC
233
- if server_api
234
- _doc = _doc.merge(Utils.transform_server_api(server_api))
235
- end
236
- _doc
237
- else
238
- LEGACY_HELLO_DOC
239
- end
227
+ _doc = HELLO_DOC
228
+ _doc = _doc.merge(Utils.transform_server_api(server_api)) if server_api
229
+ _doc
230
+ else
231
+ LEGACY_HELLO_DOC
232
+ end
240
233
  # compressors must be set to maintain correct compression status
241
234
  # in the server description. See RUBY-2427
242
235
  if compressors = options[:compressors]
@@ -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 Server
20
-
21
19
  # Responsible for periodically polling a server via hello commands to
22
20
  # keep the server's status up to date.
23
21
  #
@@ -35,19 +33,19 @@ module Mongo
35
33
  # The default interval between server status refreshes is 10 seconds.
36
34
  #
37
35
  # @since 2.0.0
38
- DEFAULT_HEARTBEAT_INTERVAL = 10.freeze
36
+ DEFAULT_HEARTBEAT_INTERVAL = 10
39
37
 
40
38
  # The minimum time between forced server scans. Is
41
39
  # minHeartbeatFrequencyMS in the SDAM spec.
42
40
  #
43
41
  # @since 2.0.0
44
- MIN_SCAN_INTERVAL = 0.5.freeze
42
+ MIN_SCAN_INTERVAL = 0.5
45
43
 
46
44
  # The weighting factor (alpha) for calculating the average moving round trip time.
47
45
  #
48
46
  # @since 2.0.0
49
47
  # @deprecated Will be removed in version 3.0.
50
- RTT_WEIGHT_FACTOR = 0.2.freeze
48
+ RTT_WEIGHT_FACTOR = 0.2
51
49
 
52
50
  # Create the new server monitor.
53
51
  #
@@ -58,7 +56,7 @@ module Mongo
58
56
  #
59
57
  # @param [ Server ] server The server to monitor.
60
58
  # @param [ Event::Listeners ] event_listeners The event listeners.
61
- # @param [ Monitoring ] monitoring The monitoring..
59
+ # @param [ Monitoring ] monitoring The monitoring.
62
60
  # @param [ Hash ] options The options.
63
61
  #
64
62
  # @option options [ Float ] :connect_timeout The timeout, in seconds, to
@@ -76,15 +74,10 @@ module Mongo
76
74
  # @since 2.0.0
77
75
  # @api private
78
76
  def initialize(server, event_listeners, monitoring, options = {})
79
- unless monitoring.is_a?(Monitoring)
80
- raise ArgumentError, "Wrong monitoring type: #{monitoring.inspect}"
81
- end
82
- unless options[:app_metadata]
83
- raise ArgumentError, 'App metadata is required'
84
- end
85
- unless options[:push_monitor_app_metadata]
86
- raise ArgumentError, 'Push monitor app metadata is required'
87
- end
77
+ raise ArgumentError, "Wrong monitoring type: #{monitoring.inspect}" unless monitoring.is_a?(Monitoring)
78
+ raise ArgumentError, 'App metadata is required' unless options[:app_metadata]
79
+ raise ArgumentError, 'Push monitor app metadata is required' unless options[:push_monitor_app_metadata]
80
+
88
81
  @server = server
89
82
  @event_listeners = event_listeners
90
83
  @monitoring = monitoring
@@ -142,14 +135,10 @@ module Mongo
142
135
  # thread exits when requested.
143
136
  loop do
144
137
  delta = @next_wanted_scan - Time.now
145
- if delta > 0
146
- signaled = server.scan_semaphore.wait(delta)
147
- if signaled || @stop_requested
148
- break
149
- end
150
- else
151
- break
152
- end
138
+ break unless delta > 0
139
+
140
+ signaled = server.scan_semaphore.wait(delta)
141
+ break if signaled || @stop_requested
153
142
  end
154
143
  end
155
144
 
@@ -172,19 +161,17 @@ module Mongo
172
161
 
173
162
  def create_push_monitor!(topology_version)
174
163
  @update_mutex.synchronize do
175
- if @push_monitor && !@push_monitor.running?
176
- @push_monitor = nil
177
- end
164
+ @push_monitor = nil if @push_monitor && !@push_monitor.running?
178
165
 
179
166
  @push_monitor ||= PushMonitor.new(
180
167
  self,
181
168
  topology_version,
182
169
  monitoring,
183
170
  **Utils.shallow_symbolize_keys(options.merge(
184
- socket_timeout: heartbeat_interval + connection.socket_timeout,
185
- app_metadata: options[:push_monitor_app_metadata],
186
- check_document: @connection.check_document
187
- )),
171
+ socket_timeout: heartbeat_interval + connection.socket_timeout,
172
+ app_metadata: options[:push_monitor_app_metadata],
173
+ check_document: @connection.check_document
174
+ ))
188
175
  )
189
176
  end
190
177
  end
@@ -225,7 +212,7 @@ module Mongo
225
212
 
226
213
  begin
227
214
  result = do_scan
228
- rescue => e
215
+ rescue StandardError => e
229
216
  run_sdam_flow({}, scan_error: e)
230
217
  else
231
218
  run_sdam_flow(result)
@@ -286,19 +273,16 @@ module Mongo
286
273
  end
287
274
 
288
275
  def do_scan
289
- begin
290
- monitoring.publish_heartbeat(server) do
291
- check
292
- end
293
- rescue => exc
294
- msg = "Error checking #{server.address}"
295
- Utils.warn_bg_exception(msg, exc,
296
- logger: options[:logger],
297
- log_prefix: options[:log_prefix],
298
- bg_error_backtrace: options[:bg_error_backtrace],
299
- )
300
- raise exc
276
+ monitoring.publish_heartbeat(server) do
277
+ check
301
278
  end
279
+ rescue StandardError => e
280
+ msg = "Error checking #{server.address}"
281
+ Utils.warn_bg_exception(msg, e,
282
+ logger: options[:logger],
283
+ log_prefix: options[:log_prefix],
284
+ bg_error_backtrace: options[:bg_error_backtrace])
285
+ raise e
302
286
  end
303
287
 
304
288
  def check
@@ -310,18 +294,16 @@ module Mongo
310
294
 
311
295
  if @connection
312
296
  result = server.round_trip_time_calculator.measure do
313
- begin
314
- doc = @connection.check_document
315
- cmd = Protocol::Query.new(
316
- Database::ADMIN, Database::COMMAND, doc, :limit => -1
317
- )
318
- message = @connection.dispatch_bytes(cmd.serialize.to_s)
319
- message.documents.first
320
- rescue Mongo::Error
321
- @connection.disconnect!
322
- @connection = nil
323
- raise
324
- end
297
+ doc = @connection.check_document
298
+ cmd = Protocol::Query.new(
299
+ Database::ADMIN, Database::COMMAND, doc, limit: -1
300
+ )
301
+ message = @connection.dispatch_bytes(cmd.serialize.to_s)
302
+ message.documents.first
303
+ rescue Mongo::Error
304
+ @connection.disconnect!
305
+ @connection = nil
306
+ raise
325
307
  end
326
308
  else
327
309
  connection = Connection.new(server.address, options)
@@ -331,9 +313,12 @@ module Mongo
331
313
  end
332
314
  @connection = connection
333
315
  if tv_doc = result['topologyVersion']
334
- # Successful response, server 4.4+
335
- create_push_monitor!(TopologyVersion.new(tv_doc))
336
- push_monitor.run!
316
+ if streaming_enabled?
317
+ create_push_monitor!(TopologyVersion.new(tv_doc))
318
+ push_monitor.run!
319
+ else
320
+ stop_push_monitor!
321
+ end
337
322
  else
338
323
  # Failed response or pre-4.4 server
339
324
  stop_push_monitor!
@@ -347,8 +332,28 @@ module Mongo
347
332
  # can sleep for a very long time.
348
333
  def throttle_scan_frequency!
349
334
  delta = @next_earliest_scan - Time.now
350
- if delta > 0
351
- sleep(delta)
335
+ return unless delta > 0
336
+
337
+ sleep(delta)
338
+ end
339
+
340
+ # Returns whether the streaming protocol is enabled, based on the
341
+ # serverMonitoringMode option. Default mode is :auto.
342
+ #
343
+ # - :stream - always use streaming when server supports it
344
+ # - :poll - never use streaming
345
+ # - :auto - use polling on FaaS platforms, streaming otherwise
346
+ #
347
+ # @return [ true | false ] Whether streaming is enabled.
348
+ def streaming_enabled?
349
+ mode = options[:server_monitoring_mode] || :auto
350
+ case mode
351
+ when :poll
352
+ false
353
+ when :stream
354
+ true
355
+ when :auto
356
+ !Server::AppMetadata::Environment.new.faas?
352
357
  end
353
358
  end
354
359
  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 Server
20
-
21
19
  # This class encapsulates connections during handshake and authentication.
22
20
  #
23
21
  # @api private
@@ -44,6 +42,7 @@ module Mongo
44
42
  # but at this point we don't know the mechanism that ultimately
45
43
  # will be used (since this depends on the data returned by
46
44
  # the handshake, specifically server version).
45
+ #
47
46
  # However, we know that only 4.4+ servers support speculative
48
47
  # authentication, and those servers also generally support
49
48
  # SCRAM-SHA-256. We expect that user accounts created for 4.4+
@@ -51,15 +50,17 @@ module Mongo
51
50
  # user accounts migrated from pre-4.4 servers may only allow
52
51
  # SCRAM-SHA-1. The use of SCRAM-SHA-256 by default is thus
53
52
  # sensible, and it is also mandated by the speculative auth spec.
54
- # If no mechanism was specified and we are talking to a 3.0+
53
+ #
54
+ # If no mechanism was specified and we are talking to a 4.2
55
55
  # server, we'll send speculative auth document, the server will
56
56
  # ignore it and we'll perform authentication using explicit
57
- # command after having defaulted the mechanism later to CR.
57
+ # command.
58
+ #
58
59
  # If no mechanism was specified and we are talking to a 4.4+
59
60
  # server and the user account doesn't allow SCRAM-SHA-256, we will
60
61
  # authenticate in a separate command with SCRAM-SHA-1 after
61
62
  # going through SCRAM mechanism negotiation.
62
- default_options = Options::Redacted.new(:auth_mech => :scram256)
63
+ default_options = Options::Redacted.new(auth_mech: :scram256)
63
64
  speculative_auth_user = Auth::User.new(default_options.merge(options))
64
65
  speculative_auth = Auth.get(speculative_auth_user, self)
65
66
  speculative_auth_doc = speculative_auth.conversation.speculative_auth_document
@@ -68,17 +69,15 @@ module Mongo
68
69
  result = handshake!(speculative_auth_doc: speculative_auth_doc)
69
70
 
70
71
  if description.unknown?
71
- raise Error::InternalDriverError, "Connection description cannot be unknown after successful handshake: #{description.inspect}"
72
+ raise Error::InternalDriverError,
73
+ "Connection description cannot be unknown after successful handshake: #{description.inspect}"
72
74
  end
73
75
 
74
76
  begin
75
77
  if speculative_auth_doc && (speculative_auth_result = result['speculativeAuthenticate'])
76
- unless description.features.scram_sha_1_enabled?
77
- raise Error::InvalidServerAuthResponse, "Speculative auth succeeded on a pre-3.0 server"
78
- end
79
78
  case speculative_auth_user.mechanism
80
79
  when :mongodb_x509
81
- # Done
80
+ # Done
82
81
  # We default auth mechanism to scram256, but if user specified
83
82
  # scram explicitly we may be able to authenticate speculatively
84
83
  # with scram.
@@ -86,26 +85,31 @@ module Mongo
86
85
  authenticate!(
87
86
  speculative_auth_client_nonce: speculative_auth.conversation.client_nonce,
88
87
  speculative_auth_mech: speculative_auth_user.mechanism,
89
- speculative_auth_result: speculative_auth_result,
88
+ speculative_auth_result: speculative_auth_result
90
89
  )
91
90
  else
92
- raise Error::InternalDriverError, "Speculative auth unexpectedly succeeded for mechanism #{speculative_auth_user.mechanism.inspect}"
91
+ raise Error::InternalDriverError,
92
+ "Speculative auth unexpectedly succeeded for mechanism #{speculative_auth_user.mechanism.inspect}"
93
93
  end
94
94
  elsif !description.arbiter?
95
95
  authenticate!
96
96
  end
97
- rescue Mongo::Error, Mongo::Error::AuthError => exc
98
- exc.service_id = service_id
97
+ rescue Mongo::Error, Mongo::Error::AuthError => e
98
+ e.service_id = service_id
99
99
  raise
100
100
  end
101
101
 
102
102
  if description.unknown?
103
- raise Error::InternalDriverError, "Connection description cannot be unknown after successful authentication: #{description.inspect}"
103
+ raise Error::InternalDriverError,
104
+ "Connection description cannot be unknown after successful authentication: #{description.inspect}"
104
105
  end
105
106
 
106
- if server.load_balancer? && !description.mongos?
107
- raise Error::BadLoadBalancerTarget, "Load-balanced operation requires being connected a mongos, but the server at #{address.seed} reported itself as #{description.server_type.to_s.gsub('_', ' ')}"
108
- end
107
+ return unless server.load_balancer? && !description.mongos?
108
+
109
+ raise Error::BadLoadBalancerTarget,
110
+ "Load-balanced operation requires being connected a mongos, but the server at #{address.seed} reported itself as #{description.server_type.to_s.tr(
111
+ '_', ' '
112
+ )}"
109
113
  end
110
114
 
111
115
  private
@@ -148,25 +152,31 @@ module Mongo
148
152
  )
149
153
  doc = nil
150
154
  @server.handle_handshake_failure! do
151
- begin
152
- response = get_handshake_response(hello_command)
153
- result = Operation::Result.new([response])
154
- result.validate!
155
- doc = result.documents.first
156
- rescue => exc
157
- msg = "Failed to handshake with #{address}"
158
- Utils.warn_bg_exception(msg, exc,
159
- logger: options[:logger],
160
- log_prefix: options[:log_prefix],
161
- bg_error_backtrace: options[:bg_error_backtrace],
162
- )
163
- raise
155
+ response = get_handshake_response(hello_command)
156
+ result = Operation::Result.new([ response ])
157
+ result.validate!
158
+ doc = result.documents.first
159
+ rescue StandardError => e
160
+ msg = "Failed to handshake with #{address}"
161
+ Utils.warn_bg_exception(msg, e,
162
+ logger: options[:logger],
163
+ log_prefix: options[:log_prefix],
164
+ bg_error_backtrace: options[:bg_error_backtrace])
165
+ # The SystemOverloadedError label marks errors as back-pressure
166
+ # signals that should not cause the server to be marked Unknown.
167
+ # Per the SDAM spec, this label only applies to network errors
168
+ # during the handshake. Command errors (e.g. OperationFailure
169
+ # with "node is shutting down" codes) must still flow through
170
+ # normal SDAM error handling so the server is marked Unknown
171
+ # and the pool is cleared.
172
+ if e.is_a?(::Mongo::Error) && (e.is_a?(Error::SocketError) || e.is_a?(Error::SocketTimeoutError))
173
+ e.add_label('SystemOverloadedError')
174
+ e.add_label('RetryableError')
164
175
  end
176
+ raise
165
177
  end
166
178
 
167
- if @server.force_load_balancer?
168
- doc['serviceId'] ||= "fake:#{rand(2**32-1)+1}"
169
- end
179
+ doc['serviceId'] ||= "fake:#{rand((2**32) - 1) + 1}" if @server.force_load_balancer?
170
180
 
171
181
  post_handshake(
172
182
  doc,
@@ -191,26 +201,23 @@ module Mongo
191
201
  speculative_auth_mech: nil,
192
202
  speculative_auth_result: nil
193
203
  )
194
- if options[:user] || options[:auth_mech]
195
- @server.handle_auth_failure! do
196
- begin
197
- auth = Auth.get(
198
- resolved_user(speculative_auth_mech: speculative_auth_mech),
199
- self,
200
- speculative_auth_client_nonce: speculative_auth_client_nonce,
201
- speculative_auth_result: speculative_auth_result,
202
- )
203
- auth.login
204
- rescue => exc
205
- msg = "Failed to authenticate to #{address}"
206
- Utils.warn_bg_exception(msg, exc,
207
- logger: options[:logger],
208
- log_prefix: options[:log_prefix],
209
- bg_error_backtrace: options[:bg_error_backtrace],
210
- )
211
- raise
212
- end
213
- end
204
+ return unless options[:user] || options[:auth_mech]
205
+
206
+ @server.handle_auth_failure! do
207
+ auth = Auth.get(
208
+ resolved_user(speculative_auth_mech: speculative_auth_mech),
209
+ self,
210
+ speculative_auth_client_nonce: speculative_auth_client_nonce,
211
+ speculative_auth_result: speculative_auth_result
212
+ )
213
+ auth.login
214
+ rescue StandardError => e
215
+ msg = "Failed to authenticate to #{address}"
216
+ Utils.warn_bg_exception(msg, e,
217
+ logger: options[:logger],
218
+ log_prefix: options[:log_prefix],
219
+ bg_error_backtrace: options[:bg_error_backtrace])
220
+ raise
214
221
  end
215
222
  end
216
223
 
@@ -222,8 +229,8 @@ module Mongo
222
229
  #
223
230
  # @return [ Server::Description ] The server description calculated from
224
231
  # the handshake response for this particular connection.
225
- def post_handshake(response, average_rtt, minimum_rtt)
226
- if response["ok"] == 1
232
+ def post_handshake(response, average_rtt, _minimum_rtt)
233
+ if response['ok'] == 1
227
234
  # Auth mechanism is entirely dependent on the contents of
228
235
  # hello response *for this connection*.
229
236
  # Hello received by the monitoring connection should advertise
@@ -242,7 +249,7 @@ module Mongo
242
249
  address, response,
243
250
  average_round_trip_time: average_rtt,
244
251
  load_balancer: server.load_balancer?,
245
- force_load_balancer: options[:connect] == :load_balanced,
252
+ force_load_balancer: options[:connect] == :load_balanced
246
253
  ).tap do |new_description|
247
254
  @server.cluster.run_sdam_flow(@server.description, new_description)
248
255
  end
@@ -276,28 +283,20 @@ module Mongo
276
283
  # that is what the conversation was started with, even though
277
284
  # SCRAM mechanism negotiation did not return SCRAM-SHA-256 as a
278
285
  # valid mechanism to use for these credentials.
279
- :auth_mech => speculative_auth_mech || default_mechanism,
286
+ auth_mech: speculative_auth_mech || default_mechanism
280
287
  ).merge(options)
281
- if user_options[:auth_mech] == :mongodb_x509
282
- user_options[:auth_source] = '$external'
283
- end
288
+ user_options[:auth_source] = '$external' if user_options[:auth_mech] == :mongodb_x509
284
289
  Auth::User.new(user_options)
285
290
  end
286
291
  end
287
292
 
288
293
  def default_mechanism
289
- if description.nil?
290
- raise Mongo::Error, 'Trying to query default mechanism when handshake has not completed'
291
- end
294
+ raise Mongo::Error, 'Trying to query default mechanism when handshake has not completed' if description.nil?
292
295
 
293
- if description.features.scram_sha_1_enabled?
294
- if @sasl_supported_mechanisms&.include?('SCRAM-SHA-256')
295
- :scram256
296
- else
297
- :scram
298
- end
296
+ if @sasl_supported_mechanisms&.include?('SCRAM-SHA-256')
297
+ :scram256
299
298
  else
300
- :mongodb_cr
299
+ :scram
301
300
  end
302
301
  end
303
302
  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
  #
@@ -18,10 +17,8 @@
18
17
  module Mongo
19
18
  class Server
20
19
  class PushMonitor
21
-
22
20
  # @api private
23
21
  class Connection < Server::Monitor::Connection
24
-
25
22
  def socket_timeout
26
23
  options[:socket_timeout]
27
24
  end