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
@@ -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
  #
@@ -37,10 +36,10 @@ class Mongo::Cluster
37
36
  @awaited = !!awaited
38
37
  end
39
38
 
40
- attr_reader :cluster
39
+ attr_reader :cluster, :previous_desc, :updated_desc, :original_desc
41
40
 
42
41
  def_delegators :cluster, :servers_list, :seeds,
43
- :publish_sdam_event, :log_warn
42
+ :publish_sdam_event, :log_warn
44
43
 
45
44
  # The topology stored in this attribute can change multiple times throughout
46
45
  # a single sdam flow (e.g. unknown -> RS no primary -> RS with primary).
@@ -51,10 +50,6 @@ class Mongo::Cluster
51
50
  # @return Mongo::Cluster::Topology The current topology.
52
51
  attr_reader :topology
53
52
 
54
- attr_reader :previous_desc
55
- attr_reader :updated_desc
56
- attr_reader :original_desc
57
-
58
53
  def awaited?
59
54
  @awaited
60
55
  end
@@ -65,34 +60,31 @@ class Mongo::Cluster
65
60
  # updated_desc's address.
66
61
  def update_server_descriptions
67
62
  servers_list.each do |server|
68
- if server.address == updated_desc.address
69
- # SDAM flow must be run when topology version in the new description
70
- # is equal to the current topology version, per the example in
71
- # https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring.md#what-is-the-purpose-of-topologyversion
72
- unless updated_desc.topology_version_gte?(server.description)
73
- return false
74
- end
75
-
76
- @server_description_changed = server.description != updated_desc
77
-
78
- # Always update server description, so that fields that do not
79
- # affect description equality comparisons but are part of the
80
- # description are updated.
81
- server.update_description(updated_desc)
82
- server.update_last_scan
83
-
84
- # If there was no content difference between descriptions, we
85
- # still need to run sdam flow, but if the flow produces no change
86
- # in topology we will omit sending events.
87
- return true
88
- end
63
+ next unless server.address == updated_desc.address
64
+ # SDAM flow must be run when topology version in the new description
65
+ # is equal to the current topology version, per the example in
66
+ # https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring.md#what-is-the-purpose-of-topologyversion
67
+ return false unless updated_desc.topology_version_gte?(server.description)
68
+
69
+ @server_description_changed = server.description != updated_desc
70
+
71
+ # Always update server description, so that fields that do not
72
+ # affect description equality comparisons but are part of the
73
+ # description are updated.
74
+ server.update_description(updated_desc)
75
+ server.update_last_scan
76
+
77
+ # If there was no content difference between descriptions, we
78
+ # still need to run sdam flow, but if the flow produces no change
79
+ # in topology we will omit sending events.
80
+ return true
89
81
  end
90
82
  false
91
83
  end
92
84
 
93
85
  def server_description_changed
94
86
  @previous_server_descriptions = servers_list.map do |server|
95
- [server.address.to_s, server.description]
87
+ [ server.address.to_s, server.description ]
96
88
  end
97
89
 
98
90
  unless update_server_descriptions
@@ -107,23 +99,21 @@ class Mongo::Cluster
107
99
  case topology
108
100
  when Topology::LoadBalanced
109
101
  @updated_desc = ::Mongo::Server::Description::LoadBalancer.new(
110
- updated_desc.address,
102
+ updated_desc.address
111
103
  )
112
104
  update_server_descriptions
113
105
  when Topology::Single
114
- if topology.replica_set_name
115
- if updated_desc.replica_set_name != topology.replica_set_name
116
- log_warn(
117
- "Server #{updated_desc.address.to_s} has an incorrect replica set name '#{updated_desc.replica_set_name}'; expected '#{topology.replica_set_name}'"
118
- )
119
- @updated_desc = ::Mongo::Server::Description.new(
120
- updated_desc.address,
121
- {},
122
- average_round_trip_time: updated_desc.average_round_trip_time,
123
- minimum_round_trip_time: updated_desc.minimum_round_trip_time
124
- )
125
- update_server_descriptions
126
- end
106
+ if topology.replica_set_name && (updated_desc.replica_set_name != topology.replica_set_name)
107
+ log_warn(
108
+ "Server #{updated_desc.address} has an incorrect replica set name '#{updated_desc.replica_set_name}'; expected '#{topology.replica_set_name}'"
109
+ )
110
+ @updated_desc = ::Mongo::Server::Description.new(
111
+ updated_desc.address,
112
+ {},
113
+ average_round_trip_time: updated_desc.average_round_trip_time,
114
+ minimum_round_trip_time: updated_desc.minimum_round_trip_time
115
+ )
116
+ update_server_descriptions
127
117
  end
128
118
  when Topology::Unknown
129
119
  if updated_desc.standalone?
@@ -133,25 +123,27 @@ class Mongo::Cluster
133
123
  elsif updated_desc.primary?
134
124
  @topology = Topology::ReplicaSetWithPrimary.new(
135
125
  topology.options.merge(replica_set_name: updated_desc.replica_set_name),
136
- topology.monitoring, self)
126
+ topology.monitoring, self
127
+ )
137
128
  update_rs_from_primary
138
129
  elsif updated_desc.secondary? || updated_desc.arbiter? || updated_desc.other?
139
130
  @topology = Topology::ReplicaSetNoPrimary.new(
140
131
  topology.options.merge(replica_set_name: updated_desc.replica_set_name),
141
- topology.monitoring, self)
132
+ topology.monitoring, self
133
+ )
142
134
  update_rs_without_primary
143
135
  end
144
136
  when Topology::Sharded
145
137
  unless updated_desc.unknown? || updated_desc.mongos?
146
138
  log_warn(
147
- "Removing server #{updated_desc.address.to_s} because it is of the wrong type (#{updated_desc.server_type.to_s.upcase}) - expected SHARDED"
139
+ "Removing server #{updated_desc.address} because it is of the wrong type (#{updated_desc.server_type.to_s.upcase}) - expected SHARDED"
148
140
  )
149
141
  remove
150
142
  end
151
143
  when Topology::ReplicaSetWithPrimary
152
144
  if updated_desc.standalone? || updated_desc.mongos?
153
145
  log_warn(
154
- "Removing server #{updated_desc.address.to_s} because it is of the wrong type (#{updated_desc.server_type.to_s.upcase}) - expected a replica set member"
146
+ "Removing server #{updated_desc.address} because it is of the wrong type (#{updated_desc.server_type.to_s.upcase}) - expected a replica set member"
155
147
  )
156
148
  remove
157
149
  check_if_has_primary
@@ -165,7 +157,7 @@ class Mongo::Cluster
165
157
  when Topology::ReplicaSetNoPrimary
166
158
  if updated_desc.standalone? || updated_desc.mongos?
167
159
  log_warn(
168
- "Removing server #{updated_desc.address.to_s} because it is of the wrong type (#{updated_desc.server_type.to_s.upcase}) - expected a replica set member"
160
+ "Removing server #{updated_desc.address} because it is of the wrong type (#{updated_desc.server_type.to_s.upcase}) - expected a replica set member"
169
161
  )
170
162
  remove
171
163
  elsif updated_desc.primary?
@@ -175,13 +167,14 @@ class Mongo::Cluster
175
167
  # is is imperative to NOT pass updated_desc's RS name to
176
168
  # topology constructor here.
177
169
  # During processing we may remove the server whose updated_desc
178
- # we are be processing (e.g. the RS name mismatch case again),
179
- # in which case topoogy type will go back to RS without primary
170
+ # we are processing (e.g. the RS name mismatch case again),
171
+ # in which case topology type will go back to RS without primary
180
172
  # in the check_if_has_primary step.
181
173
  @topology = Topology::ReplicaSetWithPrimary.new(
182
174
  # Do not pass updated_desc's RS name here
183
175
  topology.options,
184
- topology.monitoring, self)
176
+ topology.monitoring, self
177
+ )
185
178
  update_rs_from_primary
186
179
  elsif updated_desc.secondary? || updated_desc.arbiter? || updated_desc.other?
187
180
  update_rs_without_primary
@@ -200,10 +193,11 @@ class Mongo::Cluster
200
193
  def update_unknown_with_standalone
201
194
  if seeds.length == 1
202
195
  @topology = Topology::Single.new(
203
- topology.options, topology.monitoring, self)
196
+ topology.options, topology.monitoring, self
197
+ )
204
198
  else
205
199
  log_warn(
206
- "Removing server #{updated_desc.address.to_s} because it is a standalone and we have multiple seeds (#{seeds.length})"
200
+ "Removing server #{updated_desc.address} because it is a standalone and we have multiple seeds (#{seeds.length})"
207
201
  )
208
202
  remove
209
203
  end
@@ -222,12 +216,13 @@ class Mongo::Cluster
222
216
  if topology.replica_set_name.nil?
223
217
  @topology = Topology::ReplicaSetWithPrimary.new(
224
218
  topology.options.merge(replica_set_name: updated_desc.replica_set_name),
225
- topology.monitoring, self)
219
+ topology.monitoring, self
220
+ )
226
221
  end
227
222
 
228
223
  if topology.replica_set_name != updated_desc.replica_set_name
229
224
  log_warn(
230
- "Removing server #{updated_desc.address.to_s} because it has an " +
225
+ "Removing server #{updated_desc.address} because it has an " +
231
226
  "incorrect replica set name '#{updated_desc.replica_set_name}'; " +
232
227
  "expected '#{topology.replica_set_name}'"
233
228
  )
@@ -253,19 +248,20 @@ class Mongo::Cluster
253
248
  topology.options.merge(
254
249
  max_election_id: updated_desc.election_id,
255
250
  max_set_version: updated_desc.set_version
256
- ), topology.monitoring, self)
251
+ ), topology.monitoring, self
252
+ )
257
253
  else
258
254
  max_election_id = topology.new_max_election_id(updated_desc)
259
255
  max_set_version = topology.new_max_set_version(updated_desc)
260
256
 
261
257
  if max_election_id != topology.max_election_id ||
262
- max_set_version != topology.max_set_version
263
- then
258
+ max_set_version != topology.max_set_version
264
259
  @topology = Topology::ReplicaSetWithPrimary.new(
265
260
  topology.options.merge(
266
261
  max_election_id: max_election_id,
267
262
  max_set_version: max_set_version
268
- ), topology.monitoring, self)
263
+ ), topology.monitoring, self
264
+ )
269
265
  end
270
266
  end
271
267
 
@@ -276,18 +272,18 @@ class Mongo::Cluster
276
272
  publish_description_change_event
277
273
 
278
274
  servers_list.each do |server|
279
- if server.address != updated_desc.address
280
- if server.primary?
281
- server.update_description(
282
- ::Mongo::Server::Description.new(
283
- server.address,
284
- {},
285
- average_round_trip_time: server.description.average_round_trip_time,
286
- minimum_round_trip_time: updated_desc.minimum_round_trip_time
287
- )
288
- )
289
- end
290
- end
275
+ next unless server.address != updated_desc.address
276
+
277
+ next unless server.primary?
278
+
279
+ server.update_description(
280
+ ::Mongo::Server::Description.new(
281
+ server.address,
282
+ {},
283
+ average_round_trip_time: server.description.average_round_trip_time,
284
+ minimum_round_trip_time: updated_desc.minimum_round_trip_time
285
+ )
286
+ )
291
287
  end
292
288
 
293
289
  servers = add_servers_from_desc(updated_desc)
@@ -304,7 +300,7 @@ class Mongo::Cluster
304
300
  def update_rs_with_primary_from_member
305
301
  if topology.replica_set_name != updated_desc.replica_set_name
306
302
  log_warn(
307
- "Removing server #{updated_desc.address.to_s} because it has an " +
303
+ "Removing server #{updated_desc.address} because it has an " +
308
304
  "incorrect replica set name (#{updated_desc.replica_set_name}); " +
309
305
  "current set name is #{topology.replica_set_name}"
310
306
  )
@@ -315,7 +311,7 @@ class Mongo::Cluster
315
311
 
316
312
  if updated_desc.me_mismatch?
317
313
  log_warn(
318
- "Removing server #{updated_desc.address.to_s} because it " +
314
+ "Removing server #{updated_desc.address} because it " +
319
315
  "reported itself as #{updated_desc.me}"
320
316
  )
321
317
  remove
@@ -331,10 +327,11 @@ class Mongo::Cluster
331
327
  end
332
328
  end
333
329
 
334
- unless have_primary
335
- @topology = Topology::ReplicaSetNoPrimary.new(
336
- topology.options, topology.monitoring, self)
337
- end
330
+ return if have_primary
331
+
332
+ @topology = Topology::ReplicaSetNoPrimary.new(
333
+ topology.options, topology.monitoring, self
334
+ )
338
335
  end
339
336
 
340
337
  # Updates a ReplicaSetNoPrimary topology from a non-primary member.
@@ -342,12 +339,13 @@ class Mongo::Cluster
342
339
  if topology.replica_set_name.nil?
343
340
  @topology = Topology::ReplicaSetNoPrimary.new(
344
341
  topology.options.merge(replica_set_name: updated_desc.replica_set_name),
345
- topology.monitoring, self)
342
+ topology.monitoring, self
343
+ )
346
344
  end
347
345
 
348
346
  if topology.replica_set_name != updated_desc.replica_set_name
349
347
  log_warn(
350
- "Removing server #{updated_desc.address.to_s} because it has an " +
348
+ "Removing server #{updated_desc.address} because it has an " +
351
349
  "incorrect replica set name (#{updated_desc.replica_set_name}); " +
352
350
  "current set name is #{topology.replica_set_name}"
353
351
  )
@@ -365,14 +363,14 @@ class Mongo::Cluster
365
363
  server.start_monitoring
366
364
  end
367
365
 
368
- if updated_desc.me_mismatch?
369
- log_warn(
370
- "Removing server #{updated_desc.address.to_s} because it " +
371
- "reported itself as #{updated_desc.me}"
372
- )
373
- remove
374
- return
375
- end
366
+ return unless updated_desc.me_mismatch?
367
+
368
+ log_warn(
369
+ "Removing server #{updated_desc.address} because it " +
370
+ "reported itself as #{updated_desc.me}"
371
+ )
372
+ remove
373
+ nil
376
374
  end
377
375
 
378
376
  # Adds all servers referenced in the given description (which is
@@ -386,7 +384,7 @@ class Mongo::Cluster
386
384
  # This is the set of servers on which monitoring should be started.
387
385
  def add_servers_from_desc(updated_desc)
388
386
  added_servers = []
389
- %w(hosts passives arbiters).each do |m|
387
+ %w[hosts passives arbiters].each do |m|
390
388
  updated_desc.send(m).each do |address_str|
391
389
  if server = cluster.add(address_str, monitor: false)
392
390
  added_servers << server
@@ -403,22 +401,20 @@ class Mongo::Cluster
403
401
  # given server description (which is supposed to have come from a
404
402
  # good primary).
405
403
  def remove_servers_not_in_desc(updated_desc)
406
- updated_desc_address_strs = %w(hosts passives arbiters).map do |m|
404
+ updated_desc_address_strs = %w[hosts passives arbiters].map do |m|
407
405
  updated_desc.send(m)
408
406
  end.flatten
409
407
  servers_list.each do |server|
410
- unless updated_desc_address_strs.include?(address_str = server.address.to_s)
411
- updated_host = updated_desc.address.to_s
412
- if updated_desc.me && updated_desc.me != updated_host
413
- updated_host += " (self-identified as #{updated_desc.me})"
414
- end
415
- log_warn(
416
- "Removing server #{address_str} because it is not in hosts reported by primary " +
417
- "#{updated_host}. Reported hosts are: " +
418
- updated_desc.hosts.join(', ')
419
- )
420
- do_remove(address_str)
421
- end
408
+ next if updated_desc_address_strs.include?(address_str = server.address.to_s)
409
+
410
+ updated_host = updated_desc.address.to_s
411
+ updated_host += " (self-identified as #{updated_desc.me})" if updated_desc.me && updated_desc.me != updated_host
412
+ log_warn(
413
+ "Removing server #{address_str} because it is not in hosts reported by primary " +
414
+ "#{updated_host}. Reported hosts are: " +
415
+ updated_desc.hosts.join(', ')
416
+ )
417
+ do_remove(address_str)
422
418
  end
423
419
  end
424
420
 
@@ -450,11 +446,11 @@ class Mongo::Cluster
450
446
  )
451
447
  end
452
448
  @servers_to_disconnect += servers
453
- if servers_list.empty?
454
- log_warn(
455
- "Topology now has no servers - this is likely a misconfiguration of the cluster and/or the application"
456
- )
457
- end
449
+ return unless servers_list.empty?
450
+
451
+ log_warn(
452
+ 'Topology now has no servers - this is likely a misconfiguration of the cluster and/or the application'
453
+ )
458
454
  end
459
455
 
460
456
  def publish_description_change_event
@@ -464,9 +460,7 @@ class Mongo::Cluster
464
460
  # method is called at the end of SDAM flow as part of "commit changes"
465
461
  # step, server description change is incorporated into the topology
466
462
  # change.
467
- unless @server_description_changed || topology_effectively_changed?
468
- return
469
- end
463
+ return unless @server_description_changed || topology_effectively_changed?
470
464
 
471
465
  # updated_desc here may not be the description we received from
472
466
  # the server - in case of a stale primary, the server reported itself
@@ -483,9 +477,7 @@ class Mongo::Cluster
483
477
  # previous description. This allows this method to be called multiple
484
478
  # times in the flow when the events should be published, without
485
479
  # worrying about whether there are any unpublished changes.
486
- if updated_desc.object_id == previous_desc.object_id
487
- return
488
- end
480
+ return if updated_desc.equal?(previous_desc)
489
481
 
490
482
  publish_sdam_event(
491
483
  ::Mongo::Monitoring::SERVER_DESCRIPTION_CHANGED,
@@ -494,7 +486,7 @@ class Mongo::Cluster
494
486
  topology,
495
487
  previous_desc,
496
488
  updated_desc,
497
- awaited: awaited?,
489
+ awaited: awaited?
498
490
  )
499
491
  )
500
492
  @previous_desc = updated_desc
@@ -532,20 +524,12 @@ class Mongo::Cluster
532
524
  # If a server description changed, topology description change event
533
525
  # must be published with the previous and next topologies being of
534
526
  # the same type, unless we already published topology change event
535
- if topology_changed_event_published
536
- return
537
- end
527
+ return if topology_changed_event_published
538
528
 
539
- if updated_desc.unknown? && previous_desc.unknown?
540
- return
541
- end
542
- if updated_desc.object_id == previous_desc.object_id
543
- return
544
- end
529
+ return if updated_desc.unknown? && previous_desc.unknown?
530
+ return if updated_desc.equal?(previous_desc)
545
531
 
546
- unless topology_effectively_changed?
547
- return
548
- end
532
+ return unless topology_effectively_changed?
549
533
 
550
534
  # If we are here, there has been a change in the server descriptions
551
535
  # in our topology, but topology class has not changed.
@@ -568,12 +552,10 @@ class Mongo::Cluster
568
552
  # If the server being processed is identified as data bearing, creates the
569
553
  # server's connection pool so it can start populating
570
554
  def start_pool_if_data_bearing
571
- return if !updated_desc.data_bearing?
555
+ return unless updated_desc.data_bearing?
572
556
 
573
557
  servers_list.each do |server|
574
- if server.address == @updated_desc.address
575
- server.pool
576
- end
558
+ server.pool if server.address == @updated_desc.address
577
559
  end
578
560
  end
579
561
 
@@ -582,44 +564,42 @@ class Mongo::Cluster
582
564
  # invoking this method.
583
565
  def check_if_has_primary
584
566
  unless topology.replica_set?
585
- raise ArgumentError, "check_if_has_primary should only be called when topology is replica set, but it is #{topology.class.name.sub(/.*::/, '')}"
567
+ raise ArgumentError,
568
+ "check_if_has_primary should only be called when topology is replica set, but it is #{topology.class.name.sub(/.*::/,
569
+ '')}"
586
570
  end
587
571
 
588
572
  primary = servers_list.detect do |server|
589
573
  # A primary with the wrong set name is not a primary
590
574
  server.primary? && server.description.replica_set_name == topology.replica_set_name
591
575
  end
592
- unless primary
593
- @topology = Topology::ReplicaSetNoPrimary.new(
594
- topology.options, topology.monitoring, self)
595
- end
576
+ return if primary
577
+
578
+ @topology = Topology::ReplicaSetNoPrimary.new(
579
+ topology.options, topology.monitoring, self
580
+ )
596
581
  end
597
582
 
598
583
  # Whether updated_desc is for a stale primary.
599
584
  def stale_primary?
600
585
  if updated_desc.max_wire_version >= 17
601
- if updated_desc.election_id.nil? && !topology.max_election_id.nil?
602
- return true
603
- end
586
+ return true if updated_desc.election_id.nil? && !topology.max_election_id.nil?
604
587
  if updated_desc.election_id && topology.max_election_id && updated_desc.election_id < topology.max_election_id
605
588
  return true
606
589
  end
590
+
607
591
  if updated_desc.election_id == topology.max_election_id
608
- if updated_desc.set_version.nil? && !topology.max_set_version.nil?
609
- return true
610
- end
592
+ return true if updated_desc.set_version.nil? && !topology.max_set_version.nil?
611
593
  if updated_desc.set_version && topology.max_set_version && updated_desc.set_version < topology.max_set_version
612
594
  return true
613
595
  end
614
596
  end
615
- else
616
- if updated_desc.election_id && updated_desc.set_version
617
- if topology.max_set_version && topology.max_election_id &&
618
- (updated_desc.set_version < topology.max_set_version ||
619
- (updated_desc.set_version == topology.max_set_version &&
620
- updated_desc.election_id < topology.max_election_id))
621
- return true
622
- end
597
+ elsif updated_desc.election_id && updated_desc.set_version
598
+ if topology.max_set_version && topology.max_election_id &&
599
+ (updated_desc.set_version < topology.max_set_version ||
600
+ (updated_desc.set_version == topology.max_set_version &&
601
+ updated_desc.election_id < topology.max_election_id))
602
+ return true
623
603
  end
624
604
  end
625
605
  false
@@ -642,25 +622,22 @@ class Mongo::Cluster
642
622
  # descriptions at the beginning of SDAM flow and compare them to the
643
623
  # current ones.
644
624
  def topology_effectively_changed?
645
- unless topology.equal?(cluster.topology)
646
- return true
647
- end
625
+ return true unless topology.equal?(cluster.topology)
648
626
 
649
627
  server_descriptions = servers_list.map do |server|
650
- [server.address.to_s, server.description]
628
+ [ server.address.to_s, server.description ]
651
629
  end
652
630
 
653
631
  @previous_server_descriptions != server_descriptions
654
632
  end
655
633
 
656
634
  def verify_invariants
657
- if Mongo::Lint.enabled?
658
- if cluster.topology.single?
659
- if cluster.servers_list.length > 1
660
- raise Mongo::Error::LintError, "Trying to create a single topology with multiple servers: #{cluster.servers_list}"
661
- end
662
- end
663
- end
635
+ return unless Mongo::Lint.enabled?
636
+ return unless cluster.topology.single?
637
+ return unless cluster.servers_list.length > 1
638
+
639
+ raise Mongo::Error::LintError,
640
+ "Trying to create a single topology with multiple servers: #{cluster.servers_list}"
664
641
  end
665
642
  end
666
643
  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
  #
@@ -18,7 +17,6 @@
18
17
  module Mongo
19
18
  class Cluster
20
19
  module Topology
21
-
22
20
  # Defines behavior common to all topologies.
23
21
  #
24
22
  # @since 2.7.0
@@ -63,7 +61,7 @@ module Mongo
63
61
  # topology creation. If server description change later, a
64
62
  # new topology instance should be created.
65
63
  @server_descriptions = {}
66
- (servers = cluster.servers_list).each do |server|
64
+ cluster.servers_list.each do |server|
67
65
  @server_descriptions[server.address.to_s] = server.description
68
66
  end
69
67
 
@@ -71,10 +69,8 @@ module Mongo
71
69
  @compatible = true
72
70
  else
73
71
  begin
74
- server_descriptions.each do |address_str, desc|
75
- unless desc.unknown?
76
- desc.features.check_driver_support!
77
- end
72
+ server_descriptions.each do |_address_str, desc|
73
+ desc.features.check_driver_support! unless desc.unknown?
78
74
  end
79
75
  rescue Error::UnsupportedFeatures => e
80
76
  @compatible = false
@@ -85,20 +81,21 @@ module Mongo
85
81
  end
86
82
 
87
83
  @have_data_bearing_servers = false
88
- @logical_session_timeout = server_descriptions.inject(nil) do |min, (address_str, desc)|
84
+ @logical_session_timeout = server_descriptions.inject(nil) do |min, (_address_str, desc)|
89
85
  # LST is only read from data-bearing servers
90
86
  if desc.data_bearing?
91
87
  @have_data_bearing_servers = true
92
88
  break unless timeout = desc.logical_session_timeout
93
- [timeout, (min || timeout)].min
89
+
90
+ [ timeout, min || timeout ].min
94
91
  else
95
92
  min
96
93
  end
97
94
  end
98
95
 
99
- if Mongo::Lint.enabled?
100
- freeze
101
- end
96
+ return unless Mongo::Lint.enabled?
97
+
98
+ freeze
102
99
  end
103
100
 
104
101
  # @return [ Hash ] options The options.
@@ -192,8 +189,8 @@ module Mongo
192
189
  # @api private
193
190
  def new_max_election_id(description)
194
191
  if description.election_id &&
195
- (max_election_id.nil? ||
196
- description.election_id > max_election_id)
192
+ (max_election_id.nil? ||
193
+ description.election_id > max_election_id)
197
194
  description.election_id
198
195
  else
199
196
  max_election_id
@@ -203,8 +200,8 @@ module Mongo
203
200
  # @api private
204
201
  def new_max_set_version(description)
205
202
  if description.set_version &&
206
- (max_set_version.nil? ||
207
- description.set_version > max_set_version)
203
+ (max_set_version.nil? ||
204
+ description.set_version > max_set_version)
208
205
  description.set_version
209
206
  else
210
207
  max_set_version
@@ -222,7 +219,7 @@ module Mongo
222
219
  # @api private
223
220
  def server_hosts_match_any?(patterns)
224
221
  server_descriptions.any? do |addr_spec, _desc|
225
- addr, _port = addr_spec.split(/:/)
222
+ addr, _port = addr_spec.split(':')
226
223
  patterns.any? { |pattern| addr.end_with?(pattern) }
227
224
  end
228
225
  end
@@ -232,7 +229,7 @@ module Mongo
232
229
  # Validates and/or transforms options as necessary for the topology.
233
230
  #
234
231
  # @return [ Hash ] New options
235
- def validate_options(options, cluster)
232
+ def validate_options(options, _cluster)
236
233
  options
237
234
  end
238
235
  end