class MailManager::Lock
Public Class Methods
with_lock(name, timeout=5, max_attempts=1) { |lock| ... }
click to toggle source
# File lib/mail_manager/lock.rb, line 5 def self.with_lock(name, timeout=5, max_attempts=1, &block) ActiveRecord::Base.connection_pool.with_connection do |connection| begin lock = get_lock(connection,name,timeout,max_attempts) raise MailManager::LockException.new("Failed to obtain lock #{name} in #{timeout} secs") unless lock yield lock ensure is_released = release_lock(connection,name) Rails.logger.warn "Warning: lock #{name} not released!" unless is_released.values.include?('1') end end end
Private Class Methods
get_lock(connection,name,timeout,max_attempts)
click to toggle source
# File lib/mail_manager/lock.rb, line 24 def self.get_lock(connection,name,timeout,max_attempts) attempts = 0 lock = {} while !lock.values.include?('1') and attempts < max_attempts do attempts += 1 lock = connection.select_one("SELECT GET_LOCK('#{name_prefix}-#{name}',#{timeout})") end lock.values.detect{|value| value.to_s.eql?('1')} end
name_prefix()
click to toggle source
# File lib/mail_manager/lock.rb, line 20 def self.name_prefix "#{MailManager.site_url}-#{Rails.env}" end
release_lock(connection,name)
click to toggle source
# File lib/mail_manager/lock.rb, line 34 def self.release_lock(connection,name) connection.select_one("SELECT RELEASE_LOCK('#{name_prefix}-#{name}')") end