class GalacticSenate::Delegation

Constants

KEY
RAND_INTERVAL
SENATOR_INTERVAL
SUPREME_CHANCELLOR_INTERVAL

Public Class Methods

instance() click to toggle source
# File lib/galactic-senate/delegation.rb, line 16
def self.instance
  @galactic_senate ||= GalacticSenate::Delegation.new
end
leader?()
Alias for: supreme_chancellor?
new() click to toggle source
# File lib/galactic-senate/delegation.rb, line 11
def initialize
  @running = true
  @supreme_chancellor_timeout = 0
end
supreme_chancellor?() click to toggle source
# File lib/galactic-senate/delegation.rb, line 21
def self.supreme_chancellor?
  instance.supreme_chancellor?
end
Also aliased as: leader?

Public Instance Methods

debate() click to toggle source
# File lib/galactic-senate/delegation.rb, line 34
def debate

  vote_of_no_confidence

  timer_task = Concurrent::TimerTask.new(execution_interval: interval) do |task|

    begin
      vote_now
      task.execution_interval = interval
    rescue => e
      GalacticSenate.config.logger.error "GalacticSenate::Delegation.debate - #{e.message}"
      GalacticSenate.config.logger.error "GalacticSenate::Delegation.debate - #{e.backtrace.inspect}"
    end
  end

  timer_task.execute

end
fire_event(event, val = nil) click to toggle source
# File lib/galactic-senate/delegation.rb, line 75
def fire_event(event, val = nil)
  GalacticSenate.config.events[event].each do |block|
    begin
      block.call(val)
    rescue => e
      GalacticSenate.config.logger.error "GalacticSenate::Delegation.fire_event - #{e.message}"
      GalacticSenate.config.logger.error "GalacticSenate::Delegation.fire_event - #{e.backtrace.inspect}"
    end
  end
end
interval() click to toggle source
# File lib/galactic-senate/delegation.rb, line 86
def interval
  supreme_chancellor? ? SUPREME_CHANCELLOR_INTERVAL : SENATOR_INTERVAL
end
leader?()
Alias for: supreme_chancellor?
supreme_chancellor?() click to toggle source
# File lib/galactic-senate/delegation.rb, line 25
def supreme_chancellor?
  ( @supreme_chancellor_timeout > Time.now.to_f )
end
Also aliased as: leader?
vote_now() click to toggle source
# File lib/galactic-senate/delegation.rb, line 53
def vote_now
  if supreme_chancellor?
    if update_supreme_chancellor
      @supreme_chancellor_timeout = Time.now.to_f + SENATOR_INTERVAL
    else
      @supreme_chancellor_timeout = 0
      fire_event(:ousted)
    end
  else
    vote_of_no_confidence
  end
end
vote_of_no_confidence() click to toggle source
# File lib/galactic-senate/delegation.rb, line 66
def vote_of_no_confidence
  if elect_me_supreme_chancellor?
    @supreme_chancellor_timeout = Time.now.to_f + SENATOR_INTERVAL
    fire_event(:elected)
  else
    @supreme_chancellor_timeout = 0
  end
end

Private Instance Methods

delete_supreme_chancellor() click to toggle source
# File lib/galactic-senate/delegation.rb, line 96
def delete_supreme_chancellor
  GalacticSenate.config.redis.call("del",KEY)
end
elect_me_supreme_chancellor?() click to toggle source
# File lib/galactic-senate/delegation.rb, line 104
def elect_me_supreme_chancellor?
  val = GalacticSenate.config.redis.set(KEY, GalacticSenate.whoami, ex: SENATOR_INTERVAL, nx: true)
  val
end
expire_supreme_chancellor() click to toggle source
# File lib/galactic-senate/delegation.rb, line 100
def expire_supreme_chancellor
  GalacticSenate.config.redis.call("expire",KEY, SENATOR_INTERVAL)
end
get_supreme_chancellor() click to toggle source
# File lib/galactic-senate/delegation.rb, line 92
def get_supreme_chancellor
  GalacticSenate.config.redis.call("get",KEY)
end
update_supreme_chancellor() click to toggle source
# File lib/galactic-senate/delegation.rb, line 109
def update_supreme_chancellor
  ( get_supreme_chancellor == GalacticSenate.whoami ? expire_supreme_chancellor : 0 ) != 0
end