mongo 2.13.0.beta1 → 2.14.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 (339) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +1 -5
  4. data/Rakefile +50 -9
  5. data/lib/mongo.rb +13 -2
  6. data/lib/mongo/address.rb +1 -1
  7. data/lib/mongo/address/ipv4.rb +1 -1
  8. data/lib/mongo/address/ipv6.rb +1 -1
  9. data/lib/mongo/auth/aws/request.rb +31 -5
  10. data/lib/mongo/bulk_write.rb +18 -0
  11. data/lib/mongo/caching_cursor.rb +74 -0
  12. data/lib/mongo/client.rb +238 -31
  13. data/lib/mongo/cluster.rb +56 -20
  14. data/lib/mongo/cluster/sdam_flow.rb +13 -10
  15. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +3 -2
  16. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  17. data/lib/mongo/cluster/topology/single.rb +2 -2
  18. data/lib/mongo/collection.rb +66 -24
  19. data/lib/mongo/collection/view.rb +24 -20
  20. data/lib/mongo/collection/view/aggregation.rb +25 -4
  21. data/lib/mongo/collection/view/builder/find_command.rb +38 -18
  22. data/lib/mongo/collection/view/explainable.rb +27 -8
  23. data/lib/mongo/collection/view/iterable.rb +72 -12
  24. data/lib/mongo/collection/view/readable.rb +19 -3
  25. data/lib/mongo/collection/view/writable.rb +55 -5
  26. data/lib/mongo/crypt/encryption_io.rb +6 -6
  27. data/lib/mongo/cursor.rb +16 -3
  28. data/lib/mongo/database.rb +37 -4
  29. data/lib/mongo/database/view.rb +18 -3
  30. data/lib/mongo/distinguishing_semaphore.rb +55 -0
  31. data/lib/mongo/error.rb +5 -0
  32. data/lib/mongo/error/invalid_read_concern.rb +28 -0
  33. data/lib/mongo/error/invalid_server_auth_host.rb +22 -0
  34. data/lib/mongo/error/invalid_session.rb +2 -1
  35. data/lib/mongo/error/operation_failure.rb +11 -5
  36. data/lib/mongo/error/server_certificate_revoked.rb +22 -0
  37. data/lib/mongo/error/sessions_not_supported.rb +35 -0
  38. data/lib/mongo/error/unsupported_option.rb +14 -12
  39. data/lib/mongo/event/base.rb +6 -0
  40. data/lib/mongo/grid/file.rb +5 -0
  41. data/lib/mongo/grid/file/chunk.rb +2 -0
  42. data/lib/mongo/grid/fs_bucket.rb +15 -13
  43. data/lib/mongo/grid/stream/write.rb +9 -3
  44. data/lib/mongo/index/view.rb +3 -0
  45. data/lib/mongo/lint.rb +2 -1
  46. data/lib/mongo/logger.rb +3 -3
  47. data/lib/mongo/monitoring.rb +38 -0
  48. data/lib/mongo/monitoring/command_log_subscriber.rb +10 -2
  49. data/lib/mongo/monitoring/event/command_failed.rb +11 -0
  50. data/lib/mongo/monitoring/event/command_started.rb +37 -2
  51. data/lib/mongo/monitoring/event/command_succeeded.rb +11 -0
  52. data/lib/mongo/monitoring/event/server_closed.rb +1 -1
  53. data/lib/mongo/monitoring/event/server_description_changed.rb +27 -4
  54. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +9 -2
  55. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +9 -2
  56. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +9 -2
  57. data/lib/mongo/monitoring/event/server_opening.rb +1 -1
  58. data/lib/mongo/monitoring/event/topology_changed.rb +1 -1
  59. data/lib/mongo/monitoring/event/topology_closed.rb +1 -1
  60. data/lib/mongo/monitoring/event/topology_opening.rb +1 -1
  61. data/lib/mongo/monitoring/publishable.rb +6 -3
  62. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +9 -1
  63. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +1 -1
  64. data/lib/mongo/operation.rb +2 -0
  65. data/lib/mongo/operation/aggregate/result.rb +9 -8
  66. data/lib/mongo/operation/collections_info/command.rb +5 -0
  67. data/lib/mongo/operation/collections_info/result.rb +18 -1
  68. data/lib/mongo/operation/delete/bulk_result.rb +2 -0
  69. data/lib/mongo/operation/delete/result.rb +3 -0
  70. data/lib/mongo/operation/explain/command.rb +4 -0
  71. data/lib/mongo/operation/explain/legacy.rb +4 -0
  72. data/lib/mongo/operation/explain/op_msg.rb +6 -0
  73. data/lib/mongo/operation/explain/result.rb +3 -0
  74. data/lib/mongo/operation/find/legacy/result.rb +2 -0
  75. data/lib/mongo/operation/find/result.rb +13 -0
  76. data/lib/mongo/operation/get_more/result.rb +3 -0
  77. data/lib/mongo/operation/indexes/result.rb +5 -0
  78. data/lib/mongo/operation/insert/bulk_result.rb +5 -0
  79. data/lib/mongo/operation/insert/result.rb +5 -0
  80. data/lib/mongo/operation/list_collections/result.rb +5 -0
  81. data/lib/mongo/operation/map_reduce/result.rb +10 -0
  82. data/lib/mongo/operation/parallel_scan/result.rb +4 -0
  83. data/lib/mongo/operation/result.rb +35 -6
  84. data/lib/mongo/operation/shared/bypass_document_validation.rb +1 -0
  85. data/lib/mongo/operation/shared/causal_consistency_supported.rb +1 -0
  86. data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +2 -0
  87. data/lib/mongo/operation/shared/executable.rb +1 -0
  88. data/lib/mongo/operation/shared/idable.rb +2 -1
  89. data/lib/mongo/operation/shared/limited.rb +1 -0
  90. data/lib/mongo/operation/shared/object_id_generator.rb +1 -0
  91. data/lib/mongo/operation/shared/result/aggregatable.rb +1 -0
  92. data/lib/mongo/operation/shared/sessions_supported.rb +1 -0
  93. data/lib/mongo/operation/shared/specifiable.rb +1 -0
  94. data/lib/mongo/operation/shared/write.rb +1 -0
  95. data/lib/mongo/operation/shared/write_concern_supported.rb +1 -0
  96. data/lib/mongo/operation/update/legacy/result.rb +7 -0
  97. data/lib/mongo/operation/update/result.rb +8 -0
  98. data/lib/mongo/operation/users_info/result.rb +3 -0
  99. data/lib/mongo/protocol/message.rb +47 -10
  100. data/lib/mongo/protocol/msg.rb +34 -1
  101. data/lib/mongo/protocol/query.rb +36 -0
  102. data/lib/mongo/protocol/serializers.rb +5 -2
  103. data/lib/mongo/query_cache.rb +242 -0
  104. data/lib/mongo/retryable.rb +8 -1
  105. data/lib/mongo/server.rb +15 -4
  106. data/lib/mongo/server/app_metadata.rb +27 -3
  107. data/lib/mongo/server/connection.rb +4 -4
  108. data/lib/mongo/server/connection_base.rb +38 -12
  109. data/lib/mongo/server/connection_common.rb +2 -2
  110. data/lib/mongo/server/connection_pool.rb +3 -0
  111. data/lib/mongo/server/description.rb +13 -1
  112. data/lib/mongo/server/monitor.rb +76 -44
  113. data/lib/mongo/server/monitor/connection.rb +57 -9
  114. data/lib/mongo/server/pending_connection.rb +14 -4
  115. data/lib/mongo/server/push_monitor.rb +173 -0
  116. data/{spec/runners/transactions/context.rb → lib/mongo/server/push_monitor/connection.rb} +9 -14
  117. data/lib/mongo/server_selector.rb +0 -1
  118. data/lib/mongo/server_selector/base.rb +583 -1
  119. data/lib/mongo/server_selector/nearest.rb +1 -6
  120. data/lib/mongo/server_selector/primary.rb +1 -6
  121. data/lib/mongo/server_selector/primary_preferred.rb +7 -10
  122. data/lib/mongo/server_selector/secondary.rb +1 -6
  123. data/lib/mongo/server_selector/secondary_preferred.rb +1 -7
  124. data/lib/mongo/session.rb +7 -1
  125. data/lib/mongo/socket.rb +26 -12
  126. data/lib/mongo/socket/ocsp_cache.rb +97 -0
  127. data/lib/mongo/socket/ocsp_verifier.rb +368 -0
  128. data/lib/mongo/socket/ssl.rb +46 -25
  129. data/lib/mongo/socket/tcp.rb +1 -1
  130. data/lib/mongo/srv/monitor.rb +7 -13
  131. data/lib/mongo/srv/resolver.rb +14 -10
  132. data/lib/mongo/timeout.rb +2 -0
  133. data/lib/mongo/topology_version.rb +9 -0
  134. data/lib/mongo/uri.rb +21 -390
  135. data/lib/mongo/uri/options_mapper.rb +582 -0
  136. data/lib/mongo/uri/srv_protocol.rb +3 -2
  137. data/lib/mongo/utils.rb +73 -0
  138. data/lib/mongo/version.rb +1 -1
  139. data/spec/NOTES.aws-auth.md +12 -7
  140. data/spec/README.aws-auth.md +2 -2
  141. data/spec/README.md +63 -1
  142. data/spec/integration/awaited_ismaster_spec.rb +28 -0
  143. data/spec/integration/bson_symbol_spec.rb +4 -2
  144. data/spec/integration/bulk_write_spec.rb +67 -0
  145. data/spec/integration/change_stream_examples_spec.rb +6 -2
  146. data/spec/integration/change_stream_spec.rb +1 -1
  147. data/spec/integration/check_clean_slate_spec.rb +16 -0
  148. data/spec/integration/client_authentication_options_spec.rb +92 -28
  149. data/spec/integration/client_construction_spec.rb +1 -0
  150. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +9 -5
  151. data/spec/integration/connect_single_rs_name_spec.rb +5 -2
  152. data/spec/integration/connection_pool_populator_spec.rb +4 -2
  153. data/spec/integration/connection_spec.rb +7 -4
  154. data/spec/integration/crud_spec.rb +4 -4
  155. data/spec/integration/cursor_reaping_spec.rb +54 -18
  156. data/spec/integration/docs_examples_spec.rb +6 -0
  157. data/spec/integration/fork_reconnect_spec.rb +56 -1
  158. data/spec/integration/grid_fs_bucket_spec.rb +48 -0
  159. data/spec/integration/heartbeat_events_spec.rb +4 -23
  160. data/spec/integration/ocsp_connectivity_spec.rb +26 -0
  161. data/spec/integration/ocsp_verifier_cache_spec.rb +188 -0
  162. data/spec/integration/ocsp_verifier_spec.rb +334 -0
  163. data/spec/integration/query_cache_spec.rb +1045 -0
  164. data/spec/integration/query_cache_transactions_spec.rb +190 -0
  165. data/spec/integration/read_concern_spec.rb +1 -1
  166. data/spec/integration/retryable_errors_spec.rb +1 -1
  167. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -0
  168. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +4 -2
  169. data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +3 -3
  170. data/spec/integration/retryable_writes/shared/performs_no_retries.rb +2 -2
  171. data/spec/integration/sdam_error_handling_spec.rb +122 -15
  172. data/spec/integration/sdam_events_spec.rb +80 -6
  173. data/spec/integration/sdam_prose_spec.rb +64 -0
  174. data/spec/integration/server_monitor_spec.rb +25 -1
  175. data/spec/integration/server_selection_spec.rb +36 -0
  176. data/spec/integration/size_limit_spec.rb +23 -5
  177. data/spec/integration/srv_monitoring_spec.rb +38 -3
  178. data/spec/integration/srv_spec.rb +56 -0
  179. data/spec/integration/ssl_uri_options_spec.rb +2 -2
  180. data/spec/integration/transactions_examples_spec.rb +17 -7
  181. data/spec/integration/zlib_compression_spec.rb +25 -0
  182. data/spec/lite_spec_helper.rb +20 -9
  183. data/spec/mongo/address_spec.rb +1 -1
  184. data/spec/mongo/auth/aws/request_region_spec.rb +42 -0
  185. data/spec/mongo/auth/aws/request_spec.rb +76 -0
  186. data/spec/mongo/auth/scram_spec.rb +1 -1
  187. data/spec/mongo/auth/user_spec.rb +1 -1
  188. data/spec/mongo/bulk_write_spec.rb +2 -2
  189. data/spec/mongo/caching_cursor_spec.rb +70 -0
  190. data/spec/mongo/client_construction_spec.rb +386 -3
  191. data/spec/mongo/client_encryption_spec.rb +16 -10
  192. data/spec/mongo/client_spec.rb +85 -3
  193. data/spec/mongo/cluster/topology/replica_set_spec.rb +53 -10
  194. data/spec/mongo/cluster/topology/sharded_spec.rb +1 -1
  195. data/spec/mongo/cluster/topology/single_spec.rb +19 -8
  196. data/spec/mongo/cluster/topology/unknown_spec.rb +1 -1
  197. data/spec/mongo/cluster/topology_spec.rb +1 -1
  198. data/spec/mongo/cluster_spec.rb +37 -35
  199. data/spec/mongo/collection/view/change_stream_resume_spec.rb +7 -7
  200. data/spec/mongo/collection/view/explainable_spec.rb +87 -4
  201. data/spec/mongo/collection/view/map_reduce_spec.rb +2 -0
  202. data/spec/mongo/collection/view/readable_spec.rb +36 -0
  203. data/spec/mongo/collection_spec.rb +572 -0
  204. data/spec/mongo/crypt/auto_decryption_context_spec.rb +1 -1
  205. data/spec/mongo/crypt/auto_encryption_context_spec.rb +1 -1
  206. data/spec/mongo/crypt/binary_spec.rb +1 -6
  207. data/spec/mongo/crypt/binding/binary_spec.rb +1 -6
  208. data/spec/mongo/crypt/binding/context_spec.rb +2 -7
  209. data/spec/mongo/crypt/binding/helpers_spec.rb +1 -6
  210. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +2 -7
  211. data/spec/mongo/crypt/binding/status_spec.rb +1 -6
  212. data/spec/mongo/crypt/binding/version_spec.rb +1 -6
  213. data/spec/mongo/crypt/data_key_context_spec.rb +1 -1
  214. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +1 -1
  215. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +1 -1
  216. data/spec/mongo/crypt/status_spec.rb +1 -6
  217. data/spec/mongo/database_spec.rb +353 -8
  218. data/spec/mongo/distinguishing_semaphore_spec.rb +63 -0
  219. data/spec/mongo/error/no_server_available_spec.rb +1 -1
  220. data/spec/mongo/error/operation_failure_spec.rb +40 -0
  221. data/spec/mongo/index/view_spec.rb +148 -2
  222. data/spec/mongo/logger_spec.rb +13 -11
  223. data/spec/mongo/monitoring/event/server_closed_spec.rb +1 -1
  224. data/spec/mongo/monitoring/event/server_description_changed_spec.rb +1 -4
  225. data/spec/mongo/monitoring/event/server_opening_spec.rb +1 -1
  226. data/spec/mongo/monitoring/event/topology_changed_spec.rb +1 -1
  227. data/spec/mongo/monitoring/event/topology_closed_spec.rb +1 -1
  228. data/spec/mongo/monitoring/event/topology_opening_spec.rb +1 -1
  229. data/spec/mongo/operation/delete/op_msg_spec.rb +3 -3
  230. data/spec/mongo/operation/insert/command_spec.rb +2 -2
  231. data/spec/mongo/operation/insert/op_msg_spec.rb +3 -3
  232. data/spec/mongo/operation/read_preference_op_msg_spec.rb +1 -1
  233. data/spec/mongo/operation/update/command_spec.rb +2 -2
  234. data/spec/mongo/operation/update/op_msg_spec.rb +3 -3
  235. data/spec/mongo/protocol/msg_spec.rb +10 -0
  236. data/spec/mongo/query_cache_spec.rb +280 -0
  237. data/spec/mongo/semaphore_spec.rb +51 -0
  238. data/spec/mongo/server/app_metadata_shared.rb +82 -2
  239. data/spec/mongo/server/connection_auth_spec.rb +2 -2
  240. data/spec/mongo/server/connection_pool_spec.rb +7 -3
  241. data/spec/mongo/server/connection_spec.rb +15 -8
  242. data/spec/mongo/server/description_spec.rb +18 -0
  243. data/spec/mongo/server_selector/nearest_spec.rb +23 -23
  244. data/spec/mongo/server_selector/primary_preferred_spec.rb +26 -26
  245. data/spec/mongo/server_selector/primary_spec.rb +9 -9
  246. data/spec/mongo/server_selector/secondary_preferred_spec.rb +22 -22
  247. data/spec/mongo/server_selector/secondary_spec.rb +18 -18
  248. data/spec/mongo/server_selector_spec.rb +6 -6
  249. data/spec/mongo/session_spec.rb +35 -0
  250. data/spec/mongo/socket/ssl_spec.rb +4 -4
  251. data/spec/mongo/socket_spec.rb +1 -1
  252. data/spec/mongo/uri/srv_protocol_spec.rb +64 -33
  253. data/spec/mongo/uri_option_parsing_spec.rb +11 -11
  254. data/spec/mongo/uri_spec.rb +68 -41
  255. data/spec/mongo/utils_spec.rb +39 -0
  256. data/spec/runners/auth.rb +3 -0
  257. data/spec/runners/change_streams/test.rb +3 -3
  258. data/spec/runners/cmap.rb +1 -1
  259. data/spec/runners/command_monitoring.rb +3 -34
  260. data/spec/runners/connection_string.rb +35 -124
  261. data/spec/runners/crud/context.rb +9 -5
  262. data/spec/runners/crud/operation.rb +59 -27
  263. data/spec/runners/crud/spec.rb +0 -8
  264. data/spec/runners/crud/test.rb +1 -1
  265. data/spec/runners/crud/test_base.rb +0 -19
  266. data/spec/runners/sdam.rb +2 -2
  267. data/spec/runners/server_selection.rb +242 -28
  268. data/spec/runners/transactions.rb +12 -12
  269. data/spec/runners/transactions/operation.rb +151 -25
  270. data/spec/runners/transactions/test.rb +62 -18
  271. data/spec/shared/LICENSE +20 -0
  272. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  273. data/spec/shared/lib/mrss/constraints.rb +303 -0
  274. data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
  275. data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
  276. data/spec/spec_helper.rb +3 -1
  277. data/spec/spec_tests/cmap_spec.rb +7 -3
  278. data/spec/spec_tests/command_monitoring_spec.rb +22 -12
  279. data/spec/spec_tests/crud_spec.rb +1 -1
  280. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +4 -9
  281. data/spec/spec_tests/data/change_streams/change-streams-resume-whitelist.yml +66 -0
  282. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -1
  283. data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +6 -2
  284. data/spec/spec_tests/data/cmap/pool-create-min-size.yml +3 -0
  285. data/spec/spec_tests/data/connection_string/valid-warnings.yml +24 -0
  286. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml +15 -0
  287. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +4 -3
  288. data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +1 -0
  289. data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +96 -0
  290. data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +88 -0
  291. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +83 -0
  292. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +116 -0
  293. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +86 -0
  294. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +115 -0
  295. data/spec/spec_tests/data/sdam_integration/isMaster-command-error.yml +168 -0
  296. data/spec/spec_tests/data/sdam_integration/isMaster-network-error.yml +162 -0
  297. data/spec/spec_tests/data/sdam_integration/isMaster-timeout.yml +229 -0
  298. data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +87 -0
  299. data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +1 -3
  300. data/spec/spec_tests/data/sdam_monitoring/standalone.yml +2 -2
  301. data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +2 -2
  302. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +2 -2
  303. data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +2 -2
  304. data/spec/spec_tests/data/uri_options/auth-options.yml +25 -0
  305. data/spec/spec_tests/data/uri_options/compression-options.yml +6 -3
  306. data/spec/spec_tests/data/uri_options/read-preference-options.yml +24 -0
  307. data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +1 -0
  308. data/spec/spec_tests/data/uri_options/tls-options.yml +160 -4
  309. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +9 -1
  310. data/spec/spec_tests/max_staleness_spec.rb +4 -142
  311. data/spec/spec_tests/retryable_reads_spec.rb +2 -2
  312. data/spec/spec_tests/sdam_integration_spec.rb +13 -0
  313. data/spec/spec_tests/sdam_monitoring_spec.rb +1 -2
  314. data/spec/spec_tests/server_selection_spec.rb +4 -116
  315. data/spec/spec_tests/uri_options_spec.rb +31 -33
  316. data/spec/stress/cleanup_spec.rb +17 -2
  317. data/spec/stress/connection_pool_stress_spec.rb +10 -8
  318. data/spec/stress/fork_reconnect_stress_spec.rb +1 -1
  319. data/spec/support/certificates/atlas-ocsp-ca.crt +28 -0
  320. data/spec/support/certificates/atlas-ocsp.crt +41 -0
  321. data/spec/support/client_registry.rb +1 -0
  322. data/spec/support/client_registry_macros.rb +11 -2
  323. data/spec/support/cluster_config.rb +4 -0
  324. data/spec/support/common_shortcuts.rb +45 -0
  325. data/spec/support/constraints.rb +6 -253
  326. data/spec/support/event_subscriber.rb +123 -33
  327. data/spec/support/keyword_struct.rb +26 -0
  328. data/spec/support/matchers.rb +16 -0
  329. data/spec/support/ocsp +1 -0
  330. data/spec/support/session_registry.rb +52 -0
  331. data/spec/support/shared/server_selector.rb +13 -1
  332. data/spec/support/spec_config.rb +60 -13
  333. data/spec/support/spec_setup.rb +1 -1
  334. data/spec/support/utils.rb +84 -1
  335. metadata +1027 -937
  336. metadata.gz.sig +0 -0
  337. data/lib/mongo/server_selector/selectable.rb +0 -560
  338. data/spec/runners/sdam_monitoring.rb +0 -89
  339. data/spec/support/lite_constraints.rb +0 -141
@@ -18,6 +18,7 @@ module Mongo
18
18
  # Custom behavior for operations that support the bypassdocumentvalidation option.
19
19
  #
20
20
  # @since 2.5.2
21
+ # @api private
21
22
  module BypassDocumentValidation
22
23
 
23
24
  private
@@ -18,6 +18,7 @@ module Mongo
18
18
  # Custom behavior for operations that support causal consistency.
19
19
  #
20
20
  # @since 2.5.2
21
+ # @api private
21
22
  module CausalConsistencySupported
22
23
 
23
24
  private
@@ -14,6 +14,8 @@
14
14
 
15
15
  module Mongo
16
16
  module Operation
17
+
18
+ # @api private
17
19
  module CollectionsInfoOrListCollections
18
20
  include PolymorphicLookup
19
21
 
@@ -18,6 +18,7 @@ module Mongo
18
18
  # Shared executable behavior of operations.
19
19
  #
20
20
  # @since 2.5.2
21
+ # @api private
21
22
  module Executable
22
23
 
23
24
  include ResponseHandling
@@ -18,6 +18,7 @@ module Mongo
18
18
  # Shared behavior of operations that require its documents to each have an id.
19
19
  #
20
20
  # @since 2.5.2
21
+ # @api private
21
22
  module Idable
22
23
 
23
24
  def documents
@@ -61,4 +62,4 @@ module Mongo
61
62
  end
62
63
  end
63
64
  end
64
- end
65
+ end
@@ -18,6 +18,7 @@ module Mongo
18
18
  # Shared behavior of operations that require its documents to each have an id.
19
19
  #
20
20
  # @since 2.5.2
21
+ # @api private
21
22
  module Limited
22
23
 
23
24
  private
@@ -18,6 +18,7 @@ module Mongo
18
18
  # The default generator of ids for documents.
19
19
  #
20
20
  # @since 2.2.0
21
+ # @api private
21
22
  class ObjectIdGenerator
22
23
 
23
24
  # Generate a new id.
@@ -19,6 +19,7 @@ module Mongo
19
19
  # Defines custom behavior of bulk write results
20
20
  #
21
21
  # @since 2.0.0
22
+ # @api private
22
23
  module Aggregatable
23
24
 
24
25
  # Aggregate the write errors returned from this result.
@@ -18,6 +18,7 @@ module Mongo
18
18
  # Shared behavior of operations that support a session.
19
19
  #
20
20
  # @since 2.5.2
21
+ # @api private
21
22
  module SessionsSupported
22
23
 
23
24
  private
@@ -19,6 +19,7 @@ module Mongo
19
19
  # various values from the spec.
20
20
  #
21
21
  # @since 2.0.0
22
+ # @api private
22
23
  module Specifiable
23
24
 
24
25
  # The field for database name.
@@ -18,6 +18,7 @@ module Mongo
18
18
  # Shared behavior of operations that write (update, insert, delete).
19
19
  #
20
20
  # @since 2.5.2
21
+ # @api private
21
22
  module Write
22
23
 
23
24
  include ResponseHandling
@@ -18,6 +18,7 @@ module Mongo
18
18
  # Custom behavior for operations that support write concern.
19
19
  #
20
20
  # @since 2.5.2
21
+ # @api private
21
22
  module WriteConcernSupported
22
23
 
23
24
  private
@@ -21,17 +21,20 @@ module Mongo
21
21
  # version <= 2.4.
22
22
  #
23
23
  # @since 2.0.0
24
+ # @api semiprivate
24
25
  class Result < Operation::Result
25
26
  include Operation::Result::UseLegacyErrorParser
26
27
 
27
28
  # Whether an existing document was updated.
28
29
  #
29
30
  # @since 2.0.0
31
+ # @api private
30
32
  UPDATED_EXISTING = 'updatedExisting'.freeze
31
33
 
32
34
  # The upserted docs field in the result.
33
35
  #
34
36
  # @since 2.0.0
37
+ # @api private
35
38
  UPSERTED = 'upserted'.freeze
36
39
 
37
40
  # Get the number of documents matched.
@@ -42,6 +45,7 @@ module Mongo
42
45
  # @return [ Integer ] The matched count.
43
46
  #
44
47
  # @since 2.0.0
48
+ # @api public
45
49
  def matched_count
46
50
  return 0 unless acknowledged?
47
51
  if upsert?
@@ -59,6 +63,7 @@ module Mongo
59
63
  # @return [ nil ] Always omitted for legacy versions.
60
64
  #
61
65
  # @since 2.0.0
66
+ # @api public
62
67
  def modified_count; end
63
68
 
64
69
  # The identifier of the inserted document if an upsert
@@ -70,6 +75,7 @@ module Mongo
70
75
  # @return [ Object ] The upserted id.
71
76
  #
72
77
  # @since 2.0.0
78
+ # @api public
73
79
  def upserted_id
74
80
  first[UPSERTED] if upsert?
75
81
  end
@@ -82,6 +88,7 @@ module Mongo
82
88
  # @return [ Integer ] The number upserted.
83
89
  #
84
90
  # @since 2.4.2
91
+ # @api public
85
92
  def upserted_count
86
93
  upsert? ? n : 0
87
94
  end
@@ -19,16 +19,19 @@ module Mongo
19
19
  # Defines custom behavior of results for an update.
20
20
  #
21
21
  # @since 2.0.0
22
+ # @api semiprivate
22
23
  class Result < Operation::Result
23
24
 
24
25
  # The number of modified docs field in the result.
25
26
  #
26
27
  # @since 2.0.0
28
+ # @api private
27
29
  MODIFIED = 'nModified'.freeze
28
30
 
29
31
  # The upserted docs field in the result.
30
32
  #
31
33
  # @since 2.0.0
34
+ # @api private
32
35
  UPSERTED = 'upserted'.freeze
33
36
 
34
37
  # Get the number of documents matched.
@@ -39,6 +42,7 @@ module Mongo
39
42
  # @return [ Integer ] The matched count.
40
43
  #
41
44
  # @since 2.0.0
45
+ # @api public
42
46
  def matched_count
43
47
  return 0 unless acknowledged?
44
48
  if upsert?
@@ -56,6 +60,7 @@ module Mongo
56
60
  # @return [ Integer ] The modified count.
57
61
  #
58
62
  # @since 2.0.0
63
+ # @api public
59
64
  def modified_count
60
65
  return 0 unless acknowledged?
61
66
  first[MODIFIED]
@@ -70,6 +75,7 @@ module Mongo
70
75
  # @return [ Object ] The upserted id.
71
76
  #
72
77
  # @since 2.0.0
78
+ # @api public
73
79
  def upserted_id
74
80
  return nil unless upsert?
75
81
  upsert?.first['_id']
@@ -83,10 +89,12 @@ module Mongo
83
89
  # @return [ Integer ] The number upserted.
84
90
  #
85
91
  # @since 2.4.2
92
+ # @api public
86
93
  def upserted_count
87
94
  upsert? ? n : 0
88
95
  end
89
96
 
97
+ # @api public
90
98
  def bulk_result
91
99
  BulkResult.new(@replies, connection_description)
92
100
  end
@@ -20,13 +20,16 @@ module Mongo
20
20
  # usersInfo command.
21
21
  #
22
22
  # @since 2.1.0
23
+ # @api semiprivate
23
24
  class Result < Operation::Result
24
25
 
25
26
  # The field name for the users document in a usersInfo result.
26
27
  #
27
28
  # @since 2.1.0
29
+ # @api private
28
30
  USERS = 'users'.freeze
29
31
 
32
+ # @api public
30
33
  def documents
31
34
  reply.documents.first[USERS]
32
35
  end
@@ -177,10 +177,19 @@ module Mongo
177
177
  #
178
178
  # @param buffer [String] buffer where the message should be inserted
179
179
  # @return [String] buffer containing the serialized message
180
- def serialize(buffer = BSON::ByteBuffer.new, max_bson_size = nil)
180
+ def serialize(buffer = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil)
181
+ max_size =
182
+ if max_bson_size && bson_overhead
183
+ max_bson_size + bson_overhead
184
+ elsif max_bson_size
185
+ max_bson_size
186
+ else
187
+ nil
188
+ end
189
+
181
190
  start = buffer.length
182
191
  serialize_header(buffer)
183
- serialize_fields(buffer, max_bson_size)
192
+ serialize_fields(buffer, max_size)
184
193
  buffer.replace_int32(start, buffer.length - start)
185
194
  end
186
195
 
@@ -199,10 +208,33 @@ module Mongo
199
208
  # @option options [ Boolean ] :deserialize_as_bson Whether to deserialize
200
209
  # this message using BSON types instead of native Ruby types wherever
201
210
  # possible.
211
+ # @option options [ Numeric ] :socket_timeout The timeout to use for
212
+ # each read operation.
202
213
  #
203
214
  # @return [ Message ] Instance of a Message class
204
- def self.deserialize(io, max_message_size = MAX_MESSAGE_SIZE, expected_response_to = nil, options = {})
205
- length, _request_id, response_to, _op_code = deserialize_header(BSON::ByteBuffer.new(io.read(16)))
215
+ #
216
+ # @api private
217
+ def self.deserialize(io,
218
+ max_message_size = MAX_MESSAGE_SIZE,
219
+ expected_response_to = nil,
220
+ options = {}
221
+ )
222
+ # io is usually a Mongo::Socket instance, which supports the
223
+ # timeout option. For compatibility with whoever might call this
224
+ # method with some other IO-like object, pass options only when they
225
+ # are not empty.
226
+ read_options = {}
227
+ if timeout = options[:socket_timeout]
228
+ read_options[:timeout] = timeout
229
+ end
230
+
231
+ if read_options.empty?
232
+ chunk = io.read(16)
233
+ else
234
+ chunk = io.read(16, **read_options)
235
+ end
236
+ buf = BSON::ByteBuffer.new(chunk)
237
+ length, _request_id, response_to, _op_code = deserialize_header(buf)
206
238
 
207
239
  # Protection from potential DOS man-in-the-middle attacks. See
208
240
  # DRIVERS-276.
@@ -216,14 +248,19 @@ module Mongo
216
248
  raise Error::UnexpectedResponse.new(expected_response_to, response_to)
217
249
  end
218
250
 
219
- message = Registry.get(_op_code).allocate
220
- buffer = BSON::ByteBuffer.new(io.read(length - 16))
251
+ if read_options.empty?
252
+ chunk = io.read(length - 16)
253
+ else
254
+ chunk = io.read(length - 16, **read_options)
255
+ end
256
+ buf = BSON::ByteBuffer.new(chunk)
221
257
 
258
+ message = Registry.get(_op_code).allocate
222
259
  message.send(:fields).each do |field|
223
260
  if field[:multi]
224
- deserialize_array(message, buffer, field, options)
261
+ deserialize_array(message, buf, field, options)
225
262
  else
226
- deserialize_field(message, buffer, field, options)
263
+ deserialize_field(message, buf, field, options)
227
264
  end
228
265
  end
229
266
  if message.is_a?(Msg)
@@ -374,7 +411,7 @@ module Mongo
374
411
  # each of the elements in this array using BSON types wherever possible.
375
412
  #
376
413
  # @return [Message] Message with deserialized array.
377
- def self.deserialize_array(message, io, field, options)
414
+ def self.deserialize_array(message, io, field, options = {})
378
415
  elements = []
379
416
  count = message.instance_variable_get(field[:multi])
380
417
  count.times { elements << field[:type].deserialize(io, options) }
@@ -392,7 +429,7 @@ module Mongo
392
429
  # this field using BSON types wherever possible.
393
430
  #
394
431
  # @return [Message] Message with deserialized field.
395
- def self.deserialize_field(message, io, field, options)
432
+ def self.deserialize_field(message, io, field, options = {})
396
433
  message.instance_variable_set(
397
434
  field[:name],
398
435
  field[:type].deserialize(io, options)
@@ -60,6 +60,13 @@ module Mongo
60
60
  #
61
61
  # @since 2.5.0
62
62
  def initialize(flags, options, main_document, *sequences)
63
+ if flags
64
+ flags.each do |flag|
65
+ unless KNOWN_FLAGS.key?(flag)
66
+ raise ArgumentError, "Unknown flag: #{flag.inspect}"
67
+ end
68
+ end
69
+ end
63
70
  @flags = flags || []
64
71
  @options = options
65
72
  unless main_document.is_a?(Hash)
@@ -139,7 +146,9 @@ module Mongo
139
146
  # @return [ BSON::ByteBuffer ] buffer containing the serialized message.
140
147
  #
141
148
  # @since 2.5.0
142
- def serialize(buffer = BSON::ByteBuffer.new, max_bson_size = nil)
149
+ def serialize(buffer = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil)
150
+ validate_document_size!(max_bson_size)
151
+
143
152
  super
144
153
  add_check_sum(buffer)
145
154
  buffer
@@ -268,6 +277,23 @@ module Mongo
268
277
 
269
278
  private
270
279
 
280
+ # Validate that the documents in this message are all smaller than the
281
+ # maxBsonObjectSize. If not, raise an exception.
282
+ def validate_document_size!(max_bson_size)
283
+ max_bson_size ||= Mongo::Server::ConnectionBase::DEFAULT_MAX_BSON_OBJECT_SIZE
284
+
285
+ contains_too_large_document = @sections.any? do |section|
286
+ section[:type] == 1 &&
287
+ section[:payload][:sequence].any? do |document|
288
+ document.to_bson.length > max_bson_size
289
+ end
290
+ end
291
+
292
+ if contains_too_large_document
293
+ raise Error::MaxBSONSize.new('The document exceeds maximum allowed BSON object size after serialization')
294
+ end
295
+ end
296
+
271
297
  def command
272
298
  @command ||= if @main_document
273
299
  @main_document.dup.tap do |cmd|
@@ -313,10 +339,17 @@ module Mongo
313
339
  # @since 2.5.0
314
340
  OP_CODE = 2013
315
341
 
342
+ KNOWN_FLAGS = {
343
+ checksum_present: true,
344
+ more_to_come: true,
345
+ exhaust_allowed: true,
346
+ }
347
+
316
348
  # Available flags for a OP_MSG message.
317
349
  FLAGS = Array.new(16).tap do |arr|
318
350
  arr[0] = :checksum_present
319
351
  arr[1] = :more_to_come
352
+ arr[16] = :exhaust_allowed
320
353
  end.freeze
321
354
 
322
355
  # @!attribute
@@ -115,12 +115,48 @@ module Mongo
115
115
  compress_if_possible(selector.keys.first, compressor, zlib_compression_level)
116
116
  end
117
117
 
118
+ # Serializes message into bytes that can be sent on the wire.
119
+ #
120
+ # @param [ BSON::ByteBuffer ] buffer where the message should be inserted.
121
+ # @param [ Integer ] max_bson_size The maximum bson object size.
122
+ #
123
+ # @return [ BSON::ByteBuffer ] buffer containing the serialized message.
124
+ def serialize(buffer = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil)
125
+ validate_document_size!(max_bson_size)
126
+
127
+ super
128
+ end
129
+
118
130
  protected
119
131
 
120
132
  attr_reader :upconverter
121
133
 
122
134
  private
123
135
 
136
+ # Validate that the documents in this message are all smaller than the
137
+ # maxBsonObjectSize. If not, raise an exception.
138
+ def validate_document_size!(max_bson_size)
139
+ max_bson_size ||= Mongo::Server::ConnectionBase::DEFAULT_MAX_BSON_OBJECT_SIZE
140
+
141
+ documents = if @selector.key?(:documents)
142
+ @selector[:documents]
143
+ elsif @selector.key?(:deletes)
144
+ @selector[:deletes]
145
+ elsif @selector.key?(:updates)
146
+ @selector[:updates]
147
+ else
148
+ []
149
+ end
150
+
151
+ contains_too_large_document = documents.any? do |doc|
152
+ doc.to_bson.length > max_bson_size
153
+ end
154
+
155
+ if contains_too_large_document
156
+ raise Error::MaxBSONSize.new('The document exceeds maximum allowed BSON object size after serialization')
157
+ end
158
+ end
159
+
124
160
  # The operation code required to specify a Query message.
125
161
  # @return [Fixnum] the operation code.
126
162
  #