mongo 1.1.4 → 1.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. data/Rakefile +50 -69
  2. data/docs/CREDITS.md +4 -0
  3. data/docs/HISTORY.md +9 -0
  4. data/docs/REPLICA_SETS.md +8 -10
  5. data/lib/mongo.rb +3 -1
  6. data/lib/mongo/collection.rb +2 -1
  7. data/lib/mongo/connection.rb +146 -314
  8. data/lib/mongo/db.rb +6 -2
  9. data/lib/mongo/gridfs/grid.rb +1 -1
  10. data/lib/mongo/gridfs/grid_io.rb +29 -5
  11. data/lib/mongo/repl_set_connection.rb +290 -0
  12. data/lib/mongo/util/pool.rb +6 -8
  13. data/lib/mongo/util/uri_parser.rb +71 -0
  14. data/mongo.gemspec +1 -2
  15. data/test/collection_test.rb +9 -7
  16. data/test/connection_test.rb +0 -6
  17. data/test/grid_file_system_test.rb +2 -2
  18. data/test/grid_io_test.rb +33 -1
  19. data/test/grid_test.rb +36 -6
  20. data/test/replica_sets/connect_test.rb +59 -21
  21. data/test/replica_sets/count_test.rb +9 -7
  22. data/test/replica_sets/insert_test.rb +11 -9
  23. data/test/replica_sets/pooled_insert_test.rb +12 -13
  24. data/test/replica_sets/query_secondaries.rb +48 -8
  25. data/test/replica_sets/query_test.rb +10 -9
  26. data/test/replica_sets/replication_ack_test.rb +15 -22
  27. data/test/replica_sets/rs_test_helper.rb +29 -0
  28. data/test/test_helper.rb +13 -20
  29. data/test/threading/{test_threading_large_pool.rb → threading_with_large_pool_test.rb} +1 -1
  30. data/test/tools/repl_set_manager.rb +241 -0
  31. data/test/tools/test.rb +13 -0
  32. data/test/unit/connection_test.rb +3 -85
  33. data/test/unit/repl_set_connection_test.rb +82 -0
  34. metadata +19 -21
  35. data/test/replica_pairs/count_test.rb +0 -34
  36. data/test/replica_pairs/insert_test.rb +0 -50
  37. data/test/replica_pairs/pooled_insert_test.rb +0 -54
  38. data/test/replica_pairs/query_test.rb +0 -39
  39. data/test/replica_sets/node_type_test.rb +0 -42
  40. data/test/rs.rb +0 -24
@@ -21,7 +21,6 @@ Gem::Specification.new do |s|
21
21
 
22
22
  s.has_rdoc = true
23
23
  s.test_files = Dir['test/**/*.rb']
24
- s.test_files -= Dir['test/mongo_bson/*.rb'] # remove these files from the manifest
25
24
 
26
25
  s.has_rdoc = true
27
26
  s.rdoc_options = ['--main', 'README.md', '--inline-source']
@@ -31,5 +30,5 @@ Gem::Specification.new do |s|
31
30
  s.email = 'mongodb-dev@googlegroups.com'
32
31
  s.homepage = 'http://www.mongodb.org'
33
32
 
34
- s.add_dependency(%q<bson>, [">= 1.1.1"])
33
+ s.add_dependency(%q<bson>, [">= #{Mongo::VERSION}"])
35
34
  end
@@ -263,13 +263,12 @@ class TestCollection < Test::Unit::TestCase
263
263
  @db = @conn[MONGO_TEST_DB]
264
264
  @test = @db['test-safe-remove']
265
265
  @test.save({:a => 50})
266
- @test.remove({}, :safe => true)
266
+ assert_equal 1, @test.remove({}, :safe => true)["n"]
267
267
  @test.drop
268
268
  end
269
269
 
270
270
  def test_remove_return_value
271
- assert_equal 50, @@test.remove({})
272
- assert_equal 57, @@test.remove({"x" => 1})
271
+ assert_equal true, @@test.remove({})
273
272
  end
274
273
 
275
274
  def test_count
@@ -579,13 +578,16 @@ class TestCollection < Test::Unit::TestCase
579
578
  @@test.ensure_index([["x", Mongo::ASCENDING]])
580
579
  assert @@test.index_information.keys.include? "x_1"
581
580
 
581
+ @@test.ensure_index([["type", 1], ["date", -1]])
582
+ assert @@test.index_information.keys.include? "type_1_date_-1"
583
+
582
584
  @@test.drop_index("x_1")
583
- assert_equal 2, @@test.index_information.keys.count
585
+ assert_equal 3, @@test.index_information.keys.count
584
586
  @@test.drop_index("x_-1")
585
- assert_equal 1, @@test.index_information.keys.count
586
-
587
- @@test.ensure_index([["x", Mongo::DESCENDING]], {}) #should work as not cached.
588
587
  assert_equal 2, @@test.index_information.keys.count
588
+
589
+ @@test.ensure_index([["x", Mongo::DESCENDING]], {})
590
+ assert_equal 3, @@test.index_information.keys.count
589
591
  assert @@test.index_information.keys.include? "x_-1"
590
592
 
591
593
  # Make sure that drop_index expires cache properly
@@ -49,12 +49,6 @@ class TestConnection < Test::Unit::TestCase
49
49
  assert_raise Mongo::InvalidNSName do @conn.db('te st') end
50
50
  end
51
51
 
52
- def test_replica_set_connection_name
53
- assert_raise Mongo::ReplicaSetConnectionError do
54
- standard_connection(:rs_name => "replica-set-wrong-name")
55
- end
56
- end
57
-
58
52
  def test_options_passed_to_db
59
53
  @pk_mock = Object.new
60
54
  db = @conn.db('test', :pk => @pk_mock, :strict => true)
@@ -9,8 +9,8 @@ class GridFileSystemTest < Test::Unit::TestCase
9
9
  end
10
10
 
11
11
  teardown do
12
- @db['fs.files'].remove
13
- @db['fs.chunks'].remove
12
+ @db.drop_collection('fs.files')
13
+ @db.drop_collection('fs.chunks')
14
14
  end
15
15
 
16
16
  context "When reading:" do
@@ -33,6 +33,39 @@ class GridIOTest < Test::Unit::TestCase
33
33
  end
34
34
  end
35
35
 
36
+ context "Seeking" do
37
+ setup do
38
+ @filename = 'test'
39
+ @mode = 'w'
40
+ @data = "1" * 1024 * 1024
41
+ @file = GridIO.new(@files, @chunks, @filename, @mode)
42
+ @file.write(@data)
43
+ @file.close
44
+ end
45
+
46
+ should "read all data using read_length and then be able to seek" do
47
+ file = GridIO.new(@files, @chunks, nil, "r", :query => {:_id => @file.files_id})
48
+ assert_equal @data, file.read(1024 * 1024)
49
+ file.seek(0)
50
+ assert_equal @data, file.read
51
+ end
52
+
53
+ should "read all data using read_all and then be able to seek" do
54
+ file = GridIO.new(@files, @chunks, nil, "r", :query => {:_id => @file.files_id})
55
+ assert_equal @data, file.read
56
+ file.seek(0)
57
+ assert_equal @data, file.read
58
+ file.seek(1024 * 512)
59
+ assert_equal 524288, file.file_position
60
+ assert_equal @data.length / 2, file.read.length
61
+ assert_equal 1048576, file.file_position
62
+ assert_nil file.read
63
+ file.seek(1024 * 512)
64
+ assert_equal 524288, file.file_position
65
+ end
66
+
67
+ end
68
+
36
69
  context "Grid MD5 check" do
37
70
  should "run in safe mode" do
38
71
  file = GridIO.new(@files, @chunks, 'smallfile', 'w', :safe => true)
@@ -62,7 +95,6 @@ class GridIOTest < Test::Unit::TestCase
62
95
  end
63
96
 
64
97
  context "Content types" do
65
-
66
98
  if defined?(MIME)
67
99
  should "determine common content types from the extension" do
68
100
  file = GridIO.new(@files, @chunks, 'sample.pdf', 'w')
@@ -18,7 +18,8 @@ class GridTest < Test::Unit::TestCase
18
18
  setup do
19
19
  @data = "GRIDDATA" * 50000
20
20
  @grid = Grid.new(@db, 'test-fs')
21
- @id = @grid.put(@data, :filename => 'sample', :metadata => {'app' => 'photos'})
21
+ @id = @grid.put(@data, :filename => 'sample',
22
+ :metadata => {'app' => 'photos'})
22
23
  end
23
24
 
24
25
  should "check existence" do
@@ -120,7 +121,8 @@ class GridTest < Test::Unit::TestCase
120
121
  context "Storing data with a length of zero" do
121
122
  setup do
122
123
  @grid = Grid.new(@db, 'test-fs')
123
- @id = @grid.put('', :filename => 'sample', :metadata => {'app' => 'photos'})
124
+ @id = @grid.put('', :filename => 'sample',
125
+ :metadata => {'app' => 'photos'})
124
126
  end
125
127
 
126
128
  should "return the zero length" do
@@ -129,6 +131,34 @@ class GridTest < Test::Unit::TestCase
129
131
  end
130
132
  end
131
133
 
134
+ context "Grid streaming: " do
135
+ setup do
136
+ @grid = Grid.new(@db, 'test-fs')
137
+ filename = 'sample_data'
138
+ @io = File.open(File.join(File.dirname(__FILE__), 'data', filename), 'r')
139
+ id = @grid.put(@io, :filename => filename)
140
+ @file = @grid.get(id)
141
+ @io.rewind
142
+ @data = @io.read
143
+ if @data.respond_to?(:force_encoding)
144
+ @data.force_encoding("binary")
145
+ end
146
+ end
147
+
148
+ should "read the file" do
149
+ read_data = ""
150
+ @file.each do |chunk|
151
+ read_data << chunk
152
+ end
153
+ assert_equal @data.length, read_data.length
154
+ end
155
+
156
+ should "read the file if no block is given" do
157
+ read_data = @file.each
158
+ assert_equal @data.length, read_data.length
159
+ end
160
+ end
161
+
132
162
  context "Streaming: " do || {}
133
163
  setup do
134
164
  def read_and_write_stream(filename, read_length, opts={})
@@ -158,12 +188,12 @@ class GridTest < Test::Unit::TestCase
158
188
  read_and_write_stream('small_data.txt', 1)
159
189
  end
160
190
 
161
- should "put and get a large io object when reading smaller than the chunk size" do
162
- read_and_write_stream('sample_file.pdf', 256 * 1024)
191
+ should "put and get a large io object if reading less than the chunk size" do
192
+ read_and_write_stream('sample_data', 256 * 1024)
163
193
  end
164
194
 
165
- should "put and get a large io object when reading larger than the chunk size" do
166
- read_and_write_stream('sample_file.pdf', 300 * 1024)
195
+ should "put and get a large io object if reading more than the chunk size" do
196
+ read_and_write_stream('sample_data', 300 * 1024)
167
197
  end
168
198
  end
169
199
  end
@@ -1,46 +1,84 @@
1
1
  $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
- require 'mongo'
3
- require 'test/unit'
4
- require './test/test_helper'
2
+ require './test/replica_sets/rs_test_helper'
5
3
 
6
- # NOTE: This test expects a replica set of three nodes to be running on local host.
4
+ # NOTE: This test expects a replica set of three nodes to be running on RS.host,
5
+ # on ports TEST_PORT, RS.ports[1], and TEST + 2.
7
6
  class ConnectTest < Test::Unit::TestCase
8
7
  include Mongo
9
8
 
9
+ def setup
10
+ RS.restart_killed_nodes
11
+ end
12
+
13
+ def teardown
14
+ RS.restart_killed_nodes
15
+ end
16
+
17
+ def test_connect_with_deprecated_multi
18
+ @conn = Connection.multi([[RS.host, RS.ports[0]], [RS.host, RS.ports[1]]], :name => RS.name)
19
+ assert @conn.connected?
20
+ assert @conn.is_a?(ReplSetConnection)
21
+ end
22
+
10
23
  def test_connect_bad_name
11
- assert_raise_error(ReplicaSetConnectionError, "expected 'wrong-repl-set-name'") do
12
- Mongo::Connection.multi([['localhost', 27017], ['localhost', 27018], ['localhost', 27019]],
13
- :rs_name => "wrong-repl-set-name")
24
+ assert_raise_error(ReplicaSetConnectionError, "-wrong") do
25
+ ReplSetConnection.new([RS.host, RS.ports[0]], [RS.host, RS.ports[1]],
26
+ [RS.host, RS.ports[2]], :rs_name => RS.name + "-wrong")
14
27
  end
15
28
  end
16
29
 
17
30
  def test_connect
18
- @conn = Mongo::Connection.multi([['localhost', 27017], ['localhost', 27018], ['localhost', 27019]],
19
- :name => "foo")
31
+ @conn = ReplSetConnection.new([RS.host, RS.ports[0]], [RS.host, RS.ports[1]],
32
+ [RS.host, RS.ports[2]], :name => RS.name)
20
33
  assert @conn.connected?
34
+
35
+ assert_equal RS.primary, @conn.primary
36
+ assert_equal RS.secondaries.sort, @conn.secondaries.sort
37
+ assert_equal RS.arbiters.sort, @conn.arbiters.sort
21
38
  end
22
39
 
23
- def test_connect_with_first_node_down
24
- puts "Please kill the node at 27017."
25
- gets
40
+ def test_connect_with_primary_node_killed
41
+ node = RS.kill_primary
26
42
 
27
- @conn = Mongo::Connection.multi([['localhost', 27017], ['localhost', 27018], ['localhost', 27019]])
43
+ # Becuase we're killing the primary and trying to connect right away,
44
+ # this is going to fail right away.
45
+ assert_raise_error(ConnectionFailure, "Failed to connect to primary node") do
46
+ @conn = ReplSetConnection.new([RS.host, RS.ports[0]], [RS.host, RS.ports[1]],
47
+ [RS.host, RS.ports[2]])
48
+ end
49
+
50
+ # This allows the secondary to come up as a primary
51
+ rescue_connection_failure do
52
+ @conn = ReplSetConnection.new([RS.host, RS.ports[0]], [RS.host, RS.ports[1]],
53
+ [RS.host, RS.ports[2]])
54
+ end
55
+ assert @conn.connected?
56
+ end
57
+
58
+ def test_connect_with_secondary_node_killed
59
+ node = RS.kill_secondary
60
+
61
+ @conn = ReplSetConnection.new([RS.host, RS.ports[0]], [RS.host, RS.ports[1]],
62
+ [RS.host, RS.ports[2]])
28
63
  assert @conn.connected?
29
64
  end
30
65
 
31
- def test_connect_with_second_node_down
32
- puts "Please kill the node at 27018."
33
- gets
66
+ def test_connect_with_third_node_killed
67
+ RS.kill(RS.get_node_from_port(RS.ports[2]))
34
68
 
35
- @conn = Mongo::Connection.multi([['localhost', 27017], ['localhost', 27018], ['localhost', 27019]])
69
+ @conn = ReplSetConnection.new([RS.host, RS.ports[0]], [RS.host, RS.ports[1]],
70
+ [RS.host, RS.ports[2]])
36
71
  assert @conn.connected?
37
72
  end
38
73
 
39
- def test_connect_with_third_node_down
40
- puts "Please kill the node at 27019."
41
- gets
74
+ def test_connect_with_primary_stepped_down
75
+ RS.step_down_primary
42
76
 
43
- @conn = Mongo::Connection.multi([['localhost', 27017], ['localhost', 27018], ['localhost', 27019]])
77
+ rescue_connection_failure do
78
+ @conn = ReplSetConnection.new([RS.host, RS.ports[0]], [RS.host, RS.ports[1]],
79
+ [RS.host, RS.ports[2]])
80
+ end
44
81
  assert @conn.connected?
45
82
  end
83
+
46
84
  end
@@ -1,7 +1,5 @@
1
1
  $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
- require 'mongo'
3
- require 'test/unit'
4
- require './test/test_helper'
2
+ require './test/replica_sets/rs_test_helper'
5
3
 
6
4
  # NOTE: This test expects a replica set of three nodes to be running
7
5
  # on the local host.
@@ -9,18 +7,22 @@ class ReplicaSetCountTest < Test::Unit::TestCase
9
7
  include Mongo
10
8
 
11
9
  def setup
12
- @conn = Mongo::Connection.multi([['localhost', 27017], ['localhost', 27018], ['localhost', 27019]])
10
+ @conn = ReplSetConnection.new([RS.host, RS.ports[0]], [RS.host, RS.ports[1]], [RS.host, RS.ports[2]])
13
11
  @db = @conn.db(MONGO_TEST_DB)
14
12
  @db.drop_collection("test-sets")
15
13
  @coll = @db.collection("test-sets")
16
14
  end
17
15
 
16
+ def teardown
17
+ RS.restart_killed_nodes
18
+ end
19
+
18
20
  def test_correct_count_after_insertion_reconnect
19
- @coll.insert({:a => 20})#, :safe => {:w => 3, :wtimeout => 10000})
21
+ @coll.insert({:a => 20}, :safe => {:w => 2, :wtimeout => 10000})
20
22
  assert_equal 1, @coll.count
21
23
 
22
- puts "Please disconnect the current master."
23
- gets
24
+ # Kill the current master node
25
+ @node = RS.kill_primary
24
26
 
25
27
  rescue_connection_failure do
26
28
  @coll.insert({:a => 30}, :safe => true)
@@ -1,7 +1,5 @@
1
1
  $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
- require 'mongo'
3
- require 'test/unit'
4
- require './test/test_helper'
2
+ require './test/replica_sets/rs_test_helper'
5
3
 
6
4
  # NOTE: This test expects a replica set of three nodes to be running
7
5
  # on the local host.
@@ -9,16 +7,20 @@ class ReplicaSetInsertTest < Test::Unit::TestCase
9
7
  include Mongo
10
8
 
11
9
  def setup
12
- @conn = Mongo::Connection.multi([['localhost', 27017], ['localhost', 27018], ['localhost', 27019]])
10
+ @conn = ReplSetConnection.new([TEST_HOST, RS.ports[0]], [TEST_HOST, RS.ports[1]], [TEST_HOST, RS.ports[2]])
13
11
  @db = @conn.db(MONGO_TEST_DB)
14
12
  @db.drop_collection("test-sets")
15
13
  @coll = @db.collection("test-sets")
16
14
  end
17
15
 
16
+ def teardown
17
+ RS.restart_killed_nodes
18
+ end
19
+
18
20
  def test_insert
19
21
  @coll.save({:a => 20}, :safe => true)
20
- puts "Please disconnect the current master."
21
- gets
22
+
23
+ RS.kill_primary
22
24
 
23
25
  rescue_connection_failure do
24
26
  @coll.save({:a => 30}, :safe => true)
@@ -29,9 +31,9 @@ class ReplicaSetInsertTest < Test::Unit::TestCase
29
31
  @coll.save({:a => 60}, :safe => true)
30
32
  @coll.save({:a => 70}, :safe => true)
31
33
 
32
- puts "Please reconnect the old master to make sure that the new master " +
33
- "has synced with the previous master. Note: this may have happened already."
34
- gets
34
+ # Restart the old master and wait for sync
35
+ RS.restart_killed_nodes
36
+ sleep(1)
35
37
  results = []
36
38
 
37
39
  rescue_connection_failure do
@@ -1,7 +1,5 @@
1
1
  $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
- require 'mongo'
3
- require 'test/unit'
4
- require './test/test_helper'
2
+ require './test/replica_sets/rs_test_helper'
5
3
 
6
4
  # NOTE: This test expects a replica set of three nodes to be running
7
5
  # on the local host.
@@ -9,18 +7,22 @@ class ReplicaSetPooledInsertTest < Test::Unit::TestCase
9
7
  include Mongo
10
8
 
11
9
  def setup
12
- @conn = Mongo::Connection.multi([['localhost', 27017], ['localhost', 27018], ['localhost', 27019]],
13
- :pool_size => 10, :timeout => 5)
10
+ @conn = ReplSetConnection.new([RS.host, RS.ports[0]], [RS.host, RS.ports[1]],
11
+ [RS.host, RS.ports[2]], :pool_size => 10, :timeout => 5)
14
12
  @db = @conn.db(MONGO_TEST_DB)
15
13
  @db.drop_collection("test-sets")
16
14
  @coll = @db.collection("test-sets")
17
15
  end
18
16
 
17
+ def teardown
18
+ RS.restart_killed_nodes
19
+ end
20
+
19
21
  def test_insert
20
22
  expected_results = [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
21
23
  @coll.save({:a => -1}, :safe => true)
22
- puts "Please disconnect the current master."
23
- gets
24
+
25
+ RS.kill_primary
24
26
 
25
27
  threads = []
26
28
  10.times do |i|
@@ -31,12 +33,9 @@ class ReplicaSetPooledInsertTest < Test::Unit::TestCase
31
33
  end
32
34
  end
33
35
 
34
- puts "Please reconnect the old master to make sure that the new master " +
35
- "has synced with the previous master. Note: this may have happened already." +
36
- "Note also that when connection with multiple threads, you may need to wait a few seconds" +
37
- "after restarting the old master so that all the data has had a chance to sync." +
38
- "This is a case of eventual consistency."
39
- gets
36
+ # Restart the old master and wait for sync
37
+ RS.restart_killed_nodes
38
+ sleep(1)
40
39
  results = []
41
40
 
42
41
  rescue_connection_failure do
@@ -1,7 +1,5 @@
1
1
  $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
- require 'mongo'
3
- require 'test/unit'
4
- require './test/test_helper'
2
+ require './test/replica_sets/rs_test_helper'
5
3
 
6
4
  # NOTE: This test expects a replica set of three nodes to be running
7
5
  # on the local host.
@@ -9,13 +7,24 @@ class ReplicaSetQuerySecondariesTest < Test::Unit::TestCase
9
7
  include Mongo
10
8
 
11
9
  def setup
12
- @conn = Mongo::Connection.multi([['localhost', 27018]], :read_secondaries => true)
10
+ @conn = ReplSetConnection.new([RS.host, RS.ports[0]], :read_secondary => true)
13
11
  @db = @conn.db(MONGO_TEST_DB)
14
12
  @db.drop_collection("test-sets")
15
- @coll = @db.collection("test-sets", :safe => {:w => 2, :wtimeout => 100})
16
13
  end
17
14
 
18
- def test_query
15
+ def teardown
16
+ RS.restart_killed_nodes
17
+ end
18
+
19
+ def test_con
20
+ assert @conn.primary_pool, "No primary pool!"
21
+ assert @conn.read_pool, "No read pool!"
22
+ assert @conn.primary_pool.port != @conn.read_pool.port,
23
+ "Primary port and read port at the same!"
24
+ end
25
+
26
+ def test_query_secondaries
27
+ @coll = @db.collection("test-sets", :safe => {:w => 3, :wtimeout => 10000})
19
28
  @coll.save({:a => 20})
20
29
  @coll.save({:a => 30})
21
30
  @coll.save({:a => 40})
@@ -25,8 +34,7 @@ class ReplicaSetQuerySecondariesTest < Test::Unit::TestCase
25
34
  assert results.include?(30)
26
35
  assert results.include?(40)
27
36
 
28
- puts "Please disconnect the current master."
29
- gets
37
+ RS.kill_primary
30
38
 
31
39
  results = []
32
40
  rescue_connection_failure do
@@ -37,4 +45,36 @@ class ReplicaSetQuerySecondariesTest < Test::Unit::TestCase
37
45
  end
38
46
  end
39
47
 
48
+ def test_kill_primary
49
+ @coll = @db.collection("test-sets", :safe => {:w => 3, :wtimeout => 10000})
50
+ @coll.save({:a => 20})
51
+ @coll.save({:a => 30})
52
+ assert_equal 2, @coll.find.to_a.length
53
+
54
+ # Should still be able to read immediately after killing master node
55
+ RS.kill_primary
56
+ assert_equal 2, @coll.find.to_a.length
57
+ end
58
+
59
+ def test_kill_secondary
60
+ @coll = @db.collection("test-sets", {:safe => {:w => 3, :wtimeout => 10000}})
61
+ @coll.save({:a => 20})
62
+ @coll.save({:a => 30})
63
+ assert_equal 2, @coll.find.to_a.length
64
+
65
+ read_node = RS.get_node_from_port(@conn.read_pool.port)
66
+ RS.kill(read_node)
67
+
68
+ # Should fail immediately on next read
69
+ assert_raise ConnectionFailure do
70
+ @coll.find.to_a.length
71
+ end
72
+
73
+ # Should eventually reconnect and be able to read
74
+ rescue_connection_failure do
75
+ length = @coll.find.to_a.length
76
+ assert_equal 2, length
77
+ end
78
+ end
79
+
40
80
  end