mongo 2.22.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 (467) 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 +267 -276
  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 +152 -184
  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/behavior.rb +1 -1
  71. data/lib/mongo/collection/view/aggregation.rb +10 -12
  72. data/lib/mongo/collection/view/builder/aggregation.rb +6 -9
  73. data/lib/mongo/collection/view/builder/map_reduce.rb +18 -17
  74. data/lib/mongo/collection/view/builder.rb +0 -1
  75. data/lib/mongo/collection/view/change_stream/retryable.rb +3 -8
  76. data/lib/mongo/collection/view/change_stream.rb +59 -58
  77. data/lib/mongo/collection/view/explainable.rb +11 -20
  78. data/lib/mongo/collection/view/immutable.rb +1 -3
  79. data/lib/mongo/collection/view/iterable.rb +44 -35
  80. data/lib/mongo/collection/view/map_reduce.rb +20 -25
  81. data/lib/mongo/collection/view/readable.rb +96 -94
  82. data/lib/mongo/collection/view/writable.rb +104 -114
  83. data/lib/mongo/collection/view.rb +11 -8
  84. data/lib/mongo/collection.rb +103 -106
  85. data/lib/mongo/condition_variable.rb +4 -4
  86. data/lib/mongo/config/options.rb +0 -3
  87. data/lib/mongo/config/validators/option.rb +3 -5
  88. data/lib/mongo/config.rb +6 -4
  89. data/lib/mongo/crypt/auto_decryption_context.rb +9 -3
  90. data/lib/mongo/crypt/auto_encrypter.rb +34 -43
  91. data/lib/mongo/crypt/auto_encryption_context.rb +0 -3
  92. data/lib/mongo/crypt/binary.rb +5 -9
  93. data/lib/mongo/crypt/binding.rb +150 -156
  94. data/lib/mongo/crypt/context.rb +20 -17
  95. data/lib/mongo/crypt/data_key_context.rb +2 -7
  96. data/lib/mongo/crypt/encryption_io.rb +29 -39
  97. data/lib/mongo/crypt/explicit_decryption_context.rb +9 -3
  98. data/lib/mongo/crypt/explicit_encrypter.rb +1 -1
  99. data/lib/mongo/crypt/explicit_encryption_context.rb +19 -30
  100. data/lib/mongo/crypt/explicit_encryption_expression_context.rb +0 -2
  101. data/lib/mongo/crypt/handle.rb +42 -48
  102. data/lib/mongo/crypt/hooks.rb +12 -15
  103. data/lib/mongo/crypt/kms/aws/credentials.rb +12 -16
  104. data/lib/mongo/crypt/kms/aws/master_document.rb +6 -9
  105. data/lib/mongo/crypt/kms/aws.rb +0 -2
  106. data/lib/mongo/crypt/kms/azure/credentials_retriever.rb +2 -7
  107. data/lib/mongo/crypt/kms/azure/master_document.rb +15 -19
  108. data/lib/mongo/crypt/kms/azure.rb +0 -1
  109. data/lib/mongo/crypt/kms/credentials.rb +13 -27
  110. data/lib/mongo/crypt/kms/gcp/credentials.rb +12 -14
  111. data/lib/mongo/crypt/kms/gcp/credentials_retriever.rb +7 -9
  112. data/lib/mongo/crypt/kms/gcp/master_document.rb +12 -16
  113. data/lib/mongo/crypt/kms/gcp.rb +0 -2
  114. data/lib/mongo/crypt/kms/kmip/credentials.rb +7 -8
  115. data/lib/mongo/crypt/kms/kmip/master_document.rb +3 -5
  116. data/lib/mongo/crypt/kms/kmip.rb +0 -1
  117. data/lib/mongo/crypt/kms/local/credentials.rb +7 -8
  118. data/lib/mongo/crypt/kms/local/master_document.rb +2 -6
  119. data/lib/mongo/crypt/kms/local.rb +0 -1
  120. data/lib/mongo/crypt/kms/master_key_document.rb +11 -15
  121. data/lib/mongo/crypt/kms.rb +14 -16
  122. data/lib/mongo/crypt/kms_context.rb +0 -2
  123. data/lib/mongo/crypt/rewrap_many_data_key_context.rb +2 -7
  124. data/lib/mongo/crypt/rewrap_many_data_key_result.rb +2 -4
  125. data/lib/mongo/crypt/status.rb +12 -14
  126. data/lib/mongo/crypt.rb +0 -1
  127. data/lib/mongo/csot_timeout_holder.rb +3 -2
  128. data/lib/mongo/cursor/kill_spec.rb +7 -10
  129. data/lib/mongo/cursor.rb +74 -64
  130. data/lib/mongo/cursor_host.rb +8 -10
  131. data/lib/mongo/database/view.rb +23 -39
  132. data/lib/mongo/database.rb +68 -65
  133. data/lib/mongo/dbref.rb +0 -1
  134. data/lib/mongo/deprecations.rb +98 -0
  135. data/lib/mongo/distinguishing_semaphore.rb +0 -1
  136. data/lib/mongo/error/auth_error.rb +0 -2
  137. data/lib/mongo/error/bad_load_balancer_target.rb +0 -2
  138. data/lib/mongo/error/bulk_write_error.rb +7 -10
  139. data/lib/mongo/error/change_stream_resumable.rb +0 -2
  140. data/lib/mongo/error/client_closed.rb +0 -2
  141. data/lib/mongo/error/closed_stream.rb +1 -4
  142. data/lib/mongo/error/connection_check_out_timeout.rb +3 -6
  143. data/lib/mongo/error/connection_perished.rb +0 -2
  144. data/lib/mongo/error/connection_unavailable.rb +0 -2
  145. data/lib/mongo/error/credential_check_error.rb +0 -2
  146. data/lib/mongo/error/crypt_error.rb +0 -2
  147. data/lib/mongo/error/extra_file_chunk.rb +1 -4
  148. data/lib/mongo/error/failed_string_prep_validation.rb +5 -6
  149. data/lib/mongo/error/file_not_found.rb +0 -3
  150. data/lib/mongo/error/handshake_error.rb +0 -2
  151. data/lib/mongo/error/insufficient_iteration_count.rb +1 -4
  152. data/lib/mongo/error/internal_driver_error.rb +0 -2
  153. data/lib/mongo/error/invalid_address.rb +0 -2
  154. data/lib/mongo/error/invalid_application_name.rb +0 -3
  155. data/lib/mongo/error/invalid_bulk_operation.rb +1 -4
  156. data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -4
  157. data/lib/mongo/error/invalid_collection_name.rb +1 -4
  158. data/lib/mongo/error/invalid_config_option.rb +0 -3
  159. data/lib/mongo/error/invalid_cursor_operation.rb +0 -2
  160. data/lib/mongo/error/invalid_database_name.rb +1 -4
  161. data/lib/mongo/error/invalid_document.rb +1 -4
  162. data/lib/mongo/error/invalid_file.rb +0 -3
  163. data/lib/mongo/error/invalid_file_revision.rb +0 -3
  164. data/lib/mongo/error/invalid_min_pool_size.rb +0 -3
  165. data/lib/mongo/error/invalid_nonce.rb +0 -3
  166. data/lib/mongo/error/invalid_read_concern.rb +2 -4
  167. data/lib/mongo/error/invalid_read_option.rb +0 -3
  168. data/lib/mongo/error/invalid_replacement_document.rb +2 -5
  169. data/lib/mongo/error/invalid_server_auth_host.rb +0 -2
  170. data/lib/mongo/error/invalid_server_auth_response.rb +0 -2
  171. data/lib/mongo/error/invalid_server_preference.rb +7 -16
  172. data/lib/mongo/error/invalid_session.rb +1 -4
  173. data/lib/mongo/error/invalid_signature.rb +0 -3
  174. data/lib/mongo/error/invalid_transaction_operation.rb +5 -8
  175. data/lib/mongo/error/invalid_txt_record.rb +0 -2
  176. data/lib/mongo/error/invalid_update_document.rb +2 -5
  177. data/lib/mongo/error/invalid_uri.rb +1 -4
  178. data/lib/mongo/error/invalid_write_concern.rb +2 -5
  179. data/lib/mongo/error/kms_error.rb +0 -2
  180. data/lib/mongo/error/labelable.rb +0 -3
  181. data/lib/mongo/error/lint_error.rb +0 -2
  182. data/lib/mongo/error/max_bson_size.rb +8 -11
  183. data/lib/mongo/error/max_message_size.rb +2 -5
  184. data/lib/mongo/error/mismatched_domain.rb +0 -2
  185. data/lib/mongo/error/missing_connection.rb +0 -2
  186. data/lib/mongo/error/missing_file_chunk.rb +0 -3
  187. data/lib/mongo/error/missing_password.rb +0 -2
  188. data/lib/mongo/error/missing_resume_token.rb +1 -4
  189. data/lib/mongo/error/missing_scram_server_signature.rb +2 -4
  190. data/lib/mongo/error/missing_service_id.rb +0 -2
  191. data/lib/mongo/error/mongocryptd_spawn_error.rb +0 -2
  192. data/lib/mongo/error/multi_index_drop.rb +0 -3
  193. data/lib/mongo/error/need_primary_server.rb +0 -2
  194. data/lib/mongo/error/no_server_available.rb +3 -8
  195. data/lib/mongo/error/no_service_connection_available.rb +1 -3
  196. data/lib/mongo/error/no_srv_records.rb +0 -2
  197. data/lib/mongo/error/notable.rb +8 -16
  198. data/lib/mongo/error/operation_failure.rb +22 -35
  199. data/lib/mongo/error/parser.rb +33 -75
  200. data/lib/mongo/error/pool_cleared_error.rb +1 -3
  201. data/lib/mongo/error/pool_closed_error.rb +0 -3
  202. data/lib/mongo/error/pool_error.rb +0 -3
  203. data/lib/mongo/error/pool_paused_error.rb +0 -2
  204. data/lib/mongo/error/raise_original_error.rb +1 -3
  205. data/lib/mongo/error/read_write_retryable.rb +14 -17
  206. data/lib/mongo/error/sdam_error_detection.rb +3 -5
  207. data/lib/mongo/error/server_api_conflict.rb +0 -2
  208. data/lib/mongo/error/server_certificate_revoked.rb +0 -2
  209. data/lib/mongo/error/server_not_usable.rb +0 -2
  210. data/lib/mongo/error/session_ended.rb +1 -3
  211. data/lib/mongo/error/session_not_materialized.rb +1 -3
  212. data/lib/mongo/error/sessions_not_supported.rb +1 -4
  213. data/lib/mongo/error/snapshot_session_invalid_server_version.rb +1 -4
  214. data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +1 -4
  215. data/lib/mongo/error/socket_error.rb +0 -2
  216. data/lib/mongo/error/socket_timeout_error.rb +0 -2
  217. data/lib/mongo/error/transactions_not_supported.rb +3 -6
  218. data/lib/mongo/error/unchangeable_collection_option.rb +1 -4
  219. data/lib/mongo/error/unexpected_chunk_length.rb +0 -3
  220. data/lib/mongo/error/unexpected_response.rb +1 -4
  221. data/lib/mongo/error/unknown_payload_type.rb +0 -3
  222. data/lib/mongo/error/unmet_dependency.rb +0 -2
  223. data/lib/mongo/error/unsupported_array_filters.rb +3 -24
  224. data/lib/mongo/error/unsupported_collation.rb +3 -24
  225. data/lib/mongo/error/unsupported_features.rb +0 -2
  226. data/lib/mongo/error/unsupported_message_type.rb +0 -2
  227. data/lib/mongo/error/unsupported_option.rb +19 -21
  228. data/lib/mongo/error/write_retryable.rb +0 -2
  229. data/lib/mongo/error.rb +10 -24
  230. data/lib/mongo/event/base.rb +0 -2
  231. data/lib/mongo/event/listeners.rb +0 -3
  232. data/lib/mongo/event/publisher.rb +0 -3
  233. data/lib/mongo/event/subscriber.rb +0 -4
  234. data/lib/mongo/event.rb +4 -6
  235. data/lib/mongo/grid/file/chunk.rb +7 -10
  236. data/lib/mongo/grid/file/info.rb +20 -24
  237. data/lib/mongo/grid/file.rb +7 -8
  238. data/lib/mongo/grid/fs_bucket.rb +40 -48
  239. data/lib/mongo/grid/stream/read.rb +25 -35
  240. data/lib/mongo/grid/stream/write.rb +17 -22
  241. data/lib/mongo/grid/stream.rb +2 -4
  242. data/lib/mongo/grid.rb +0 -1
  243. data/lib/mongo/id.rb +0 -1
  244. data/lib/mongo/index/view.rb +68 -58
  245. data/lib/mongo/index.rb +7 -10
  246. data/lib/mongo/lint.rb +31 -37
  247. data/lib/mongo/loggable.rb +5 -8
  248. data/lib/mongo/logger.rb +1 -7
  249. data/lib/mongo/monitoring/cmap_log_subscriber.rb +0 -2
  250. data/lib/mongo/monitoring/command_log_subscriber.rb +25 -33
  251. data/lib/mongo/monitoring/event/cmap/base.rb +0 -2
  252. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -4
  253. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +0 -3
  254. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +1 -4
  255. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +2 -5
  256. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +1 -4
  257. data/lib/mongo/monitoring/event/cmap/connection_created.rb +1 -4
  258. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +1 -4
  259. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +0 -3
  260. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +1 -4
  261. data/lib/mongo/monitoring/event/cmap/pool_created.rb +1 -4
  262. data/lib/mongo/monitoring/event/cmap/pool_ready.rb +1 -4
  263. data/lib/mongo/monitoring/event/cmap.rb +0 -1
  264. data/lib/mongo/monitoring/event/command_failed.rb +5 -9
  265. data/lib/mongo/monitoring/event/command_started.rb +8 -12
  266. data/lib/mongo/monitoring/event/command_succeeded.rb +7 -15
  267. data/lib/mongo/monitoring/event/secure.rb +15 -20
  268. data/lib/mongo/monitoring/event/server_closed.rb +1 -4
  269. data/lib/mongo/monitoring/event/server_description_changed.rb +4 -8
  270. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +5 -10
  271. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +1 -4
  272. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +3 -8
  273. data/lib/mongo/monitoring/event/server_opening.rb +1 -4
  274. data/lib/mongo/monitoring/event/topology_changed.rb +2 -5
  275. data/lib/mongo/monitoring/event/topology_closed.rb +1 -4
  276. data/lib/mongo/monitoring/event/topology_opening.rb +1 -4
  277. data/lib/mongo/monitoring/event.rb +0 -1
  278. data/lib/mongo/monitoring/publishable.rb +20 -30
  279. data/lib/mongo/monitoring/sdam_log_subscriber.rb +0 -2
  280. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +0 -3
  281. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +0 -3
  282. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +0 -3
  283. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +5 -8
  284. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +0 -3
  285. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +0 -3
  286. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +1 -3
  287. data/lib/mongo/monitoring.rb +38 -39
  288. data/lib/mongo/operation/aggregate/op_msg.rb +0 -2
  289. data/lib/mongo/operation/aggregate/result.rb +3 -6
  290. data/lib/mongo/operation/aggregate.rb +0 -2
  291. data/lib/mongo/operation/collections_info/result.rb +0 -3
  292. data/lib/mongo/operation/collections_info.rb +0 -2
  293. data/lib/mongo/operation/command/op_msg.rb +1 -4
  294. data/lib/mongo/operation/command.rb +0 -2
  295. data/lib/mongo/operation/context.rb +13 -16
  296. data/lib/mongo/operation/count/op_msg.rb +2 -4
  297. data/lib/mongo/operation/count.rb +0 -2
  298. data/lib/mongo/operation/create/op_msg.rb +2 -5
  299. data/lib/mongo/operation/create.rb +4 -2
  300. data/lib/mongo/operation/create_index/op_msg.rb +3 -7
  301. data/lib/mongo/operation/create_index.rb +0 -2
  302. data/lib/mongo/operation/create_user/op_msg.rb +2 -4
  303. data/lib/mongo/operation/create_user.rb +0 -2
  304. data/lib/mongo/operation/delete/bulk_result.rb +2 -3
  305. data/lib/mongo/operation/delete/op_msg.rb +3 -10
  306. data/lib/mongo/operation/delete/result.rb +0 -3
  307. data/lib/mongo/operation/delete.rb +1 -5
  308. data/lib/mongo/operation/distinct/op_msg.rb +2 -5
  309. data/lib/mongo/operation/distinct.rb +0 -2
  310. data/lib/mongo/operation/drop/op_msg.rb +0 -2
  311. data/lib/mongo/operation/drop.rb +0 -2
  312. data/lib/mongo/operation/drop_database/op_msg.rb +0 -2
  313. data/lib/mongo/operation/drop_database.rb +0 -2
  314. data/lib/mongo/operation/drop_index/op_msg.rb +4 -6
  315. data/lib/mongo/operation/drop_index.rb +0 -2
  316. data/lib/mongo/operation/explain/op_msg.rb +0 -2
  317. data/lib/mongo/operation/explain/result.rb +0 -3
  318. data/lib/mongo/operation/explain.rb +0 -2
  319. data/lib/mongo/operation/find/builder/command.rb +4 -12
  320. data/lib/mongo/operation/find/builder/flags.rb +9 -15
  321. data/lib/mongo/operation/find/builder/modifiers.rb +1 -4
  322. data/lib/mongo/operation/find/builder.rb +0 -1
  323. data/lib/mongo/operation/find/op_msg.rb +4 -12
  324. data/lib/mongo/operation/find/result.rb +0 -3
  325. data/lib/mongo/operation/find.rb +0 -2
  326. data/lib/mongo/operation/get_more/command_builder.rb +1 -6
  327. data/lib/mongo/operation/get_more/op_msg.rb +10 -4
  328. data/lib/mongo/operation/get_more/result.rb +0 -3
  329. data/lib/mongo/operation/get_more.rb +0 -2
  330. data/lib/mongo/operation/indexes/op_msg.rb +0 -2
  331. data/lib/mongo/operation/indexes/result.rb +1 -5
  332. data/lib/mongo/operation/indexes.rb +0 -2
  333. data/lib/mongo/operation/insert/bulk_result.rb +2 -6
  334. data/lib/mongo/operation/insert/op_msg.rb +7 -6
  335. data/lib/mongo/operation/insert/result.rb +0 -3
  336. data/lib/mongo/operation/insert.rb +2 -5
  337. data/lib/mongo/operation/kill_cursors/command_builder.rb +0 -3
  338. data/lib/mongo/operation/kill_cursors/op_msg.rb +1 -3
  339. data/lib/mongo/operation/kill_cursors.rb +0 -2
  340. data/lib/mongo/operation/list_collections/op_msg.rb +4 -6
  341. data/lib/mongo/operation/list_collections/result.rb +1 -4
  342. data/lib/mongo/operation/list_collections.rb +0 -2
  343. data/lib/mongo/operation/map_reduce/op_msg.rb +0 -2
  344. data/lib/mongo/operation/map_reduce/result.rb +3 -6
  345. data/lib/mongo/operation/map_reduce.rb +0 -2
  346. data/lib/mongo/operation/op_msg_base.rb +0 -1
  347. data/lib/mongo/operation/parallel_scan/op_msg.rb +4 -5
  348. data/lib/mongo/operation/parallel_scan/result.rb +2 -5
  349. data/lib/mongo/operation/parallel_scan.rb +0 -2
  350. data/lib/mongo/operation/remove_user/op_msg.rb +2 -4
  351. data/lib/mongo/operation/remove_user.rb +0 -2
  352. data/lib/mongo/operation/result.rb +38 -48
  353. data/lib/mongo/operation/shared/bypass_document_validation.rb +3 -7
  354. data/lib/mongo/operation/shared/causal_consistency_supported.rb +0 -3
  355. data/lib/mongo/operation/shared/executable.rb +29 -31
  356. data/lib/mongo/operation/shared/executable_no_validate.rb +0 -3
  357. data/lib/mongo/operation/shared/executable_transaction_label.rb +0 -2
  358. data/lib/mongo/operation/shared/idable.rb +3 -6
  359. data/lib/mongo/operation/shared/limited.rb +0 -3
  360. data/lib/mongo/operation/shared/object_id_generator.rb +0 -3
  361. data/lib/mongo/operation/shared/op_msg_executable.rb +0 -2
  362. data/lib/mongo/operation/shared/polymorphic_lookup.rb +0 -2
  363. data/lib/mongo/operation/shared/polymorphic_result.rb +2 -4
  364. data/lib/mongo/operation/shared/read_preference_supported.rb +10 -15
  365. data/lib/mongo/operation/shared/response_handling.rb +13 -26
  366. data/lib/mongo/operation/shared/result/aggregatable.rb +12 -13
  367. data/lib/mongo/operation/shared/sessions_supported.rb +87 -99
  368. data/lib/mongo/operation/shared/specifiable.rb +37 -59
  369. data/lib/mongo/operation/shared/write.rb +12 -17
  370. data/lib/mongo/operation/shared/write_concern_supported.rb +4 -7
  371. data/lib/mongo/operation/update/bulk_result.rb +13 -17
  372. data/lib/mongo/operation/update/op_msg.rb +2 -5
  373. data/lib/mongo/operation/update/result.rb +5 -5
  374. data/lib/mongo/operation/update.rb +1 -5
  375. data/lib/mongo/operation/update_user/op_msg.rb +2 -4
  376. data/lib/mongo/operation/update_user.rb +0 -2
  377. data/lib/mongo/operation/users_info/op_msg.rb +2 -4
  378. data/lib/mongo/operation/users_info/result.rb +1 -4
  379. data/lib/mongo/operation/users_info.rb +0 -2
  380. data/lib/mongo/operation/write_command/op_msg.rb +2 -10
  381. data/lib/mongo/operation/write_command.rb +0 -2
  382. data/lib/mongo/operation.rb +9 -14
  383. data/lib/mongo/options/mapper.rb +8 -15
  384. data/lib/mongo/options/redacted.rb +7 -9
  385. data/lib/mongo/options.rb +0 -1
  386. data/lib/mongo/protocol/bit_vector.rb +3 -5
  387. data/lib/mongo/protocol/caching_hash.rb +2 -7
  388. data/lib/mongo/protocol/compressed.rb +5 -10
  389. data/lib/mongo/protocol/get_more.rb +2 -8
  390. data/lib/mongo/protocol/kill_cursors.rb +2 -8
  391. data/lib/mongo/protocol/message.rb +103 -105
  392. data/lib/mongo/protocol/msg.rb +48 -63
  393. data/lib/mongo/protocol/query.rb +32 -41
  394. data/lib/mongo/protocol/registry.rb +2 -5
  395. data/lib/mongo/protocol/reply.rb +10 -16
  396. data/lib/mongo/protocol/serializers.rb +41 -59
  397. data/lib/mongo/protocol.rb +0 -1
  398. data/lib/mongo/query_cache.rb +7 -15
  399. data/lib/mongo/retryable/backpressure.rb +31 -0
  400. data/lib/mongo/retryable/base_worker.rb +39 -13
  401. data/lib/mongo/retryable/read_worker.rb +77 -21
  402. data/lib/mongo/retryable/retry_policy.rb +59 -0
  403. data/lib/mongo/retryable/write_worker.rb +155 -56
  404. data/lib/mongo/retryable.rb +70 -9
  405. data/lib/mongo/search_index/view.rb +30 -10
  406. data/lib/mongo/semaphore.rb +0 -1
  407. data/lib/mongo/server/app_metadata/environment.rb +3 -3
  408. data/lib/mongo/server/app_metadata/platform.rb +17 -4
  409. data/lib/mongo/server/app_metadata.rb +4 -5
  410. data/lib/mongo/server/connection.rb +79 -61
  411. data/lib/mongo/server/connection_base.rb +43 -53
  412. data/lib/mongo/server/connection_common.rb +41 -64
  413. data/lib/mongo/server/connection_pool/generation_manager.rb +6 -11
  414. data/lib/mongo/server/connection_pool/populator.rb +1 -4
  415. data/lib/mongo/server/connection_pool.rb +195 -167
  416. data/lib/mongo/server/description/features.rb +51 -59
  417. data/lib/mongo/server/description/load_balancer.rb +0 -2
  418. data/lib/mongo/server/description.rb +117 -138
  419. data/lib/mongo/server/monitor/app_metadata.rb +3 -4
  420. data/lib/mongo/server/monitor/connection.rb +28 -35
  421. data/lib/mongo/server/monitor.rb +65 -60
  422. data/lib/mongo/server/pending_connection.rb +70 -71
  423. data/lib/mongo/server/push_monitor/connection.rb +0 -3
  424. data/lib/mongo/server/push_monitor.rb +21 -29
  425. data/lib/mongo/server/round_trip_time_calculator.rb +11 -17
  426. data/lib/mongo/server.rb +62 -94
  427. data/lib/mongo/server_selector/base.rb +133 -157
  428. data/lib/mongo/server_selector/nearest.rb +2 -5
  429. data/lib/mongo/server_selector/primary.rb +1 -5
  430. data/lib/mongo/server_selector/primary_preferred.rb +2 -6
  431. data/lib/mongo/server_selector/secondary.rb +2 -6
  432. data/lib/mongo/server_selector/secondary_preferred.rb +1 -5
  433. data/lib/mongo/server_selector.rb +3 -4
  434. data/lib/mongo/session/server_session.rb +6 -7
  435. data/lib/mongo/session/session_pool.rb +20 -34
  436. data/lib/mongo/session.rb +334 -199
  437. data/lib/mongo/socket/ocsp_cache.rb +8 -13
  438. data/lib/mongo/socket/ocsp_verifier.rb +69 -70
  439. data/lib/mongo/socket/ssl.rb +44 -43
  440. data/lib/mongo/socket/tcp.rb +5 -8
  441. data/lib/mongo/socket/unix.rb +0 -4
  442. data/lib/mongo/socket.rb +80 -102
  443. data/lib/mongo/srv/monitor.rb +10 -11
  444. data/lib/mongo/srv/resolver.rb +15 -24
  445. data/lib/mongo/srv/result.rb +25 -21
  446. data/lib/mongo/srv.rb +0 -1
  447. data/lib/mongo/timeout.rb +4 -11
  448. data/lib/mongo/topology_version.rb +8 -13
  449. data/lib/mongo/tracing/open_telemetry/command_tracer.rb +320 -0
  450. data/lib/mongo/tracing/open_telemetry/operation_tracer.rb +227 -0
  451. data/lib/mongo/tracing/open_telemetry/tracer.rb +236 -0
  452. data/lib/mongo/{error/server_api_not_supported.rb → tracing/open_telemetry.rb} +10 -10
  453. data/lib/mongo/tracing.rb +42 -0
  454. data/lib/mongo/uri/options_mapper.rb +135 -126
  455. data/lib/mongo/uri/srv_protocol.rb +34 -42
  456. data/lib/mongo/uri.rb +95 -139
  457. data/lib/mongo/utils.rb +5 -12
  458. data/lib/mongo/version.rb +1 -1
  459. data/lib/mongo/write_concern/acknowledged.rb +0 -2
  460. data/lib/mongo/write_concern/base.rb +6 -6
  461. data/lib/mongo/write_concern/unacknowledged.rb +0 -2
  462. data/lib/mongo/write_concern.rb +14 -15
  463. data/lib/mongo.rb +4 -3
  464. data/mongo.gemspec +17 -17
  465. metadata +11 -5
  466. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +0 -32
  467. data/lib/mongo/operation/shared/validatable.rb +0 -87
data/lib/mongo/cluster.rb CHANGED
@@ -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
  #
@@ -21,7 +20,6 @@ require 'mongo/cluster/reapers/cursor_reaper'
21
20
  require 'mongo/cluster/periodic_executor'
22
21
 
23
22
  module Mongo
24
-
25
23
  # Represents a group of servers on the server side, either as a
26
24
  # single server, a replica set, or a single or multiple mongos.
27
25
  #
@@ -58,7 +56,7 @@ module Mongo
58
56
  #
59
57
  # @since 2.5.0
60
58
  # @deprecated
61
- CLUSTER_TIME = 'clusterTime'.freeze
59
+ CLUSTER_TIME = 'clusterTime'
62
60
 
63
61
  # Instantiate the new cluster.
64
62
  #
@@ -118,14 +116,11 @@ module Mongo
118
116
  #
119
117
  # @since 2.0.0
120
118
  def initialize(seeds, monitoring, options = Options::Redacted.new)
121
- if seeds.nil?
122
- raise ArgumentError, 'Seeds cannot be nil'
123
- end
119
+ raise ArgumentError, 'Seeds cannot be nil' if seeds.nil?
124
120
 
125
121
  options = options.dup
126
- if options[:monitoring_io] == false && !options.key?(:cleanup)
127
- options[:cleanup] = false
128
- end
122
+ options[:cleanup] = false if options[:monitoring_io] == false && !options.key?(:cleanup)
123
+ @tracer = options.delete(:tracer)
129
124
  @options = options.freeze
130
125
 
131
126
  # @update_lock covers @servers, @connecting, @connected, @topology and
@@ -147,7 +142,7 @@ module Mongo
147
142
  @server_selection_semaphore = Semaphore.new
148
143
  @topology = Topology.initial(self, monitoring, options)
149
144
  # State change lock is similar to the sdam flow lock, but is designed
150
- # to serialize state changes initated by consumers of Cluster
145
+ # to serialize state changes initiated by consumers of Cluster
151
146
  # (e.g. application connecting or disconnecting the cluster), so that
152
147
  # e.g. an application calling disconnect-connect-disconnect rapidly
153
148
  # does not put the cluster into an inconsistent state.
@@ -159,9 +154,7 @@ module Mongo
159
154
  @sdam_flow_lock = Mutex.new
160
155
  @session_pool = Session::SessionPool.new(self)
161
156
 
162
- if seeds.empty? && load_balanced?
163
- raise ArgumentError, 'Load-balanced clusters with no seeds are prohibited'
164
- end
157
+ raise ArgumentError, 'Load-balanced clusters with no seeds are prohibited' if seeds.empty? && load_balanced?
165
158
 
166
159
  # The opening topology is always unknown with no servers.
167
160
  # https://github.com/mongodb/specifications/pull/388
@@ -221,62 +214,59 @@ module Mongo
221
214
  @cursor_reaper = CursorReaper.new(self)
222
215
  @socket_reaper = SocketReaper.new(self)
223
216
  @periodic_executor = PeriodicExecutor.new([
224
- @cursor_reaper, @socket_reaper,
225
- ], options)
217
+ @cursor_reaper, @socket_reaper,
218
+ ], options)
226
219
 
227
220
  @periodic_executor.run!
228
221
  end
229
222
 
230
- unless load_balanced?
231
- # Need to record start time prior to starting monitoring
232
- start_monotime = Utils.monotonic_time
223
+ return if load_balanced?
233
224
 
234
- servers.each do |server|
235
- server.start_monitoring
236
- end
225
+ # Need to record start time prior to starting monitoring
226
+ start_monotime = Utils.monotonic_time
227
+
228
+ servers.each do |server|
229
+ server.start_monitoring
230
+ end
237
231
 
238
- if options[:scan] != false
239
- server_selection_timeout = options[:server_selection_timeout] || ServerSelector::SERVER_SELECTION_TIMEOUT
240
- # The server selection timeout can be very short especially in
241
- # tests, when the client waits for a synchronous scan before
242
- # starting server selection. Limiting the scan to server selection time
243
- # then aborts the scan before it can process even local servers.
244
- # Therefore, allow at least 3 seconds for the scan here.
245
- if server_selection_timeout < 3
246
- server_selection_timeout = 3
232
+ if options[:scan] != false
233
+ server_selection_timeout = options[:server_selection_timeout] || ServerSelector::SERVER_SELECTION_TIMEOUT
234
+ # The server selection timeout can be very short especially in
235
+ # tests, when the client waits for a synchronous scan before
236
+ # starting server selection. Limiting the scan to server selection time
237
+ # then aborts the scan before it can process even local servers.
238
+ # Therefore, allow at least 3 seconds for the scan here.
239
+ server_selection_timeout = 3 if server_selection_timeout < 3
240
+ deadline = start_monotime + server_selection_timeout
241
+ # Wait for the first scan of each server to complete, for
242
+ # backwards compatibility.
243
+ # If any servers are discovered during this SDAM round we are going to
244
+ # wait for these servers to also be queried, and so on, up to the
245
+ # server selection timeout or the 3 second minimum.
246
+ loop do
247
+ # Ensure we do not try to read the servers list while SDAM is running
248
+ servers = @sdam_flow_lock.synchronize do
249
+ servers_list.dup
247
250
  end
248
- deadline = start_monotime + server_selection_timeout
249
- # Wait for the first scan of each server to complete, for
250
- # backwards compatibility.
251
- # If any servers are discovered during this SDAM round we are going to
252
- # wait for these servers to also be queried, and so on, up to the
253
- # server selection timeout or the 3 second minimum.
254
- loop do
255
- # Ensure we do not try to read the servers list while SDAM is running
256
- servers = @sdam_flow_lock.synchronize do
257
- servers_list.dup
258
- end
259
- if servers.all? { |server| server.last_scan_monotime && server.last_scan_monotime >= start_monotime }
260
- break
261
- end
262
- if (time_remaining = deadline - Utils.monotonic_time) <= 0
263
- break
264
- end
265
- log_debug("Waiting for up to #{'%.2f' % time_remaining} seconds for servers to be scanned: #{summary}")
266
- # Since the semaphore may have been signaled between us checking
267
- # the servers list above and the wait call below, we should not
268
- # wait for the full remaining time - wait for up to 0.5 second, then
269
- # recheck the state.
270
- begin
271
- server_selection_semaphore.wait([time_remaining, 0.5].min)
272
- rescue ::Timeout::Error
273
- # nothing
274
- end
251
+ break if servers.all? { |server| server.last_scan_monotime && server.last_scan_monotime >= start_monotime }
252
+ if (time_remaining = deadline - Utils.monotonic_time) <= 0
253
+ break
275
254
  end
276
- end
277
255
 
278
- start_stop_srv_monitor
256
+ log_debug("Waiting for up to #{'%.2f' % time_remaining} seconds for servers to be scanned: #{summary}")
257
+ # Since the semaphore may have been signaled between us checking
258
+ # the servers list above and the wait call below, we should not
259
+ # wait for the full remaining time - wait for up to 0.5 second, then
260
+ # recheck the state.
261
+ begin
262
+ server_selection_semaphore.wait([ time_remaining, 0.5 ].min)
263
+ rescue ::Timeout::Error
264
+ # nothing
265
+ end
266
+ end
279
267
  end
268
+
269
+ start_stop_srv_monitor
280
270
  end
281
271
 
282
272
  # Create a cluster for the provided client, for use when we don't want the
@@ -298,7 +288,7 @@ module Mongo
298
288
  cluster = Cluster.new(
299
289
  client.cluster.addresses.map(&:to_s),
300
290
  monitoring || Monitoring.new,
301
- client.cluster_options,
291
+ client.cluster_options
302
292
  )
303
293
  client.instance_variable_set(:@cluster, cluster)
304
294
  end
@@ -309,6 +299,8 @@ module Mongo
309
299
  # @return [ Monitoring ] monitoring The monitoring.
310
300
  attr_reader :monitoring
311
301
 
302
+ attr_reader :tracer
303
+
312
304
  # @return [ Object ] The cluster topology.
313
305
  attr_reader :topology
314
306
 
@@ -348,11 +340,11 @@ module Mongo
348
340
  topology.is_a?(Topology::LoadBalanced)
349
341
  end
350
342
 
351
- [:register_cursor, :schedule_kill_cursor, :unregister_cursor].each do |m|
343
+ %i[register_cursor schedule_kill_cursor unregister_cursor].each do |m|
352
344
  define_method(m) do |*args|
353
- if options[:cleanup] != false
354
- @cursor_reaper.send(m, *args)
355
- end
345
+ return unless options[:cleanup] != false
346
+
347
+ @cursor_reaper.send(m, *args)
356
348
  end
357
349
  end
358
350
 
@@ -481,9 +473,9 @@ module Mongo
481
473
  # @api experimental
482
474
  # @since 2.7.0
483
475
  def summary
484
- "#<Cluster " +
485
- "topology=#{topology.summary} "+
486
- "servers=[#{servers_list.map(&:summary).join(',')}]>"
476
+ '#<Cluster ' +
477
+ "topology=#{topology.summary} " +
478
+ "servers=[#{servers_list.map(&:summary).join(',')}]>"
487
479
  end
488
480
 
489
481
  # @api private
@@ -507,26 +499,23 @@ module Mongo
507
499
  # @api private
508
500
  def close
509
501
  @state_change_lock.synchronize do
510
- unless connecting? || connected?
511
- return nil
512
- end
502
+ return nil unless connecting? || connected?
503
+
513
504
  if options[:cleanup] != false
514
505
  session_pool.end_sessions
515
506
  @periodic_executor.stop!
516
507
  end
517
508
  @srv_monitor_lock.synchronize do
518
- if @srv_monitor
519
- @srv_monitor.stop!
520
- end
509
+ @srv_monitor.stop! if @srv_monitor
521
510
  end
522
511
  @servers.each do |server|
523
- if server.connected?
524
- server.close
525
- publish_sdam_event(
526
- Monitoring::SERVER_CLOSED,
527
- Monitoring::Event::ServerClosed.new(server.address, topology)
528
- )
529
- end
512
+ next unless server.connected?
513
+
514
+ server.close
515
+ publish_sdam_event(
516
+ Monitoring::SERVER_CLOSED,
517
+ Monitoring::Event::ServerClosed.new(server.address, topology)
518
+ )
530
519
  end
531
520
  publish_sdam_event(
532
521
  Monitoring::TOPOLOGY_CLOSED,
@@ -560,9 +549,7 @@ module Mongo
560
549
  end
561
550
  @periodic_executor.restart!
562
551
  @srv_monitor_lock.synchronize do
563
- if @srv_monitor
564
- @srv_monitor.run!
565
- end
552
+ @srv_monitor.run! if @srv_monitor
566
553
  end
567
554
  @update_lock.synchronize do
568
555
  @connecting = false
@@ -594,7 +581,7 @@ module Mongo
594
581
  # @return [ true ] Always true.
595
582
  #
596
583
  # @since 2.0.0
597
- def scan!(sync=true)
584
+ def scan!(sync = true)
598
585
  if sync
599
586
  servers_list.each do |server|
600
587
  if server.monitor
@@ -637,16 +624,14 @@ module Mongo
637
624
  # @api private
638
625
  def run_sdam_flow(previous_desc, updated_desc, options = {})
639
626
  if load_balanced?
640
- if updated_desc.config.empty?
641
- unless options[:keep_connection_pool]
642
- servers_list.each do |server|
643
- # TODO should service id be taken out of updated_desc?
644
- # We could also assert that
645
- # options[:service_id] == updated_desc.service_id
646
- err = options[:scan_error]
647
- interrupt = err && (err.is_a?(Error::SocketError) || err.is_a?(Error::SocketTimeoutError))
648
- server.clear_connection_pool(service_id: options[:service_id], interrupt_in_use_connections: interrupt)
649
- end
627
+ if updated_desc.config.empty? && !options[:keep_connection_pool]
628
+ servers_list.each do |server|
629
+ # TODO: should service id be taken out of updated_desc?
630
+ # We could also assert that
631
+ # options[:service_id] == updated_desc.service_id
632
+ err = options[:scan_error]
633
+ interrupt = err && (err.is_a?(Error::SocketError) || err.is_a?(Error::SocketTimeoutError))
634
+ server.clear_connection_pool(service_id: options[:service_id], interrupt_in_use_connections: interrupt)
650
635
  end
651
636
  end
652
637
  return
@@ -654,22 +639,20 @@ module Mongo
654
639
 
655
640
  @sdam_flow_lock.synchronize do
656
641
  flow = SdamFlow.new(self, previous_desc, updated_desc,
657
- awaited: options[:awaited])
642
+ awaited: options[:awaited])
658
643
  flow.server_description_changed
659
644
 
660
645
  # SDAM flow may alter the updated description - grab the final
661
646
  # version for the purposes of broadcasting if a server is available
662
647
  updated_desc = flow.updated_desc
663
648
 
664
- unless options[:keep_connection_pool]
665
- if flow.became_unknown?
666
- servers_list.each do |server|
667
- if server.address == updated_desc.address
668
- err = options[:scan_error]
669
- interrupt = err && (err.is_a?(Error::SocketError) || err.is_a?(Error::SocketTimeoutError))
670
- server.clear_connection_pool(interrupt_in_use_connections: interrupt)
671
- end
672
- end
649
+ if !options[:keep_connection_pool] && flow.became_unknown?
650
+ servers_list.each do |server|
651
+ next unless server.address == updated_desc.address
652
+
653
+ err = options[:scan_error]
654
+ interrupt = err && (err.is_a?(Error::SocketError) || err.is_a?(Error::SocketTimeoutError))
655
+ server.clear_connection_pool(interrupt_in_use_connections: interrupt)
673
656
  end
674
657
  end
675
658
 
@@ -687,9 +670,9 @@ module Mongo
687
670
  # thread got killed the server should have been closed and no client
688
671
  # should be currently waiting for it, thus not signaling the semaphore
689
672
  # shouldn't cause any problems.
690
- unless updated_desc.unknown?
691
- server_selection_semaphore.broadcast
692
- end
673
+ return if updated_desc.unknown?
674
+
675
+ server_selection_semaphore.broadcast
693
676
  end
694
677
 
695
678
  # Sets the list of servers to the addresses in the provided list of address
@@ -711,9 +694,7 @@ module Mongo
711
694
  # If one of the new addresses is not in the current servers list,
712
695
  # add it to the servers list.
713
696
  server_address_strs.each do |address_str|
714
- unless servers_list.any? { |server| server.address.seed == address_str }
715
- add(address_str)
716
- end
697
+ add(address_str) unless servers_list.any? { |server| server.address.seed == address_str }
717
698
  end
718
699
 
719
700
  # If one of the servers' addresses are not in the new address list,
@@ -739,6 +720,7 @@ module Mongo
739
720
  # @since 2.0.0
740
721
  def ==(other)
741
722
  return false unless other.is_a?(Cluster)
723
+
742
724
  addresses == other.addresses && options == other.options
743
725
  end
744
726
 
@@ -785,7 +767,7 @@ module Mongo
785
767
  # @return [ Mongo::Server ] A primary server.
786
768
  #
787
769
  # @since 2.0.0
788
- def next_primary(ping = nil, session = nil, timeout: nil)
770
+ def next_primary(_ping = nil, session = nil, timeout: nil)
789
771
  ServerSelector.primary.select_server(
790
772
  self,
791
773
  nil,
@@ -820,10 +802,10 @@ module Mongo
820
802
  #
821
803
  # @since 2.5.0
822
804
  def update_cluster_time(result)
823
- if cluster_time_doc = result.cluster_time
824
- @cluster_time_lock.synchronize do
825
- advance_cluster_time(cluster_time_doc)
826
- end
805
+ return unless cluster_time_doc = result.cluster_time
806
+
807
+ @cluster_time_lock.synchronize do
808
+ advance_cluster_time(cluster_time_doc)
827
809
  end
828
810
  end
829
811
 
@@ -842,34 +824,32 @@ module Mongo
842
824
  # @return [ Server ] The newly added server, if not present already.
843
825
  #
844
826
  # @since 2.0.0
845
- def add(host, add_options=nil)
827
+ def add(host, add_options = nil)
846
828
  address = Address.new(host, options)
847
- if !addresses.include?(address)
848
- opts = options.merge(monitor: false)
849
- # If we aren't starting the montoring threads, we also don't want to
850
- # start the pool's populator thread.
851
- opts.merge!(populator_io: false) unless options.fetch(:monitoring_io, true)
852
- # Note that in a load-balanced topology, every server must be a
853
- # load balancer (load_balancer: true is specified in the options)
854
- # but this option isn't set here because we are required by the
855
- # specifications to pretent the server started out as an unknown one
856
- # and publish server description change event into the load balancer
857
- # one. The actual correct description for this server will be set
858
- # by the fabricate_lb_sdam_events_and_set_server_type method.
859
- server = Server.new(address, self, @monitoring, event_listeners, opts)
860
- @update_lock.synchronize do
861
- # Need to recheck whether server is present in @servers, because
862
- # the previous check was not under a lock.
863
- # Since we are under the update lock here, we cannot call servers_list.
864
- return if @servers.map(&:address).include?(address)
829
+ return if addresses.include?(address)
830
+
831
+ opts = options.merge(monitor: false)
832
+ # If we aren't starting the monitoring threads, we also don't want to
833
+ # start the pool's populator thread.
834
+ opts.merge!(populator_io: false) unless options.fetch(:monitoring_io, true)
835
+ # Note that in a load-balanced topology, every server must be a
836
+ # load balancer (load_balancer: true is specified in the options)
837
+ # but this option isn't set here because we are required by the
838
+ # specifications to pretend the server started out as an unknown one
839
+ # and publish server description change event into the load balancer
840
+ # one. The actual correct description for this server will be set
841
+ # by the fabricate_lb_sdam_events_and_set_server_type method.
842
+ server = Server.new(address, self, @monitoring, event_listeners, opts)
843
+ @update_lock.synchronize do
844
+ # Need to recheck whether server is present in @servers, because
845
+ # the previous check was not under a lock.
846
+ # Since we are under the update lock here, we cannot call servers_list.
847
+ return if @servers.map(&:address).include?(address)
865
848
 
866
- @servers.push(server)
867
- end
868
- if add_options.nil? || add_options[:monitor] != false
869
- server.start_monitoring
870
- end
871
- server
849
+ @servers.push(server)
872
850
  end
851
+ server.start_monitoring if add_options.nil? || add_options[:monitor] != false
852
+ server
873
853
  end
874
854
 
875
855
  # Remove the server from the cluster for the provided address, if it
@@ -897,9 +877,7 @@ module Mongo
897
877
  @update_lock.synchronize do
898
878
  @servers.delete_if do |server|
899
879
  (server.address == address).tap do |delete|
900
- if delete
901
- removed_servers << server
902
- end
880
+ removed_servers << server if delete
903
881
  end
904
882
  end
905
883
  end
@@ -908,10 +886,10 @@ module Mongo
908
886
  disconnect_server_if_connected(server)
909
887
  end
910
888
  end
911
- if disconnect != false
912
- removed_servers.any?
913
- else
889
+ if disconnect == false
914
890
  removed_servers
891
+ else
892
+ removed_servers.any?
915
893
  end
916
894
  end
917
895
 
@@ -951,14 +929,14 @@ module Mongo
951
929
 
952
930
  # @api private
953
931
  def disconnect_server_if_connected(server)
954
- if server.connected?
955
- server.clear_description
956
- server.disconnect!
957
- publish_sdam_event(
958
- Monitoring::SERVER_CLOSED,
959
- Monitoring::Event::ServerClosed.new(server.address, topology)
960
- )
961
- end
932
+ return unless server.connected?
933
+
934
+ server.clear_description
935
+ server.disconnect!
936
+ publish_sdam_event(
937
+ Monitoring::SERVER_CLOSED,
938
+ Monitoring::Event::ServerClosed.new(server.address, topology)
939
+ )
962
940
  end
963
941
 
964
942
  # Raises Error::SessionsNotAvailable if the deployment that the driver
@@ -986,17 +964,11 @@ module Mongo
986
964
  #
987
965
  # @api private
988
966
  def validate_session_support!(timeout: nil)
989
- if topology.is_a?(Topology::LoadBalanced)
990
- return
991
- end
967
+ return if topology.is_a?(Topology::LoadBalanced)
992
968
 
993
969
  @state_change_lock.synchronize do
994
970
  @sdam_flow_lock.synchronize do
995
- if topology.data_bearing_servers?
996
- unless topology.logical_session_timeout
997
- raise_sessions_not_supported
998
- end
999
- end
971
+ raise_sessions_not_supported if topology.data_bearing_servers? && !topology.logical_session_timeout
1000
972
  end
1001
973
  end
1002
974
 
@@ -1006,9 +978,7 @@ module Mongo
1006
978
  ServerSelector.get(mode: :primary_preferred).select_server(self, timeout: timeout)
1007
979
  @state_change_lock.synchronize do
1008
980
  @sdam_flow_lock.synchronize do
1009
- unless topology.logical_session_timeout
1010
- raise_sessions_not_supported
1011
- end
981
+ raise_sessions_not_supported unless topology.logical_session_timeout
1012
982
  end
1013
983
  end
1014
984
  end
@@ -1026,7 +996,8 @@ module Mongo
1026
996
  @srv_monitor_lock.synchronize do
1027
997
  unless @srv_monitor
1028
998
  monitor_options = Utils.shallow_symbolize_keys(options.merge(
1029
- timeout: options[:connect_timeout] || Server::CONNECT_TIMEOUT))
999
+ timeout: options[:connect_timeout] || Server::CONNECT_TIMEOUT
1000
+ ))
1030
1001
  @srv_monitor = _srv_monitor = Srv::Monitor.new(self, **monitor_options)
1031
1002
  end
1032
1003
  @srv_monitor.run!
@@ -1037,9 +1008,7 @@ module Mongo
1037
1008
  # is discovered, since it's not a sharded cluster, the SRV monitor
1038
1009
  # needs to be stopped.
1039
1010
  @srv_monitor_lock.synchronize do
1040
- if @srv_monitor
1041
- @srv_monitor.stop!
1042
- end
1011
+ @srv_monitor.stop! if @srv_monitor
1043
1012
  end
1044
1013
  end
1045
1014
  end
@@ -1052,10 +1021,10 @@ module Mongo
1052
1021
  server.description.data_bearing? && server.logical_session_timeout.nil?
1053
1022
  end
1054
1023
  reason = if offending_servers.empty?
1055
- "There are no known data bearing servers (current seeds: #{@servers.map(&:address).map(&:seed).join(', ')})"
1056
- else
1057
- "The following servers have null logical session timeout: #{offending_servers.map(&:address).map(&:seed).join(', ')}"
1058
- end
1024
+ "There are no known data bearing servers (current seeds: #{@servers.map(&:address).map(&:seed).join(', ')})"
1025
+ else
1026
+ "The following servers have null logical session timeout: #{offending_servers.map(&:address).map(&:seed).join(', ')}"
1027
+ end
1059
1028
  msg = "The deployment that the driver is connected to does not support sessions: #{reason}"
1060
1029
  raise Error::SessionsNotSupported, msg
1061
1030
  end
@@ -1071,9 +1040,8 @@ module Mongo
1071
1040
  # description.
1072
1041
  server.update_description(
1073
1042
  Server::Description.new(server.address, {},
1074
- load_balancer: true,
1075
- force_load_balancer: options[:connect] == :load_balanced,
1076
- )
1043
+ load_balancer: true,
1044
+ force_load_balancer: options[:connect] == :load_balanced)
1077
1045
  )
1078
1046
  publish_sdam_event(
1079
1047
  Monitoring::SERVER_DESCRIPTION_CHANGED,
@@ -1097,13 +1065,13 @@ module Mongo
1097
1065
 
1098
1066
  COSMOSDB_HOST_PATTERNS = %w[ .cosmos.azure.com ]
1099
1067
  COSMOSDB_LOG_MESSAGE = 'You appear to be connected to a CosmosDB cluster. ' \
1100
- 'For more information regarding feature compatibility and support please visit ' \
1101
- 'https://www.mongodb.com/supportability/cosmosdb'
1068
+ 'For more information regarding feature compatibility and support please visit ' \
1069
+ 'https://www.mongodb.com/supportability/cosmosdb'
1102
1070
 
1103
1071
  DOCUMENTDB_HOST_PATTERNS = %w[ .docdb.amazonaws.com .docdb-elastic.amazonaws.com ]
1104
1072
  DOCUMENTDB_LOG_MESSAGE = 'You appear to be connected to a DocumentDB cluster. ' \
1105
- 'For more information regarding feature compatibility and support please visit ' \
1106
- 'https://www.mongodb.com/supportability/documentdb'
1073
+ 'For more information regarding feature compatibility and support please visit ' \
1074
+ 'https://www.mongodb.com/supportability/documentdb'
1107
1075
 
1108
1076
  # Compares the server hosts with address suffixes of known services
1109
1077
  # that provide limited MongoDB API compatibility, and warns about them.
@@ -1113,10 +1081,10 @@ module Mongo
1113
1081
  return
1114
1082
  end
1115
1083
 
1116
- if topology.server_hosts_match_any?(DOCUMENTDB_HOST_PATTERNS)
1117
- log_info DOCUMENTDB_LOG_MESSAGE
1118
- return
1119
- end
1084
+ return unless topology.server_hosts_match_any?(DOCUMENTDB_HOST_PATTERNS)
1085
+
1086
+ log_info DOCUMENTDB_LOG_MESSAGE
1087
+ nil
1120
1088
  end
1121
1089
  end
1122
1090
  end