mongo 2.23.0 → 2.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +11 -16
  46. data/lib/mongo/bulk_write/result_combiner.rb +9 -12
  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 +2 -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 +7 -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 +7 -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 +22 -35
  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 +0 -3
  280. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +0 -3
  281. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +5 -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 -48
  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 +19 -28
  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 +195 -167
  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 +117 -138
  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 +133 -157
  425. data/lib/mongo/server_selector/nearest.rb +2 -5
  426. data/lib/mongo/server_selector/primary.rb +1 -5
  427. data/lib/mongo/server_selector/primary_preferred.rb +2 -6
  428. data/lib/mongo/server_selector/secondary.rb +2 -6
  429. data/lib/mongo/server_selector/secondary_preferred.rb +1 -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 +287 -188
  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 +1 -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 +1 -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,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
@@ -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 Server
20
-
21
19
  # A monitor utilizing server-pushed hello requests.
22
20
  #
23
21
  # When a Monitor handshakes with a 4.4+ server, it creates an instance
@@ -33,15 +31,10 @@ module Mongo
33
31
  include BackgroundThread
34
32
 
35
33
  def initialize(monitor, topology_version, monitoring, **options)
36
- if topology_version.nil?
37
- raise ArgumentError, 'Topology version must be provided but it was nil'
38
- end
39
- unless options[:app_metadata]
40
- raise ArgumentError, 'App metadata is required'
41
- end
42
- unless options[:check_document]
43
- raise ArgumentError, 'Check document is required'
44
- end
34
+ raise ArgumentError, 'Topology version must be provided but it was nil' if topology_version.nil?
35
+ raise ArgumentError, 'App metadata is required' unless options[:app_metadata]
36
+ raise ArgumentError, 'Check document is required' unless options[:check_document]
37
+
45
38
  @app_metadata = options[:app_metadata]
46
39
  @check_document = options[:check_document]
47
40
  @monitor = monitor
@@ -78,7 +71,11 @@ module Mongo
78
71
  if @connection
79
72
  # Interrupt any in-progress exhausted hello reads by
80
73
  # disconnecting the connection.
81
- @connection.send(:socket).close rescue nil
74
+ begin
75
+ @connection.send(:socket).close
76
+ rescue StandardError
77
+ nil
78
+ end
82
79
  end
83
80
  end
84
81
  super.tap do
@@ -107,10 +104,8 @@ module Mongo
107
104
  # https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-monitoring.md#streamable-hello-or-legacy-hello-command
108
105
  # says that topologyVersion should only be updated from successful
109
106
  # hello responses.
110
- if new_description.topology_version
111
- @topology_version = new_description.topology_version
112
- end
113
- rescue IOError, SocketError, SystemCallError, Mongo::Error => exc
107
+ @topology_version = new_description.topology_version if new_description.topology_version
108
+ rescue IOError, SocketError, SystemCallError, Mongo::Error => e
114
109
  stop_requested = @lock.synchronize { @stop_requested }
115
110
  if stop_requested
116
111
  # Ignore the exception, see RUBY-2771.
@@ -118,11 +113,10 @@ module Mongo
118
113
  end
119
114
 
120
115
  msg = "Error running awaited hello on #{server.address}"
121
- Utils.warn_bg_exception(msg, exc,
122
- logger: options[:logger],
123
- log_prefix: options[:log_prefix],
124
- bg_error_backtrace: options[:bg_error_backtrace],
125
- )
116
+ Utils.warn_bg_exception(msg, e,
117
+ logger: options[:logger],
118
+ log_prefix: options[:log_prefix],
119
+ bg_error_backtrace: options[:bg_error_backtrace])
126
120
 
127
121
  # If a request failed on a connection, stop push monitoring.
128
122
  # In case the server is dead we don't want to have two connections
@@ -153,9 +147,7 @@ module Mongo
153
147
  end
154
148
 
155
149
  resp_msg = begin
156
- unless @server_pushing
157
- write_check_command
158
- end
150
+ write_check_command unless @server_pushing
159
151
  read_response
160
152
  rescue Mongo::Error
161
153
  @lock.synchronize do
@@ -173,10 +165,10 @@ module Mongo
173
165
  def write_check_command
174
166
  document = @check_document.merge(
175
167
  topologyVersion: topology_version.to_doc,
176
- maxAwaitTimeMS: monitor.heartbeat_interval * 1000,
168
+ maxAwaitTimeMS: monitor.heartbeat_interval * 1000
177
169
  )
178
170
  command = Protocol::Msg.new(
179
- [:exhaust_allowed], {}, document.merge({'$db' => Database::ADMIN})
171
+ [ :exhaust_allowed ], {}, document.merge({ '$db' => Database::ADMIN })
180
172
  )
181
173
  @lock.synchronize { @connection }.write_bytes(command.serialize.to_s)
182
174
  end
@@ -184,14 +176,15 @@ module Mongo
184
176
  def read_response
185
177
  if timeout = options[:connect_timeout]
186
178
  if timeout < 0
187
- raise Mongo::SocketTimeoutError, "Requested to read with a negative timeout: #{}"
179
+ raise Mongo::SocketTimeoutError, 'Requested to read with a negative timeout: '
188
180
  elsif timeout > 0
189
181
  timeout += options[:heartbeat_frequency] || Monitor::DEFAULT_HEARTBEAT_INTERVAL
190
182
  end
191
183
  end
192
184
  # We set the timeout twice: once passed into read_socket which applies
193
185
  # to each individual read operation, and again around the entire read.
194
- Timeout.timeout(timeout, Error::SocketTimeoutError, "Failed to read an awaited hello response in #{timeout} seconds") do
186
+ Timeout.timeout(timeout, Error::SocketTimeoutError,
187
+ "Failed to read an awaited hello response in #{timeout} seconds") do
195
188
  @lock.synchronize { @connection }.read_response(socket_timeout: timeout)
196
189
  end
197
190
  end
@@ -199,7 +192,6 @@ module Mongo
199
192
  def to_s
200
193
  "#<#{self.class.name}:#{object_id} #{server.address}>"
201
194
  end
202
-
203
195
  end
204
196
  end
205
197
  end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2018-2020 MongoDB Inc.
5
4
 
@@ -19,10 +18,9 @@ module Mongo
19
18
  class Server
20
19
  # @api private
21
20
  class RoundTripTimeCalculator
22
-
23
21
  # The weighting factor (alpha) for calculating the average moving
24
22
  # round trip time.
25
- RTT_WEIGHT_FACTOR = 0.2.freeze
23
+ RTT_WEIGHT_FACTOR = 0.2
26
24
  private_constant :RTT_WEIGHT_FACTOR
27
25
 
28
26
  RTT_SAMPLES_FOR_MINIMUM = 10
@@ -39,9 +37,7 @@ module Mongo
39
37
  @rtts = []
40
38
  end
41
39
 
42
- attr_reader :last_round_trip_time
43
- attr_reader :average_round_trip_time
44
- attr_reader :minimum_round_trip_time
40
+ attr_reader :last_round_trip_time, :average_round_trip_time, :minimum_round_trip_time
45
41
 
46
42
  def measure
47
43
  start = Utils.monotonic_time
@@ -51,7 +47,7 @@ module Mongo
51
47
  # If we encountered a network error, the round-trip is not
52
48
  # complete and thus RTT for it does not make sense.
53
49
  raise
54
- rescue Error, Error::AuthError => exc
50
+ rescue Error, Error::AuthError => e
55
51
  # For other errors, RTT is valid.
56
52
  end
57
53
  last_rtt = Utils.monotonic_time - start
@@ -59,7 +55,7 @@ module Mongo
59
55
  # If hello fails, we need to return the last round trip time
60
56
  # because it is used in the heartbeat failed SDAM event,
61
57
  # but we must not update the round trip time recorded in the server.
62
- unless exc
58
+ unless e
63
59
  @last_round_trip_time = last_rtt
64
60
  @lock.synchronize do
65
61
  update_average_round_trip_time
@@ -67,19 +63,17 @@ module Mongo
67
63
  end
68
64
  end
69
65
 
70
- if exc
71
- raise exc
72
- else
73
- rv
74
- end
66
+ raise e if e
67
+
68
+ rv
75
69
  end
76
70
 
77
71
  def update_average_round_trip_time
78
72
  @average_round_trip_time = if average_round_trip_time
79
- RTT_WEIGHT_FACTOR * last_round_trip_time + (1 - RTT_WEIGHT_FACTOR) * average_round_trip_time
80
- else
81
- last_round_trip_time
82
- end
73
+ (RTT_WEIGHT_FACTOR * last_round_trip_time) + ((1 - RTT_WEIGHT_FACTOR) * average_round_trip_time)
74
+ else
75
+ last_round_trip_time
76
+ end
83
77
  end
84
78
 
85
79
  def update_minimum_round_trip_time