mongo 1.4.0 → 1.5.0.rc0
Sign up to get free protection for your applications and to get access to all the features.
- data/docs/HISTORY.md +15 -0
- data/docs/REPLICA_SETS.md +19 -7
- data/lib/mongo.rb +1 -0
- data/lib/mongo/collection.rb +1 -1
- data/lib/mongo/connection.rb +29 -351
- data/lib/mongo/cursor.rb +88 -6
- data/lib/mongo/gridfs/grid.rb +4 -2
- data/lib/mongo/gridfs/grid_file_system.rb +4 -2
- data/lib/mongo/networking.rb +345 -0
- data/lib/mongo/repl_set_connection.rb +236 -191
- data/lib/mongo/util/core_ext.rb +45 -0
- data/lib/mongo/util/logging.rb +5 -0
- data/lib/mongo/util/node.rb +6 -4
- data/lib/mongo/util/pool.rb +73 -26
- data/lib/mongo/util/pool_manager.rb +100 -30
- data/lib/mongo/util/uri_parser.rb +29 -21
- data/lib/mongo/version.rb +1 -1
- data/test/bson/binary_test.rb +6 -8
- data/test/bson/bson_test.rb +1 -0
- data/test/bson/ordered_hash_test.rb +2 -0
- data/test/bson/test_helper.rb +0 -17
- data/test/collection_test.rb +22 -0
- data/test/connection_test.rb +1 -1
- data/test/cursor_test.rb +3 -3
- data/test/load/thin/load.rb +4 -7
- data/test/replica_sets/basic_test.rb +46 -0
- data/test/replica_sets/connect_test.rb +35 -58
- data/test/replica_sets/count_test.rb +15 -6
- data/test/replica_sets/insert_test.rb +6 -7
- data/test/replica_sets/query_test.rb +4 -6
- data/test/replica_sets/read_preference_test.rb +112 -8
- data/test/replica_sets/refresh_test.rb +66 -36
- data/test/replica_sets/refresh_with_threads_test.rb +55 -0
- data/test/replica_sets/replication_ack_test.rb +3 -6
- data/test/replica_sets/rs_test_helper.rb +12 -6
- data/test/replica_sets/threading_test.rb +111 -0
- data/test/test_helper.rb +9 -2
- data/test/threading_test.rb +14 -6
- data/test/tools/repl_set_manager.rb +55 -40
- data/test/unit/collection_test.rb +2 -1
- data/test/unit/connection_test.rb +8 -8
- data/test/unit/grid_test.rb +4 -2
- data/test/unit/pool_manager_test.rb +1 -0
- data/test/unit/read_test.rb +17 -5
- data/test/uri_test.rb +9 -4
- metadata +13 -28
- data/test/replica_sets/connection_string_test.rb +0 -29
- data/test/replica_sets/pooled_insert_test.rb +0 -58
- data/test/replica_sets/query_secondaries.rb +0 -109
data/test/unit/read_test.rb
CHANGED
@@ -10,7 +10,7 @@ class ReadTest < Test::Unit::TestCase
|
|
10
10
|
|
11
11
|
end
|
12
12
|
|
13
|
-
context "Read mode on connection: " do
|
13
|
+
context "Read mode on replica set connection: " do
|
14
14
|
setup do
|
15
15
|
@read_preference = :secondary
|
16
16
|
@con = Mongo::ReplSetConnection.new(['localhost', 27017], :read => @read_preference, :connect => false)
|
@@ -71,19 +71,31 @@ class ReadTest < Test::Unit::TestCase
|
|
71
71
|
end
|
72
72
|
|
73
73
|
should "use default value on query" do
|
74
|
+
@cursor = @col.find({:a => 1})
|
75
|
+
sock = mock()
|
76
|
+
read_pool = stub(:checkin => true)
|
77
|
+
@con.stubs(:read_pool).returns(read_pool)
|
78
|
+
primary_pool = stub(:checkin => true)
|
79
|
+
@con.stubs(:primary_pool).returns(primary_pool)
|
80
|
+
@con.expects(:checkout_reader).returns(sock)
|
74
81
|
@con.expects(:receive_message).with do |o, m, l, s, c, r|
|
75
|
-
r ==
|
82
|
+
r == nil
|
76
83
|
end.returns([[], 0, 0])
|
77
84
|
|
78
|
-
@
|
85
|
+
@cursor.next
|
79
86
|
end
|
80
87
|
|
81
88
|
should "allow override default value on query" do
|
89
|
+
@cursor = @col.find({:a => 1}, :read => :primary)
|
90
|
+
sock = mock()
|
91
|
+
primary_pool = stub(:checkin => true)
|
92
|
+
@con.stubs(:primary_pool).returns(primary_pool)
|
93
|
+
@con.expects(:checkout_writer).returns(sock)
|
82
94
|
@con.expects(:receive_message).with do |o, m, l, s, c, r|
|
83
|
-
r ==
|
95
|
+
r == nil
|
84
96
|
end.returns([[], 0, 0])
|
85
97
|
|
86
|
-
@
|
98
|
+
@cursor.next
|
87
99
|
end
|
88
100
|
|
89
101
|
should "allow override alternate value on query" do
|
data/test/uri_test.rb
CHANGED
@@ -36,6 +36,11 @@ class TestThreading < Test::Unit::TestCase
|
|
36
36
|
assert_equal "s-_3#%R.t", parser.auths[0]["password"]
|
37
37
|
end
|
38
38
|
|
39
|
+
def test_complex_usernames
|
40
|
+
parser = Mongo::URIParser.new('mongodb://b:ob:secret.word@a.example.com:27018/test')
|
41
|
+
assert_equal "b:ob", parser.auths[0]["username"]
|
42
|
+
end
|
43
|
+
|
39
44
|
def test_passwords_contain_no_commas
|
40
45
|
assert_raise MongoArgumentError do
|
41
46
|
Mongo::URIParser.new('mongodb://bob:a,b@a.example.com:27018/test')
|
@@ -43,7 +48,7 @@ class TestThreading < Test::Unit::TestCase
|
|
43
48
|
end
|
44
49
|
|
45
50
|
def test_multiple_uris_with_auths
|
46
|
-
parser = Mongo::URIParser.new('mongodb://bob:secret@a.example.com:27018
|
51
|
+
parser = Mongo::URIParser.new('mongodb://bob:secret@a.example.com:27018,b.example.com/test')
|
47
52
|
assert_equal 2, parser.nodes.length
|
48
53
|
assert_equal 'a.example.com', parser.nodes[0][0]
|
49
54
|
assert_equal 27018, parser.nodes[0][1]
|
@@ -53,9 +58,9 @@ class TestThreading < Test::Unit::TestCase
|
|
53
58
|
assert_equal "bob", parser.auths[0]["username"]
|
54
59
|
assert_equal "secret", parser.auths[0]["password"]
|
55
60
|
assert_equal "test", parser.auths[0]["db_name"]
|
56
|
-
assert_equal "
|
57
|
-
assert_equal "
|
58
|
-
assert_equal "
|
61
|
+
assert_equal "bob", parser.auths[1]["username"]
|
62
|
+
assert_equal "secret", parser.auths[1]["password"]
|
63
|
+
assert_equal "test", parser.auths[1]["db_name"]
|
59
64
|
end
|
60
65
|
|
61
66
|
def test_opts_basic
|
metadata
CHANGED
@@ -1,13 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 4
|
9
|
-
- 0
|
10
|
-
version: 1.4.0
|
4
|
+
prerelease: 6
|
5
|
+
version: 1.5.0.rc0
|
11
6
|
platform: ruby
|
12
7
|
authors:
|
13
8
|
- Jim Menard
|
@@ -17,7 +12,7 @@ autorequire:
|
|
17
12
|
bindir: bin
|
18
13
|
cert_chain: []
|
19
14
|
|
20
|
-
date: 2011-
|
15
|
+
date: 2011-11-18 00:00:00 -05:00
|
21
16
|
default_executable:
|
22
17
|
dependencies:
|
23
18
|
- !ruby/object:Gem::Dependency
|
@@ -28,12 +23,7 @@ dependencies:
|
|
28
23
|
requirements:
|
29
24
|
- - "="
|
30
25
|
- !ruby/object:Gem::Version
|
31
|
-
|
32
|
-
segments:
|
33
|
-
- 1
|
34
|
-
- 4
|
35
|
-
- 0
|
36
|
-
version: 1.4.0
|
26
|
+
version: 1.5.0.rc0
|
37
27
|
type: :runtime
|
38
28
|
version_requirements: *id001
|
39
29
|
description: A Ruby driver for MongoDB. For more information about Mongo, see http://www.mongodb.org.
|
@@ -60,6 +50,7 @@ files:
|
|
60
50
|
- lib/mongo/gridfs/grid_file_system.rb
|
61
51
|
- lib/mongo/gridfs/grid_io.rb
|
62
52
|
- lib/mongo/gridfs/grid_io_fix.rb
|
53
|
+
- lib/mongo/networking.rb
|
63
54
|
- lib/mongo/repl_set_connection.rb
|
64
55
|
- lib/mongo/util/conversions.rb
|
65
56
|
- lib/mongo/util/core_ext.rb
|
@@ -116,17 +107,17 @@ files:
|
|
116
107
|
- test/load/thin/load.rb
|
117
108
|
- test/load/unicorn/load.rb
|
118
109
|
- test/pool_test.rb
|
110
|
+
- test/replica_sets/basic_test.rb
|
119
111
|
- test/replica_sets/connect_test.rb
|
120
|
-
- test/replica_sets/connection_string_test.rb
|
121
112
|
- test/replica_sets/count_test.rb
|
122
113
|
- test/replica_sets/insert_test.rb
|
123
|
-
- test/replica_sets/pooled_insert_test.rb
|
124
|
-
- test/replica_sets/query_secondaries.rb
|
125
114
|
- test/replica_sets/query_test.rb
|
126
115
|
- test/replica_sets/read_preference_test.rb
|
127
116
|
- test/replica_sets/refresh_test.rb
|
117
|
+
- test/replica_sets/refresh_with_threads_test.rb
|
128
118
|
- test/replica_sets/replication_ack_test.rb
|
129
119
|
- test/replica_sets/rs_test_helper.rb
|
120
|
+
- test/replica_sets/threading_test.rb
|
130
121
|
- test/safe_test.rb
|
131
122
|
- test/support/hash_with_indifferent_access.rb
|
132
123
|
- test/support/keys.rb
|
@@ -164,19 +155,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
164
155
|
requirements:
|
165
156
|
- - ">="
|
166
157
|
- !ruby/object:Gem::Version
|
167
|
-
hash: 3
|
168
|
-
segments:
|
169
|
-
- 0
|
170
158
|
version: "0"
|
171
159
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
172
160
|
none: false
|
173
161
|
requirements:
|
174
|
-
- - "
|
162
|
+
- - ">"
|
175
163
|
- !ruby/object:Gem::Version
|
176
|
-
|
177
|
-
segments:
|
178
|
-
- 0
|
179
|
-
version: "0"
|
164
|
+
version: 1.3.1
|
180
165
|
requirements: []
|
181
166
|
|
182
167
|
rubyforge_project:
|
@@ -217,17 +202,17 @@ test_files:
|
|
217
202
|
- test/load/thin/load.rb
|
218
203
|
- test/load/unicorn/load.rb
|
219
204
|
- test/pool_test.rb
|
205
|
+
- test/replica_sets/basic_test.rb
|
220
206
|
- test/replica_sets/connect_test.rb
|
221
|
-
- test/replica_sets/connection_string_test.rb
|
222
207
|
- test/replica_sets/count_test.rb
|
223
208
|
- test/replica_sets/insert_test.rb
|
224
|
-
- test/replica_sets/pooled_insert_test.rb
|
225
|
-
- test/replica_sets/query_secondaries.rb
|
226
209
|
- test/replica_sets/query_test.rb
|
227
210
|
- test/replica_sets/read_preference_test.rb
|
228
211
|
- test/replica_sets/refresh_test.rb
|
212
|
+
- test/replica_sets/refresh_with_threads_test.rb
|
229
213
|
- test/replica_sets/replication_ack_test.rb
|
230
214
|
- test/replica_sets/rs_test_helper.rb
|
215
|
+
- test/replica_sets/threading_test.rb
|
231
216
|
- test/safe_test.rb
|
232
217
|
- test/support/hash_with_indifferent_access.rb
|
233
218
|
- test/support/keys.rb
|
@@ -1,29 +0,0 @@
|
|
1
|
-
$:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
-
require './test/replica_sets/rs_test_helper'
|
3
|
-
|
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.
|
6
|
-
class ConnectionStringTest < Test::Unit::TestCase
|
7
|
-
include Mongo
|
8
|
-
|
9
|
-
def teardown
|
10
|
-
RS.restart_killed_nodes
|
11
|
-
@conn.close if @conn
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_connect_with_connection_string
|
15
|
-
@conn = Connection.from_uri("mongodb://#{RS.host}:#{RS.ports[0]},#{RS.host}:#{RS.ports[1]}?replicaset=#{RS.name}")
|
16
|
-
assert @conn.is_a?(ReplSetConnection)
|
17
|
-
assert @conn.connected?
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_connect_with_full_connection_string
|
21
|
-
@conn = Connection.from_uri("mongodb://#{RS.host}:#{RS.ports[0]},#{RS.host}:#{RS.ports[1]}?replicaset=#{RS.name};safe=true;w=2;fsync=true;slaveok=true")
|
22
|
-
assert @conn.is_a?(ReplSetConnection)
|
23
|
-
assert @conn.connected?
|
24
|
-
assert_equal 2, @conn.safe[:w]
|
25
|
-
assert @conn.safe[:fsync]
|
26
|
-
assert @conn.read_pool
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
@@ -1,58 +0,0 @@
|
|
1
|
-
$:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
-
require './test/replica_sets/rs_test_helper'
|
3
|
-
|
4
|
-
# NOTE: This test expects a replica set of three nodes to be running
|
5
|
-
# on the local host.
|
6
|
-
class ReplicaSetPooledInsertTest < Test::Unit::TestCase
|
7
|
-
include Mongo
|
8
|
-
|
9
|
-
def setup
|
10
|
-
@conn = ReplSetConnection.new([RS.host, RS.ports[0]], [RS.host, RS.ports[1]],
|
11
|
-
[RS.host, RS.ports[2]], :pool_size => 5, :timeout => 5)
|
12
|
-
@db = @conn.db(MONGO_TEST_DB)
|
13
|
-
@db.drop_collection("test-sets")
|
14
|
-
@coll = @db.collection("test-sets")
|
15
|
-
end
|
16
|
-
|
17
|
-
def teardown
|
18
|
-
RS.restart_killed_nodes
|
19
|
-
@conn.close if @conn
|
20
|
-
end
|
21
|
-
|
22
|
-
def test_insert
|
23
|
-
expected_results = [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
24
|
-
@coll.save({:a => -1}, :safe => true)
|
25
|
-
|
26
|
-
RS.kill_primary
|
27
|
-
|
28
|
-
threads = []
|
29
|
-
10.times do |i|
|
30
|
-
threads[i] = Thread.new do
|
31
|
-
rescue_connection_failure do
|
32
|
-
@coll.save({:a => i}, :safe => true)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
threads.each {|t| t.join}
|
38
|
-
|
39
|
-
# Restart the old master and wait for sync
|
40
|
-
RS.restart_killed_nodes
|
41
|
-
sleep(1)
|
42
|
-
results = []
|
43
|
-
|
44
|
-
rescue_connection_failure do
|
45
|
-
@coll.find.each {|r| results << r}
|
46
|
-
expected_results.each do |a|
|
47
|
-
assert results.any? {|r| r['a'] == a}, "Could not find record for a => #{a}"
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
@coll.save({:a => 10}, :safe => true)
|
52
|
-
@coll.find.each {|r| results << r}
|
53
|
-
(expected_results + [10]).each do |a|
|
54
|
-
assert results.any? {|r| r['a'] == a}, "Could not find record for a => #{a} on second find"
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
end
|
@@ -1,109 +0,0 @@
|
|
1
|
-
$:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
-
require './test/replica_sets/rs_test_helper'
|
3
|
-
|
4
|
-
# NOTE: This test expects a replica set of three nodes to be running
|
5
|
-
# on the local host.
|
6
|
-
class ReplicaSetQuerySecondariesTest < Test::Unit::TestCase
|
7
|
-
include Mongo
|
8
|
-
|
9
|
-
def setup
|
10
|
-
@conn = ReplSetConnection.new([RS.host, RS.ports[0]], :read => :secondary)
|
11
|
-
@db = @conn.db(MONGO_TEST_DB)
|
12
|
-
@db.drop_collection("test-sets")
|
13
|
-
end
|
14
|
-
|
15
|
-
def teardown
|
16
|
-
RS.restart_killed_nodes
|
17
|
-
@conn.close if @conn
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_read_primary
|
21
|
-
rescue_connection_failure do
|
22
|
-
assert !@conn.read_primary?
|
23
|
-
assert !@conn.primary?
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def test_con
|
28
|
-
assert @conn.primary_pool, "No primary pool!"
|
29
|
-
assert @conn.read_pool, "No read pool!"
|
30
|
-
assert @conn.primary_pool.port != @conn.read_pool.port,
|
31
|
-
"Primary port and read port at the same!"
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_query_secondaries
|
35
|
-
@coll = @db.collection("test-sets", :safe => {:w => 3, :wtimeout => 20000})
|
36
|
-
@coll.save({:a => 20})
|
37
|
-
@coll.save({:a => 30})
|
38
|
-
@coll.save({:a => 40})
|
39
|
-
results = []
|
40
|
-
@coll.find.each {|r| results << r["a"]}
|
41
|
-
assert results.include?(20)
|
42
|
-
assert results.include?(30)
|
43
|
-
assert results.include?(40)
|
44
|
-
|
45
|
-
RS.kill_primary
|
46
|
-
|
47
|
-
results = []
|
48
|
-
rescue_connection_failure do
|
49
|
-
@coll.find.each {|r| results << r}
|
50
|
-
[20, 30, 40].each do |a|
|
51
|
-
assert results.any? {|r| r['a'] == a}, "Could not find record for a => #{a}"
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def test_kill_primary
|
57
|
-
@coll = @db.collection("test-sets", :safe => {:w => 3, :wtimeout => 10000})
|
58
|
-
@coll.save({:a => 20})
|
59
|
-
@coll.save({:a => 30})
|
60
|
-
assert_equal 2, @coll.find.to_a.length
|
61
|
-
|
62
|
-
# Should still be able to read immediately after killing master node
|
63
|
-
RS.kill_primary
|
64
|
-
assert_equal 2, @coll.find.to_a.length
|
65
|
-
rescue_connection_failure do
|
66
|
-
@coll.save({:a => 50}, :safe => {:w => 2, :wtimeout => 10000})
|
67
|
-
end
|
68
|
-
RS.restart_killed_nodes
|
69
|
-
@coll.save({:a => 50}, :safe => {:w => 2, :wtimeout => 10000})
|
70
|
-
assert_equal 4, @coll.find.to_a.length
|
71
|
-
end
|
72
|
-
|
73
|
-
def test_kill_secondary
|
74
|
-
@coll = @db.collection("test-sets", {:safe => {:w => 3, :wtimeout => 20000}})
|
75
|
-
@coll.save({:a => 20})
|
76
|
-
@coll.save({:a => 30})
|
77
|
-
assert_equal 2, @coll.find.to_a.length
|
78
|
-
|
79
|
-
read_node = RS.get_node_from_port(@conn.read_pool.port)
|
80
|
-
RS.kill(read_node)
|
81
|
-
|
82
|
-
# Should fail immediately on next read
|
83
|
-
old_read_pool_port = @conn.read_pool.port
|
84
|
-
assert_raise ConnectionFailure do
|
85
|
-
@coll.find.to_a.length
|
86
|
-
end
|
87
|
-
|
88
|
-
# Should eventually reconnect and be able to read
|
89
|
-
rescue_connection_failure do
|
90
|
-
length = @coll.find.to_a.length
|
91
|
-
assert_equal 2, length
|
92
|
-
end
|
93
|
-
new_read_pool_port = @conn.read_pool.port
|
94
|
-
assert old_read_pool_port != new_read_pool_port
|
95
|
-
end
|
96
|
-
|
97
|
-
def test_write_lots_of_data
|
98
|
-
@coll = @db.collection("test-sets", {:safe => {:w => 2}})
|
99
|
-
|
100
|
-
6000.times do |n|
|
101
|
-
@coll.save({:a => n})
|
102
|
-
end
|
103
|
-
|
104
|
-
cursor = @coll.find()
|
105
|
-
cursor.next
|
106
|
-
cursor.close
|
107
|
-
end
|
108
|
-
|
109
|
-
end
|