Ravn::Net::Broker::

Election module

Adds election functionality.

Attributes

leadership R

The leadership Hash that tracks which node is the leader, keyed by group.

leadership_resolutions R

A Hash of Futures keyed by group name that resolve to true or false to indicate whether this Broker is the leader of the group.

Public Class Methods

new( * )

Override the initializer to add instance data for elections.

# File lib/ravn/net/broker/election.rb, line 22
def initialize( * )
        @leadership = {}
        @leadership_resolutions = {}

        super
end
prepended( mod )

Inclusion hook – check to be sure election is actually supported.

# File lib/ravn/net/broker/election.rb, line 10
def self::prepended( mod )
        raise NotImplementedError,
                "this system's libzyre is too old for election support" unless
                        Zyre.has_draft_apis?

        Ravn::Net::Broker.log.debug "adding election functionality to brokers"

        super
end

Public Instance Methods

election_finished?( group_name )

Returns true if an election has happened in the group with the given group_name.

# File lib/ravn/net/broker/election.rb, line 87
def election_finished?( group_name )
        return self.leadership.key?( group_name )
end
handle_leader_zre_event( zre_event )

Override the leader event handler to register the leader of groups.

# File lib/ravn/net/broker/election.rb, line 70
def handle_leader_zre_event( zre_event )
        leader = zre_event.peer_uuid
        groupname = zre_event.group

        self.log.info "leader of '%s' has been elected: %s" % [ groupname, leader ]
        self.leadership[ groupname ] = leader
        unless self.leadership_resolutions[ groupname ].resolved?
                # :TODO: Do something to check to see if it's still the same node?
                self.leadership_resolutions[ groupname ].fulfill( leader == self.node.uuid )
        end

        super
end
leader_of?( group_name )

Returns true if the receiving node is the elected leader in the group with the given group_name.

# File lib/ravn/net/broker/election.rb, line 94
def leader_of?( group_name )
        return false unless self.election_finished?( group_name )
        return self.leadership[ group_name ] == self.node.uuid
end
set_options( **options )

Set up leadership in groups which are designated in an elect_leader option.

# File lib/ravn/net/broker/election.rb, line 42
def set_options( **options )
        leader_groups = Array( options[:elect_leader] )
        options[:groups] |= leader_groups

        super

        leader_groups.each do |group|
                self.log.info "setting up %s group to elect a leader" % [ group ]
                self.leadership_resolutions[ group ] = Concurrent::Promises.resolvable_future
                self.node.set_contest_in_group( group )
        end
end
stop()

Override to reject any pending leadership resolution futures.

# File lib/ravn/net/broker/election.rb, line 57
def stop
        self.log.debug "Checking for unresolved leadership futures..."
        self.leadership_resolutions.each do |group, promise|
                next if promise.resolved?
                self.log.warn "Rejecting leadership resolution for %s" % [ group ]
                promise.reject( "Broker is shutting down." )
        end

        super
end