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