mongo 1.3.1 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +9 -6
- data/Rakefile +3 -4
- data/docs/HISTORY.md +20 -2
- data/docs/READ_PREFERENCE.md +39 -0
- data/docs/RELEASES.md +1 -1
- data/docs/REPLICA_SETS.md +23 -2
- data/docs/TAILABLE_CURSORS.md +51 -0
- data/docs/TUTORIAL.md +4 -4
- data/docs/WRITE_CONCERN.md +5 -2
- data/lib/mongo.rb +7 -22
- data/lib/mongo/collection.rb +96 -29
- data/lib/mongo/connection.rb +107 -62
- data/lib/mongo/cursor.rb +136 -57
- data/lib/mongo/db.rb +26 -5
- data/lib/mongo/exceptions.rb +17 -1
- data/lib/mongo/gridfs/grid.rb +1 -1
- data/lib/mongo/repl_set_connection.rb +273 -156
- data/lib/mongo/util/logging.rb +42 -0
- data/lib/mongo/util/node.rb +183 -0
- data/lib/mongo/util/pool.rb +76 -13
- data/lib/mongo/util/pool_manager.rb +208 -0
- data/lib/mongo/util/ssl_socket.rb +38 -0
- data/lib/mongo/util/support.rb +9 -1
- data/lib/mongo/util/timeout.rb +42 -0
- data/lib/mongo/version.rb +3 -0
- data/mongo.gemspec +2 -2
- data/test/bson/binary_test.rb +1 -1
- data/test/bson/bson_string_test.rb +30 -0
- data/test/bson/bson_test.rb +6 -3
- data/test/bson/byte_buffer_test.rb +1 -1
- data/test/bson/hash_with_indifferent_access_test.rb +1 -1
- data/test/bson/json_test.rb +1 -1
- data/test/bson/object_id_test.rb +2 -18
- data/test/bson/ordered_hash_test.rb +38 -3
- data/test/bson/test_helper.rb +46 -0
- data/test/bson/timestamp_test.rb +32 -10
- data/test/collection_test.rb +89 -3
- data/test/connection_test.rb +35 -20
- data/test/cursor_test.rb +63 -2
- data/test/db_test.rb +12 -2
- data/test/pool_test.rb +21 -0
- data/test/replica_sets/connect_test.rb +26 -13
- data/test/replica_sets/connection_string_test.rb +1 -4
- data/test/replica_sets/count_test.rb +1 -0
- data/test/replica_sets/insert_test.rb +1 -0
- data/test/replica_sets/pooled_insert_test.rb +4 -1
- data/test/replica_sets/query_secondaries.rb +2 -1
- data/test/replica_sets/query_test.rb +2 -1
- data/test/replica_sets/read_preference_test.rb +43 -0
- data/test/replica_sets/refresh_test.rb +123 -0
- data/test/replica_sets/replication_ack_test.rb +9 -4
- data/test/replica_sets/rs_test_helper.rb +2 -2
- data/test/timeout_test.rb +14 -0
- data/test/tools/repl_set_manager.rb +134 -23
- data/test/unit/collection_test.rb +6 -8
- data/test/unit/connection_test.rb +4 -4
- data/test/unit/cursor_test.rb +23 -5
- data/test/unit/db_test.rb +2 -0
- data/test/unit/grid_test.rb +2 -0
- data/test/unit/node_test.rb +73 -0
- data/test/unit/pool_manager_test.rb +47 -0
- data/test/unit/read_test.rb +101 -0
- metadata +214 -138
- data/lib/mongo/test.rb +0 -20
- data/test/async/collection_test.rb +0 -224
- data/test/async/connection_test.rb +0 -24
- data/test/async/cursor_test.rb +0 -162
- data/test/async/worker_pool_test.rb +0 -99
- data/test/load/resque/load.rb +0 -21
- data/test/load/resque/processor.rb +0 -26
- data/test/load/unicorn/unicorn.rb +0 -29
- data/test/tools/load.rb +0 -58
- data/test/tools/sharding_manager.rb +0 -202
- data/test/tools/test.rb +0 -4
- data/test/unit/repl_set_connection_test.rb +0 -59
data/test/connection_test.rb
CHANGED
@@ -13,7 +13,7 @@ class TestConnection < Test::Unit::TestCase
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def teardown
|
16
|
-
@conn
|
16
|
+
@conn.close
|
17
17
|
end
|
18
18
|
|
19
19
|
def test_connection_failure
|
@@ -22,6 +22,20 @@ class TestConnection < Test::Unit::TestCase
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
+
# def test_connection_timeout
|
26
|
+
# passed = false
|
27
|
+
# begin
|
28
|
+
# t0 = Time.now
|
29
|
+
# Mongo::Connection.new('foo.bar', 27017, :connect_timeout => 3)
|
30
|
+
# rescue OperationTimeout
|
31
|
+
# passed = true
|
32
|
+
# t1 = Time.now
|
33
|
+
# end
|
34
|
+
|
35
|
+
# assert passed
|
36
|
+
# assert t1 - t0 < 4
|
37
|
+
# end
|
38
|
+
|
25
39
|
def test_host_port_accessors
|
26
40
|
assert_equal @conn.host, TEST_HOST
|
27
41
|
assert_equal @conn.port, TEST_PORT
|
@@ -147,8 +161,8 @@ class TestConnection < Test::Unit::TestCase
|
|
147
161
|
end
|
148
162
|
|
149
163
|
def test_nodes
|
150
|
-
|
151
|
-
nodes =
|
164
|
+
conn = Connection.multi([['foo', 27017], ['bar', 27018]], :connect => false)
|
165
|
+
nodes = conn.nodes
|
152
166
|
assert_equal 2, nodes.length
|
153
167
|
assert_equal ['foo', 27017], nodes[0]
|
154
168
|
assert_equal ['bar', 27018], nodes[1]
|
@@ -176,35 +190,32 @@ class TestConnection < Test::Unit::TestCase
|
|
176
190
|
end
|
177
191
|
|
178
192
|
def test_max_bson_size_value
|
193
|
+
conn = standard_connection(:connect => false)
|
194
|
+
|
195
|
+
admin_db = Object.new
|
196
|
+
admin_db.expects(:command).returns({'ok' => 1, 'ismaster' => 1, 'maxBsonObjectSize' => 15_000_000})
|
197
|
+
conn.expects(:[]).with('admin').returns(admin_db)
|
198
|
+
conn.connect
|
199
|
+
assert_equal 15_000_000, conn.max_bson_size
|
200
|
+
|
179
201
|
conn = standard_connection
|
180
202
|
if conn.server_version > "1.7.2"
|
181
203
|
assert_equal conn['admin'].command({:ismaster => 1})['maxBsonObjectSize'], conn.max_bson_size
|
182
204
|
end
|
183
205
|
|
184
206
|
conn.connect
|
185
|
-
|
186
|
-
doc = {'n' => 'a' * (BSON_CODER.max_bson_size - 11)}
|
207
|
+
doc = {'n' => 'a' * (conn.max_bson_size)}
|
187
208
|
assert_raise InvalidDocument do
|
188
|
-
assert BSON::BSON_CODER.serialize(doc)
|
189
|
-
end
|
190
|
-
|
191
|
-
limit = 7 * 1024 * 1024
|
192
|
-
conn.stubs(:max_bson_size).returns(limit)
|
193
|
-
conn.connect
|
194
|
-
assert_equal limit, conn.max_bson_size
|
195
|
-
assert_equal limit, BSON::BSON_CODER.max_bson_size
|
196
|
-
doc = {'n' => 'a' * ((limit) - 11)}
|
197
|
-
assert_raise_error InvalidDocument, "limited to #{limit}" do
|
198
|
-
assert BSON::BSON_CODER.serialize(doc)
|
209
|
+
assert BSON::BSON_CODER.serialize(doc, false, true, @conn.max_bson_size)
|
199
210
|
end
|
200
211
|
end
|
201
212
|
|
202
|
-
def
|
213
|
+
def test_max_bson_size_with_no_reported_max_size
|
203
214
|
conn = standard_connection(:connect => false)
|
204
215
|
|
205
216
|
admin_db = Object.new
|
206
|
-
admin_db.expects(:command).returns({'ok' => 1, 'ismaster' => 1})
|
207
|
-
conn.expects(:[]).with('admin').returns(admin_db)
|
217
|
+
admin_db.expects(:command).returns({'ok' => 1, 'ismaster' => 1})
|
218
|
+
conn.expects(:[]).with('admin').returns(admin_db)
|
208
219
|
|
209
220
|
conn.connect
|
210
221
|
assert_equal Mongo::DEFAULT_MAX_BSON_SIZE, BSON::BSON_CODER.max_bson_size
|
@@ -238,6 +249,10 @@ class TestConnection < Test::Unit::TestCase
|
|
238
249
|
@conn.add_auth(@auth['db_name'], @auth['username'], @auth['password'])
|
239
250
|
end
|
240
251
|
|
252
|
+
teardown do
|
253
|
+
@conn.clear_auths
|
254
|
+
end
|
255
|
+
|
241
256
|
should "save the authentication" do
|
242
257
|
assert_equal @auth, @conn.auths[0]
|
243
258
|
end
|
@@ -300,7 +315,7 @@ class TestConnection < Test::Unit::TestCase
|
|
300
315
|
fake_socket = Mocha::Mock.new
|
301
316
|
fake_socket.stubs(:close).raises(IOError.new)
|
302
317
|
fake_socket.stub_everything
|
303
|
-
TCPSocket.
|
318
|
+
TCPSocket.stubs(:new).returns(fake_socket)
|
304
319
|
|
305
320
|
@con.primary_pool.checkout_new_socket
|
306
321
|
assert_equal [], @con.primary_pool.close
|
data/test/cursor_test.rb
CHANGED
@@ -2,8 +2,8 @@ require './test/test_helper'
|
|
2
2
|
require 'logger'
|
3
3
|
|
4
4
|
class CursorTest < Test::Unit::TestCase
|
5
|
-
|
6
5
|
include Mongo
|
6
|
+
include Mongo::Constants
|
7
7
|
|
8
8
|
@@connection = standard_connection
|
9
9
|
@@db = @@connection.db(MONGO_TEST_DB)
|
@@ -16,11 +16,72 @@ class CursorTest < Test::Unit::TestCase
|
|
16
16
|
@@coll_full_name = "#{MONGO_TEST_DB}.test"
|
17
17
|
end
|
18
18
|
|
19
|
+
def test_alive
|
20
|
+
batch = []
|
21
|
+
5000.times do |n|
|
22
|
+
batch << {:a => n}
|
23
|
+
end
|
24
|
+
|
25
|
+
@@coll.insert(batch)
|
26
|
+
cursor = @@coll.find
|
27
|
+
assert !cursor.alive?
|
28
|
+
cursor.next
|
29
|
+
assert cursor.alive?
|
30
|
+
cursor.close
|
31
|
+
assert !cursor.alive?
|
32
|
+
@@coll.remove
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_add_and_remove_options
|
36
|
+
c = @@coll.find
|
37
|
+
assert_equal 0, c.options & OP_QUERY_EXHAUST
|
38
|
+
c.add_option(OP_QUERY_EXHAUST)
|
39
|
+
assert_equal OP_QUERY_EXHAUST, c.options & OP_QUERY_EXHAUST
|
40
|
+
c.remove_option(OP_QUERY_EXHAUST)
|
41
|
+
assert_equal 0, c.options & OP_QUERY_EXHAUST
|
42
|
+
|
43
|
+
c.next
|
44
|
+
assert_raise Mongo::InvalidOperation do
|
45
|
+
c.add_option(OP_QUERY_EXHAUST)
|
46
|
+
end
|
47
|
+
|
48
|
+
assert_raise Mongo::InvalidOperation do
|
49
|
+
c.add_option(OP_QUERY_EXHAUST)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_exhaust
|
54
|
+
if @@version >= "2.0"
|
55
|
+
@@coll.remove
|
56
|
+
data = "1" * 100_000
|
57
|
+
10_000.times do |n|
|
58
|
+
@@coll.insert({:n => n, :data => data})
|
59
|
+
end
|
60
|
+
|
61
|
+
c = Cursor.new(@@coll)
|
62
|
+
c.add_option(OP_QUERY_EXHAUST)
|
63
|
+
assert_equal @@coll.count, c.to_a.size
|
64
|
+
assert c.closed?
|
65
|
+
|
66
|
+
c = Cursor.new(@@coll)
|
67
|
+
c.add_option(OP_QUERY_EXHAUST)
|
68
|
+
9999.times do
|
69
|
+
c.next
|
70
|
+
end
|
71
|
+
assert c.has_next?
|
72
|
+
assert c.next
|
73
|
+
assert !c.has_next?
|
74
|
+
assert c.closed?
|
75
|
+
|
76
|
+
@@coll.remove
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
19
80
|
def test_inspect
|
20
81
|
selector = {:a => 1}
|
21
82
|
cursor = @@coll.find(selector)
|
22
83
|
assert_equal "<Mongo::Cursor:0x#{cursor.object_id.to_s(16)} namespace='#{@@db.name}.#{@@coll.name}' " +
|
23
|
-
"@selector=#{selector.inspect}>", cursor.inspect
|
84
|
+
"@selector=#{selector.inspect} @cursor_id=#{cursor.cursor_id}>", cursor.inspect
|
24
85
|
end
|
25
86
|
|
26
87
|
def test_explain
|
data/test/db_test.rb
CHANGED
@@ -156,7 +156,8 @@ class DBTest < Test::Unit::TestCase
|
|
156
156
|
assert Mongo::Connection.from_uri("mongodb://spongebob:squarepants@#{host_port}/#{@@db.name}")
|
157
157
|
|
158
158
|
assert_raise Mongo::AuthenticationError do
|
159
|
-
Mongo::Connection.from_uri("mongodb://wrong:info@#{host_port}/#{@@db.name}")
|
159
|
+
con = Mongo::Connection.from_uri("mongodb://wrong:info@#{host_port}/#{@@db.name}")
|
160
|
+
con['test']['foo'].find_one
|
160
161
|
end
|
161
162
|
end
|
162
163
|
|
@@ -205,8 +206,17 @@ class DBTest < Test::Unit::TestCase
|
|
205
206
|
|
206
207
|
def test_check_command_response
|
207
208
|
command = {:forceerror => 1}
|
208
|
-
|
209
|
+
raised = false
|
210
|
+
begin
|
209
211
|
@@db.command(command)
|
212
|
+
rescue => ex
|
213
|
+
raised = true
|
214
|
+
assert ex.message.include?("forced error"),
|
215
|
+
"error message does not contain 'forced error'"
|
216
|
+
assert_equal 10038, ex.error_code
|
217
|
+
assert_equal 10038, ex.result['assertionCode']
|
218
|
+
ensure
|
219
|
+
assert raised, "No assertion raised!"
|
210
220
|
end
|
211
221
|
end
|
212
222
|
|
data/test/pool_test.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require './test/test_helper'
|
2
|
+
require 'logger'
|
3
|
+
require 'stringio'
|
4
|
+
require 'thread'
|
5
|
+
|
6
|
+
class TestPool < Test::Unit::TestCase
|
7
|
+
|
8
|
+
include Mongo
|
9
|
+
include BSON
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@conn = standard_connection
|
13
|
+
end
|
14
|
+
|
15
|
+
def teardown
|
16
|
+
@conn[MONGO_TEST_DB].get_last_error
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_foo
|
20
|
+
end
|
21
|
+
end
|
@@ -6,12 +6,9 @@ require './test/replica_sets/rs_test_helper'
|
|
6
6
|
class ConnectTest < Test::Unit::TestCase
|
7
7
|
include Mongo
|
8
8
|
|
9
|
-
def setup
|
10
|
-
RS.restart_killed_nodes
|
11
|
-
end
|
12
|
-
|
13
9
|
def teardown
|
14
10
|
RS.restart_killed_nodes
|
11
|
+
@conn.close if defined?(@conn) && @conn
|
15
12
|
end
|
16
13
|
|
17
14
|
def test_connect_with_deprecated_multi
|
@@ -22,17 +19,30 @@ class ConnectTest < Test::Unit::TestCase
|
|
22
19
|
|
23
20
|
def test_connect_bad_name
|
24
21
|
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]], :
|
22
|
+
@conn = ReplSetConnection.new([RS.host, RS.ports[0]], [RS.host, RS.ports[1]],
|
23
|
+
[RS.host, RS.ports[2]], :name => RS.name + "-wrong")
|
27
24
|
end
|
28
25
|
end
|
29
26
|
|
27
|
+
# def test_connect_timeout
|
28
|
+
# passed = false
|
29
|
+
# timeout = 3
|
30
|
+
# begin
|
31
|
+
# t0 = Time.now
|
32
|
+
# @conn = ReplSetConnection.new(['192.169.169.1', 27017], :connect_timeout => timeout)
|
33
|
+
# rescue OperationTimeout
|
34
|
+
# passed = true
|
35
|
+
# t1 = Time.now
|
36
|
+
# end
|
37
|
+
|
38
|
+
# assert passed
|
39
|
+
# assert t1 - t0 < timeout + 1
|
40
|
+
# end
|
41
|
+
|
30
42
|
def test_connect
|
31
43
|
@conn = ReplSetConnection.new([RS.host, RS.ports[1]], [RS.host, RS.ports[0]],
|
32
44
|
[RS.host, RS.ports[2]], :name => RS.name)
|
33
45
|
assert @conn.connected?
|
34
|
-
assert @conn.read_primary?
|
35
|
-
assert @conn.primary?
|
36
46
|
|
37
47
|
assert_equal RS.primary, @conn.primary
|
38
48
|
assert_equal RS.secondaries.sort, @conn.secondaries.sort
|
@@ -66,22 +76,25 @@ class ConnectTest < Test::Unit::TestCase
|
|
66
76
|
@conn = ReplSetConnection.new([RS.host, RS.ports[0]], [RS.host, RS.ports[1]],
|
67
77
|
[RS.host, RS.ports[2]])
|
68
78
|
end
|
69
|
-
assert @conn.connected?
|
70
79
|
end
|
71
80
|
|
72
81
|
def test_connect_with_secondary_node_killed
|
73
82
|
node = RS.kill_secondary
|
74
83
|
|
75
|
-
|
76
|
-
[RS.host, RS.ports[
|
84
|
+
rescue_connection_failure do
|
85
|
+
@conn = ReplSetConnection.new([RS.host, RS.ports[0]], [RS.host, RS.ports[1]],
|
86
|
+
[RS.host, RS.ports[2]])
|
87
|
+
end
|
77
88
|
assert @conn.connected?
|
78
89
|
end
|
79
90
|
|
80
91
|
def test_connect_with_third_node_killed
|
81
92
|
RS.kill(RS.get_node_from_port(RS.ports[2]))
|
82
93
|
|
83
|
-
|
84
|
-
[RS.host, RS.ports[
|
94
|
+
rescue_connection_failure do
|
95
|
+
@conn = ReplSetConnection.new([RS.host, RS.ports[0]], [RS.host, RS.ports[1]],
|
96
|
+
[RS.host, RS.ports[2]])
|
97
|
+
end
|
85
98
|
assert @conn.connected?
|
86
99
|
end
|
87
100
|
|
@@ -6,12 +6,9 @@ require './test/replica_sets/rs_test_helper'
|
|
6
6
|
class ConnectionStringTest < Test::Unit::TestCase
|
7
7
|
include Mongo
|
8
8
|
|
9
|
-
def setup
|
10
|
-
RS.restart_killed_nodes
|
11
|
-
end
|
12
|
-
|
13
9
|
def teardown
|
14
10
|
RS.restart_killed_nodes
|
11
|
+
@conn.close if @conn
|
15
12
|
end
|
16
13
|
|
17
14
|
def test_connect_with_connection_string
|
@@ -8,7 +8,7 @@ class ReplicaSetPooledInsertTest < Test::Unit::TestCase
|
|
8
8
|
|
9
9
|
def setup
|
10
10
|
@conn = ReplSetConnection.new([RS.host, RS.ports[0]], [RS.host, RS.ports[1]],
|
11
|
-
[RS.host, RS.ports[2]], :pool_size =>
|
11
|
+
[RS.host, RS.ports[2]], :pool_size => 5, :timeout => 5)
|
12
12
|
@db = @conn.db(MONGO_TEST_DB)
|
13
13
|
@db.drop_collection("test-sets")
|
14
14
|
@coll = @db.collection("test-sets")
|
@@ -16,6 +16,7 @@ class ReplicaSetPooledInsertTest < Test::Unit::TestCase
|
|
16
16
|
|
17
17
|
def teardown
|
18
18
|
RS.restart_killed_nodes
|
19
|
+
@conn.close if @conn
|
19
20
|
end
|
20
21
|
|
21
22
|
def test_insert
|
@@ -33,6 +34,8 @@ class ReplicaSetPooledInsertTest < Test::Unit::TestCase
|
|
33
34
|
end
|
34
35
|
end
|
35
36
|
|
37
|
+
threads.each {|t| t.join}
|
38
|
+
|
36
39
|
# Restart the old master and wait for sync
|
37
40
|
RS.restart_killed_nodes
|
38
41
|
sleep(1)
|
@@ -7,13 +7,14 @@ class ReplicaSetQuerySecondariesTest < Test::Unit::TestCase
|
|
7
7
|
include Mongo
|
8
8
|
|
9
9
|
def setup
|
10
|
-
@conn = ReplSetConnection.new([RS.host, RS.ports[0]], :
|
10
|
+
@conn = ReplSetConnection.new([RS.host, RS.ports[0]], :read => :secondary)
|
11
11
|
@db = @conn.db(MONGO_TEST_DB)
|
12
12
|
@db.drop_collection("test-sets")
|
13
13
|
end
|
14
14
|
|
15
15
|
def teardown
|
16
16
|
RS.restart_killed_nodes
|
17
|
+
@conn.close if @conn
|
17
18
|
end
|
18
19
|
|
19
20
|
def test_read_primary
|
@@ -7,7 +7,7 @@ class ReplicaSetQueryTest < Test::Unit::TestCase
|
|
7
7
|
include Mongo
|
8
8
|
|
9
9
|
def setup
|
10
|
-
@conn = ReplSetConnection.new([RS.host, RS.ports[0]])
|
10
|
+
@conn = ReplSetConnection.new([RS.host, RS.ports[0], RS.ports[1]])
|
11
11
|
@db = @conn.db(MONGO_TEST_DB)
|
12
12
|
@db.drop_collection("test-sets")
|
13
13
|
@coll = @db.collection("test-sets")
|
@@ -15,6 +15,7 @@ class ReplicaSetQueryTest < Test::Unit::TestCase
|
|
15
15
|
|
16
16
|
def teardown
|
17
17
|
RS.restart_killed_nodes
|
18
|
+
@conn.close if @conn
|
18
19
|
end
|
19
20
|
|
20
21
|
def test_query
|
@@ -0,0 +1,43 @@
|
|
1
|
+
$:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
+
require './test/replica_sets/rs_test_helper'
|
3
|
+
|
4
|
+
# TODO: enable this once we enable reads from tags.
|
5
|
+
class ReadPreferenceTest < Test::Unit::TestCase
|
6
|
+
include Mongo
|
7
|
+
|
8
|
+
#def setup
|
9
|
+
# @conn = ReplSetConnection.new([RS.host, RS.ports[0], RS.host, RS.ports[1]], :read => :secondary, :pool_size => 50)
|
10
|
+
# @db = @conn.db(MONGO_TEST_DB)
|
11
|
+
# @db.drop_collection("test-sets")
|
12
|
+
#end
|
13
|
+
|
14
|
+
# TODO: enable this once we enable reads from tags.
|
15
|
+
# def test_query_tagged
|
16
|
+
# col = @db['mongo-test']
|
17
|
+
|
18
|
+
# col.insert({:a => 1}, :safe => {:w => 3})
|
19
|
+
# col.find_one({}, :read => {:db => "main"})
|
20
|
+
# col.find_one({}, :read => {:dc => "ny"})
|
21
|
+
# col.find_one({}, :read => {:dc => "sf"})
|
22
|
+
|
23
|
+
# assert_raise Mongo::NodeWithTagsNotFound do
|
24
|
+
# col.find_one({}, :read => {:foo => "bar"})
|
25
|
+
# end
|
26
|
+
|
27
|
+
# threads = []
|
28
|
+
# 100.times do
|
29
|
+
# threads << Thread.new do
|
30
|
+
# col.find_one({}, :read => {:dc => "sf"})
|
31
|
+
# end
|
32
|
+
# end
|
33
|
+
|
34
|
+
# threads.each {|t| t.join }
|
35
|
+
|
36
|
+
# col.remove
|
37
|
+
# end
|
38
|
+
|
39
|
+
#def teardown
|
40
|
+
# RS.restart_killed_nodes
|
41
|
+
#end
|
42
|
+
|
43
|
+
end
|