Module: Legion::Leader
- Defined in:
- lib/legion/leader.rb
Class Method Summary collapse
- .elect(role, ttl: 30) ⇒ Object
- .leader?(role) ⇒ Boolean
- .reset! ⇒ Object
- .resign(role) ⇒ Object
- .with_leadership(role, ttl: 30) ⇒ Object
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
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 |