Class: Kaal::Internal::ActiveRecord::PostgresBackend

Inherits:
Backend::Adapter show all
Includes:
Backend::DispatchLogging
Defined in:
lib/kaal/internal/active_record/postgres_backend.rb

Overview

PostgreSQL advisory-lock engine paired with Active Record registries.

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

Methods included from Backend::DispatchLogging

#log_dispatch_attempt, #parse_lock_key, parse_lock_key

Methods inherited from Backend::Adapter

#with_lock

Constructor Details

#initialize(connection = nil, dispatch_registry: nil, definition_registry: nil, namespace: nil) ⇒ PostgresBackend

Returns a new instance of PostgresBackend.



19
20
21
22
23
24
25
# File 'lib/kaal/internal/active_record/postgres_backend.rb', line 19

def initialize(connection = nil, dispatch_registry: nil, definition_registry: nil, namespace: nil)
  super()
  ConnectionSupport.configure!(connection)
  @dispatch_registry = dispatch_registry
  @definition_registry = definition_registry
  @namespace = namespace
end

Class Method Details

.calculate_lock_id(key) ⇒ Object



49
50
51
52
# File 'lib/kaal/internal/active_record/postgres_backend.rb', line 49

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



35
36
37
38
39
40
41
# File 'lib/kaal/internal/active_record/postgres_backend.rb', line 35

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_registryObject



31
32
33
# File 'lib/kaal/internal/active_record/postgres_backend.rb', line 31

def definition_registry
  @definition_registry ||= DefinitionRegistry.new
end

#dispatch_registryObject



27
28
29
# File 'lib/kaal/internal/active_record/postgres_backend.rb', line 27

def dispatch_registry
  @dispatch_registry ||= DispatchRegistry.new(namespace: resolved_namespace)
end

#release(key) ⇒ Object



43
44
45
46
47
# File 'lib/kaal/internal/active_record/postgres_backend.rb', line 43

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