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) 2020 MongoDB Inc.
5
4
  #
@@ -16,11 +15,8 @@
16
15
  # limitations under the License.
17
16
 
18
17
  module Mongo
19
-
20
18
  module ServerSelector
21
-
22
19
  class Base
23
-
24
20
  # Initialize the server selector.
25
21
  #
26
22
  # @example Initialize the selector.
@@ -48,9 +44,7 @@ module Mongo
48
44
  # @api private
49
45
  def initialize(options = nil)
50
46
  options = options ? options.dup : {}
51
- if options[:max_staleness] == -1
52
- options.delete(:max_staleness)
53
- end
47
+ options.delete(:max_staleness) if options[:max_staleness] == -1
54
48
  @options = options
55
49
  @tag_sets = options[:tag_sets] || []
56
50
  @max_staleness = options[:max_staleness]
@@ -88,7 +82,7 @@ module Mongo
88
82
  # a server is selected. Will be removed in version 3.0.
89
83
  def server_selection_timeout
90
84
  @server_selection_timeout ||=
91
- (options[:server_selection_timeout] || ServerSelector::SERVER_SELECTION_TIMEOUT)
85
+ options[:server_selection_timeout] || ServerSelector::SERVER_SELECTION_TIMEOUT
92
86
  end
93
87
 
94
88
  # Get the local threshold boundary for nearest selection in seconds.
@@ -103,7 +97,7 @@ module Mongo
103
97
  # @deprecated This setting is now taken from the cluster options when
104
98
  # a server is selected. Will be removed in version 3.0.
105
99
  def local_threshold
106
- @local_threshold ||= (options[:local_threshold] || ServerSelector::LOCAL_THRESHOLD)
100
+ @local_threshold ||= options[:local_threshold] || ServerSelector::LOCAL_THRESHOLD
107
101
  end
108
102
 
109
103
  # @api private
@@ -161,13 +155,12 @@ module Mongo
161
155
  # @param [ true, false ] ping Whether to ping the server before selection.
162
156
  # Deprecated and ignored.
163
157
  # @param [ Session | nil ] session Optional session to take into account
164
- # for mongos pinning. Added in version 2.10.0.
158
+ # for mongos pinning.
165
159
  # @param [ true | false ] write_aggregation Whether we need a server that
166
160
  # supports writing aggregations (e.g. with $merge/$out) on secondaries.
167
161
  # @param [ Array<Server> ] deprioritized A list of servers that should
168
- # be selected from only if no other servers are available. This is
169
- # used to avoid selecting the same server twice in a row when
170
- # retrying a command.
162
+ # be selected from only if no other servers are available.
163
+ #
171
164
  # @param [ Float | nil ] :timeout Timeout in seconds for the operation,
172
165
  # if any.
173
166
  #
@@ -197,15 +190,20 @@ module Mongo
197
190
 
198
191
  # Parameters and return values are the same as for select_server, only
199
192
  # the +timeout+ param is renamed to +csot_timeout+.
200
- private def select_server_impl(cluster, ping, session, write_aggregation, deprioritized, csot_timeout)
193
+ private def select_server_impl(cluster, _ping, session, write_aggregation, deprioritized, csot_timeout)
201
194
  if cluster.topology.is_a?(Cluster::Topology::LoadBalanced)
195
+ # In load-balanced mode, release the pinned connection if the session
196
+ # is no longer in a transaction (e.g. after commit or abort).
197
+ if session&.pinned_connection_global_id && !session.in_transaction?
198
+ session.unpin
199
+ end
202
200
  return cluster.servers.first
203
201
  end
204
202
 
205
203
  timeout = cluster.options[:server_selection_timeout] || SERVER_SELECTION_TIMEOUT
206
204
 
207
205
  server_selection_timeout = if csot_timeout && csot_timeout > 0
208
- [timeout, csot_timeout].min
206
+ [ timeout, csot_timeout ].min
209
207
  else
210
208
  timeout
211
209
  end
@@ -214,23 +212,19 @@ module Mongo
214
212
  # and the timeout is zero, fail immediately (since server selection
215
213
  # will take some non-zero amount of time in any case).
216
214
  if server_selection_timeout == 0
217
- msg = "Failing server selection due to zero timeout. " +
218
- " Requested #{name} in cluster: #{cluster.summary}"
215
+ msg = 'Failing server selection due to zero timeout. ' +
216
+ " Requested #{name} in cluster: #{cluster.summary}"
219
217
  raise Error::NoServerAvailable.new(self, cluster, msg)
220
218
  end
221
219
 
222
220
  deadline = Utils.monotonic_time + server_selection_timeout
223
221
 
224
222
  if session && session.pinned_server
225
- if Mongo::Lint.enabled?
226
- unless cluster.sharded?
227
- raise Error::LintError, "Session has a pinned server in a non-sharded topology: #{topology}"
228
- end
223
+ if Mongo::Lint.enabled? && !cluster.sharded?
224
+ raise Error::LintError, "Session has a pinned server in a non-sharded topology: #{topology}"
229
225
  end
230
226
 
231
- if !session.in_transaction?
232
- session.unpin
233
- end
227
+ session.unpin unless session.in_transaction?
234
228
 
235
229
  if server = session.pinned_server
236
230
  # Here we assume that a mongos stays in the topology indefinitely.
@@ -243,7 +237,7 @@ module Mongo
243
237
 
244
238
  unless server.mongos?
245
239
  msg = "The session being used is pinned to the server which is not a mongos: #{server.summary} " +
246
- "(after #{server_selection_timeout} seconds)"
240
+ "(after #{server_selection_timeout} seconds)"
247
241
  raise Error::NoServerAvailable.new(self, cluster, msg)
248
242
  end
249
243
  end
@@ -252,26 +246,22 @@ module Mongo
252
246
  end
253
247
  end
254
248
 
255
- if cluster.replica_set?
256
- validate_max_staleness_value_early!
257
- end
249
+ validate_max_staleness_value_early! if cluster.replica_set?
258
250
 
259
251
  if cluster.addresses.empty?
260
- if Lint.enabled?
261
- unless cluster.servers.empty?
262
- raise Error::LintError, "Cluster has no addresses but has servers: #{cluster.servers.map(&:inspect).join(', ')}"
263
- end
252
+ if Lint.enabled? && !cluster.servers.empty?
253
+ raise Error::LintError,
254
+ "Cluster has no addresses but has servers: #{cluster.servers.map(&:inspect).join(', ')}"
264
255
  end
265
- msg = "Cluster has no addresses, and therefore will never have a server"
256
+ msg = 'Cluster has no addresses, and therefore will never have a server'
266
257
  raise Error::NoServerAvailable.new(self, cluster, msg)
267
258
  end
268
259
 
269
- =begin Add this check in version 3.0.0
270
- unless cluster.connected?
271
- msg = 'Cluster is disconnected'
272
- raise Error::NoServerAvailable.new(self, cluster, msg)
273
- end
274
- =end
260
+ # Add this check in version 3.0.0
261
+ # unless cluster.connected?
262
+ # msg = 'Cluster is disconnected'
263
+ # raise Error::NoServerAvailable.new(self, cluster, msg)
264
+ # end
275
265
 
276
266
  loop do
277
267
  if Lint.enabled?
@@ -287,15 +277,16 @@ module Mongo
287
277
  end
288
278
 
289
279
  server = try_select_server(cluster, write_aggregation: write_aggregation, deprioritized: deprioritized)
280
+ if server.nil? && deprioritized.any?
281
+ server = try_select_server(cluster, write_aggregation: write_aggregation, deprioritized: [])
282
+ end
290
283
 
291
284
  if server
292
285
  unless cluster.topology.compatible?
293
286
  raise Error::UnsupportedFeatures, cluster.topology.compatibility_error.to_s
294
287
  end
295
288
 
296
- if session && session.starting_transaction? && cluster.sharded?
297
- session.pin_to_server(server)
298
- end
289
+ session.pin_to_server(server) if session && session.starting_transaction? && cluster.sharded?
299
290
 
300
291
  return server
301
292
  end
@@ -303,34 +294,28 @@ module Mongo
303
294
  cluster.scan!(false)
304
295
 
305
296
  time_remaining = deadline - Utils.monotonic_time
306
- if time_remaining > 0
307
- wait_for_server_selection(cluster, time_remaining)
308
-
309
- # If we wait for server selection, perform another round of
310
- # attempting to locate a suitable server. Otherwise server selection
311
- # can raise NoServerAvailable message when the diagnostics
312
- # reports an available server of the requested type.
313
- else
314
- break
315
- end
297
+ break unless time_remaining > 0
298
+
299
+ wait_for_server_selection(cluster, time_remaining)
300
+
301
+ # If we wait for server selection, perform another round of
302
+ # attempting to locate a suitable server. Otherwise server selection
303
+ # can raise NoServerAvailable message when the diagnostics
304
+ # reports an available server of the requested type.
316
305
  end
317
306
 
318
307
  msg = "No #{name} server"
319
- if is_a?(ServerSelector::Secondary) && !tag_sets.empty?
320
- msg += " with tag sets: #{tag_sets}"
321
- end
308
+ msg += " with tag sets: #{tag_sets}" if is_a?(ServerSelector::Secondary) && !tag_sets.empty?
322
309
  msg += " is available in cluster: #{cluster.summary} " +
323
- "with timeout=#{server_selection_timeout}, " +
324
- "LT=#{local_threshold_with_cluster(cluster)}"
310
+ "with timeout=#{server_selection_timeout}, " +
311
+ "LT=#{local_threshold_with_cluster(cluster)}"
325
312
  msg += server_selection_diagnostic_message(cluster)
326
313
  raise Error::NoServerAvailable.new(self, cluster, msg)
327
314
  rescue Error::NoServerAvailable => e
328
315
  if session && session.in_transaction? && !session.committing_transaction?
329
316
  e.add_label('TransientTransactionError')
330
317
  end
331
- if session && session.committing_transaction?
332
- e.add_label('UnknownTransactionCommitResult')
333
- end
318
+ e.add_label('UnknownTransactionCommitResult') if session && session.committing_transaction?
334
319
  raise e
335
320
  end
336
321
 
@@ -351,40 +336,36 @@ module Mongo
351
336
  # @api private
352
337
  def try_select_server(cluster, write_aggregation: false, deprioritized: [])
353
338
  servers = if write_aggregation && cluster.replica_set?
354
- # 1. Check if ALL servers in cluster support secondary writes.
355
- is_write_supported = cluster.servers.reduce(true) do |res, server|
356
- res && server.features.merge_out_on_secondary_enabled?
357
- end
358
-
359
- if is_write_supported
360
- # 2. If all servers support secondary writes, we respect read preference.
361
- suitable_servers(cluster)
362
- else
363
- # 3. Otherwise we fallback to primary for replica set.
364
- [cluster.servers.detect(&:primary?)]
365
- end
366
- else
367
- suitable_servers(cluster)
368
- end
339
+ # 1. Check if ALL servers in cluster support secondary writes.
340
+ is_write_supported = cluster.servers.reduce(true) do |res, server|
341
+ res && server.features.merge_out_on_secondary_enabled?
342
+ end
343
+
344
+ if is_write_supported
345
+ # 2. If all servers support secondary writes, we respect read preference.
346
+ suitable_servers(cluster, deprioritized)
347
+ else
348
+ # 3. Otherwise we fallback to primary for replica set.
349
+ [ cluster.servers.detect(&:primary?) ]
350
+ end
351
+ else
352
+ suitable_servers(cluster, deprioritized)
353
+ end
369
354
 
370
355
  # This list of servers may be ordered in a specific way
371
356
  # by the selector (e.g. for secondary preferred, the first
372
357
  # server may be a secondary and the second server may be primary)
373
358
  # and we should take the first server here respecting the order
374
- server = suitable_server(servers, deprioritized)
359
+ server = suitable_server(servers)
375
360
 
376
- if server
377
- if Lint.enabled?
378
- # It is possible for a server to have a nil average RTT here
379
- # because the ARTT comes from description which may be updated
380
- # by a background thread while server selection is running.
381
- # Currently lint mode is not a public feature, if/when this
382
- # changes (https://jira.mongodb.org/browse/RUBY-1576) the
383
- # requirement for ARTT to be not nil would need to be removed.
384
- if server.average_round_trip_time.nil?
385
- raise Error::LintError, "Server #{server.address} has nil average rtt"
386
- end
387
- end
361
+ if server && Lint.enabled? && server.average_round_trip_time.nil?
362
+ # It is possible for a server to have a nil average RTT here
363
+ # because the ARTT comes from description which may be updated
364
+ # by a background thread while server selection is running.
365
+ # Currently lint mode is not a public feature, if/when this
366
+ # changes (https://jira.mongodb.org/browse/RUBY-1576) the
367
+ # requirement for ARTT to be not nil would need to be removed.
368
+ raise Error::LintError, "Server #{server.address} has nil average rtt"
388
369
  end
389
370
 
390
371
  server
@@ -396,15 +377,14 @@ module Mongo
396
377
  # latency filtering.
397
378
  #
398
379
  # @param [ Cluster ] cluster The cluster.
380
+ # @param [ Array<Server> ] deprioritized A list of servers that should
381
+ # be selected from only if no other servers are available.
399
382
  #
400
383
  # @return [ Array<Server> ] The candidate servers.
401
384
  #
402
385
  # @api private
403
- def candidates(cluster)
404
- servers = cluster.servers
405
- servers.each do |server|
406
- validate_max_staleness_support!(server)
407
- end
386
+ def candidates(cluster, deprioritized = [])
387
+ servers = cluster.servers.reject { |s| deprioritized.include?(s) }
408
388
  if cluster.single?
409
389
  servers
410
390
  elsif cluster.sharded?
@@ -420,44 +400,55 @@ module Mongo
420
400
  # Returns servers satisfying the server selector from the cluster.
421
401
  #
422
402
  # @param [ Cluster ] cluster The cluster.
403
+ # @param [ Array<Server> ] deprioritized A list of servers that should
404
+ # be selected from only if no other servers are available.
405
+ #
406
+ # @return [ Array<Server> ] The suitable servers.
407
+ #
408
+ # @api private
409
+ def suitable_servers(cluster, deprioritized = [])
410
+ result = suitable_servers_impl(cluster, deprioritized)
411
+ result = suitable_servers_impl(cluster, []) if result.empty? && deprioritized.any?
412
+ result
413
+ end
414
+
415
+ private
416
+
417
+ # Internal implementation of suitable_servers that applies deprioritization
418
+ # filtering to the candidate servers.
419
+ #
420
+ # @param [ Cluster ] cluster The cluster.
421
+ # @param [ Array<Server> ] deprioritized A list of servers that should
422
+ # be excluded from the candidate pool.
423
423
  #
424
424
  # @return [ Array<Server> ] The suitable servers.
425
425
  #
426
426
  # @api private
427
- def suitable_servers(cluster)
427
+ def suitable_servers_impl(cluster, deprioritized)
428
428
  if cluster.single?
429
- candidates(cluster)
429
+ candidates(cluster, deprioritized)
430
430
  elsif cluster.sharded?
431
431
  local_threshold = local_threshold_with_cluster(cluster)
432
- servers = candidates(cluster)
432
+ servers = candidates(cluster, deprioritized)
433
433
  near_servers(servers, local_threshold)
434
434
  elsif cluster.replica_set?
435
435
  validate_max_staleness_value!(cluster)
436
- candidates(cluster)
436
+ candidates(cluster, deprioritized)
437
437
  else
438
438
  # Unknown cluster - no servers
439
439
  []
440
440
  end
441
441
  end
442
442
 
443
- private
444
-
445
443
  # Returns a server from the list of servers that is suitable for
446
444
  # executing the operation.
447
445
  #
448
446
  # @param [ Array<Server> ] servers The candidate servers.
449
- # @param [ Array<Server> ] deprioritized A list of servers that should
450
- # be selected from only if no other servers are available.
451
447
  #
452
448
  # @return [ Server | nil ] The suitable server or nil if no suitable
453
449
  # server is available.
454
- def suitable_server(servers, deprioritized)
455
- preferred = servers - deprioritized
456
- if preferred.empty?
457
- servers.first
458
- else
459
- preferred.first
460
- end
450
+ def suitable_server(servers)
451
+ servers.first
461
452
  end
462
453
 
463
454
  # Convert this server preference definition into a format appropriate
@@ -468,7 +459,7 @@ module Mongo
468
459
  # @since 2.0.0
469
460
  def full_doc
470
461
  @full_doc ||= begin
471
- preference = { :mode => self.class.const_get(:SERVER_FORMATTED_NAME) }
462
+ preference = { mode: self.class.const_get(:SERVER_FORMATTED_NAME) }
472
463
  preference.update(tags: tag_sets) unless tag_sets.empty?
473
464
  preference.update(maxStalenessSeconds: max_staleness) if max_staleness
474
465
  preference.update(hedge: hedge) if hedge
@@ -529,7 +520,7 @@ module Mongo
529
520
  # of this method.
530
521
 
531
522
  candidates = candidates.map do |server|
532
- {server: server, artt: server.average_round_trip_time}
523
+ { server: server, artt: server.average_round_trip_time }
533
524
  end.reject do |candidate|
534
525
  candidate[:artt].nil?
535
526
  end
@@ -540,7 +531,7 @@ module Mongo
540
531
  candidate[:artt]
541
532
  end
542
533
 
543
- # Default for legacy signarure
534
+ # Default for legacy signature
544
535
  local_threshold ||= self.local_threshold
545
536
 
546
537
  threshold = nearest_candidate[:artt] + local_threshold
@@ -578,16 +569,14 @@ module Mongo
578
569
  # last_scan here.
579
570
  if primary
580
571
  candidates.select do |server|
581
- validate_max_staleness_support!(server)
582
572
  staleness = (server.last_scan - server.last_write_date) -
583
- (primary.last_scan - primary.last_write_date) +
573
+ (primary.last_scan - primary.last_write_date) +
584
574
  server.cluster.heartbeat_interval
585
575
  staleness <= @max_staleness
586
576
  end
587
577
  else
588
578
  max_write_date = candidates.collect(&:last_write_date).max
589
579
  candidates.select do |server|
590
- validate_max_staleness_support!(server)
591
580
  staleness = max_write_date - server.last_write_date + server.cluster.heartbeat_interval
592
581
  staleness <= @max_staleness
593
582
  end
@@ -601,49 +590,39 @@ module Mongo
601
590
  raise Error::InvalidServerPreference.new(Error::InvalidServerPreference::NO_MAX_STALENESS_SUPPORT)
602
591
  end
603
592
 
604
- if @hedge
605
- unless hedge_allowed?
606
- raise Error::InvalidServerPreference.new(Error::InvalidServerPreference::NO_HEDGE_SUPPORT)
607
- end
608
-
609
- unless @hedge.is_a?(Hash) && @hedge.key?(:enabled) &&
610
- [true, false].include?(@hedge[:enabled])
611
- raise Error::InvalidServerPreference.new(
612
- "`hedge` value (#{hedge}) is invalid - hedge must be a Hash in the " \
613
- "format { enabled: true }"
614
- )
615
- end
616
- end
617
- end
593
+ return unless @hedge
594
+ raise Error::InvalidServerPreference.new(Error::InvalidServerPreference::NO_HEDGE_SUPPORT) unless hedge_allowed?
618
595
 
619
- def validate_max_staleness_support!(server)
620
- if @max_staleness && !server.features.max_staleness_enabled?
621
- raise Error::InvalidServerPreference.new(Error::InvalidServerPreference::NO_MAX_STALENESS_WITH_LEGACY_SERVER)
596
+ unless @hedge.is_a?(Hash) && @hedge.key?(:enabled) &&
597
+ [ true, false ].include?(@hedge[:enabled])
598
+ raise Error::InvalidServerPreference.new(
599
+ "`hedge` value (#{hedge}) is invalid - hedge must be a Hash in the " \
600
+ 'format { enabled: true }'
601
+ )
622
602
  end
623
603
  end
624
604
 
625
605
  def validate_max_staleness_value_early!
626
- if @max_staleness
627
- unless @max_staleness >= SMALLEST_MAX_STALENESS_SECONDS
628
- msg = "`max_staleness` value (#{@max_staleness}) is too small - it must be at least " +
606
+ return unless @max_staleness
607
+ return if @max_staleness >= SMALLEST_MAX_STALENESS_SECONDS
608
+
609
+ msg = "`max_staleness` value (#{@max_staleness}) is too small - it must be at least " +
629
610
  "`Mongo::ServerSelector::SMALLEST_MAX_STALENESS_SECONDS` (#{ServerSelector::SMALLEST_MAX_STALENESS_SECONDS})"
630
- raise Error::InvalidServerPreference.new(msg)
631
- end
632
- end
611
+ raise Error::InvalidServerPreference.new(msg)
633
612
  end
634
613
 
635
614
  def validate_max_staleness_value!(cluster)
636
- if @max_staleness
637
- heartbeat_interval = cluster.heartbeat_interval
638
- unless @max_staleness >= [
639
- SMALLEST_MAX_STALENESS_SECONDS,
640
- min_cluster_staleness = heartbeat_interval + Cluster::IDLE_WRITE_PERIOD_SECONDS,
641
- ].max
642
- msg = "`max_staleness` value (#{@max_staleness}) is too small - it must be at least " +
643
- "`Mongo::ServerSelector::SMALLEST_MAX_STALENESS_SECONDS` (#{ServerSelector::SMALLEST_MAX_STALENESS_SECONDS}) and (the cluster's heartbeat_frequency " +
644
- "setting + `Mongo::Cluster::IDLE_WRITE_PERIOD_SECONDS`) (#{min_cluster_staleness})"
645
- raise Error::InvalidServerPreference.new(msg)
646
- end
615
+ return unless @max_staleness
616
+
617
+ heartbeat_interval = cluster.heartbeat_interval
618
+ unless @max_staleness >= [
619
+ SMALLEST_MAX_STALENESS_SECONDS,
620
+ min_cluster_staleness = heartbeat_interval + Cluster::IDLE_WRITE_PERIOD_SECONDS,
621
+ ].max
622
+ msg = "`max_staleness` value (#{@max_staleness}) is too small - it must be at least " +
623
+ "`Mongo::ServerSelector::SMALLEST_MAX_STALENESS_SECONDS` (#{ServerSelector::SMALLEST_MAX_STALENESS_SECONDS}) and (the cluster's heartbeat_frequency " +
624
+ "setting + `Mongo::Cluster::IDLE_WRITE_PERIOD_SECONDS`) (#{min_cluster_staleness})"
625
+ raise Error::InvalidServerPreference.new(msg)
647
626
  end
648
627
  end
649
628
 
@@ -669,12 +648,13 @@ module Mongo
669
648
  # the servers list earlier and the wait call below, we should not
670
649
  # wait for the full remaining time - wait for up to 0.5 second, then
671
650
  # recheck the state.
672
- cluster.server_selection_semaphore.wait([time_remaining, 0.5].min)
651
+ cluster.server_selection_semaphore.wait([ time_remaining, 0.5 ].min)
673
652
  else
674
653
  if Lint.enabled?
675
654
  raise Error::LintError, 'Waiting for server selection without having a server selection semaphore'
676
655
  end
677
- sleep [time_remaining, 0.25].min
656
+
657
+ sleep [ time_remaining, 0.25 ].min
678
658
  end
679
659
  end
680
660
 
@@ -696,17 +676,13 @@ module Mongo
696
676
  msg = ''
697
677
  dead_monitors = []
698
678
  cluster.servers_list.each do |server|
699
- thread = server.monitor.instance_variable_get('@thread')
700
- if thread.nil? || !thread.alive?
701
- dead_monitors << server
702
- end
679
+ thread = server.monitor.instance_variable_get(:@thread)
680
+ dead_monitors << server if thread.nil? || !thread.alive?
703
681
  end
704
682
  if dead_monitors.any?
705
683
  msg += ". The following servers have dead monitor threads: #{dead_monitors.map(&:summary).join(', ')}"
706
684
  end
707
- unless cluster.connected?
708
- msg += ". The cluster is disconnected (client may have been closed)"
709
- end
685
+ msg += '. The cluster is disconnected (client may have been closed)' unless cluster.connected?
710
686
  msg
711
687
  end
712
688
  end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2014-2020 MongoDB Inc.
5
4
  #
@@ -17,17 +16,15 @@
17
16
 
18
17
  module Mongo
19
18
  module ServerSelector
20
-
21
19
  # Encapsulates specifications for selecting near servers given a list
22
20
  # of candidates.
23
21
  #
24
22
  # @since 2.0.0
25
23
  class Nearest < Base
26
-
27
24
  # Name of the this read preference in the server's format.
28
25
  #
29
26
  # @since 2.5.0
30
- SERVER_FORMATTED_NAME = 'nearest'.freeze
27
+ SERVER_FORMATTED_NAME = 'nearest'
31
28
 
32
29
  # Get the name of the server mode type.
33
30
  #
@@ -86,7 +83,7 @@ module Mongo
86
83
  # command field value.
87
84
  #
88
85
  # @since 2.0.0
89
- alias :to_mongos :to_doc
86
+ alias to_mongos to_doc
90
87
 
91
88
  private
92
89
 
@@ -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
  #
@@ -16,19 +15,16 @@
16
15
  # limitations under the License.
17
16
 
18
17
  module Mongo
19
-
20
18
  module ServerSelector
21
-
22
19
  # Encapsulates specifications for selecting the primary server given a list
23
20
  # of candidates.
24
21
  #
25
22
  # @since 2.0.0
26
23
  class Primary < Base
27
-
28
24
  # Name of the this read preference in the server's format.
29
25
  #
30
26
  # @since 2.5.0
31
- SERVER_FORMATTED_NAME = 'primary'.freeze
27
+ SERVER_FORMATTED_NAME = 'primary'
32
28
 
33
29
  # Get the name of the server mode type.
34
30
  #
@@ -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
  #
@@ -16,19 +15,16 @@
16
15
  # limitations under the License.
17
16
 
18
17
  module Mongo
19
-
20
18
  module ServerSelector
21
-
22
19
  # Encapsulates specifications for selecting servers, with the
23
20
  # primary preferred, given a list of candidates.
24
21
  #
25
22
  # @since 2.0.0
26
23
  class PrimaryPreferred < Base
27
-
28
24
  # Name of the this read preference in the server's format.
29
25
  #
30
26
  # @since 2.5.0
31
- SERVER_FORMATTED_NAME = 'primaryPreferred'.freeze
27
+ SERVER_FORMATTED_NAME = 'primaryPreferred'
32
28
 
33
29
  # Get the name of the server mode type.
34
30
  #
@@ -87,7 +83,7 @@ module Mongo
87
83
  # command field value.
88
84
  #
89
85
  # @since 2.0.0
90
- alias :to_mongos :to_doc
86
+ alias to_mongos to_doc
91
87
 
92
88
  private
93
89
 
@@ -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
  #
@@ -16,19 +15,16 @@
16
15
  # limitations under the License.
17
16
 
18
17
  module Mongo
19
-
20
18
  module ServerSelector
21
-
22
19
  # Encapsulates specifications for selecting secondary servers given a list
23
20
  # of candidates.
24
21
  #
25
22
  # @since 2.0.0
26
23
  class Secondary < Base
27
-
28
24
  # Name of the this read preference in the server's format.
29
25
  #
30
26
  # @since 2.5.0
31
- SERVER_FORMATTED_NAME = 'secondary'.freeze
27
+ SERVER_FORMATTED_NAME = 'secondary'
32
28
 
33
29
  # Get the name of the server mode type.
34
30
  #
@@ -87,7 +83,7 @@ module Mongo
87
83
  # command field value.
88
84
  #
89
85
  # @since 2.0.0
90
- alias :to_mongos :to_doc
86
+ alias to_mongos to_doc
91
87
 
92
88
  private
93
89