mongo 2.0.6 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (317) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +5 -2
  3. data/lib/mongo/address/ipv4.rb +6 -1
  4. data/lib/mongo/address/unix.rb +2 -2
  5. data/lib/mongo/address.rb +18 -10
  6. data/lib/mongo/auth/cr/conversation.rb +1 -1
  7. data/lib/mongo/auth/ldap/conversation.rb +7 -3
  8. data/lib/mongo/auth/scram/conversation.rb +9 -3
  9. data/lib/mongo/auth/user/view.rb +23 -2
  10. data/lib/mongo/auth/x509/conversation.rb +1 -1
  11. data/lib/mongo/bulk_write/combineable.rb +51 -0
  12. data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
  13. data/lib/mongo/bulk_write/result.rb +191 -0
  14. data/lib/mongo/bulk_write/result_combiner.rb +117 -0
  15. data/lib/mongo/bulk_write/transformable.rb +132 -0
  16. data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
  17. data/lib/mongo/bulk_write/validatable.rb +62 -0
  18. data/lib/mongo/bulk_write.rb +159 -23
  19. data/lib/mongo/client.rb +52 -16
  20. data/lib/mongo/cluster/topology/replica_set.rb +27 -9
  21. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  22. data/lib/mongo/cluster/topology/unknown.rb +5 -2
  23. data/lib/mongo/cluster.rb +42 -7
  24. data/lib/mongo/collection/view/aggregation.rb +48 -9
  25. data/lib/mongo/collection/view/immutable.rb +6 -6
  26. data/lib/mongo/collection/view/iterable.rb +18 -4
  27. data/lib/mongo/collection/view/map_reduce.rb +58 -17
  28. data/lib/mongo/collection/view/readable.rb +173 -42
  29. data/lib/mongo/collection/view/writable.rb +37 -23
  30. data/lib/mongo/collection/view.rb +2 -2
  31. data/lib/mongo/collection.rb +370 -33
  32. data/lib/mongo/cursor.rb +15 -3
  33. data/lib/mongo/database/view.rb +5 -4
  34. data/lib/mongo/database.rb +14 -4
  35. data/lib/mongo/dbref.rb +113 -0
  36. data/lib/mongo/error/closed_stream.rb +34 -0
  37. data/lib/mongo/error/extra_file_chunk.rb +34 -0
  38. data/lib/mongo/error/{invalid_uri_option.rb → file_not_found.rb} +11 -12
  39. data/lib/mongo/error/invalid_file.rb +2 -2
  40. data/lib/mongo/error/invalid_file_revision.rb +37 -0
  41. data/lib/mongo/error/invalid_uri.rb +5 -4
  42. data/lib/mongo/error/missing_file_chunk.rb +38 -0
  43. data/lib/mongo/error/operation_failure.rb +1 -1
  44. data/lib/mongo/error/parser.rb +1 -1
  45. data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
  46. data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
  47. data/lib/mongo/error.rb +13 -2
  48. data/lib/mongo/event/description_changed.rb +1 -1
  49. data/lib/mongo/grid/file/chunk.rb +6 -6
  50. data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
  51. data/lib/mongo/grid/file.rb +13 -10
  52. data/lib/mongo/grid/fs_bucket.rb +448 -0
  53. data/lib/mongo/grid/stream/read.rb +208 -0
  54. data/lib/mongo/grid/stream/write.rb +187 -0
  55. data/lib/mongo/grid/stream.rb +64 -0
  56. data/lib/mongo/grid.rb +2 -1
  57. data/lib/mongo/index/view.rb +3 -3
  58. data/lib/mongo/index.rb +5 -0
  59. data/lib/mongo/loggable.rb +34 -57
  60. data/lib/mongo/logger.rb +16 -78
  61. data/lib/mongo/monitoring/command_log_subscriber.rb +112 -0
  62. data/lib/mongo/monitoring/event/command_failed.rb +96 -0
  63. data/lib/mongo/monitoring/event/command_started.rb +89 -0
  64. data/lib/mongo/monitoring/event/command_succeeded.rb +118 -0
  65. data/lib/mongo/monitoring/event/secure.rb +58 -0
  66. data/lib/mongo/monitoring/event.rb +18 -0
  67. data/lib/mongo/monitoring/publishable.rb +106 -0
  68. data/lib/mongo/monitoring.rb +195 -0
  69. data/lib/mongo/operation/{aggregate.rb → commands/aggregate.rb} +3 -41
  70. data/lib/mongo/operation/commands/collections_info/result.rb +39 -0
  71. data/lib/mongo/operation/commands/collections_info.rb +68 -0
  72. data/lib/mongo/operation/{command.rb → commands/command.rb} +2 -18
  73. data/lib/mongo/operation/commands/indexes.rb +70 -0
  74. data/lib/mongo/operation/commands/list_collections/result.rb +112 -0
  75. data/lib/mongo/operation/commands/list_collections.rb +54 -0
  76. data/lib/mongo/operation/commands/list_indexes/result.rb +116 -0
  77. data/lib/mongo/operation/commands/list_indexes.rb +56 -0
  78. data/lib/mongo/operation/{map_reduce → commands/map_reduce}/result.rb +1 -1
  79. data/lib/mongo/operation/{map_reduce.rb → commands/map_reduce.rb} +3 -41
  80. data/lib/mongo/operation/commands/parallel_scan/result.rb +72 -0
  81. data/lib/mongo/operation/commands/parallel_scan.rb +56 -0
  82. data/lib/mongo/operation/commands/user_query.rb +69 -0
  83. data/lib/mongo/{bulk_write/ordered_bulk_write.rb → operation/commands/users_info/result.rb} +18 -30
  84. data/lib/mongo/operation/commands/users_info.rb +53 -0
  85. data/lib/mongo/operation/commands.rb +24 -0
  86. data/lib/mongo/operation/executable.rb +4 -68
  87. data/lib/mongo/operation/kill_cursors.rb +3 -3
  88. data/lib/mongo/operation/read/get_more.rb +2 -22
  89. data/lib/mongo/{bulk_write/unordered_bulk_write.rb → operation/read/query/result.rb} +20 -26
  90. data/lib/mongo/operation/read/query.rb +4 -21
  91. data/lib/mongo/operation/read.rb +0 -4
  92. data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
  93. data/lib/mongo/operation/result.rb +13 -1
  94. data/lib/mongo/operation/specifiable.rb +42 -0
  95. data/lib/mongo/operation/write/bulk/bulkable.rb +82 -0
  96. data/lib/mongo/operation/write/bulk/delete/result.rb +74 -0
  97. data/lib/mongo/operation/write/bulk/delete.rb +71 -0
  98. data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
  99. data/lib/mongo/operation/write/bulk/insert.rb +96 -0
  100. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
  101. data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
  102. data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
  103. data/lib/mongo/operation/write/bulk/update.rb +81 -0
  104. data/lib/mongo/operation/write/bulk.rb +6 -3
  105. data/lib/mongo/operation/write/command/create_index.rb +0 -1
  106. data/lib/mongo/operation/write/command/create_user.rb +0 -1
  107. data/lib/mongo/operation/write/command/delete.rb +0 -1
  108. data/lib/mongo/operation/write/command/drop_index.rb +0 -1
  109. data/lib/mongo/operation/write/command/insert.rb +0 -1
  110. data/lib/mongo/operation/write/command/remove_user.rb +0 -1
  111. data/lib/mongo/operation/write/command/update.rb +0 -1
  112. data/lib/mongo/operation/write/command/update_user.rb +0 -1
  113. data/lib/mongo/operation/write/command/writable.rb +13 -18
  114. data/lib/mongo/operation/write/create_index.rb +4 -27
  115. data/lib/mongo/operation/write/create_user.rb +4 -30
  116. data/lib/mongo/operation/write/delete.rb +6 -29
  117. data/lib/mongo/operation/write/drop_index.rb +3 -3
  118. data/lib/mongo/operation/write/gle.rb +48 -0
  119. data/lib/mongo/operation/write/idable.rb +5 -0
  120. data/lib/mongo/operation/write/insert.rb +2 -24
  121. data/lib/mongo/operation/write/remove_user.rb +4 -27
  122. data/lib/mongo/operation/write/update.rb +13 -36
  123. data/lib/mongo/operation/write/update_user.rb +4 -30
  124. data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
  125. data/lib/mongo/operation/write.rb +2 -0
  126. data/lib/mongo/operation.rb +32 -4
  127. data/lib/mongo/options/mapper.rb +4 -2
  128. data/lib/mongo/options/redacted.rb +156 -0
  129. data/lib/mongo/options.rb +1 -0
  130. data/lib/mongo/protocol/delete.rb +75 -15
  131. data/lib/mongo/protocol/get_more.rb +65 -13
  132. data/lib/mongo/protocol/insert.rb +85 -13
  133. data/lib/mongo/protocol/kill_cursors.rb +59 -14
  134. data/lib/mongo/protocol/message.rb +12 -12
  135. data/lib/mongo/protocol/query.rb +163 -37
  136. data/lib/mongo/protocol/reply.rb +103 -0
  137. data/lib/mongo/protocol/serializers.rb +1 -1
  138. data/lib/mongo/protocol/update.rb +82 -14
  139. data/lib/mongo/retryable.rb +83 -0
  140. data/lib/mongo/server/connectable.rb +21 -25
  141. data/lib/mongo/server/connection.rb +75 -4
  142. data/lib/mongo/server/connection_pool/queue.rb +15 -0
  143. data/lib/mongo/server/connection_pool.rb +12 -0
  144. data/lib/mongo/server/description/features.rb +2 -1
  145. data/lib/mongo/server/description.rb +52 -1
  146. data/lib/mongo/server/monitor/connection.rb +26 -2
  147. data/lib/mongo/server/monitor.rb +19 -3
  148. data/lib/mongo/server.rb +39 -5
  149. data/lib/mongo/server_selector/selectable.rb +40 -31
  150. data/lib/mongo/server_selector.rb +19 -10
  151. data/lib/mongo/socket/ssl.rb +28 -16
  152. data/lib/mongo/socket/tcp.rb +3 -3
  153. data/lib/mongo/socket/unix.rb +5 -8
  154. data/lib/mongo/socket.rb +11 -4
  155. data/lib/mongo/uri.rb +248 -137
  156. data/lib/mongo/version.rb +1 -1
  157. data/lib/mongo.rb +5 -3
  158. data/spec/mongo/address/unix_spec.rb +1 -1
  159. data/spec/mongo/address_spec.rb +25 -0
  160. data/spec/mongo/auth/cr_spec.rb +9 -1
  161. data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
  162. data/spec/mongo/auth/ldap_spec.rb +9 -1
  163. data/spec/mongo/auth/scram_spec.rb +9 -1
  164. data/spec/mongo/auth/user/view_spec.rb +26 -1
  165. data/spec/mongo/auth/x509_spec.rb +9 -1
  166. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +271 -0
  167. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
  168. data/spec/mongo/bulk_write_spec.rb +428 -0
  169. data/spec/mongo/client_spec.rb +167 -17
  170. data/spec/mongo/cluster/topology/replica_set_spec.rb +18 -9
  171. data/spec/mongo/cluster/topology/sharded_spec.rb +11 -3
  172. data/spec/mongo/cluster/topology/single_spec.rb +12 -4
  173. data/spec/mongo/cluster_spec.rb +55 -10
  174. data/spec/mongo/collection/view/aggregation_spec.rb +188 -1
  175. data/spec/mongo/collection/view/explainable_spec.rb +1 -1
  176. data/spec/mongo/collection/view/immutable_spec.rb +103 -0
  177. data/spec/mongo/collection/view/map_reduce_spec.rb +99 -4
  178. data/spec/mongo/collection/view/readable_spec.rb +238 -6
  179. data/spec/mongo/collection/view/writable_spec.rb +4 -4
  180. data/spec/mongo/collection/view_spec.rb +459 -71
  181. data/spec/mongo/collection_spec.rb +1291 -9
  182. data/spec/mongo/command_monitoring_spec.rb +51 -0
  183. data/spec/mongo/connection_string_spec.rb +115 -0
  184. data/spec/mongo/crud_spec.rb +2 -2
  185. data/spec/mongo/cursor_spec.rb +3 -3
  186. data/spec/mongo/database_spec.rb +47 -11
  187. data/spec/mongo/dbref_spec.rb +149 -0
  188. data/spec/mongo/grid/file/chunk_spec.rb +5 -5
  189. data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
  190. data/spec/mongo/grid/file_spec.rb +8 -8
  191. data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
  192. data/spec/mongo/grid/stream/read_spec.rb +275 -0
  193. data/spec/mongo/grid/stream/write_spec.rb +440 -0
  194. data/spec/mongo/grid/stream_spec.rb +48 -0
  195. data/spec/mongo/gridfs_spec.rb +50 -0
  196. data/spec/mongo/logger_spec.rb +0 -40
  197. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
  198. data/spec/mongo/monitoring/event/command_started_spec.rb +26 -0
  199. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +26 -0
  200. data/spec/mongo/monitoring/event/secure_spec.rb +57 -0
  201. data/spec/mongo/monitoring_spec.rb +168 -0
  202. data/spec/mongo/operation/commands/aggregate_spec.rb +69 -0
  203. data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
  204. data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +0 -18
  205. data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
  206. data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +1 -19
  207. data/spec/mongo/operation/kill_cursors_spec.rb +1 -17
  208. data/spec/mongo/operation/read/get_more_spec.rb +0 -16
  209. data/spec/mongo/operation/read/query_spec.rb +19 -16
  210. data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
  211. data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +18 -29
  212. data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +3 -14
  213. data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +8 -19
  214. data/spec/mongo/operation/write/command/delete_spec.rb +0 -16
  215. data/spec/mongo/operation/write/command/insert_spec.rb +0 -16
  216. data/spec/mongo/operation/write/command/update_spec.rb +0 -16
  217. data/spec/mongo/operation/write/delete_spec.rb +4 -4
  218. data/spec/mongo/operation/write/insert_spec.rb +2 -13
  219. data/spec/mongo/operation/write/update_spec.rb +7 -7
  220. data/spec/mongo/options/redacted_spec.rb +350 -0
  221. data/spec/mongo/protocol/kill_cursors_spec.rb +5 -3
  222. data/spec/mongo/protocol/query_spec.rb +15 -30
  223. data/spec/mongo/retryable_spec.rb +147 -0
  224. data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
  225. data/spec/mongo/server/connection_pool_spec.rb +50 -6
  226. data/spec/mongo/server/connection_spec.rb +49 -4
  227. data/spec/mongo/server/description_spec.rb +49 -3
  228. data/spec/mongo/server/monitor_spec.rb +51 -0
  229. data/spec/mongo/server_discovery_and_monitoring_spec.rb +32 -59
  230. data/spec/mongo/server_selection_rtt_spec.rb +37 -57
  231. data/spec/mongo/server_selection_spec.rb +19 -9
  232. data/spec/mongo/server_selector/nearest_spec.rb +35 -27
  233. data/spec/mongo/server_selector/primary_preferred_spec.rb +32 -30
  234. data/spec/mongo/server_selector/primary_spec.rb +21 -14
  235. data/spec/mongo/server_selector/secondary_preferred_spec.rb +28 -26
  236. data/spec/mongo/server_selector/secondary_spec.rb +24 -22
  237. data/spec/mongo/server_selector_spec.rb +87 -24
  238. data/spec/mongo/server_spec.rb +94 -8
  239. data/spec/mongo/socket/ssl_spec.rb +123 -13
  240. data/spec/mongo/socket/unix_spec.rb +52 -0
  241. data/spec/mongo/uri_spec.rb +295 -67
  242. data/spec/spec_helper.rb +40 -24
  243. data/spec/support/authorization.rb +23 -9
  244. data/spec/support/certificates/client.pem +4 -4
  245. data/spec/support/command_monitoring/bulkWrite.yml +73 -0
  246. data/spec/support/command_monitoring/command.yml +42 -0
  247. data/spec/support/command_monitoring/deleteMany.yml +55 -0
  248. data/spec/support/command_monitoring/deleteOne.yml +55 -0
  249. data/spec/support/command_monitoring/find.yml +219 -0
  250. data/spec/support/command_monitoring/insertMany.yml +81 -0
  251. data/spec/support/command_monitoring/insertOne.yml +51 -0
  252. data/spec/support/command_monitoring/updateMany.yml +67 -0
  253. data/spec/support/command_monitoring/updateOne.yml +95 -0
  254. data/spec/support/command_monitoring.rb +365 -0
  255. data/spec/support/connection_string.rb +228 -0
  256. data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
  257. data/spec/support/connection_string_tests/valid-auth.yml +256 -0
  258. data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
  259. data/spec/support/connection_string_tests/valid-options.yml +30 -0
  260. data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
  261. data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
  262. data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
  263. data/spec/support/crud/read.rb +22 -19
  264. data/spec/support/crud/write.rb +58 -27
  265. data/spec/support/crud.rb +10 -2
  266. data/spec/support/gridfs.rb +637 -0
  267. data/spec/support/gridfs_tests/delete.yml +157 -0
  268. data/spec/support/gridfs_tests/download.yml +210 -0
  269. data/spec/support/gridfs_tests/download_by_name.yml +113 -0
  270. data/spec/support/gridfs_tests/upload.yml +158 -0
  271. data/spec/support/matchers.rb +1 -1
  272. data/spec/support/sdam/rs/equal_electionids.yml +44 -0
  273. data/spec/support/sdam/rs/new_primary_new_electionid.yml +95 -0
  274. data/spec/support/sdam/rs/null_election_id.yml +144 -0
  275. data/spec/support/sdam/rs/primary_disconnect_electionid.yml +124 -0
  276. data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
  277. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
  278. data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
  279. data/spec/support/sdam/sharded/mongos_disconnect.yml +104 -0
  280. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  281. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  282. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  283. data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
  284. data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
  285. data/spec/support/sdam/single/not_ok_response.yml +0 -1
  286. data/spec/support/server_discovery_and_monitoring.rb +22 -3
  287. data/spec/support/server_selection.rb +3 -1
  288. data/spec/support/shared/bulk_write.rb +218 -22
  289. data/spec/support/shared/server_selector.rb +80 -14
  290. data.tar.gz.sig +0 -0
  291. metadata +188 -59
  292. metadata.gz.sig +0 -0
  293. data/lib/mongo/bulk_write/bulk_writable.rb +0 -196
  294. data/lib/mongo/bulk_write/deletable.rb +0 -56
  295. data/lib/mongo/bulk_write/insertable.rb +0 -48
  296. data/lib/mongo/bulk_write/replacable.rb +0 -57
  297. data/lib/mongo/bulk_write/updatable.rb +0 -68
  298. data/lib/mongo/grid/fs.rb +0 -149
  299. data/lib/mongo/operation/list_collections/result.rb +0 -114
  300. data/lib/mongo/operation/list_indexes/result.rb +0 -118
  301. data/lib/mongo/operation/read/collections_info.rb +0 -68
  302. data/lib/mongo/operation/read/indexes.rb +0 -69
  303. data/lib/mongo/operation/read/list_collections.rb +0 -76
  304. data/lib/mongo/operation/read/list_indexes.rb +0 -78
  305. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
  306. data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
  307. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
  308. data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
  309. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
  310. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -162
  311. data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
  312. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
  313. data/spec/mongo/bulk/bulk_write_spec.rb +0 -262
  314. data/spec/mongo/grid/fs_spec.rb +0 -160
  315. data/spec/mongo/loggable_spec.rb +0 -63
  316. data/spec/mongo/operation/aggregate_spec.rb +0 -127
  317. /data/lib/mongo/operation/{aggregate → commands/aggregate}/result.rb +0 -0
@@ -2,20 +2,36 @@ require 'spec_helper'
2
2
 
3
3
  describe Mongo::Server::ConnectionPool do
4
4
 
5
+ let(:options) do
6
+ TEST_OPTIONS.merge(max_pool_size: 2)
7
+ end
8
+
5
9
  let(:address) do
6
10
  Mongo::Address.new('127.0.0.1:27017')
7
11
  end
8
12
 
13
+ let(:monitoring) do
14
+ Mongo::Monitoring.new
15
+ end
16
+
17
+ let(:listeners) do
18
+ Mongo::Event::Listeners.new
19
+ end
20
+
9
21
  describe '#checkin' do
10
22
 
11
23
  let(:server) do
12
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, ssl: SSL)
24
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, options)
13
25
  end
14
26
 
15
27
  let!(:pool) do
16
28
  described_class.get(server)
17
29
  end
18
30
 
31
+ after do
32
+ server.disconnect!
33
+ end
34
+
19
35
  context 'when a connection is checked out on the thread' do
20
36
 
21
37
  let!(:connection) do
@@ -39,7 +55,7 @@ describe Mongo::Server::ConnectionPool do
39
55
  describe '#checkout' do
40
56
 
41
57
  let(:server) do
42
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, ssl: SSL)
58
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, options)
43
59
  end
44
60
 
45
61
  let!(:pool) do
@@ -71,7 +87,7 @@ describe Mongo::Server::ConnectionPool do
71
87
  context 'when a connection is checked out on a different thread' do
72
88
 
73
89
  let!(:connection) do
74
- Thread.new { pool.checkout }.value
90
+ Thread.new { pool.checkout }.join
75
91
  end
76
92
 
77
93
  it 'returns a new connection' do
@@ -84,16 +100,40 @@ describe Mongo::Server::ConnectionPool do
84
100
  end
85
101
  end
86
102
 
103
+ describe '#disconnect!' do
104
+
105
+ let(:server) do
106
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, options)
107
+ end
108
+
109
+ let!(:pool) do
110
+ described_class.get(server)
111
+ end
112
+
113
+ after do
114
+ server.disconnect!
115
+ end
116
+
117
+ it 'disconnects the queue' do
118
+ expect(pool.send(:queue)).to receive(:disconnect!).twice.and_call_original
119
+ pool.disconnect!
120
+ end
121
+ end
122
+
87
123
  describe '.get' do
88
124
 
89
125
  let(:server) do
90
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, ssl: SSL)
126
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, options)
91
127
  end
92
128
 
93
129
  let!(:pool) do
94
130
  described_class.get(server)
95
131
  end
96
132
 
133
+ after do
134
+ server.disconnect!
135
+ end
136
+
97
137
  it 'returns the pool for the server' do
98
138
  expect(pool).to eql(described_class.get(server))
99
139
  end
@@ -102,13 +142,17 @@ describe Mongo::Server::ConnectionPool do
102
142
  describe '#inspect' do
103
143
 
104
144
  let(:server) do
105
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, ssl: SSL)
145
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, options)
106
146
  end
107
147
 
108
148
  let!(:pool) do
109
149
  described_class.get(server)
110
150
  end
111
151
 
152
+ after do
153
+ server.disconnect!
154
+ end
155
+
112
156
  it 'includes the object id' do
113
157
  expect(pool.inspect).to include(pool.object_id.to_s)
114
158
  end
@@ -121,7 +165,7 @@ describe Mongo::Server::ConnectionPool do
121
165
  describe '#with_connection' do
122
166
 
123
167
  let(:server) do
124
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, ssl: SSL)
168
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, options)
125
169
  end
126
170
 
127
171
  let!(:pool) do
@@ -6,8 +6,53 @@ describe Mongo::Server::Connection do
6
6
  Mongo::Address.new(DEFAULT_ADDRESS)
7
7
  end
8
8
 
9
+ let(:monitoring) do
10
+ Mongo::Monitoring.new
11
+ end
12
+
13
+ let(:listeners) do
14
+ Mongo::Event::Listeners.new
15
+ end
16
+
9
17
  let(:server) do
10
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, ssl: SSL)
18
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
19
+ end
20
+
21
+ after do
22
+ server.disconnect!
23
+ end
24
+
25
+ describe '#connectable?' do
26
+
27
+ # context 'when the connection is connectable' do
28
+
29
+ # let(:connection) do
30
+ # described_class.new(server)
31
+ # end
32
+
33
+ # it 'returns true' do
34
+ # expect(connection).to be_connectable
35
+ # end
36
+ # end
37
+
38
+ context 'when the connection is not connectable' do
39
+
40
+ let(:bad_address) do
41
+ Mongo::Address.new('127.0.0.1:666')
42
+ end
43
+
44
+ let(:bad_server) do
45
+ Mongo::Server.new(bad_address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
46
+ end
47
+
48
+ let(:connection) do
49
+ described_class.new(bad_server)
50
+ end
51
+
52
+ it 'returns false' do
53
+ expect(connection).to_not be_connectable
54
+ end
55
+ end
11
56
  end
12
57
 
13
58
  describe '#connect!' do
@@ -164,7 +209,7 @@ describe Mongo::Server::Connection do
164
209
  end
165
210
 
166
211
  after do
167
- authorized_collection.find.delete_many
212
+ authorized_collection.delete_many
168
213
  end
169
214
 
170
215
  it 'it dispatchs the message to the socket' do
@@ -187,7 +232,7 @@ describe Mongo::Server::Connection do
187
232
  end
188
233
 
189
234
  after do
190
- authorized_collection.find.delete_many
235
+ authorized_collection.delete_many
191
236
  end
192
237
 
193
238
  it 'it dispatchs the message to the socket' do
@@ -225,7 +270,7 @@ describe Mongo::Server::Connection do
225
270
  end
226
271
 
227
272
  after do
228
- authorized_collection.find.delete_many
273
+ authorized_collection.delete_many
229
274
  end
230
275
 
231
276
  it 'disconnects the connection' do
@@ -31,6 +31,10 @@ describe Mongo::Server::Description do
31
31
  Mongo::Address.new('127.0.0.1:27017')
32
32
  end
33
33
 
34
+ let(:monitoring) do
35
+ Mongo::Monitoring.new
36
+ end
37
+
34
38
  describe '#arbiter?' do
35
39
 
36
40
  context 'when the server is an arbiter' do
@@ -583,7 +587,7 @@ describe Mongo::Server::Description do
583
587
  end
584
588
 
585
589
  let(:server) do
586
- Mongo::Server.new(address, double('cluster'), listeners)
590
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners)
587
591
  end
588
592
 
589
593
  let(:description) do
@@ -604,7 +608,7 @@ describe Mongo::Server::Description do
604
608
  end
605
609
 
606
610
  let(:server) do
607
- Mongo::Server.new(other_address, double('cluster'), listeners)
611
+ Mongo::Server.new(other_address, double('cluster'), monitoring, listeners)
608
612
  end
609
613
 
610
614
  it 'returns false' do
@@ -613,6 +617,48 @@ describe Mongo::Server::Description do
613
617
  end
614
618
  end
615
619
 
620
+ describe '#me_mismatch?' do
621
+
622
+ let(:description) do
623
+ described_class.new(address, config)
624
+ end
625
+
626
+ context 'when the server address matches the me field' do
627
+
628
+ let(:config) do
629
+ replica.merge('me' => address.to_s)
630
+ end
631
+
632
+ it 'returns false' do
633
+ expect(description.me_mismatch?).to be(false)
634
+ end
635
+ end
636
+
637
+ context 'when the server address does not match the me field' do
638
+
639
+ let(:config) do
640
+ replica.merge('me' => 'localhost:27020')
641
+ end
642
+
643
+ it 'returns true' do
644
+ expect(description.me_mismatch?).to be(true)
645
+ end
646
+ end
647
+
648
+ context 'when there is no me field' do
649
+
650
+ let(:config) do
651
+ replica.tap do |r|
652
+ r.delete('me')
653
+ end
654
+ end
655
+
656
+ it 'returns false' do
657
+ expect(description.me_mismatch?).to be(false)
658
+ end
659
+ end
660
+ end
661
+
616
662
  describe '#lists_server?' do
617
663
 
618
664
  let(:description) do
@@ -628,7 +674,7 @@ describe Mongo::Server::Description do
628
674
  end
629
675
 
630
676
  let(:server) do
631
- Mongo::Server.new(server_address, double('cluster'), listeners)
677
+ Mongo::Server.new(server_address, double('cluster'), monitoring, listeners)
632
678
  end
633
679
 
634
680
  context 'when the server is included in the description hosts list' do
@@ -141,4 +141,55 @@ describe Mongo::Server::Monitor do
141
141
  expect(monitor.description).to_not be_nil
142
142
  end
143
143
  end
144
+
145
+ describe '#restart!' do
146
+
147
+ let(:monitor) do
148
+ described_class.new(address, listeners, TEST_OPTIONS)
149
+ end
150
+
151
+ let!(:thread) do
152
+ monitor.run!
153
+ end
154
+
155
+ context 'when the monitor is already running' do
156
+
157
+ it 'does not create a new thread' do
158
+ expect(monitor.restart!).to be(thread)
159
+ end
160
+ end
161
+
162
+ context 'when the monitor is not already running' do
163
+
164
+ before do
165
+ monitor.stop!
166
+ sleep(1)
167
+ end
168
+
169
+ it 'creates a new thread' do
170
+ expect(monitor.restart!).not_to be(thread)
171
+ end
172
+ end
173
+ end
174
+
175
+ describe '#stop' do
176
+
177
+ let(:monitor) do
178
+ described_class.new(address, listeners, TEST_OPTIONS)
179
+ end
180
+
181
+ let!(:thread) do
182
+ monitor.run!
183
+ end
184
+
185
+ before do
186
+ expect(monitor.connection).to receive(:disconnect!).and_call_original
187
+ monitor.stop!
188
+ sleep(1)
189
+ end
190
+
191
+ it 'kills the monitor thread' do
192
+ expect(thread.stop?).to be(true)
193
+ end
194
+ end
144
195
  end
@@ -11,39 +11,26 @@ describe 'Server Discovery and Monitoring' do
11
11
 
12
12
  before(:all) do
13
13
 
14
- # We monkey-patch the address, so that looking up the spec's hostname does
15
- # not throw an error.
16
- #
17
- # @since 2.0.0
18
- class Mongo::Address
19
- private
20
-
21
- def family(host)
22
- fam = host == 'localhost' ? ::Socket::AF_INET : ::Socket::AF_UNSPEC
23
- ::Socket.getaddrinfo(host, nil, fam, ::Socket::SOCK_STREAM).first[4]
24
- rescue SocketError
25
- end
26
- end
14
+ module Mongo
15
+ # We monkey-patch the server here, so the monitors do not run and no
16
+ # real TCP connection is attempted. Thus we can control the server
17
+ # descriptions per-phase.
18
+ #
19
+ # @since 2.0.0
20
+ class Server
21
+
22
+ alias :original_initialize :initialize
23
+ def initialize(address, cluster, monitoring, event_listeners, options = {})
24
+ @address = address
25
+ @cluster = cluster
26
+ @monitoring = monitoring
27
+ @options = options.freeze
28
+ @monitor = Monitor.new(address, event_listeners, options)
29
+ end
27
30
 
28
- # We monkey-patch the server here, so the monitors do not run and no
29
- # real TCP connection is attempted. Thus we can control the server
30
- # descriptions per-phase.
31
- #
32
- # @since 2.0.0
33
- class Mongo::Server
34
-
35
- # The constructor keeps the same API, but does not instantiate a
36
- # monitor and run it.
37
- def initialize(address, cluster, event_listeners, options = {})
38
- @address = address
39
- @cluster = cluster
40
- @options = options.freeze
41
- @monitor = Monitor.new(address, event_listeners, options)
31
+ alias :original_disconnect! :disconnect!
32
+ def disconnect!; true; end
42
33
  end
43
-
44
- # Disconnect simply needs to return true since we have no monitor and
45
- # no connection.
46
- def disconnect!; true; end
47
34
  end
48
35
 
49
36
  # Client is set as an instance variable inside the scope of the spec to
@@ -53,36 +40,17 @@ describe 'Server Discovery and Monitoring' do
53
40
  end
54
41
 
55
42
  after(:all) do
43
+ @client.close
56
44
 
57
45
  # Return the server implementation to its original for the other
58
46
  # tests in the suite.
59
- class Mongo::Server
60
-
61
- # Returns the constructor to its original implementation.
62
- def initialize(address, cluster, event_listeners, options = {})
63
- @address = address
64
- @cluster = cluster
65
- @options = options.freeze
66
- @monitor = Monitor.new(address, event_listeners, options)
67
- @monitor.scan!
68
- @monitor.run!
69
- end
70
-
71
- # Returns disconnect! to its original implementation.
72
- def disconnect!
73
- context.with_connection do |connection|
74
- connection.disconnect!
75
- end
76
- @monitor.stop! and true
77
- end
78
- end
79
-
80
- class Mongo::Address
81
- private
47
+ module Mongo
48
+ class Server
49
+ alias :initialize :original_initialize
50
+ remove_method(:original_initialize)
82
51
 
83
- def family(host)
84
- fam = host == 'localhost' ? ::Socket::AF_INET : ::Socket::AF_UNSPEC
85
- ::Socket.getaddrinfo(host, nil, fam, ::Socket::SOCK_STREAM).first[4]
52
+ alias :disconnect! :original_disconnect!
53
+ remove_method(:original_disconnect!)
86
54
  end
87
55
  end
88
56
  end
@@ -96,8 +64,13 @@ describe 'Server Discovery and Monitoring' do
96
64
  # For each response in the phase, we need to change that server's
97
65
  # description.
98
66
  server = find_server(@client, response.address)
99
- server = Mongo::Server.new(Mongo::Address.new(response.address), @client.cluster,
100
- @client.cluster.send(:event_listeners), @client.cluster.options) unless server
67
+ server = Mongo::Server.new(
68
+ Mongo::Address.new(response.address),
69
+ @client.cluster,
70
+ @client.instance_variable_get(:@monitoring),
71
+ @client.cluster.send(:event_listeners),
72
+ @client.cluster.options
73
+ ) unless server
101
74
  monitor = server.instance_variable_get(:@monitor)
102
75
  description = monitor.inspector.run(server.description, response.ismaster, 0.5)
103
76
  monitor.instance_variable_set(:@description, description)
@@ -8,80 +8,60 @@ describe 'Server Selection moving average round trip time calculation' do
8
8
 
9
9
  spec = Mongo::ServerSelection::RTT::Spec.new(file)
10
10
 
11
- before(:all) do
12
-
13
- module Mongo
14
- class Server
15
-
16
- # We monkey-patch the monitor here, so the last average rtt can be controlled.
17
- # We keep the API of Monitor#initialize but add in an extra option and set the last rtt.
18
- #
19
- # @since 2.0.0
20
- class Monitor
21
-
22
- def initialize(address, listeners, options = {})
23
- @description = Mongo::Server::Description.new(address, {})
24
- @inspector = Mongo::Server::Description::Inspector.new(listeners)
25
- @options = options.freeze
26
- @connection = Connection.new(address, options)
27
- @last_round_trip_time = options[:avg_rtt_ms]
28
- @mutex = Mutex.new
29
- end
11
+ context(spec.description) do
30
12
 
31
- private
13
+ before(:all) do
32
14
 
33
- # We monkey patch this method to use an instance variable instead of calculating time elapsed.
15
+ module Mongo
16
+ class Server
17
+
18
+ # We monkey-patch the monitor here, so the last average rtt can be controlled.
19
+ # We keep the API of Monitor#initialize but add in an extra option and set the last rtt.
34
20
  #
35
21
  # @since 2.0.0
36
- def average_round_trip_time(start)
37
- new_rtt = @new_rtt_ms
38
- RTT_WEIGHT_FACTOR * new_rtt + (1 - RTT_WEIGHT_FACTOR) * (@last_round_trip_time || new_rtt)
22
+ class Monitor
23
+
24
+ alias :original_initialize :initialize
25
+ def initialize(address, listeners, options = {})
26
+ @description = Mongo::Server::Description.new(address, {})
27
+ @inspector = Mongo::Server::Description::Inspector.new(listeners)
28
+ @options = options.freeze
29
+ @connection = Connection.new(address, options)
30
+ @last_round_trip_time = options[:avg_rtt_ms]
31
+ @mutex = Mutex.new
32
+ end
33
+
34
+ # We monkey patch this method to use an instance variable instead of calculating time elapsed.
35
+ #
36
+ # @since 2.0.0
37
+ alias :original_average_round_trip_time :average_round_trip_time
38
+ def average_round_trip_time(start)
39
+ new_rtt = @new_rtt_ms
40
+ RTT_WEIGHT_FACTOR * new_rtt + (1 - RTT_WEIGHT_FACTOR) * (@last_round_trip_time || new_rtt)
41
+ end
39
42
  end
40
43
  end
41
44
  end
42
45
  end
43
- end
44
46
 
45
- after(:all) do
47
+ after(:all) do
46
48
 
47
- module Mongo
48
- class Server
49
+ module Mongo
50
+ class Server
49
51
 
50
- # Return the monitor implementation to its original for the other
51
- # tests in the suite.
52
- class Monitor
52
+ # Return the monitor implementation to its original for the other
53
+ # tests in the suite.
54
+ class Monitor
53
55
 
54
- # Create the new server monitor.
55
- #
56
- # @example Create the server monitor.
57
- # Mongo::Server::Monitor.new(address, listeners)
58
- #
59
- # @param [ Address ] address The address to monitor.
60
- # @param [ Event::Listeners ] listeners The event listeners.
61
- # @param [ Hash ] options The options.
62
- #
63
- # @since 2.0.0
64
- def initialize(address, listeners, options = {})
65
- @description = Description.new(address, {})
66
- @inspector = Description::Inspector.new(listeners)
67
- @options = options.freeze
68
- @connection = Connection.new(address, options)
69
- @last_round_trip_time = nil
70
- @mutex = Mutex.new
71
- end
72
-
73
- private
56
+ alias :initialize :original_initialize
57
+ remove_method(:original_initialize)
74
58
 
75
- def average_round_trip_time(start)
76
- new_rtt = Time.now - start
77
- RTT_WEIGHT_FACTOR * new_rtt + (1 - RTT_WEIGHT_FACTOR) * (@last_round_trip_time || new_rtt)
59
+ alias :average_round_trip_time :original_average_round_trip_time
60
+ remove_method(:original_average_round_trip_time)
78
61
  end
79
62
  end
80
63
  end
81
64
  end
82
- end
83
-
84
- context(spec.description) do
85
65
 
86
66
  let(:address) do
87
67
  Mongo::Address.new('127.0.0.1:27017')
@@ -14,6 +14,14 @@ describe 'Server Selection' do
14
14
  spec.type.new({})
15
15
  end
16
16
 
17
+ let(:monitoring) do
18
+ Mongo::Monitoring.new
19
+ end
20
+
21
+ let(:listeners) do
22
+ Mongo::Event::Listeners.new
23
+ end
24
+
17
25
  let(:cluster) do
18
26
  double('cluster').tap do |c|
19
27
  allow(c).to receive(:topology).and_return(topology)
@@ -26,11 +34,12 @@ describe 'Server Selection' do
26
34
  let(:candidate_servers) do
27
35
  spec.candidate_servers.collect do |server|
28
36
  address = Mongo::Address.new(server['address'])
29
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, TEST_OPTIONS).tap do |s|
37
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS).tap do |s|
30
38
  allow(s).to receive(:average_round_trip_time).and_return(server['avg_rtt_ms'])
31
39
  allow(s).to receive(:tags).and_return(server['tags'])
32
40
  allow(s).to receive(:secondary?).and_return(server['type'] == 'RSSecondary')
33
41
  allow(s).to receive(:primary?).and_return(server['type'] == 'RSPrimary')
42
+ allow(s).to receive(:connectable?).and_return(true)
34
43
  end
35
44
  end
36
45
  end
@@ -38,17 +47,18 @@ describe 'Server Selection' do
38
47
  let(:in_latency_window) do
39
48
  spec.in_latency_window.collect do |server|
40
49
  address = Mongo::Address.new(server['address'])
41
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, TEST_OPTIONS).tap do |s|
50
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS).tap do |s|
42
51
  allow(s).to receive(:average_round_trip_time).and_return(server['avg_rtt_ms'])
43
52
  allow(s).to receive(:tags).and_return(server['tags'])
53
+ allow(s).to receive(:connectable?).and_return(true)
44
54
  end
45
55
  end
46
56
  end
47
57
 
48
58
  let(:server_selector) do
49
- Mongo::ServerSelector.get({ :mode => spec.read_preference['mode'],
50
- :tag_sets => spec.read_preference['tag_sets'] },
51
- :server_selection_timeout => 1)
59
+ Mongo::ServerSelector.get(:mode => spec.read_preference['mode'],
60
+ :tag_sets => spec.read_preference['tag_sets'],
61
+ :server_selection_timeout => 1)
52
62
  end
53
63
 
54
64
  before do
@@ -57,18 +67,18 @@ describe 'Server Selection' do
57
67
  end
58
68
 
59
69
  context 'Valid read preference and matching server available', if: spec.server_available? do
60
-
70
+
61
71
  it 'Finds all suitable servers in the latency window', if: spec.replica_set? do
62
- expect(server_selector.send(:select, cluster.servers)).to eq(in_latency_window)
72
+ expect(server_selector.send(:select, cluster.servers)).to eq(in_latency_window)
63
73
  end
64
-
74
+
65
75
  it 'Finds the most suitable server in the latency window' do
66
76
  expect(in_latency_window).to include(server_selector.select_server(cluster))
67
77
  end
68
78
  end
69
79
 
70
80
  context 'No matching server available', if: !spec.server_available? do
71
-
81
+
72
82
  it 'Raises exception' do
73
83
  expect do
74
84
  server_selector.select_server(cluster)