Module: Legion::Leader

Defined in:
lib/legion/leader.rb

Class Method Summary collapse

Class Method Details

.elect(role, ttl: 30) ⇒ Object



9
10
11
12
13
14
15
16
17
# File 'lib/legion/leader.rb', line 9

def elect(role, ttl: 30)
  ttl_ms = ttl * 1000
  token = Legion::Lock.acquire("leader:#{role}", ttl: ttl_ms)
  return nil unless token

  @leaders ||= {}
  @leaders[role.to_sym] = { token: token, ttl_ms: ttl_ms }
  token
end

.leader?(role) ⇒ Boolean

Returns:

  • (Boolean)


19
20
21
22
23
# File 'lib/legion/leader.rb', line 19

def leader?(role)
  return false unless @leaders&.dig(role.to_sym, :token)

  Legion::Lock.locked?("leader:#{role}")
end

.reset!Object



43
44
45
46
47
48
# File 'lib/legion/leader.rb', line 43

def reset!
  @leaders&.each_key { |role| resign(role) }
  @leaders = {}
  @renewals&.each_value(&:shutdown)
  @renewals = {}
end

.resign(role) ⇒ Object



25
26
27
28
29
30
31
# File 'lib/legion/leader.rb', line 25

def resign(role)
  return false unless @leaders&.dig(role.to_sym)

  entry = @leaders.delete(role.to_sym)
  stop_renewal(role)
  Legion::Lock.release("leader:#{role}", entry[:token])
end

.with_leadership(role, ttl: 30) ⇒ Object



33
34
35
36
37
38
39
40
41
# File 'lib/legion/leader.rb', line 33

def with_leadership(role, ttl: 30)
  token = elect(role, ttl: ttl)
  raise Legion::Lock::NotAcquired, "could not elect leader for: #{role}" unless token

  start_renewal(role, ttl)
  yield
ensure
  resign(role)
end