mongo 2.23.0 → 2.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (463) hide show
  1. checksums.yaml +4 -4
  2. data/bin/mongo_console +0 -1
  3. data/lib/mongo/active_support.rb +1 -2
  4. data/lib/mongo/address/ipv4.rb +3 -6
  5. data/lib/mongo/address/ipv6.rb +6 -10
  6. data/lib/mongo/address/unix.rb +1 -4
  7. data/lib/mongo/address/validator.rb +16 -28
  8. data/lib/mongo/address.rb +30 -40
  9. data/lib/mongo/auth/aws/conversation.rb +6 -10
  10. data/lib/mongo/auth/aws/credentials.rb +0 -1
  11. data/lib/mongo/auth/aws/credentials_cache.rb +0 -1
  12. data/lib/mongo/auth/aws/credentials_retriever.rb +45 -59
  13. data/lib/mongo/auth/aws/request.rb +20 -35
  14. data/lib/mongo/auth/aws.rb +1 -2
  15. data/lib/mongo/auth/base.rb +20 -29
  16. data/lib/mongo/auth/conversation_base.rb +14 -18
  17. data/lib/mongo/auth/cr/conversation.rb +0 -3
  18. data/lib/mongo/auth/cr.rb +1 -4
  19. data/lib/mongo/auth/credential_cache.rb +0 -2
  20. data/lib/mongo/auth/gssapi/conversation.rb +3 -8
  21. data/lib/mongo/auth/gssapi.rb +1 -4
  22. data/lib/mongo/auth/ldap/conversation.rb +0 -3
  23. data/lib/mongo/auth/ldap.rb +1 -4
  24. data/lib/mongo/auth/roles.rb +16 -19
  25. data/lib/mongo/auth/sasl_conversation_base.rb +7 -11
  26. data/lib/mongo/auth/scram/conversation.rb +2 -5
  27. data/lib/mongo/auth/scram.rb +5 -10
  28. data/lib/mongo/auth/scram256/conversation.rb +2 -5
  29. data/lib/mongo/auth/scram256.rb +1 -3
  30. data/lib/mongo/auth/scram_conversation_base.rb +18 -24
  31. data/lib/mongo/auth/stringprep/profiles/sasl.rb +17 -18
  32. data/lib/mongo/auth/stringprep/tables.rb +2209 -2210
  33. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +36 -38
  34. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1142 -1150
  35. data/lib/mongo/auth/stringprep.rb +9 -12
  36. data/lib/mongo/auth/user/view.rb +3 -5
  37. data/lib/mongo/auth/user.rb +14 -24
  38. data/lib/mongo/auth/x509/conversation.rb +0 -3
  39. data/lib/mongo/auth/x509.rb +7 -9
  40. data/lib/mongo/auth.rb +18 -30
  41. data/lib/mongo/background_thread.rb +9 -17
  42. data/lib/mongo/bson.rb +0 -2
  43. data/lib/mongo/bulk_write/combineable.rb +0 -3
  44. data/lib/mongo/bulk_write/ordered_combiner.rb +1 -3
  45. data/lib/mongo/bulk_write/result.rb +11 -16
  46. data/lib/mongo/bulk_write/result_combiner.rb +9 -12
  47. data/lib/mongo/bulk_write/transformable.rb +16 -19
  48. data/lib/mongo/bulk_write/unordered_combiner.rb +1 -3
  49. data/lib/mongo/bulk_write/validatable.rb +11 -18
  50. data/lib/mongo/bulk_write.rb +76 -91
  51. data/lib/mongo/caching_cursor.rb +2 -7
  52. data/lib/mongo/client.rb +230 -275
  53. data/lib/mongo/client_encryption.rb +4 -5
  54. data/lib/mongo/cluster/periodic_executor.rb +2 -5
  55. data/lib/mongo/cluster/reapers/cursor_reaper.rb +21 -29
  56. data/lib/mongo/cluster/reapers/socket_reaper.rb +1 -6
  57. data/lib/mongo/cluster/sdam_flow.rb +136 -159
  58. data/lib/mongo/cluster/topology/base.rb +15 -18
  59. data/lib/mongo/cluster/topology/load_balanced.rb +24 -14
  60. data/lib/mongo/cluster/topology/no_replica_set_options.rb +3 -6
  61. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +20 -23
  62. data/lib/mongo/cluster/topology/replica_set_with_primary.rb +0 -2
  63. data/lib/mongo/cluster/topology/sharded.rb +19 -9
  64. data/lib/mongo/cluster/topology/single.rb +24 -14
  65. data/lib/mongo/cluster/topology/unknown.rb +20 -10
  66. data/lib/mongo/cluster/topology.rb +29 -25
  67. data/lib/mongo/cluster.rb +148 -183
  68. data/lib/mongo/cluster_time.rb +14 -31
  69. data/lib/mongo/collection/helpers.rb +5 -8
  70. data/lib/mongo/collection/view/aggregation.rb +5 -10
  71. data/lib/mongo/collection/view/builder/aggregation.rb +6 -9
  72. data/lib/mongo/collection/view/builder/map_reduce.rb +18 -17
  73. data/lib/mongo/collection/view/builder.rb +0 -1
  74. data/lib/mongo/collection/view/change_stream/retryable.rb +3 -8
  75. data/lib/mongo/collection/view/change_stream.rb +59 -58
  76. data/lib/mongo/collection/view/explainable.rb +11 -20
  77. data/lib/mongo/collection/view/immutable.rb +1 -3
  78. data/lib/mongo/collection/view/iterable.rb +35 -28
  79. data/lib/mongo/collection/view/map_reduce.rb +20 -25
  80. data/lib/mongo/collection/view/readable.rb +50 -57
  81. data/lib/mongo/collection/view/writable.rb +56 -72
  82. data/lib/mongo/collection/view.rb +9 -8
  83. data/lib/mongo/collection.rb +63 -76
  84. data/lib/mongo/condition_variable.rb +4 -4
  85. data/lib/mongo/config/options.rb +0 -3
  86. data/lib/mongo/config/validators/option.rb +3 -5
  87. data/lib/mongo/config.rb +2 -4
  88. data/lib/mongo/crypt/auto_decryption_context.rb +0 -3
  89. data/lib/mongo/crypt/auto_encrypter.rb +34 -43
  90. data/lib/mongo/crypt/auto_encryption_context.rb +0 -3
  91. data/lib/mongo/crypt/binary.rb +5 -9
  92. data/lib/mongo/crypt/binding.rb +149 -155
  93. data/lib/mongo/crypt/context.rb +10 -17
  94. data/lib/mongo/crypt/data_key_context.rb +2 -7
  95. data/lib/mongo/crypt/encryption_io.rb +29 -39
  96. data/lib/mongo/crypt/explicit_decryption_context.rb +0 -3
  97. data/lib/mongo/crypt/explicit_encrypter.rb +1 -1
  98. data/lib/mongo/crypt/explicit_encryption_context.rb +19 -30
  99. data/lib/mongo/crypt/explicit_encryption_expression_context.rb +0 -2
  100. data/lib/mongo/crypt/handle.rb +42 -48
  101. data/lib/mongo/crypt/hooks.rb +12 -15
  102. data/lib/mongo/crypt/kms/aws/credentials.rb +12 -16
  103. data/lib/mongo/crypt/kms/aws/master_document.rb +6 -9
  104. data/lib/mongo/crypt/kms/aws.rb +0 -2
  105. data/lib/mongo/crypt/kms/azure/credentials_retriever.rb +2 -7
  106. data/lib/mongo/crypt/kms/azure/master_document.rb +15 -19
  107. data/lib/mongo/crypt/kms/azure.rb +0 -1
  108. data/lib/mongo/crypt/kms/credentials.rb +13 -27
  109. data/lib/mongo/crypt/kms/gcp/credentials.rb +12 -14
  110. data/lib/mongo/crypt/kms/gcp/credentials_retriever.rb +7 -9
  111. data/lib/mongo/crypt/kms/gcp/master_document.rb +12 -16
  112. data/lib/mongo/crypt/kms/gcp.rb +0 -2
  113. data/lib/mongo/crypt/kms/kmip/credentials.rb +7 -8
  114. data/lib/mongo/crypt/kms/kmip/master_document.rb +3 -5
  115. data/lib/mongo/crypt/kms/kmip.rb +0 -1
  116. data/lib/mongo/crypt/kms/local/credentials.rb +7 -8
  117. data/lib/mongo/crypt/kms/local/master_document.rb +2 -6
  118. data/lib/mongo/crypt/kms/local.rb +0 -1
  119. data/lib/mongo/crypt/kms/master_key_document.rb +11 -15
  120. data/lib/mongo/crypt/kms.rb +14 -16
  121. data/lib/mongo/crypt/kms_context.rb +0 -2
  122. data/lib/mongo/crypt/rewrap_many_data_key_context.rb +2 -7
  123. data/lib/mongo/crypt/rewrap_many_data_key_result.rb +2 -4
  124. data/lib/mongo/crypt/status.rb +12 -14
  125. data/lib/mongo/crypt.rb +0 -1
  126. data/lib/mongo/csot_timeout_holder.rb +3 -2
  127. data/lib/mongo/cursor/kill_spec.rb +7 -10
  128. data/lib/mongo/cursor.rb +74 -64
  129. data/lib/mongo/cursor_host.rb +8 -10
  130. data/lib/mongo/database/view.rb +16 -37
  131. data/lib/mongo/database.rb +52 -56
  132. data/lib/mongo/dbref.rb +0 -1
  133. data/lib/mongo/distinguishing_semaphore.rb +0 -1
  134. data/lib/mongo/error/auth_error.rb +0 -2
  135. data/lib/mongo/error/bad_load_balancer_target.rb +0 -2
  136. data/lib/mongo/error/bulk_write_error.rb +7 -10
  137. data/lib/mongo/error/change_stream_resumable.rb +0 -2
  138. data/lib/mongo/error/client_closed.rb +0 -2
  139. data/lib/mongo/error/closed_stream.rb +1 -4
  140. data/lib/mongo/error/connection_check_out_timeout.rb +3 -6
  141. data/lib/mongo/error/connection_perished.rb +0 -2
  142. data/lib/mongo/error/connection_unavailable.rb +0 -2
  143. data/lib/mongo/error/credential_check_error.rb +0 -2
  144. data/lib/mongo/error/crypt_error.rb +0 -2
  145. data/lib/mongo/error/extra_file_chunk.rb +1 -4
  146. data/lib/mongo/error/failed_string_prep_validation.rb +5 -6
  147. data/lib/mongo/error/file_not_found.rb +0 -3
  148. data/lib/mongo/error/handshake_error.rb +0 -2
  149. data/lib/mongo/error/insufficient_iteration_count.rb +1 -4
  150. data/lib/mongo/error/internal_driver_error.rb +0 -2
  151. data/lib/mongo/error/invalid_address.rb +0 -2
  152. data/lib/mongo/error/invalid_application_name.rb +0 -3
  153. data/lib/mongo/error/invalid_bulk_operation.rb +1 -4
  154. data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -4
  155. data/lib/mongo/error/invalid_collection_name.rb +1 -4
  156. data/lib/mongo/error/invalid_config_option.rb +0 -3
  157. data/lib/mongo/error/invalid_cursor_operation.rb +0 -2
  158. data/lib/mongo/error/invalid_database_name.rb +1 -4
  159. data/lib/mongo/error/invalid_document.rb +1 -4
  160. data/lib/mongo/error/invalid_file.rb +0 -3
  161. data/lib/mongo/error/invalid_file_revision.rb +0 -3
  162. data/lib/mongo/error/invalid_min_pool_size.rb +0 -3
  163. data/lib/mongo/error/invalid_nonce.rb +0 -3
  164. data/lib/mongo/error/invalid_read_concern.rb +2 -4
  165. data/lib/mongo/error/invalid_read_option.rb +0 -3
  166. data/lib/mongo/error/invalid_replacement_document.rb +2 -5
  167. data/lib/mongo/error/invalid_server_auth_host.rb +0 -2
  168. data/lib/mongo/error/invalid_server_auth_response.rb +0 -2
  169. data/lib/mongo/error/invalid_server_preference.rb +7 -16
  170. data/lib/mongo/error/invalid_session.rb +1 -4
  171. data/lib/mongo/error/invalid_signature.rb +0 -3
  172. data/lib/mongo/error/invalid_transaction_operation.rb +5 -8
  173. data/lib/mongo/error/invalid_txt_record.rb +0 -2
  174. data/lib/mongo/error/invalid_update_document.rb +2 -5
  175. data/lib/mongo/error/invalid_uri.rb +1 -4
  176. data/lib/mongo/error/invalid_write_concern.rb +2 -5
  177. data/lib/mongo/error/kms_error.rb +0 -2
  178. data/lib/mongo/error/labelable.rb +0 -3
  179. data/lib/mongo/error/lint_error.rb +0 -2
  180. data/lib/mongo/error/max_bson_size.rb +8 -11
  181. data/lib/mongo/error/max_message_size.rb +2 -5
  182. data/lib/mongo/error/mismatched_domain.rb +0 -2
  183. data/lib/mongo/error/missing_connection.rb +0 -2
  184. data/lib/mongo/error/missing_file_chunk.rb +0 -3
  185. data/lib/mongo/error/missing_password.rb +0 -2
  186. data/lib/mongo/error/missing_resume_token.rb +1 -4
  187. data/lib/mongo/error/missing_scram_server_signature.rb +2 -4
  188. data/lib/mongo/error/missing_service_id.rb +0 -2
  189. data/lib/mongo/error/mongocryptd_spawn_error.rb +0 -2
  190. data/lib/mongo/error/multi_index_drop.rb +0 -3
  191. data/lib/mongo/error/need_primary_server.rb +0 -2
  192. data/lib/mongo/error/no_server_available.rb +3 -8
  193. data/lib/mongo/error/no_service_connection_available.rb +1 -3
  194. data/lib/mongo/error/no_srv_records.rb +0 -2
  195. data/lib/mongo/error/notable.rb +8 -16
  196. data/lib/mongo/error/operation_failure.rb +22 -35
  197. data/lib/mongo/error/parser.rb +33 -75
  198. data/lib/mongo/error/pool_cleared_error.rb +1 -3
  199. data/lib/mongo/error/pool_closed_error.rb +0 -3
  200. data/lib/mongo/error/pool_error.rb +0 -3
  201. data/lib/mongo/error/pool_paused_error.rb +0 -2
  202. data/lib/mongo/error/raise_original_error.rb +1 -3
  203. data/lib/mongo/error/read_write_retryable.rb +14 -17
  204. data/lib/mongo/error/sdam_error_detection.rb +3 -5
  205. data/lib/mongo/error/server_api_conflict.rb +0 -2
  206. data/lib/mongo/error/server_certificate_revoked.rb +0 -2
  207. data/lib/mongo/error/server_not_usable.rb +0 -2
  208. data/lib/mongo/error/session_ended.rb +1 -3
  209. data/lib/mongo/error/session_not_materialized.rb +1 -3
  210. data/lib/mongo/error/sessions_not_supported.rb +1 -4
  211. data/lib/mongo/error/snapshot_session_invalid_server_version.rb +1 -4
  212. data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +1 -4
  213. data/lib/mongo/error/socket_error.rb +0 -2
  214. data/lib/mongo/error/socket_timeout_error.rb +0 -2
  215. data/lib/mongo/error/transactions_not_supported.rb +3 -6
  216. data/lib/mongo/error/unchangeable_collection_option.rb +1 -4
  217. data/lib/mongo/error/unexpected_chunk_length.rb +0 -3
  218. data/lib/mongo/error/unexpected_response.rb +1 -4
  219. data/lib/mongo/error/unknown_payload_type.rb +0 -3
  220. data/lib/mongo/error/unmet_dependency.rb +0 -2
  221. data/lib/mongo/error/unsupported_array_filters.rb +3 -24
  222. data/lib/mongo/error/unsupported_collation.rb +3 -24
  223. data/lib/mongo/error/unsupported_features.rb +0 -2
  224. data/lib/mongo/error/unsupported_message_type.rb +0 -2
  225. data/lib/mongo/error/unsupported_option.rb +19 -21
  226. data/lib/mongo/error/write_retryable.rb +0 -2
  227. data/lib/mongo/error.rb +10 -24
  228. data/lib/mongo/event/base.rb +0 -2
  229. data/lib/mongo/event/listeners.rb +0 -3
  230. data/lib/mongo/event/publisher.rb +0 -3
  231. data/lib/mongo/event/subscriber.rb +0 -4
  232. data/lib/mongo/event.rb +4 -6
  233. data/lib/mongo/grid/file/chunk.rb +7 -10
  234. data/lib/mongo/grid/file/info.rb +20 -24
  235. data/lib/mongo/grid/file.rb +7 -8
  236. data/lib/mongo/grid/fs_bucket.rb +40 -48
  237. data/lib/mongo/grid/stream/read.rb +25 -35
  238. data/lib/mongo/grid/stream/write.rb +17 -22
  239. data/lib/mongo/grid/stream.rb +2 -4
  240. data/lib/mongo/grid.rb +0 -1
  241. data/lib/mongo/id.rb +0 -1
  242. data/lib/mongo/index/view.rb +49 -48
  243. data/lib/mongo/index.rb +7 -10
  244. data/lib/mongo/lint.rb +31 -37
  245. data/lib/mongo/loggable.rb +5 -8
  246. data/lib/mongo/logger.rb +1 -7
  247. data/lib/mongo/monitoring/cmap_log_subscriber.rb +0 -2
  248. data/lib/mongo/monitoring/command_log_subscriber.rb +25 -33
  249. data/lib/mongo/monitoring/event/cmap/base.rb +0 -2
  250. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -4
  251. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +0 -3
  252. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +1 -4
  253. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +2 -5
  254. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +1 -4
  255. data/lib/mongo/monitoring/event/cmap/connection_created.rb +1 -4
  256. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +1 -4
  257. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +0 -3
  258. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +1 -4
  259. data/lib/mongo/monitoring/event/cmap/pool_created.rb +1 -4
  260. data/lib/mongo/monitoring/event/cmap/pool_ready.rb +1 -4
  261. data/lib/mongo/monitoring/event/cmap.rb +0 -1
  262. data/lib/mongo/monitoring/event/command_failed.rb +5 -9
  263. data/lib/mongo/monitoring/event/command_started.rb +8 -12
  264. data/lib/mongo/monitoring/event/command_succeeded.rb +7 -15
  265. data/lib/mongo/monitoring/event/secure.rb +15 -20
  266. data/lib/mongo/monitoring/event/server_closed.rb +1 -4
  267. data/lib/mongo/monitoring/event/server_description_changed.rb +4 -8
  268. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +5 -10
  269. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +1 -4
  270. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +3 -8
  271. data/lib/mongo/monitoring/event/server_opening.rb +1 -4
  272. data/lib/mongo/monitoring/event/topology_changed.rb +2 -5
  273. data/lib/mongo/monitoring/event/topology_closed.rb +1 -4
  274. data/lib/mongo/monitoring/event/topology_opening.rb +1 -4
  275. data/lib/mongo/monitoring/event.rb +0 -1
  276. data/lib/mongo/monitoring/publishable.rb +20 -30
  277. data/lib/mongo/monitoring/sdam_log_subscriber.rb +0 -2
  278. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +0 -3
  279. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +0 -3
  280. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +0 -3
  281. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +5 -8
  282. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +0 -3
  283. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +0 -3
  284. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +1 -3
  285. data/lib/mongo/monitoring.rb +38 -39
  286. data/lib/mongo/operation/aggregate/op_msg.rb +0 -2
  287. data/lib/mongo/operation/aggregate/result.rb +3 -6
  288. data/lib/mongo/operation/aggregate.rb +0 -2
  289. data/lib/mongo/operation/collections_info/result.rb +0 -3
  290. data/lib/mongo/operation/collections_info.rb +0 -2
  291. data/lib/mongo/operation/command/op_msg.rb +1 -4
  292. data/lib/mongo/operation/command.rb +0 -2
  293. data/lib/mongo/operation/context.rb +13 -16
  294. data/lib/mongo/operation/count/op_msg.rb +2 -4
  295. data/lib/mongo/operation/count.rb +0 -2
  296. data/lib/mongo/operation/create/op_msg.rb +2 -5
  297. data/lib/mongo/operation/create.rb +0 -2
  298. data/lib/mongo/operation/create_index/op_msg.rb +3 -7
  299. data/lib/mongo/operation/create_index.rb +0 -2
  300. data/lib/mongo/operation/create_user/op_msg.rb +2 -4
  301. data/lib/mongo/operation/create_user.rb +0 -2
  302. data/lib/mongo/operation/delete/bulk_result.rb +2 -3
  303. data/lib/mongo/operation/delete/op_msg.rb +3 -10
  304. data/lib/mongo/operation/delete/result.rb +0 -3
  305. data/lib/mongo/operation/delete.rb +1 -5
  306. data/lib/mongo/operation/distinct/op_msg.rb +2 -5
  307. data/lib/mongo/operation/distinct.rb +0 -2
  308. data/lib/mongo/operation/drop/op_msg.rb +0 -2
  309. data/lib/mongo/operation/drop.rb +0 -2
  310. data/lib/mongo/operation/drop_database/op_msg.rb +0 -2
  311. data/lib/mongo/operation/drop_database.rb +0 -2
  312. data/lib/mongo/operation/drop_index/op_msg.rb +4 -6
  313. data/lib/mongo/operation/drop_index.rb +0 -2
  314. data/lib/mongo/operation/explain/op_msg.rb +0 -2
  315. data/lib/mongo/operation/explain/result.rb +0 -3
  316. data/lib/mongo/operation/explain.rb +0 -2
  317. data/lib/mongo/operation/find/builder/command.rb +4 -12
  318. data/lib/mongo/operation/find/builder/flags.rb +9 -15
  319. data/lib/mongo/operation/find/builder/modifiers.rb +1 -4
  320. data/lib/mongo/operation/find/builder.rb +0 -1
  321. data/lib/mongo/operation/find/op_msg.rb +4 -12
  322. data/lib/mongo/operation/find/result.rb +0 -3
  323. data/lib/mongo/operation/find.rb +0 -2
  324. data/lib/mongo/operation/get_more/command_builder.rb +1 -6
  325. data/lib/mongo/operation/get_more/op_msg.rb +10 -4
  326. data/lib/mongo/operation/get_more/result.rb +0 -3
  327. data/lib/mongo/operation/get_more.rb +0 -2
  328. data/lib/mongo/operation/indexes/op_msg.rb +0 -2
  329. data/lib/mongo/operation/indexes/result.rb +1 -5
  330. data/lib/mongo/operation/indexes.rb +0 -2
  331. data/lib/mongo/operation/insert/bulk_result.rb +2 -6
  332. data/lib/mongo/operation/insert/op_msg.rb +2 -4
  333. data/lib/mongo/operation/insert/result.rb +0 -3
  334. data/lib/mongo/operation/insert.rb +2 -5
  335. data/lib/mongo/operation/kill_cursors/command_builder.rb +0 -3
  336. data/lib/mongo/operation/kill_cursors/op_msg.rb +1 -3
  337. data/lib/mongo/operation/kill_cursors.rb +0 -2
  338. data/lib/mongo/operation/list_collections/op_msg.rb +4 -6
  339. data/lib/mongo/operation/list_collections/result.rb +1 -4
  340. data/lib/mongo/operation/list_collections.rb +0 -2
  341. data/lib/mongo/operation/map_reduce/op_msg.rb +0 -2
  342. data/lib/mongo/operation/map_reduce/result.rb +3 -6
  343. data/lib/mongo/operation/map_reduce.rb +0 -2
  344. data/lib/mongo/operation/op_msg_base.rb +0 -1
  345. data/lib/mongo/operation/parallel_scan/op_msg.rb +4 -5
  346. data/lib/mongo/operation/parallel_scan/result.rb +2 -5
  347. data/lib/mongo/operation/parallel_scan.rb +0 -2
  348. data/lib/mongo/operation/remove_user/op_msg.rb +2 -4
  349. data/lib/mongo/operation/remove_user.rb +0 -2
  350. data/lib/mongo/operation/result.rb +38 -48
  351. data/lib/mongo/operation/shared/bypass_document_validation.rb +3 -7
  352. data/lib/mongo/operation/shared/causal_consistency_supported.rb +0 -3
  353. data/lib/mongo/operation/shared/executable.rb +19 -28
  354. data/lib/mongo/operation/shared/executable_no_validate.rb +0 -3
  355. data/lib/mongo/operation/shared/executable_transaction_label.rb +0 -2
  356. data/lib/mongo/operation/shared/idable.rb +3 -6
  357. data/lib/mongo/operation/shared/limited.rb +0 -3
  358. data/lib/mongo/operation/shared/object_id_generator.rb +0 -3
  359. data/lib/mongo/operation/shared/op_msg_executable.rb +0 -2
  360. data/lib/mongo/operation/shared/polymorphic_lookup.rb +0 -2
  361. data/lib/mongo/operation/shared/polymorphic_result.rb +2 -4
  362. data/lib/mongo/operation/shared/read_preference_supported.rb +10 -15
  363. data/lib/mongo/operation/shared/response_handling.rb +13 -26
  364. data/lib/mongo/operation/shared/result/aggregatable.rb +12 -13
  365. data/lib/mongo/operation/shared/sessions_supported.rb +87 -99
  366. data/lib/mongo/operation/shared/specifiable.rb +32 -58
  367. data/lib/mongo/operation/shared/write.rb +12 -17
  368. data/lib/mongo/operation/shared/write_concern_supported.rb +4 -7
  369. data/lib/mongo/operation/update/bulk_result.rb +13 -17
  370. data/lib/mongo/operation/update/op_msg.rb +2 -5
  371. data/lib/mongo/operation/update/result.rb +5 -5
  372. data/lib/mongo/operation/update.rb +1 -5
  373. data/lib/mongo/operation/update_user/op_msg.rb +2 -4
  374. data/lib/mongo/operation/update_user.rb +0 -2
  375. data/lib/mongo/operation/users_info/op_msg.rb +2 -4
  376. data/lib/mongo/operation/users_info/result.rb +1 -4
  377. data/lib/mongo/operation/users_info.rb +0 -2
  378. data/lib/mongo/operation/write_command/op_msg.rb +2 -10
  379. data/lib/mongo/operation/write_command.rb +0 -2
  380. data/lib/mongo/operation.rb +9 -14
  381. data/lib/mongo/options/mapper.rb +8 -15
  382. data/lib/mongo/options/redacted.rb +7 -9
  383. data/lib/mongo/options.rb +0 -1
  384. data/lib/mongo/protocol/bit_vector.rb +3 -5
  385. data/lib/mongo/protocol/caching_hash.rb +2 -7
  386. data/lib/mongo/protocol/compressed.rb +5 -10
  387. data/lib/mongo/protocol/get_more.rb +2 -8
  388. data/lib/mongo/protocol/kill_cursors.rb +2 -8
  389. data/lib/mongo/protocol/message.rb +103 -105
  390. data/lib/mongo/protocol/msg.rb +48 -63
  391. data/lib/mongo/protocol/query.rb +32 -41
  392. data/lib/mongo/protocol/registry.rb +2 -5
  393. data/lib/mongo/protocol/reply.rb +10 -16
  394. data/lib/mongo/protocol/serializers.rb +41 -59
  395. data/lib/mongo/protocol.rb +0 -1
  396. data/lib/mongo/query_cache.rb +7 -15
  397. data/lib/mongo/retryable/backpressure.rb +31 -0
  398. data/lib/mongo/retryable/base_worker.rb +39 -13
  399. data/lib/mongo/retryable/read_worker.rb +77 -21
  400. data/lib/mongo/retryable/retry_policy.rb +59 -0
  401. data/lib/mongo/retryable/write_worker.rb +155 -56
  402. data/lib/mongo/retryable.rb +70 -9
  403. data/lib/mongo/search_index/view.rb +1 -1
  404. data/lib/mongo/semaphore.rb +0 -1
  405. data/lib/mongo/server/app_metadata/environment.rb +3 -3
  406. data/lib/mongo/server/app_metadata.rb +4 -5
  407. data/lib/mongo/server/connection.rb +61 -61
  408. data/lib/mongo/server/connection_base.rb +43 -53
  409. data/lib/mongo/server/connection_common.rb +41 -64
  410. data/lib/mongo/server/connection_pool/generation_manager.rb +6 -11
  411. data/lib/mongo/server/connection_pool/populator.rb +1 -4
  412. data/lib/mongo/server/connection_pool.rb +195 -167
  413. data/lib/mongo/server/description/features.rb +23 -60
  414. data/lib/mongo/server/description/load_balancer.rb +0 -2
  415. data/lib/mongo/server/description.rb +117 -138
  416. data/lib/mongo/server/monitor/app_metadata.rb +3 -4
  417. data/lib/mongo/server/monitor/connection.rb +28 -35
  418. data/lib/mongo/server/monitor.rb +65 -60
  419. data/lib/mongo/server/pending_connection.rb +70 -71
  420. data/lib/mongo/server/push_monitor/connection.rb +0 -3
  421. data/lib/mongo/server/push_monitor.rb +21 -29
  422. data/lib/mongo/server/round_trip_time_calculator.rb +11 -17
  423. data/lib/mongo/server.rb +60 -93
  424. data/lib/mongo/server_selector/base.rb +133 -157
  425. data/lib/mongo/server_selector/nearest.rb +2 -5
  426. data/lib/mongo/server_selector/primary.rb +1 -5
  427. data/lib/mongo/server_selector/primary_preferred.rb +2 -6
  428. data/lib/mongo/server_selector/secondary.rb +2 -6
  429. data/lib/mongo/server_selector/secondary_preferred.rb +1 -5
  430. data/lib/mongo/server_selector.rb +3 -4
  431. data/lib/mongo/session/server_session.rb +6 -7
  432. data/lib/mongo/session/session_pool.rb +20 -34
  433. data/lib/mongo/session.rb +287 -188
  434. data/lib/mongo/socket/ocsp_cache.rb +8 -13
  435. data/lib/mongo/socket/ocsp_verifier.rb +69 -70
  436. data/lib/mongo/socket/ssl.rb +44 -43
  437. data/lib/mongo/socket/tcp.rb +5 -8
  438. data/lib/mongo/socket/unix.rb +0 -4
  439. data/lib/mongo/socket.rb +80 -102
  440. data/lib/mongo/srv/monitor.rb +6 -11
  441. data/lib/mongo/srv/resolver.rb +15 -24
  442. data/lib/mongo/srv/result.rb +18 -24
  443. data/lib/mongo/srv.rb +0 -1
  444. data/lib/mongo/timeout.rb +4 -11
  445. data/lib/mongo/topology_version.rb +8 -13
  446. data/lib/mongo/tracing/open_telemetry/command_tracer.rb +1 -1
  447. data/lib/mongo/tracing/open_telemetry/operation_tracer.rb +1 -1
  448. data/lib/mongo/tracing/open_telemetry/tracer.rb +1 -1
  449. data/lib/mongo/uri/options_mapper.rb +135 -126
  450. data/lib/mongo/uri/srv_protocol.rb +25 -38
  451. data/lib/mongo/uri.rb +95 -139
  452. data/lib/mongo/utils.rb +5 -12
  453. data/lib/mongo/version.rb +1 -1
  454. data/lib/mongo/write_concern/acknowledged.rb +0 -2
  455. data/lib/mongo/write_concern/base.rb +6 -6
  456. data/lib/mongo/write_concern/unacknowledged.rb +0 -2
  457. data/lib/mongo/write_concern.rb +14 -15
  458. data/lib/mongo.rb +1 -3
  459. data/mongo.gemspec +17 -17
  460. metadata +5 -5
  461. data/lib/mongo/error/server_api_not_supported.rb +0 -27
  462. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +0 -32
  463. data/lib/mongo/operation/shared/validatable.rb +0 -87
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2014-2020 MongoDB Inc.
5
4
  #
@@ -17,7 +16,6 @@
17
16
 
18
17
  module Mongo
19
18
  class Server
20
-
21
19
  # Represents a description of the server, populated by the result of the
22
20
  # hello command.
23
21
  #
@@ -30,163 +28,162 @@ module Mongo
30
28
  #
31
29
  # @since 2.0.0
32
30
  class Description
33
-
34
31
  # Constant for reading arbiter info from config.
35
32
  #
36
33
  # @since 2.0.0
37
34
  # @deprecated
38
- ARBITER = 'arbiterOnly'.freeze
35
+ ARBITER = 'arbiterOnly'
39
36
 
40
37
  # Constant for reading arbiters info from config.
41
38
  #
42
39
  # @since 2.0.0
43
- ARBITERS = 'arbiters'.freeze
40
+ ARBITERS = 'arbiters'
44
41
 
45
42
  # Constant for reading hidden info from config.
46
43
  #
47
44
  # @since 2.0.0
48
- HIDDEN = 'hidden'.freeze
45
+ HIDDEN = 'hidden'
49
46
 
50
47
  # Constant for reading hosts info from config.
51
48
  #
52
49
  # @since 2.0.0
53
- HOSTS = 'hosts'.freeze
50
+ HOSTS = 'hosts'
54
51
 
55
52
  # Constant for the key for the message value.
56
53
  #
57
54
  # @since 2.0.0
58
55
  # @deprecated
59
- MESSAGE = 'msg'.freeze
56
+ MESSAGE = 'msg'
60
57
 
61
58
  # Constant for the message that indicates a sharded cluster.
62
59
  #
63
60
  # @since 2.0.0
64
61
  # @deprecated
65
- MONGOS_MESSAGE = 'isdbgrid'.freeze
62
+ MONGOS_MESSAGE = 'isdbgrid'
66
63
 
67
64
  # Constant for determining ghost servers.
68
65
  #
69
66
  # @since 2.0.0
70
67
  # @deprecated
71
- REPLICA_SET = 'isreplicaset'.freeze
68
+ REPLICA_SET = 'isreplicaset'
72
69
 
73
70
  # Constant for reading max bson size info from config.
74
71
  #
75
72
  # @since 2.0.0
76
- MAX_BSON_OBJECT_SIZE = 'maxBsonObjectSize'.freeze
73
+ MAX_BSON_OBJECT_SIZE = 'maxBsonObjectSize'
77
74
 
78
75
  # Constant for reading max message size info from config.
79
76
  #
80
77
  # @since 2.0.0
81
- MAX_MESSAGE_BYTES = 'maxMessageSizeBytes'.freeze
78
+ MAX_MESSAGE_BYTES = 'maxMessageSizeBytes'
82
79
 
83
80
  # Constant for the max wire version.
84
81
  #
85
82
  # @since 2.0.0
86
- MAX_WIRE_VERSION = 'maxWireVersion'.freeze
83
+ MAX_WIRE_VERSION = 'maxWireVersion'
87
84
 
88
85
  # Constant for min wire version.
89
86
  #
90
87
  # @since 2.0.0
91
- MIN_WIRE_VERSION = 'minWireVersion'.freeze
88
+ MIN_WIRE_VERSION = 'minWireVersion'
92
89
 
93
90
  # Constant for reading max write batch size.
94
91
  #
95
92
  # @since 2.0.0
96
- MAX_WRITE_BATCH_SIZE = 'maxWriteBatchSize'.freeze
93
+ MAX_WRITE_BATCH_SIZE = 'maxWriteBatchSize'
97
94
 
98
95
  # Constant for the lastWrite subdocument.
99
96
  #
100
97
  # @since 2.4.0
101
- LAST_WRITE = 'lastWrite'.freeze
98
+ LAST_WRITE = 'lastWrite'
102
99
 
103
100
  # Constant for the lastWriteDate field in the lastWrite subdocument.
104
101
  #
105
102
  # @since 2.4.0
106
- LAST_WRITE_DATE = 'lastWriteDate'.freeze
103
+ LAST_WRITE_DATE = 'lastWriteDate'
107
104
 
108
105
  # Constant for reading the me field.
109
106
  #
110
107
  # @since 2.1.0
111
- ME = 'me'.freeze
108
+ ME = 'me'
112
109
 
113
110
  # Default max write batch size.
114
111
  #
115
112
  # @since 2.0.0
116
- DEFAULT_MAX_WRITE_BATCH_SIZE = 1000.freeze
113
+ DEFAULT_MAX_WRITE_BATCH_SIZE = 1000
117
114
 
118
115
  # The legacy wire protocol version.
119
116
  #
120
117
  # @since 2.0.0
121
118
  # @deprecated Will be removed in 3.0.
122
- LEGACY_WIRE_VERSION = 0.freeze
119
+ LEGACY_WIRE_VERSION = 0
123
120
 
124
121
  # Constant for reading passive info from config.
125
122
  #
126
123
  # @since 2.0.0
127
- PASSIVE = 'passive'.freeze
124
+ PASSIVE = 'passive'
128
125
 
129
126
  # Constant for reading the passive server list.
130
127
  #
131
128
  # @since 2.0.0
132
- PASSIVES = 'passives'.freeze
129
+ PASSIVES = 'passives'
133
130
 
134
131
  # Constant for reading primary info from config.
135
132
  #
136
133
  # @since 2.0.0
137
134
  # @deprecated
138
- PRIMARY = 'ismaster'.freeze
135
+ PRIMARY = 'ismaster'
139
136
 
140
137
  # Constant for reading primary host field from config.
141
138
  #
142
139
  # @since 2.5.0
143
- PRIMARY_HOST = 'primary'.freeze
140
+ PRIMARY_HOST = 'primary'
144
141
 
145
142
  # Constant for reading secondary info from config.
146
143
  #
147
144
  # @since 2.0.0
148
145
  # @deprecated
149
- SECONDARY = 'secondary'.freeze
146
+ SECONDARY = 'secondary'
150
147
 
151
148
  # Constant for reading replica set name info from config.
152
149
  #
153
150
  # @since 2.0.0
154
- SET_NAME = 'setName'.freeze
151
+ SET_NAME = 'setName'
155
152
 
156
153
  # Constant for reading tags info from config.
157
154
  #
158
155
  # @since 2.0.0
159
- TAGS = 'tags'.freeze
156
+ TAGS = 'tags'
160
157
 
161
158
  # Constant for reading electionId info from config.
162
159
  #
163
160
  # @since 2.1.0
164
- ELECTION_ID = 'electionId'.freeze
161
+ ELECTION_ID = 'electionId'
165
162
 
166
163
  # Constant for reading setVersion info from config.
167
164
  #
168
165
  # @since 2.2.2
169
- SET_VERSION = 'setVersion'.freeze
166
+ SET_VERSION = 'setVersion'
170
167
 
171
168
  # Constant for reading localTime info from config.
172
169
  #
173
170
  # @since 2.1.0
174
- LOCAL_TIME = 'localTime'.freeze
171
+ LOCAL_TIME = 'localTime'
175
172
 
176
173
  # Constant for reading operationTime info from config.
177
174
  #
178
175
  # @since 2.5.0
179
- OPERATION_TIME = 'operationTime'.freeze
176
+ OPERATION_TIME = 'operationTime'
180
177
 
181
178
  # Constant for reading logicalSessionTimeoutMinutes info from config.
182
179
  #
183
180
  # @since 2.5.0
184
- LOGICAL_SESSION_TIMEOUT_MINUTES = 'logicalSessionTimeoutMinutes'.freeze
181
+ LOGICAL_SESSION_TIMEOUT_MINUTES = 'logicalSessionTimeoutMinutes'
185
182
 
186
183
  # Constant for reading connectionId info from config.
187
184
  #
188
185
  # @api private
189
- CONNECTION_ID = 'connectionId'.freeze
186
+ CONNECTION_ID = 'connectionId'
190
187
 
191
188
  # Fields to exclude when comparing two descriptions.
192
189
  #
@@ -195,8 +192,7 @@ module Mongo
195
192
  LAST_WRITE,
196
193
  OPERATION_TIME,
197
194
  Operation::CLUSTER_TIME,
198
- CONNECTION_ID,
199
- ].freeze
195
+ CONNECTION_ID, ].freeze
200
196
 
201
197
  # Instantiate the new server description from the result of the hello
202
198
  # command or fabricate a placeholder description for Unknown and
@@ -218,9 +214,8 @@ module Mongo
218
214
  #
219
215
  # @api private
220
216
  def initialize(address, config = {}, average_round_trip_time: nil,
221
- minimum_round_trip_time: 0, load_balancer: false,
222
- force_load_balancer: false
223
- )
217
+ minimum_round_trip_time: 0, load_balancer: false,
218
+ force_load_balancer: false)
224
219
  @address = address
225
220
  @config = config
226
221
  @load_balancer = !!load_balancer
@@ -231,56 +226,55 @@ module Mongo
231
226
  @last_update_time = Time.now.freeze
232
227
  @last_update_monotime = Utils.monotonic_time
233
228
 
234
- if load_balancer
235
- # When loadBalanced=true URI option is set, the driver will refuse
236
- # to work if the server it communicates with does not set serviceId
237
- # in ismaster/hello response.
238
- #
239
- # At the moment we cannot run a proper load balancer setup on evergreen
240
- #
241
- # Therefore, when connect=:load_balanced Ruby option is used instead
242
- # of the loadBalanced=true URI option, if serviceId is not set in
243
- # ismaster/hello response, the driver fabricates a serviceId and
244
- # proceeds to treat a server that does not report itself as being
245
- # behind a load balancer as a server that is behind a load balancer.
246
- #
247
- # 5.0+ servers should provide topologyVersion.processId which
248
- # is specific to the particular process instance. We can use that
249
- # field as a proxy for serviceId.
250
- #
251
- # If the topologyVersion isn't provided for whatever reason, we
252
- # fabricate a serviceId locally.
253
- #
254
- # In either case, a serviceId provided by an actual server behind
255
- # a load balancer is supposed to be a BSON::ObjectId. The fabricated
256
- # service ids are strings, to distinguish them from the real ones.
257
- # In particular processId is also a BSON::ObjectId, but will be
258
- # mapped to a string for clarity that this is a fake service id.
259
- #
260
- # TODO: Remove this when https://jira.mongodb.org/browse/RUBY-2881 is done.
261
- if ok? && !service_id
262
- unless force_load_balancer
263
- raise Error::MissingServiceId, "The server at #{address.seed} did not provide a service id in handshake response"
264
- end
265
-
266
- fake_service_id = if process_id = topology_version && topology_version['processId']
267
- "process:#{process_id}"
268
- else
269
- "fake:#{rand(2**32-1)+1}"
270
- end
271
- @config = @config.merge('serviceId' => fake_service_id)
229
+ # When loadBalanced=true URI option is set, the driver will refuse
230
+ # to work if the server it communicates with does not set serviceId
231
+ # in ismaster/hello response.
232
+ #
233
+ # At the moment we cannot run a proper load balancer setup on evergreen
234
+ #
235
+ # Therefore, when connect=:load_balanced Ruby option is used instead
236
+ # of the loadBalanced=true URI option, if serviceId is not set in
237
+ # ismaster/hello response, the driver fabricates a serviceId and
238
+ # proceeds to treat a server that does not report itself as being
239
+ # behind a load balancer as a server that is behind a load balancer.
240
+ #
241
+ # 5.0+ servers should provide topologyVersion.processId which
242
+ # is specific to the particular process instance. We can use that
243
+ # field as a proxy for serviceId.
244
+ #
245
+ # If the topologyVersion isn't provided for whatever reason, we
246
+ # fabricate a serviceId locally.
247
+ #
248
+ # In either case, a serviceId provided by an actual server behind
249
+ # a load balancer is supposed to be a BSON::ObjectId. The fabricated
250
+ # service ids are strings, to distinguish them from the real ones.
251
+ # In particular processId is also a BSON::ObjectId, but will be
252
+ # mapped to a string for clarity that this is a fake service id.
253
+ #
254
+ # TODO: Remove this when https://jira.mongodb.org/browse/RUBY-2881 is done.
255
+ if load_balancer && ok? && !service_id
256
+ unless force_load_balancer
257
+ raise Error::MissingServiceId,
258
+ "The server at #{address.seed} did not provide a service id in handshake response"
272
259
  end
260
+
261
+ fake_service_id = if process_id = topology_version && topology_version['processId']
262
+ "process:#{process_id}"
263
+ else
264
+ "fake:#{rand((2**32) - 1) + 1}"
265
+ end
266
+ @config = @config.merge('serviceId' => fake_service_id)
273
267
  end
274
268
 
275
- if Mongo::Lint.enabled?
276
- # prepopulate cache instance variables
277
- hosts
278
- arbiters
279
- passives
280
- topology_version
269
+ return unless Mongo::Lint.enabled?
281
270
 
282
- freeze
283
- end
271
+ # prepopulate cache instance variables
272
+ hosts
273
+ arbiters
274
+ passives
275
+ topology_version
276
+
277
+ freeze
284
278
  end
285
279
 
286
280
  # @return [ Address ] address The server's address.
@@ -297,14 +291,12 @@ module Mongo
297
291
  end
298
292
 
299
293
  # @return [ Features ] features The features for the server.
300
- def features
301
- @features
302
- end
294
+ attr_reader :features
303
295
 
304
296
  # @return [ Float ] The moving average time the hello call took to complete.
305
297
  attr_reader :average_round_trip_time
306
298
 
307
- # @return [ Float ] The minimum time from the ten last hello calls took
299
+ # @return [ Float ] The minimum time that the ten last hello calls took
308
300
  # to complete.
309
301
  attr_reader :minimum_round_trip_time
310
302
 
@@ -318,8 +310,8 @@ module Mongo
318
310
  # @since 2.0.0
319
311
  def arbiter?
320
312
  ok? &&
321
- config['arbiterOnly'] == true &&
322
- !!config['setName']
313
+ config['arbiterOnly'] == true &&
314
+ !!config['setName']
323
315
  end
324
316
 
325
317
  # Get a list of all arbiters in the replica set.
@@ -344,7 +336,7 @@ module Mongo
344
336
  # @since 2.0.0
345
337
  def ghost?
346
338
  ok? &&
347
- config['isreplicaset'] == true
339
+ config['isreplicaset'] == true
348
340
  end
349
341
 
350
342
  # Will return true if the server is hidden.
@@ -498,7 +490,7 @@ module Mongo
498
490
  def topology_version
499
491
  unless defined?(@topology_version)
500
492
  @topology_version = config['topologyVersion'] &&
501
- TopologyVersion.new(config['topologyVersion'])
493
+ TopologyVersion.new(config['topologyVersion'])
502
494
  end
503
495
  @topology_version
504
496
  end
@@ -584,9 +576,9 @@ module Mongo
584
576
  # but it's referred to it as "RSOther" which means a non-RS member
585
577
  # cannot be "other".
586
578
  ok? &&
587
- !!config['setName'] && (
579
+ !!config['setName'] && (
588
580
  config['hidden'] == true ||
589
- !primary? && !secondary? && !arbiter?
581
+ (!primary? && !secondary? && !arbiter?)
590
582
  )
591
583
  end
592
584
 
@@ -636,8 +628,8 @@ module Mongo
636
628
  # @since 2.0.0
637
629
  def primary?
638
630
  ok? &&
639
- (config['ismaster'] == true || config['isWritablePrimary'] == true ) &&
640
- !!config['setName']
631
+ (config['ismaster'] == true || config['isWritablePrimary'] == true) &&
632
+ !!config['setName']
641
633
  end
642
634
 
643
635
  # Get the name of the replica set the server belongs to, returns nil if
@@ -675,8 +667,8 @@ module Mongo
675
667
  # @since 2.0.0
676
668
  def secondary?
677
669
  ok? &&
678
- config['secondary'] == true &&
679
- !!config['setName']
670
+ config['secondary'] == true &&
671
+ !!config['setName']
680
672
  end
681
673
 
682
674
  # Returns the server type as a symbol.
@@ -696,6 +688,7 @@ module Mongo
696
688
  return :secondary if secondary?
697
689
  return :standalone if standalone?
698
690
  return :other if other?
691
+
699
692
  :unknown
700
693
  end
701
694
 
@@ -709,9 +702,9 @@ module Mongo
709
702
  # @since 2.0.0
710
703
  def standalone?
711
704
  ok? &&
712
- config['msg'] != 'isdbgrid' &&
713
- config['setName'].nil? &&
714
- config['isreplicaset'] != true
705
+ config['msg'] != 'isdbgrid' &&
706
+ config['setName'].nil? &&
707
+ config['isreplicaset'] != true
715
708
  end
716
709
 
717
710
  # Returns whether this server is an unknown, per the SDAM spec.
@@ -724,7 +717,8 @@ module Mongo
724
717
  # @since 2.0.0
725
718
  def unknown?
726
719
  return false if load_balancer?
727
- config.empty? || config.keys == %w(topologyVersion) || !ok?
720
+
721
+ config.empty? || config.keys == %w[topologyVersion] || !ok?
728
722
  end
729
723
 
730
724
  # @api private
@@ -821,9 +815,9 @@ module Mongo
821
815
  #
822
816
  # @since 2.7.0
823
817
  def op_time
824
- if config['lastWrite'] && config['lastWrite']['opTime']
825
- config['lastWrite']['opTime']['ts']
826
- end
818
+ return unless config['lastWrite'] && config['lastWrite']['opTime']
819
+
820
+ config['lastWrite']['opTime']['ts']
827
821
  end
828
822
 
829
823
  # Time when this server description was created.
@@ -877,41 +871,23 @@ module Mongo
877
871
  config[k] == other.config[k] || EXCLUDE_FOR_COMPARISON.include?(k)
878
872
  end
879
873
  end
880
- alias_method :eql?, :==
874
+ alias eql? ==
881
875
 
882
876
  # @api private
883
- def server_version_gte?(version)
884
- required_wv = case version
885
- when '7.0'
886
- 21
887
- when '6.0'
888
- 17
889
- when '5.2'
890
- 15
891
- when '5.1'
892
- 14
893
- when '5.0'
894
- 12
895
- when '4.4'
896
- 9
897
- when '4.2'
898
- 8
899
- when '4.0'
900
- 7
901
- when '3.6'
902
- 6
903
- when '3.4'
904
- 5
905
- when '3.2'
906
- 4
907
- when '3.0'
908
- 3
909
- when '2.6'
910
- 2
911
- else
912
- raise ArgumentError, "Bogus required version #{version}"
913
- end
877
+ SERVER_VERSION_WIRE_VERSION_MAP = {
878
+ '8.2' => 27,
879
+ '8.0' => 25,
880
+ '7.0' => 21,
881
+ '6.0' => 17,
882
+ '5.2' => 15,
883
+ '5.1' => 14,
884
+ '5.0' => 12,
885
+ '4.4' => 9,
886
+ '4.2' => 8,
887
+ }.freeze
914
888
 
889
+ # @api private
890
+ def server_version_gte?(version)
915
891
  if load_balancer?
916
892
  # If we are talking to a load balancer, there is no monitoring
917
893
  # and we don't know what server is behind the load balancer.
@@ -920,7 +896,10 @@ module Mongo
920
896
  return true
921
897
  end
922
898
 
923
- required_wv >= min_wire_version && required_wv <= max_wire_version
899
+ required_wv = SERVER_VERSION_WIRE_VERSION_MAP[version]
900
+ raise NotImplementedError, "Unexpected server version #{version.inspect}" unless required_wv
901
+
902
+ required_wv <= max_wire_version
924
903
  end
925
904
  end
926
905
  end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2018-2020 MongoDB Inc.
5
4
 
@@ -27,9 +26,9 @@ module Mongo
27
26
  class AppMetadata < Server::AppMetadata
28
27
  def initialize(options = {})
29
28
  super
30
- if instance_variable_defined?(:@request_auth_mech)
31
- remove_instance_variable(:@request_auth_mech)
32
- end
29
+ return unless instance_variable_defined?(:@request_auth_mech)
30
+
31
+ remove_instance_variable(:@request_auth_mech)
33
32
  end
34
33
  end
35
34
  end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2015-2020 MongoDB Inc.
5
4
  #
@@ -18,7 +17,6 @@
18
17
  module Mongo
19
18
  class Server
20
19
  class Monitor
21
-
22
20
  # This class models the monitor connections and their behavior.
23
21
  #
24
22
  # @since 2.0.0
@@ -58,9 +56,8 @@ module Mongo
58
56
  def initialize(address, options = {})
59
57
  @address = address
60
58
  @options = options.dup.freeze
61
- unless @app_metadata = options[:app_metadata]
62
- raise ArgumentError, 'App metadata is required'
63
- end
59
+ raise ArgumentError, 'App metadata is required' unless @app_metadata = options[:app_metadata]
60
+
64
61
  @socket = nil
65
62
  @pid = Process.pid
66
63
  @compressor = nil
@@ -109,14 +106,12 @@ module Mongo
109
106
  def dispatch_bytes(bytes, **opts)
110
107
  write_bytes(bytes)
111
108
  read_response(
112
- socket_timeout: opts[:read_socket_timeout],
109
+ socket_timeout: opts[:read_socket_timeout]
113
110
  )
114
111
  end
115
112
 
116
113
  def write_bytes(bytes)
117
- unless connected?
118
- raise ArgumentError, "Trying to dispatch on an unconnected connection #{self}"
119
- end
114
+ raise ArgumentError, "Trying to dispatch on an unconnected connection #{self}" unless connected?
120
115
 
121
116
  add_server_connection_id do
122
117
  add_server_diagnostics do
@@ -128,16 +123,14 @@ module Mongo
128
123
  # @option opts [ Numeric ] :socket_timeout The timeout to use for
129
124
  # each read operation.
130
125
  def read_response(**opts)
131
- unless connected?
132
- raise ArgumentError, "Trying to read on an unconnected connection #{self}"
133
- end
126
+ raise ArgumentError, "Trying to read on an unconnected connection #{self}" unless connected?
134
127
 
135
128
  add_server_connection_id do
136
129
  add_server_diagnostics do
137
130
  Protocol::Message.deserialize(socket,
138
- Protocol::Message::MAX_MESSAGE_SIZE,
139
- nil,
140
- **opts)
131
+ Protocol::Message::MAX_MESSAGE_SIZE,
132
+ nil,
133
+ **opts)
141
134
  end
142
135
  end
143
136
  end
@@ -156,13 +149,12 @@ module Mongo
156
149
  #
157
150
  # @since 2.0.0
158
151
  def connect!
159
- if @socket
160
- raise ArgumentError, 'Monitoring connection already connected'
161
- end
152
+ raise ArgumentError, 'Monitoring connection already connected' if @socket
162
153
 
163
154
  @socket = add_server_diagnostics do
164
155
  address.socket(socket_timeout, ssl_options.merge(
165
- connection_address: address, monitor: true))
156
+ connection_address: address, monitor: true
157
+ ))
166
158
  end
167
159
  true
168
160
  end
@@ -181,9 +173,13 @@ module Mongo
181
173
  # @return [ true ] If the disconnect succeeded.
182
174
  #
183
175
  # @since 2.0.0
184
- def disconnect!(options = nil)
176
+ def disconnect!(_options = nil)
185
177
  if socket
186
- socket.close rescue nil
178
+ begin
179
+ socket.close
180
+ rescue StandardError
181
+ nil
182
+ end
187
183
  @socket = nil
188
184
  end
189
185
  true
@@ -210,13 +206,12 @@ module Mongo
210
206
  set_hello_ok!(reply)
211
207
  @server_connection_id = reply['connectionId']
212
208
  reply
213
- rescue => exc
209
+ rescue StandardError => e
214
210
  msg = "Failed to handshake with #{address}"
215
- Utils.warn_bg_exception(msg, exc,
216
- logger: options[:logger],
217
- log_prefix: options[:log_prefix],
218
- bg_error_backtrace: options[:bg_error_backtrace],
219
- )
211
+ Utils.warn_bg_exception(msg, e,
212
+ logger: options[:logger],
213
+ log_prefix: options[:log_prefix],
214
+ bg_error_backtrace: options[:bg_error_backtrace])
220
215
  raise
221
216
  end
222
217
 
@@ -229,14 +224,12 @@ module Mongo
229
224
  def check_document
230
225
  server_api = @app_metadata.server_api || options[:server_api]
231
226
  doc = if hello_ok? || server_api
232
- _doc = HELLO_DOC
233
- if server_api
234
- _doc = _doc.merge(Utils.transform_server_api(server_api))
235
- end
236
- _doc
237
- else
238
- LEGACY_HELLO_DOC
239
- end
227
+ _doc = HELLO_DOC
228
+ _doc = _doc.merge(Utils.transform_server_api(server_api)) if server_api
229
+ _doc
230
+ else
231
+ LEGACY_HELLO_DOC
232
+ end
240
233
  # compressors must be set to maintain correct compression status
241
234
  # in the server description. See RUBY-2427
242
235
  if compressors = options[:compressors]