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
}