mongo 2.23.0 → 2.24.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (463) hide show
  1. checksums.yaml +4 -4
  2. data/bin/mongo_console +0 -1
  3. data/lib/mongo/active_support.rb +1 -2
  4. data/lib/mongo/address/ipv4.rb +3 -6
  5. data/lib/mongo/address/ipv6.rb +6 -10
  6. data/lib/mongo/address/unix.rb +1 -4
  7. data/lib/mongo/address/validator.rb +16 -28
  8. data/lib/mongo/address.rb +30 -40
  9. data/lib/mongo/auth/aws/conversation.rb +6 -10
  10. data/lib/mongo/auth/aws/credentials.rb +0 -1
  11. data/lib/mongo/auth/aws/credentials_cache.rb +0 -1
  12. data/lib/mongo/auth/aws/credentials_retriever.rb +45 -59
  13. data/lib/mongo/auth/aws/request.rb +20 -35
  14. data/lib/mongo/auth/aws.rb +1 -2
  15. data/lib/mongo/auth/base.rb +20 -29
  16. data/lib/mongo/auth/conversation_base.rb +14 -18
  17. data/lib/mongo/auth/cr/conversation.rb +0 -3
  18. data/lib/mongo/auth/cr.rb +1 -4
  19. data/lib/mongo/auth/credential_cache.rb +0 -2
  20. data/lib/mongo/auth/gssapi/conversation.rb +3 -8
  21. data/lib/mongo/auth/gssapi.rb +1 -4
  22. data/lib/mongo/auth/ldap/conversation.rb +0 -3
  23. data/lib/mongo/auth/ldap.rb +1 -4
  24. data/lib/mongo/auth/roles.rb +16 -19
  25. data/lib/mongo/auth/sasl_conversation_base.rb +7 -11
  26. data/lib/mongo/auth/scram/conversation.rb +2 -5
  27. data/lib/mongo/auth/scram.rb +5 -10
  28. data/lib/mongo/auth/scram256/conversation.rb +2 -5
  29. data/lib/mongo/auth/scram256.rb +1 -3
  30. data/lib/mongo/auth/scram_conversation_base.rb +18 -24
  31. data/lib/mongo/auth/stringprep/profiles/sasl.rb +17 -18
  32. data/lib/mongo/auth/stringprep/tables.rb +2209 -2210
  33. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +36 -38
  34. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1142 -1150
  35. data/lib/mongo/auth/stringprep.rb +9 -12
  36. data/lib/mongo/auth/user/view.rb +3 -5
  37. data/lib/mongo/auth/user.rb +14 -24
  38. data/lib/mongo/auth/x509/conversation.rb +0 -3
  39. data/lib/mongo/auth/x509.rb +7 -9
  40. data/lib/mongo/auth.rb +18 -30
  41. data/lib/mongo/background_thread.rb +9 -17
  42. data/lib/mongo/bson.rb +0 -2
  43. data/lib/mongo/bulk_write/combineable.rb +0 -3
  44. data/lib/mongo/bulk_write/ordered_combiner.rb +1 -3
  45. data/lib/mongo/bulk_write/result.rb +20 -17
  46. data/lib/mongo/bulk_write/result_combiner.rb +17 -13
  47. data/lib/mongo/bulk_write/transformable.rb +16 -19
  48. data/lib/mongo/bulk_write/unordered_combiner.rb +1 -3
  49. data/lib/mongo/bulk_write/validatable.rb +11 -18
  50. data/lib/mongo/bulk_write.rb +76 -91
  51. data/lib/mongo/caching_cursor.rb +2 -7
  52. data/lib/mongo/client.rb +230 -275
  53. data/lib/mongo/client_encryption.rb +4 -5
  54. data/lib/mongo/cluster/periodic_executor.rb +2 -5
  55. data/lib/mongo/cluster/reapers/cursor_reaper.rb +21 -29
  56. data/lib/mongo/cluster/reapers/socket_reaper.rb +1 -6
  57. data/lib/mongo/cluster/sdam_flow.rb +136 -159
  58. data/lib/mongo/cluster/topology/base.rb +15 -18
  59. data/lib/mongo/cluster/topology/load_balanced.rb +24 -14
  60. data/lib/mongo/cluster/topology/no_replica_set_options.rb +3 -6
  61. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +20 -23
  62. data/lib/mongo/cluster/topology/replica_set_with_primary.rb +0 -2
  63. data/lib/mongo/cluster/topology/sharded.rb +19 -9
  64. data/lib/mongo/cluster/topology/single.rb +24 -14
  65. data/lib/mongo/cluster/topology/unknown.rb +20 -10
  66. data/lib/mongo/cluster/topology.rb +29 -25
  67. data/lib/mongo/cluster.rb +148 -183
  68. data/lib/mongo/cluster_time.rb +14 -31
  69. data/lib/mongo/collection/helpers.rb +5 -8
  70. data/lib/mongo/collection/view/aggregation.rb +5 -10
  71. data/lib/mongo/collection/view/builder/aggregation.rb +6 -9
  72. data/lib/mongo/collection/view/builder/map_reduce.rb +18 -17
  73. data/lib/mongo/collection/view/builder.rb +0 -1
  74. data/lib/mongo/collection/view/change_stream/retryable.rb +3 -8
  75. data/lib/mongo/collection/view/change_stream.rb +59 -58
  76. data/lib/mongo/collection/view/explainable.rb +11 -20
  77. data/lib/mongo/collection/view/immutable.rb +1 -3
  78. data/lib/mongo/collection/view/iterable.rb +35 -28
  79. data/lib/mongo/collection/view/map_reduce.rb +20 -25
  80. data/lib/mongo/collection/view/readable.rb +50 -57
  81. data/lib/mongo/collection/view/writable.rb +56 -72
  82. data/lib/mongo/collection/view.rb +9 -8
  83. data/lib/mongo/collection.rb +63 -76
  84. data/lib/mongo/condition_variable.rb +4 -4
  85. data/lib/mongo/config/options.rb +0 -3
  86. data/lib/mongo/config/validators/option.rb +3 -5
  87. data/lib/mongo/config.rb +7 -4
  88. data/lib/mongo/crypt/auto_decryption_context.rb +0 -3
  89. data/lib/mongo/crypt/auto_encrypter.rb +34 -43
  90. data/lib/mongo/crypt/auto_encryption_context.rb +0 -3
  91. data/lib/mongo/crypt/binary.rb +5 -9
  92. data/lib/mongo/crypt/binding.rb +149 -155
  93. data/lib/mongo/crypt/context.rb +10 -17
  94. data/lib/mongo/crypt/data_key_context.rb +2 -7
  95. data/lib/mongo/crypt/encryption_io.rb +29 -39
  96. data/lib/mongo/crypt/explicit_decryption_context.rb +0 -3
  97. data/lib/mongo/crypt/explicit_encrypter.rb +1 -1
  98. data/lib/mongo/crypt/explicit_encryption_context.rb +19 -30
  99. data/lib/mongo/crypt/explicit_encryption_expression_context.rb +0 -2
  100. data/lib/mongo/crypt/handle.rb +42 -48
  101. data/lib/mongo/crypt/hooks.rb +12 -15
  102. data/lib/mongo/crypt/kms/aws/credentials.rb +12 -16
  103. data/lib/mongo/crypt/kms/aws/master_document.rb +6 -9
  104. data/lib/mongo/crypt/kms/aws.rb +0 -2
  105. data/lib/mongo/crypt/kms/azure/credentials_retriever.rb +2 -7
  106. data/lib/mongo/crypt/kms/azure/master_document.rb +15 -19
  107. data/lib/mongo/crypt/kms/azure.rb +0 -1
  108. data/lib/mongo/crypt/kms/credentials.rb +13 -27
  109. data/lib/mongo/crypt/kms/gcp/credentials.rb +12 -14
  110. data/lib/mongo/crypt/kms/gcp/credentials_retriever.rb +7 -9
  111. data/lib/mongo/crypt/kms/gcp/master_document.rb +12 -16
  112. data/lib/mongo/crypt/kms/gcp.rb +0 -2
  113. data/lib/mongo/crypt/kms/kmip/credentials.rb +7 -8
  114. data/lib/mongo/crypt/kms/kmip/master_document.rb +3 -5
  115. data/lib/mongo/crypt/kms/kmip.rb +0 -1
  116. data/lib/mongo/crypt/kms/local/credentials.rb +7 -8
  117. data/lib/mongo/crypt/kms/local/master_document.rb +2 -6
  118. data/lib/mongo/crypt/kms/local.rb +0 -1
  119. data/lib/mongo/crypt/kms/master_key_document.rb +11 -15
  120. data/lib/mongo/crypt/kms.rb +14 -16
  121. data/lib/mongo/crypt/kms_context.rb +0 -2
  122. data/lib/mongo/crypt/rewrap_many_data_key_context.rb +2 -7
  123. data/lib/mongo/crypt/rewrap_many_data_key_result.rb +2 -4
  124. data/lib/mongo/crypt/status.rb +12 -14
  125. data/lib/mongo/crypt.rb +0 -1
  126. data/lib/mongo/csot_timeout_holder.rb +3 -2
  127. data/lib/mongo/cursor/kill_spec.rb +7 -10
  128. data/lib/mongo/cursor.rb +74 -64
  129. data/lib/mongo/cursor_host.rb +8 -10
  130. data/lib/mongo/database/view.rb +16 -37
  131. data/lib/mongo/database.rb +52 -56
  132. data/lib/mongo/dbref.rb +0 -1
  133. data/lib/mongo/distinguishing_semaphore.rb +0 -1
  134. data/lib/mongo/error/auth_error.rb +0 -2
  135. data/lib/mongo/error/bad_load_balancer_target.rb +0 -2
  136. data/lib/mongo/error/bulk_write_error.rb +35 -10
  137. data/lib/mongo/error/change_stream_resumable.rb +0 -2
  138. data/lib/mongo/error/client_closed.rb +0 -2
  139. data/lib/mongo/error/closed_stream.rb +1 -4
  140. data/lib/mongo/error/connection_check_out_timeout.rb +3 -6
  141. data/lib/mongo/error/connection_perished.rb +0 -2
  142. data/lib/mongo/error/connection_unavailable.rb +0 -2
  143. data/lib/mongo/error/credential_check_error.rb +0 -2
  144. data/lib/mongo/error/crypt_error.rb +0 -2
  145. data/lib/mongo/error/extra_file_chunk.rb +1 -4
  146. data/lib/mongo/error/failed_string_prep_validation.rb +5 -6
  147. data/lib/mongo/error/file_not_found.rb +0 -3
  148. data/lib/mongo/error/handshake_error.rb +0 -2
  149. data/lib/mongo/error/insufficient_iteration_count.rb +1 -4
  150. data/lib/mongo/error/internal_driver_error.rb +0 -2
  151. data/lib/mongo/error/invalid_address.rb +0 -2
  152. data/lib/mongo/error/invalid_application_name.rb +0 -3
  153. data/lib/mongo/error/invalid_bulk_operation.rb +1 -4
  154. data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -4
  155. data/lib/mongo/error/invalid_collection_name.rb +1 -4
  156. data/lib/mongo/error/invalid_config_option.rb +0 -3
  157. data/lib/mongo/error/invalid_cursor_operation.rb +0 -2
  158. data/lib/mongo/error/invalid_database_name.rb +1 -4
  159. data/lib/mongo/error/invalid_document.rb +1 -4
  160. data/lib/mongo/error/invalid_file.rb +0 -3
  161. data/lib/mongo/error/invalid_file_revision.rb +0 -3
  162. data/lib/mongo/error/invalid_min_pool_size.rb +0 -3
  163. data/lib/mongo/error/invalid_nonce.rb +0 -3
  164. data/lib/mongo/error/invalid_read_concern.rb +2 -4
  165. data/lib/mongo/error/invalid_read_option.rb +0 -3
  166. data/lib/mongo/error/invalid_replacement_document.rb +2 -5
  167. data/lib/mongo/error/invalid_server_auth_host.rb +0 -2
  168. data/lib/mongo/error/invalid_server_auth_response.rb +0 -2
  169. data/lib/mongo/error/invalid_server_preference.rb +10 -16
  170. data/lib/mongo/error/invalid_session.rb +1 -4
  171. data/lib/mongo/error/invalid_signature.rb +0 -3
  172. data/lib/mongo/error/invalid_transaction_operation.rb +5 -8
  173. data/lib/mongo/error/invalid_txt_record.rb +0 -2
  174. data/lib/mongo/error/invalid_update_document.rb +2 -5
  175. data/lib/mongo/error/invalid_uri.rb +1 -4
  176. data/lib/mongo/error/invalid_write_concern.rb +2 -5
  177. data/lib/mongo/error/kms_error.rb +0 -2
  178. data/lib/mongo/error/labelable.rb +0 -3
  179. data/lib/mongo/error/lint_error.rb +0 -2
  180. data/lib/mongo/error/max_bson_size.rb +8 -11
  181. data/lib/mongo/error/max_message_size.rb +2 -5
  182. data/lib/mongo/error/mismatched_domain.rb +0 -2
  183. data/lib/mongo/error/missing_connection.rb +0 -2
  184. data/lib/mongo/error/missing_file_chunk.rb +0 -3
  185. data/lib/mongo/error/missing_password.rb +0 -2
  186. data/lib/mongo/error/missing_resume_token.rb +1 -4
  187. data/lib/mongo/error/missing_scram_server_signature.rb +2 -4
  188. data/lib/mongo/error/missing_service_id.rb +0 -2
  189. data/lib/mongo/error/mongocryptd_spawn_error.rb +0 -2
  190. data/lib/mongo/error/multi_index_drop.rb +0 -3
  191. data/lib/mongo/error/need_primary_server.rb +0 -2
  192. data/lib/mongo/error/no_server_available.rb +3 -8
  193. data/lib/mongo/error/no_service_connection_available.rb +1 -3
  194. data/lib/mongo/error/no_srv_records.rb +0 -2
  195. data/lib/mongo/error/notable.rb +8 -16
  196. data/lib/mongo/error/operation_failure.rb +62 -36
  197. data/lib/mongo/error/parser.rb +33 -75
  198. data/lib/mongo/error/pool_cleared_error.rb +1 -3
  199. data/lib/mongo/error/pool_closed_error.rb +0 -3
  200. data/lib/mongo/error/pool_error.rb +0 -3
  201. data/lib/mongo/error/pool_paused_error.rb +0 -2
  202. data/lib/mongo/error/raise_original_error.rb +1 -3
  203. data/lib/mongo/error/read_write_retryable.rb +14 -17
  204. data/lib/mongo/error/sdam_error_detection.rb +3 -5
  205. data/lib/mongo/error/server_api_conflict.rb +0 -2
  206. data/lib/mongo/error/server_certificate_revoked.rb +0 -2
  207. data/lib/mongo/error/server_not_usable.rb +0 -2
  208. data/lib/mongo/error/session_ended.rb +1 -3
  209. data/lib/mongo/error/session_not_materialized.rb +1 -3
  210. data/lib/mongo/error/sessions_not_supported.rb +1 -4
  211. data/lib/mongo/error/snapshot_session_invalid_server_version.rb +1 -4
  212. data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +1 -4
  213. data/lib/mongo/error/socket_error.rb +0 -2
  214. data/lib/mongo/error/socket_timeout_error.rb +0 -2
  215. data/lib/mongo/error/transactions_not_supported.rb +3 -6
  216. data/lib/mongo/error/unchangeable_collection_option.rb +1 -4
  217. data/lib/mongo/error/unexpected_chunk_length.rb +0 -3
  218. data/lib/mongo/error/unexpected_response.rb +1 -4
  219. data/lib/mongo/error/unknown_payload_type.rb +0 -3
  220. data/lib/mongo/error/unmet_dependency.rb +0 -2
  221. data/lib/mongo/error/unsupported_array_filters.rb +3 -24
  222. data/lib/mongo/error/unsupported_collation.rb +3 -24
  223. data/lib/mongo/error/unsupported_features.rb +0 -2
  224. data/lib/mongo/error/unsupported_message_type.rb +0 -2
  225. data/lib/mongo/error/unsupported_option.rb +19 -21
  226. data/lib/mongo/error/write_retryable.rb +0 -2
  227. data/lib/mongo/error.rb +10 -24
  228. data/lib/mongo/event/base.rb +0 -2
  229. data/lib/mongo/event/listeners.rb +0 -3
  230. data/lib/mongo/event/publisher.rb +0 -3
  231. data/lib/mongo/event/subscriber.rb +0 -4
  232. data/lib/mongo/event.rb +4 -6
  233. data/lib/mongo/grid/file/chunk.rb +7 -10
  234. data/lib/mongo/grid/file/info.rb +20 -24
  235. data/lib/mongo/grid/file.rb +7 -8
  236. data/lib/mongo/grid/fs_bucket.rb +40 -48
  237. data/lib/mongo/grid/stream/read.rb +25 -35
  238. data/lib/mongo/grid/stream/write.rb +17 -22
  239. data/lib/mongo/grid/stream.rb +2 -4
  240. data/lib/mongo/grid.rb +0 -1
  241. data/lib/mongo/id.rb +0 -1
  242. data/lib/mongo/index/view.rb +49 -48
  243. data/lib/mongo/index.rb +7 -10
  244. data/lib/mongo/lint.rb +31 -37
  245. data/lib/mongo/loggable.rb +5 -8
  246. data/lib/mongo/logger.rb +1 -7
  247. data/lib/mongo/monitoring/cmap_log_subscriber.rb +0 -2
  248. data/lib/mongo/monitoring/command_log_subscriber.rb +25 -33
  249. data/lib/mongo/monitoring/event/cmap/base.rb +0 -2
  250. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -4
  251. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +0 -3
  252. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +1 -4
  253. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +2 -5
  254. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +1 -4
  255. data/lib/mongo/monitoring/event/cmap/connection_created.rb +1 -4
  256. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +1 -4
  257. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +0 -3
  258. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +1 -4
  259. data/lib/mongo/monitoring/event/cmap/pool_created.rb +1 -4
  260. data/lib/mongo/monitoring/event/cmap/pool_ready.rb +1 -4
  261. data/lib/mongo/monitoring/event/cmap.rb +0 -1
  262. data/lib/mongo/monitoring/event/command_failed.rb +5 -9
  263. data/lib/mongo/monitoring/event/command_started.rb +8 -12
  264. data/lib/mongo/monitoring/event/command_succeeded.rb +7 -15
  265. data/lib/mongo/monitoring/event/secure.rb +15 -20
  266. data/lib/mongo/monitoring/event/server_closed.rb +1 -4
  267. data/lib/mongo/monitoring/event/server_description_changed.rb +4 -8
  268. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +5 -10
  269. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +1 -4
  270. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +3 -8
  271. data/lib/mongo/monitoring/event/server_opening.rb +1 -4
  272. data/lib/mongo/monitoring/event/topology_changed.rb +2 -5
  273. data/lib/mongo/monitoring/event/topology_closed.rb +1 -4
  274. data/lib/mongo/monitoring/event/topology_opening.rb +1 -4
  275. data/lib/mongo/monitoring/event.rb +0 -1
  276. data/lib/mongo/monitoring/publishable.rb +20 -30
  277. data/lib/mongo/monitoring/sdam_log_subscriber.rb +0 -2
  278. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +0 -3
  279. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +2 -3
  280. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +0 -3
  281. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +8 -8
  282. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +0 -3
  283. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +0 -3
  284. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +1 -3
  285. data/lib/mongo/monitoring.rb +38 -39
  286. data/lib/mongo/operation/aggregate/op_msg.rb +0 -2
  287. data/lib/mongo/operation/aggregate/result.rb +3 -6
  288. data/lib/mongo/operation/aggregate.rb +0 -2
  289. data/lib/mongo/operation/collections_info/result.rb +0 -3
  290. data/lib/mongo/operation/collections_info.rb +0 -2
  291. data/lib/mongo/operation/command/op_msg.rb +1 -4
  292. data/lib/mongo/operation/command.rb +0 -2
  293. data/lib/mongo/operation/context.rb +13 -16
  294. data/lib/mongo/operation/count/op_msg.rb +2 -4
  295. data/lib/mongo/operation/count.rb +0 -2
  296. data/lib/mongo/operation/create/op_msg.rb +2 -5
  297. data/lib/mongo/operation/create.rb +0 -2
  298. data/lib/mongo/operation/create_index/op_msg.rb +3 -7
  299. data/lib/mongo/operation/create_index.rb +0 -2
  300. data/lib/mongo/operation/create_user/op_msg.rb +2 -4
  301. data/lib/mongo/operation/create_user.rb +0 -2
  302. data/lib/mongo/operation/delete/bulk_result.rb +2 -3
  303. data/lib/mongo/operation/delete/op_msg.rb +3 -10
  304. data/lib/mongo/operation/delete/result.rb +0 -3
  305. data/lib/mongo/operation/delete.rb +1 -5
  306. data/lib/mongo/operation/distinct/op_msg.rb +2 -5
  307. data/lib/mongo/operation/distinct.rb +0 -2
  308. data/lib/mongo/operation/drop/op_msg.rb +0 -2
  309. data/lib/mongo/operation/drop.rb +0 -2
  310. data/lib/mongo/operation/drop_database/op_msg.rb +0 -2
  311. data/lib/mongo/operation/drop_database.rb +0 -2
  312. data/lib/mongo/operation/drop_index/op_msg.rb +4 -6
  313. data/lib/mongo/operation/drop_index.rb +0 -2
  314. data/lib/mongo/operation/explain/op_msg.rb +0 -2
  315. data/lib/mongo/operation/explain/result.rb +0 -3
  316. data/lib/mongo/operation/explain.rb +0 -2
  317. data/lib/mongo/operation/find/builder/command.rb +4 -12
  318. data/lib/mongo/operation/find/builder/flags.rb +9 -15
  319. data/lib/mongo/operation/find/builder/modifiers.rb +1 -4
  320. data/lib/mongo/operation/find/builder.rb +0 -1
  321. data/lib/mongo/operation/find/op_msg.rb +4 -12
  322. data/lib/mongo/operation/find/result.rb +0 -3
  323. data/lib/mongo/operation/find.rb +0 -2
  324. data/lib/mongo/operation/get_more/command_builder.rb +1 -6
  325. data/lib/mongo/operation/get_more/op_msg.rb +10 -4
  326. data/lib/mongo/operation/get_more/result.rb +0 -3
  327. data/lib/mongo/operation/get_more.rb +0 -2
  328. data/lib/mongo/operation/indexes/op_msg.rb +0 -2
  329. data/lib/mongo/operation/indexes/result.rb +1 -5
  330. data/lib/mongo/operation/indexes.rb +0 -2
  331. data/lib/mongo/operation/insert/bulk_result.rb +2 -6
  332. data/lib/mongo/operation/insert/op_msg.rb +2 -4
  333. data/lib/mongo/operation/insert/result.rb +0 -3
  334. data/lib/mongo/operation/insert.rb +2 -5
  335. data/lib/mongo/operation/kill_cursors/command_builder.rb +0 -3
  336. data/lib/mongo/operation/kill_cursors/op_msg.rb +1 -3
  337. data/lib/mongo/operation/kill_cursors.rb +0 -2
  338. data/lib/mongo/operation/list_collections/op_msg.rb +4 -6
  339. data/lib/mongo/operation/list_collections/result.rb +1 -4
  340. data/lib/mongo/operation/list_collections.rb +0 -2
  341. data/lib/mongo/operation/map_reduce/op_msg.rb +0 -2
  342. data/lib/mongo/operation/map_reduce/result.rb +3 -6
  343. data/lib/mongo/operation/map_reduce.rb +0 -2
  344. data/lib/mongo/operation/op_msg_base.rb +0 -1
  345. data/lib/mongo/operation/parallel_scan/op_msg.rb +4 -5
  346. data/lib/mongo/operation/parallel_scan/result.rb +2 -5
  347. data/lib/mongo/operation/parallel_scan.rb +0 -2
  348. data/lib/mongo/operation/remove_user/op_msg.rb +2 -4
  349. data/lib/mongo/operation/remove_user.rb +0 -2
  350. data/lib/mongo/operation/result.rb +38 -47
  351. data/lib/mongo/operation/shared/bypass_document_validation.rb +3 -7
  352. data/lib/mongo/operation/shared/causal_consistency_supported.rb +0 -3
  353. data/lib/mongo/operation/shared/executable.rb +20 -29
  354. data/lib/mongo/operation/shared/executable_no_validate.rb +0 -3
  355. data/lib/mongo/operation/shared/executable_transaction_label.rb +0 -2
  356. data/lib/mongo/operation/shared/idable.rb +3 -6
  357. data/lib/mongo/operation/shared/limited.rb +0 -3
  358. data/lib/mongo/operation/shared/object_id_generator.rb +0 -3
  359. data/lib/mongo/operation/shared/op_msg_executable.rb +0 -2
  360. data/lib/mongo/operation/shared/polymorphic_lookup.rb +0 -2
  361. data/lib/mongo/operation/shared/polymorphic_result.rb +2 -4
  362. data/lib/mongo/operation/shared/read_preference_supported.rb +10 -15
  363. data/lib/mongo/operation/shared/response_handling.rb +13 -26
  364. data/lib/mongo/operation/shared/result/aggregatable.rb +12 -13
  365. data/lib/mongo/operation/shared/sessions_supported.rb +87 -99
  366. data/lib/mongo/operation/shared/specifiable.rb +32 -58
  367. data/lib/mongo/operation/shared/write.rb +12 -17
  368. data/lib/mongo/operation/shared/write_concern_supported.rb +4 -7
  369. data/lib/mongo/operation/update/bulk_result.rb +13 -17
  370. data/lib/mongo/operation/update/op_msg.rb +2 -5
  371. data/lib/mongo/operation/update/result.rb +5 -5
  372. data/lib/mongo/operation/update.rb +1 -5
  373. data/lib/mongo/operation/update_user/op_msg.rb +2 -4
  374. data/lib/mongo/operation/update_user.rb +0 -2
  375. data/lib/mongo/operation/users_info/op_msg.rb +2 -4
  376. data/lib/mongo/operation/users_info/result.rb +1 -4
  377. data/lib/mongo/operation/users_info.rb +0 -2
  378. data/lib/mongo/operation/write_command/op_msg.rb +2 -10
  379. data/lib/mongo/operation/write_command.rb +0 -2
  380. data/lib/mongo/operation.rb +9 -14
  381. data/lib/mongo/options/mapper.rb +8 -15
  382. data/lib/mongo/options/redacted.rb +7 -9
  383. data/lib/mongo/options.rb +0 -1
  384. data/lib/mongo/protocol/bit_vector.rb +3 -5
  385. data/lib/mongo/protocol/caching_hash.rb +2 -7
  386. data/lib/mongo/protocol/compressed.rb +5 -10
  387. data/lib/mongo/protocol/get_more.rb +2 -8
  388. data/lib/mongo/protocol/kill_cursors.rb +2 -8
  389. data/lib/mongo/protocol/message.rb +103 -105
  390. data/lib/mongo/protocol/msg.rb +48 -63
  391. data/lib/mongo/protocol/query.rb +32 -41
  392. data/lib/mongo/protocol/registry.rb +2 -5
  393. data/lib/mongo/protocol/reply.rb +10 -16
  394. data/lib/mongo/protocol/serializers.rb +41 -59
  395. data/lib/mongo/protocol.rb +0 -1
  396. data/lib/mongo/query_cache.rb +7 -15
  397. data/lib/mongo/retryable/backpressure.rb +31 -0
  398. data/lib/mongo/retryable/base_worker.rb +39 -13
  399. data/lib/mongo/retryable/read_worker.rb +77 -21
  400. data/lib/mongo/retryable/retry_policy.rb +59 -0
  401. data/lib/mongo/retryable/write_worker.rb +155 -56
  402. data/lib/mongo/retryable.rb +70 -9
  403. data/lib/mongo/search_index/view.rb +1 -1
  404. data/lib/mongo/semaphore.rb +0 -1
  405. data/lib/mongo/server/app_metadata/environment.rb +3 -3
  406. data/lib/mongo/server/app_metadata.rb +4 -5
  407. data/lib/mongo/server/connection.rb +61 -61
  408. data/lib/mongo/server/connection_base.rb +43 -53
  409. data/lib/mongo/server/connection_common.rb +41 -64
  410. data/lib/mongo/server/connection_pool/generation_manager.rb +6 -11
  411. data/lib/mongo/server/connection_pool/populator.rb +1 -4
  412. data/lib/mongo/server/connection_pool.rb +250 -175
  413. data/lib/mongo/server/description/features.rb +23 -60
  414. data/lib/mongo/server/description/load_balancer.rb +0 -2
  415. data/lib/mongo/server/description.rb +138 -137
  416. data/lib/mongo/server/monitor/app_metadata.rb +3 -4
  417. data/lib/mongo/server/monitor/connection.rb +28 -35
  418. data/lib/mongo/server/monitor.rb +65 -60
  419. data/lib/mongo/server/pending_connection.rb +70 -71
  420. data/lib/mongo/server/push_monitor/connection.rb +0 -3
  421. data/lib/mongo/server/push_monitor.rb +21 -29
  422. data/lib/mongo/server/round_trip_time_calculator.rb +11 -17
  423. data/lib/mongo/server.rb +60 -93
  424. data/lib/mongo/server_selector/base.rb +146 -157
  425. data/lib/mongo/server_selector/nearest.rb +5 -5
  426. data/lib/mongo/server_selector/primary.rb +4 -5
  427. data/lib/mongo/server_selector/primary_preferred.rb +5 -6
  428. data/lib/mongo/server_selector/secondary.rb +5 -6
  429. data/lib/mongo/server_selector/secondary_preferred.rb +4 -5
  430. data/lib/mongo/server_selector.rb +3 -4
  431. data/lib/mongo/session/server_session.rb +6 -7
  432. data/lib/mongo/session/session_pool.rb +20 -34
  433. data/lib/mongo/session.rb +321 -189
  434. data/lib/mongo/socket/ocsp_cache.rb +8 -13
  435. data/lib/mongo/socket/ocsp_verifier.rb +69 -70
  436. data/lib/mongo/socket/ssl.rb +44 -43
  437. data/lib/mongo/socket/tcp.rb +5 -8
  438. data/lib/mongo/socket/unix.rb +0 -4
  439. data/lib/mongo/socket.rb +80 -102
  440. data/lib/mongo/srv/monitor.rb +6 -11
  441. data/lib/mongo/srv/resolver.rb +15 -24
  442. data/lib/mongo/srv/result.rb +18 -24
  443. data/lib/mongo/srv.rb +0 -1
  444. data/lib/mongo/timeout.rb +4 -11
  445. data/lib/mongo/topology_version.rb +8 -13
  446. data/lib/mongo/tracing/open_telemetry/command_tracer.rb +28 -1
  447. data/lib/mongo/tracing/open_telemetry/operation_tracer.rb +1 -1
  448. data/lib/mongo/tracing/open_telemetry/tracer.rb +1 -1
  449. data/lib/mongo/uri/options_mapper.rb +135 -126
  450. data/lib/mongo/uri/srv_protocol.rb +25 -38
  451. data/lib/mongo/uri.rb +95 -139
  452. data/lib/mongo/utils.rb +5 -12
  453. data/lib/mongo/version.rb +1 -1
  454. data/lib/mongo/write_concern/acknowledged.rb +0 -2
  455. data/lib/mongo/write_concern/base.rb +6 -6
  456. data/lib/mongo/write_concern/unacknowledged.rb +0 -2
  457. data/lib/mongo/write_concern.rb +14 -15
  458. data/lib/mongo.rb +2 -3
  459. data/mongo.gemspec +17 -17
  460. metadata +5 -5
  461. data/lib/mongo/error/server_api_not_supported.rb +0 -27
  462. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +0 -32
  463. data/lib/mongo/operation/shared/validatable.rb +0 -87
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 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.
@@ -41,6 +37,8 @@ module Mongo
41
37
  # reads on the server. Hedged reads are not enabled by default. When
42
38
  # specifying this option, it must be in the format: { enabled: true },
43
39
  # where the value of the :enabled key is a boolean value.
40
+ # @deprecated Hedged reads are deprecated in MongoDB Server 8.0 and will
41
+ # be removed in a future version.
44
42
  #
45
43
  # @raise [ Error::InvalidServerPreference ] If tag sets are specified
46
44
  # but not allowed.
@@ -48,15 +46,21 @@ module Mongo
48
46
  # @api private
49
47
  def initialize(options = nil)
50
48
  options = options ? options.dup : {}
51
- if options[:max_staleness] == -1
52
- options.delete(:max_staleness)
53
- end
49
+ options.delete(:max_staleness) if options[:max_staleness] == -1
54
50
  @options = options
55
51
  @tag_sets = options[:tag_sets] || []
56
52
  @max_staleness = options[:max_staleness]
57
53
  @hedge = options[:hedge]
58
54
 
59
55
  validate!
56
+
57
+ return if @hedge.nil?
58
+
59
+ Mongo::Deprecations.warn(
60
+ :hedge_read_preference,
61
+ 'The hedge read preference option is deprecated. Hedged reads are ' \
62
+ 'deprecated in MongoDB Server 8.0 and will be removed in a future version.'
63
+ )
60
64
  end
61
65
 
62
66
  # @return [ Hash ] options The options.
@@ -73,6 +77,9 @@ module Mongo
73
77
 
74
78
  # @return [ Hash | nil ] hedge The document specifying whether to enable
75
79
  # hedged reads.
80
+ #
81
+ # @deprecated Hedged reads are deprecated in MongoDB Server 8.0 and will
82
+ # be removed in a future version.
76
83
  attr_reader :hedge
77
84
 
78
85
  # Get the timeout for server selection.
@@ -88,7 +95,7 @@ module Mongo
88
95
  # a server is selected. Will be removed in version 3.0.
89
96
  def server_selection_timeout
90
97
  @server_selection_timeout ||=
91
- (options[:server_selection_timeout] || ServerSelector::SERVER_SELECTION_TIMEOUT)
98
+ options[:server_selection_timeout] || ServerSelector::SERVER_SELECTION_TIMEOUT
92
99
  end
93
100
 
94
101
  # Get the local threshold boundary for nearest selection in seconds.
@@ -103,7 +110,7 @@ module Mongo
103
110
  # @deprecated This setting is now taken from the cluster options when
104
111
  # a server is selected. Will be removed in version 3.0.
105
112
  def local_threshold
106
- @local_threshold ||= (options[:local_threshold] || ServerSelector::LOCAL_THRESHOLD)
113
+ @local_threshold ||= options[:local_threshold] || ServerSelector::LOCAL_THRESHOLD
107
114
  end
108
115
 
109
116
  # @api private
@@ -161,13 +168,12 @@ module Mongo
161
168
  # @param [ true, false ] ping Whether to ping the server before selection.
162
169
  # Deprecated and ignored.
163
170
  # @param [ Session | nil ] session Optional session to take into account
164
- # for mongos pinning. Added in version 2.10.0.
171
+ # for mongos pinning.
165
172
  # @param [ true | false ] write_aggregation Whether we need a server that
166
173
  # supports writing aggregations (e.g. with $merge/$out) on secondaries.
167
174
  # @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.
175
+ # be selected from only if no other servers are available.
176
+ #
171
177
  # @param [ Float | nil ] :timeout Timeout in seconds for the operation,
172
178
  # if any.
173
179
  #
@@ -197,15 +203,20 @@ module Mongo
197
203
 
198
204
  # Parameters and return values are the same as for select_server, only
199
205
  # the +timeout+ param is renamed to +csot_timeout+.
200
- private def select_server_impl(cluster, ping, session, write_aggregation, deprioritized, csot_timeout)
206
+ private def select_server_impl(cluster, _ping, session, write_aggregation, deprioritized, csot_timeout)
201
207
  if cluster.topology.is_a?(Cluster::Topology::LoadBalanced)
208
+ # In load-balanced mode, release the pinned connection if the session
209
+ # is no longer in a transaction (e.g. after commit or abort).
210
+ if session&.pinned_connection_global_id && !session.in_transaction?
211
+ session.unpin
212
+ end
202
213
  return cluster.servers.first
203
214
  end
204
215
 
205
216
  timeout = cluster.options[:server_selection_timeout] || SERVER_SELECTION_TIMEOUT
206
217
 
207
218
  server_selection_timeout = if csot_timeout && csot_timeout > 0
208
- [timeout, csot_timeout].min
219
+ [ timeout, csot_timeout ].min
209
220
  else
210
221
  timeout
211
222
  end
@@ -214,23 +225,19 @@ module Mongo
214
225
  # and the timeout is zero, fail immediately (since server selection
215
226
  # will take some non-zero amount of time in any case).
216
227
  if server_selection_timeout == 0
217
- msg = "Failing server selection due to zero timeout. " +
218
- " Requested #{name} in cluster: #{cluster.summary}"
228
+ msg = 'Failing server selection due to zero timeout. ' +
229
+ " Requested #{name} in cluster: #{cluster.summary}"
219
230
  raise Error::NoServerAvailable.new(self, cluster, msg)
220
231
  end
221
232
 
222
233
  deadline = Utils.monotonic_time + server_selection_timeout
223
234
 
224
235
  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
236
+ if Mongo::Lint.enabled? && !cluster.sharded?
237
+ raise Error::LintError, "Session has a pinned server in a non-sharded topology: #{topology}"
229
238
  end
230
239
 
231
- if !session.in_transaction?
232
- session.unpin
233
- end
240
+ session.unpin unless session.in_transaction?
234
241
 
235
242
  if server = session.pinned_server
236
243
  # Here we assume that a mongos stays in the topology indefinitely.
@@ -243,7 +250,7 @@ module Mongo
243
250
 
244
251
  unless server.mongos?
245
252
  msg = "The session being used is pinned to the server which is not a mongos: #{server.summary} " +
246
- "(after #{server_selection_timeout} seconds)"
253
+ "(after #{server_selection_timeout} seconds)"
247
254
  raise Error::NoServerAvailable.new(self, cluster, msg)
248
255
  end
249
256
  end
@@ -252,26 +259,22 @@ module Mongo
252
259
  end
253
260
  end
254
261
 
255
- if cluster.replica_set?
256
- validate_max_staleness_value_early!
257
- end
262
+ validate_max_staleness_value_early! if cluster.replica_set?
258
263
 
259
264
  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
265
+ if Lint.enabled? && !cluster.servers.empty?
266
+ raise Error::LintError,
267
+ "Cluster has no addresses but has servers: #{cluster.servers.map(&:inspect).join(', ')}"
264
268
  end
265
- msg = "Cluster has no addresses, and therefore will never have a server"
269
+ msg = 'Cluster has no addresses, and therefore will never have a server'
266
270
  raise Error::NoServerAvailable.new(self, cluster, msg)
267
271
  end
268
272
 
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
273
+ # Add this check in version 3.0.0
274
+ # unless cluster.connected?
275
+ # msg = 'Cluster is disconnected'
276
+ # raise Error::NoServerAvailable.new(self, cluster, msg)
277
+ # end
275
278
 
276
279
  loop do
277
280
  if Lint.enabled?
@@ -287,15 +290,16 @@ module Mongo
287
290
  end
288
291
 
289
292
  server = try_select_server(cluster, write_aggregation: write_aggregation, deprioritized: deprioritized)
293
+ if server.nil? && deprioritized.any?
294
+ server = try_select_server(cluster, write_aggregation: write_aggregation, deprioritized: [])
295
+ end
290
296
 
291
297
  if server
292
298
  unless cluster.topology.compatible?
293
299
  raise Error::UnsupportedFeatures, cluster.topology.compatibility_error.to_s
294
300
  end
295
301
 
296
- if session && session.starting_transaction? && cluster.sharded?
297
- session.pin_to_server(server)
298
- end
302
+ session.pin_to_server(server) if session && session.starting_transaction? && cluster.sharded?
299
303
 
300
304
  return server
301
305
  end
@@ -303,34 +307,28 @@ module Mongo
303
307
  cluster.scan!(false)
304
308
 
305
309
  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
310
+ break unless time_remaining > 0
311
+
312
+ wait_for_server_selection(cluster, time_remaining)
313
+
314
+ # If we wait for server selection, perform another round of
315
+ # attempting to locate a suitable server. Otherwise server selection
316
+ # can raise NoServerAvailable message when the diagnostics
317
+ # reports an available server of the requested type.
316
318
  end
317
319
 
318
320
  msg = "No #{name} server"
319
- if is_a?(ServerSelector::Secondary) && !tag_sets.empty?
320
- msg += " with tag sets: #{tag_sets}"
321
- end
321
+ msg += " with tag sets: #{tag_sets}" if is_a?(ServerSelector::Secondary) && !tag_sets.empty?
322
322
  msg += " is available in cluster: #{cluster.summary} " +
323
- "with timeout=#{server_selection_timeout}, " +
324
- "LT=#{local_threshold_with_cluster(cluster)}"
323
+ "with timeout=#{server_selection_timeout}, " +
324
+ "LT=#{local_threshold_with_cluster(cluster)}"
325
325
  msg += server_selection_diagnostic_message(cluster)
326
326
  raise Error::NoServerAvailable.new(self, cluster, msg)
327
327
  rescue Error::NoServerAvailable => e
328
328
  if session && session.in_transaction? && !session.committing_transaction?
329
329
  e.add_label('TransientTransactionError')
330
330
  end
331
- if session && session.committing_transaction?
332
- e.add_label('UnknownTransactionCommitResult')
333
- end
331
+ e.add_label('UnknownTransactionCommitResult') if session && session.committing_transaction?
334
332
  raise e
335
333
  end
336
334
 
@@ -351,40 +349,36 @@ module Mongo
351
349
  # @api private
352
350
  def try_select_server(cluster, write_aggregation: false, deprioritized: [])
353
351
  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
352
+ # 1. Check if ALL servers in cluster support secondary writes.
353
+ is_write_supported = cluster.servers.reduce(true) do |res, server|
354
+ res && server.features.merge_out_on_secondary_enabled?
355
+ end
356
+
357
+ if is_write_supported
358
+ # 2. If all servers support secondary writes, we respect read preference.
359
+ suitable_servers(cluster, deprioritized)
360
+ else
361
+ # 3. Otherwise we fallback to primary for replica set.
362
+ [ cluster.servers.detect(&:primary?) ]
363
+ end
364
+ else
365
+ suitable_servers(cluster, deprioritized)
366
+ end
369
367
 
370
368
  # This list of servers may be ordered in a specific way
371
369
  # by the selector (e.g. for secondary preferred, the first
372
370
  # server may be a secondary and the second server may be primary)
373
371
  # and we should take the first server here respecting the order
374
- server = suitable_server(servers, deprioritized)
372
+ server = suitable_server(servers)
375
373
 
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
374
+ if server && Lint.enabled? && server.average_round_trip_time.nil?
375
+ # It is possible for a server to have a nil average RTT here
376
+ # because the ARTT comes from description which may be updated
377
+ # by a background thread while server selection is running.
378
+ # Currently lint mode is not a public feature, if/when this
379
+ # changes (https://jira.mongodb.org/browse/RUBY-1576) the
380
+ # requirement for ARTT to be not nil would need to be removed.
381
+ raise Error::LintError, "Server #{server.address} has nil average rtt"
388
382
  end
389
383
 
390
384
  server
@@ -396,15 +390,14 @@ module Mongo
396
390
  # latency filtering.
397
391
  #
398
392
  # @param [ Cluster ] cluster The cluster.
393
+ # @param [ Array<Server> ] deprioritized A list of servers that should
394
+ # be selected from only if no other servers are available.
399
395
  #
400
396
  # @return [ Array<Server> ] The candidate servers.
401
397
  #
402
398
  # @api private
403
- def candidates(cluster)
404
- servers = cluster.servers
405
- servers.each do |server|
406
- validate_max_staleness_support!(server)
407
- end
399
+ def candidates(cluster, deprioritized = [])
400
+ servers = cluster.servers.reject { |s| deprioritized.include?(s) }
408
401
  if cluster.single?
409
402
  servers
410
403
  elsif cluster.sharded?
@@ -420,44 +413,55 @@ module Mongo
420
413
  # Returns servers satisfying the server selector from the cluster.
421
414
  #
422
415
  # @param [ Cluster ] cluster The cluster.
416
+ # @param [ Array<Server> ] deprioritized A list of servers that should
417
+ # be selected from only if no other servers are available.
423
418
  #
424
419
  # @return [ Array<Server> ] The suitable servers.
425
420
  #
426
421
  # @api private
427
- def suitable_servers(cluster)
422
+ def suitable_servers(cluster, deprioritized = [])
423
+ result = suitable_servers_impl(cluster, deprioritized)
424
+ result = suitable_servers_impl(cluster, []) if result.empty? && deprioritized.any?
425
+ result
426
+ end
427
+
428
+ private
429
+
430
+ # Internal implementation of suitable_servers that applies deprioritization
431
+ # filtering to the candidate servers.
432
+ #
433
+ # @param [ Cluster ] cluster The cluster.
434
+ # @param [ Array<Server> ] deprioritized A list of servers that should
435
+ # be excluded from the candidate pool.
436
+ #
437
+ # @return [ Array<Server> ] The suitable servers.
438
+ #
439
+ # @api private
440
+ def suitable_servers_impl(cluster, deprioritized)
428
441
  if cluster.single?
429
- candidates(cluster)
442
+ candidates(cluster, deprioritized)
430
443
  elsif cluster.sharded?
431
444
  local_threshold = local_threshold_with_cluster(cluster)
432
- servers = candidates(cluster)
445
+ servers = candidates(cluster, deprioritized)
433
446
  near_servers(servers, local_threshold)
434
447
  elsif cluster.replica_set?
435
448
  validate_max_staleness_value!(cluster)
436
- candidates(cluster)
449
+ candidates(cluster, deprioritized)
437
450
  else
438
451
  # Unknown cluster - no servers
439
452
  []
440
453
  end
441
454
  end
442
455
 
443
- private
444
-
445
456
  # Returns a server from the list of servers that is suitable for
446
457
  # executing the operation.
447
458
  #
448
459
  # @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
460
  #
452
461
  # @return [ Server | nil ] The suitable server or nil if no suitable
453
462
  # 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
463
+ def suitable_server(servers)
464
+ servers.first
461
465
  end
462
466
 
463
467
  # Convert this server preference definition into a format appropriate
@@ -468,7 +472,7 @@ module Mongo
468
472
  # @since 2.0.0
469
473
  def full_doc
470
474
  @full_doc ||= begin
471
- preference = { :mode => self.class.const_get(:SERVER_FORMATTED_NAME) }
475
+ preference = { mode: self.class.const_get(:SERVER_FORMATTED_NAME) }
472
476
  preference.update(tags: tag_sets) unless tag_sets.empty?
473
477
  preference.update(maxStalenessSeconds: max_staleness) if max_staleness
474
478
  preference.update(hedge: hedge) if hedge
@@ -529,7 +533,7 @@ module Mongo
529
533
  # of this method.
530
534
 
531
535
  candidates = candidates.map do |server|
532
- {server: server, artt: server.average_round_trip_time}
536
+ { server: server, artt: server.average_round_trip_time }
533
537
  end.reject do |candidate|
534
538
  candidate[:artt].nil?
535
539
  end
@@ -540,7 +544,7 @@ module Mongo
540
544
  candidate[:artt]
541
545
  end
542
546
 
543
- # Default for legacy signarure
547
+ # Default for legacy signature
544
548
  local_threshold ||= self.local_threshold
545
549
 
546
550
  threshold = nearest_candidate[:artt] + local_threshold
@@ -578,16 +582,14 @@ module Mongo
578
582
  # last_scan here.
579
583
  if primary
580
584
  candidates.select do |server|
581
- validate_max_staleness_support!(server)
582
585
  staleness = (server.last_scan - server.last_write_date) -
583
- (primary.last_scan - primary.last_write_date) +
586
+ (primary.last_scan - primary.last_write_date) +
584
587
  server.cluster.heartbeat_interval
585
588
  staleness <= @max_staleness
586
589
  end
587
590
  else
588
591
  max_write_date = candidates.collect(&:last_write_date).max
589
592
  candidates.select do |server|
590
- validate_max_staleness_support!(server)
591
593
  staleness = max_write_date - server.last_write_date + server.cluster.heartbeat_interval
592
594
  staleness <= @max_staleness
593
595
  end
@@ -601,49 +603,39 @@ module Mongo
601
603
  raise Error::InvalidServerPreference.new(Error::InvalidServerPreference::NO_MAX_STALENESS_SUPPORT)
602
604
  end
603
605
 
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
606
+ return unless @hedge
607
+ raise Error::InvalidServerPreference.new(Error::InvalidServerPreference::NO_HEDGE_SUPPORT) unless hedge_allowed?
618
608
 
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)
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
+ )
622
615
  end
623
616
  end
624
617
 
625
618
  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 " +
619
+ return unless @max_staleness
620
+ return if @max_staleness >= SMALLEST_MAX_STALENESS_SECONDS
621
+
622
+ msg = "`max_staleness` value (#{@max_staleness}) is too small - it must be at least " +
629
623
  "`Mongo::ServerSelector::SMALLEST_MAX_STALENESS_SECONDS` (#{ServerSelector::SMALLEST_MAX_STALENESS_SECONDS})"
630
- raise Error::InvalidServerPreference.new(msg)
631
- end
632
- end
624
+ raise Error::InvalidServerPreference.new(msg)
633
625
  end
634
626
 
635
627
  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
628
+ return unless @max_staleness
629
+
630
+ heartbeat_interval = cluster.heartbeat_interval
631
+ unless @max_staleness >= [
632
+ SMALLEST_MAX_STALENESS_SECONDS,
633
+ min_cluster_staleness = heartbeat_interval + Cluster::IDLE_WRITE_PERIOD_SECONDS,
634
+ ].max
635
+ msg = "`max_staleness` value (#{@max_staleness}) is too small - it must be at least " +
636
+ "`Mongo::ServerSelector::SMALLEST_MAX_STALENESS_SECONDS` (#{ServerSelector::SMALLEST_MAX_STALENESS_SECONDS}) and (the cluster's heartbeat_frequency " +
637
+ "setting + `Mongo::Cluster::IDLE_WRITE_PERIOD_SECONDS`) (#{min_cluster_staleness})"
638
+ raise Error::InvalidServerPreference.new(msg)
647
639
  end
648
640
  end
649
641
 
@@ -669,12 +661,13 @@ module Mongo
669
661
  # the servers list earlier and the wait call below, we should not
670
662
  # wait for the full remaining time - wait for up to 0.5 second, then
671
663
  # recheck the state.
672
- cluster.server_selection_semaphore.wait([time_remaining, 0.5].min)
664
+ cluster.server_selection_semaphore.wait([ time_remaining, 0.5 ].min)
673
665
  else
674
666
  if Lint.enabled?
675
667
  raise Error::LintError, 'Waiting for server selection without having a server selection semaphore'
676
668
  end
677
- sleep [time_remaining, 0.25].min
669
+
670
+ sleep [ time_remaining, 0.25 ].min
678
671
  end
679
672
  end
680
673
 
@@ -696,17 +689,13 @@ module Mongo
696
689
  msg = ''
697
690
  dead_monitors = []
698
691
  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
692
+ thread = server.monitor.instance_variable_get(:@thread)
693
+ dead_monitors << server if thread.nil? || !thread.alive?
703
694
  end
704
695
  if dead_monitors.any?
705
696
  msg += ". The following servers have dead monitor threads: #{dead_monitors.map(&:summary).join(', ')}"
706
697
  end
707
- unless cluster.connected?
708
- msg += ". The cluster is disconnected (client may have been closed)"
709
- end
698
+ msg += '. The cluster is disconnected (client may have been closed)' unless cluster.connected?
710
699
  msg
711
700
  end
712
701
  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
  #
@@ -62,6 +59,9 @@ module Mongo
62
59
  # Whether the hedge option is allowed to be defined for this server preference.
63
60
  #
64
61
  # @return [ true ] true
62
+ #
63
+ # @deprecated Hedged reads are deprecated in MongoDB Server 8.0 and will
64
+ # be removed in a future version.
65
65
  def hedge_allowed?
66
66
  true
67
67
  end
@@ -86,7 +86,7 @@ module Mongo
86
86
  # command field value.
87
87
  #
88
88
  # @since 2.0.0
89
- alias :to_mongos :to_doc
89
+ alias to_mongos to_doc
90
90
 
91
91
  private
92
92
 
@@ -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
  #
@@ -63,6 +59,9 @@ module Mongo
63
59
  # Whether the hedge option is allowed to be defined for this server preference.
64
60
  #
65
61
  # @return [ false ] false
62
+ #
63
+ # @deprecated Hedged reads are deprecated in MongoDB Server 8.0 and will
64
+ # be removed in a future version.
66
65
  def hedge_allowed?
67
66
  false
68
67
  end