const ( DefStartupGracePeriod = time.Second * 15 DefMembershipSampleInterval = time.Second DefLeaderAliveThreshold = time.Second * 10 DefLeaderElectionDuration = time.Second * 5 )
type ElectionConfig struct { StartupGracePeriod time.Duration MembershipSampleInterval time.Duration LeaderAliveThreshold time.Duration LeaderElectionDuration time.Duration }
LeaderElectionAdapter is used by the leader election module to send and receive messages and to get membership information
type LeaderElectionAdapter interface { // Gossip gossips a message to other peers Gossip(Msg) // Accept returns a channel that emits messages Accept() <-chan Msg // CreateProposalMessage CreateMessage(isDeclaration bool) Msg // Peers returns a list of peers considered alive Peers() []Peer // ReportMetrics sends a report to the metrics server about a leadership status ReportMetrics(isLeader bool) }
func NewAdapter(gossip gossip, pkiid common.PKIidType, channel common.ChainID, metrics *metrics.ElectionMetrics) LeaderElectionAdapter
NewAdapter creates new leader election adapter
LeaderElectionService is the object that runs the leader election algorithm
type LeaderElectionService interface { // IsLeader returns whether this peer is a leader or not IsLeader() bool // Stop stops the LeaderElectionService Stop() // Yield relinquishes the leadership until a new leader is elected, // or a timeout expires Yield() }
func NewLeaderElectionService(adapter LeaderElectionAdapter, id string, callback leadershipCallback, config ElectionConfig) LeaderElectionService
NewLeaderElectionService returns a new LeaderElectionService
Msg describes a message sent from a remote peer
type Msg interface { // SenderID returns the ID of the peer sent the message SenderID() peerID // IsProposal returns whether this message is a leadership proposal IsProposal() bool // IsDeclaration returns whether this message is a leadership declaration IsDeclaration() bool }
Peer describes a remote peer
type Peer interface {
// ID returns the ID of the peer
ID() peerID
}