mongo 1.0.5 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/HISTORY CHANGED
@@ -1,3 +1,8 @@
1
+ 1.0.6 2010-7-26
2
+
3
+ * Replica set support.
4
+ * Collection#map_reduce bug fix.
5
+
1
6
  1.0.5 2010-7-13
2
7
 
3
8
  * Fix for bug introduced in 1.0.4.
data/Rakefile CHANGED
@@ -58,23 +58,43 @@ namespace :test do
58
58
  t.verbose = true
59
59
  end
60
60
 
61
- Rake::TestTask.new(:pair_count) do |t|
62
- t.test_files = FileList['test/replica/count_test.rb']
61
+ Rake::TestTask.new(:replica_pair_count) do |t|
62
+ t.test_files = FileList['test/replica_pairs/count_test.rb']
63
63
  t.verbose = true
64
64
  end
65
65
 
66
- Rake::TestTask.new(:pair_insert) do |t|
67
- t.test_files = FileList['test/replica/insert_test.rb']
66
+ Rake::TestTask.new(:replica_pair_insert) do |t|
67
+ t.test_files = FileList['test/replica_pairs/insert_test.rb']
68
68
  t.verbose = true
69
69
  end
70
70
 
71
- Rake::TestTask.new(:pooled_pair_insert) do |t|
72
- t.test_files = FileList['test/replica/pooled_insert_test.rb']
71
+ Rake::TestTask.new(:pooled_replica_pair_insert) do |t|
72
+ t.test_files = FileList['test/replica_pairs/pooled_insert_test.rb']
73
73
  t.verbose = true
74
74
  end
75
75
 
76
- Rake::TestTask.new(:pair_query) do |t|
77
- t.test_files = FileList['test/replica/query_test.rb']
76
+ Rake::TestTask.new(:replica_pair_query) do |t|
77
+ t.test_files = FileList['test/replica_pairs/query_test.rb']
78
+ t.verbose = true
79
+ end
80
+
81
+ Rake::TestTask.new(:replica_set_count) do |t|
82
+ t.test_files = FileList['test/replica_sets/count_test.rb']
83
+ t.verbose = true
84
+ end
85
+
86
+ Rake::TestTask.new(:replica_set_insert) do |t|
87
+ t.test_files = FileList['test/replica_sets/insert_test.rb']
88
+ t.verbose = true
89
+ end
90
+
91
+ Rake::TestTask.new(:pooled_replica_set_insert) do |t|
92
+ t.test_files = FileList['test/replica_sets/pooled_insert_test.rb']
93
+ t.verbose = true
94
+ end
95
+
96
+ Rake::TestTask.new(:replica_set_query) do |t|
97
+ t.test_files = FileList['test/replica_sets/query_test.rb']
78
98
  t.verbose = true
79
99
  end
80
100
 
@@ -3,7 +3,7 @@
3
3
  $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
4
4
 
5
5
  module Mongo
6
- VERSION = "1.0.5"
6
+ VERSION = "1.0.6"
7
7
  end
8
8
 
9
9
  module Mongo
@@ -480,7 +480,6 @@ module Mongo
480
480
  #
481
481
  # @core mapreduce map_reduce-instance_method
482
482
  def map_reduce(map, reduce, opts={})
483
- opts.assert_valid_keys(:query, :sort, :limit, :finalize, :out, :keeptemp, :verbose, :raw)
484
483
  map = BSON::Code.new(map) unless map.is_a?(BSON::Code)
485
484
  reduce = BSON::Code.new(reduce) unless reduce.is_a?(BSON::Code)
486
485
  raw = opts.delete(:raw)
@@ -40,16 +40,15 @@ module Mongo
40
40
  # Counter for generating unique request ids.
41
41
  @@current_request_id = 0
42
42
 
43
- # Create a connection to MongoDB. Specify either one or a pair of servers,
44
- # along with a maximum connection pool size and timeout.
43
+ # Create a connection to MongoDB.
45
44
  #
46
45
  # If connecting to just one server, you may specify whether connection to slave is permitted.
47
46
  # In all cases, the default host is "localhost" and the default port is 27017.
48
47
  #
49
- # To specify a pair, use Connection.paired.
50
- #
51
- # Note that there are a few issues when using connection pooling with Ruby 1.9 on Windows. These
52
- # should be resolved in the next release.
48
+ # To specify more than one host pair to be used as seeds in a replica set
49
+ # or replica pair, use Connection.multi. If you're only specifying one node in the
50
+ # replica set, you can use Connection.new, as any other host known to the set will be
51
+ # cached.
53
52
  #
54
53
  # @param [String, Hash] host.
55
54
  # @param [Integer] port specify a port number here if only one host is being specified.
@@ -57,7 +56,8 @@ module Mongo
57
56
  # @option options [Boolean] :slave_ok (false) Must be set to +true+ when connecting
58
57
  # to a single, slave node.
59
58
  # @option options [Logger, #debug] :logger (nil) Logger instance to receive driver operation log.
60
- # @option options [Integer] :pool_size (1) The maximum number of socket connections that can be opened to the database.
59
+ # @option options [Integer] :pool_size (1) The maximum number of socket connections that can be
60
+ # opened to the database.
61
61
  # @option options [Float] :timeout (5.0) When all of the connections to the pool are checked out,
62
62
  # this is the number of seconds to wait for a new connection to be released before throwing an exception.
63
63
  #
@@ -110,14 +110,52 @@ module Mongo
110
110
  @checked_out = []
111
111
 
112
112
  # slave_ok can be true only if one node is specified
113
- @slave_ok = options[:slave_ok] && @nodes.length == 1
113
+ if @nodes.length > 1 && options[:slave_ok]
114
+ raise MongoArgumentError, "Can't specify more than one node when :slave_ok is true."
115
+ else
116
+ @slave_ok = options[:slave_ok]
117
+ end
118
+
114
119
  @logger = options[:logger] || nil
115
120
  @options = options
116
121
 
117
122
  should_connect = options[:connect].nil? ? true : options[:connect]
118
- connect_to_master if should_connect
123
+ connect if should_connect
119
124
  end
120
125
 
126
+ # Initialize a connection to a MongoDB replica set using an array of seed nodes.
127
+ #
128
+ # Note that, even when connecting to a replica set, you can use Connection.new specifying
129
+ # just a single node. If the replica set is up, the remaining nodes in the set will be cached
130
+ # for failover.
131
+ #
132
+ # @param nodes [Array] An array of arrays, each of which specifies a host and port.
133
+ # @param opts Takes the same options as Connection.new
134
+ #
135
+ # @example
136
+ # Connection.multi([["db1.example.com", 27017],
137
+ # ["db2.example.com", 27017]])
138
+ #
139
+ # @example
140
+ # Connection.multi([["db1.example.com", 27017], ["db2.example.com", 27017], ["db3.example.com", 27017]],
141
+ # :pool_size => 20, :timeout => 5)
142
+ #
143
+ # @return [Mongo::Connection]
144
+ def self.multi(nodes, opts={})
145
+ unless nodes.length > 0 && nodes.all? {|n| n.is_a? Array}
146
+ raise MongoArgumentError, "Connection.paired requires at least one node to be specified."
147
+ end
148
+ # Block returns an array, the first element being an array of nodes and the second an array
149
+ # of authorizations for the database.
150
+ new(nil, nil, opts) do |con|
151
+ nodes.map do |node|
152
+ con.pair_val_to_connection(node)
153
+ end
154
+ end
155
+ end
156
+
157
+ # @deprecated
158
+ #
121
159
  # Initialize a paired connection to MongoDB.
122
160
  #
123
161
  # @param nodes [Array] An array of arrays, each of which specified a host and port.
@@ -134,6 +172,7 @@ module Mongo
134
172
  #
135
173
  # @return [Mongo::Connection]
136
174
  def self.paired(nodes, opts={})
175
+ warn "Connection.paired is deprecated. Please use Connection.multi instead."
137
176
  unless nodes.length == 2 && nodes.all? {|n| n.is_a? Array}
138
177
  raise MongoArgumentError, "Connection.paired requires that exactly two nodes be specified."
139
178
  end
@@ -415,43 +454,34 @@ module Mongo
415
454
  # Create a new socket and attempt to connect to master.
416
455
  # If successful, sets host and port to master and returns the socket.
417
456
  #
457
+ # If connecting to a replica set, this method will update the
458
+ # initially-provided seed list with any nodes known to the set.
459
+ #
418
460
  # @raise [ConnectionFailure] if unable to connect to any host or port.
419
- def connect_to_master
420
- close
421
- @host = @port = nil
422
- for node_pair in @nodes
423
- host, port = *node_pair
424
- begin
425
- socket = TCPSocket.new(host, port)
426
- socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
427
-
428
- # If we're connected to master, set the @host and @port
429
- result = self['admin'].command({:ismaster => 1}, :check_response => false, :sock => socket)
430
- if Mongo::Support.ok?(result) &&
431
- ((is_master = result['ismaster'] == 1) || @slave_ok)
432
- @host, @port = host, port
433
- apply_saved_authentication
434
- end
435
-
436
- # Note: slave_ok can be true only when connecting to a single node.
437
- if @nodes.length == 1 && !is_master && !@slave_ok
438
- raise ConfigurationError, "Trying to connect directly to slave; " +
439
- "if this is what you want, specify :slave_ok => true."
461
+ def connect
462
+ reset_connection
463
+
464
+ while !connected? && !(nodes_to_try = @nodes - @nodes_tried).empty?
465
+ nodes_to_try.each do |node|
466
+ if is_primary?(check_is_master(node))
467
+ set_primary(node)
468
+ break
440
469
  end
441
-
442
- break if is_master || @slave_ok
443
- rescue SocketError, SystemCallError, IOError => ex
444
- close
445
- false
446
- ensure
447
- socket.close if socket
448
470
  end
449
471
  end
450
- raise ConnectionFailure, "failed to connect to any given host:port" unless socket
472
+
473
+ raise ConnectionFailure, "failed to connect to any given host:port" unless connected?
474
+ end
475
+
476
+ # @deprecated
477
+ #
478
+ # Create a new socket and attempt to connect to master.
479
+ # If successful, sets host and port to master and returns the socket.
480
+ def connect_to_master
481
+ warn "Connection#connect_to_master is deprecated. Use Connection#connect instead."
482
+ connect
451
483
  end
452
484
 
453
- # Are we connected to MongoDB? This is determined by checking whether
454
- # host and port have values, since they're set to nil on calls to #close.
455
485
  def connected?
456
486
  @host && @port
457
487
  end
@@ -542,6 +572,81 @@ module Mongo
542
572
 
543
573
  private
544
574
 
575
+ # If a ConnectionFailure is raised, this method will be called
576
+ # to close the connection and reset connection values.
577
+ def reset_connection
578
+ close
579
+ @host = nil
580
+ @port = nil
581
+ @nodes_tried = []
582
+ end
583
+
584
+ # Primary is defined as either a master node or a slave if
585
+ # :slave_ok has been set to +true+.
586
+ #
587
+ # If a primary node is discovered, we set the the @host and @port and
588
+ # apply any saved authentication.
589
+ #
590
+ # TODO: use the 'primary', and 'seconday' fields if we're in a replica set
591
+ def is_primary?(config)
592
+ config && (config['ismaster'] == 1 || config['ismaster'] == true) || @slave_ok
593
+ end
594
+
595
+ # @return
596
+ def check_is_master(node)
597
+ begin
598
+ host, port = *node
599
+ socket = TCPSocket.new(host, port)
600
+ socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
601
+
602
+ config = self['admin'].command({:ismaster => 1}, :sock => socket)
603
+
604
+ rescue OperationFailure, SocketError, SystemCallError, IOError => ex
605
+ close
606
+ ensure
607
+ @nodes_tried << node
608
+ if config
609
+ update_node_list(config['hosts']) if config['hosts']
610
+ if @logger
611
+ @logger.warn(config['msg']) if config['msg']
612
+ end
613
+ end
614
+
615
+ socket.close if socket
616
+ end
617
+
618
+ config
619
+ end
620
+
621
+ # Set the specified node as primary, and
622
+ # apply any saved authentication credentials.
623
+ def set_primary(node)
624
+ @host, @port = *node
625
+ apply_saved_authentication
626
+ end
627
+
628
+ # Update the list of known nodes. Only applies to replica sets,
629
+ # where the response to the ismaster command will return a list
630
+ # of known hosts.
631
+ #
632
+ # @param hosts [Array] a list of hosts, specified as string-encoded
633
+ # host-port values. Example: ["myserver-1.org:27017", "myserver-1.org:27017"]
634
+ #
635
+ # @return [Array] the updated list of nodes
636
+ def update_node_list(hosts)
637
+ new_nodes = hosts.map do |host|
638
+ if !host.respond_to?(:split)
639
+ warn "Could not parse host #{host.inspect}."
640
+ next
641
+ end
642
+
643
+ host, port = host.split(':')
644
+ [host, port.to_i]
645
+ end
646
+
647
+ @nodes |= new_nodes
648
+ end
649
+
545
650
  # Return a socket to the pool.
546
651
  def checkin(socket)
547
652
  @connection_mutex.synchronize do
@@ -581,7 +686,7 @@ module Mongo
581
686
  # pool size has not been exceeded. Otherwise, wait for the next
582
687
  # available socket.
583
688
  def checkout
584
- connect_to_master if !connected?
689
+ connect if !connected?
585
690
  start_time = Time.now
586
691
  loop do
587
692
  if (Time.now - start_time) > @timeout
@@ -45,7 +45,7 @@ module Mongo
45
45
  @order = options[:order]
46
46
  @hint = options[:hint]
47
47
  @snapshot = options[:snapshot]
48
- @timeout = options[:timeout] || false
48
+ @timeout = options[:timeout] || true
49
49
  @explain = options[:explain]
50
50
  @socket = options[:socket]
51
51
  @tailable = options[:tailable] || false
@@ -71,8 +71,8 @@ module Mongo
71
71
  # pair but it has died or something like that) then we close that
72
72
  # connection. The next request will re-open on master server.
73
73
  if err == "not master"
74
- raise ConnectionFailure, err
75
74
  @connection.close
75
+ raise ConnectionFailure, err
76
76
  end
77
77
 
78
78
  raise OperationFailure, err
@@ -297,6 +297,11 @@ class TestCollection < Test::Unit::TestCase
297
297
  end
298
298
  end
299
299
 
300
+ def test_defualt_timeout
301
+ cursor = @@test.find
302
+ assert_equal true, cursor.timeout
303
+ end
304
+
300
305
  def test_fields_as_hash
301
306
  @@test.save(:a => 1, :b => 1, :c => 1)
302
307
 
@@ -448,14 +453,6 @@ class TestCollection < Test::Unit::TestCase
448
453
  assert res["counts"]
449
454
  assert res["timeMillis"]
450
455
  end
451
-
452
- def test_allows_only_valid_keys
453
- m = Code.new("function() { emit(this.user_id, 1); }")
454
- r = Code.new("function(k,vals) { return 1; }")
455
- assert_raise ArgumentError do
456
- @@test.map_reduce(m, r, :foo => true)
457
- end
458
- end
459
456
  end
460
457
 
461
458
  if @@version > "1.3.0"
@@ -18,6 +18,10 @@ class TestConnection < Test::Unit::TestCase
18
18
  @mongo.db(MONGO_TEST_DB).error
19
19
  end
20
20
 
21
+ def test_slave_ok_with_multiple_nodes
22
+
23
+ end
24
+
21
25
  def test_server_info
22
26
  server_info = @mongo.server_info
23
27
  assert server_info.keys.include?("version")
@@ -133,6 +137,12 @@ class TestConnection < Test::Unit::TestCase
133
137
  assert_equal ['bar', 27018], nodes[1]
134
138
  end
135
139
 
140
+ def test_slave_ok_with_multiple_nodes
141
+ assert_raise MongoArgumentError do
142
+ Connection.paired([['foo', 27017], ['bar', 27018]], :connect => false, :slave_ok => true)
143
+ end
144
+ end
145
+
136
146
  context "Saved authentications" do
137
147
  setup do
138
148
  @conn = Mongo::Connection.new
@@ -0,0 +1,33 @@
1
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ require 'mongo'
3
+ require 'test/unit'
4
+ require 'test/test_helper'
5
+
6
+ # NOTE: This test expects a replica set of three nodes to be running
7
+ # on the local host.
8
+ class ReplicaSetCountTest < Test::Unit::TestCase
9
+ include Mongo
10
+
11
+ def setup
12
+ @conn = Mongo::Connection.multi([['localhost', 27017], ['localhost', 27018], ['localhost', 27019]])
13
+ @db = @conn.db(MONGO_TEST_DB)
14
+ @db.drop_collection("test-sets")
15
+ @coll = @db.collection("test-sets")
16
+ end
17
+
18
+ def test_correct_count_after_insertion_reconnect
19
+ @coll.insert({:a => 20})#, :safe => {:w => 3, :wtimeout => 10000})
20
+ assert_equal 1, @coll.count
21
+
22
+ puts "Please disconnect the current master."
23
+ gets
24
+
25
+ rescue_connection_failure do
26
+ @coll.insert({:a => 30}, :safe => true)
27
+ end
28
+
29
+ @coll.insert({:a => 40}, :safe => true)
30
+ assert_equal 3, @coll.count, "Second count failed"
31
+ end
32
+
33
+ end
@@ -0,0 +1,51 @@
1
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ require 'mongo'
3
+ require 'test/unit'
4
+ require 'test/test_helper'
5
+
6
+ # NOTE: This test expects a replica set of three nodes to be running
7
+ # on the local host.
8
+ class ReplicaSetInsertTest < Test::Unit::TestCase
9
+ include Mongo
10
+
11
+ def setup
12
+ @conn = Mongo::Connection.multi([['localhost', 27017], ['localhost', 27018], ['localhost', 27019]])
13
+ @db = @conn.db(MONGO_TEST_DB)
14
+ @db.drop_collection("test-sets")
15
+ @coll = @db.collection("test-sets")
16
+ end
17
+
18
+ def test_insert
19
+ @coll.save({:a => 20}, :safe => true)
20
+ puts "Please disconnect the current master."
21
+ gets
22
+
23
+ rescue_connection_failure do
24
+ @coll.save({:a => 30}, :safe => true)
25
+ end
26
+
27
+ @coll.save({:a => 40}, :safe => true)
28
+ @coll.save({:a => 50}, :safe => true)
29
+ @coll.save({:a => 60}, :safe => true)
30
+ @coll.save({:a => 70}, :safe => true)
31
+
32
+ puts "Please reconnect the old master to make sure that the new master " +
33
+ "has synced with the previous master. Note: this may have happened already."
34
+ gets
35
+ results = []
36
+
37
+ rescue_connection_failure do
38
+ @coll.find.each {|r| results << r}
39
+ [20, 30, 40, 50, 60, 70].each do |a|
40
+ assert results.any? {|r| r['a'] == a}, "Could not find record for a => #{a}"
41
+ end
42
+ end
43
+
44
+ @coll.save({:a => 80}, :safe => true)
45
+ @coll.find.each {|r| results << r}
46
+ [20, 30, 40, 50, 60, 70, 80].each do |a|
47
+ assert results.any? {|r| r['a'] == a}, "Could not find record for a => #{a} on second find"
48
+ end
49
+ end
50
+
51
+ end
@@ -0,0 +1,56 @@
1
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ require 'mongo'
3
+ require 'test/unit'
4
+ require 'test/test_helper'
5
+
6
+ # NOTE: This test expects a replica set of three nodes to be running
7
+ # on the local host.
8
+ class ReplicaSetPooledInsertTest < Test::Unit::TestCase
9
+ include Mongo
10
+
11
+ def setup
12
+ @conn = Mongo::Connection.multi([['localhost', 27017], ['localhost', 27018], ['localhost', 27019]],
13
+ :pool_size => 10, :timeout => 5)
14
+ @db = @conn.db(MONGO_TEST_DB)
15
+ @db.drop_collection("test-sets")
16
+ @coll = @db.collection("test-sets")
17
+ end
18
+
19
+ def test_insert
20
+ expected_results = [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
21
+ @coll.save({:a => -1}, :safe => true)
22
+ puts "Please disconnect the current master."
23
+ gets
24
+
25
+ threads = []
26
+ 10.times do |i|
27
+ threads[i] = Thread.new do
28
+ rescue_connection_failure do
29
+ @coll.save({:a => i}, :safe => true)
30
+ end
31
+ end
32
+ end
33
+
34
+ puts "Please reconnect the old master to make sure that the new master " +
35
+ "has synced with the previous master. Note: this may have happened already." +
36
+ "Note also that when connection with multiple threads, you may need to wait a few seconds" +
37
+ "after restarting the old master so that all the data has had a chance to sync." +
38
+ "This is a case of eventual consistency."
39
+ gets
40
+ results = []
41
+
42
+ rescue_connection_failure do
43
+ @coll.find.each {|r| results << r}
44
+ expected_results.each do |a|
45
+ assert results.any? {|r| r['a'] == a}, "Could not find record for a => #{a}"
46
+ end
47
+ end
48
+
49
+ @coll.save({:a => 10}, :safe => true)
50
+ @coll.find.each {|r| results << r}
51
+ (expected_results + [10]).each do |a|
52
+ assert results.any? {|r| r['a'] == a}, "Could not find record for a => #{a} on second find"
53
+ end
54
+ end
55
+
56
+ end
@@ -0,0 +1,40 @@
1
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ require 'mongo'
3
+ require 'test/unit'
4
+ require 'test/test_helper'
5
+
6
+ # NOTE: This test expects a replica set of three nodes to be running
7
+ # on the local host.
8
+ class ReplicaPairQueryTest < Test::Unit::TestCase
9
+ include Mongo
10
+
11
+ def setup
12
+ @conn = Mongo::Connection.multi([['localhost', 27017], ['localhost', 27018], ['localhost', 27019]])
13
+ @db = @conn.db(MONGO_TEST_DB)
14
+ @db.drop_collection("test-sets")
15
+ @coll = @db.collection("test-sets")
16
+ end
17
+
18
+ def test_query
19
+ @coll.save({:a => 20})
20
+ @coll.save({:a => 30})
21
+ @coll.save({:a => 40})
22
+ results = []
23
+ @coll.find.each {|r| results << r}
24
+ [20, 30, 40].each do |a|
25
+ assert results.any? {|r| r['a'] == a}, "Could not find record for a => #{a}"
26
+ end
27
+
28
+ puts "Please disconnect the current master."
29
+ gets
30
+
31
+ results = []
32
+ rescue_connection_failure do
33
+ @coll.find.each {|r| results << r}
34
+ [20, 30, 40].each do |a|
35
+ assert results.any? {|r| r['a'] == a}, "Could not find record for a => #{a}"
36
+ end
37
+ end
38
+ end
39
+
40
+ end
@@ -18,13 +18,13 @@ class ConnectionTest < Test::Unit::TestCase
18
18
 
19
19
  context "given a single node" do
20
20
  setup do
21
- TCPSocket.stubs(:new).returns(new_mock_socket)
22
21
  @conn = Connection.new('localhost', 27017, :connect => false)
22
+ TCPSocket.stubs(:new).returns(new_mock_socket)
23
23
 
24
24
  admin_db = new_mock_db
25
25
  admin_db.expects(:command).returns({'ok' => 1, 'ismaster' => 1})
26
26
  @conn.expects(:[]).with('admin').returns(admin_db)
27
- @conn.connect_to_master
27
+ @conn.connect
28
28
  end
29
29
 
30
30
  should "set localhost and port to master" do
@@ -41,19 +41,63 @@ class ConnectionTest < Test::Unit::TestCase
41
41
  end
42
42
  end
43
43
 
44
+ context "connecting to a replica set" do
45
+ setup do
46
+ TCPSocket.stubs(:new).returns(new_mock_socket)
47
+ @conn = Connection.new('localhost', 27017, :connect => false)
48
+
49
+ admin_db = new_mock_db
50
+ @hosts = ['localhost:27018', 'localhost:27019']
51
+ admin_db.expects(:command).returns({'ok' => 1, 'ismaster' => 1, 'hosts' => @hosts})
52
+ @conn.expects(:[]).with('admin').returns(admin_db)
53
+ @conn.connect
54
+ end
55
+
56
+ should "store the hosts returned from the ismaster command" do
57
+ @hosts.each do |host|
58
+ host, port = host.split(":")
59
+ port = port.to_i
60
+ assert @conn.nodes.include?([host, port]), "Connection doesn't include host #{host.inspect}."
61
+ end
62
+ end
63
+ end
64
+
65
+ context "connecting to a replica set and providing seed nodes" do
66
+ setup do
67
+ TCPSocket.stubs(:new).returns(new_mock_socket)
68
+ @conn = Connection.multi([['localhost', 27017], ['localhost', 27019]], :connect => false)
69
+
70
+ admin_db = new_mock_db
71
+ @hosts = ['localhost:27017', 'localhost:27018', 'localhost:27019']
72
+ admin_db.expects(:command).returns({'ok' => 1, 'ismaster' => 1, 'hosts' => @hosts})
73
+ @conn.expects(:[]).with('admin').returns(admin_db)
74
+ @conn.connect
75
+ end
76
+
77
+ should "not store any hosts redundantly" do
78
+ assert_equal 3, @conn.nodes.size
79
+
80
+ @hosts.each do |host|
81
+ host, port = host.split(":")
82
+ port = port.to_i
83
+ assert @conn.nodes.include?([host, port]), "Connection doesn't include host #{host.inspect}."
84
+ end
85
+ end
86
+ end
87
+
44
88
  context "initializing a paired connection" do
45
89
  should "require left and right nodes" do
46
90
  assert_raise MongoArgumentError do
47
- Connection.paired(['localhost', 27018], :connect => false)
91
+ Connection.multi(['localhost', 27018], :connect => false)
48
92
  end
49
93
 
50
94
  assert_raise MongoArgumentError do
51
- Connection.paired(['localhost', 27018], :connect => false)
95
+ Connection.multi(['localhost', 27018], :connect => false)
52
96
  end
53
97
  end
54
98
 
55
99
  should "store both nodes" do
56
- @conn = Connection.paired([['localhost', 27017], ['localhost', 27018]], :connect => false)
100
+ @conn = Connection.multi([['localhost', 27017], ['localhost', 27018]], :connect => false)
57
101
 
58
102
  assert_equal ['localhost', 27017], @conn.nodes[0]
59
103
  assert_equal ['localhost', 27018], @conn.nodes[1]
@@ -103,7 +147,7 @@ class ConnectionTest < Test::Unit::TestCase
103
147
  admin_db.expects(:command).returns({'ok' => 1, 'ismaster' => 1})
104
148
  @conn.expects(:[]).with('admin').returns(admin_db)
105
149
  @conn.expects(:apply_saved_authentication)
106
- @conn.connect_to_master
150
+ @conn.connect
107
151
  end
108
152
 
109
153
  should "raise an error on invalid uris" do
@@ -9,6 +9,10 @@ class CursorTest < Test::Unit::TestCase
9
9
  @cursor = Cursor.new(@collection)
10
10
  end
11
11
 
12
+ should "set timeout" do
13
+ assert_equal true, @cursor.timeout
14
+ end
15
+
12
16
  should "set selector" do
13
17
  assert @cursor.selector == {}
14
18
 
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongo
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 27
4
5
  prerelease: false
5
6
  segments:
6
7
  - 1
7
8
  - 0
8
- - 5
9
- version: 1.0.5
9
+ - 6
10
+ version: 1.0.6
10
11
  platform: ruby
11
12
  authors:
12
13
  - Jim Menard
@@ -16,16 +17,18 @@ autorequire:
16
17
  bindir: bin
17
18
  cert_chain: []
18
19
 
19
- date: 2010-07-13 00:00:00 -04:00
20
+ date: 2010-07-26 00:00:00 -04:00
20
21
  default_executable:
21
22
  dependencies:
22
23
  - !ruby/object:Gem::Dependency
23
24
  name: bson
24
25
  prerelease: false
25
26
  requirement: &id001 !ruby/object:Gem::Requirement
27
+ none: false
26
28
  requirements:
27
29
  - - ">="
28
30
  - !ruby/object:Gem::Version
31
+ hash: 31
29
32
  segments:
30
33
  - 1
31
34
  - 0
@@ -73,6 +76,38 @@ files:
73
76
  - examples/types.rb
74
77
  - bin/bson_benchmark.rb
75
78
  - bin/fail_if_no_c.rb
79
+ - test/auxillary/1.4_features.rb
80
+ - test/auxillary/authentication_test.rb
81
+ - test/auxillary/autoreconnect_test.rb
82
+ - test/collection_test.rb
83
+ - test/connection_test.rb
84
+ - test/conversions_test.rb
85
+ - test/cursor_fail_test.rb
86
+ - test/cursor_message_test.rb
87
+ - test/cursor_test.rb
88
+ - test/db_api_test.rb
89
+ - test/db_connection_test.rb
90
+ - test/db_test.rb
91
+ - test/grid_file_system_test.rb
92
+ - test/grid_io_test.rb
93
+ - test/grid_test.rb
94
+ - test/replica_pairs/count_test.rb
95
+ - test/replica_pairs/insert_test.rb
96
+ - test/replica_pairs/pooled_insert_test.rb
97
+ - test/replica_pairs/query_test.rb
98
+ - test/replica_sets/count_test.rb
99
+ - test/replica_sets/insert_test.rb
100
+ - test/replica_sets/pooled_insert_test.rb
101
+ - test/replica_sets/query_test.rb
102
+ - test/slave_connection_test.rb
103
+ - test/support_test.rb
104
+ - test/test_helper.rb
105
+ - test/threading/test_threading_large_pool.rb
106
+ - test/threading_test.rb
107
+ - test/unit/collection_test.rb
108
+ - test/unit/connection_test.rb
109
+ - test/unit/cursor_test.rb
110
+ - test/unit/db_test.rb
76
111
  has_rdoc: true
77
112
  homepage: http://www.mongodb.org
78
113
  licenses: []
@@ -85,23 +120,27 @@ rdoc_options:
85
120
  require_paths:
86
121
  - lib
87
122
  required_ruby_version: !ruby/object:Gem::Requirement
123
+ none: false
88
124
  requirements:
89
125
  - - ">="
90
126
  - !ruby/object:Gem::Version
127
+ hash: 3
91
128
  segments:
92
129
  - 0
93
130
  version: "0"
94
131
  required_rubygems_version: !ruby/object:Gem::Requirement
132
+ none: false
95
133
  requirements:
96
134
  - - ">="
97
135
  - !ruby/object:Gem::Version
136
+ hash: 3
98
137
  segments:
99
138
  - 0
100
139
  version: "0"
101
140
  requirements: []
102
141
 
103
142
  rubyforge_project:
104
- rubygems_version: 1.3.6
143
+ rubygems_version: 1.3.7
105
144
  signing_key:
106
145
  specification_version: 3
107
146
  summary: Ruby driver for the MongoDB
@@ -121,10 +160,14 @@ test_files:
121
160
  - test/grid_file_system_test.rb
122
161
  - test/grid_io_test.rb
123
162
  - test/grid_test.rb
124
- - test/replica/count_test.rb
125
- - test/replica/insert_test.rb
126
- - test/replica/pooled_insert_test.rb
127
- - test/replica/query_test.rb
163
+ - test/replica_pairs/count_test.rb
164
+ - test/replica_pairs/insert_test.rb
165
+ - test/replica_pairs/pooled_insert_test.rb
166
+ - test/replica_pairs/query_test.rb
167
+ - test/replica_sets/count_test.rb
168
+ - test/replica_sets/insert_test.rb
169
+ - test/replica_sets/pooled_insert_test.rb
170
+ - test/replica_sets/query_test.rb
128
171
  - test/slave_connection_test.rb
129
172
  - test/support_test.rb
130
173
  - test/test_helper.rb