mongo 1.7.1 → 1.8.0

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.
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
-