Skip to content

Commit

Permalink
Add synchronous refresh; fix connection leak.
Browse files Browse the repository at this point in the history
  • Loading branch information
banker committed Sep 15, 2011
1 parent 83eaa4d commit b910e3e
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 31 deletions.
45 changes: 23 additions & 22 deletions lib/mongo/repl_set_connection.rb
Expand Up @@ -200,28 +200,21 @@ def update_config(manager)
@max_bson_size = manager.max_bson_size
end

# If ismaster doesn't match our current view
# then create a new PoolManager, passing in our
# existing view. It should be able to do the diff.
# Then take out the connection lock and replace
# our current values.
def refresh
return if !connected?

if !Thread.current[:background]
Thread.current[:background] = PoolManager.new(self, @seeds)
end

background_manager = Thread.current[:background]
# Refresh the current replica set configuration.
def refresh(opts={})
return false if !connected?

# Return if another thread is already in the process of refreshing.
return if sync_exclusive?

sync_synchronize(:EX) do
log(:debug, "Refreshing...")
background_manager.connect
update_config(background_manager)
@background_manager ||= PoolManager.new(self, @seeds)
@background_manager.connect
update_config(@background_manager)
end

return true
end

def connected?
Expand Down Expand Up @@ -281,7 +274,7 @@ def close

if @nodes
@nodes.each do |member|
member.disconnect
member.close
end
end

Expand Down Expand Up @@ -339,13 +332,16 @@ def logout_pools(db)
private

def initiate_auto_refresh
return unless @auto_refresh
return if @refresh_thread && @refresh_thread.alive?
@refresh_thread = Thread.new do
while true do
sleep(@refresh_interval)
refresh
if @auto_refresh
return if @refresh_thread && @refresh_thread.alive?
@refresh_thread = Thread.new do
while true do
sleep(@refresh_interval)
refresh
end
end
else
@last_refresh = Time.now
end
end

Expand Down Expand Up @@ -444,6 +440,11 @@ def checkin(socket)
socket.close
end
end

if !@auto_refresh &&
((Time.now - @last_refresh) > @refresh_interval)
refresh
end
end
end
end
6 changes: 1 addition & 5 deletions lib/mongo/util/node.rb
Expand Up @@ -20,10 +20,6 @@ def eql?(other)
end
alias :== :eql?

def close
self.socket.close if self.socket
end

def host_string
address
end
Expand Down Expand Up @@ -60,7 +56,7 @@ def connect
self.socket = socket
end

def disconnect
def close
if self.socket
self.socket.close
self.socket = nil
Expand Down
3 changes: 2 additions & 1 deletion lib/mongo/util/pool.rb
Expand Up @@ -53,7 +53,7 @@ def initialize(connection, host, port, opts={})

def close
@connection_mutex.synchronize do
(@sockets - @checked_out).each do |sock|
@sockets.each do |sock|
begin
sock.close
rescue IOError => ex
Expand Down Expand Up @@ -140,6 +140,7 @@ def checkout_new_socket
rescue => ex
socket.close if socket
raise ConnectionFailure, "Failed to connect to host #{@host} and port #{@port}: #{ex}"
@node.close if @node
end

# If any saved authentications exist, we want to apply those
Expand Down
24 changes: 21 additions & 3 deletions lib/mongo/util/pool_manager.rb
Expand Up @@ -9,23 +9,36 @@ def initialize(connection, seeds)
@connection = connection
@seeds = seeds
@refresh_node = nil
@previously_connected = false
end

def inspect
"<Mongo::PoolManager:0x#{self.object_id.to_s(16)} @seeds=#{@seeds}>"
end

def connect
if @previously_connected
close
end

initialize_data
members = connect_to_members
initialize_pools(members)
update_seed_list(members)

@members = members
@previously_connected = true
end

private
def healthy?
if !@refresh_node || !refresh_node.set_config
return false
end

def initialize_data
#if refresh_node.node_list
end

def close
begin
if @primary_pool
@primary_pool.close
Expand All @@ -45,7 +58,11 @@ def initialize_data

rescue ConnectionFailure
end
end

private

def initialize_data
@primary = nil
@primary_pool = nil
@read_pool = nil
Expand All @@ -71,6 +88,7 @@ def connect_to_members
members << node
end
end
seed.close

if members.empty?
raise ConnectionFailure, "Failed to connect to any given member."
Expand Down Expand Up @@ -174,7 +192,7 @@ def get_valid_seed_node
if node.connect && node.set_config
return node
else
node.disconnect
node.close
end
end

Expand Down

0 comments on commit b910e3e

Please sign in to comment.