class OnlineMigrations::BackgroundMigrations::AdvisoryLock
@private
Constants
- SALT
Attributes
connection[R]
name[R]
Public Class Methods
new(name:, connection: ActiveRecord::Base.connection)
click to toggle source
# File lib/online_migrations/background_migrations/advisory_lock.rb, line 11 def initialize(name:, connection: ActiveRecord::Base.connection) @name = name @connection = connection end
Public Instance Methods
active?()
click to toggle source
# File lib/online_migrations/background_migrations/advisory_lock.rb, line 36 def active? objid = lock_key & 0xffffffff classid = (lock_key & (0xffffffff << 32)) >> 32 active = connection.select_value(<<-SQL.strip_heredoc) SELECT granted FROM pg_locks WHERE locktype = 'advisory' AND pid = pg_backend_pid() AND mode = 'ExclusiveLock' AND classid = #{classid} AND objid = #{objid} SQL Utils.to_bool(active) end
try_lock()
click to toggle source
# File lib/online_migrations/background_migrations/advisory_lock.rb, line 16 def try_lock locked = connection.select_value("SELECT pg_try_advisory_lock(#{lock_key})") Utils.to_bool(locked) end
unlock()
click to toggle source
# File lib/online_migrations/background_migrations/advisory_lock.rb, line 21 def unlock connection.select_value("SELECT pg_advisory_unlock(#{lock_key})") end
with_lock() { || ... }
click to toggle source
Runs the given block if an advisory lock is able to be acquired.
# File lib/online_migrations/background_migrations/advisory_lock.rb, line 26 def with_lock if try_lock begin yield ensure unlock end end end
Private Instance Methods
lock_key()
click to toggle source
# File lib/online_migrations/background_migrations/advisory_lock.rb, line 56 def lock_key name_hash = Zlib.crc32(name) SALT * name_hash end