mongo 1.8.0 → 1.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +14 -29
- data/VERSION +1 -1
- data/lib/mongo.rb +3 -0
- data/lib/mongo/collection.rb +99 -49
- data/lib/mongo/cursor.rb +17 -17
- data/lib/mongo/db.rb +30 -14
- data/lib/mongo/gridfs/grid.rb +5 -3
- data/lib/mongo/gridfs/grid_file_system.rb +5 -3
- data/lib/mongo/gridfs/grid_io.rb +5 -3
- data/lib/mongo/legacy.rb +9 -2
- data/lib/mongo/mongo_client.rb +100 -72
- data/lib/mongo/mongo_replica_set_client.rb +46 -60
- data/lib/mongo/mongo_sharded_client.rb +5 -66
- data/lib/mongo/networking.rb +2 -1
- data/lib/mongo/util/node.rb +41 -42
- data/lib/mongo/util/pool.rb +15 -43
- data/lib/mongo/util/pool_manager.rb +16 -65
- data/lib/mongo/util/read_preference.rb +82 -0
- data/lib/mongo/util/sharding_pool_manager.rb +0 -86
- data/lib/mongo/util/ssl_socket.rb +2 -1
- data/lib/mongo/util/support.rb +8 -18
- data/lib/mongo/util/tcp_socket.rb +5 -4
- data/lib/mongo/util/thread_local_variable_manager.rb +29 -0
- data/lib/mongo/util/unix_socket.rb +23 -0
- data/lib/mongo/util/uri_parser.rb +31 -18
- data/lib/mongo/util/write_concern.rb +7 -2
- data/mongo.gemspec +1 -1
- data/test/auxillary/repl_set_auth_test.rb +2 -2
- data/test/bson/bson_test.rb +1 -1
- data/test/bson/byte_buffer_test.rb +24 -26
- data/test/bson/hash_with_indifferent_access_test.rb +11 -1
- data/test/functional/collection_test.rb +16 -16
- data/test/functional/connection_test.rb +1 -4
- data/test/functional/db_api_test.rb +14 -10
- data/test/functional/pool_test.rb +23 -31
- data/test/functional/timeout_test.rb +3 -5
- data/test/functional/uri_test.rb +10 -5
- data/test/replica_set/basic_test.rb +3 -8
- data/test/replica_set/client_test.rb +47 -31
- data/test/replica_set/complex_connect_test.rb +12 -10
- data/test/replica_set/connection_test.rb +8 -151
- data/test/replica_set/count_test.rb +9 -5
- data/test/replica_set/cursor_test.rb +17 -27
- data/test/replica_set/insert_test.rb +5 -10
- data/test/replica_set/query_test.rb +4 -9
- data/test/replica_set/read_preference_test.rb +200 -0
- data/test/replica_set/refresh_test.rb +54 -65
- data/test/replica_set/replication_ack_test.rb +16 -14
- data/test/sharded_cluster/basic_test.rb +30 -0
- data/test/test_helper.rb +33 -15
- data/test/threading/basic_test.rb +79 -0
- data/test/tools/mongo_config.rb +62 -22
- data/test/unit/client_test.rb +36 -14
- data/test/unit/collection_test.rb +23 -0
- data/test/unit/connection_test.rb +30 -14
- data/test/unit/cursor_test.rb +137 -7
- data/test/unit/db_test.rb +17 -4
- data/test/unit/grid_test.rb +2 -2
- data/test/unit/node_test.rb +2 -1
- data/test/unit/pool_manager_test.rb +29 -1
- data/test/unit/read_test.rb +15 -15
- data/test/unit/safe_test.rb +4 -4
- data/test/unit/write_concern_test.rb +4 -4
- metadata +134 -143
- data/examples/admin.rb +0 -43
- data/examples/capped.rb +0 -22
- data/examples/cursor.rb +0 -48
- data/examples/gridfs.rb +0 -44
- data/examples/index_test.rb +0 -126
- data/examples/info.rb +0 -31
- data/examples/queries.rb +0 -74
- data/examples/replica_set.rb +0 -26
- data/examples/simple.rb +0 -25
- data/examples/strict.rb +0 -35
- data/examples/types.rb +0 -36
- data/examples/web/thin/load.rb +0 -23
- data/examples/web/unicorn/load.rb +0 -25
- data/test/support/hash_with_indifferent_access.rb +0 -186
- data/test/support/keys.rb +0 -45
- data/test/threading/threading_with_large_pool_test.rb +0 -90
@@ -415,10 +415,7 @@ class TestConnection < Test::Unit::TestCase
|
|
415
415
|
end
|
416
416
|
|
417
417
|
should "show a proper exception message if an IOError is raised while closing a socket" do
|
418
|
-
|
419
|
-
fake_socket.stubs(:close).raises(IOError.new)
|
420
|
-
fake_socket.stub_everything
|
421
|
-
TCPSocket.stubs(:new).returns(fake_socket)
|
418
|
+
TCPSocket.any_instance.stubs(:close).raises(IOError.new)
|
422
419
|
|
423
420
|
@con.primary_pool.checkout_new_socket
|
424
421
|
@con.primary_pool.expects(:warn)
|
@@ -330,7 +330,7 @@ class DBAPITest < Test::Unit::TestCase
|
|
330
330
|
@@db.create_collection('foobar')
|
331
331
|
|
332
332
|
coll = @@db.create_collection('foobar')
|
333
|
-
assert_equal true, coll.
|
333
|
+
assert_equal true, Mongo::WriteConcern.gle?(coll.write_concern)
|
334
334
|
end
|
335
335
|
|
336
336
|
|
@@ -404,8 +404,9 @@ class DBAPITest < Test::Unit::TestCase
|
|
404
404
|
|
405
405
|
test.insert("hello" => "world")
|
406
406
|
test.insert("hello" => "mike")
|
407
|
-
|
408
|
-
|
407
|
+
assert_raise OperationFailure do
|
408
|
+
test.insert("hello" => "world")
|
409
|
+
end
|
409
410
|
end
|
410
411
|
|
411
412
|
def test_index_on_subfield
|
@@ -423,8 +424,9 @@ class DBAPITest < Test::Unit::TestCase
|
|
423
424
|
|
424
425
|
test.insert("hello" => {"a" => 4, "b" => 5})
|
425
426
|
test.insert("hello" => {"a" => 7, "b" => 2})
|
426
|
-
|
427
|
-
|
427
|
+
assert_raise OperationFailure do
|
428
|
+
test.insert("hello" => {"a" => 4, "b" => 10} )
|
429
|
+
end
|
428
430
|
end
|
429
431
|
|
430
432
|
def test_array
|
@@ -766,24 +768,26 @@ HERE
|
|
766
768
|
|
767
769
|
def test_encodings
|
768
770
|
if RUBY_VERSION >= '1.9'
|
769
|
-
|
771
|
+
default = "hello world"
|
770
772
|
utf8 = "hello world".encode("UTF-8")
|
771
773
|
iso8859 = "hello world".encode("ISO-8859-1")
|
772
774
|
|
773
775
|
if RUBY_PLATFORM =~ /jruby/
|
774
|
-
assert_equal "ASCII-8BIT",
|
776
|
+
assert_equal "ASCII-8BIT", default.encoding.name
|
777
|
+
elsif RUBY_VERSION >= '2.0'
|
778
|
+
assert_equal "UTF-8", default.encoding.name
|
775
779
|
else
|
776
|
-
assert_equal "US-ASCII",
|
780
|
+
assert_equal "US-ASCII", default.encoding.name
|
777
781
|
end
|
778
782
|
|
779
783
|
assert_equal "UTF-8", utf8.encoding.name
|
780
784
|
assert_equal "ISO-8859-1", iso8859.encoding.name
|
781
785
|
|
782
786
|
@@coll.remove
|
783
|
-
@@coll.save("
|
787
|
+
@@coll.save("default" => default, "utf8" => utf8, "iso8859" => iso8859)
|
784
788
|
doc = @@coll.find_one()
|
785
789
|
|
786
|
-
assert_equal "UTF-8", doc["
|
790
|
+
assert_equal "UTF-8", doc["default"].encoding.name
|
787
791
|
assert_equal "UTF-8", doc["utf8"].encoding.name
|
788
792
|
assert_equal "UTF-8", doc["iso8859"].encoding.name
|
789
793
|
end
|
@@ -5,51 +5,43 @@ class PoolTest < Test::Unit::TestCase
|
|
5
5
|
include Mongo
|
6
6
|
|
7
7
|
def setup
|
8
|
-
@
|
8
|
+
@client ||= standard_connection({:pool_size => 500, :pool_timeout => 5})
|
9
|
+
@db = @client.db(MONGO_TEST_DB)
|
10
|
+
@collection = @db.collection("pool_test")
|
9
11
|
end
|
10
12
|
|
11
13
|
def test_pool_affinity
|
12
|
-
|
13
|
-
|
14
|
-
@threads = []
|
14
|
+
pool = Pool.new(@client, TEST_HOST, TEST_PORT, :size => 5)
|
15
15
|
|
16
|
+
threads = []
|
16
17
|
10.times do
|
17
|
-
|
18
|
-
original_socket =
|
19
|
-
|
18
|
+
threads << Thread.new do
|
19
|
+
original_socket = pool.checkout
|
20
|
+
pool.checkin(original_socket)
|
20
21
|
5000.times do
|
21
|
-
socket =
|
22
|
+
socket = pool.checkout
|
22
23
|
assert_equal original_socket, socket
|
23
|
-
|
24
|
+
pool.checkin(socket)
|
24
25
|
end
|
25
26
|
end
|
26
27
|
end
|
27
28
|
|
28
|
-
|
29
|
+
threads.each { |t| t.join }
|
29
30
|
end
|
30
31
|
|
31
|
-
def
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
socket = @pool.checkout
|
40
|
-
@pool.checkin(socket)
|
41
|
-
end
|
42
|
-
end
|
32
|
+
def test_pool_affinity_max_size
|
33
|
+
8000.times {|x| @collection.insert({:value => x})}
|
34
|
+
threads = []
|
35
|
+
threads << Thread.new do
|
36
|
+
@collection.find({"value" => {"$lt" => 100}}).each {|e| e}
|
37
|
+
Thread.pass
|
38
|
+
sleep(5)
|
39
|
+
@collection.find({"value" => {"$gt" => 100}}).each {|e| e}
|
43
40
|
end
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
# Thread-socket pool
|
49
|
-
10000.times do
|
50
|
-
@pool.checkin(@pool.checkout)
|
41
|
+
sleep(1)
|
42
|
+
threads << Thread.new do
|
43
|
+
@collection.find({'$where' => "function() {for(i=0;i<8000;i++) {this.value};}"}).each {|e| e}
|
51
44
|
end
|
52
|
-
|
53
|
-
assert_equal 1, @pool.instance_variable_get(:@threads_to_sockets).size
|
45
|
+
threads.each(&:join)
|
54
46
|
end
|
55
47
|
end
|
@@ -2,18 +2,16 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
class TestTimeout < Test::Unit::TestCase
|
4
4
|
def test_op_timeout
|
5
|
-
connection = standard_connection(:op_timeout =>
|
5
|
+
connection = standard_connection(:op_timeout => 1)
|
6
6
|
|
7
7
|
admin = connection.db('admin')
|
8
8
|
|
9
|
-
command =
|
10
|
-
command[:sleep] = 1
|
11
|
-
command[:secs] = 1
|
9
|
+
command = {:eval => "sleep(500)"}
|
12
10
|
# Should not timeout
|
13
11
|
assert admin.command(command)
|
14
12
|
|
15
13
|
# Should timeout
|
16
|
-
command
|
14
|
+
command = {:eval => "sleep(1500)"}
|
17
15
|
assert_raise Mongo::OperationTimeout do
|
18
16
|
admin.command(command)
|
19
17
|
end
|
data/test/functional/uri_test.rb
CHANGED
@@ -20,8 +20,8 @@ class URITest < Test::Unit::TestCase
|
|
20
20
|
def test_multiple_uris
|
21
21
|
parser = Mongo::URIParser.new('mongodb://a.example.com:27018,b.example.com')
|
22
22
|
assert_equal 2, parser.nodes.length
|
23
|
-
assert_equal 'a.example.com
|
24
|
-
assert_equal 'b.example.com
|
23
|
+
assert_equal ['a.example.com', 27018], parser.nodes[0]
|
24
|
+
assert_equal ['b.example.com', 27017], parser.nodes[1]
|
25
25
|
end
|
26
26
|
|
27
27
|
def test_complex_passwords
|
@@ -48,8 +48,8 @@ class URITest < Test::Unit::TestCase
|
|
48
48
|
def test_multiple_uris_with_auths
|
49
49
|
parser = Mongo::URIParser.new('mongodb://bob:secret@a.example.com:27018,b.example.com/test')
|
50
50
|
assert_equal 2, parser.nodes.length
|
51
|
-
assert_equal 'a.example.com
|
52
|
-
assert_equal 'b.example.com
|
51
|
+
assert_equal ['a.example.com', 27018], parser.nodes[0]
|
52
|
+
assert_equal ['b.example.com', 27017], parser.nodes[1]
|
53
53
|
assert_equal 2, parser.auths.length
|
54
54
|
assert_equal "bob", parser.auths[0]["username"]
|
55
55
|
assert_equal "secret", parser.auths[0]["password"]
|
@@ -97,7 +97,12 @@ class URITest < Test::Unit::TestCase
|
|
97
97
|
assert parser.journal
|
98
98
|
assert_equal 200, parser.wtimeoutms
|
99
99
|
end
|
100
|
-
|
100
|
+
|
101
|
+
def test_opts_ssl
|
102
|
+
parser = Mongo::URIParser.new('mongodb://localhost:27018?ssl=true;w=2;journal=true;fsync=true;wtimeoutMS=200')
|
103
|
+
assert parser.ssl
|
104
|
+
end
|
105
|
+
|
101
106
|
def test_opts_nonsafe_timeout
|
102
107
|
parser = Mongo::URIParser.new('mongodb://localhost:27018?connectTimeoutMS=5500&socketTimeoutMS=500')
|
103
108
|
assert_equal 5.5, parser.connecttimeoutms
|
@@ -6,11 +6,6 @@ class BasicTest < Test::Unit::TestCase
|
|
6
6
|
ensure_cluster(:rs)
|
7
7
|
end
|
8
8
|
|
9
|
-
def self.shutdown
|
10
|
-
@@cluster.stop
|
11
|
-
@@cluster.clobber
|
12
|
-
end
|
13
|
-
|
14
9
|
def test_connect
|
15
10
|
client = MongoReplicaSetClient.new(@rs.repl_set_seeds, :name => @rs.repl_set_name)
|
16
11
|
assert client.connected?
|
@@ -70,9 +65,9 @@ class BasicTest < Test::Unit::TestCase
|
|
70
65
|
assert_equal @rs.primary_name, [client.host, client.port].join(':')
|
71
66
|
assert_equal client.host, client.primary_pool.host
|
72
67
|
assert_equal client.port, client.primary_pool.port
|
73
|
-
assert_equal
|
74
|
-
assert_equal
|
75
|
-
assert_equal
|
68
|
+
assert_equal 1, client.secondaries.length
|
69
|
+
assert_equal 1, client.arbiters.length
|
70
|
+
assert_equal 1, client.secondary_pools.length
|
76
71
|
assert_equal @rs.repl_set_name, client.replica_set_name
|
77
72
|
assert client.secondary_pools.include?(client.read_pool(:secondary))
|
78
73
|
assert_equal 90, client.refresh_interval
|
@@ -11,34 +11,12 @@ class ClientTest < Test::Unit::TestCase
|
|
11
11
|
@client.close if @client
|
12
12
|
end
|
13
13
|
|
14
|
-
def self.shutdown
|
15
|
-
@@cluster.stop
|
16
|
-
@@cluster.clobber
|
17
|
-
end
|
18
|
-
|
19
|
-
# To reset after (test) failure
|
20
|
-
# rake test:cleanup
|
21
|
-
|
22
|
-
def step_down_command
|
23
|
-
# Adding force=true to avoid 'no secondaries within 10 seconds of my optime' errors
|
24
|
-
step_down_command = BSON::OrderedHash.new
|
25
|
-
step_down_command[:replSetStepDown] = 60
|
26
|
-
step_down_command[:force] = true
|
27
|
-
step_down_command
|
28
|
-
end
|
29
|
-
|
30
14
|
# TODO: test connect timeout.
|
31
15
|
|
32
16
|
def test_connect_with_deprecated_multi
|
33
|
-
#replica_host_ports = @rs.replicas.collect{|replica| [replica.host, replica.port]}
|
34
|
-
host = @rs.replicas.first.host
|
35
17
|
silently do
|
36
|
-
|
37
|
-
|
38
|
-
[host, @rs.replicas[0].port],
|
39
|
-
[host, @rs.replicas[1].port],
|
40
|
-
[host, @rs.replicas[2].port],
|
41
|
-
], :name => @rs.repl_set_name)
|
18
|
+
# guaranteed to have one data-holding member
|
19
|
+
@client = MongoClient.multi(@rs.repl_set_seeds_old, :name => @rs.repl_set_name)
|
42
20
|
end
|
43
21
|
assert !@client.nil?
|
44
22
|
assert @client.connected?
|
@@ -50,6 +28,28 @@ class ClientTest < Test::Unit::TestCase
|
|
50
28
|
end
|
51
29
|
end
|
52
30
|
|
31
|
+
def test_reconnect_method_override
|
32
|
+
rescue_connection_failure do
|
33
|
+
@client = MongoReplicaSetClient.new(@rs.repl_set_seeds)
|
34
|
+
end
|
35
|
+
|
36
|
+
MongoReplicaSetClient.any_instance.expects(:connect)
|
37
|
+
MongoClient.any_instance.expects(:connect).never
|
38
|
+
assert_nothing_raised Mongo::ConnectionFailure do
|
39
|
+
@client.reconnect
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_primary_method_override
|
44
|
+
rescue_connection_failure do
|
45
|
+
@client = MongoReplicaSetClient.new(@rs.repl_set_seeds)
|
46
|
+
end
|
47
|
+
|
48
|
+
MongoReplicaSetClient.any_instance.expects(:read_primary?)
|
49
|
+
MongoClient.any_instance.expects(:read_primary?).never
|
50
|
+
@client.primary?
|
51
|
+
end
|
52
|
+
|
53
53
|
def test_connect_with_first_secondary_node_terminated
|
54
54
|
@rs.secondaries.first.stop
|
55
55
|
|
@@ -70,10 +70,10 @@ class ClientTest < Test::Unit::TestCase
|
|
70
70
|
|
71
71
|
def test_connect_with_primary_stepped_down
|
72
72
|
@client = MongoReplicaSetClient.new @rs.repl_set_seeds
|
73
|
-
@client[MONGO_TEST_DB]['bar'].save({:a => 1}, {:w =>
|
73
|
+
@client[MONGO_TEST_DB]['bar'].save({:a => 1}, {:w => 2})
|
74
74
|
assert @client[MONGO_TEST_DB]['bar'].find_one
|
75
75
|
|
76
|
-
primary = Mongo::MongoClient.new(
|
76
|
+
primary = Mongo::MongoClient.new(*@client.primary)
|
77
77
|
assert_raise Mongo::ConnectionFailure do
|
78
78
|
primary['admin'].command(step_down_command)
|
79
79
|
end
|
@@ -82,38 +82,43 @@ class ClientTest < Test::Unit::TestCase
|
|
82
82
|
rescue_connection_failure do
|
83
83
|
@client[MONGO_TEST_DB]['bar'].find_one
|
84
84
|
end
|
85
|
+
@client[MONGO_TEST_DB]['bar'].find_one
|
85
86
|
end
|
86
87
|
|
87
88
|
def test_connect_with_primary_killed
|
88
89
|
@client = MongoReplicaSetClient.new @rs.repl_set_seeds
|
89
90
|
assert @client.connected?
|
90
|
-
@client[MONGO_TEST_DB]['bar'].save({:a => 1}, {:w =>
|
91
|
+
@client[MONGO_TEST_DB]['bar'].save({:a => 1}, {:w => 2})
|
91
92
|
assert @client[MONGO_TEST_DB]['bar'].find_one
|
92
93
|
|
93
94
|
@rs.primary.kill(Signal.list['KILL'])
|
94
95
|
|
96
|
+
sleep(3)
|
97
|
+
|
95
98
|
rescue_connection_failure do
|
96
99
|
@client[MONGO_TEST_DB]['bar'].find_one
|
97
100
|
end
|
101
|
+
@client[MONGO_TEST_DB]['bar'].find_one
|
98
102
|
end
|
99
103
|
|
100
104
|
def test_save_with_primary_stepped_down
|
101
105
|
@client = MongoReplicaSetClient.new @rs.repl_set_seeds
|
102
106
|
assert @client.connected?
|
103
107
|
|
104
|
-
primary = Mongo::MongoClient.new(
|
108
|
+
primary = Mongo::MongoClient.new(*@client.primary)
|
105
109
|
assert_raise Mongo::ConnectionFailure do
|
106
110
|
primary['admin'].command(step_down_command)
|
107
111
|
end
|
108
112
|
|
109
113
|
rescue_connection_failure do
|
110
|
-
@client[MONGO_TEST_DB]['bar'].save({:a => 1}, {:w =>
|
114
|
+
@client[MONGO_TEST_DB]['bar'].save({:a => 1}, {:w => 2})
|
111
115
|
end
|
116
|
+
@client[MONGO_TEST_DB]['bar'].find_one
|
112
117
|
end
|
113
118
|
|
114
119
|
#def test_connect_with_first_node_removed
|
115
120
|
# @client = MongoReplicaSetClient.new @rs.repl_set_seeds
|
116
|
-
# @client[MONGO_TEST_DB]['bar'].save({:a => 1}, {:w =>
|
121
|
+
# @client[MONGO_TEST_DB]['bar'].save({:a => 1}, {:w => 2})
|
117
122
|
#
|
118
123
|
# old_primary = [@client.primary_pool.host, @client.primary_pool.port]
|
119
124
|
# old_primary_conn = Mongo::MongoClient.new(*old_primary)
|
@@ -220,7 +225,7 @@ class ClientTest < Test::Unit::TestCase
|
|
220
225
|
|
221
226
|
def test_connect_with_old_seed_format
|
222
227
|
silently do
|
223
|
-
@client = MongoReplicaSetClient.new(@rs.
|
228
|
+
@client = MongoReplicaSetClient.new(@rs.repl_set_seeds_old)
|
224
229
|
end
|
225
230
|
assert @client.connected?
|
226
231
|
end
|
@@ -252,4 +257,15 @@ class ClientTest < Test::Unit::TestCase
|
|
252
257
|
assert_equal 0, @client.write_concern[:w]
|
253
258
|
end
|
254
259
|
|
260
|
+
def test_find_and_modify_with_secondary_read_preference
|
261
|
+
@client = MongoReplicaSetClient.new
|
262
|
+
collection = @client[MONGO_TEST_DB].collection('test', :read => :secondary)
|
263
|
+
collection << { :a => 1, :processed => false}
|
264
|
+
|
265
|
+
collection.find_and_modify(
|
266
|
+
:query => {},
|
267
|
+
:update => {"$set" => {:processed => true}}
|
268
|
+
)
|
269
|
+
assert_equal collection.find_one({}, :fields => {:_id => 0}, :read => :primary), {'a' => 1, 'processed' => true}
|
270
|
+
end
|
255
271
|
end
|
@@ -6,11 +6,6 @@ class ComplexConnectTest < Test::Unit::TestCase
|
|
6
6
|
ensure_cluster(:rs)
|
7
7
|
end
|
8
8
|
|
9
|
-
def self.shutdown
|
10
|
-
@@cluster.stop
|
11
|
-
@@cluster.clobber
|
12
|
-
end
|
13
|
-
|
14
9
|
def teardown
|
15
10
|
@client.close if defined?(@conn) && @conn
|
16
11
|
end
|
@@ -31,8 +26,12 @@ class ComplexConnectTest < Test::Unit::TestCase
|
|
31
26
|
assert @client['test']['foo'].find_one
|
32
27
|
|
33
28
|
config = primary['local']['system.replset'].find_one
|
29
|
+
old_config = config.dup
|
34
30
|
config['version'] += 1
|
35
|
-
|
31
|
+
|
32
|
+
# eliminate exception: can't find self in new replset config
|
33
|
+
port_to_delete = @rs.servers.collect(&:port).find{|port| port != primary.port}.to_s
|
34
|
+
|
36
35
|
config['members'].delete_if do |member|
|
37
36
|
member['host'].include?(port_to_delete)
|
38
37
|
end
|
@@ -42,15 +41,13 @@ class ComplexConnectTest < Test::Unit::TestCase
|
|
42
41
|
end
|
43
42
|
@rs.start
|
44
43
|
|
45
|
-
force_stepdown = BSON::OrderedHash.new
|
46
|
-
force_stepdown[:replSetStepDown] = 1
|
47
|
-
force_stepdown[:force] = true
|
48
44
|
|
49
45
|
assert_raise ConnectionFailure do
|
50
|
-
primary['admin'].command(
|
46
|
+
primary['admin'].command(step_down_command)
|
51
47
|
end
|
52
48
|
|
53
49
|
# isMaster is currently broken in 2.1+ when called on removed nodes
|
50
|
+
puts version
|
54
51
|
if version < "2.1"
|
55
52
|
rescue_connection_failure do
|
56
53
|
assert @client['test']['foo'].find_one
|
@@ -58,5 +55,10 @@ class ComplexConnectTest < Test::Unit::TestCase
|
|
58
55
|
|
59
56
|
assert @client['test']['foo'].find_one
|
60
57
|
end
|
58
|
+
|
59
|
+
primary = MongoClient.new(host, @rs.primary.port)
|
60
|
+
assert_raise ConnectionFailure do
|
61
|
+
primary['admin'].command({:replSetReconfig => old_config})
|
62
|
+
end
|
61
63
|
end
|
62
64
|
end
|
@@ -4,41 +4,11 @@ class ConnectionTest < Test::Unit::TestCase
|
|
4
4
|
|
5
5
|
def setup
|
6
6
|
ensure_cluster(:rs)
|
7
|
-
@connection = nil
|
8
7
|
end
|
9
8
|
|
10
|
-
def teardown
|
11
|
-
@connection.close if @connection
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.shutdown
|
15
|
-
@@cluster.stop
|
16
|
-
@@cluster.clobber
|
17
|
-
end
|
18
|
-
|
19
|
-
# To reset after (test) failure
|
20
|
-
# rake test:cleanup
|
21
|
-
|
22
|
-
def step_down_command
|
23
|
-
# Adding force=true to avoid 'no secondaries within 10 seconds of my optime' errors
|
24
|
-
step_down_command = BSON::OrderedHash.new
|
25
|
-
step_down_command[:replSetStepDown] = 60
|
26
|
-
step_down_command[:force] = true
|
27
|
-
step_down_command
|
28
|
-
end
|
29
|
-
|
30
|
-
# TODO: test connect timeout.
|
31
|
-
|
32
9
|
def test_connect_with_deprecated_multi
|
33
|
-
#replica_host_ports = @rs.replicas.collect{|replica| [replica.host, replica.port]}
|
34
|
-
host = @rs.replicas.first.host
|
35
10
|
silently do
|
36
|
-
@connection = Connection.multi(
|
37
|
-
# guaranteed to have one data-holding member
|
38
|
-
[host, @rs.replicas[0].port],
|
39
|
-
[host, @rs.replicas[1].port],
|
40
|
-
[host, @rs.replicas[2].port],
|
41
|
-
], :name => @rs.repl_set_name)
|
11
|
+
@connection = Connection.multi(@rs.repl_set_seeds_old, :name => @rs.repl_set_name)
|
42
12
|
end
|
43
13
|
assert !@connection.nil?
|
44
14
|
assert @connection.connected?
|
@@ -68,127 +38,14 @@ class ConnectionTest < Test::Unit::TestCase
|
|
68
38
|
assert @connection.connected?
|
69
39
|
end
|
70
40
|
|
71
|
-
def test_connect_with_primary_stepped_down
|
72
|
-
@connection = ReplSetConnection.new @rs.repl_set_seeds
|
73
|
-
@connection[MONGO_TEST_DB]['bar'].save({:a => 1}, {:safe => {:w => 3}})
|
74
|
-
assert @connection[MONGO_TEST_DB]['bar'].find_one
|
75
|
-
|
76
|
-
primary = Mongo::Connection.new(@connection.primary_pool.host, @connection.primary_pool.port)
|
77
|
-
assert_raise Mongo::ConnectionFailure do
|
78
|
-
primary['admin'].command(step_down_command)
|
79
|
-
end
|
80
|
-
assert @connection.connected?
|
81
|
-
|
82
|
-
rescue_connection_failure do
|
83
|
-
@connection[MONGO_TEST_DB]['bar'].find_one
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def test_connect_with_primary_killed
|
88
|
-
@connection = ReplSetConnection.new @rs.repl_set_seeds
|
89
|
-
assert @connection.connected?
|
90
|
-
@connection[MONGO_TEST_DB]['bar'].save({:a => 1}, {:safe => {:w => 3}})
|
91
|
-
assert @connection[MONGO_TEST_DB]['bar'].find_one
|
92
|
-
|
93
|
-
@rs.primary.kill(Signal.list['KILL'])
|
94
|
-
|
95
|
-
rescue_connection_failure do
|
96
|
-
@connection[MONGO_TEST_DB]['bar'].find_one
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
def test_save_with_primary_stepped_down
|
101
|
-
@connection = ReplSetConnection.new @rs.repl_set_seeds
|
102
|
-
assert @connection.connected?
|
103
|
-
|
104
|
-
primary = Mongo::Connection.new(@connection.primary_pool.host, @connection.primary_pool.port)
|
105
|
-
assert_raise Mongo::ConnectionFailure do
|
106
|
-
primary['admin'].command(step_down_command)
|
107
|
-
end
|
108
|
-
|
109
|
-
rescue_connection_failure do
|
110
|
-
@connection[MONGO_TEST_DB]['bar'].save({:a => 1}, {:safe => {:w => 3}})
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
#def test_connect_with_first_node_removed
|
115
|
-
# @connection = ReplSetConnection.new @rs.repl_set_seeds
|
116
|
-
# @connection[MONGO_TEST_DB]['bar'].save({:a => 1}, {:safe => {:w => 3}})
|
117
|
-
#
|
118
|
-
# old_primary = [@connection.primary_pool.host, @connection.primary_pool.port]
|
119
|
-
# old_primary_conn = Mongo::Connection.new(*old_primary)
|
120
|
-
# assert_raise Mongo::ConnectionFailure do
|
121
|
-
# old_primary_conn['admin'].command(step_down_command)
|
122
|
-
# end
|
123
|
-
#
|
124
|
-
# # Wait for new primary
|
125
|
-
# rescue_connection_failure do
|
126
|
-
# sleep 1 until @rs.get_node_with_state(1)
|
127
|
-
# end
|
128
|
-
#
|
129
|
-
# new_primary = @rs.get_all_host_pairs_with_state(1).first
|
130
|
-
# new_primary_conn = Mongo::Connection.new(*new_primary)
|
131
|
-
#
|
132
|
-
# config = nil
|
133
|
-
#
|
134
|
-
# # Remove old primary from replset
|
135
|
-
# rescue_connection_failure do
|
136
|
-
# config = @connection['local']['system.replset'].find_one
|
137
|
-
# end
|
138
|
-
#
|
139
|
-
# old_member = config['members'].select {|m| m['host'] == old_primary.join(':')}.first
|
140
|
-
# config['members'].reject! {|m| m['host'] == old_primary.join(':')}
|
141
|
-
# config['version'] += 1
|
142
|
-
#
|
143
|
-
# begin
|
144
|
-
# new_primary_conn['admin'].command({'replSetReconfig' => config})
|
145
|
-
# rescue Mongo::ConnectionFailure
|
146
|
-
# end
|
147
|
-
#
|
148
|
-
# # Wait for the dust to settle
|
149
|
-
# rescue_connection_failure do
|
150
|
-
# assert @connection[MONGO_TEST_DB]['bar'].find_one
|
151
|
-
# end
|
152
|
-
#
|
153
|
-
# # Make sure a new connection skips the old primary
|
154
|
-
# @new_conn = ReplSetConnection.new @rs.repl_set_seeds
|
155
|
-
# @new_conn.connect
|
156
|
-
# new_nodes = [@new_conn.primary] + @new_conn.secondaries
|
157
|
-
# assert !(new_nodes).include?(old_primary)
|
158
|
-
#
|
159
|
-
# # Add the old primary back
|
160
|
-
# config['members'] << old_member
|
161
|
-
# config['version'] += 1
|
162
|
-
#
|
163
|
-
# begin
|
164
|
-
# new_primary_conn['admin'].command({'replSetReconfig' => config})
|
165
|
-
# rescue Mongo::ConnectionFailure
|
166
|
-
# end
|
167
|
-
#end
|
168
|
-
|
169
|
-
#def test_connect_with_hung_first_node
|
170
|
-
# hung_node = nil
|
171
|
-
# begin
|
172
|
-
# hung_node = IO.popen('nc -lk 127.0.0.1 29999 >/dev/null 2>&1')
|
173
|
-
#
|
174
|
-
# @connection = ReplSetConnection.new(['localhost:29999'] + @rs.repl_set_seeds,
|
175
|
-
# :connect_timeout => 2)
|
176
|
-
# @connection.connect
|
177
|
-
# assert ['localhost:29999'] != @connection.primary
|
178
|
-
# assert !@connection.secondaries.include?('localhost:29999')
|
179
|
-
# ensure
|
180
|
-
# Process.kill("KILL", hung_node.pid) if hung_node
|
181
|
-
# end
|
182
|
-
#end
|
183
|
-
|
184
41
|
def test_connect_with_connection_string
|
185
|
-
@connection = Connection.from_uri("mongodb://#{@rs.
|
42
|
+
@connection = Connection.from_uri("mongodb://#{@rs.repl_set_seeds_uri}?replicaset=#{@rs.repl_set_name}")
|
186
43
|
assert !@connection.nil?
|
187
44
|
assert @connection.connected?
|
188
45
|
end
|
189
46
|
|
190
47
|
def test_connect_with_connection_string_in_env_var
|
191
|
-
ENV['MONGODB_URI'] = "mongodb://#{@rs.
|
48
|
+
ENV['MONGODB_URI'] = "mongodb://#{@rs.repl_set_seeds_uri}?replicaset=#{@rs.repl_set_name}"
|
192
49
|
@connection = ReplSetConnection.new
|
193
50
|
assert !@connection.nil?
|
194
51
|
assert_equal 2, @connection.seeds.length
|
@@ -201,7 +58,7 @@ class ConnectionTest < Test::Unit::TestCase
|
|
201
58
|
end
|
202
59
|
|
203
60
|
def test_connect_with_connection_string_in_implicit_mongodb_uri
|
204
|
-
ENV['MONGODB_URI'] = "mongodb://#{@rs.
|
61
|
+
ENV['MONGODB_URI'] = "mongodb://#{@rs.repl_set_seeds_uri}?replicaset=#{@rs.repl_set_name}"
|
205
62
|
@connection = Connection.from_uri
|
206
63
|
assert !@connection.nil?
|
207
64
|
assert_equal 2, @connection.seeds.length
|
@@ -220,13 +77,13 @@ class ConnectionTest < Test::Unit::TestCase
|
|
220
77
|
|
221
78
|
def test_connect_with_old_seed_format
|
222
79
|
silently do
|
223
|
-
@connection = ReplSetConnection.new(@rs.
|
80
|
+
@connection = ReplSetConnection.new(@rs.repl_set_seeds_old)
|
224
81
|
end
|
225
82
|
assert @connection.connected?
|
226
83
|
end
|
227
84
|
|
228
85
|
def test_connect_with_full_connection_string
|
229
|
-
@connection = Connection.from_uri("mongodb://#{@rs.
|
86
|
+
@connection = Connection.from_uri("mongodb://#{@rs.repl_set_seeds_uri}?replicaset=#{@rs.repl_set_name};safe=true;w=2;fsync=true;slaveok=true")
|
230
87
|
assert !@connection.nil?
|
231
88
|
assert @connection.connected?
|
232
89
|
assert_equal 2, @connection.write_concern[:w]
|
@@ -235,7 +92,7 @@ class ConnectionTest < Test::Unit::TestCase
|
|
235
92
|
end
|
236
93
|
|
237
94
|
def test_connect_with_full_connection_string_in_env_var
|
238
|
-
ENV['MONGODB_URI'] = "mongodb://#{@rs.
|
95
|
+
ENV['MONGODB_URI'] = "mongodb://#{@rs.repl_set_seeds_uri}?replicaset=#{@rs.repl_set_name};safe=true;w=2;fsync=true;slaveok=true"
|
239
96
|
@connection = ReplSetConnection.new
|
240
97
|
assert !@connection.nil?
|
241
98
|
assert @connection.connected?
|
@@ -245,7 +102,7 @@ class ConnectionTest < Test::Unit::TestCase
|
|
245
102
|
end
|
246
103
|
|
247
104
|
def test_connect_options_override_env_var
|
248
|
-
ENV['MONGODB_URI'] = "mongodb://#{@rs.
|
105
|
+
ENV['MONGODB_URI'] = "mongodb://#{@rs.repl_set_seeds_uri}?replicaset=#{@rs.repl_set_name};safe=true;w=2;fsync=true;slaveok=true"
|
249
106
|
@connection = ReplSetConnection.new({:safe => {:w => 1}})
|
250
107
|
assert !@connection.nil?
|
251
108
|
assert @connection.connected?
|