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) 2018-2020 MongoDB Inc.
5
4
  #
@@ -21,8 +20,7 @@ require 'mongo/auth/stringprep/profiles/sasl'
21
20
  module Mongo
22
21
  module Auth
23
22
  # This namespace contains all behavior related to string preparation
24
- # (RFC 3454). It's used to implement SCRAM-SHA-256 authentication,
25
- # which is available in MongoDB server versions 4.0 and later.
23
+ # (RFC 3454). It's used to implement SCRAM-SHA-256 authentication.
26
24
  #
27
25
  # @since 2.6.0
28
26
  # @api private
@@ -72,15 +70,14 @@ module Mongo
72
70
  raise Mongo::Error::FailedStringPrepValidation.new(Error::FailedStringPrepValidation::INVALID_BIDIRECTIONAL)
73
71
  end
74
72
 
75
- if out.each_char.any? { |c| table_contains?(Tables::D1, c) }
76
- if out.each_char.any? { |c| table_contains?(Tables::D2, c) }
77
- raise Mongo::Error::FailedStringPrepValidation.new(Error::FailedStringPrepValidation::INVALID_BIDIRECTIONAL)
78
- end
79
-
80
- unless table_contains?(Tables::D1, out[0]) && table_contains?(Tables::D1, out[-1])
81
- raise Mongo::Error::FailedStringPrepValidation.new(Error::FailedStringPrepValidation::INVALID_BIDIRECTIONAL)
82
- end
73
+ return unless out.each_char.any? { |c| table_contains?(Tables::D1, c) }
74
+ if out.each_char.any? { |c| table_contains?(Tables::D2, c) }
75
+ raise Mongo::Error::FailedStringPrepValidation.new(Error::FailedStringPrepValidation::INVALID_BIDIRECTIONAL)
83
76
  end
77
+
78
+ return if table_contains?(Tables::D1, out[0]) && table_contains?(Tables::D1, out[-1])
79
+
80
+ raise Mongo::Error::FailedStringPrepValidation.new(Error::FailedStringPrepValidation::INVALID_BIDIRECTIONAL)
84
81
  end
85
82
 
86
83
  def check_prohibited!(out, prohibited)
@@ -95,7 +92,7 @@ module Mongo
95
92
 
96
93
  def mapping(c, mappings)
97
94
  m = mappings.find { |m| m.has_key?(c) }
98
- mapped = (m && m[c]) || [c]
95
+ mapped = (m && m[c]) || [ c ]
99
96
  mapped.map { |i| i.chr(Encoding::UTF_8) }.join
100
97
  end
101
98
 
@@ -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,7 +17,6 @@
18
17
  module Mongo
19
18
  module Auth
20
19
  class User
21
-
22
20
  # Defines behavior for user related operation on databases.
23
21
  #
24
22
  # @since 2.0.0
@@ -52,7 +50,7 @@ module Mongo
52
50
  user: user,
53
51
  db_name: database.name,
54
52
  session: session,
55
- write_concern: options[:write_concern] && WriteConcern.get(options[:write_concern]),
53
+ write_concern: options[:write_concern] && WriteConcern.get(options[:write_concern])
56
54
  )
57
55
  end
58
56
  end
@@ -89,7 +87,7 @@ module Mongo
89
87
  user_name: name,
90
88
  db_name: database.name,
91
89
  session: session,
92
- write_concern: options[:write_concern] && WriteConcern.get(options[:write_concern]),
90
+ write_concern: options[:write_concern] && WriteConcern.get(options[:write_concern])
93
91
  )
94
92
  end
95
93
  end
@@ -115,7 +113,7 @@ module Mongo
115
113
  user: user,
116
114
  db_name: database.name,
117
115
  session: session,
118
- write_concern: options[:write_concern] && WriteConcern.get(options[:write_concern]),
116
+ write_concern: options[:write_concern] && WriteConcern.get(options[:write_concern])
119
117
  )
120
118
  end
121
119
  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
  #
@@ -19,7 +18,6 @@ require 'mongo/auth/user/view'
19
18
 
20
19
  module Mongo
21
20
  module Auth
22
-
23
21
  # Represents a user in MongoDB.
24
22
  #
25
23
  # @since 2.0.0
@@ -68,6 +66,7 @@ module Mongo
68
66
  # @since 2.0.0
69
67
  def ==(other)
70
68
  return false unless other.is_a?(User)
69
+
71
70
  name == other.name && database == other.database && password == other.password
72
71
  end
73
72
 
@@ -96,7 +95,7 @@ module Mongo
96
95
  #
97
96
  # @since 2.0.0
98
97
  def encoded_name
99
- name.encode(BSON::UTF8).gsub('=','=3D').gsub(',','=2C')
98
+ name.encode(BSON::UTF8).gsub('=', '=3D').gsub(',', '=2C')
100
99
  end
101
100
 
102
101
  # Get the hash key for the user.
@@ -120,9 +119,7 @@ module Mongo
120
119
  #
121
120
  # @since 2.0.0
122
121
  def hashed_password
123
- unless password
124
- raise Error::MissingPassword
125
- end
122
+ raise Error::MissingPassword unless password
126
123
 
127
124
  @hashed_password ||= Digest::MD5.hexdigest("#{name}:mongo:#{password}").encode(BSON::UTF8)
128
125
  end
@@ -131,14 +128,12 @@ module Mongo
131
128
  #
132
129
  # @api private
133
130
  def sasl_prepped_password
134
- unless password
135
- raise Error::MissingPassword
136
- end
131
+ raise Error::MissingPassword unless password
137
132
 
138
133
  @sasl_prepped_password ||= StringPrep.prepare(password,
139
- StringPrep::Profiles::SASL::MAPPINGS,
140
- StringPrep::Profiles::SASL::PROHIBITED,
141
- normalize: true, bidi: true).encode(BSON::UTF8)
134
+ StringPrep::Profiles::SASL::MAPPINGS,
135
+ StringPrep::Profiles::SASL::PROHIBITED,
136
+ normalize: true, bidi: true).encode(BSON::UTF8)
142
137
  end
143
138
 
144
139
  # Create the new user.
@@ -176,14 +171,13 @@ module Mongo
176
171
  # have not enforced this; warn, reject in lint mode
177
172
  if Lint.enabled?
178
173
  raise Error::LintError, "Auth mechanism #{@mechanism.inspect} must be specified as a symbol"
179
- else
180
- log_warn("Auth mechanism #{@mechanism.inspect} should be specified as a symbol")
181
- @mechanism = @mechanism.to_sym
182
174
  end
175
+
176
+ log_warn("Auth mechanism #{@mechanism.inspect} should be specified as a symbol")
177
+ @mechanism = @mechanism.to_sym
178
+
183
179
  end
184
- unless Auth::SOURCES.key?(@mechanism)
185
- raise InvalidMechanism.new(options[:auth_mech])
186
- end
180
+ raise InvalidMechanism.new(options[:auth_mech]) unless Auth::SOURCES.key?(@mechanism)
187
181
  end
188
182
  @auth_mech_properties = options[:auth_mech_properties] || {}
189
183
  @roles = options[:roles] || []
@@ -198,15 +192,11 @@ module Mongo
198
192
  #
199
193
  # @since 2.0.0
200
194
  def spec
201
- {roles: roles}.tap do |spec|
202
- if password
203
- spec[:pwd] = password
204
- end
195
+ { roles: roles }.tap do |spec|
196
+ spec[:pwd] = password if password
205
197
  end
206
198
  end
207
199
 
208
- private
209
-
210
200
  # Generate default auth source based on the URI and options
211
201
  #
212
202
  # @api private
@@ -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,14 +17,12 @@
18
17
  module Mongo
19
18
  module Auth
20
19
  class X509
21
-
22
20
  # Defines behavior around a single X.509 conversation between the
23
21
  # client and server.
24
22
  #
25
23
  # @since 2.0.0
26
24
  # @api private
27
25
  class Conversation < ConversationBase
28
-
29
26
  # The login message.
30
27
  #
31
28
  # @since 2.0.0
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2014-2020 MongoDB Inc.
5
4
  #
@@ -17,17 +16,15 @@
17
16
 
18
17
  module Mongo
19
18
  module Auth
20
-
21
19
  # Defines behavior for X.509 authentication.
22
20
  #
23
21
  # @since 2.0.0
24
22
  # @api private
25
23
  class X509 < Base
26
-
27
24
  # The authentication mechanism string.
28
25
  #
29
26
  # @since 2.0.0
30
- MECHANISM = 'MONGODB-X509'.freeze
27
+ MECHANISM = 'MONGODB-X509'
31
28
 
32
29
  # Initializes the X.509 authenticator.
33
30
  #
@@ -37,11 +34,12 @@ module Mongo
37
34
  # The only valid database for X.509 authentication is $external.
38
35
  if user.auth_source != '$external'
39
36
  user_name_msg = if user.name
40
- " #{user.name}"
41
- else
42
- ''
43
- end
44
- raise Auth::InvalidConfiguration, "User#{user_name_msg} specifies auth source '#{user.auth_source}', but the only valid auth source for X.509 is '$external'"
37
+ " #{user.name}"
38
+ else
39
+ ''
40
+ end
41
+ raise Auth::InvalidConfiguration,
42
+ "User#{user_name_msg} specifies auth source '#{user.auth_source}', but the only valid auth source for X.509 is '$external'"
45
43
  end
46
44
 
47
45
  super
data/lib/mongo/auth.rb CHANGED
@@ -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
  #
@@ -33,9 +32,7 @@ require 'mongo/auth/x509'
33
32
  require 'mongo/error/read_write_retryable'
34
33
  require 'mongo/error/labelable'
35
34
 
36
-
37
35
  module Mongo
38
-
39
36
  # This namespace contains all authentication related behavior.
40
37
  #
41
38
  # @since 2.0.0
@@ -46,7 +43,7 @@ module Mongo
46
43
  #
47
44
  # @since 2.0.0
48
45
  # @api private
49
- EXTERNAL = '$external'.freeze
46
+ EXTERNAL = '$external'
50
47
 
51
48
  # Constant for the nonce command.
52
49
  #
@@ -58,7 +55,7 @@ module Mongo
58
55
  #
59
56
  # @since 2.0.0
60
57
  # @api private
61
- NONCE = 'nonce'.freeze
58
+ NONCE = 'nonce'
62
59
 
63
60
  # Map the symbols parsed from the URI connection string to strategies.
64
61
  #
@@ -96,7 +93,8 @@ module Mongo
96
93
  # @api private
97
94
  def get(user, connection, **opts)
98
95
  mechanism = user.mechanism
99
- raise InvalidMechanism.new(mechanism) if !SOURCES.has_key?(mechanism)
96
+ raise InvalidMechanism.new(mechanism) unless SOURCES.has_key?(mechanism)
97
+
100
98
  SOURCES[mechanism].new(user, connection, **opts)
101
99
  end
102
100
 
@@ -109,7 +107,6 @@ module Mongo
109
107
  #
110
108
  # @since 2.0.0
111
109
  class InvalidMechanism < InvalidConfiguration
112
-
113
110
  # Instantiate the new error.
114
111
  #
115
112
  # @example Instantiate the error.
@@ -151,8 +148,7 @@ module Mongo
151
148
  #
152
149
  # @since 2.0.0
153
150
  def initialize(user, used_mechanism: nil, message: nil,
154
- server: nil, code: nil
155
- )
151
+ server: nil, code: nil)
156
152
  @code = code
157
153
 
158
154
  configured_bits = []
@@ -160,36 +156,28 @@ module Mongo
160
156
  "auth source: #{user.auth_source}",
161
157
  ]
162
158
 
163
- if user.mechanism
164
- configured_bits << "mechanism: #{user.mechanism}"
165
- end
159
+ configured_bits << "mechanism: #{user.mechanism}" if user.mechanism
166
160
 
167
- if used_mechanism
168
- used_bits << "used mechanism: #{used_mechanism}"
169
- end
161
+ used_bits << "used mechanism: #{used_mechanism}" if used_mechanism
170
162
 
171
- if server
172
- used_bits << "used server: #{server.address} (#{server.status})"
173
- end
163
+ used_bits << "used server: #{server.address} (#{server.status})" if server
174
164
 
175
165
  used_user = if user.mechanism == :mongodb_x509
176
- 'Client certificate'
177
- else
178
- "User #{user.name}"
179
- end
166
+ 'Client certificate'
167
+ else
168
+ "User #{user.name}"
169
+ end
180
170
 
181
- if configured_bits.empty?
182
- configured_bits = ''
183
- else
184
- configured_bits = " (#{configured_bits.join(', ')})"
185
- end
171
+ configured_bits = if configured_bits.empty?
172
+ ''
173
+ else
174
+ " (#{configured_bits.join(', ')})"
175
+ end
186
176
 
187
177
  used_bits = " (#{used_bits.join(', ')})"
188
178
 
189
179
  msg = "#{used_user}#{configured_bits} is not authorized to access #{user.database}#{used_bits}"
190
- if message
191
- msg += ': ' + message
192
- end
180
+ msg += ': ' + message if message
193
181
  super(msg)
194
182
  end
195
183
  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
  #
@@ -16,7 +15,6 @@
16
15
  # limitations under the License.
17
16
 
18
17
  module Mongo
19
-
20
18
  # The run!, running? and stop! methods used to be part of the public API
21
19
  # in some of the classes which now include this module. Therefore these
22
20
  # methods must be considered part of the driver's public API for backwards
@@ -111,9 +109,7 @@ module Mongo
111
109
  def start!
112
110
  @thread = Thread.new do
113
111
  catch(:done) do
114
- until @stop_requested
115
- do_work
116
- end
112
+ do_work until @stop_requested
117
113
  end
118
114
  end
119
115
  end
@@ -130,17 +126,15 @@ module Mongo
130
126
  # a background thread could be performing, say, network I/O and if
131
127
  # the network is no longer available that could take a long time.
132
128
  start_time = Utils.monotonic_time
133
- ([0.1, 0.15] + [0.2] * 5 + [0.3] * 20).each do |interval|
134
- begin
135
- Timeout.timeout(interval) do
136
- @thread.join
137
- end
138
- break
139
- rescue ::Timeout::Error
129
+ ([ 0.1, 0.15 ] + ([ 0.2 ] * 5) + ([ 0.3 ] * 20)).each do |interval|
130
+ Timeout.timeout(interval) do
131
+ @thread.join
140
132
  end
133
+ break
134
+ rescue ::Timeout::Error
141
135
  end
142
136
 
143
- # Some driver objects can be reconnected, for backwards compatibiilty
137
+ # Some driver objects can be reconnected, for backwards compatibility
144
138
  # reasons. Clear the thread instance variable to support this cleanly.
145
139
  if @thread.alive?
146
140
  log_warn("Failed to stop the background thread in #{self} in #{(Utils.monotonic_time - start_time).to_i} seconds: #{@thread.inspect} (thread status: #{@thread.status})")
@@ -162,12 +156,10 @@ module Mongo
162
156
  end
163
157
 
164
158
  # Override this method to do the work in the background thread.
165
- def do_work
166
- end
159
+ def do_work; end
167
160
 
168
161
  # Override this method to perform additional signaling for the background
169
162
  # thread to stop.
170
- def pre_stop
171
- end
163
+ def pre_stop; end
172
164
  end
173
165
  end
data/lib/mongo/bson.rb CHANGED
@@ -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
  #
@@ -19,7 +18,6 @@
19
18
  #
20
19
  # @since 2.2.1
21
20
  class Symbol
22
-
23
21
  # Overrides the default BSON type to use the symbol type instead of a
24
22
  # string type.
25
23
  #
@@ -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,14 +16,12 @@
17
16
 
18
17
  module Mongo
19
18
  class BulkWrite
20
-
21
19
  # Defines behavior around combiners
22
20
  #
23
21
  # @api private
24
22
  #
25
23
  # @since 2.1.0
26
24
  module Combineable
27
-
28
25
  # @return [ Array<Hash, BSON::Document> ] requests The provided requests.
29
26
  attr_reader :requests
30
27
 
@@ -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
  class BulkWrite
20
-
21
19
  # Combines groups of bulk write operations in order.
22
20
  #
23
21
  # @api private
@@ -45,7 +43,7 @@ module Mongo
45
43
  private
46
44
 
47
45
  def add(operations, name, document)
48
- operations.push({ name => []}) if next_group?(name, operations)
46
+ operations.push({ name => [] }) if next_group?(name, operations)
49
47
  operations[-1][name].push(transform(name, document))
50
48
  operations
51
49
  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,56 +16,58 @@
17
16
 
18
17
  module Mongo
19
18
  class BulkWrite
20
-
21
19
  # Wraps a series of bulk write operations in a result object.
22
20
  #
23
21
  # @since 2.0.6
24
22
  class Result
25
-
26
23
  # @return [ Boolean ] Is the result acknowledged?
27
24
  def acknowledged?
28
25
  @acknowledged
29
26
  end
30
27
 
28
+ # @return [ Array<String> ] Deduplicated list of "host:port" addresses of
29
+ # the servers that produced this bulk write's operations.
30
+ attr_reader :server_addresses
31
+
31
32
  # Constant for number removed.
32
33
  #
33
34
  # @since 2.1.0
34
- REMOVED_COUNT = 'n_removed'.freeze
35
+ REMOVED_COUNT = 'n_removed'
35
36
 
36
37
  # Constant for number inserted.
37
38
  #
38
39
  # @since 2.1.0
39
- INSERTED_COUNT = 'n_inserted'.freeze
40
+ INSERTED_COUNT = 'n_inserted'
40
41
 
41
42
  # Constant for inserted ids.
42
43
  #
43
44
  # @since 2.1.0
44
- INSERTED_IDS = 'inserted_ids'.freeze
45
+ INSERTED_IDS = 'inserted_ids'
45
46
 
46
47
  # Constant for number matched.
47
48
  #
48
49
  # @since 2.1.0
49
- MATCHED_COUNT = 'n_matched'.freeze
50
+ MATCHED_COUNT = 'n_matched'
50
51
 
51
52
  # Constant for number modified.
52
53
  #
53
54
  # @since 2.1.0
54
- MODIFIED_COUNT = 'n_modified'.freeze
55
+ MODIFIED_COUNT = 'n_modified'
55
56
 
56
57
  # Constant for upserted.
57
58
  #
58
59
  # @since 2.1.0
59
- UPSERTED = 'upserted'.freeze
60
+ UPSERTED = 'upserted'
60
61
 
61
62
  # Constant for number upserted.
62
63
  #
63
64
  # @since 2.1.0
64
- UPSERTED_COUNT = 'n_upserted'.freeze
65
+ UPSERTED_COUNT = 'n_upserted'
65
66
 
66
67
  # Constant for upserted ids.
67
68
  #
68
69
  # @since 2.1.0
69
- UPSERTED_IDS = 'upserted_ids'.freeze
70
+ UPSERTED_IDS = 'upserted_ids'
70
71
 
71
72
  # The fields contained in the result document returned from executing the
72
73
  # operations.
@@ -100,13 +101,17 @@ module Mongo
100
101
  #
101
102
  # @param [ BSON::Document, Hash ] results The results document.
102
103
  # @param [ Boolean ] acknowledged Is the result acknowledged?
104
+ # @param [ Array<String> ] server_addresses Deduplicated "host:port"
105
+ # addresses of the servers that produced the underlying operation
106
+ # results.
103
107
  #
104
108
  # @since 2.1.0
105
109
  #
106
110
  # @api private
107
- def initialize(results, acknowledged)
111
+ def initialize(results, acknowledged, server_addresses = [])
108
112
  @results = results
109
113
  @acknowledged = acknowledged
114
+ @server_addresses = Array(server_addresses).compact.uniq
110
115
  end
111
116
 
112
117
  # Returns the number of documents inserted.
@@ -192,11 +197,9 @@ module Mongo
192
197
  #
193
198
  # @since 2.1.0
194
199
  def validate!
195
- if @results['writeErrors'] || @results['writeConcernErrors']
196
- raise Error::BulkWriteError.new(@results)
197
- else
198
- self
199
- end
200
+ raise Error::BulkWriteError.new(@results, server_addresses: @server_addresses) if @results['writeErrors'] || @results['writeConcernErrors']
201
+
202
+ self
200
203
  end
201
204
  end
202
205
  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,20 +16,22 @@
17
16
 
18
17
  module Mongo
19
18
  class BulkWrite
20
-
21
19
  # Combines bulk write results together.
22
20
  #
23
21
  # @api private
24
22
  #
25
23
  # @since 2.1.0
26
24
  class ResultCombiner
27
-
28
25
  # @return [ Integer ] count The number of documents in the entire batch.
29
26
  attr_reader :count
30
27
 
31
28
  # @return [ Hash ] results The results hash.
32
29
  attr_reader :results
33
30
 
31
+ # @return [ Array<String> ] Deduplicated list of "host:port" addresses of
32
+ # the servers that produced the combined operation results.
33
+ attr_reader :server_addresses
34
+
34
35
  # Create the new result combiner.
35
36
  #
36
37
  # @api private
@@ -42,6 +43,7 @@ module Mongo
42
43
  def initialize
43
44
  @results = {}
44
45
  @count = 0
46
+ @server_addresses = []
45
47
  end
46
48
 
47
49
  # Adds a result to the overall results.
@@ -71,6 +73,8 @@ module Mongo
71
73
  combine_errors!(result)
72
74
  @count += count
73
75
  @acknowledged = result.acknowledged?
76
+ seed = result.connection_description&.address&.seed
77
+ @server_addresses << seed if seed && !@server_addresses.include?(seed)
74
78
  end
75
79
 
76
80
  # Get the final result.
@@ -81,7 +85,7 @@ module Mongo
81
85
  #
82
86
  # @since 2.1.0
83
87
  def result
84
- BulkWrite::Result.new(results, @acknowledged).validate!
88
+ BulkWrite::Result.new(results, @acknowledged, @server_addresses).validate!
85
89
  end
86
90
 
87
91
  private
@@ -97,12 +101,12 @@ module Mongo
97
101
  def combine_ids!(result)
98
102
  if result.respond_to?(Result::INSERTED_IDS)
99
103
  results[Result::INSERTED_IDS] = (results[Result::INSERTED_IDS] || []) +
100
- result.inserted_ids
101
- end
102
- if result.respond_to?(Result::UPSERTED)
103
- results[Result::UPSERTED_IDS] = (results[Result::UPSERTED_IDS] || []) +
104
- result.upserted.map{ |doc| doc['_id'] }
104
+ result.inserted_ids
105
105
  end
106
+ return unless result.respond_to?(Result::UPSERTED)
107
+
108
+ results[Result::UPSERTED_IDS] = (results[Result::UPSERTED_IDS] || []) +
109
+ result.upserted.map { |doc| doc['_id'] }
106
110
  end
107
111
 
108
112
  def combine_errors!(result)
@@ -121,10 +125,10 @@ module Mongo
121
125
  end
122
126
 
123
127
  def combine_write_concern_errors!(result)
124
- if write_concern_errors = result.aggregate_write_concern_errors(count)
125
- results['writeConcernErrors'] = (results['writeConcernErrors'] || []) +
126
- write_concern_errors
127
- end
128
+ return unless write_concern_errors = result.aggregate_write_concern_errors(count)
129
+
130
+ results['writeConcernErrors'] = (results['writeConcernErrors'] || []) +
131
+ write_concern_errors
128
132
  end
129
133
  end
130
134
  end