mongo 2.2.7 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (266) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/LICENSE +1 -1
  5. data/README.md +1 -1
  6. data/Rakefile +1 -1
  7. data/lib/mongo.rb +1 -1
  8. data/lib/mongo/address.rb +1 -1
  9. data/lib/mongo/address/ipv4.rb +1 -1
  10. data/lib/mongo/address/ipv6.rb +1 -1
  11. data/lib/mongo/address/unix.rb +1 -1
  12. data/lib/mongo/auth.rb +1 -1
  13. data/lib/mongo/auth/cr.rb +1 -1
  14. data/lib/mongo/auth/ldap.rb +1 -1
  15. data/lib/mongo/auth/roles.rb +1 -1
  16. data/lib/mongo/auth/user.rb +1 -1
  17. data/lib/mongo/auth/user/view.rb +5 -5
  18. data/lib/mongo/auth/x509.rb +1 -1
  19. data/lib/mongo/bson.rb +1 -1
  20. data/lib/mongo/bulk_write.rb +4 -4
  21. data/lib/mongo/bulk_write/combineable.rb +1 -1
  22. data/lib/mongo/bulk_write/ordered_combiner.rb +1 -1
  23. data/lib/mongo/bulk_write/result.rb +1 -1
  24. data/lib/mongo/bulk_write/result_combiner.rb +1 -1
  25. data/lib/mongo/bulk_write/transformable.rb +1 -1
  26. data/lib/mongo/bulk_write/unordered_combiner.rb +1 -1
  27. data/lib/mongo/bulk_write/validatable.rb +1 -1
  28. data/lib/mongo/client.rb +2 -2
  29. data/lib/mongo/cluster.rb +15 -3
  30. data/lib/mongo/cluster/cursor_reaper.rb +174 -0
  31. data/lib/mongo/cluster/topology.rb +1 -1
  32. data/lib/mongo/cluster/topology/replica_set.rb +1 -1
  33. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  34. data/lib/mongo/cluster/topology/single.rb +1 -1
  35. data/lib/mongo/cluster/topology/unknown.rb +1 -1
  36. data/lib/mongo/collection.rb +5 -4
  37. data/lib/mongo/collection/view.rb +4 -4
  38. data/lib/mongo/collection/view/aggregation.rb +2 -2
  39. data/lib/mongo/collection/view/builder.rb +1 -1
  40. data/lib/mongo/collection/view/builder/aggregation.rb +1 -1
  41. data/lib/mongo/collection/view/builder/find_command.rb +1 -1
  42. data/lib/mongo/collection/view/builder/flags.rb +1 -1
  43. data/lib/mongo/collection/view/builder/map_reduce.rb +1 -1
  44. data/lib/mongo/collection/view/builder/modifiers.rb +1 -1
  45. data/lib/mongo/collection/view/builder/op_query.rb +1 -1
  46. data/lib/mongo/collection/view/explainable.rb +1 -1
  47. data/lib/mongo/collection/view/immutable.rb +1 -1
  48. data/lib/mongo/collection/view/iterable.rb +2 -2
  49. data/lib/mongo/collection/view/map_reduce.rb +3 -3
  50. data/lib/mongo/collection/view/readable.rb +23 -6
  51. data/lib/mongo/collection/view/writable.rb +3 -3
  52. data/lib/mongo/cursor.rb +50 -7
  53. data/lib/mongo/cursor/builder.rb +1 -1
  54. data/lib/mongo/cursor/builder/get_more_command.rb +1 -1
  55. data/lib/mongo/cursor/builder/kill_cursors_command.rb +29 -1
  56. data/lib/mongo/cursor/builder/op_get_more.rb +1 -1
  57. data/lib/mongo/cursor/builder/op_kill_cursors.rb +29 -1
  58. data/lib/mongo/database.rb +4 -4
  59. data/lib/mongo/database/view.rb +2 -2
  60. data/lib/mongo/dbref.rb +4 -3
  61. data/lib/mongo/error.rb +1 -1
  62. data/lib/mongo/error/bulk_write_error.rb +1 -1
  63. data/lib/mongo/error/closed_stream.rb +1 -1
  64. data/lib/mongo/error/extra_file_chunk.rb +1 -1
  65. data/lib/mongo/error/file_not_found.rb +1 -1
  66. data/lib/mongo/error/invalid_bulk_operation.rb +1 -1
  67. data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -1
  68. data/lib/mongo/error/invalid_collection_name.rb +1 -1
  69. data/lib/mongo/error/invalid_database_name.rb +1 -1
  70. data/lib/mongo/error/invalid_document.rb +1 -1
  71. data/lib/mongo/error/invalid_file.rb +1 -1
  72. data/lib/mongo/error/invalid_file_revision.rb +1 -1
  73. data/lib/mongo/error/invalid_nonce.rb +1 -1
  74. data/lib/mongo/error/invalid_replacement_document.rb +1 -1
  75. data/lib/mongo/error/invalid_server_preference.rb +1 -1
  76. data/lib/mongo/error/invalid_signature.rb +1 -1
  77. data/lib/mongo/error/invalid_update_document.rb +1 -1
  78. data/lib/mongo/error/invalid_uri.rb +1 -1
  79. data/lib/mongo/error/invalid_write_concern.rb +1 -1
  80. data/lib/mongo/error/max_bson_size.rb +1 -1
  81. data/lib/mongo/error/max_message_size.rb +1 -1
  82. data/lib/mongo/error/missing_file_chunk.rb +1 -1
  83. data/lib/mongo/error/multi_index_drop.rb +1 -1
  84. data/lib/mongo/error/need_primary_server.rb +1 -1
  85. data/lib/mongo/error/no_server_available.rb +4 -2
  86. data/lib/mongo/error/operation_failure.rb +1 -1
  87. data/lib/mongo/error/parser.rb +1 -1
  88. data/lib/mongo/error/socket_error.rb +1 -1
  89. data/lib/mongo/error/socket_timeout_error.rb +1 -1
  90. data/lib/mongo/error/unchangeable_collection_option.rb +1 -1
  91. data/lib/mongo/error/unexpected_chunk_length.rb +1 -1
  92. data/lib/mongo/error/unexpected_response.rb +1 -1
  93. data/lib/mongo/error/unsupported_features.rb +1 -1
  94. data/lib/mongo/event.rb +1 -1
  95. data/lib/mongo/event/description_changed.rb +1 -1
  96. data/lib/mongo/event/publisher.rb +1 -1
  97. data/lib/mongo/event/subscriber.rb +1 -1
  98. data/lib/mongo/grid.rb +1 -1
  99. data/lib/mongo/grid/file.rb +6 -2
  100. data/lib/mongo/grid/file/chunk.rb +6 -4
  101. data/lib/mongo/grid/file/info.rb +7 -3
  102. data/lib/mongo/grid/fs_bucket.rb +12 -6
  103. data/lib/mongo/grid/stream.rb +1 -1
  104. data/lib/mongo/grid/stream/read.rb +2 -4
  105. data/lib/mongo/grid/stream/write.rb +4 -3
  106. data/lib/mongo/index.rb +1 -1
  107. data/lib/mongo/index/view.rb +5 -4
  108. data/lib/mongo/loggable.rb +1 -1
  109. data/lib/mongo/logger.rb +1 -1
  110. data/lib/mongo/monitoring.rb +1 -1
  111. data/lib/mongo/operation.rb +1 -1
  112. data/lib/mongo/operation/commands.rb +1 -1
  113. data/lib/mongo/operation/commands/aggregate.rb +7 -7
  114. data/lib/mongo/operation/commands/aggregate/result.rb +1 -1
  115. data/lib/mongo/operation/commands/collections_info.rb +10 -9
  116. data/lib/mongo/operation/commands/collections_info/result.rb +1 -1
  117. data/lib/mongo/operation/commands/command.rb +1 -1
  118. data/lib/mongo/operation/commands/indexes.rb +12 -11
  119. data/lib/mongo/operation/commands/list_collections.rb +1 -1
  120. data/lib/mongo/operation/commands/list_collections/result.rb +1 -1
  121. data/lib/mongo/operation/commands/list_indexes.rb +1 -1
  122. data/lib/mongo/operation/commands/list_indexes/result.rb +1 -1
  123. data/lib/mongo/operation/commands/map_reduce.rb +1 -1
  124. data/lib/mongo/operation/commands/map_reduce/result.rb +1 -1
  125. data/lib/mongo/operation/commands/user_query.rb +11 -10
  126. data/lib/mongo/operation/commands/users_info.rb +2 -2
  127. data/lib/mongo/operation/commands/users_info/result.rb +1 -1
  128. data/lib/mongo/operation/executable.rb +8 -7
  129. data/lib/mongo/operation/kill_cursors.rb +2 -2
  130. data/lib/mongo/operation/limited.rb +1 -1
  131. data/lib/mongo/operation/read.rb +1 -1
  132. data/lib/mongo/operation/read/get_more.rb +2 -2
  133. data/lib/mongo/operation/read/query.rb +1 -1
  134. data/lib/mongo/operation/read/query/result.rb +1 -1
  135. data/lib/mongo/operation/read_preference.rb +10 -10
  136. data/lib/mongo/operation/result.rb +1 -1
  137. data/lib/mongo/operation/specifiable.rb +2 -2
  138. data/lib/mongo/operation/write.rb +1 -1
  139. data/lib/mongo/operation/write/bulk.rb +1 -1
  140. data/lib/mongo/operation/write/bulk/bulkable.rb +9 -9
  141. data/lib/mongo/operation/write/bulk/delete.rb +3 -3
  142. data/lib/mongo/operation/write/bulk/delete/result.rb +1 -1
  143. data/lib/mongo/operation/write/bulk/insert.rb +5 -5
  144. data/lib/mongo/operation/write/bulk/insert/result.rb +1 -1
  145. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +1 -1
  146. data/lib/mongo/operation/write/bulk/mergable.rb +1 -1
  147. data/lib/mongo/operation/write/bulk/update.rb +3 -3
  148. data/lib/mongo/operation/write/bulk/update/result.rb +1 -1
  149. data/lib/mongo/operation/write/command.rb +1 -1
  150. data/lib/mongo/operation/write/command/create_index.rb +1 -1
  151. data/lib/mongo/operation/write/command/create_user.rb +1 -1
  152. data/lib/mongo/operation/write/command/delete.rb +1 -1
  153. data/lib/mongo/operation/write/command/drop_index.rb +1 -1
  154. data/lib/mongo/operation/write/command/insert.rb +11 -1
  155. data/lib/mongo/operation/write/command/remove_user.rb +1 -1
  156. data/lib/mongo/operation/write/command/update.rb +1 -1
  157. data/lib/mongo/operation/write/command/update_user.rb +1 -1
  158. data/lib/mongo/operation/write/command/writable.rb +7 -6
  159. data/lib/mongo/operation/write/create_index.rb +1 -1
  160. data/lib/mongo/operation/write/create_user.rb +1 -1
  161. data/lib/mongo/operation/write/delete.rb +1 -1
  162. data/lib/mongo/operation/write/delete/result.rb +1 -1
  163. data/lib/mongo/operation/write/drop_index.rb +5 -5
  164. data/lib/mongo/operation/write/gle.rb +3 -3
  165. data/lib/mongo/operation/write/idable.rb +1 -1
  166. data/lib/mongo/operation/write/insert.rb +5 -5
  167. data/lib/mongo/operation/write/insert/result.rb +1 -1
  168. data/lib/mongo/operation/write/remove_user.rb +1 -1
  169. data/lib/mongo/operation/write/update.rb +1 -1
  170. data/lib/mongo/operation/write/update/result.rb +1 -1
  171. data/lib/mongo/operation/write/update_user.rb +1 -1
  172. data/lib/mongo/operation/write/write_command_enabled.rb +10 -9
  173. data/lib/mongo/protocol/bit_vector.rb +2 -2
  174. data/lib/mongo/protocol/delete.rb +1 -1
  175. data/lib/mongo/protocol/get_more.rb +1 -1
  176. data/lib/mongo/protocol/insert.rb +5 -1
  177. data/lib/mongo/protocol/kill_cursors.rb +1 -1
  178. data/lib/mongo/protocol/message.rb +9 -5
  179. data/lib/mongo/protocol/query.rb +1 -1
  180. data/lib/mongo/protocol/reply.rb +1 -1
  181. data/lib/mongo/protocol/serializers.rb +8 -8
  182. data/lib/mongo/protocol/update.rb +1 -1
  183. data/lib/mongo/server.rb +40 -3
  184. data/lib/mongo/server/connectable.rb +1 -1
  185. data/lib/mongo/server/connection.rb +4 -2
  186. data/lib/mongo/server/connection_pool.rb +1 -1
  187. data/lib/mongo/server/connection_pool/queue.rb +1 -1
  188. data/lib/mongo/server/context.rb +3 -1
  189. data/lib/mongo/server/description.rb +1 -1
  190. data/lib/mongo/server/description/inspector/description_changed.rb +1 -1
  191. data/lib/mongo/server/monitor.rb +1 -1
  192. data/lib/mongo/server_selector.rb +2 -1
  193. data/lib/mongo/server_selector/nearest.rb +1 -1
  194. data/lib/mongo/server_selector/primary.rb +1 -1
  195. data/lib/mongo/server_selector/primary_preferred.rb +1 -1
  196. data/lib/mongo/server_selector/secondary.rb +1 -1
  197. data/lib/mongo/server_selector/secondary_preferred.rb +1 -1
  198. data/lib/mongo/server_selector/selectable.rb +12 -7
  199. data/lib/mongo/socket.rb +1 -1
  200. data/lib/mongo/socket/ssl.rb +1 -1
  201. data/lib/mongo/socket/tcp.rb +1 -1
  202. data/lib/mongo/socket/unix.rb +1 -1
  203. data/lib/mongo/uri.rb +1 -1
  204. data/lib/mongo/version.rb +2 -2
  205. data/lib/mongo/write_concern/acknowledged.rb +1 -1
  206. data/lib/mongo/write_concern/normalizable.rb +1 -1
  207. data/lib/mongo/write_concern/unacknowledged.rb +1 -1
  208. data/mongo.gemspec +1 -1
  209. data/spec/mongo/client_spec.rb +2 -2
  210. data/spec/mongo/cluster/cursor_reaper_spec.rb +216 -0
  211. data/spec/mongo/cluster_spec.rb +36 -5
  212. data/spec/mongo/collection/view/aggregation_spec.rb +2 -2
  213. data/spec/mongo/collection/view/map_reduce_spec.rb +2 -2
  214. data/spec/mongo/collection/view/readable_spec.rb +203 -5
  215. data/spec/mongo/collection/view_spec.rb +10 -0
  216. data/spec/mongo/collection_spec.rb +64 -18
  217. data/spec/mongo/cursor_spec.rb +89 -0
  218. data/spec/mongo/database_spec.rb +79 -13
  219. data/spec/mongo/grid/fs_bucket_spec.rb +119 -1
  220. data/spec/mongo/grid/stream/write_spec.rb +63 -12
  221. data/spec/mongo/index/view_spec.rb +19 -0
  222. data/spec/mongo/operation/commands/aggregate_spec.rb +10 -7
  223. data/spec/mongo/operation/commands/collections_info_spec.rb +1 -1
  224. data/spec/mongo/operation/commands/command_spec.rb +3 -3
  225. data/spec/mongo/operation/commands/indexes_spec.rb +1 -1
  226. data/spec/mongo/operation/commands/map_reduce_spec.rb +2 -2
  227. data/spec/mongo/operation/kill_cursors_spec.rb +10 -19
  228. data/spec/mongo/operation/read/get_more_spec.rb +13 -25
  229. data/spec/mongo/operation/read/query_spec.rb +26 -30
  230. data/spec/mongo/operation/read_preference_spec.rb +11 -11
  231. data/spec/mongo/operation/specifiable_spec.rb +31 -0
  232. data/spec/mongo/operation/write/bulk/delete_spec.rb +16 -18
  233. data/spec/mongo/operation/write/bulk/insert_spec.rb +17 -18
  234. data/spec/mongo/operation/write/bulk/update_spec.rb +20 -25
  235. data/spec/mongo/operation/write/command/delete_spec.rb +26 -32
  236. data/spec/mongo/operation/write/command/insert_spec.rb +24 -31
  237. data/spec/mongo/operation/write/command/update_spec.rb +24 -32
  238. data/spec/mongo/operation/write/create_index_spec.rb +4 -4
  239. data/spec/mongo/operation/write/create_user_spec.rb +3 -3
  240. data/spec/mongo/operation/write/delete_spec.rb +51 -22
  241. data/spec/mongo/operation/write/drop_index_spec.rb +2 -2
  242. data/spec/mongo/operation/write/insert_spec.rb +42 -11
  243. data/spec/mongo/operation/write/remove_user_spec.rb +4 -4
  244. data/spec/mongo/operation/write/update_spec.rb +34 -6
  245. data/spec/mongo/operation/write/update_user_spec.rb +1 -1
  246. data/spec/mongo/server/connection_spec.rb +22 -14
  247. data/spec/mongo/server_selection_spec.rb +2 -2
  248. data/spec/mongo/server_selector/nearest_spec.rb +4 -4
  249. data/spec/mongo/server_selector/primary_preferred_spec.rb +4 -4
  250. data/spec/mongo/server_selector/primary_spec.rb +2 -2
  251. data/spec/mongo/server_selector/secondary_preferred_spec.rb +4 -4
  252. data/spec/mongo/server_selector/secondary_spec.rb +3 -3
  253. data/spec/mongo/server_selector_spec.rb +82 -3
  254. data/spec/mongo/server_spec.rb +0 -20
  255. data/spec/support/command_monitoring.rb +1 -1
  256. data/spec/support/connection_string.rb +1 -1
  257. data/spec/support/crud.rb +1 -1
  258. data/spec/support/crud/read.rb +1 -1
  259. data/spec/support/crud/write.rb +1 -1
  260. data/spec/support/gridfs.rb +1 -1
  261. data/spec/support/shared/server_selector.rb +3 -3
  262. metadata +7 -10
  263. metadata.gz.sig +0 -0
  264. data/lib/csasl/csasl.bundle +0 -0
  265. data/spec/mongo/operation/write/response_spec.rb +0 -85
  266. data/spec/support/shared/operation.rb +0 -100
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -37,7 +37,8 @@ module Mongo
37
37
  #
38
38
  # @since 2.0.0
39
39
  def ==(other)
40
- name == other.name && tag_sets == other.tag_sets
40
+ name == other.name &&
41
+ tag_sets == other.tag_sets
41
42
  end
42
43
 
43
44
  # Initialize the server selector.
@@ -50,9 +51,6 @@ module Mongo
50
51
  #
51
52
  # @param [ Hash ] options The server preference options.
52
53
  #
53
- # @option options [ Integer ] :server_selection_timeout The timeout in seconds
54
- # for selecting a server.
55
- #
56
54
  # @option options [ Integer ] :local_threshold The local threshold boundary for
57
55
  # nearest selection in seconds.
58
56
  #
@@ -76,8 +74,7 @@ module Mongo
76
74
  #
77
75
  # @since 2.2.0
78
76
  def inspect
79
- "#<#{self.class.name}:0x#{object_id} tag_sets=#{tag_sets.inspect} " +
80
- "server_selection_timeout=#{server_selection_timeout} local_threshold=#{local_threshold}>"
77
+ "#<#{self.class.name}:0x#{object_id} tag_sets=#{tag_sets.inspect}>"
81
78
  end
82
79
 
83
80
  # Select a server from eligible candidates.
@@ -91,6 +88,8 @@ module Mongo
91
88
  #
92
89
  # @since 2.0.0
93
90
  def select_server(cluster, ping = true)
91
+ @local_threshold = cluster.options[:local_threshold] || LOCAL_THRESHOLD
92
+ @server_selection_timeout = cluster.options[:server_selection_timeout] || SERVER_SELECTION_TIMEOUT
94
93
  deadline = Time.now + server_selection_timeout
95
94
  while (deadline - Time.now) > 0
96
95
  servers = candidates(cluster)
@@ -117,6 +116,9 @@ module Mongo
117
116
  # @return [ Float ] The timeout.
118
117
  #
119
118
  # @since 2.0.0
119
+ #
120
+ # @deprecated This setting is now taken from the cluster options when a server is selected.
121
+ # Will be removed in 3.0.
120
122
  def server_selection_timeout
121
123
  @server_selection_timeout ||=
122
124
  (options[:server_selection_timeout] || ServerSelector::SERVER_SELECTION_TIMEOUT)
@@ -130,6 +132,9 @@ module Mongo
130
132
  # @return [ Float ] The local threshold.
131
133
  #
132
134
  # @since 2.0.0
135
+ #
136
+ # @deprecated This setting is now taken from the cluster options when a server is selected.
137
+ # Will be removed in 3.0.
133
138
  def local_threshold
134
139
  @local_threshold ||= (options[:local_threshold] || ServerSelector::LOCAL_THRESHOLD)
135
140
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the 'License');
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@ module Mongo
17
17
  # The current version of the driver.
18
18
  #
19
19
  # @since 2.0.0
20
- VERSION = '2.2.7'.freeze
20
+ VERSION = '2.3.0'.freeze
21
21
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the 'License');
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the 'License');
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the 'License');
4
4
  # you may not use this file except in compliance with the License.
@@ -30,5 +30,5 @@ Gem::Specification.new do |s|
30
30
  s.has_rdoc = 'yard'
31
31
  s.bindir = 'bin'
32
32
 
33
- s.add_dependency 'bson', '~> 4.0'
33
+ s.add_dependency 'bson', '~> 4.1'
34
34
  end
@@ -411,8 +411,8 @@ describe Mongo::Client do
411
411
  expect(preference).to be_a(Mongo::ServerSelector::Primary)
412
412
  end
413
413
 
414
- it 'passes the options to the read preference' do
415
- expect(preference.options[:server_selection_timeout]).to eq(2)
414
+ it 'passes the options to the cluster' do
415
+ expect(client.cluster.options[:server_selection_timeout]).to eq(2)
416
416
  end
417
417
  end
418
418
 
@@ -0,0 +1,216 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Cluster::CursorReaper do
4
+
5
+ after do
6
+ authorized_collection.delete_many
7
+ end
8
+
9
+ let(:reaper) do
10
+ described_class.new
11
+ end
12
+
13
+ let(:active_cursors) do
14
+ reaper.instance_variable_get(:@active_cursors)
15
+ end
16
+
17
+ describe '#intialize' do
18
+
19
+ it 'initializes a hash for servers and their kill cursors ops' do
20
+ expect(reaper.instance_variable_get(:@to_kill)).to be_a(Hash)
21
+ end
22
+
23
+ it 'initializes a set for the list of active cursors' do
24
+ expect(reaper.instance_variable_get(:@active_cursors)).to be_a(Set)
25
+ end
26
+ end
27
+
28
+ describe '#run' do
29
+
30
+ it 'starts a thread calling #kill_cursors' do
31
+ reaper.run!
32
+ expect(reaper.instance_variable_get(:@thread)).to be_a(Thread)
33
+ end
34
+
35
+ context 'when run is called more than once' do
36
+
37
+ let!(:reaper_thread) do
38
+ reaper.run!
39
+ reaper.instance_variable_get(:@reaper)
40
+ end
41
+
42
+ it 'only starts a thread once' do
43
+ reaper.run!
44
+ expect(reaper.instance_variable_get(:@reaper)).to be(reaper_thread)
45
+ end
46
+ end
47
+
48
+ context 'when there are ops in the list to execute' do
49
+
50
+ let(:server) { double('server') }
51
+ let(:cursor_id) { 1 }
52
+ let(:op_spec_1) { double('op_spec_1') }
53
+ let(:op_spec_2) { double('op_spec_2') }
54
+ let(:to_kill) { reaper.instance_variable_get(:@to_kill)}
55
+
56
+ before do
57
+ reaper.register_cursor(cursor_id)
58
+ reaper.schedule_kill_cursor(cursor_id, op_spec_1, server)
59
+ reaper.run!
60
+ sleep(Mongo::Cluster::CursorReaper::FREQUENCY + 1)
61
+ end
62
+
63
+ it 'executes the ops in the thread' do
64
+ expect(reaper.instance_variable_get(:@to_kill).size).to eq(0)
65
+ end
66
+ end
67
+ end
68
+
69
+ describe '#schedule_kill_cursor' do
70
+
71
+ let(:server) { double('server') }
72
+ let(:cursor_id) { 1 }
73
+ let(:op_spec_1) { double('op_spec_1') }
74
+ let(:op_spec_2) { double('op_spec_2') }
75
+ let(:to_kill) { reaper.instance_variable_get(:@to_kill)}
76
+
77
+ context 'when the cursor is on the list of active cursors' do
78
+
79
+ before do
80
+ reaper.register_cursor(cursor_id)
81
+ end
82
+
83
+ context 'when there is not a list already for the server' do
84
+
85
+ before do
86
+ reaper.schedule_kill_cursor(cursor_id, op_spec_1, server)
87
+ end
88
+
89
+ it 'initializes the list of op specs to a set' do
90
+ expect(to_kill.keys).to eq([ server ])
91
+ expect(to_kill[server]).to eq(Set.new([op_spec_1]))
92
+ end
93
+ end
94
+
95
+ context 'when there is a list of ops already for the server' do
96
+
97
+ before do
98
+ reaper.schedule_kill_cursor(cursor_id, op_spec_1, server)
99
+ reaper.schedule_kill_cursor(cursor_id, op_spec_2, server)
100
+ end
101
+
102
+ it 'adds the op to the server list' do
103
+ expect(to_kill.keys).to eq([ server ])
104
+ expect(to_kill[server]).to contain_exactly(op_spec_1, op_spec_2)
105
+ end
106
+
107
+ context 'when the same op is added more than once' do
108
+
109
+ before do
110
+ reaper.schedule_kill_cursor(cursor_id, op_spec_2, server)
111
+ end
112
+
113
+ it 'does not allow duplicates ops for a server' do
114
+ expect(to_kill.keys).to eq([ server ])
115
+ expect(to_kill[server]).to contain_exactly(op_spec_1, op_spec_2)
116
+ end
117
+ end
118
+ end
119
+ end
120
+
121
+ context 'when the cursor is not on the list of active cursors' do
122
+
123
+ before do
124
+ reaper.schedule_kill_cursor(cursor_id, op_spec_1, server)
125
+ end
126
+
127
+ it 'does not add the kill cursors op spec to the list' do
128
+ expect(to_kill).to eq({})
129
+ end
130
+ end
131
+ end
132
+
133
+ describe '#register_cursor' do
134
+
135
+ before do
136
+ reaper.register_cursor(cursor_id)
137
+ end
138
+
139
+ context 'when the cursor id is nil' do
140
+
141
+ let(:cursor_id) do
142
+ nil
143
+ end
144
+
145
+ it 'does not register the cursor' do
146
+ expect(active_cursors.size).to be(0)
147
+ end
148
+ end
149
+
150
+ context 'when the cursor id is 0' do
151
+
152
+ let(:cursor_id) do
153
+ 0
154
+ end
155
+
156
+ it 'does not register the cursor' do
157
+ expect(active_cursors.size).to be(0)
158
+ end
159
+ end
160
+
161
+ context 'when the cursor id is a valid id' do
162
+
163
+ let(:cursor_id) do
164
+ 2
165
+ end
166
+
167
+ it 'registers the cursor id as active' do
168
+ expect(active_cursors).to eq(Set.new([2]))
169
+ end
170
+ end
171
+ end
172
+
173
+ describe '#unregister_cursor' do
174
+
175
+ context 'when the cursor id is in the active cursors list' do
176
+
177
+ before do
178
+ reaper.register_cursor(2)
179
+ reaper.unregister_cursor(2)
180
+ end
181
+
182
+ it 'removes the cursor id' do
183
+ expect(active_cursors.size).to eq(0)
184
+ end
185
+ end
186
+ end
187
+
188
+ describe '#stop!' do
189
+
190
+ let(:thread) do
191
+ reaper.run!
192
+ reaper.stop!
193
+ sleep(0.5)
194
+ reaper.instance_variable_get(:@thread)
195
+ end
196
+
197
+ it 'stops the thread from running' do
198
+ expect(thread.alive?).to be(false)
199
+ end
200
+ end
201
+
202
+ describe '#restart!' do
203
+
204
+ let(:thread) do
205
+ reaper.run!
206
+ reaper.stop!
207
+ sleep(0.5)
208
+ reaper.restart!
209
+ reaper.instance_variable_get(:@thread)
210
+ end
211
+
212
+ it 'restarts the thread' do
213
+ expect(thread.alive?).to be(true)
214
+ end
215
+ end
216
+ end
@@ -62,7 +62,7 @@ describe Mongo::Cluster do
62
62
  describe '#inspect' do
63
63
 
64
64
  let(:preference) do
65
- Mongo::ServerSelector.get
65
+ Mongo::ServerSelector.get(ServerSelector::PRIMARY)
66
66
  end
67
67
 
68
68
  it 'displays the cluster seeds and topology' do
@@ -74,7 +74,7 @@ describe Mongo::Cluster do
74
74
  describe '#replica_set_name' do
75
75
 
76
76
  let(:preference) do
77
- Mongo::ServerSelector.get
77
+ Mongo::ServerSelector.get(ServerSelector::PRIMARY)
78
78
  end
79
79
 
80
80
  context 'when the option is provided' do
@@ -107,7 +107,7 @@ describe Mongo::Cluster do
107
107
  describe '#scan!' do
108
108
 
109
109
  let(:preference) do
110
- Mongo::ServerSelector.get
110
+ Mongo::ServerSelector.get(ServerSelector::PRIMARY)
111
111
  end
112
112
 
113
113
  let(:known_servers) do
@@ -223,26 +223,36 @@ describe Mongo::Cluster do
223
223
  cluster.instance_variable_get(:@servers)
224
224
  end
225
225
 
226
+ let(:cursor_reaper) do
227
+ cluster.instance_variable_get(:@cursor_reaper)
228
+ end
229
+
226
230
  before do
227
231
  known_servers.each do |server|
228
232
  expect(server).to receive(:disconnect!).and_call_original
229
233
  end
234
+ expect(cursor_reaper).to receive(:stop!).and_call_original
230
235
  end
231
236
 
232
- it 'disconnects each server and returns true' do
237
+ it 'disconnects each server and the cursor reaper and returns true' do
233
238
  expect(cluster.disconnect!).to be(true)
234
239
  end
235
240
  end
236
241
 
237
242
  describe '#reconnect!' do
238
243
 
244
+ let(:cursor_reaper) do
245
+ cluster.instance_variable_get(:@cursor_reaper)
246
+ end
247
+
239
248
  before do
240
249
  cluster.servers.each do |server|
241
250
  expect(server).to receive(:reconnect!).and_call_original
242
251
  end
252
+ expect(cursor_reaper).to receive(:restart!).and_call_original
243
253
  end
244
254
 
245
- it 'reconnects each server and returns true' do
255
+ it 'reconnects each server and the cursor reaper and returns true' do
246
256
  expect(cluster.reconnect!).to be(true)
247
257
  end
248
258
  end
@@ -432,4 +442,25 @@ describe Mongo::Cluster do
432
442
  end
433
443
  end
434
444
  end
445
+
446
+ describe '#next_primary' do
447
+
448
+ let(:cluster) do
449
+ authorized_client.cluster
450
+ end
451
+
452
+ let(:primary_candidates) do
453
+ if cluster.single?
454
+ cluster.servers
455
+ elsif cluster.sharded?
456
+ cluster.servers
457
+ else
458
+ cluster.servers.select { |s| s.primary? }
459
+ end
460
+ end
461
+
462
+ it 'always returns the primary, mongos, or standalone' do
463
+ expect(primary_candidates).to include(cluster.next_primary)
464
+ end
465
+ end
435
466
  end