Skip to content

Commit

Permalink
RUBY-444 keep multiple replica set connections separate
Browse files Browse the repository at this point in the history
  • Loading branch information
banker committed May 25, 2012
1 parent 3e04550 commit 5591e3d
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 9 deletions.
25 changes: 16 additions & 9 deletions lib/mongo/repl_set_connection.rb
Expand Up @@ -25,7 +25,7 @@ class ReplSetConnection < Connection
:read_secondary, :rs_name, :name] :read_secondary, :rs_name, :name]


attr_reader :replica_set_name, :seeds, :refresh_interval, :refresh_mode, attr_reader :replica_set_name, :seeds, :refresh_interval, :refresh_mode,
:refresh_version :refresh_version, :manager


# Create a connection to a MongoDB replica set. # Create a connection to a MongoDB replica set.
# #
Expand Down Expand Up @@ -149,8 +149,9 @@ def connect


discovered_seeds = @manager ? @manager.seeds : [] discovered_seeds = @manager ? @manager.seeds : []
@manager = PoolManager.new(self, discovered_seeds) @manager = PoolManager.new(self, discovered_seeds)


Thread.current[:manager] = @manager Thread.current[:managers] ||= Hash.new
Thread.current[:managers][self] = @manager


@manager.connect @manager.connect
@refresh_version += 1 @refresh_version += 1
Expand Down Expand Up @@ -203,7 +204,7 @@ def hard_refresh!
new_manager = PoolManager.new(self, discovered_seeds | @seeds) new_manager = PoolManager.new(self, discovered_seeds | @seeds)
new_manager.connect new_manager.connect


Thread.current[:manager] = new_manager Thread.current[:managers][self] = new_manager


# TODO: make sure that connect has succeeded # TODO: make sure that connect has succeeded
@old_managers << @manager @old_managers << @manager
Expand Down Expand Up @@ -263,6 +264,12 @@ def close(opts={})
else else
@manager.close if @manager @manager.close if @manager
end end

# Clear the reference to this object.
if Thread.current[:managers]
Thread.current[:managers].delete(self)
end

@connected = false @connected = false
end end


Expand Down Expand Up @@ -395,10 +402,10 @@ def close_socket(socket)
end end


def get_socket_from_pool(pool_type) def get_socket_from_pool(pool_type)
if Thread.current[:manager] != @manager if Thread.current[:managers][self] != @manager
Thread.current[:manager] = @manager Thread.current[:managers][self] = @manager
end end

pool = case pool_type pool = case pool_type
when :primary when :primary
primary_pool primary_pool
Expand All @@ -417,9 +424,9 @@ def get_socket_from_pool(pool_type)
return nil return nil
end end
end end

def local_manager def local_manager
Thread.current[:manager] Thread.current[:managers][self]
end end


def arbiters def arbiters
Expand Down
10 changes: 10 additions & 0 deletions test/replica_sets/basic_test.rb
Expand Up @@ -25,6 +25,16 @@ def test_connect
assert @conn.connected? assert @conn.connected?
end end


def test_multiple_concurrent_replica_set_connection
@conn1 = ReplSetConnection.new(build_seeds(3), :name => @rs.name)
@conn2 = ReplSetConnection.new(build_seeds(3), :name => @rs.name)
assert @conn1.connected?
assert @conn2.connected?

assert @conn1.manager != @conn2.manager
assert @conn1.local_manager != @conn2.local_manager
end

def test_cache_original_seed_nodes def test_cache_original_seed_nodes
seeds = build_seeds(3) << "#{@rs.host}:19356" seeds = build_seeds(3) << "#{@rs.host}:19356"
@conn = ReplSetConnection.new(seeds, :name => @rs.name) @conn = ReplSetConnection.new(seeds, :name => @rs.name)
Expand Down

0 comments on commit 5591e3d

Please sign in to comment.