mongo 2.11.6 → 2.12.0.rc0

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 (327) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +2 -2
  3. data.tar.gz.sig +0 -0
  4. data/CONTRIBUTING.md +1 -1
  5. data/lib/mongo.rb +3 -0
  6. data/lib/mongo/address.rb +13 -2
  7. data/lib/mongo/auth.rb +1 -0
  8. data/lib/mongo/auth/credential_cache.rb +51 -0
  9. data/lib/mongo/auth/scram/conversation.rb +20 -16
  10. data/lib/mongo/auth/user.rb +0 -8
  11. data/lib/mongo/auth/user/view.rb +4 -4
  12. data/lib/mongo/background_thread.rb +1 -1
  13. data/lib/mongo/bulk_write.rb +5 -5
  14. data/lib/mongo/client.rb +126 -11
  15. data/lib/mongo/client_encryption.rb +103 -0
  16. data/lib/mongo/cluster.rb +2 -2
  17. data/lib/mongo/cluster/reapers/cursor_reaper.rb +18 -6
  18. data/lib/mongo/cluster/sdam_flow.rb +54 -58
  19. data/lib/mongo/cluster/srv_monitor.rb +1 -1
  20. data/lib/mongo/collection.rb +3 -3
  21. data/lib/mongo/collection/view.rb +1 -1
  22. data/lib/mongo/collection/view/aggregation.rb +1 -1
  23. data/lib/mongo/collection/view/change_stream.rb +12 -3
  24. data/lib/mongo/collection/view/iterable.rb +14 -5
  25. data/lib/mongo/collection/view/map_reduce.rb +2 -2
  26. data/lib/mongo/collection/view/readable.rb +7 -9
  27. data/lib/mongo/collection/view/writable.rb +7 -7
  28. data/lib/mongo/crypt.rb +33 -0
  29. data/lib/mongo/crypt/auto_decryption_context.rb +42 -0
  30. data/lib/mongo/crypt/auto_encrypter.rb +169 -0
  31. data/lib/mongo/crypt/auto_encryption_context.rb +44 -0
  32. data/lib/mongo/crypt/binary.rb +155 -0
  33. data/lib/mongo/crypt/binding.rb +1162 -0
  34. data/lib/mongo/crypt/context.rb +135 -0
  35. data/lib/mongo/crypt/data_key_context.rb +162 -0
  36. data/lib/mongo/crypt/encryption_io.rb +283 -0
  37. data/lib/mongo/crypt/explicit_decryption_context.rb +40 -0
  38. data/lib/mongo/crypt/explicit_encrypter.rb +117 -0
  39. data/lib/mongo/crypt/explicit_encryption_context.rb +89 -0
  40. data/lib/mongo/crypt/handle.rb +293 -0
  41. data/lib/mongo/crypt/hooks.rb +90 -0
  42. data/lib/mongo/crypt/kms_context.rb +67 -0
  43. data/lib/mongo/crypt/status.rb +131 -0
  44. data/lib/mongo/cursor.rb +64 -32
  45. data/lib/mongo/database.rb +13 -6
  46. data/lib/mongo/database/view.rb +13 -4
  47. data/lib/mongo/dbref.rb +9 -2
  48. data/lib/mongo/error.rb +5 -1
  49. data/lib/mongo/error/crypt_error.rb +31 -0
  50. data/lib/mongo/error/{failed_stringprep_validation.rb → failed_string_prep_validation.rb} +0 -0
  51. data/lib/mongo/error/invalid_cursor_operation.rb +27 -0
  52. data/lib/mongo/error/kms_error.rb +22 -0
  53. data/lib/mongo/error/max_bson_size.rb +14 -3
  54. data/lib/mongo/error/mongocryptd_spawn_error.rb +22 -0
  55. data/lib/mongo/error/no_server_available.rb +8 -3
  56. data/lib/mongo/error/operation_failure.rb +1 -0
  57. data/lib/mongo/grid/file.rb +0 -5
  58. data/lib/mongo/grid/file/chunk.rb +0 -2
  59. data/lib/mongo/grid/file/info.rb +2 -1
  60. data/lib/mongo/grid/fs_bucket.rb +13 -15
  61. data/lib/mongo/grid/stream/write.rb +3 -9
  62. data/lib/mongo/index/view.rb +3 -3
  63. data/lib/mongo/monitoring/event/command_started.rb +6 -1
  64. data/lib/mongo/operation/collections_info.rb +6 -3
  65. data/lib/mongo/operation/delete/op_msg.rb +1 -1
  66. data/lib/mongo/operation/find/op_msg.rb +4 -1
  67. data/lib/mongo/operation/get_more/op_msg.rb +4 -1
  68. data/lib/mongo/operation/insert/command.rb +2 -2
  69. data/lib/mongo/operation/insert/legacy.rb +2 -2
  70. data/lib/mongo/operation/insert/op_msg.rb +3 -3
  71. data/lib/mongo/operation/result.rb +36 -27
  72. data/lib/mongo/operation/shared/executable.rb +10 -8
  73. data/lib/mongo/operation/shared/executable_no_validate.rb +2 -2
  74. data/lib/mongo/operation/shared/op_msg_or_command.rb +2 -2
  75. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +2 -2
  76. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +2 -2
  77. data/lib/mongo/operation/shared/write.rb +17 -10
  78. data/lib/mongo/operation/update/op_msg.rb +1 -1
  79. data/lib/mongo/protocol/compressed.rb +6 -5
  80. data/lib/mongo/protocol/insert.rb +3 -1
  81. data/lib/mongo/protocol/message.rb +72 -8
  82. data/lib/mongo/protocol/msg.rb +191 -37
  83. data/lib/mongo/protocol/query.rb +7 -9
  84. data/lib/mongo/protocol/serializers.rb +6 -2
  85. data/lib/mongo/server.rb +10 -4
  86. data/lib/mongo/server/connection.rb +20 -9
  87. data/lib/mongo/server/connection_base.rb +81 -12
  88. data/lib/mongo/server/connection_common.rb +61 -0
  89. data/lib/mongo/server/connection_pool.rb +37 -1
  90. data/lib/mongo/server/description.rb +9 -11
  91. data/lib/mongo/server/monitor.rb +2 -0
  92. data/lib/mongo/server/monitor/connection.rb +3 -18
  93. data/lib/mongo/server/pending_connection.rb +2 -1
  94. data/lib/mongo/session.rb +2 -2
  95. data/lib/mongo/session/session_pool.rb +8 -3
  96. data/lib/mongo/socket.rb +29 -16
  97. data/lib/mongo/socket/ssl.rb +23 -8
  98. data/lib/mongo/socket/tcp.rb +12 -3
  99. data/lib/mongo/timeout.rb +49 -0
  100. data/lib/mongo/uri.rb +30 -1
  101. data/lib/mongo/version.rb +1 -1
  102. data/mongo.gemspec +1 -1
  103. data/spec/README.md +134 -7
  104. data/spec/integration/auth_spec.rb +53 -0
  105. data/spec/integration/{client_options_spec.rb → client_authentication_options_spec.rb} +10 -10
  106. data/spec/integration/client_construction_spec.rb +76 -1
  107. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +351 -0
  108. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +301 -0
  109. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +71 -0
  110. data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +76 -0
  111. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +216 -0
  112. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +600 -0
  113. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +183 -0
  114. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +74 -0
  115. data/spec/integration/client_side_encryption/client_close_spec.rb +59 -0
  116. data/spec/integration/client_side_encryption/corpus_spec.rb +228 -0
  117. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +132 -0
  118. data/spec/integration/client_side_encryption/data_key_spec.rb +163 -0
  119. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +114 -0
  120. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +137 -0
  121. data/spec/integration/client_side_encryption/views_spec.rb +42 -0
  122. data/spec/integration/client_update_spec.rb +120 -0
  123. data/spec/integration/command_monitoring_spec.rb +3 -1
  124. data/spec/integration/command_spec.rb +44 -10
  125. data/spec/integration/connection_spec.rb +57 -0
  126. data/spec/integration/reconnect_spec.rb +7 -6
  127. data/spec/integration/size_limit_spec.rb +94 -0
  128. data/spec/integration/srv_monitoring_spec.rb +14 -6
  129. data/spec/lite_spec_helper.rb +31 -22
  130. data/spec/mongo/auth/cr_spec.rb +8 -0
  131. data/spec/mongo/auth/ldap_spec.rb +5 -1
  132. data/spec/mongo/auth/scram/conversation_spec.rb +5 -6
  133. data/spec/mongo/auth/scram/negotiation_spec.rb +74 -75
  134. data/spec/mongo/auth/scram_spec.rb +45 -35
  135. data/spec/mongo/auth/x509_spec.rb +5 -1
  136. data/spec/mongo/client_construction_spec.rb +206 -3
  137. data/spec/mongo/client_encryption_spec.rb +408 -0
  138. data/spec/mongo/cluster/cursor_reaper_spec.rb +12 -8
  139. data/spec/mongo/cluster/socket_reaper_spec.rb +14 -3
  140. data/spec/mongo/collection/view/aggregation_spec.rb +0 -2
  141. data/spec/mongo/collection/view/change_stream_spec.rb +7 -7
  142. data/spec/mongo/collection/view/map_reduce_spec.rb +3 -3
  143. data/spec/mongo/collection/view_spec.rb +1 -1
  144. data/spec/mongo/collection_spec.rb +4 -33
  145. data/spec/mongo/crypt/auto_decryption_context_spec.rb +90 -0
  146. data/spec/mongo/crypt/auto_encrypter_spec.rb +182 -0
  147. data/spec/mongo/crypt/auto_encryption_context_spec.rb +107 -0
  148. data/spec/mongo/crypt/binary_spec.rb +115 -0
  149. data/spec/mongo/crypt/binding/binary_spec.rb +56 -0
  150. data/spec/mongo/crypt/binding/context_spec.rb +257 -0
  151. data/spec/mongo/crypt/binding/helpers_spec.rb +46 -0
  152. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +144 -0
  153. data/spec/mongo/crypt/binding/status_spec.rb +99 -0
  154. data/spec/mongo/crypt/binding/version_spec.rb +22 -0
  155. data/spec/mongo/crypt/binding_unloaded_spec.rb +20 -0
  156. data/spec/mongo/crypt/data_key_context_spec.rb +213 -0
  157. data/spec/mongo/crypt/encryption_io_spec.rb +136 -0
  158. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +72 -0
  159. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +170 -0
  160. data/spec/mongo/crypt/handle_spec.rb +198 -0
  161. data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +108 -0
  162. data/spec/mongo/crypt/status_spec.rb +152 -0
  163. data/spec/mongo/cursor_spec.rb +24 -4
  164. data/spec/mongo/database_spec.rb +20 -0
  165. data/spec/mongo/error/crypt_error_spec.rb +26 -0
  166. data/spec/mongo/error/max_bson_size_spec.rb +35 -0
  167. data/spec/mongo/error/no_server_available_spec.rb +11 -1
  168. data/spec/mongo/error/operation_failure_spec.rb +6 -6
  169. data/spec/mongo/operation/aggregate_spec.rb +1 -1
  170. data/spec/mongo/operation/collections_info_spec.rb +1 -1
  171. data/spec/mongo/operation/command_spec.rb +3 -3
  172. data/spec/mongo/operation/create_index_spec.rb +3 -3
  173. data/spec/mongo/operation/create_user_spec.rb +3 -3
  174. data/spec/mongo/operation/delete/bulk_spec.rb +6 -6
  175. data/spec/mongo/operation/delete/op_msg_spec.rb +1 -6
  176. data/spec/mongo/operation/delete_spec.rb +7 -7
  177. data/spec/mongo/operation/drop_index_spec.rb +2 -2
  178. data/spec/mongo/operation/find/legacy_spec.rb +1 -1
  179. data/spec/mongo/operation/get_more_spec.rb +1 -1
  180. data/spec/mongo/operation/indexes_spec.rb +1 -1
  181. data/spec/mongo/operation/insert/bulk_spec.rb +7 -7
  182. data/spec/mongo/operation/insert/op_msg_spec.rb +3 -6
  183. data/spec/mongo/operation/insert_spec.rb +12 -12
  184. data/spec/mongo/operation/map_reduce_spec.rb +2 -2
  185. data/spec/mongo/operation/remove_user_spec.rb +3 -3
  186. data/spec/mongo/operation/update/bulk_spec.rb +6 -6
  187. data/spec/mongo/operation/update/op_msg_spec.rb +3 -6
  188. data/spec/mongo/operation/update_spec.rb +7 -7
  189. data/spec/mongo/operation/update_user_spec.rb +1 -1
  190. data/spec/mongo/protocol/compressed_spec.rb +2 -3
  191. data/spec/mongo/protocol/delete_spec.rb +9 -8
  192. data/spec/mongo/protocol/get_more_spec.rb +9 -8
  193. data/spec/mongo/protocol/insert_spec.rb +9 -8
  194. data/spec/mongo/protocol/kill_cursors_spec.rb +6 -5
  195. data/spec/mongo/protocol/msg_spec.rb +57 -53
  196. data/spec/mongo/protocol/query_spec.rb +12 -12
  197. data/spec/mongo/protocol/registry_spec.rb +1 -1
  198. data/spec/mongo/protocol/reply_spec.rb +1 -1
  199. data/spec/mongo/protocol/update_spec.rb +10 -9
  200. data/spec/mongo/server/connection_pool_spec.rb +1 -1
  201. data/spec/mongo/server/connection_spec.rb +28 -7
  202. data/spec/mongo/socket_spec.rb +1 -1
  203. data/spec/mongo/timeout_spec.rb +85 -0
  204. data/spec/mongo/uri/srv_protocol_spec.rb +2 -2
  205. data/spec/mongo/uri_spec.rb +52 -5
  206. data/spec/mongo/write_concern_spec.rb +13 -1
  207. data/spec/{support → runners}/auth.rb +14 -1
  208. data/spec/{support → runners}/change_streams.rb +1 -1
  209. data/spec/{support → runners}/change_streams/operation.rb +0 -0
  210. data/spec/{support → runners}/cmap.rb +1 -1
  211. data/spec/{support → runners}/cmap/verifier.rb +0 -0
  212. data/spec/{support → runners}/command_monitoring.rb +0 -0
  213. data/spec/runners/connection_string.rb +358 -4
  214. data/spec/{support → runners}/crud.rb +9 -9
  215. data/spec/{support → runners}/crud/context.rb +0 -0
  216. data/spec/{support → runners}/crud/operation.rb +7 -3
  217. data/spec/{support → runners}/crud/outcome.rb +0 -0
  218. data/spec/{support → runners}/crud/requirement.rb +1 -1
  219. data/spec/{support → runners}/crud/spec.rb +12 -1
  220. data/spec/{support → runners}/crud/test.rb +0 -0
  221. data/spec/{support → runners}/crud/test_base.rb +0 -0
  222. data/spec/{support → runners}/crud/verifier.rb +10 -12
  223. data/spec/{support → runners}/gridfs.rb +0 -0
  224. data/spec/{support → runners}/sdam_monitoring.rb +0 -0
  225. data/spec/{support → runners}/server_discovery_and_monitoring.rb +0 -0
  226. data/spec/{support → runners}/server_selection.rb +0 -0
  227. data/spec/{support → runners}/server_selection_rtt.rb +0 -0
  228. data/spec/{support → runners}/transactions.rb +4 -4
  229. data/spec/{support → runners}/transactions/context.rb +0 -0
  230. data/spec/{support → runners}/transactions/operation.rb +0 -0
  231. data/spec/{support → runners}/transactions/spec.rb +0 -0
  232. data/spec/{support → runners}/transactions/test.rb +37 -5
  233. data/spec/spec_helper.rb +0 -5
  234. data/spec/spec_tests/auth_spec.rb +3 -3
  235. data/spec/spec_tests/client_side_encryption_spec.rb +13 -0
  236. data/spec/spec_tests/connection_string_spec.rb +1 -1
  237. data/spec/spec_tests/data/auth/connection-string.yml +13 -0
  238. data/spec/spec_tests/data/client_side_encryption/aggregate.yml +134 -0
  239. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +526 -0
  240. data/spec/spec_tests/data/client_side_encryption/badSchema.yml +73 -0
  241. data/spec/spec_tests/data/client_side_encryption/basic.yml +116 -0
  242. data/spec/spec_tests/data/client_side_encryption/bulk.yml +85 -0
  243. data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +100 -0
  244. data/spec/spec_tests/data/client_side_encryption/bypassedCommand.yml +42 -0
  245. data/spec/spec_tests/data/client_side_encryption/count.yml +61 -0
  246. data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +59 -0
  247. data/spec/spec_tests/data/client_side_encryption/delete.yml +105 -0
  248. data/spec/spec_tests/data/client_side_encryption/distinct.yml +73 -0
  249. data/spec/spec_tests/data/client_side_encryption/explain.yml +64 -0
  250. data/spec/spec_tests/data/client_side_encryption/find.yml +119 -0
  251. data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +57 -0
  252. data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +57 -0
  253. data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +57 -0
  254. data/spec/spec_tests/data/client_side_encryption/getMore.yml +68 -0
  255. data/spec/spec_tests/data/client_side_encryption/insert.yml +102 -0
  256. data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +71 -0
  257. data/spec/spec_tests/data/client_side_encryption/localKMS.yml +54 -0
  258. data/spec/spec_tests/data/client_side_encryption/localSchema.yml +72 -0
  259. data/spec/spec_tests/data/client_side_encryption/malformedCiphertext.yml +69 -0
  260. data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +20 -0
  261. data/spec/spec_tests/data/client_side_encryption/missingKey.yml +49 -0
  262. data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +61 -0
  263. data/spec/spec_tests/data/client_side_encryption/types.yml +527 -0
  264. data/spec/spec_tests/data/client_side_encryption/unsupportedCommand.yml +25 -0
  265. data/spec/spec_tests/data/client_side_encryption/updateMany.yml +77 -0
  266. data/spec/spec_tests/data/client_side_encryption/updateOne.yml +168 -0
  267. data/spec/spec_tests/data/read_write_concern/connection-string/write-concern.yml +1 -4
  268. data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +21 -0
  269. data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +2 -4
  270. data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +1 -1
  271. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +73 -0
  272. data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +1 -2
  273. data/spec/spec_tests/data/sdam/rs/repeated.yml +101 -0
  274. data/spec/spec_tests/data/sdam/rs/{primary_address_change.yml → ruby_primary_address_change.yml} +2 -0
  275. data/spec/spec_tests/data/sdam/rs/{secondary_wrong_set_name_with_primary_second.yml → ruby_secondary_wrong_set_name_with_primary_second.yml} +0 -0
  276. data/spec/spec_tests/data/sdam/sharded/ruby_discovered_single_mongos.yml +27 -0
  277. data/spec/spec_tests/data/sdam/sharded/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
  278. data/spec/spec_tests/data/sdam/sharded/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
  279. data/spec/spec_tests/data/sdam/single/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
  280. data/spec/spec_tests/data/sdam/single/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
  281. data/spec/spec_tests/data/sdam_monitoring/{replica_set_with_primary_change.yml → replica_set_primary_address_change.yml} +27 -5
  282. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_me_mismatch.yml +26 -74
  283. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +20 -16
  284. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +73 -0
  285. data/spec/spec_tests/data/transactions/pin-mongos.yml +2 -3
  286. data/spec/spec_tests/data/uri_options/auth-options.yml +10 -0
  287. data/spec/spec_tests/data/uri_options/tls-options.yml +75 -4
  288. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +1 -1
  289. data/spec/spec_tests/uri_options_spec.rb +6 -8
  290. data/spec/stress/connection_pool_timing_spec.rb +6 -3
  291. data/spec/support/certificates/README.md +4 -0
  292. data/spec/support/certificates/server-second-level-bundle.pem +77 -77
  293. data/spec/support/certificates/server-second-level.crt +52 -52
  294. data/spec/support/certificates/server-second-level.key +25 -25
  295. data/spec/support/certificates/server-second-level.pem +77 -77
  296. data/spec/support/client_registry.rb +19 -3
  297. data/spec/support/cluster_config.rb +9 -1
  298. data/spec/support/common_shortcuts.rb +12 -0
  299. data/spec/support/constraints.rb +16 -0
  300. data/spec/support/crypt.rb +140 -0
  301. data/spec/support/crypt/corpus/corpus-key-aws.json +33 -0
  302. data/spec/support/crypt/corpus/corpus-key-local.json +31 -0
  303. data/spec/support/crypt/corpus/corpus-schema.json +2057 -0
  304. data/spec/support/crypt/corpus/corpus.json +3657 -0
  305. data/spec/support/crypt/corpus/corpus_encrypted.json +4152 -0
  306. data/spec/support/crypt/data_keys/key_document_aws.json +34 -0
  307. data/spec/support/crypt/data_keys/key_document_local.json +31 -0
  308. data/spec/support/crypt/external/external-key.json +31 -0
  309. data/spec/support/crypt/external/external-schema.json +19 -0
  310. data/spec/support/crypt/limits/limits-doc.json +102 -0
  311. data/spec/support/crypt/limits/limits-key.json +31 -0
  312. data/spec/support/crypt/limits/limits-schema.json +1405 -0
  313. data/spec/support/crypt/schema_maps/schema_map_aws.json +17 -0
  314. data/spec/support/crypt/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  315. data/spec/support/crypt/schema_maps/schema_map_local.json +18 -0
  316. data/spec/support/crypt/schema_maps/schema_map_local_key_alt_names.json +12 -0
  317. data/spec/support/lite_constraints.rb +17 -1
  318. data/spec/support/matchers.rb +19 -0
  319. data/spec/support/shared/protocol.rb +2 -0
  320. data/spec/support/spec_config.rb +43 -13
  321. data/spec/support/utils.rb +132 -10
  322. metadata +277 -81
  323. metadata.gz.sig +0 -0
  324. data/spec/integration/grid_fs_bucket_spec.rb +0 -48
  325. data/spec/integration/zlib_compression_spec.rb +0 -25
  326. data/spec/spec_tests/data/sdam/sharded/single_mongos.yml +0 -33
  327. data/spec/support/connection_string.rb +0 -354
@@ -0,0 +1,103 @@
1
+ # Copyright (C) 2019 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ # ClientEncryption encapsulates explicit operations on a key vault
17
+ # collection that cannot be done directly on a MongoClient. It
18
+ # provides an API for explicitly encrypting and decrypting values,
19
+ # and creating data keys.
20
+ class ClientEncryption
21
+ # Create a new ClientEncryption object with the provided options.
22
+ #
23
+ # @param [ Mongo::Client ] key_vault_client A Mongo::Client
24
+ # that is connected to the MongoDB instance where the key vault
25
+ # collection is stored.
26
+ # @param [ Hash ] options The ClientEncryption options.
27
+ #
28
+ # @option options [ String ] :key_vault_namespace The name of the
29
+ # key vault collection in the format "database.collection".
30
+ # @option options [ Hash ] :kms_providers A hash of key management service
31
+ # configuration information. Valid hash keys are :local or :aws. There
32
+ # may be more than one KMS provider specified.
33
+ def initialize(key_vault_client, options={})
34
+ @encrypter = Crypt::ExplicitEncrypter.new(
35
+ key_vault_client,
36
+ options[:key_vault_namespace],
37
+ options[:kms_providers]
38
+ )
39
+ end
40
+
41
+ # Generates a data key used for encryption/decryption and stores
42
+ # that key in the KMS collection. The generated key is encrypted with
43
+ # the KMS master key.
44
+ #
45
+ # @param [ String ] kms_provider The KMS provider to use. Valid values are
46
+ # "aws" and "local".
47
+ # @params [ Hash ] options
48
+ #
49
+ # @option options [ Hash ] :master_key Information about the AWS master key.
50
+ # Required if kms_provider is "aws".
51
+ # - :region [ String ] The The AWS region of the master key (required).
52
+ # - :key [ String ] The Amazon Resource Name (ARN) of the master key (required).
53
+ # - :endpoint [ String ] An alternate host to send KMS requests to (optional).
54
+ # endpoint should be a host name with an optional port number separated
55
+ # by a colon (e.g. "kms.us-east-1.amazonaws.com" or
56
+ # "kms.us-east-1.amazonaws.com:443"). An endpoint in any other format
57
+ # will not be properly parsed.
58
+ # @option options [ Array<String> ] :key_alt_names An optional array of
59
+ # strings specifying alternate names for the new data key.
60
+ #
61
+ # @return [ BSON::Binary ] The 16-byte UUID of the new data key as a
62
+ # BSON::Binary object with type :uuid.
63
+ def create_data_key(kms_provider, options={})
64
+ @encrypter.create_and_insert_data_key(
65
+ kms_provider,
66
+ options
67
+ )
68
+ end
69
+
70
+ # Encrypts a value using the specified encryption key and algorithm.
71
+ #
72
+ # @param [ Object ] value The value to encrypt.
73
+ # @param [ Hash ] options
74
+ #
75
+ # @option options [ BSON::Binary ] :key_id A BSON::Binary object of type :uuid
76
+ # representing the UUID of the encryption key as it is stored in the key
77
+ # vault collection.
78
+ # @option options [ String ] :key_alt_name The alternate name for the
79
+ # encryption key.
80
+ # @option options [ String ] :algorithm The algorithm used to encrypt the value.
81
+ # Valid algorithms are "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
82
+ # or "AEAD_AES_256_CBC_HMAC_SHA_512-Random".
83
+ #
84
+ # @note The :key_id and :key_alt_name options are mutually exclusive. Only
85
+ # one is required to perform explicit encryption.
86
+ #
87
+ # @return [ BSON::Binary ] A BSON Binary object of subtype 6 (ciphertext)
88
+ # representing the encrypted value.
89
+ def encrypt(value, options={})
90
+ @encrypter.encrypt(value, options)
91
+ end
92
+
93
+ # Decrypts a value that has already been encrypted.
94
+ #
95
+ # @param [ BSON::Binary ] value A BSON Binary object of subtype 6 (ciphertext)
96
+ # that will be decrypted.
97
+ #
98
+ # @return [ Object ] The decrypted value.
99
+ def decrypt(value)
100
+ @encrypter.decrypt(value)
101
+ end
102
+ end
103
+ end
@@ -258,8 +258,8 @@ module Mongo
258
258
  # @return [ Object ] The cluster topology.
259
259
  attr_reader :topology
260
260
 
261
- # @return [ Mongo::Server::AppMetadata ] The application metadata, used for connection
262
- # handshakes.
261
+ # @return [ Mongo::Server::AppMetadata ] The application metadata, used for
262
+ # connection handshakes.
263
263
  #
264
264
  # @since 2.4.0
265
265
  attr_reader :app_metadata
@@ -76,10 +76,15 @@ module Mongo
76
76
  #
77
77
  # @since 2.3.0
78
78
  def register_cursor(id)
79
- if id && id > 0
80
- @mutex.synchronize do
81
- @active_cursors << id
82
- end
79
+ if id.nil?
80
+ raise ArgumentError, 'register_cursor called with nil cursor_id'
81
+ end
82
+ if id == 0
83
+ raise ArgumentError, 'register_cursor called with cursor_id=0'
84
+ end
85
+
86
+ @mutex.synchronize do
87
+ @active_cursors << id
83
88
  end
84
89
  end
85
90
 
@@ -94,6 +99,13 @@ module Mongo
94
99
  #
95
100
  # @since 2.3.0
96
101
  def unregister_cursor(id)
102
+ if id.nil?
103
+ raise ArgumentError, 'unregister_cursor called with nil cursor_id'
104
+ end
105
+ if id == 0
106
+ raise ArgumentError, 'unregister_cursor called with cursor_id=0'
107
+ end
108
+
97
109
  @mutex.synchronize do
98
110
  @active_cursors.delete(id)
99
111
  end
@@ -122,12 +134,12 @@ module Mongo
122
134
  if server.features.find_command_enabled?
123
135
  Cursor::Builder::KillCursorsCommand.update_cursors(op_spec, active_cursors_copy.to_a)
124
136
  if Cursor::Builder::KillCursorsCommand.get_cursors_list(op_spec).size > 0
125
- Operation::KillCursors.new(op_spec).execute(server)
137
+ Operation::KillCursors.new(op_spec).execute(server, client: nil)
126
138
  end
127
139
  else
128
140
  Cursor::Builder::OpKillCursors.update_cursors(op_spec, active_cursors_copy.to_a)
129
141
  if Cursor::Builder::OpKillCursors.get_cursors_list(op_spec).size > 0
130
- Operation::KillCursors.new(op_spec).execute(server)
142
+ Operation::KillCursors.new(op_spec).execute(server, client: nil)
131
143
  end
132
144
  end
133
145
  end
@@ -58,74 +58,26 @@ class Mongo::Cluster
58
58
  def update_server_descriptions
59
59
  servers_list.each do |server|
60
60
  if server.address == updated_desc.address
61
- changed = server.description != updated_desc
61
+ @server_description_changed = server.description != updated_desc
62
+
62
63
  # Always update server description, so that fields that do not
63
64
  # affect description equality comparisons but are part of the
64
65
  # description are updated.
65
66
  server.update_description(updated_desc)
66
67
  server.update_last_scan
67
- # But return if there was a content difference between
68
- # descriptions, and if there wasn't we'll skip the remainder of
69
- # sdam flow
70
- return changed
68
+
69
+ # If there was no content difference between descriptions, we
70
+ # still need to run sdam flow, but if the flow produces no change
71
+ # in topology we will omit sending events.
72
+ return true
71
73
  end
72
74
  end
73
75
  false
74
76
  end
75
77
 
76
78
  def server_description_changed
77
- if updated_desc.me_mismatch? && updated_desc.primary? &&
78
- (topology.unknown? || topology.replica_set?)
79
- then
80
- # When the driver receives a description claiming to be a primary,
81
- # we are obligated by spec tests to add and remove hosts in that
82
- # description even if it also has a me mismatch. The me mismatch
83
- # scenario though presents a number of problems:
84
- #
85
- # 1. Effectively, the server's address changes, meaning we cannot
86
- # update the description of the server whose description change we
87
- # are processing (instead servers are added and removed), but we
88
- # behave to an extent as if we are updating the description, which
89
- # causes a bunch of awkwardness.
90
- # 2. The server for which we are processing the response will be
91
- # removed from topology, which may cause the current thread to terminate
92
- # prior to running the entire sdam flow. To deal with this we separate
93
- # the removal event publication from actually removing the server
94
- # from topology, which again complicates the flow.
95
-
96
- # Primary-with-me-mismatch response could be the first one we receive
97
- # when the topology is still unknown. Change to RS without primary
98
- # in this case.
99
- if topology.unknown?
100
- @topology = Topology::ReplicaSetNoPrimary.new(
101
- topology.options.merge(replica_set_name: updated_desc.replica_set_name),
102
- topology.monitoring, self)
103
- end
104
-
105
- servers = add_servers_from_desc(updated_desc)
106
- # Spec tests require us to remove servers based on data in descrptions
107
- # with me mismatches. The driver will be more resilient if it only
108
- # removed servers from descriptions with matching mes.
109
- remove_servers_not_in_desc(updated_desc)
110
-
111
- servers.each do |server|
112
- server.start_monitoring
113
- end
114
-
115
- # The rest of sdam flow assumes the server being removed is not the one
116
- # whose description we are processing, and publishes description update
117
- # event. Since we are removing the server whose response we are
118
- # processing, do not publish description change event but mark it
119
- # published (by assigning to @previous_desc).
120
- do_remove(updated_desc.address.to_s)
121
- @previous_desc = updated_desc
122
-
123
- # We may have removed the current primary, check if there is a primary.
124
- check_if_has_primary
125
- # Publish topology change event.
126
- commit_changes
127
- disconnect_servers
128
- return
79
+ @previous_server_descriptions = servers_list.map do |server|
80
+ [server.address.to_s, server.description]
129
81
  end
130
82
 
131
83
  unless update_server_descriptions
@@ -158,10 +110,16 @@ class Mongo::Cluster
158
110
  end
159
111
  when Topology::Sharded
160
112
  unless updated_desc.unknown? || updated_desc.mongos?
113
+ log_warn(
114
+ "Removing server #{updated_desc.address.to_s} because it is a #{updated_desc.server_type.to_s.upcase} and not a MONGOS"
115
+ )
161
116
  remove
162
117
  end
163
118
  when Topology::ReplicaSetWithPrimary
164
119
  if updated_desc.standalone? || updated_desc.mongos?
120
+ log_warn(
121
+ "Removing server #{updated_desc.address.to_s} because it is a #{updated_desc.server_type.to_s.upcase} and not a replica set member"
122
+ )
165
123
  remove
166
124
  check_if_has_primary
167
125
  elsif updated_desc.primary?
@@ -173,6 +131,9 @@ class Mongo::Cluster
173
131
  end
174
132
  when Topology::ReplicaSetNoPrimary
175
133
  if updated_desc.standalone? || updated_desc.mongos?
134
+ log_warn(
135
+ "Removing server #{updated_desc.address.to_s} because it is a #{updated_desc.server_type.to_s.upcase} and not a replica set member"
136
+ )
176
137
  remove
177
138
  elsif updated_desc.primary?
178
139
  # Here we change topology type to RS with primary, however
@@ -440,6 +401,16 @@ class Mongo::Cluster
440
401
  end
441
402
 
442
403
  def publish_description_change_event
404
+ # This method may be invoked when server description definitely changed
405
+ # but prior to the topology getting updated. Therefore we check both
406
+ # server description changes and overall topology changes. When this
407
+ # method is called at the end of SDAM flow as part of "commit changes"
408
+ # step, server description change is incorporated into the topology
409
+ # change.
410
+ unless @server_description_changed || topology_effectively_changed?
411
+ return
412
+ end
413
+
443
414
  # updated_desc here may not be the description we received from
444
415
  # the server - in case of a stale primary, the server reported itself
445
416
  # as being a primary but updated_desc here will be unknown.
@@ -492,7 +463,7 @@ class Mongo::Cluster
492
463
  start_pool_if_data_bearing
493
464
 
494
465
  topology_changed_event_published = false
495
- if topology.object_id != cluster.topology.object_id || @need_topology_changed_event
466
+ if !topology.equal?(cluster.topology) || @need_topology_changed_event
496
467
  # We are about to publish topology changed event.
497
468
  # Recreate the topology instance to get its server descriptions
498
469
  # up to date.
@@ -517,6 +488,10 @@ class Mongo::Cluster
517
488
  return
518
489
  end
519
490
 
491
+ unless topology_effectively_changed?
492
+ return
493
+ end
494
+
520
495
  # If we are here, there has been a change in the server descriptions
521
496
  # in our topology, but topology class has not changed.
522
497
  # Publish the topology changed event and recreate the topology to
@@ -584,5 +559,26 @@ class Mongo::Cluster
584
559
  def became_unknown?
585
560
  updated_desc.unknown? && !original_desc.unknown?
586
561
  end
562
+
563
+ # Returns whether topology meaningfully changed as a result of running
564
+ # SDAM flow.
565
+ #
566
+ # The spec defines topology equality through equality of topology types
567
+ # and server descriptions in each topology; this definition is not usable
568
+ # by us because our topology objects do not hold server descriptions and
569
+ # are instead "live". Thus we have to store the full list of server
570
+ # descriptions at the beginning of SDAM flow and compare them to the
571
+ # current ones.
572
+ def topology_effectively_changed?
573
+ unless topology.equal?(cluster.topology)
574
+ return true
575
+ end
576
+
577
+ server_descriptions = servers_list.map do |server|
578
+ [server.address.to_s, server.description]
579
+ end
580
+
581
+ @previous_server_descriptions != server_descriptions
582
+ end
587
583
  end
588
584
  end
@@ -87,7 +87,7 @@ module Mongo
87
87
  rescue Resolv::ResolvTimeout => e
88
88
  log_warn("SRV monitor: timed out trying to resolve hostname #{@srv_uri.query_hostname}: #{e.class}: #{e}")
89
89
  return
90
- rescue Timeout::Error
90
+ rescue ::Timeout::Error
91
91
  log_warn("SRV monitor: timed out trying to resolve hostname #{@srv_uri.query_hostname} (timeout=#{timeout})")
92
92
  return
93
93
  rescue Resolv::ResolvError => e
@@ -249,7 +249,7 @@ module Mongo
249
249
  db_name: database.name,
250
250
  write_concern: write_concern,
251
251
  session: session
252
- }).execute(server)
252
+ }).execute(server, client: client)
253
253
  end
254
254
  end
255
255
 
@@ -275,7 +275,7 @@ module Mongo
275
275
  db_name: database.name,
276
276
  write_concern: write_concern,
277
277
  session: session
278
- }).execute(next_primary(nil, session))
278
+ }).execute(next_primary(nil, session), client: client)
279
279
  end
280
280
  rescue Error::OperationFailure => ex
281
281
  raise ex unless ex.message =~ /ns not found/
@@ -545,7 +545,7 @@ module Mongo
545
545
  :id_generator => client.options[:id_generator],
546
546
  :session => session,
547
547
  :txn_num => txn_num
548
- ).execute(server)
548
+ ).execute(server, client: client)
549
549
  end
550
550
  end
551
551
  end
@@ -119,7 +119,7 @@ module Mongo
119
119
  # @option options :comment [ String ] Associate a comment with the query.
120
120
  # @option options :batch_size [ Integer ] The number of docs to return in
121
121
  # each response from MongoDB.
122
- # @option options :fields [ Hash ] The fields to include or exclude in
122
+ # @option options :projection [ Hash ] The fields to include or exclude in
123
123
  # returned docs.
124
124
  # @option options :hint [ Hash ] Override default index selection and force
125
125
  # MongoDB to use a specific index for the query.
@@ -125,7 +125,7 @@ module Mongo
125
125
  server = cluster.next_primary(nil, session)
126
126
  end
127
127
  validate_collation!(server)
128
- initial_query_op(session).execute(server)
128
+ initial_query_op(session).execute(server, client: client)
129
129
  end
130
130
 
131
131
  def validate_collation!(server)
@@ -194,12 +194,21 @@ module Mongo
194
194
  # @example Close the change stream.
195
195
  # stream.close
196
196
  #
197
- # @return [ nil ] nil.
197
+ # @note This method attempts to close the cursor used by the change
198
+ # stream, which in turn closes the server-side change stream cursor.
199
+ # This method ignores any errors that occur when closing the
200
+ # server-side cursor.
201
+ #
202
+ # @return [ nil ] Always nil.
198
203
  #
199
204
  # @since 2.5.0
200
205
  def close
201
206
  unless closed?
202
- begin; @cursor.send(:kill_cursors); rescue; end
207
+ begin
208
+ @cursor.close
209
+ rescue Error::OperationFailure
210
+ # ignore
211
+ end
203
212
  @cursor = nil
204
213
  end
205
214
  end
@@ -340,7 +349,7 @@ module Mongo
340
349
  end
341
350
 
342
351
  def send_initial_query(server, session)
343
- initial_query_op(session).execute(server)
352
+ initial_query_op(session).execute(server, client: client)
344
353
  end
345
354
 
346
355
  def time_to_bson_timestamp(time)
@@ -55,14 +55,23 @@ module Mongo
55
55
  end
56
56
  end
57
57
 
58
- # Stop the iteration by sending a KillCursors command to the server.
58
+ # Cleans up resources associated with this query.
59
59
  #
60
- # @example Stop the iteration.
61
- # view.close_query
60
+ # If there is a server cursor associated with this query, it is
61
+ # closed by sending a KillCursors command to the server.
62
+ #
63
+ # @note This method propagates any errors that occur when closing the
64
+ # server-side cursor.
65
+ #
66
+ # @return [ nil ] Always nil.
67
+ #
68
+ # @raise [ Error::OperationFailure ] If the server cursor close fails.
62
69
  #
63
70
  # @since 2.1.0
64
71
  def close_query
65
- @cursor.send(:kill_cursors) if @cursor && !@cursor.closed?
72
+ if @cursor
73
+ @cursor.close
74
+ end
66
75
  end
67
76
  alias :kill_cursors :close_query
68
77
 
@@ -86,7 +95,7 @@ module Mongo
86
95
 
87
96
  def send_initial_query(server, session = nil)
88
97
  validate_collation!(server, collation)
89
- initial_query_op(server, session).execute(server)
98
+ initial_query_op(server, session).execute(server, client: client)
90
99
  end
91
100
  end
92
101
  end