mongo 2.1.0.beta → 2.2.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 (342) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +10 -3
  4. data/Rakefile +1 -7
  5. data/lib/mongo/address/ipv4.rb +6 -1
  6. data/lib/mongo/address/unix.rb +2 -2
  7. data/lib/mongo/address.rb +32 -10
  8. data/lib/mongo/auth/cr/conversation.rb +1 -1
  9. data/lib/mongo/auth/ldap/conversation.rb +7 -3
  10. data/lib/mongo/auth/scram/conversation.rb +9 -3
  11. data/lib/mongo/auth/user/view.rb +23 -2
  12. data/lib/mongo/auth/x509/conversation.rb +1 -1
  13. data/lib/mongo/bulk_write/combineable.rb +51 -0
  14. data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
  15. data/lib/mongo/bulk_write/result.rb +61 -8
  16. data/lib/mongo/bulk_write/result_combiner.rb +117 -0
  17. data/lib/mongo/bulk_write/transformable.rb +132 -0
  18. data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
  19. data/lib/mongo/bulk_write/validatable.rb +62 -0
  20. data/lib/mongo/bulk_write.rb +164 -23
  21. data/lib/mongo/client.rb +75 -18
  22. data/lib/mongo/cluster/topology/replica_set.rb +8 -6
  23. data/lib/mongo/cluster/topology/unknown.rb +5 -2
  24. data/lib/mongo/cluster.rb +85 -5
  25. data/lib/mongo/collection/view/aggregation.rb +19 -45
  26. data/lib/mongo/collection/view/builder/aggregation.rb +98 -0
  27. data/lib/mongo/collection/view/builder/find_command.rb +111 -0
  28. data/lib/mongo/collection/view/builder/flags.rb +62 -0
  29. data/lib/mongo/collection/view/builder/map_reduce.rb +134 -0
  30. data/lib/mongo/collection/view/builder/modifiers.rb +80 -0
  31. data/lib/mongo/collection/view/builder/op_query.rb +83 -0
  32. data/lib/mongo/collection/view/builder.rb +20 -0
  33. data/lib/mongo/collection/view/explainable.rb +15 -0
  34. data/lib/mongo/collection/view/immutable.rb +4 -11
  35. data/lib/mongo/collection/view/iterable.rb +40 -5
  36. data/lib/mongo/collection/view/map_reduce.rb +67 -37
  37. data/lib/mongo/collection/view/readable.rb +114 -100
  38. data/lib/mongo/collection/view/writable.rb +46 -22
  39. data/lib/mongo/collection/view.rb +25 -22
  40. data/lib/mongo/collection.rb +130 -12
  41. data/lib/mongo/cursor/builder/get_more_command.rb +71 -0
  42. data/lib/mongo/cursor/builder/kill_cursors_command.rb +62 -0
  43. data/lib/mongo/cursor/builder/op_get_more.rb +61 -0
  44. data/lib/mongo/cursor/builder/op_kill_cursors.rb +56 -0
  45. data/lib/mongo/cursor/builder.rb +18 -0
  46. data/lib/mongo/cursor.rb +76 -21
  47. data/lib/mongo/database/view.rb +11 -6
  48. data/lib/mongo/database.rb +16 -6
  49. data/lib/mongo/dbref.rb +9 -9
  50. data/lib/mongo/{bulk_write/unordered_bulk_write.rb → error/closed_stream.rb} +12 -21
  51. data/lib/mongo/{bulk_write/ordered_bulk_write.rb → error/extra_file_chunk.rb} +13 -27
  52. data/lib/mongo/error/file_not_found.rb +37 -0
  53. data/lib/mongo/error/invalid_file.rb +2 -2
  54. data/lib/mongo/error/invalid_file_revision.rb +37 -0
  55. data/lib/mongo/error/invalid_uri.rb +5 -4
  56. data/lib/mongo/error/invalid_write_concern.rb +35 -0
  57. data/lib/mongo/error/missing_file_chunk.rb +38 -0
  58. data/lib/mongo/error/operation_failure.rb +33 -2
  59. data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
  60. data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
  61. data/lib/mongo/error.rb +8 -0
  62. data/lib/mongo/grid/file/chunk.rb +9 -9
  63. data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
  64. data/lib/mongo/grid/file.rb +12 -9
  65. data/lib/mongo/grid/fs_bucket.rb +448 -0
  66. data/lib/mongo/grid/stream/read.rb +208 -0
  67. data/lib/mongo/grid/stream/write.rb +187 -0
  68. data/lib/mongo/grid/stream.rb +64 -0
  69. data/lib/mongo/grid.rb +2 -1
  70. data/lib/mongo/index/view.rb +7 -4
  71. data/lib/mongo/index.rb +5 -0
  72. data/lib/mongo/loggable.rb +34 -57
  73. data/lib/mongo/logger.rb +16 -78
  74. data/lib/mongo/monitoring/command_log_subscriber.rb +38 -14
  75. data/lib/mongo/monitoring/event/command_started.rb +2 -1
  76. data/lib/mongo/monitoring/event/command_succeeded.rb +24 -2
  77. data/lib/mongo/monitoring/event/secure.rb +58 -0
  78. data/lib/mongo/monitoring/event.rb +1 -0
  79. data/lib/mongo/monitoring/publishable.rb +22 -12
  80. data/lib/mongo/monitoring.rb +1 -5
  81. data/lib/mongo/operation/commands/aggregate/result.rb +89 -0
  82. data/lib/mongo/operation/commands/aggregate.rb +64 -0
  83. data/lib/mongo/operation/commands/collections_info/result.rb +41 -0
  84. data/lib/mongo/operation/{read → commands}/collections_info.rb +5 -3
  85. data/lib/mongo/operation/commands/command.rb +47 -0
  86. data/lib/mongo/operation/commands/find/result.rb +62 -0
  87. data/lib/mongo/operation/commands/find.rb +27 -0
  88. data/lib/mongo/operation/commands/get_more/result.rb +62 -0
  89. data/lib/mongo/operation/commands/get_more.rb +27 -0
  90. data/lib/mongo/operation/{read → commands}/indexes.rb +9 -6
  91. data/lib/mongo/operation/{list_collections → commands/list_collections}/result.rb +1 -21
  92. data/lib/mongo/operation/{read → commands}/list_collections.rb +4 -32
  93. data/lib/mongo/operation/{list_indexes → commands/list_indexes}/result.rb +1 -21
  94. data/lib/mongo/operation/{read → commands}/list_indexes.rb +3 -33
  95. data/lib/mongo/operation/commands/map_reduce/result.rb +119 -0
  96. data/lib/mongo/operation/commands/map_reduce.rb +49 -0
  97. data/lib/mongo/operation/commands/parallel_scan/result.rb +64 -0
  98. data/lib/mongo/operation/commands/parallel_scan.rb +52 -0
  99. data/lib/mongo/operation/commands/user_query.rb +71 -0
  100. data/lib/mongo/operation/commands/users_info/result.rb +38 -0
  101. data/lib/mongo/operation/commands/users_info.rb +48 -0
  102. data/lib/mongo/operation/commands.rb +26 -0
  103. data/lib/mongo/operation/executable.rb +4 -68
  104. data/lib/mongo/operation/kill_cursors.rb +3 -3
  105. data/lib/mongo/operation/object_id_generator.rb +36 -0
  106. data/lib/mongo/operation/read/get_more.rb +2 -22
  107. data/lib/mongo/operation/read/query/result.rb +40 -0
  108. data/lib/mongo/operation/read/query.rb +4 -21
  109. data/lib/mongo/operation/read.rb +0 -4
  110. data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
  111. data/lib/mongo/operation/result.rb +43 -1
  112. data/lib/mongo/operation/specifiable.rb +59 -1
  113. data/lib/mongo/operation/write/bulk/bulkable.rb +83 -0
  114. data/lib/mongo/operation/write/bulk/delete/result.rb +67 -0
  115. data/lib/mongo/operation/write/bulk/delete.rb +71 -0
  116. data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
  117. data/lib/mongo/operation/write/bulk/insert.rb +96 -0
  118. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
  119. data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
  120. data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
  121. data/lib/mongo/operation/write/bulk/update.rb +81 -0
  122. data/lib/mongo/operation/write/bulk.rb +6 -3
  123. data/lib/mongo/operation/write/command/create_index.rb +0 -1
  124. data/lib/mongo/operation/write/command/create_user.rb +0 -1
  125. data/lib/mongo/operation/write/command/delete.rb +3 -3
  126. data/lib/mongo/operation/write/command/drop_index.rb +0 -1
  127. data/lib/mongo/operation/write/command/insert.rb +4 -3
  128. data/lib/mongo/operation/write/command/remove_user.rb +0 -1
  129. data/lib/mongo/operation/write/command/update.rb +6 -4
  130. data/lib/mongo/operation/write/command/update_user.rb +0 -1
  131. data/lib/mongo/operation/write/command/writable.rb +13 -18
  132. data/lib/mongo/operation/write/create_index.rb +4 -27
  133. data/lib/mongo/operation/write/create_user.rb +4 -30
  134. data/lib/mongo/operation/write/delete.rb +6 -29
  135. data/lib/mongo/operation/write/drop_index.rb +3 -3
  136. data/lib/mongo/operation/write/gle.rb +49 -0
  137. data/lib/mongo/operation/write/idable.rb +24 -2
  138. data/lib/mongo/operation/write/insert.rb +2 -24
  139. data/lib/mongo/operation/write/remove_user.rb +4 -27
  140. data/lib/mongo/operation/write/update.rb +13 -36
  141. data/lib/mongo/operation/write/update_user.rb +4 -30
  142. data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
  143. data/lib/mongo/operation/write.rb +2 -0
  144. data/lib/mongo/operation.rb +33 -5
  145. data/lib/mongo/options/mapper.rb +26 -2
  146. data/lib/mongo/options/redacted.rb +156 -0
  147. data/lib/mongo/options.rb +1 -0
  148. data/lib/mongo/protocol/bit_vector.rb +11 -9
  149. data/lib/mongo/protocol/delete.rb +78 -3
  150. data/lib/mongo/protocol/get_more.rb +59 -2
  151. data/lib/mongo/protocol/insert.rb +73 -1
  152. data/lib/mongo/protocol/kill_cursors.rb +66 -4
  153. data/lib/mongo/protocol/message.rb +44 -20
  154. data/lib/mongo/protocol/query.rb +153 -65
  155. data/lib/mongo/protocol/reply.rb +92 -1
  156. data/lib/mongo/protocol/serializers.rb +49 -40
  157. data/lib/mongo/protocol/update.rb +93 -1
  158. data/lib/mongo/retryable.rb +101 -0
  159. data/lib/mongo/server/connectable.rb +28 -8
  160. data/lib/mongo/server/connection.rb +52 -10
  161. data/lib/mongo/server/connection_pool/queue.rb +15 -0
  162. data/lib/mongo/server/connection_pool.rb +12 -15
  163. data/lib/mongo/server/description/features.rb +4 -2
  164. data/lib/mongo/server/description.rb +39 -3
  165. data/lib/mongo/server/monitor/connection.rb +49 -28
  166. data/lib/mongo/server/monitor.rb +3 -14
  167. data/lib/mongo/server.rb +31 -4
  168. data/lib/mongo/server_selector/selectable.rb +58 -32
  169. data/lib/mongo/server_selector.rb +19 -10
  170. data/lib/mongo/socket/ssl.rb +4 -1
  171. data/lib/mongo/socket/tcp.rb +2 -2
  172. data/lib/mongo/socket/unix.rb +5 -8
  173. data/lib/mongo/socket.rb +11 -4
  174. data/lib/mongo/uri.rb +245 -139
  175. data/lib/mongo/version.rb +1 -1
  176. data/lib/mongo/write_concern.rb +21 -6
  177. data/lib/mongo.rb +4 -4
  178. data/mongo.gemspec +1 -2
  179. data/spec/mongo/address/unix_spec.rb +1 -1
  180. data/spec/mongo/address_spec.rb +25 -0
  181. data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
  182. data/spec/mongo/auth/user/view_spec.rb +26 -1
  183. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +284 -0
  184. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
  185. data/spec/mongo/bulk_write_spec.rb +385 -161
  186. data/spec/mongo/client_spec.rb +193 -23
  187. data/spec/mongo/cluster/topology/replica_set_spec.rb +2 -0
  188. data/spec/mongo/collection/view/aggregation_spec.rb +65 -0
  189. data/spec/mongo/collection/view/builder/find_command_spec.rb +167 -0
  190. data/spec/mongo/collection/view/builder/flags_spec.rb +106 -0
  191. data/spec/mongo/collection/view/builder/modifiers_spec.rb +210 -0
  192. data/spec/mongo/collection/view/builder/op_query_spec.rb +154 -0
  193. data/spec/mongo/collection/view/explainable_spec.rb +1 -2
  194. data/spec/mongo/collection/view/immutable_spec.rb +54 -0
  195. data/spec/mongo/collection/view/map_reduce_spec.rb +104 -9
  196. data/spec/mongo/collection/view/readable_spec.rb +109 -112
  197. data/spec/mongo/collection/view_spec.rb +119 -487
  198. data/spec/mongo/collection_spec.rb +1002 -33
  199. data/spec/mongo/command_monitoring_spec.rb +64 -0
  200. data/spec/mongo/connection_string_spec.rb +115 -0
  201. data/spec/mongo/cursor/builder/get_more_command_spec.rb +160 -0
  202. data/spec/mongo/cursor/builder/op_get_more_spec.rb +52 -0
  203. data/spec/mongo/cursor_spec.rb +10 -60
  204. data/spec/mongo/database_spec.rb +81 -12
  205. data/spec/mongo/dbref_spec.rb +4 -4
  206. data/spec/mongo/grid/file/chunk_spec.rb +6 -6
  207. data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
  208. data/spec/mongo/grid/file_spec.rb +8 -8
  209. data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
  210. data/spec/mongo/grid/stream/read_spec.rb +275 -0
  211. data/spec/mongo/grid/stream/write_spec.rb +440 -0
  212. data/spec/mongo/grid/stream_spec.rb +48 -0
  213. data/spec/mongo/gridfs_spec.rb +50 -0
  214. data/spec/mongo/index/view_spec.rb +41 -0
  215. data/spec/mongo/logger_spec.rb +0 -40
  216. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
  217. data/spec/mongo/monitoring/event/command_started_spec.rb +26 -0
  218. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +26 -0
  219. data/spec/mongo/monitoring/event/secure_spec.rb +57 -0
  220. data/spec/mongo/operation/{aggregate → commands/aggregate}/result_spec.rb +1 -1
  221. data/spec/mongo/operation/commands/aggregate_spec.rb +69 -0
  222. data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
  223. data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +1 -19
  224. data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
  225. data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +1 -19
  226. data/spec/mongo/operation/kill_cursors_spec.rb +1 -17
  227. data/spec/mongo/operation/read/get_more_spec.rb +0 -16
  228. data/spec/mongo/operation/read/query_spec.rb +19 -16
  229. data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
  230. data/spec/mongo/operation/result_spec.rb +19 -0
  231. data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +17 -28
  232. data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +1 -12
  233. data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +7 -18
  234. data/spec/mongo/operation/write/command/delete_spec.rb +18 -9
  235. data/spec/mongo/operation/write/command/insert_spec.rb +18 -9
  236. data/spec/mongo/operation/write/command/update_spec.rb +18 -9
  237. data/spec/mongo/operation/write/delete_spec.rb +3 -3
  238. data/spec/mongo/operation/write/insert_spec.rb +0 -11
  239. data/spec/mongo/operation/write/update_spec.rb +6 -6
  240. data/spec/mongo/options/redacted_spec.rb +350 -0
  241. data/spec/mongo/protocol/delete_spec.rb +4 -4
  242. data/spec/mongo/protocol/get_more_spec.rb +4 -4
  243. data/spec/mongo/protocol/insert_spec.rb +3 -3
  244. data/spec/mongo/protocol/kill_cursors_spec.rb +8 -6
  245. data/spec/mongo/protocol/query_spec.rb +21 -7
  246. data/spec/mongo/protocol/update_spec.rb +5 -5
  247. data/spec/mongo/retryable_spec.rb +221 -0
  248. data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
  249. data/spec/mongo/server/connection_pool_spec.rb +42 -6
  250. data/spec/mongo/server/connection_spec.rb +86 -1
  251. data/spec/mongo/server/description/features_spec.rb +25 -0
  252. data/spec/mongo/server/description_spec.rb +42 -0
  253. data/spec/mongo/server/monitor_spec.rb +44 -0
  254. data/spec/mongo/server_discovery_and_monitoring_spec.rb +25 -59
  255. data/spec/mongo/server_selection_rtt_spec.rb +37 -57
  256. data/spec/mongo/server_selection_spec.rb +5 -3
  257. data/spec/mongo/server_selector/nearest_spec.rb +35 -27
  258. data/spec/mongo/server_selector/primary_preferred_spec.rb +32 -30
  259. data/spec/mongo/server_selector/primary_spec.rb +21 -14
  260. data/spec/mongo/server_selector/secondary_preferred_spec.rb +28 -26
  261. data/spec/mongo/server_selector/secondary_spec.rb +24 -22
  262. data/spec/mongo/server_selector_spec.rb +87 -24
  263. data/spec/mongo/server_spec.rb +78 -15
  264. data/spec/mongo/socket/ssl_spec.rb +101 -57
  265. data/spec/mongo/socket/unix_spec.rb +52 -0
  266. data/spec/mongo/uri_spec.rb +271 -59
  267. data/spec/mongo/write_concern_spec.rb +126 -0
  268. data/spec/spec_helper.rb +29 -23
  269. data/spec/support/authorization.rb +4 -5
  270. data/spec/support/command_monitoring/bulkWrite.yml +73 -0
  271. data/spec/support/command_monitoring/command.yml +42 -0
  272. data/spec/support/command_monitoring/deleteMany.yml +55 -0
  273. data/spec/support/command_monitoring/deleteOne.yml +55 -0
  274. data/spec/support/command_monitoring/find.yml +268 -0
  275. data/spec/support/command_monitoring/insertMany.yml +81 -0
  276. data/spec/support/command_monitoring/insertOne.yml +51 -0
  277. data/spec/support/command_monitoring/updateMany.yml +67 -0
  278. data/spec/support/command_monitoring/updateOne.yml +95 -0
  279. data/spec/support/command_monitoring.rb +373 -0
  280. data/spec/support/connection_string.rb +228 -0
  281. data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
  282. data/spec/support/connection_string_tests/valid-auth.yml +256 -0
  283. data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
  284. data/spec/support/connection_string_tests/valid-options.yml +30 -0
  285. data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
  286. data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
  287. data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
  288. data/spec/support/crud/read.rb +14 -10
  289. data/spec/support/crud/write.rb +36 -9
  290. data/spec/support/crud.rb +10 -2
  291. data/spec/support/gridfs.rb +637 -0
  292. data/spec/support/gridfs_tests/delete.yml +157 -0
  293. data/spec/support/gridfs_tests/download.yml +210 -0
  294. data/spec/support/gridfs_tests/download_by_name.yml +113 -0
  295. data/spec/support/gridfs_tests/upload.yml +158 -0
  296. data/spec/support/matchers.rb +2 -2
  297. data/spec/support/sdam/rs/equal_electionids.yml +1 -2
  298. data/spec/support/sdam/rs/new_primary_new_electionid.yml +0 -3
  299. data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
  300. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
  301. data/spec/support/sdam/rs/rsother_discovered.yml +24 -3
  302. data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
  303. data/spec/support/sdam/rs/stepdown_change_set_name.yml +59 -0
  304. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  305. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  306. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  307. data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
  308. data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
  309. data/spec/support/sdam/single/not_ok_response.yml +0 -1
  310. data/spec/support/server_discovery_and_monitoring.rb +3 -1
  311. data/spec/support/server_selection.rb +3 -1
  312. data/spec/support/shared/bulk_write.rb +192 -0
  313. data/spec/support/shared/protocol.rb +5 -5
  314. data/spec/support/shared/server_selector.rb +78 -13
  315. data/spec/support/travis.rb +1 -1
  316. data.tar.gz.sig +0 -0
  317. metadata +211 -72
  318. metadata.gz.sig +0 -0
  319. data/lib/mongo/bulk_write/bulk_writable.rb +0 -252
  320. data/lib/mongo/bulk_write/deletable.rb +0 -57
  321. data/lib/mongo/bulk_write/insertable.rb +0 -49
  322. data/lib/mongo/bulk_write/replacable.rb +0 -58
  323. data/lib/mongo/bulk_write/updatable.rb +0 -69
  324. data/lib/mongo/grid/fs.rb +0 -146
  325. data/lib/mongo/operation/aggregate/result.rb +0 -103
  326. data/lib/mongo/operation/aggregate.rb +0 -108
  327. data/lib/mongo/operation/command.rb +0 -61
  328. data/lib/mongo/operation/map_reduce/result.rb +0 -122
  329. data/lib/mongo/operation/map_reduce.rb +0 -95
  330. data/lib/mongo/operation/parallel_scan/result.rb +0 -72
  331. data/lib/mongo/operation/parallel_scan.rb +0 -76
  332. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
  333. data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
  334. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
  335. data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
  336. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
  337. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -174
  338. data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
  339. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
  340. data/spec/mongo/grid/fs_spec.rb +0 -160
  341. data/spec/mongo/loggable_spec.rb +0 -63
  342. data/spec/mongo/operation/aggregate_spec.rb +0 -127
@@ -0,0 +1,132 @@
1
+ # Copyright (C) 2015 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
+ class BulkWrite
17
+
18
+ # Defines behaviour around transformations.
19
+ #
20
+ # @api private
21
+ #
22
+ # @since 2.1.0
23
+ module Transformable
24
+
25
+ # The delete many model constant.
26
+ #
27
+ # @since 2.1.0
28
+ DELETE_MANY = :delete_many.freeze
29
+
30
+ # The delete one model constant.
31
+ #
32
+ # @since 2.1.0
33
+ DELETE_ONE = :delete_one.freeze
34
+
35
+ # The insert one model constant.
36
+ #
37
+ # @since 2.1.0
38
+ INSERT_ONE = :insert_one.freeze
39
+
40
+ # The replace one model constant.
41
+ #
42
+ # @since 2.1.0
43
+ REPLACE_ONE = :replace_one.freeze
44
+
45
+ # The update many model constant.
46
+ #
47
+ # @since 2.1.0
48
+ UPDATE_MANY = :update_many.freeze
49
+
50
+ # The update one model constant.
51
+ #
52
+ # @since 2.1.0
53
+ UPDATE_ONE = :update_one.freeze
54
+
55
+ # Proc to transform delete many ops.
56
+ #
57
+ # @since 2.1.0
58
+ DELETE_MANY_TRANSFORM = ->(doc){
59
+ { Operation::Q => doc[:filter], Operation::LIMIT => 0 }
60
+ }
61
+
62
+ # Proc to transform delete one ops.
63
+ #
64
+ # @since 2.1.0
65
+ DELETE_ONE_TRANSFORM = ->(doc){
66
+ { Operation::Q => doc[:filter], Operation::LIMIT => 1 }
67
+ }
68
+
69
+ # Proc to transform insert one ops.
70
+ #
71
+ # @since 2.1.0
72
+ INSERT_ONE_TRANSFORM = ->(doc){
73
+ doc
74
+ }
75
+
76
+ # Proc to transfor replace one ops.
77
+ #
78
+ # @since 2.1.0
79
+ REPLACE_ONE_TRANSFORM = ->(doc){
80
+ {
81
+ Operation::Q => doc[:filter],
82
+ Operation::U => doc[:replacement],
83
+ Operation::MULTI => false,
84
+ Operation::UPSERT => doc.fetch(:upsert, false)
85
+ }
86
+ }
87
+
88
+ # Proc to transform update many ops.
89
+ #
90
+ # @since 2.1.0
91
+ UPDATE_MANY_TRANSFORM = ->(doc){
92
+ {
93
+ Operation::Q => doc[:filter],
94
+ Operation::U => doc[:update],
95
+ Operation::MULTI => true,
96
+ Operation::UPSERT => doc.fetch(:upsert, false)
97
+ }
98
+ }
99
+
100
+ # Proc to transform update one ops.
101
+ #
102
+ # @since 2.1.0
103
+ UPDATE_ONE_TRANSFORM = ->(doc){
104
+ {
105
+ Operation::Q => doc[:filter],
106
+ Operation::U => doc[:update],
107
+ Operation::MULTI => false,
108
+ Operation::UPSERT => doc.fetch(:upsert, false)
109
+ }
110
+ }
111
+
112
+ # Document mappers from the bulk api input into proper commands.
113
+ #
114
+ # @since 2.1.0
115
+ MAPPERS = {
116
+ DELETE_MANY => DELETE_MANY_TRANSFORM,
117
+ DELETE_ONE => DELETE_ONE_TRANSFORM,
118
+ INSERT_ONE => INSERT_ONE_TRANSFORM,
119
+ REPLACE_ONE => REPLACE_ONE_TRANSFORM,
120
+ UPDATE_MANY => UPDATE_MANY_TRANSFORM,
121
+ UPDATE_ONE => UPDATE_ONE_TRANSFORM
122
+ }.freeze
123
+
124
+ private
125
+
126
+ def transform(name, document)
127
+ validate(name, document)
128
+ MAPPERS[name].call(document)
129
+ end
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,52 @@
1
+ # Copyright (C) 2015 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
+ class BulkWrite
17
+
18
+ # Combines groups of bulk write operations in no order.
19
+ #
20
+ # @api private
21
+ #
22
+ # @since 2.1.0
23
+ class UnorderedCombiner
24
+ include Transformable
25
+ include Validatable
26
+ include Combineable
27
+
28
+ # Combine the requests in order.
29
+ #
30
+ # @api private
31
+ #
32
+ # @example Combine the requests.
33
+ # combiner.combine
34
+ #
35
+ # @return [ Array<Hash> ] The combined requests.
36
+ #
37
+ # @since 2.1.0
38
+ def combine
39
+ combine_requests({}).map do |name, ops|
40
+ { name => ops }
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ def add(operations, name, document)
47
+ (operations[name] ||= []).push(transform(name, document))
48
+ operations
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,62 @@
1
+ # Copyright (C) 2015 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
+ class BulkWrite
17
+
18
+ # Defines behaviour around validations.
19
+ #
20
+ # @api private
21
+ #
22
+ # @since 2.1.0
23
+ module Validatable
24
+
25
+ # Validate the document.
26
+ #
27
+ # @api private
28
+ #
29
+ # @example Validate the document.
30
+ # validatable.validate(:insert_one, { _id: 0 })
31
+ #
32
+ # @param [ Symbol ] name The operation name.
33
+ # @param [ Hash, BSON::Document ] document The document.
34
+ #
35
+ # @raise [ InvalidBulkOperation ] If not valid.
36
+ #
37
+ # @return [ Hash, BSON::Document ] The document.
38
+ #
39
+ # @since 2.1.0
40
+ def validate(name, document)
41
+ validate_operation(name)
42
+ validate_document(name, document)
43
+ end
44
+
45
+ private
46
+
47
+ def validate_document(name, document)
48
+ if document.respond_to?(:keys) || document.respond_to?(:data)
49
+ document
50
+ else
51
+ raise Error::InvalidBulkOperation.new(name, document)
52
+ end
53
+ end
54
+
55
+ def validate_operation(name)
56
+ unless Transformable::MAPPERS.key?(name)
57
+ raise Error::InvalidBulkOperationType.new(name)
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -12,42 +12,183 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- require 'mongo/bulk_write/bulk_writable'
16
- require 'mongo/bulk_write/ordered_bulk_write'
17
- require 'mongo/bulk_write/unordered_bulk_write'
18
15
  require 'mongo/bulk_write/result'
16
+ require 'mongo/bulk_write/transformable'
17
+ require 'mongo/bulk_write/validatable'
18
+ require 'mongo/bulk_write/combineable'
19
+ require 'mongo/bulk_write/ordered_combiner'
20
+ require 'mongo/bulk_write/unordered_combiner'
21
+ require 'mongo/bulk_write/result_combiner'
19
22
 
20
23
  module Mongo
21
- module BulkWrite
22
- extend self
24
+ class BulkWrite
25
+ extend Forwardable
26
+ include Retryable
23
27
 
24
- # Get a bulk write object either of type ordered or unordered.
28
+ # @return [ Mongo::Collection ] collection The collection.
29
+ attr_reader :collection
30
+
31
+ # @return [ Array<Hash, BSON::Document> ] requests The requests.
32
+ attr_reader :requests
33
+
34
+ # @return [ Hash, BSON::Document ] options The options.
35
+ attr_reader :options
36
+
37
+ # Delegate various methods to the collection.
38
+ def_delegators :@collection, :database, :cluster, :next_primary
39
+
40
+ def_delegators :database, :client
41
+
42
+ # Execute the bulk write operation.
43
+ #
44
+ # @example Execute the bulk write.
45
+ # bulk_write.execute
46
+ #
47
+ # @return [ Mongo::BulkWrite::Result ] The result.
48
+ #
49
+ # @since 2.1.0
50
+ def execute
51
+ operation_id = Monitoring.next_operation_id
52
+ result_combiner = ResultCombiner.new
53
+ write_with_retry do
54
+ server = next_primary
55
+ operations.each do |operation|
56
+ execute_operation(
57
+ operation.keys.first,
58
+ operation.values.first,
59
+ server,
60
+ operation_id,
61
+ result_combiner
62
+ )
63
+ end
64
+ end
65
+ result_combiner.result
66
+ end
67
+
68
+ # Create the new bulk write operation.
69
+ #
70
+ # @api private
71
+ #
72
+ # @example Create an ordered bulk write.
73
+ # Mongo::BulkWrite.new(collection, [{ insert_one: { _id: 1 }}])
74
+ #
75
+ # @example Create an unordered bulk write.
76
+ # Mongo::BulkWrite.new(collection, [{ insert_one: { _id: 1 }}], ordered: false)
77
+ #
78
+ # @example Create an ordered mixed bulk write.
79
+ # Mongo::BulkWrite.new(
80
+ # collection,
81
+ # [
82
+ # { insert_one: { _id: 1 }},
83
+ # { update_one: { filter: { _id: 0 }, update: { '$set' => { name: 'test' }}}},
84
+ # { delete_one: { filter: { _id: 2 }}}
85
+ # ]
86
+ # )
87
+ #
88
+ # @param [ Mongo::Collection ] collection The collection.
89
+ # @param [ Array<Hash, BSON::Document> ] requests The requests.
90
+ # @param [ Hash, BSON::Document ] options The options.
91
+ #
92
+ # @since 2.1.0
93
+ def initialize(collection, requests, options = {})
94
+ @collection = collection
95
+ @requests = requests
96
+ @options = options || {}
97
+ end
98
+
99
+ # Is the bulk write ordered?
100
+ #
101
+ # @api private
25
102
  #
26
- # @example Get a bulk write object.
27
- # Mongo::BulkWrite.get(collection, operations, ordered: true)
103
+ # @example Is the bulk write ordered?
104
+ # bulk_write.ordered?
28
105
  #
29
- # @param [ Collection ] collection The collection on which the operations
30
- # will be executed.
106
+ # @return [ true, false ] If the bulk write is ordered.
31
107
  #
32
- # @param [ Array<Hash> ] operations The operations to execute.
108
+ # @since 2.1.0
109
+ def ordered?
110
+ @ordered ||= options.fetch(:ordered, true)
111
+ end
112
+
113
+ # Get the write concern for the bulk write.
33
114
  #
34
- # @param [ Hash ] options The options for the bulk write object.
115
+ # @api private
35
116
  #
36
- # @option options [ true, false ] :ordered Whether the operations
37
- # should be executed in order.
38
- # @option options [ Hash ] :write_concern The write concern options.
39
- # Can be :w => Integer, :fsync => Boolean, :j => Boolean.
117
+ # @example Get the write concern.
118
+ # bulk_write.write_concern
40
119
  #
41
- # @return [ OrderedBulkWrite, UnorderedBulkWrite ] The appropriate bulk
42
- # write object.
120
+ # @return [ WriteConcern ] The write concern.
43
121
  #
44
- # @since 2.0.0
45
- def get(collection, operations, options)
46
- if options.fetch(:ordered, true)
47
- OrderedBulkWrite.new(collection, operations, options)
122
+ # @since 2.1.0
123
+ def write_concern
124
+ @write_concern ||= options[:write_concern] ?
125
+ WriteConcern.get(options[:write_concern]) : collection.write_concern
126
+ end
127
+
128
+ private
129
+
130
+ def base_spec(operation_id)
131
+ {
132
+ :db_name => database.name,
133
+ :coll_name => collection.name,
134
+ :write_concern => write_concern,
135
+ :ordered => ordered?,
136
+ :operation_id => operation_id,
137
+ :bypass_document_validation => !!options[:bypass_document_validation],
138
+ :options => options,
139
+ :id_generator => client.options[:id_generator]
140
+ }
141
+ end
142
+
143
+ def execute_operation(name, values, server, operation_id, combiner)
144
+ begin
145
+ if values.size > server.max_write_batch_size
146
+ split_execute(name, values, server, operation_id, combiner)
147
+ else
148
+ combiner.combine!(send(name, values, server, operation_id), values.size)
149
+ end
150
+ rescue Error::MaxBSONSize, Error::MaxMessageSize => e
151
+ raise e if values.size <= 1
152
+ split_execute(name, values, server, operation_id, combiner)
153
+ end
154
+ end
155
+
156
+ def operations
157
+ if ordered?
158
+ OrderedCombiner.new(requests).combine
48
159
  else
49
- UnorderedBulkWrite.new(collection, operations, options)
160
+ UnorderedCombiner.new(requests).combine
50
161
  end
51
162
  end
163
+
164
+ def split_execute(name, values, server, operation_id, combiner)
165
+ execute_operation(name, values.shift(values.size / 2), server, operation_id, combiner)
166
+ execute_operation(name, values, server, operation_id, combiner)
167
+ end
168
+
169
+ def delete(documents, server, operation_id)
170
+ Operation::Write::Bulk::Delete.new(
171
+ base_spec(operation_id).merge(:deletes => documents)
172
+ ).execute(server.context)
173
+ end
174
+
175
+ alias :delete_one :delete
176
+ alias :delete_many :delete
177
+
178
+ def insert_one(documents, server, operation_id)
179
+ Operation::Write::Bulk::Insert.new(
180
+ base_spec(operation_id).merge(:documents => documents)
181
+ ).execute(server.context)
182
+ end
183
+
184
+ def update(documents, server, operation_id)
185
+ Operation::Write::Bulk::Update.new(
186
+ base_spec(operation_id).merge(:updates => documents)
187
+ ).execute(server.context)
188
+ end
189
+
190
+ alias :replace_one :update
191
+ alias :update_one :update
192
+ alias :update_many :update
52
193
  end
53
194
  end
data/lib/mongo/client.rb CHANGED
@@ -20,6 +20,7 @@ module Mongo
20
20
  # @since 2.0.0
21
21
  class Client
22
22
  extend Forwardable
23
+ include Loggable
23
24
 
24
25
  # The options that do not affect the behaviour of a cluster and its
25
26
  # subcomponents.
@@ -27,6 +28,42 @@ module Mongo
27
28
  # @since 2.1.0
28
29
  CRUD_OPTIONS = [ :database, :read, :write ].freeze
29
30
 
31
+ # Valid client options.
32
+ #
33
+ # @since 2.1.2
34
+ VALID_OPTIONS = [
35
+ :auth_mech,
36
+ :auth_mech_properties,
37
+ :auth_source,
38
+ :connect,
39
+ :connect_timeout,
40
+ :database,
41
+ :heartbeat_frequency,
42
+ :id_generator,
43
+ :local_threshold,
44
+ :logger,
45
+ :max_pool_size,
46
+ :max_read_retries,
47
+ :min_pool_size,
48
+ :monitoring,
49
+ :password,
50
+ :read,
51
+ :read_retry_interval,
52
+ :replica_set,
53
+ :server_selection_timeout,
54
+ :socket_timeout,
55
+ :ssl,
56
+ :ssl_ca_cert,
57
+ :ssl_cert,
58
+ :ssl_key,
59
+ :ssl_key_pass_phrase,
60
+ :ssl_verify,
61
+ :truncate_logs,
62
+ :user,
63
+ :wait_queue_timeout,
64
+ :write
65
+ ].freeze
66
+
30
67
  # @return [ Mongo::Cluster ] cluster The cluster of servers for the client.
31
68
  attr_reader :cluster
32
69
 
@@ -36,8 +73,8 @@ module Mongo
36
73
  # @return [ Hash ] options The configuration options.
37
74
  attr_reader :options
38
75
 
39
- # Delegate command execution to the current database.
40
- def_delegators :@database, :command
76
+ # Delegate command and collections execution to the current database.
77
+ def_delegators :@database, :command, :collections
41
78
 
42
79
  # Delegate subscription to monitoring.
43
80
  def_delegators :@monitoring, :subscribe, :unsubscribe
@@ -122,11 +159,9 @@ module Mongo
122
159
  # attempt a connection.
123
160
  # @option options [ Hash ] :read The read preference options. They consist of a
124
161
  # mode specified as a symbol, an array of hashes known as tag_sets,
125
- # and two timing options: local_threshold and server_selection_timeout.
162
+ # and local_threshold.
126
163
  # :mode can be one of :secondary, :secondary_preferred, :primary,
127
164
  # :primary_preferred, :nearest.
128
- # @option options [ Array<Hash, String> ] :roles The list of roles for the
129
- # user.
130
165
  # @option options [ Symbol ] :replica_set The name of the replica set to
131
166
  # connect to. Servers not in this replica set will be ignored.
132
167
  # @option options [ true, false ] :ssl Whether to use SSL.
@@ -145,17 +180,26 @@ module Mongo
145
180
  # execute operations on a socket.
146
181
  # @option options [ String ] :user The user name.
147
182
  # @option options [ Hash ] :write The write concern options. Can be :w =>
148
- # Integer, :fsync => Boolean, :j => Boolean.
183
+ # Integer|String, :fsync => Boolean, :j => Boolean.
149
184
  # @option options [ true, false ] :monitoring Initializes a client without
150
185
  # any default monitoring if false is provided.
186
+ # @option options [ Logger ] :logger A custom logger if desired.
187
+ # @option options [ true, false ] :truncate_logs Whether to truncate the
188
+ # logs at the default 250 characters.
189
+ # @option options [ Integer ] :max_read_retries The maximum number of read
190
+ # retries on mongos query failures.
191
+ # @option options [ Float ] :read_retry_interval The interval, in seconds,
192
+ # in which reads on a mongos are retried.
193
+ # @option options [ Object ] :id_generator A custom object to generate ids
194
+ # for documents. Must respond to #generate.
151
195
  #
152
196
  # @since 2.0.0
153
- def initialize(addresses_or_uri, options = {})
197
+ def initialize(addresses_or_uri, options = Options::Redacted.new)
154
198
  @monitoring = Monitoring.new(options)
155
199
  if addresses_or_uri.is_a?(::String)
156
- create_from_uri(addresses_or_uri, options)
200
+ create_from_uri(addresses_or_uri, validate_options(options))
157
201
  else
158
- create_from_addresses(addresses_or_uri, options)
202
+ create_from_addresses(addresses_or_uri, validate_options(options))
159
203
  end
160
204
  yield(self) if block_given?
161
205
  end
@@ -182,7 +226,7 @@ module Mongo
182
226
  #
183
227
  # @since 2.0.0
184
228
  def read_preference
185
- @read_preference ||= ServerSelector.get(options[:read] || {}, options)
229
+ @read_preference ||= ServerSelector.get(Options::Redacted.new(options[:read] || {}).merge(options))
186
230
  end
187
231
 
188
232
  # Use the database with the provided name. This will switch the current
@@ -212,9 +256,9 @@ module Mongo
212
256
  # @return [ Mongo::Client ] A new client instance.
213
257
  #
214
258
  # @since 2.0.0
215
- def with(new_options = {})
259
+ def with(new_options = Options::Redacted.new)
216
260
  clone.tap do |client|
217
- opts = new_options || {}
261
+ opts = validate_options(new_options)
218
262
  client.options.update(opts)
219
263
  Database.create(client)
220
264
  # We can't use the same cluster if some options that would affect it
@@ -271,7 +315,7 @@ module Mongo
271
315
  #
272
316
  # @since 2.0.5
273
317
  def database_names
274
- list_databases.collect{ |info| info['name'] }
318
+ list_databases.collect{ |info| info[Database::NAME] }
275
319
  end
276
320
 
277
321
  # Get info for each database.
@@ -283,19 +327,19 @@ module Mongo
283
327
  #
284
328
  # @since 2.0.5
285
329
  def list_databases
286
- use(Database::ADMIN).command(listDatabases: 1).first['databases']
330
+ use(Database::ADMIN).command(listDatabases: 1).first[Database::DATABASES]
287
331
  end
288
332
 
289
333
  private
290
334
 
291
- def create_from_addresses(addresses, opts = {})
335
+ def create_from_addresses(addresses, opts = Options::Redacted.new)
292
336
  @options = Database::DEFAULT_OPTIONS.merge(opts).freeze
293
337
  @cluster = Cluster.new(addresses, @monitoring, options)
294
338
  @database = Database.new(self, options[:database], options)
295
339
  end
296
340
 
297
- def create_from_uri(connection_string, opts = {})
298
- uri = URI.new(connection_string)
341
+ def create_from_uri(connection_string, opts = Options::Redacted.new)
342
+ uri = URI.new(connection_string, opts)
299
343
  @options = Database::DEFAULT_OPTIONS.merge(uri.client_options.merge(opts)).freeze
300
344
  @cluster = Cluster.new(uri.servers, @monitoring, options)
301
345
  @database = Database.new(self, options[:database], options)
@@ -303,6 +347,7 @@ module Mongo
303
347
 
304
348
  def initialize_copy(original)
305
349
  @options = original.options.dup
350
+ @monitoring = Monitoring.new(@options)
306
351
  @database = nil
307
352
  @read_preference = nil
308
353
  @write_concern = nil
@@ -310,11 +355,23 @@ module Mongo
310
355
 
311
356
  def cluster_modifying?(new_options)
312
357
  cluster_options = new_options.reject do |name|
313
- CRUD_OPTIONS.include?(name)
358
+ CRUD_OPTIONS.include?(name.to_sym)
314
359
  end
315
360
  cluster_options.any? do |name, value|
316
361
  options[name] != value
317
362
  end
318
363
  end
364
+
365
+ def validate_options(opts = Options::Redacted.new)
366
+ return Options::Redacted.new unless opts
367
+ Options::Redacted.new(opts.select do |o|
368
+ if VALID_OPTIONS.include?(o)
369
+ true
370
+ else
371
+ log_warn("Unsupported client option '#{o}'. It will be ignored.")
372
+ false
373
+ end
374
+ end)
375
+ end
319
376
  end
320
377
  end
@@ -61,7 +61,7 @@ module Mongo
61
61
  def elect_primary(description, servers)
62
62
  if description.replica_set_name == replica_set_name
63
63
  unless detect_stale_primary!(description)
64
- log_debug([ "Server #{description.address.to_s} elected as primary in #{replica_set_name}." ])
64
+ log_debug("Server #{description.address.to_s} elected as primary in #{replica_set_name}.")
65
65
  servers.each do |server|
66
66
  if server.primary? && server.address != description.address
67
67
  server.description.unknown!
@@ -70,9 +70,10 @@ module Mongo
70
70
  update_max_election_id(description)
71
71
  end
72
72
  else
73
- log_warn([
74
- "Server #{description.address.to_s} in incorrect replica set: #{description.replica_set_name}."
75
- ])
73
+ log_warn(
74
+ "Server #{description.address.to_s} has incorrect replica set name: " +
75
+ "'#{description.replica_set_name}'. The current replica set name is '#{replica_set_name}'."
76
+ )
76
77
  end
77
78
  self
78
79
  end
@@ -157,8 +158,9 @@ module Mongo
157
158
  def remove_hosts?(description)
158
159
  !description.config.empty? &&
159
160
  (description.primary? ||
160
- description.hosts.empty? ||
161
- !member_of_this_set?(description))
161
+ description.me_mismatch? ||
162
+ description.hosts.empty? ||
163
+ !member_of_this_set?(description))
162
164
  end
163
165
 
164
166
  # Whether a specific server in the cluster can be removed, given a description.
@@ -55,7 +55,7 @@ module Mongo
55
55
  # @return [ Sharded, ReplicaSet ] The new topology.
56
56
  def elect_primary(description, servers)
57
57
  if description.mongos?
58
- log_debug([ "Mongos #{description.address.to_s} discovered." ])
58
+ log_debug("Mongos #{description.address.to_s} discovered.")
59
59
  Sharded.new(options)
60
60
  else
61
61
  initialize_replica_set(description, servers)
@@ -204,7 +204,10 @@ module Mongo
204
204
  private
205
205
 
206
206
  def initialize_replica_set(description, servers)
207
- log_debug([ "Server #{description.address.to_s} discovered as primary." ])
207
+ log_debug(
208
+ "Server #{description.address.to_s} discovered as primary in replica set: " +
209
+ "'#{description.replica_set_name}'. Changing topology to replica set."
210
+ )
208
211
  servers.each do |server|
209
212
  if server.standalone? && server.address != description.address
210
213
  server.description.unknown!