Class: Pgbus::UniquenessKey

Inherits:
BusRecord
  • Object
show all
Defined in:
app/models/pgbus/uniqueness_key.rb

Class Method Summary collapse

Class Method Details

.acquire!(lock_key, queue_name:, msg_id:) ⇒ Object

Atomically try to acquire a uniqueness lock via INSERT … ON CONFLICT. PostgreSQL’s unique index on lock_key guarantees at most one caller wins. Returns true if acquired (row inserted), false if already locked.



11
12
13
14
15
16
17
# File 'app/models/pgbus/uniqueness_key.rb', line 11

def self.acquire!(lock_key, queue_name:, msg_id:) # rubocop:disable Naming/PredicateMethod
  connection.exec_query(
    "INSERT INTO #{table_name} (lock_key, queue_name, msg_id) " \
    "VALUES ($1, $2, $3) ON CONFLICT (lock_key) DO NOTHING RETURNING lock_key",
    "UniquenessKey Acquire", [lock_key, queue_name, msg_id]
  ).rows.any?
end

.locked?(lock_key) ⇒ Boolean

Check if a key is currently locked.

Returns:

  • (Boolean)


28
29
30
31
32
33
34
# File 'app/models/pgbus/uniqueness_key.rb', line 28

def self.locked?(lock_key)
  result = connection.select_value(
    "SELECT 1 FROM #{table_name} WHERE lock_key = $1 LIMIT 1",
    "UniquenessKey Check", [lock_key]
  )
  !result.nil?
end

.release!(lock_key) ⇒ Object

Release a uniqueness lock after job completion or DLQ.



20
21
22
23
24
25
# File 'app/models/pgbus/uniqueness_key.rb', line 20

def self.release!(lock_key)
  connection.exec_delete(
    "DELETE FROM #{table_name} WHERE lock_key = $1",
    "UniquenessKey Release", [lock_key]
  )
end