Skip to content

Commit

Permalink
Merge "Enforce timeout on mongodb operations" into services-r6
Browse files Browse the repository at this point in the history
  • Loading branch information
anferneeg authored and testazuretrain committed Nov 3, 2011
2 parents 9375035 + 7a93c55 commit d61f187
Showing 1 changed file with 25 additions and 10 deletions.
35 changes: 25 additions & 10 deletions mongodb/lib/mongodb_service/mongodb_node.rb
Expand Up @@ -34,6 +34,10 @@ class VCAP::Services::MongoDB::Node
# FIXME only support rw currently
BIND_OPT = 'rw'

# Timeout for mongo client operations, node cannot be blocked on any mongo instances.
# Default value is 2 seconds
MONGO_TIMEOUT = 2

class ProvisionedService
include DataMapper::Resource
property :name, String, :key => true
Expand Down Expand Up @@ -525,9 +529,11 @@ def connect_and_auth(instance)
@connection_mutex.synchronize do
conn = @connection_pool[instance.port]
unless conn and conn.connected?
conn = Mongo::Connection.new('127.0.0.1', instance.port)
auth = conn.db('admin').authenticate(instance.admin, instance.adminpass)
raise "Authentication failed, name: #{instance.name}" unless auth
Timeout::timeout(MONGO_TIMEOUT) do
conn = Mongo::Connection.new('127.0.0.1', instance.port)
auth = conn.db('admin').authenticate(instance.admin, instance.adminpass)
raise "Authentication failed, name: #{instance.name}" unless auth
end
@connection_pool[instance.port] = conn
@logger.debug("Connected to #{instance.name}, port No: #{instance.port}")
end
Expand Down Expand Up @@ -655,20 +661,27 @@ def mongodb_add_admin(options)

def mongodb_add_user(instance, username, password, bind_opts=nil)
conn = connect_and_auth(instance)
conn.db(instance.db).add_user(username, password)
Timeout::timeout(MONGO_TIMEOUT) do
conn.db(instance.db).add_user(username, password)
end
end

def mongodb_remove_user(instance, username)
conn = connect_and_auth(instance)
conn.db(instance.db).remove_user(username)
Timeout::timeout(MONGO_TIMEOUT) do
conn.db(instance.db).remove_user(username)
end
end

def mongodb_overall_stats(instance)
conn = connect_and_auth(instance)
# The following command is not documented in mongo's official doc.
# But it works like calling db.serverStatus from client. And 10gen support has
# confirmed it's safe to call it in such way.
conn.db('admin').command({:serverStatus => 1})

Timeout::timeout(MONGO_TIMEOUT) do
# The following command is not documented in mongo's official doc.
# But it works like calling db.serverStatus from client. And 10gen support has
# confirmed it's safe to call it in such way.
conn.db('admin').command({:serverStatus => 1})
end
rescue => e
warning = "Failed mongodb_overall_stats: #{e.message}, instance: #{instance.name}"
@logger.warn(warning)
Expand All @@ -677,7 +690,9 @@ def mongodb_overall_stats(instance)

def mongodb_db_stats(instance)
conn = connect_and_auth(instance)
conn.db(instance.db).stats()
Timeout::timeout(MONGO_TIMEOUT) do
conn.db(instance.db).stats()
end
rescue => e
warning = "Failed mongodb_db_stats: #{e.message}, instance: #{instance.name}"
@logger.warn(warning)
Expand Down

0 comments on commit d61f187

Please sign in to comment.