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) 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,173 +28,192 @@ 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'
187
+
188
+ # Constant for reading the modern primary flag from config.
189
+ #
190
+ # @api private
191
+ IS_WRITABLE_PRIMARY = 'isWritablePrimary'
192
+
193
+ # Constant for reading the helloOk capability flag from config.
194
+ #
195
+ # @api private
196
+ HELLO_OK = 'helloOk'
190
197
 
191
198
  # Fields to exclude when comparing two descriptions.
192
199
  #
200
+ # The PRIMARY (legacy `ismaster`), IS_WRITABLE_PRIMARY (modern `hello`),
201
+ # and HELLO_OK keys are excluded because the driver does a one-time
202
+ # legacy-`isMaster` to modern-`hello` protocol switch on the initial
203
+ # handshake (per the SDAM Server Monitoring spec). Two responses for the
204
+ # same logical role differ only in which of these keys is populated.
205
+ # The role itself is still differentiated by the SECONDARY flag and the
206
+ # remaining replica-set metadata.
207
+ #
193
208
  # @since 2.0.6
194
209
  EXCLUDE_FOR_COMPARISON = [ LOCAL_TIME,
195
210
  LAST_WRITE,
196
211
  OPERATION_TIME,
197
212
  Operation::CLUSTER_TIME,
198
213
  CONNECTION_ID,
199
- ].freeze
214
+ PRIMARY,
215
+ IS_WRITABLE_PRIMARY,
216
+ HELLO_OK, ].freeze
200
217
 
201
218
  # Instantiate the new server description from the result of the hello
202
219
  # command or fabricate a placeholder description for Unknown and
@@ -218,9 +235,8 @@ module Mongo
218
235
  #
219
236
  # @api private
220
237
  def initialize(address, config = {}, average_round_trip_time: nil,
221
- minimum_round_trip_time: 0, load_balancer: false,
222
- force_load_balancer: false
223
- )
238
+ minimum_round_trip_time: 0, load_balancer: false,
239
+ force_load_balancer: false)
224
240
  @address = address
225
241
  @config = config
226
242
  @load_balancer = !!load_balancer
@@ -231,56 +247,55 @@ module Mongo
231
247
  @last_update_time = Time.now.freeze
232
248
  @last_update_monotime = Utils.monotonic_time
233
249
 
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)
250
+ # When loadBalanced=true URI option is set, the driver will refuse
251
+ # to work if the server it communicates with does not set serviceId
252
+ # in ismaster/hello response.
253
+ #
254
+ # At the moment we cannot run a proper load balancer setup on evergreen
255
+ #
256
+ # Therefore, when connect=:load_balanced Ruby option is used instead
257
+ # of the loadBalanced=true URI option, if serviceId is not set in
258
+ # ismaster/hello response, the driver fabricates a serviceId and
259
+ # proceeds to treat a server that does not report itself as being
260
+ # behind a load balancer as a server that is behind a load balancer.
261
+ #
262
+ # 5.0+ servers should provide topologyVersion.processId which
263
+ # is specific to the particular process instance. We can use that
264
+ # field as a proxy for serviceId.
265
+ #
266
+ # If the topologyVersion isn't provided for whatever reason, we
267
+ # fabricate a serviceId locally.
268
+ #
269
+ # In either case, a serviceId provided by an actual server behind
270
+ # a load balancer is supposed to be a BSON::ObjectId. The fabricated
271
+ # service ids are strings, to distinguish them from the real ones.
272
+ # In particular processId is also a BSON::ObjectId, but will be
273
+ # mapped to a string for clarity that this is a fake service id.
274
+ #
275
+ # TODO: Remove this when https://jira.mongodb.org/browse/RUBY-2881 is done.
276
+ if load_balancer && ok? && !service_id
277
+ unless force_load_balancer
278
+ raise Error::MissingServiceId,
279
+ "The server at #{address.seed} did not provide a service id in handshake response"
272
280
  end
281
+
282
+ fake_service_id = if process_id = topology_version && topology_version['processId']
283
+ "process:#{process_id}"
284
+ else
285
+ "fake:#{rand((2**32) - 1) + 1}"
286
+ end
287
+ @config = @config.merge('serviceId' => fake_service_id)
273
288
  end
274
289
 
275
- if Mongo::Lint.enabled?
276
- # prepopulate cache instance variables
277
- hosts
278
- arbiters
279
- passives
280
- topology_version
290
+ return unless Mongo::Lint.enabled?
281
291
 
282
- freeze
283
- end
292
+ # prepopulate cache instance variables
293
+ hosts
294
+ arbiters
295
+ passives
296
+ topology_version
297
+
298
+ freeze
284
299
  end
285
300
 
286
301
  # @return [ Address ] address The server's address.
@@ -297,14 +312,12 @@ module Mongo
297
312
  end
298
313
 
299
314
  # @return [ Features ] features The features for the server.
300
- def features
301
- @features
302
- end
315
+ attr_reader :features
303
316
 
304
317
  # @return [ Float ] The moving average time the hello call took to complete.
305
318
  attr_reader :average_round_trip_time
306
319
 
307
- # @return [ Float ] The minimum time from the ten last hello calls took
320
+ # @return [ Float ] The minimum time that the ten last hello calls took
308
321
  # to complete.
309
322
  attr_reader :minimum_round_trip_time
310
323
 
@@ -318,8 +331,8 @@ module Mongo
318
331
  # @since 2.0.0
319
332
  def arbiter?
320
333
  ok? &&
321
- config['arbiterOnly'] == true &&
322
- !!config['setName']
334
+ config['arbiterOnly'] == true &&
335
+ !!config['setName']
323
336
  end
324
337
 
325
338
  # Get a list of all arbiters in the replica set.
@@ -344,7 +357,7 @@ module Mongo
344
357
  # @since 2.0.0
345
358
  def ghost?
346
359
  ok? &&
347
- config['isreplicaset'] == true
360
+ config['isreplicaset'] == true
348
361
  end
349
362
 
350
363
  # Will return true if the server is hidden.
@@ -498,7 +511,7 @@ module Mongo
498
511
  def topology_version
499
512
  unless defined?(@topology_version)
500
513
  @topology_version = config['topologyVersion'] &&
501
- TopologyVersion.new(config['topologyVersion'])
514
+ TopologyVersion.new(config['topologyVersion'])
502
515
  end
503
516
  @topology_version
504
517
  end
@@ -584,9 +597,9 @@ module Mongo
584
597
  # but it's referred to it as "RSOther" which means a non-RS member
585
598
  # cannot be "other".
586
599
  ok? &&
587
- !!config['setName'] && (
600
+ !!config['setName'] && (
588
601
  config['hidden'] == true ||
589
- !primary? && !secondary? && !arbiter?
602
+ (!primary? && !secondary? && !arbiter?)
590
603
  )
591
604
  end
592
605
 
@@ -636,8 +649,8 @@ module Mongo
636
649
  # @since 2.0.0
637
650
  def primary?
638
651
  ok? &&
639
- (config['ismaster'] == true || config['isWritablePrimary'] == true ) &&
640
- !!config['setName']
652
+ (config['ismaster'] == true || config['isWritablePrimary'] == true) &&
653
+ !!config['setName']
641
654
  end
642
655
 
643
656
  # Get the name of the replica set the server belongs to, returns nil if
@@ -675,8 +688,8 @@ module Mongo
675
688
  # @since 2.0.0
676
689
  def secondary?
677
690
  ok? &&
678
- config['secondary'] == true &&
679
- !!config['setName']
691
+ config['secondary'] == true &&
692
+ !!config['setName']
680
693
  end
681
694
 
682
695
  # Returns the server type as a symbol.
@@ -696,6 +709,7 @@ module Mongo
696
709
  return :secondary if secondary?
697
710
  return :standalone if standalone?
698
711
  return :other if other?
712
+
699
713
  :unknown
700
714
  end
701
715
 
@@ -709,9 +723,9 @@ module Mongo
709
723
  # @since 2.0.0
710
724
  def standalone?
711
725
  ok? &&
712
- config['msg'] != 'isdbgrid' &&
713
- config['setName'].nil? &&
714
- config['isreplicaset'] != true
726
+ config['msg'] != 'isdbgrid' &&
727
+ config['setName'].nil? &&
728
+ config['isreplicaset'] != true
715
729
  end
716
730
 
717
731
  # Returns whether this server is an unknown, per the SDAM spec.
@@ -724,7 +738,8 @@ module Mongo
724
738
  # @since 2.0.0
725
739
  def unknown?
726
740
  return false if load_balancer?
727
- config.empty? || config.keys == %w(topologyVersion) || !ok?
741
+
742
+ config.empty? || config.keys == %w[topologyVersion] || !ok?
728
743
  end
729
744
 
730
745
  # @api private
@@ -821,9 +836,9 @@ module Mongo
821
836
  #
822
837
  # @since 2.7.0
823
838
  def op_time
824
- if config['lastWrite'] && config['lastWrite']['opTime']
825
- config['lastWrite']['opTime']['ts']
826
- end
839
+ return unless config['lastWrite'] && config['lastWrite']['opTime']
840
+
841
+ config['lastWrite']['opTime']['ts']
827
842
  end
828
843
 
829
844
  # Time when this server description was created.
@@ -872,46 +887,29 @@ module Mongo
872
887
  def ==(other)
873
888
  return false if self.class != other.class
874
889
  return false if unknown? || other.unknown?
890
+ return false if server_type != other.server_type
875
891
 
876
892
  (config.keys + other.config.keys).uniq.all? do |k|
877
893
  config[k] == other.config[k] || EXCLUDE_FOR_COMPARISON.include?(k)
878
894
  end
879
895
  end
880
- alias_method :eql?, :==
896
+ alias eql? ==
881
897
 
882
898
  # @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
899
+ SERVER_VERSION_WIRE_VERSION_MAP = {
900
+ '8.2' => 27,
901
+ '8.0' => 25,
902
+ '7.0' => 21,
903
+ '6.0' => 17,
904
+ '5.2' => 15,
905
+ '5.1' => 14,
906
+ '5.0' => 12,
907
+ '4.4' => 9,
908
+ '4.2' => 8,
909
+ }.freeze
914
910
 
911
+ # @api private
912
+ def server_version_gte?(version)
915
913
  if load_balancer?
916
914
  # If we are talking to a load balancer, there is no monitoring
917
915
  # and we don't know what server is behind the load balancer.
@@ -920,7 +918,10 @@ module Mongo
920
918
  return true
921
919
  end
922
920
 
923
- required_wv >= min_wire_version && required_wv <= max_wire_version
921
+ required_wv = SERVER_VERSION_WIRE_VERSION_MAP[version]
922
+ raise NotImplementedError, "Unexpected server version #{version.inspect}" unless required_wv
923
+
924
+ required_wv <= max_wire_version
924
925
  end
925
926
  end
926
927
  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