mongo 2.22.0 → 2.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (467) hide show
  1. checksums.yaml +4 -4
  2. data/bin/mongo_console +0 -1
  3. data/lib/mongo/active_support.rb +1 -2
  4. data/lib/mongo/address/ipv4.rb +3 -6
  5. data/lib/mongo/address/ipv6.rb +6 -10
  6. data/lib/mongo/address/unix.rb +1 -4
  7. data/lib/mongo/address/validator.rb +16 -28
  8. data/lib/mongo/address.rb +30 -40
  9. data/lib/mongo/auth/aws/conversation.rb +6 -10
  10. data/lib/mongo/auth/aws/credentials.rb +0 -1
  11. data/lib/mongo/auth/aws/credentials_cache.rb +0 -1
  12. data/lib/mongo/auth/aws/credentials_retriever.rb +45 -59
  13. data/lib/mongo/auth/aws/request.rb +20 -35
  14. data/lib/mongo/auth/aws.rb +1 -2
  15. data/lib/mongo/auth/base.rb +20 -29
  16. data/lib/mongo/auth/conversation_base.rb +14 -18
  17. data/lib/mongo/auth/cr/conversation.rb +0 -3
  18. data/lib/mongo/auth/cr.rb +1 -4
  19. data/lib/mongo/auth/credential_cache.rb +0 -2
  20. data/lib/mongo/auth/gssapi/conversation.rb +3 -8
  21. data/lib/mongo/auth/gssapi.rb +1 -4
  22. data/lib/mongo/auth/ldap/conversation.rb +0 -3
  23. data/lib/mongo/auth/ldap.rb +1 -4
  24. data/lib/mongo/auth/roles.rb +16 -19
  25. data/lib/mongo/auth/sasl_conversation_base.rb +7 -11
  26. data/lib/mongo/auth/scram/conversation.rb +2 -5
  27. data/lib/mongo/auth/scram.rb +5 -10
  28. data/lib/mongo/auth/scram256/conversation.rb +2 -5
  29. data/lib/mongo/auth/scram256.rb +1 -3
  30. data/lib/mongo/auth/scram_conversation_base.rb +18 -24
  31. data/lib/mongo/auth/stringprep/profiles/sasl.rb +17 -18
  32. data/lib/mongo/auth/stringprep/tables.rb +2209 -2210
  33. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +36 -38
  34. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1142 -1150
  35. data/lib/mongo/auth/stringprep.rb +9 -12
  36. data/lib/mongo/auth/user/view.rb +3 -5
  37. data/lib/mongo/auth/user.rb +14 -24
  38. data/lib/mongo/auth/x509/conversation.rb +0 -3
  39. data/lib/mongo/auth/x509.rb +7 -9
  40. data/lib/mongo/auth.rb +18 -30
  41. data/lib/mongo/background_thread.rb +9 -17
  42. data/lib/mongo/bson.rb +0 -2
  43. data/lib/mongo/bulk_write/combineable.rb +0 -3
  44. data/lib/mongo/bulk_write/ordered_combiner.rb +1 -3
  45. data/lib/mongo/bulk_write/result.rb +11 -16
  46. data/lib/mongo/bulk_write/result_combiner.rb +9 -12
  47. data/lib/mongo/bulk_write/transformable.rb +16 -19
  48. data/lib/mongo/bulk_write/unordered_combiner.rb +1 -3
  49. data/lib/mongo/bulk_write/validatable.rb +11 -18
  50. data/lib/mongo/bulk_write.rb +76 -91
  51. data/lib/mongo/caching_cursor.rb +2 -7
  52. data/lib/mongo/client.rb +267 -276
  53. data/lib/mongo/client_encryption.rb +4 -5
  54. data/lib/mongo/cluster/periodic_executor.rb +2 -5
  55. data/lib/mongo/cluster/reapers/cursor_reaper.rb +21 -29
  56. data/lib/mongo/cluster/reapers/socket_reaper.rb +1 -6
  57. data/lib/mongo/cluster/sdam_flow.rb +136 -159
  58. data/lib/mongo/cluster/topology/base.rb +15 -18
  59. data/lib/mongo/cluster/topology/load_balanced.rb +24 -14
  60. data/lib/mongo/cluster/topology/no_replica_set_options.rb +3 -6
  61. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +20 -23
  62. data/lib/mongo/cluster/topology/replica_set_with_primary.rb +0 -2
  63. data/lib/mongo/cluster/topology/sharded.rb +19 -9
  64. data/lib/mongo/cluster/topology/single.rb +24 -14
  65. data/lib/mongo/cluster/topology/unknown.rb +20 -10
  66. data/lib/mongo/cluster/topology.rb +29 -25
  67. data/lib/mongo/cluster.rb +152 -184
  68. data/lib/mongo/cluster_time.rb +14 -31
  69. data/lib/mongo/collection/helpers.rb +5 -8
  70. data/lib/mongo/collection/view/aggregation/behavior.rb +1 -1
  71. data/lib/mongo/collection/view/aggregation.rb +10 -12
  72. data/lib/mongo/collection/view/builder/aggregation.rb +6 -9
  73. data/lib/mongo/collection/view/builder/map_reduce.rb +18 -17
  74. data/lib/mongo/collection/view/builder.rb +0 -1
  75. data/lib/mongo/collection/view/change_stream/retryable.rb +3 -8
  76. data/lib/mongo/collection/view/change_stream.rb +59 -58
  77. data/lib/mongo/collection/view/explainable.rb +11 -20
  78. data/lib/mongo/collection/view/immutable.rb +1 -3
  79. data/lib/mongo/collection/view/iterable.rb +44 -35
  80. data/lib/mongo/collection/view/map_reduce.rb +20 -25
  81. data/lib/mongo/collection/view/readable.rb +96 -94
  82. data/lib/mongo/collection/view/writable.rb +104 -114
  83. data/lib/mongo/collection/view.rb +11 -8
  84. data/lib/mongo/collection.rb +103 -106
  85. data/lib/mongo/condition_variable.rb +4 -4
  86. data/lib/mongo/config/options.rb +0 -3
  87. data/lib/mongo/config/validators/option.rb +3 -5
  88. data/lib/mongo/config.rb +6 -4
  89. data/lib/mongo/crypt/auto_decryption_context.rb +9 -3
  90. data/lib/mongo/crypt/auto_encrypter.rb +34 -43
  91. data/lib/mongo/crypt/auto_encryption_context.rb +0 -3
  92. data/lib/mongo/crypt/binary.rb +5 -9
  93. data/lib/mongo/crypt/binding.rb +150 -156
  94. data/lib/mongo/crypt/context.rb +20 -17
  95. data/lib/mongo/crypt/data_key_context.rb +2 -7
  96. data/lib/mongo/crypt/encryption_io.rb +29 -39
  97. data/lib/mongo/crypt/explicit_decryption_context.rb +9 -3
  98. data/lib/mongo/crypt/explicit_encrypter.rb +1 -1
  99. data/lib/mongo/crypt/explicit_encryption_context.rb +19 -30
  100. data/lib/mongo/crypt/explicit_encryption_expression_context.rb +0 -2
  101. data/lib/mongo/crypt/handle.rb +42 -48
  102. data/lib/mongo/crypt/hooks.rb +12 -15
  103. data/lib/mongo/crypt/kms/aws/credentials.rb +12 -16
  104. data/lib/mongo/crypt/kms/aws/master_document.rb +6 -9
  105. data/lib/mongo/crypt/kms/aws.rb +0 -2
  106. data/lib/mongo/crypt/kms/azure/credentials_retriever.rb +2 -7
  107. data/lib/mongo/crypt/kms/azure/master_document.rb +15 -19
  108. data/lib/mongo/crypt/kms/azure.rb +0 -1
  109. data/lib/mongo/crypt/kms/credentials.rb +13 -27
  110. data/lib/mongo/crypt/kms/gcp/credentials.rb +12 -14
  111. data/lib/mongo/crypt/kms/gcp/credentials_retriever.rb +7 -9
  112. data/lib/mongo/crypt/kms/gcp/master_document.rb +12 -16
  113. data/lib/mongo/crypt/kms/gcp.rb +0 -2
  114. data/lib/mongo/crypt/kms/kmip/credentials.rb +7 -8
  115. data/lib/mongo/crypt/kms/kmip/master_document.rb +3 -5
  116. data/lib/mongo/crypt/kms/kmip.rb +0 -1
  117. data/lib/mongo/crypt/kms/local/credentials.rb +7 -8
  118. data/lib/mongo/crypt/kms/local/master_document.rb +2 -6
  119. data/lib/mongo/crypt/kms/local.rb +0 -1
  120. data/lib/mongo/crypt/kms/master_key_document.rb +11 -15
  121. data/lib/mongo/crypt/kms.rb +14 -16
  122. data/lib/mongo/crypt/kms_context.rb +0 -2
  123. data/lib/mongo/crypt/rewrap_many_data_key_context.rb +2 -7
  124. data/lib/mongo/crypt/rewrap_many_data_key_result.rb +2 -4
  125. data/lib/mongo/crypt/status.rb +12 -14
  126. data/lib/mongo/crypt.rb +0 -1
  127. data/lib/mongo/csot_timeout_holder.rb +3 -2
  128. data/lib/mongo/cursor/kill_spec.rb +7 -10
  129. data/lib/mongo/cursor.rb +74 -64
  130. data/lib/mongo/cursor_host.rb +8 -10
  131. data/lib/mongo/database/view.rb +23 -39
  132. data/lib/mongo/database.rb +68 -65
  133. data/lib/mongo/dbref.rb +0 -1
  134. data/lib/mongo/deprecations.rb +98 -0
  135. data/lib/mongo/distinguishing_semaphore.rb +0 -1
  136. data/lib/mongo/error/auth_error.rb +0 -2
  137. data/lib/mongo/error/bad_load_balancer_target.rb +0 -2
  138. data/lib/mongo/error/bulk_write_error.rb +7 -10
  139. data/lib/mongo/error/change_stream_resumable.rb +0 -2
  140. data/lib/mongo/error/client_closed.rb +0 -2
  141. data/lib/mongo/error/closed_stream.rb +1 -4
  142. data/lib/mongo/error/connection_check_out_timeout.rb +3 -6
  143. data/lib/mongo/error/connection_perished.rb +0 -2
  144. data/lib/mongo/error/connection_unavailable.rb +0 -2
  145. data/lib/mongo/error/credential_check_error.rb +0 -2
  146. data/lib/mongo/error/crypt_error.rb +0 -2
  147. data/lib/mongo/error/extra_file_chunk.rb +1 -4
  148. data/lib/mongo/error/failed_string_prep_validation.rb +5 -6
  149. data/lib/mongo/error/file_not_found.rb +0 -3
  150. data/lib/mongo/error/handshake_error.rb +0 -2
  151. data/lib/mongo/error/insufficient_iteration_count.rb +1 -4
  152. data/lib/mongo/error/internal_driver_error.rb +0 -2
  153. data/lib/mongo/error/invalid_address.rb +0 -2
  154. data/lib/mongo/error/invalid_application_name.rb +0 -3
  155. data/lib/mongo/error/invalid_bulk_operation.rb +1 -4
  156. data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -4
  157. data/lib/mongo/error/invalid_collection_name.rb +1 -4
  158. data/lib/mongo/error/invalid_config_option.rb +0 -3
  159. data/lib/mongo/error/invalid_cursor_operation.rb +0 -2
  160. data/lib/mongo/error/invalid_database_name.rb +1 -4
  161. data/lib/mongo/error/invalid_document.rb +1 -4
  162. data/lib/mongo/error/invalid_file.rb +0 -3
  163. data/lib/mongo/error/invalid_file_revision.rb +0 -3
  164. data/lib/mongo/error/invalid_min_pool_size.rb +0 -3
  165. data/lib/mongo/error/invalid_nonce.rb +0 -3
  166. data/lib/mongo/error/invalid_read_concern.rb +2 -4
  167. data/lib/mongo/error/invalid_read_option.rb +0 -3
  168. data/lib/mongo/error/invalid_replacement_document.rb +2 -5
  169. data/lib/mongo/error/invalid_server_auth_host.rb +0 -2
  170. data/lib/mongo/error/invalid_server_auth_response.rb +0 -2
  171. data/lib/mongo/error/invalid_server_preference.rb +7 -16
  172. data/lib/mongo/error/invalid_session.rb +1 -4
  173. data/lib/mongo/error/invalid_signature.rb +0 -3
  174. data/lib/mongo/error/invalid_transaction_operation.rb +5 -8
  175. data/lib/mongo/error/invalid_txt_record.rb +0 -2
  176. data/lib/mongo/error/invalid_update_document.rb +2 -5
  177. data/lib/mongo/error/invalid_uri.rb +1 -4
  178. data/lib/mongo/error/invalid_write_concern.rb +2 -5
  179. data/lib/mongo/error/kms_error.rb +0 -2
  180. data/lib/mongo/error/labelable.rb +0 -3
  181. data/lib/mongo/error/lint_error.rb +0 -2
  182. data/lib/mongo/error/max_bson_size.rb +8 -11
  183. data/lib/mongo/error/max_message_size.rb +2 -5
  184. data/lib/mongo/error/mismatched_domain.rb +0 -2
  185. data/lib/mongo/error/missing_connection.rb +0 -2
  186. data/lib/mongo/error/missing_file_chunk.rb +0 -3
  187. data/lib/mongo/error/missing_password.rb +0 -2
  188. data/lib/mongo/error/missing_resume_token.rb +1 -4
  189. data/lib/mongo/error/missing_scram_server_signature.rb +2 -4
  190. data/lib/mongo/error/missing_service_id.rb +0 -2
  191. data/lib/mongo/error/mongocryptd_spawn_error.rb +0 -2
  192. data/lib/mongo/error/multi_index_drop.rb +0 -3
  193. data/lib/mongo/error/need_primary_server.rb +0 -2
  194. data/lib/mongo/error/no_server_available.rb +3 -8
  195. data/lib/mongo/error/no_service_connection_available.rb +1 -3
  196. data/lib/mongo/error/no_srv_records.rb +0 -2
  197. data/lib/mongo/error/notable.rb +8 -16
  198. data/lib/mongo/error/operation_failure.rb +22 -35
  199. data/lib/mongo/error/parser.rb +33 -75
  200. data/lib/mongo/error/pool_cleared_error.rb +1 -3
  201. data/lib/mongo/error/pool_closed_error.rb +0 -3
  202. data/lib/mongo/error/pool_error.rb +0 -3
  203. data/lib/mongo/error/pool_paused_error.rb +0 -2
  204. data/lib/mongo/error/raise_original_error.rb +1 -3
  205. data/lib/mongo/error/read_write_retryable.rb +14 -17
  206. data/lib/mongo/error/sdam_error_detection.rb +3 -5
  207. data/lib/mongo/error/server_api_conflict.rb +0 -2
  208. data/lib/mongo/error/server_certificate_revoked.rb +0 -2
  209. data/lib/mongo/error/server_not_usable.rb +0 -2
  210. data/lib/mongo/error/session_ended.rb +1 -3
  211. data/lib/mongo/error/session_not_materialized.rb +1 -3
  212. data/lib/mongo/error/sessions_not_supported.rb +1 -4
  213. data/lib/mongo/error/snapshot_session_invalid_server_version.rb +1 -4
  214. data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +1 -4
  215. data/lib/mongo/error/socket_error.rb +0 -2
  216. data/lib/mongo/error/socket_timeout_error.rb +0 -2
  217. data/lib/mongo/error/transactions_not_supported.rb +3 -6
  218. data/lib/mongo/error/unchangeable_collection_option.rb +1 -4
  219. data/lib/mongo/error/unexpected_chunk_length.rb +0 -3
  220. data/lib/mongo/error/unexpected_response.rb +1 -4
  221. data/lib/mongo/error/unknown_payload_type.rb +0 -3
  222. data/lib/mongo/error/unmet_dependency.rb +0 -2
  223. data/lib/mongo/error/unsupported_array_filters.rb +3 -24
  224. data/lib/mongo/error/unsupported_collation.rb +3 -24
  225. data/lib/mongo/error/unsupported_features.rb +0 -2
  226. data/lib/mongo/error/unsupported_message_type.rb +0 -2
  227. data/lib/mongo/error/unsupported_option.rb +19 -21
  228. data/lib/mongo/error/write_retryable.rb +0 -2
  229. data/lib/mongo/error.rb +10 -24
  230. data/lib/mongo/event/base.rb +0 -2
  231. data/lib/mongo/event/listeners.rb +0 -3
  232. data/lib/mongo/event/publisher.rb +0 -3
  233. data/lib/mongo/event/subscriber.rb +0 -4
  234. data/lib/mongo/event.rb +4 -6
  235. data/lib/mongo/grid/file/chunk.rb +7 -10
  236. data/lib/mongo/grid/file/info.rb +20 -24
  237. data/lib/mongo/grid/file.rb +7 -8
  238. data/lib/mongo/grid/fs_bucket.rb +40 -48
  239. data/lib/mongo/grid/stream/read.rb +25 -35
  240. data/lib/mongo/grid/stream/write.rb +17 -22
  241. data/lib/mongo/grid/stream.rb +2 -4
  242. data/lib/mongo/grid.rb +0 -1
  243. data/lib/mongo/id.rb +0 -1
  244. data/lib/mongo/index/view.rb +68 -58
  245. data/lib/mongo/index.rb +7 -10
  246. data/lib/mongo/lint.rb +31 -37
  247. data/lib/mongo/loggable.rb +5 -8
  248. data/lib/mongo/logger.rb +1 -7
  249. data/lib/mongo/monitoring/cmap_log_subscriber.rb +0 -2
  250. data/lib/mongo/monitoring/command_log_subscriber.rb +25 -33
  251. data/lib/mongo/monitoring/event/cmap/base.rb +0 -2
  252. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -4
  253. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +0 -3
  254. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +1 -4
  255. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +2 -5
  256. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +1 -4
  257. data/lib/mongo/monitoring/event/cmap/connection_created.rb +1 -4
  258. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +1 -4
  259. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +0 -3
  260. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +1 -4
  261. data/lib/mongo/monitoring/event/cmap/pool_created.rb +1 -4
  262. data/lib/mongo/monitoring/event/cmap/pool_ready.rb +1 -4
  263. data/lib/mongo/monitoring/event/cmap.rb +0 -1
  264. data/lib/mongo/monitoring/event/command_failed.rb +5 -9
  265. data/lib/mongo/monitoring/event/command_started.rb +8 -12
  266. data/lib/mongo/monitoring/event/command_succeeded.rb +7 -15
  267. data/lib/mongo/monitoring/event/secure.rb +15 -20
  268. data/lib/mongo/monitoring/event/server_closed.rb +1 -4
  269. data/lib/mongo/monitoring/event/server_description_changed.rb +4 -8
  270. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +5 -10
  271. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +1 -4
  272. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +3 -8
  273. data/lib/mongo/monitoring/event/server_opening.rb +1 -4
  274. data/lib/mongo/monitoring/event/topology_changed.rb +2 -5
  275. data/lib/mongo/monitoring/event/topology_closed.rb +1 -4
  276. data/lib/mongo/monitoring/event/topology_opening.rb +1 -4
  277. data/lib/mongo/monitoring/event.rb +0 -1
  278. data/lib/mongo/monitoring/publishable.rb +20 -30
  279. data/lib/mongo/monitoring/sdam_log_subscriber.rb +0 -2
  280. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +0 -3
  281. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +0 -3
  282. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +0 -3
  283. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +5 -8
  284. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +0 -3
  285. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +0 -3
  286. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +1 -3
  287. data/lib/mongo/monitoring.rb +38 -39
  288. data/lib/mongo/operation/aggregate/op_msg.rb +0 -2
  289. data/lib/mongo/operation/aggregate/result.rb +3 -6
  290. data/lib/mongo/operation/aggregate.rb +0 -2
  291. data/lib/mongo/operation/collections_info/result.rb +0 -3
  292. data/lib/mongo/operation/collections_info.rb +0 -2
  293. data/lib/mongo/operation/command/op_msg.rb +1 -4
  294. data/lib/mongo/operation/command.rb +0 -2
  295. data/lib/mongo/operation/context.rb +13 -16
  296. data/lib/mongo/operation/count/op_msg.rb +2 -4
  297. data/lib/mongo/operation/count.rb +0 -2
  298. data/lib/mongo/operation/create/op_msg.rb +2 -5
  299. data/lib/mongo/operation/create.rb +4 -2
  300. data/lib/mongo/operation/create_index/op_msg.rb +3 -7
  301. data/lib/mongo/operation/create_index.rb +0 -2
  302. data/lib/mongo/operation/create_user/op_msg.rb +2 -4
  303. data/lib/mongo/operation/create_user.rb +0 -2
  304. data/lib/mongo/operation/delete/bulk_result.rb +2 -3
  305. data/lib/mongo/operation/delete/op_msg.rb +3 -10
  306. data/lib/mongo/operation/delete/result.rb +0 -3
  307. data/lib/mongo/operation/delete.rb +1 -5
  308. data/lib/mongo/operation/distinct/op_msg.rb +2 -5
  309. data/lib/mongo/operation/distinct.rb +0 -2
  310. data/lib/mongo/operation/drop/op_msg.rb +0 -2
  311. data/lib/mongo/operation/drop.rb +0 -2
  312. data/lib/mongo/operation/drop_database/op_msg.rb +0 -2
  313. data/lib/mongo/operation/drop_database.rb +0 -2
  314. data/lib/mongo/operation/drop_index/op_msg.rb +4 -6
  315. data/lib/mongo/operation/drop_index.rb +0 -2
  316. data/lib/mongo/operation/explain/op_msg.rb +0 -2
  317. data/lib/mongo/operation/explain/result.rb +0 -3
  318. data/lib/mongo/operation/explain.rb +0 -2
  319. data/lib/mongo/operation/find/builder/command.rb +4 -12
  320. data/lib/mongo/operation/find/builder/flags.rb +9 -15
  321. data/lib/mongo/operation/find/builder/modifiers.rb +1 -4
  322. data/lib/mongo/operation/find/builder.rb +0 -1
  323. data/lib/mongo/operation/find/op_msg.rb +4 -12
  324. data/lib/mongo/operation/find/result.rb +0 -3
  325. data/lib/mongo/operation/find.rb +0 -2
  326. data/lib/mongo/operation/get_more/command_builder.rb +1 -6
  327. data/lib/mongo/operation/get_more/op_msg.rb +10 -4
  328. data/lib/mongo/operation/get_more/result.rb +0 -3
  329. data/lib/mongo/operation/get_more.rb +0 -2
  330. data/lib/mongo/operation/indexes/op_msg.rb +0 -2
  331. data/lib/mongo/operation/indexes/result.rb +1 -5
  332. data/lib/mongo/operation/indexes.rb +0 -2
  333. data/lib/mongo/operation/insert/bulk_result.rb +2 -6
  334. data/lib/mongo/operation/insert/op_msg.rb +7 -6
  335. data/lib/mongo/operation/insert/result.rb +0 -3
  336. data/lib/mongo/operation/insert.rb +2 -5
  337. data/lib/mongo/operation/kill_cursors/command_builder.rb +0 -3
  338. data/lib/mongo/operation/kill_cursors/op_msg.rb +1 -3
  339. data/lib/mongo/operation/kill_cursors.rb +0 -2
  340. data/lib/mongo/operation/list_collections/op_msg.rb +4 -6
  341. data/lib/mongo/operation/list_collections/result.rb +1 -4
  342. data/lib/mongo/operation/list_collections.rb +0 -2
  343. data/lib/mongo/operation/map_reduce/op_msg.rb +0 -2
  344. data/lib/mongo/operation/map_reduce/result.rb +3 -6
  345. data/lib/mongo/operation/map_reduce.rb +0 -2
  346. data/lib/mongo/operation/op_msg_base.rb +0 -1
  347. data/lib/mongo/operation/parallel_scan/op_msg.rb +4 -5
  348. data/lib/mongo/operation/parallel_scan/result.rb +2 -5
  349. data/lib/mongo/operation/parallel_scan.rb +0 -2
  350. data/lib/mongo/operation/remove_user/op_msg.rb +2 -4
  351. data/lib/mongo/operation/remove_user.rb +0 -2
  352. data/lib/mongo/operation/result.rb +38 -48
  353. data/lib/mongo/operation/shared/bypass_document_validation.rb +3 -7
  354. data/lib/mongo/operation/shared/causal_consistency_supported.rb +0 -3
  355. data/lib/mongo/operation/shared/executable.rb +29 -31
  356. data/lib/mongo/operation/shared/executable_no_validate.rb +0 -3
  357. data/lib/mongo/operation/shared/executable_transaction_label.rb +0 -2
  358. data/lib/mongo/operation/shared/idable.rb +3 -6
  359. data/lib/mongo/operation/shared/limited.rb +0 -3
  360. data/lib/mongo/operation/shared/object_id_generator.rb +0 -3
  361. data/lib/mongo/operation/shared/op_msg_executable.rb +0 -2
  362. data/lib/mongo/operation/shared/polymorphic_lookup.rb +0 -2
  363. data/lib/mongo/operation/shared/polymorphic_result.rb +2 -4
  364. data/lib/mongo/operation/shared/read_preference_supported.rb +10 -15
  365. data/lib/mongo/operation/shared/response_handling.rb +13 -26
  366. data/lib/mongo/operation/shared/result/aggregatable.rb +12 -13
  367. data/lib/mongo/operation/shared/sessions_supported.rb +87 -99
  368. data/lib/mongo/operation/shared/specifiable.rb +37 -59
  369. data/lib/mongo/operation/shared/write.rb +12 -17
  370. data/lib/mongo/operation/shared/write_concern_supported.rb +4 -7
  371. data/lib/mongo/operation/update/bulk_result.rb +13 -17
  372. data/lib/mongo/operation/update/op_msg.rb +2 -5
  373. data/lib/mongo/operation/update/result.rb +5 -5
  374. data/lib/mongo/operation/update.rb +1 -5
  375. data/lib/mongo/operation/update_user/op_msg.rb +2 -4
  376. data/lib/mongo/operation/update_user.rb +0 -2
  377. data/lib/mongo/operation/users_info/op_msg.rb +2 -4
  378. data/lib/mongo/operation/users_info/result.rb +1 -4
  379. data/lib/mongo/operation/users_info.rb +0 -2
  380. data/lib/mongo/operation/write_command/op_msg.rb +2 -10
  381. data/lib/mongo/operation/write_command.rb +0 -2
  382. data/lib/mongo/operation.rb +9 -14
  383. data/lib/mongo/options/mapper.rb +8 -15
  384. data/lib/mongo/options/redacted.rb +7 -9
  385. data/lib/mongo/options.rb +0 -1
  386. data/lib/mongo/protocol/bit_vector.rb +3 -5
  387. data/lib/mongo/protocol/caching_hash.rb +2 -7
  388. data/lib/mongo/protocol/compressed.rb +5 -10
  389. data/lib/mongo/protocol/get_more.rb +2 -8
  390. data/lib/mongo/protocol/kill_cursors.rb +2 -8
  391. data/lib/mongo/protocol/message.rb +103 -105
  392. data/lib/mongo/protocol/msg.rb +48 -63
  393. data/lib/mongo/protocol/query.rb +32 -41
  394. data/lib/mongo/protocol/registry.rb +2 -5
  395. data/lib/mongo/protocol/reply.rb +10 -16
  396. data/lib/mongo/protocol/serializers.rb +41 -59
  397. data/lib/mongo/protocol.rb +0 -1
  398. data/lib/mongo/query_cache.rb +7 -15
  399. data/lib/mongo/retryable/backpressure.rb +31 -0
  400. data/lib/mongo/retryable/base_worker.rb +39 -13
  401. data/lib/mongo/retryable/read_worker.rb +77 -21
  402. data/lib/mongo/retryable/retry_policy.rb +59 -0
  403. data/lib/mongo/retryable/write_worker.rb +155 -56
  404. data/lib/mongo/retryable.rb +70 -9
  405. data/lib/mongo/search_index/view.rb +30 -10
  406. data/lib/mongo/semaphore.rb +0 -1
  407. data/lib/mongo/server/app_metadata/environment.rb +3 -3
  408. data/lib/mongo/server/app_metadata/platform.rb +17 -4
  409. data/lib/mongo/server/app_metadata.rb +4 -5
  410. data/lib/mongo/server/connection.rb +79 -61
  411. data/lib/mongo/server/connection_base.rb +43 -53
  412. data/lib/mongo/server/connection_common.rb +41 -64
  413. data/lib/mongo/server/connection_pool/generation_manager.rb +6 -11
  414. data/lib/mongo/server/connection_pool/populator.rb +1 -4
  415. data/lib/mongo/server/connection_pool.rb +195 -167
  416. data/lib/mongo/server/description/features.rb +51 -59
  417. data/lib/mongo/server/description/load_balancer.rb +0 -2
  418. data/lib/mongo/server/description.rb +117 -138
  419. data/lib/mongo/server/monitor/app_metadata.rb +3 -4
  420. data/lib/mongo/server/monitor/connection.rb +28 -35
  421. data/lib/mongo/server/monitor.rb +65 -60
  422. data/lib/mongo/server/pending_connection.rb +70 -71
  423. data/lib/mongo/server/push_monitor/connection.rb +0 -3
  424. data/lib/mongo/server/push_monitor.rb +21 -29
  425. data/lib/mongo/server/round_trip_time_calculator.rb +11 -17
  426. data/lib/mongo/server.rb +62 -94
  427. data/lib/mongo/server_selector/base.rb +133 -157
  428. data/lib/mongo/server_selector/nearest.rb +2 -5
  429. data/lib/mongo/server_selector/primary.rb +1 -5
  430. data/lib/mongo/server_selector/primary_preferred.rb +2 -6
  431. data/lib/mongo/server_selector/secondary.rb +2 -6
  432. data/lib/mongo/server_selector/secondary_preferred.rb +1 -5
  433. data/lib/mongo/server_selector.rb +3 -4
  434. data/lib/mongo/session/server_session.rb +6 -7
  435. data/lib/mongo/session/session_pool.rb +20 -34
  436. data/lib/mongo/session.rb +334 -199
  437. data/lib/mongo/socket/ocsp_cache.rb +8 -13
  438. data/lib/mongo/socket/ocsp_verifier.rb +69 -70
  439. data/lib/mongo/socket/ssl.rb +44 -43
  440. data/lib/mongo/socket/tcp.rb +5 -8
  441. data/lib/mongo/socket/unix.rb +0 -4
  442. data/lib/mongo/socket.rb +80 -102
  443. data/lib/mongo/srv/monitor.rb +10 -11
  444. data/lib/mongo/srv/resolver.rb +15 -24
  445. data/lib/mongo/srv/result.rb +25 -21
  446. data/lib/mongo/srv.rb +0 -1
  447. data/lib/mongo/timeout.rb +4 -11
  448. data/lib/mongo/topology_version.rb +8 -13
  449. data/lib/mongo/tracing/open_telemetry/command_tracer.rb +320 -0
  450. data/lib/mongo/tracing/open_telemetry/operation_tracer.rb +227 -0
  451. data/lib/mongo/tracing/open_telemetry/tracer.rb +236 -0
  452. data/lib/mongo/{error/server_api_not_supported.rb → tracing/open_telemetry.rb} +10 -10
  453. data/lib/mongo/tracing.rb +42 -0
  454. data/lib/mongo/uri/options_mapper.rb +135 -126
  455. data/lib/mongo/uri/srv_protocol.rb +34 -42
  456. data/lib/mongo/uri.rb +95 -139
  457. data/lib/mongo/utils.rb +5 -12
  458. data/lib/mongo/version.rb +1 -1
  459. data/lib/mongo/write_concern/acknowledged.rb +0 -2
  460. data/lib/mongo/write_concern/base.rb +6 -6
  461. data/lib/mongo/write_concern/unacknowledged.rb +0 -2
  462. data/lib/mongo/write_concern.rb +14 -15
  463. data/lib/mongo.rb +4 -3
  464. data/mongo.gemspec +17 -17
  465. metadata +11 -5
  466. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +0 -32
  467. data/lib/mongo/operation/shared/validatable.rb +0 -87
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2018-2020 MongoDB Inc.
5
4
  #
@@ -17,7 +16,6 @@
17
16
 
18
17
  module Mongo
19
18
  module Operation
20
-
21
19
  # Shared behavior of instantiating a result class matching the
22
20
  # operation class.
23
21
  #
@@ -28,12 +26,12 @@ module Mongo
28
26
  module PolymorphicResult
29
27
  include PolymorphicLookup
30
28
 
31
- private
32
-
33
29
  def self.included(base)
34
30
  base.extend ClassMethods
35
31
  end
36
32
 
33
+ private
34
+
37
35
  module ClassMethods
38
36
  attr_accessor :result_class
39
37
  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
  #
@@ -17,7 +16,6 @@
17
16
 
18
17
  module Mongo
19
18
  module Operation
20
-
21
19
  # Read preference handling for pre-OP_MSG operation implementations.
22
20
  #
23
21
  # This module is not used by OP_MSG operation classes (those deriving
@@ -27,7 +25,6 @@ module Mongo
27
25
  # @since 2.5.2
28
26
  # @api private
29
27
  module ReadPreferenceSupported
30
-
31
28
  private
32
29
 
33
30
  # Get the options for executing the operation on a particular connection.
@@ -70,7 +67,7 @@ module Mongo
70
67
  # In replica sets and sharded clusters, read preference is passed
71
68
  # to the server if one is specified by the application, and there
72
69
  # is no default.
73
- read && read.secondary_ok? || false
70
+ (read && read.secondary_ok?) || false
74
71
  end
75
72
  end
76
73
 
@@ -96,18 +93,16 @@ module Mongo
96
93
  #
97
94
  # @return [ Hash ] New command document to send to the server.
98
95
  def add_read_preference_legacy(sel, connection)
96
+ # If the read preference contains only mode and mode is secondary
97
+ # preferred and we are sending to a pre-OP_MSG server, this read
98
+ # preference is indicated by the :secondary_ok wire protocol flag
99
+ # and $readPreference command parameter isn't sent.
99
100
  if read && (
100
- connection.description.mongos? || connection.description.load_balancer?
101
- ) && read_pref = read.to_mongos
102
- # If the read preference contains only mode and mode is secondary
103
- # preferred and we are sending to a pre-OP_MSG server, this read
104
- # preference is indicated by the :secondary_ok wire protocol flag
105
- # and $readPreference command parameter isn't sent.
106
- if read_pref != {mode: 'secondaryPreferred'}
107
- Mongo::Lint.validate_camel_case_read_preference(read_pref)
108
- sel = sel[:$query] ? sel : {:$query => sel}
109
- sel = sel.merge(:$readPreference => read_pref)
110
- end
101
+ connection.description.mongos? || connection.description.load_balancer?
102
+ ) && (read_pref = read.to_mongos) && (read_pref != { mode: 'secondaryPreferred' })
103
+ Mongo::Lint.validate_camel_case_read_preference(read_pref)
104
+ sel = { :$query => sel } unless sel[:$query]
105
+ sel = sel.merge(:$readPreference => read_pref)
111
106
  end
112
107
  sel
113
108
  end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2019-2020 MongoDB Inc.
5
4
  #
@@ -17,12 +16,10 @@
17
16
 
18
17
  module Mongo
19
18
  module Operation
20
-
21
19
  # Shared behavior of response handling for operations.
22
20
  #
23
21
  # @api private
24
22
  module ResponseHandling
25
-
26
23
  private
27
24
 
28
25
  # @param [ Mongo::Operation::Result ] result The operation result.
@@ -52,12 +49,8 @@ module Mongo
52
49
  def add_error_labels(connection, context)
53
50
  yield
54
51
  rescue Mongo::Error::SocketError => e
55
- if context.in_transaction? && !context.committing_transaction?
56
- e.add_label('TransientTransactionError')
57
- end
58
- if context.committing_transaction?
59
- e.add_label('UnknownTransactionCommitResult')
60
- end
52
+ e.add_label('TransientTransactionError') if context.in_transaction? && !context.committing_transaction?
53
+ e.add_label('UnknownTransactionCommitResult') if context.committing_transaction?
61
54
 
62
55
  maybe_add_retryable_write_error_label!(e, connection, context)
63
56
 
@@ -66,12 +59,10 @@ module Mongo
66
59
  maybe_add_retryable_write_error_label!(e, connection, context)
67
60
  raise e
68
61
  rescue Mongo::Error::OperationFailure::Family => e
69
- if context.committing_transaction?
70
- if e.write_retryable? || e.wtimeout? || (e.write_concern_error? &&
62
+ if context.committing_transaction? && (e.write_retryable? || e.wtimeout? || (e.write_concern_error? &&
71
63
  !Session::UNLABELED_WRITE_CONCERN_CODES.include?(e.write_concern_error_code)
72
- ) || e.max_time_ms_expired?
73
- e.add_label('UnknownTransactionCommitResult')
74
- end
64
+ ) || e.max_time_ms_expired?)
65
+ e.add_label('UnknownTransactionCommitResult')
75
66
  end
76
67
 
77
68
  maybe_add_retryable_write_error_label!(e, connection, context)
@@ -91,9 +82,7 @@ module Mongo
91
82
  def unpin_maybe(session, connection)
92
83
  yield
93
84
  rescue Mongo::Error => e
94
- if session
95
- session.unpin_maybe(e, connection)
96
- end
85
+ session.unpin_maybe(e, connection) if session
97
86
  raise
98
87
  end
99
88
 
@@ -115,8 +104,6 @@ module Mongo
115
104
  raise e
116
105
  end
117
106
 
118
- private
119
-
120
107
  # A method that will add the RetryableWriteError label to an error if
121
108
  # any of the following conditions are true:
122
109
  #
@@ -126,8 +113,8 @@ module Mongo
126
113
  # AND the server does not support adding the RetryableWriteError label OR
127
114
  # the error is a network error (i.e. the driver must add the label)
128
115
  #
129
- # AND the error occured during a commitTransaction or abortTransaction
130
- # OR the error occured during a write outside of a transaction on a
116
+ # AND the error occurred during a commitTransaction or abortTransaction
117
+ # OR the error occurred during a write outside of a transaction on a
131
118
  # client that has retry writes enabled.
132
119
  #
133
120
  # If these conditions are met, the original error will be mutated.
@@ -150,8 +137,8 @@ module Mongo
150
137
  # Note: any write operation within a transaction (excepting commit and
151
138
  # abort is NOT a retryable operation)
152
139
  retryable_operation = context.committing_transaction? ||
153
- context.aborting_transaction? ||
154
- !context.in_transaction? && context.any_retry_writes?
140
+ context.aborting_transaction? ||
141
+ (!context.in_transaction? && context.any_retry_writes?)
155
142
 
156
143
  # An operation should add the RetryableWriteError label if one of the
157
144
  # following conditions is met:
@@ -163,9 +150,9 @@ module Mongo
163
150
  error.is_a?(Mongo::Error::SocketError) ||
164
151
  error.is_a?(Mongo::Error::SocketTimeoutError)
165
152
 
166
- if retryable_operation && should_add_error_label && error.write_retryable?
167
- error.add_label('RetryableWriteError')
168
- end
153
+ return unless retryable_operation && should_add_error_label && error.write_retryable?
154
+
155
+ error.add_label('RetryableWriteError')
169
156
  end
170
157
  end
171
158
  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
  #
@@ -18,13 +17,11 @@
18
17
  module Mongo
19
18
  module Operation
20
19
  class Result
21
-
22
20
  # Defines custom behavior of bulk write results
23
21
  #
24
22
  # @since 2.0.0
25
23
  # @api private
26
24
  module Aggregatable
27
-
28
25
  # Aggregate the write errors returned from this result.
29
26
  #
30
27
  # @example Aggregate the write errors.
@@ -37,13 +34,14 @@ module Mongo
37
34
  # @since 2.0.0
38
35
  def aggregate_write_errors(count)
39
36
  return unless @replies
37
+
40
38
  @replies.reduce(nil) do |errors, reply|
41
- if write_errors = reply.documents.first['writeErrors']
42
- wes = write_errors.collect do |we|
43
- we.merge!('index' => count + we['index'])
44
- end
45
- (errors || []) << wes if wes
39
+ next unless write_errors = reply.documents.first['writeErrors']
40
+
41
+ wes = write_errors.collect do |we|
42
+ we.merge!('index' => count + we['index'])
46
43
  end
44
+ (errors || []) << wes if wes
47
45
  end
48
46
  end
49
47
 
@@ -59,12 +57,13 @@ module Mongo
59
57
  # @since 2.0.0
60
58
  def aggregate_write_concern_errors(count)
61
59
  return unless @replies
60
+
62
61
  @replies.each_with_index.reduce(nil) do |errors, (reply, _)|
63
- if write_concern_errors = reply.documents.first['writeConcernErrors']
64
- (errors || []) << write_concern_errors.reduce(nil) do |errs, wce|
65
- wce.merge!('index' => count + wce['index'])
66
- (errs || []) << write_concern_error
67
- end
62
+ next unless write_concern_errors = reply.documents.first['writeConcernErrors']
63
+
64
+ (errors || []) << write_concern_errors.reduce(nil) do |errs, wce|
65
+ wce.merge!('index' => count + wce['index'])
66
+ (errs || []) << write_concern_error
68
67
  end
69
68
  end
70
69
  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
  #
@@ -17,28 +16,26 @@
17
16
 
18
17
  module Mongo
19
18
  module Operation
20
-
21
19
  # Shared behavior of operations that support a session.
22
20
  #
23
21
  # @since 2.5.2
24
22
  # @api private
25
23
  module SessionsSupported
26
-
27
24
  private
28
25
 
29
26
  ZERO_TIMESTAMP = BSON::Timestamp.new(0, 0)
30
27
 
31
- READ_COMMANDS = [
32
- :aggregate,
33
- :count,
34
- :dbStats,
35
- :distinct,
36
- :find,
37
- :geoNear,
38
- :geoSearch,
39
- :group,
40
- :mapReduce,
41
- :parallelCollectionScan
28
+ READ_COMMANDS = %i[
29
+ aggregate
30
+ count
31
+ dbStats
32
+ distinct
33
+ find
34
+ geoNear
35
+ geoSearch
36
+ group
37
+ mapReduce
38
+ parallelCollectionScan
42
39
  ].freeze
43
40
 
44
41
  # Adds causal consistency document to the selector, if one can be
@@ -62,31 +59,32 @@ module Mongo
62
59
  # must have the current operation time. Also, topology must be
63
60
  # replica set or sharded cluster.
64
61
  def apply_causal_consistency_if_possible(selector, connection)
65
- if !connection.description.standalone?
66
- cc_doc = session.send(:causal_consistency_doc)
67
- if cc_doc
68
- rc_doc = (selector[:readConcern] || read_concern || {}).merge(cc_doc)
69
- selector[:readConcern] = Options::Mapper.transform_values_to_strings(
70
- rc_doc)
71
- end
72
- end
62
+ return if connection.description.standalone?
63
+
64
+ cc_doc = session.send(:causal_consistency_doc)
65
+ return unless cc_doc
66
+
67
+ rc_doc = (selector[:readConcern] || read_concern || {}).merge(cc_doc)
68
+ selector[:readConcern] = Options::Mapper.transform_values_to_strings(
69
+ rc_doc
70
+ )
73
71
  end
74
72
 
75
73
  def flags
76
- acknowledged_write? ? [] : [:more_to_come]
74
+ acknowledged_write? ? [] : [ :more_to_come ]
77
75
  end
78
76
 
79
77
  def apply_cluster_time!(selector, connection)
80
- if !connection.description.standalone?
81
- cluster_time = [
82
- connection.cluster_time,
83
- session&.cluster_time,
84
- ].compact.max
85
-
86
- if cluster_time
87
- selector['$clusterTime'] = cluster_time
88
- end
89
- end
78
+ return if connection.description.standalone?
79
+
80
+ cluster_time = [
81
+ connection.cluster_time,
82
+ session&.cluster_time,
83
+ ].compact.max
84
+
85
+ return unless cluster_time
86
+
87
+ selector['$clusterTime'] = cluster_time
90
88
  end
91
89
 
92
90
  def read_command?(sel)
@@ -126,10 +124,8 @@ module Mongo
126
124
  end
127
125
 
128
126
  def command(connection)
129
- if Lint.enabled?
130
- unless connection.is_a?(Server::Connection)
131
- raise Error::LintError, "Connection is not a Connection instance: #{connection}"
132
- end
127
+ if Lint.enabled? && !connection.is_a?(Server::Connection)
128
+ raise Error::LintError, "Connection is not a Connection instance: #{connection}"
133
129
  end
134
130
 
135
131
  sel = BSON::Document.new(selector(connection))
@@ -138,11 +134,9 @@ module Mongo
138
134
 
139
135
  add_read_preference(sel, connection)
140
136
 
141
- if connection.features.sessions_enabled?
137
+ if connection.description.logical_session_timeout
142
138
  apply_cluster_time!(sel, connection)
143
- if session && (acknowledged_write? || session.in_transaction?)
144
- apply_session_options(sel, connection)
145
- end
139
+ apply_session_options(sel, connection) if session && (acknowledged_write? || session.in_transaction?)
146
140
  elsif session && session.explicit?
147
141
  apply_session_options(sel, connection)
148
142
  end
@@ -169,47 +163,45 @@ module Mongo
169
163
 
170
164
  # https://github.com/mongodb/specifications/blob/master/source/server-selection/server-selection.md#topology-type-single
171
165
  read_doc = if connection.description.standalone?
172
- # Read preference is never sent to standalones.
173
- nil
174
- elsif connection.server.load_balancer?
175
- read&.to_mongos
176
- elsif connection.description.mongos?
177
- # When server is a mongos:
178
- # - $readPreference is never sent when mode is 'primary'
179
- # - Otherwise $readPreference is sent
180
- # When mode is 'secondaryPreferred' $readPreference is currently
181
- # required to only be sent when a non-mode field (i.e. tag_sets)
182
- # is present, but this causes wrong behavior (DRIVERS-1642).
183
- read&.to_mongos
184
- elsif connection.server.cluster.single?
185
- # In Single topology:
186
- # - If no read preference is specified by the application, the driver
187
- # adds mode: primaryPreferred.
188
- # - If a read preference is specified by the application, the driver
189
- # replaces the mode with primaryPreferred.
190
- read_doc = if read
191
- BSON::Document.new(read.to_doc)
192
- else
193
- BSON::Document.new
194
- end
195
- if [nil, 'primary'].include?(read_doc['mode'])
196
- read_doc['mode'] = 'primaryPreferred'
197
- end
198
- read_doc
199
- else
200
- # In replica sets, read preference is passed to the server if one
201
- # is specified by the application, except for primary read preferences.
202
- read_doc = BSON::Document.new(read&.to_doc || {})
203
- if [nil, 'primary'].include?(read_doc['mode'])
204
- nil
205
- else
206
- read_doc
207
- end
208
- end
209
-
210
- if read_doc
211
- sel['$readPreference'] = read_doc
212
- end
166
+ # Read preference is never sent to standalones.
167
+ nil
168
+ elsif connection.server.load_balancer?
169
+ read&.to_mongos
170
+ elsif connection.description.mongos?
171
+ # When server is a mongos:
172
+ # - $readPreference is never sent when mode is 'primary'
173
+ # - Otherwise $readPreference is sent
174
+ # When mode is 'secondaryPreferred' $readPreference is currently
175
+ # required to only be sent when a non-mode field (i.e. tag_sets)
176
+ # is present, but this causes wrong behavior (DRIVERS-1642).
177
+ read&.to_mongos
178
+ elsif connection.server.cluster.single?
179
+ # In Single topology:
180
+ # - If no read preference is specified by the application, the driver
181
+ # adds mode: primaryPreferred.
182
+ # - If a read preference is specified by the application, the driver
183
+ # replaces the mode with primaryPreferred.
184
+ read_doc = if read
185
+ BSON::Document.new(read.to_doc)
186
+ else
187
+ BSON::Document.new
188
+ end
189
+ read_doc['mode'] = 'primaryPreferred' if [ nil, 'primary' ].include?(read_doc['mode'])
190
+ read_doc
191
+ else
192
+ # In replica sets, read preference is passed to the server if one
193
+ # is specified by the application, except for primary read preferences.
194
+ read_doc = BSON::Document.new(read&.to_doc || {})
195
+ if [ nil, 'primary' ].include?(read_doc['mode'])
196
+ nil
197
+ else
198
+ read_doc
199
+ end
200
+ end
201
+
202
+ return unless read_doc
203
+
204
+ sel['$readPreference'] = read_doc
213
205
  end
214
206
 
215
207
  def apply_session_options(sel, connection)
@@ -224,27 +216,24 @@ module Mongo
224
216
  validate_read_preference!(sel)
225
217
  apply_txn_num!(sel)
226
218
  if session.recovery_token &&
227
- (sel[:commitTransaction] || sel[:abortTransaction])
228
- then
219
+ (sel[:commitTransaction] || sel[:abortTransaction])
229
220
  sel[:recoveryToken] = session.recovery_token
230
221
  end
231
222
 
232
- if session.snapshot?
233
- unless connection.description.server_version_gte?('5.0')
234
- raise Error::SnapshotSessionInvalidServerVersion
235
- end
223
+ return unless session.snapshot?
224
+ raise Error::SnapshotSessionInvalidServerVersion unless connection.description.server_version_gte?('5.0')
236
225
 
237
- sel[:readConcern] = {level: 'snapshot'}
238
- if session.snapshot_timestamp
239
- sel[:readConcern][:atClusterTime] = session.snapshot_timestamp
240
- end
241
- end
226
+ sel[:readConcern] = { level: 'snapshot' }
227
+ return unless session.snapshot_timestamp
228
+
229
+ sel[:readConcern][:atClusterTime] = session.snapshot_timestamp
242
230
  end
243
231
 
244
232
  def build_message(connection, context)
245
- if self.session != context.session
246
- if self.session
247
- raise Error::InternalDriverError, "Operation session #{self.session.inspect} does not match context session #{context.session.inspect}"
233
+ if session != context.session
234
+ if session
235
+ raise Error::InternalDriverError,
236
+ "Operation session #{session.inspect} does not match context session #{context.session.inspect}"
248
237
  else
249
238
  # Some operations are not constructed with sessions but are
250
239
  # executed in a context where a session is available.
@@ -261,9 +250,8 @@ module Mongo
261
250
  # later prior to being sent to the connection.
262
251
  buf = BSON::ByteBuffer.new
263
252
  message.serialize(buf)
264
- if buf.length > connection.max_message_size
265
- raise Error::MaxMessageSize.new(connection.max_message_size)
266
- end
253
+ raise Error::MaxMessageSize.new(connection.max_message_size) if buf.length > connection.max_message_size
254
+
267
255
  session.update_state!
268
256
  end
269
257
  end