Class: Kaal::Internal::Sequel::PostgresBackend
Overview
PostgreSQL advisory-lock engine backed by Sequel.
Constant Summary
collapse
- SIGNED_64_MAX =
9_223_372_036_854_775_807
- UNSIGNED_64_RANGE =
18_446_744_073_709_551_616
Class Method Summary
collapse
Instance Method Summary
collapse
#log_dispatch_attempt, #parse_lock_key, parse_lock_key
#with_lock
Constructor Details
#initialize(database, namespace: nil) ⇒ PostgresBackend
Returns a new instance of PostgresBackend.
21
22
23
24
25
|
# File 'lib/kaal/internal/sequel/postgres_backend.rb', line 21
def initialize(database, namespace: nil)
super()
@database = Kaal::Persistence::Database.new(database)
@namespace = namespace
end
|
Class Method Details
.calculate_lock_id(key) ⇒ Object
53
54
55
56
|
# File 'lib/kaal/internal/sequel/postgres_backend.rb', line 53
def self.calculate_lock_id(key)
hash = Digest::MD5.digest(key).unpack1('Q>')
hash > SIGNED_64_MAX ? hash - UNSIGNED_64_RANGE : hash
end
|
Instance Method Details
#acquire(key, _ttl) ⇒ Object
39
40
41
42
43
44
45
|
# File 'lib/kaal/internal/sequel/postgres_backend.rb', line 39
def acquire(key, _ttl)
acquired = scalar('SELECT pg_try_advisory_lock(?) AS acquired', self.class.calculate_lock_id(key)) == true
log_dispatch_attempt(key) if acquired
acquired
rescue StandardError => e
raise Kaal::Backend::LockAdapterError, "PostgreSQL acquire failed for #{key}: #{e.message}"
end
|
#definition_registry ⇒ Object
31
32
33
|
# File 'lib/kaal/internal/sequel/postgres_backend.rb', line 31
def definition_registry
@definition_registry ||= Kaal::Definition::DatabaseEngine.new(database: @database.connection)
end
|
#delayed_store ⇒ Object
35
36
37
|
# File 'lib/kaal/internal/sequel/postgres_backend.rb', line 35
def delayed_store
@delayed_store ||= Kaal::DelayedJob::DatabaseEngine.new(database: @database.connection, use_skip_locked: true)
end
|
#dispatch_registry ⇒ Object
27
28
29
|
# File 'lib/kaal/internal/sequel/postgres_backend.rb', line 27
def dispatch_registry
@dispatch_registry ||= Kaal::Dispatch::DatabaseEngine.new(database: @database.connection, namespace: resolved_namespace)
end
|
#release(key) ⇒ Object
47
48
49
50
51
|
# File 'lib/kaal/internal/sequel/postgres_backend.rb', line 47
def release(key)
scalar('SELECT pg_advisory_unlock(?) AS released', self.class.calculate_lock_id(key)) == true
rescue StandardError => e
raise Kaal::Backend::LockAdapterError, "PostgreSQL release failed for #{key}: #{e.message}"
end
|