mongo 1.7.1 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (138) hide show
  1. data/{LICENSE.txt → LICENSE} +0 -0
  2. data/README.md +124 -111
  3. data/Rakefile +9 -325
  4. data/VERSION +1 -0
  5. data/bin/mongo_console +4 -4
  6. data/examples/admin.rb +43 -0
  7. data/examples/capped.rb +22 -0
  8. data/examples/cursor.rb +48 -0
  9. data/examples/gridfs.rb +44 -0
  10. data/examples/index_test.rb +126 -0
  11. data/examples/info.rb +31 -0
  12. data/examples/queries.rb +74 -0
  13. data/examples/replica_set.rb +26 -0
  14. data/examples/simple.rb +25 -0
  15. data/examples/strict.rb +35 -0
  16. data/examples/types.rb +36 -0
  17. data/{test/load → examples/web}/thin/load.rb +3 -1
  18. data/{test/load → examples/web}/unicorn/load.rb +5 -3
  19. data/lib/mongo.rb +8 -10
  20. data/lib/mongo/collection.rb +134 -114
  21. data/lib/mongo/cursor.rb +21 -14
  22. data/lib/mongo/db.rb +30 -28
  23. data/lib/mongo/exceptions.rb +1 -1
  24. data/lib/mongo/gridfs/grid.rb +8 -7
  25. data/lib/mongo/gridfs/grid_ext.rb +1 -1
  26. data/lib/mongo/gridfs/grid_file_system.rb +6 -5
  27. data/lib/mongo/gridfs/grid_io.rb +22 -19
  28. data/lib/mongo/legacy.rb +82 -0
  29. data/lib/mongo/{connection.rb → mongo_client.rb} +82 -61
  30. data/lib/mongo/{repl_set_connection.rb → mongo_replica_set_client.rb} +54 -39
  31. data/lib/mongo/{sharded_connection.rb → mongo_sharded_client.rb} +9 -9
  32. data/lib/mongo/networking.rb +25 -20
  33. data/lib/mongo/util/conversions.rb +1 -1
  34. data/lib/mongo/util/core_ext.rb +1 -1
  35. data/lib/mongo/util/logging.rb +20 -4
  36. data/lib/mongo/util/node.rb +16 -16
  37. data/lib/mongo/util/pool.rb +56 -27
  38. data/lib/mongo/util/pool_manager.rb +28 -27
  39. data/lib/mongo/util/server_version.rb +1 -1
  40. data/lib/mongo/util/sharding_pool_manager.rb +8 -8
  41. data/lib/mongo/util/ssl_socket.rb +1 -5
  42. data/lib/mongo/util/support.rb +24 -8
  43. data/lib/mongo/util/tcp_socket.rb +0 -4
  44. data/lib/mongo/util/uri_parser.rb +54 -38
  45. data/lib/mongo/util/write_concern.rb +67 -0
  46. data/mongo.gemspec +21 -32
  47. data/test/auxillary/{1.4_features.rb → 1.4_feature_test.rb} +4 -5
  48. data/test/auxillary/authentication_test.rb +18 -20
  49. data/test/auxillary/autoreconnect_test.rb +3 -5
  50. data/test/auxillary/fork_test.rb +5 -7
  51. data/test/auxillary/repl_set_auth_test.rb +13 -15
  52. data/test/auxillary/slave_connection_test.rb +8 -7
  53. data/test/auxillary/threaded_authentication_test.rb +15 -17
  54. data/test/bson/binary_test.rb +1 -1
  55. data/test/bson/bson_test.rb +60 -36
  56. data/test/bson/byte_buffer_test.rb +1 -1
  57. data/test/bson/hash_with_indifferent_access_test.rb +2 -2
  58. data/test/bson/json_test.rb +1 -2
  59. data/test/bson/object_id_test.rb +1 -2
  60. data/test/bson/ordered_hash_test.rb +1 -1
  61. data/test/bson/timestamp_test.rb +1 -1
  62. data/test/{collection_test.rb → functional/collection_test.rb} +57 -57
  63. data/test/{connection_test.rb → functional/connection_test.rb} +75 -89
  64. data/test/{conversions_test.rb → functional/conversions_test.rb} +1 -1
  65. data/test/{cursor_fail_test.rb → functional/cursor_fail_test.rb} +3 -29
  66. data/test/{cursor_message_test.rb → functional/cursor_message_test.rb} +1 -1
  67. data/test/{cursor_test.rb → functional/cursor_test.rb} +5 -1
  68. data/test/{db_api_test.rb → functional/db_api_test.rb} +8 -9
  69. data/test/{db_connection_test.rb → functional/db_connection_test.rb} +3 -5
  70. data/test/{db_test.rb → functional/db_test.rb} +13 -13
  71. data/test/{grid_file_system_test.rb → functional/grid_file_system_test.rb} +2 -2
  72. data/test/{grid_io_test.rb → functional/grid_io_test.rb} +6 -6
  73. data/test/{grid_test.rb → functional/grid_test.rb} +4 -10
  74. data/test/{pool_test.rb → functional/pool_test.rb} +1 -1
  75. data/test/functional/safe_test.rb +84 -0
  76. data/test/{support_test.rb → functional/support_test.rb} +1 -1
  77. data/test/{threading_test.rb → functional/threading_test.rb} +9 -9
  78. data/test/{timeout_test.rb → functional/timeout_test.rb} +1 -1
  79. data/test/{uri_test.rb → functional/uri_test.rb} +1 -1
  80. data/test/functional/write_concern_test.rb +104 -0
  81. data/test/replica_set/basic_test.rb +139 -0
  82. data/test/replica_set/client_test.rb +255 -0
  83. data/test/replica_set/complex_connect_test.rb +62 -0
  84. data/test/replica_set/connection_test.rb +255 -0
  85. data/test/{replica_sets → replica_set}/count_test.rb +17 -14
  86. data/test/replica_set/cursor_test.rb +75 -0
  87. data/test/{replica_sets → replica_set}/insert_test.rb +19 -16
  88. data/test/replica_set/query_test.rb +64 -0
  89. data/test/replica_set/refresh_test.rb +153 -0
  90. data/test/{replica_sets → replica_set}/replication_ack_test.rb +21 -17
  91. data/test/sharded_cluster/basic_test.rb +31 -50
  92. data/test/support/hash_with_indifferent_access.rb +1 -1
  93. data/test/test_helper.rb +56 -9
  94. data/test/threading/threading_with_large_pool_test.rb +8 -8
  95. data/test/tools/mongo_config.rb +270 -58
  96. data/test/tools/mongo_config_test.rb +146 -0
  97. data/test/unit/client_test.rb +230 -0
  98. data/test/unit/collection_test.rb +45 -32
  99. data/test/unit/connection_test.rb +82 -74
  100. data/test/unit/cursor_test.rb +14 -6
  101. data/test/unit/db_test.rb +8 -8
  102. data/test/unit/grid_test.rb +11 -11
  103. data/test/unit/node_test.rb +24 -24
  104. data/test/unit/pool_manager_test.rb +13 -13
  105. data/test/unit/pool_test.rb +1 -1
  106. data/test/unit/read_test.rb +21 -26
  107. data/test/unit/safe_test.rb +52 -33
  108. data/test/unit/util_test.rb +55 -0
  109. data/test/unit/write_concern_test.rb +161 -0
  110. metadata +158 -171
  111. data/docs/CREDITS.md +0 -123
  112. data/docs/FAQ.md +0 -116
  113. data/docs/GRID_FS.md +0 -158
  114. data/docs/HISTORY.md +0 -392
  115. data/docs/READ_PREFERENCE.md +0 -99
  116. data/docs/RELEASES.md +0 -54
  117. data/docs/REPLICA_SETS.md +0 -113
  118. data/docs/TAILABLE_CURSORS.md +0 -51
  119. data/docs/TUTORIAL.md +0 -356
  120. data/docs/WRITE_CONCERN.md +0 -31
  121. data/lib/mongo/gridfs/grid_io_fix.rb +0 -38
  122. data/lib/mongo/version.rb +0 -3
  123. data/test/bson/test_helper.rb +0 -30
  124. data/test/replica_sets/basic_test.rb +0 -119
  125. data/test/replica_sets/complex_connect_test.rb +0 -57
  126. data/test/replica_sets/complex_read_preference_test.rb +0 -237
  127. data/test/replica_sets/connect_test.rb +0 -156
  128. data/test/replica_sets/cursor_test.rb +0 -70
  129. data/test/replica_sets/pooled_insert_test.rb +0 -57
  130. data/test/replica_sets/query_test.rb +0 -50
  131. data/test/replica_sets/read_preference_test.rb +0 -234
  132. data/test/replica_sets/refresh_test.rb +0 -156
  133. data/test/replica_sets/refresh_with_threads_test.rb +0 -60
  134. data/test/replica_sets/rs_test_helper.rb +0 -39
  135. data/test/safe_test.rb +0 -68
  136. data/test/sharded_cluster/mongo_config_test.rb +0 -126
  137. data/test/sharded_cluster/sc_test_helper.rb +0 -39
  138. data/test/tools/repl_set_manager.rb +0 -418
@@ -1,156 +0,0 @@
1
- $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
- require './test/replica_sets/rs_test_helper'
3
- require 'benchmark'
4
-
5
- class ReplicaSetRefreshTest < Test::Unit::TestCase
6
-
7
- def setup
8
- ensure_rs
9
- end
10
-
11
- def teardown
12
- @rs.restart_killed_nodes
13
- @conn.close if defined?(@conn)
14
- end
15
-
16
- =begin
17
- def test_connect_speed
18
- Benchmark.bm do |x|
19
- x.report("Connect") do
20
- 10.times do
21
- ReplSetConnection.new(build_seeds(3), :refresh_mode => false)
22
- end
23
- end
24
-
25
- @con = ReplSetConnection.new(build_seeds(3), :refresh_mode => false)
26
-
27
- x.report("manager") do
28
- man = Mongo::PoolManager.new(@con, @con.seeds)
29
- 10.times do
30
- man.connect
31
- end
32
- end
33
- end
34
- end
35
- =end
36
-
37
- def test_connect_and_manual_refresh_with_secondaries_down
38
- @rs.kill_all_secondaries
39
- sleep(4)
40
-
41
- rescue_connection_failure do
42
- @conn = ReplSetConnection.new(build_seeds(3), :refresh_mode => false)
43
- end
44
-
45
- assert_equal [], @conn.secondaries
46
- assert @conn.connected?
47
- assert_equal @conn.read_pool, @conn.primary_pool
48
-
49
- # Refresh with no change to set
50
- @conn.refresh
51
- assert_equal [], @conn.secondaries
52
- assert @conn.connected?
53
- assert_equal @conn.read_pool, @conn.primary_pool
54
-
55
- @rs.restart_killed_nodes
56
- assert_equal [], @conn.secondaries
57
- assert @conn.connected?
58
- assert_equal @conn.read_pool, @conn.primary_pool
59
-
60
- # Refresh with everything up
61
- @conn.refresh
62
- assert @conn.read_pool
63
- assert @conn.secondaries.length > 0
64
- end
65
-
66
- def test_automated_refresh_with_secondaries_down
67
- @rs.kill_all_secondaries
68
- sleep(4)
69
-
70
- rescue_connection_failure do
71
- @conn = ReplSetConnection.new(build_seeds(3),
72
- :refresh_interval => 2, :refresh_mode => :sync, :read => :secondary_preferred)
73
- end
74
-
75
- assert_equal [], @conn.secondaries
76
- assert @conn.connected?
77
- assert_equal @conn.manager.read, @conn.manager.primary
78
- old_refresh_version = @conn.refresh_version
79
-
80
- @rs.restart_killed_nodes
81
- sleep(4)
82
- @conn['foo']['bar'].find_one
83
- @conn['foo']['bar'].insert({:a => 1})
84
-
85
- assert @conn.refresh_version > old_refresh_version,
86
- "Refresh version hasn't changed."
87
- assert @conn.secondaries.length > 0,
88
- "No secondaries have been added."
89
- assert @conn.manager.read != @conn.manager.primary,
90
- "Read pool and primary pool are identical."
91
- end
92
-
93
- def test_automated_refresh_when_secondary_goes_down
94
- @conn = ReplSetConnection.new(build_seeds(3),
95
- :refresh_interval => 2, :refresh_mode => :sync)
96
-
97
- num_secondaries = @conn.secondary_pools.length
98
- old_refresh_version = @conn.refresh_version
99
-
100
- @rs.kill_secondary
101
- sleep(4)
102
- @conn['foo']['bar'].find_one
103
-
104
- assert @conn.refresh_version > old_refresh_version,
105
- "Refresh version hasn't changed."
106
- assert_equal num_secondaries - 1, @conn.secondaries.length
107
- assert_equal num_secondaries - 1, @conn.secondary_pools.length
108
-
109
- @rs.restart_killed_nodes
110
- end
111
-
112
- def test_automated_refresh_with_removed_node
113
- @conn = ReplSetConnection.new(build_seeds(3),
114
- :refresh_interval => 2, :refresh_mode => :sync)
115
-
116
- num_secondaries = @conn.secondary_pools.length
117
- old_refresh_version = @conn.refresh_version
118
-
119
- n = @rs.remove_secondary_node
120
- sleep(4)
121
- @conn['foo']['bar'].find_one
122
-
123
- assert @conn.refresh_version > old_refresh_version,
124
- "Refresh version hasn't changed."
125
- assert_equal num_secondaries - 1, @conn.secondaries.length
126
- assert_equal num_secondaries - 1, @conn.secondary_pools.length
127
-
128
- @rs.add_node(n)
129
- end
130
-
131
- def test_adding_and_removing_nodes
132
- @conn = ReplSetConnection.new(build_seeds(3),
133
- :refresh_interval => 2, :refresh_mode => :sync)
134
-
135
- @rs.add_node
136
- sleep(4)
137
- @conn['foo']['bar'].find_one
138
-
139
- @conn2 = ReplSetConnection.new(build_seeds(3),
140
- :refresh_interval => 2, :refresh_mode => :sync)
141
-
142
- assert @conn2.secondaries.sort == @conn.secondaries.sort,
143
- "Second connection secondaries not equal to first."
144
- assert_equal 3, @conn.secondary_pools.length
145
- assert_equal 3, @conn.secondaries.length
146
-
147
- config = @conn['admin'].command({:ismaster => 1})
148
-
149
- @rs.remove_secondary_node
150
- sleep(4)
151
- config = @conn['admin'].command({:ismaster => 1})
152
-
153
- assert_equal 2, @conn.secondary_pools.length
154
- assert_equal 2, @conn.secondaries.length
155
- end
156
- end
@@ -1,60 +0,0 @@
1
- $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
- require './test/replica_sets/rs_test_helper'
3
- require 'benchmark'
4
-
5
- class ReplicaSetRefreshWithThreadsTest < Test::Unit::TestCase
6
-
7
- def setup
8
- ensure_rs
9
- @conn = nil
10
- end
11
-
12
- def teardown
13
- @conn.close if @conn
14
- end
15
-
16
- def test_read_write_load_with_added_nodes
17
- # MongoDB < 2.0 will disconnect clients on rs.reconfig()
18
- return true if @rs.version < "2"
19
-
20
- seeds = build_seeds(3)
21
- args = {
22
- :refresh_interval => 5,
23
- :refresh_mode => :sync,
24
- :read => :secondary_preferred
25
- }
26
- @conn = ReplSetConnection.new(seeds, args)
27
- @duplicate = @conn[MONGO_TEST_DB]['duplicate']
28
- @unique = @conn[MONGO_TEST_DB]['unique']
29
- @duplicate.insert("test" => "insert")
30
- @duplicate.insert("test" => "update")
31
- @unique.insert("test" => "insert")
32
- @unique.insert("test" => "update")
33
- @unique.create_index("test", :unique => true)
34
-
35
- threads = []
36
- 10.times do
37
- threads << Thread.new do
38
- 1000.times do |i|
39
- if i % 2 == 0
40
- assert_raise Mongo::OperationFailure do
41
- @unique.insert({"test" => "insert"}, :safe => true)
42
- end
43
- else
44
- @duplicate.insert({"test" => "insert"}, :safe => true)
45
- end
46
- end
47
- end
48
- end
49
-
50
- @rs.add_node
51
- threads.each {|t| t.join }
52
-
53
- sleep(1)
54
-
55
- @conn['admin'].command({:ismaster => 1})
56
-
57
- assert_equal 3, @conn.secondary_pools.length
58
- assert_equal 3, @conn.secondaries.length
59
- end
60
- end
@@ -1,39 +0,0 @@
1
- $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
- require File.expand_path("../../test_helper", __FILE__)
3
- require './test/tools/repl_set_manager'
4
-
5
- class Test::Unit::TestCase
6
- # Ensure replica set is available as an instance variable and that
7
- # a new set is spun up for each TestCase class
8
- def ensure_rs(opts={})
9
- unless defined?(@@current_class) and @@current_class == self.class
10
- @@current_class = self.class
11
- @@rs = ReplSetManager.new(opts)
12
- @@rs.start_set
13
- end
14
- @rs = @@rs
15
- end
16
-
17
- # Generic code for rescuing connection failures and retrying operations.
18
- # This could be combined with some timeout functionality.
19
- def rescue_connection_failure(max_retries=30)
20
- retries = 0
21
- begin
22
- yield
23
- rescue Mongo::ConnectionFailure => ex
24
- #puts "Rescue attempt #{retries}: from #{ex}"
25
- retries += 1
26
- raise ex if retries > max_retries
27
- sleep(2)
28
- retry
29
- end
30
- end
31
-
32
- def build_seeds(num_hosts)
33
- seeds = []
34
- num_hosts.times do |n|
35
- seeds << "#{@rs.host}:#{@rs.ports[n]}"
36
- end
37
- seeds
38
- end
39
- end
@@ -1,68 +0,0 @@
1
- require File.expand_path("../test_helper", __FILE__)
2
- include Mongo
3
-
4
- class SafeTest < Test::Unit::TestCase
5
- context "Safe mode propogation: " do
6
- setup do
7
- @con = standard_connection(:safe => {:w => 1})
8
- @db = @con[MONGO_TEST_DB]
9
- @col = @db['test-safe']
10
- @col.create_index([[:a, 1]], :unique => true)
11
- @col.remove
12
- end
13
-
14
- should "propogate safe option on insert" do
15
- @col.insert({:a => 1})
16
-
17
- assert_raise_error(OperationFailure, "duplicate key") do
18
- @col.insert({:a => 1})
19
- end
20
- end
21
-
22
- should "allow safe override on insert" do
23
- @col.insert({:a => 1})
24
- @col.insert({:a => 1}, :safe => false)
25
- end
26
-
27
- should "propogate safe option on update" do
28
- @col.insert({:a => 1})
29
- @col.insert({:a => 2})
30
-
31
- assert_raise_error(OperationFailure, "duplicate key") do
32
- @col.update({:a => 2}, {:a => 1})
33
- end
34
- end
35
-
36
- should "allow safe override on update" do
37
- @col.insert({:a => 1})
38
- @col.insert({:a => 2})
39
- @col.update({:a => 2}, {:a => 1}, :safe => false)
40
- end
41
- end
42
-
43
- context "Safe error objects" do
44
- setup do
45
- @con = standard_connection
46
- @db = @con[MONGO_TEST_DB]
47
- @col = @db['test']
48
- @col.remove
49
- @col.insert({:a => 1})
50
- @col.insert({:a => 1})
51
- @col.insert({:a => 1})
52
- end
53
-
54
- should "return object on update" do
55
- response = @col.update({:a => 1}, {"$set" => {:a => 2}},
56
- :multi => true, :safe => true)
57
-
58
- assert response['updatedExisting']
59
- assert_equal 3, response['n']
60
- end
61
-
62
- should "return object on remove" do
63
- response = @col.remove({}, :safe => true)
64
- assert_equal 3, response['n']
65
- end
66
- end
67
-
68
- end
@@ -1,126 +0,0 @@
1
- $:.unshift(File.expand_path('../../lib', File.dirname(__FILE__))).unshift(File.expand_path('../..', File.dirname(__FILE__)))
2
- require 'test-unit'
3
- require 'test/tools/mongo_config'
4
-
5
- class MongoConfig < Test::Unit::TestCase
6
-
7
- def self.suite
8
- s = super
9
- def s.setup
10
-
11
- end
12
- def s.teardown
13
-
14
- end
15
- def s.run(*args)
16
- setup
17
- super
18
- teardown
19
- end
20
- s
21
- end
22
-
23
- test "config defaults" do
24
- [ Mongo::Config::DEFAULT_BASE_OPTS,
25
- Mongo::Config::DEFAULT_REPLICA_SET,
26
- Mongo::Config::DEFAULT_SHARDED_SIMPLE,
27
- Mongo::Config::DEFAULT_SHARDED_REPLICA
28
- ].each do |params|
29
- config = Mongo::Config.cluster(params)
30
- assert(config.size > 0)
31
- end
32
- end
33
-
34
- test "get available port" do
35
- assert_not_nil(Mongo::Config.get_available_port)
36
- end
37
-
38
- test "SysProc start" do
39
- cmd = "true"
40
- sys_proc = Mongo::Config::SysProc.new(cmd)
41
- assert_equal(cmd, sys_proc.cmd)
42
- assert_nil(sys_proc.pid)
43
- assert_not_nil(sys_proc.start(0))
44
- assert_not_nil(sys_proc.pid)
45
- end
46
-
47
- test "SysProc wait" do
48
- sys_proc = Mongo::Config::SysProc.new("true")
49
- assert_not_nil(sys_proc.start(0))
50
- assert(sys_proc.running?)
51
- sys_proc.wait
52
- assert(!sys_proc.running?)
53
- end
54
-
55
- test "SysProc kill" do
56
- sys_proc = Mongo::Config::SysProc.new("true")
57
- assert_not_nil(sys_proc.start(0))
58
- sys_proc.kill
59
- sys_proc.wait
60
- assert(!sys_proc.running?)
61
- end
62
-
63
- test "SysProc stop" do
64
- sys_proc = Mongo::Config::SysProc.new("true")
65
- assert_not_nil(sys_proc.start(0))
66
- sys_proc.stop
67
- assert(!sys_proc.running?)
68
- end
69
-
70
- test "Server" do
71
- server = Mongo::Config::Server.new('a cmd', 'host', 1234)
72
- assert_equal('a cmd', server.cmd)
73
- assert_equal('host', server.host)
74
- assert_equal(1234, server.port)
75
- end
76
-
77
- test "DbServer" do
78
- config = Mongo::Config::DEFAULT_BASE_OPTS
79
- server = Mongo::Config::DbServer.new(config)
80
- assert_equal(config, server.config)
81
- assert_equal("mongod --logpath data/log --dbpath data", server.cmd)
82
- assert_equal(config[:host], server.host)
83
- assert_equal(config[:port], server.port)
84
- end
85
-
86
- def cluster_test(opts)
87
- #debug 1, opts.inspect
88
- config = Mongo::Config.cluster(opts)
89
- #debug 1, config.inspect
90
- manager = Mongo::Config::ClusterManager.new(config)
91
- assert_equal(config, manager.config)
92
- manager.start
93
- manager.servers.each{|s| p s}
94
- manager.stop
95
- manager.servers.each{|s| assert_equal(false, s.running?)}
96
- manager.clobber
97
- end
98
-
99
- test "cluster manager base" do
100
- #cluster_test(Mongo::Config::DEFAULT_BASE_OPTS)
101
- end
102
-
103
- test "cluster manager replica set" do
104
- #cluster_test(Mongo::Config::DEFAULT_REPLICA_SET)
105
- end
106
-
107
- test "cluster manager sharded simple" do
108
- #manager = Mongo::Config::ClusterManager.new(Mongo::Config.cluster(Mongo::Config::DEFAULT_SHARDED_SIMPLE)).start
109
- opts = Mongo::Config::DEFAULT_SHARDED_SIMPLE
110
- #debug 1, opts.inspect
111
- config = Mongo::Config.cluster(opts)
112
- #debug 1, config.inspect
113
- manager = Mongo::Config::ClusterManager.new(config)
114
- assert_equal(config, manager.config)
115
- manager.start
116
- #debug 1, manager.ismaster
117
- #debug 1, manager.mongos_discover
118
- manager.stop.clobber
119
- end
120
-
121
- test "cluster manager sharded replica" do
122
- #cluster_test(Mongo::Config::DEFAULT_SHARDED_REPLICA)
123
- end
124
-
125
- end
126
-