Documentation
¶
Overview ¶
Package raft contains Raft consensus for WebMesh.
Index ¶
Constants ¶
const ( RaftListenAddressEnvVar = "RAFT_LISTEN_ADDRESS" DataDirEnvVar = "RAFT_DATA_DIR" InMemoryEnvVar = "RAFT_IN_MEMORY" ConnectionPoolCountEnvVar = "RAFT_CONNECTION_POOL_COUNT" ConnectionTimeoutEnvVar = "RAFT_CONNECTION_TIMEOUT" HeartbeatTimeoutEnvVar = "RAFT_HEARTBEAT_TIMEOUT" ElectionTimeoutEnvVar = "RAFT_ELECTION_TIMEOUT" ApplyTimeoutEnvVar = "RAFT_APPLY_TIMEOUT" CommitTimeoutEnvVar = "RAFT_COMMIT_TIMEOUT" MaxAppendEntriesEnvVar = "RAFT_MAX_APPEND_ENTRIES" LeaderLeaseTimeoutEnvVar = "RAFT_LEADER_LEASE_TIMEOUT" SnapshotIntervalEnvVar = "RAFT_SNAPSHOT_INTERVAL" SnapshotThresholdEnvVar = "RAFT_SNAPSHOT_THRESHOLD" SnapshotRetentionEnvVar = "RAFT_SNAPSHOT_RETENTION" ObserverChanBufferEnvVar = "RAFT_OBSERVER_CHAN_BUFFER" RaftLogLevelEnvVar = "RAFT_LOG_LEVEL" RaftPreferIPv6EnvVar = "RAFT_PREFER_IPV6" LeaveOnShutdownEnvVar = "RAFT_LEAVE_ON_SHUTDOWN" StartupTimeoutEnvVar = "RAFT_STARTUP_TIMEOUT" // DataStoragePath is the path to the data storage directory. DataStoragePath = "data" // DefaultListenPort is the default raft listen port DefaultListenPort = 9443 )
const ( Follower = raft.Follower Candidate = raft.Candidate Leader = raft.Leader Shutdown = raft.Shutdown )
Raft states.
const ( Voter = raft.Voter Nonvoter = raft.Nonvoter )
Raft suffrage states.
Variables ¶
var ( // ErrStarted is returned when the Raft node is already started. ErrStarted = errors.New("raft node already started") // ErrClosed is returned when the Raft node is already closed. ErrClosed = errors.New("raft node is closed") // ErrNoLeader is returned when there is no leader. ErrNoLeader = errors.New("no leader") // ErrAlreadyBootstrapped is returned when the Raft node is already bootstrapped. ErrAlreadyBootstrapped = raft.ErrCantBootstrap // ErrNotLeader is returned when the Raft node is not the leader. ErrNotLeader = raft.ErrNotLeader // ErrNotVoter is returned when the Raft node is not a voter. ErrNotVoter = raft.ErrNotVoter )
var ErrNotRaftMember = errors.New("not a raft member")
ErrNotRaftMember is returned for methods that are only valid on raft members.
Functions ¶
This section is empty.
Types ¶
type BootstrapOptions ¶
type BootstrapOptions struct {
// AdvertiseAddress is the address to advertise to the other
// bootstrap nodes. Defaults to localhost:listen_port if empty.
AdvertiseAddress string
// Servers are the Raft servers to bootstrap with.
// Keys are the node IDs, and values are the Raft addresses.
Servers map[string]string
// OnBootstrapped is called when the cluster is bootstrapped.
OnBootstrapped func(isLeader bool) error
}
BootstrapOptions are options for bootstrapping a Raft node.
type LeaderObservation ¶
type LeaderObservation = raft.LeaderObservation
LeaderObservation is an alias for raft.LeaderObservation.
type MonotonicLogStore ¶
MonotonicLogStore is a LogStore that is monotonic.
func (*MonotonicLogStore) IsMonotonic ¶
func (m *MonotonicLogStore) IsMonotonic() bool
IsMonotonic returns true if the log store is monotonic.
type Observation ¶
type Observation = raft.Observation
Observation is an alias for raft.Observation.
type Options ¶
type Options struct {
// ListenAddress is the address to listen on for raft.
ListenAddress string `` /* 135-byte string literal not displayed */
// DataDir is the directory to store data in.
DataDir string `json:"data-dir,omitempty" yaml:"data-dir,omitempty" toml:"data-dir,omitempty" mapstructure:"data-dir,omitempty"`
// InMemory is if the store should be in memory. This should only be used for testing and ephemeral nodes.
InMemory bool `json:"in-memory,omitempty" yaml:"in-memory,omitempty" toml:"in-memory,omitempty" mapstructure:"in-memory,omitempty"`
// ConnectionPoolCount is the number of connections to pool. If 0, no connection pooling is used.
ConnectionPoolCount int `` /* 163-byte string literal not displayed */
// ConnectionTimeout is the timeout for connections.
ConnectionTimeout time.Duration `` /* 151-byte string literal not displayed */
// HeartbeatTimeout is the timeout for heartbeats.
HeartbeatTimeout time.Duration `` /* 147-byte string literal not displayed */
// ElectionTimeout is the timeout for elections.
ElectionTimeout time.Duration `` /* 143-byte string literal not displayed */
// ApplyTimeout is the timeout for applying.
ApplyTimeout time.Duration `` /* 131-byte string literal not displayed */
// CommitTimeout is the timeout for committing.
CommitTimeout time.Duration `` /* 135-byte string literal not displayed */
// MaxAppendEntries is the maximum number of append entries.
MaxAppendEntries int `` /* 151-byte string literal not displayed */
// LeaderLeaseTimeout is the timeout for leader leases.
LeaderLeaseTimeout time.Duration `` /* 159-byte string literal not displayed */
// SnapshotInterval is the interval to take snapshots.
SnapshotInterval time.Duration `` /* 147-byte string literal not displayed */
// SnapshotThreshold is the threshold to take snapshots.
SnapshotThreshold uint64 `` /* 151-byte string literal not displayed */
// SnapshotRetention is the number of snapshots to retain.
SnapshotRetention uint64 `` /* 151-byte string literal not displayed */
// ObserverChanBuffer is the buffer size for the observer channel.
ObserverChanBuffer int `` /* 159-byte string literal not displayed */
// LogLevel is the log level for the raft backend.
LogLevel string `json:"log-level,omitempty" yaml:"log-level,omitempty" toml:"log-level,omitempty" mapstructure:"log-level,omitempty"`
// PreferIPv6 is the prefer IPv6 flag.
PreferIPv6 bool `json:"prefer-ipv6,omitempty" yaml:"prefer-ipv6,omitempty" toml:"prefer-ipv6,omitempty" mapstructure:"prefer-ipv6,omitempty"`
// LeaveOnShutdown is the leave on shutdown flag.
LeaveOnShutdown bool `` /* 147-byte string literal not displayed */
// Below are callbacks used internally or by external packages.
OnApplyLog func(ctx context.Context, term, index uint64, log *v1.RaftLogEntry) `json:"-" yaml:"-" toml:"-" mapstructure:"-"`
OnSnapshotRestore func(ctx context.Context, meta *SnapshotMeta, data io.ReadCloser) `json:"-" yaml:"-" toml:"-" mapstructure:"-"`
OnObservation func(ev Observation) `json:"-" yaml:"-" toml:"-" mapstructure:"-"`
}
Options are the raft options.
func NewOptions ¶
NewOptions returns new raft options with the default values and given listen port. If the port is 0, the default is used.
func (*Options) DataStoragePath ¶
DataStoragePath returns the data directory.
func (*Options) RaftConfig ¶
RaftConfig builds a raft config.
type PeerObservation ¶
type PeerObservation = raft.PeerObservation
PeerObservation is an alias for raft.PeerObservation.
type Raft ¶
type Raft interface {
// Start starts the Raft node.
Start(ctx context.Context, opts *StartOptions) error
// ID returns the node ID.
ID() string
// Bootstrap attempts to bootstrap the Raft cluster. If the cluster is already
// bootstrapped, ErrAlreadyBootstrapped is returned. If the cluster is not
// bootstrapped and bootstrapping succeeds, the optional callback is called
// with isLeader flag set to true if the node is the leader, and false otherwise.
// Any error returned by the callback is returned by Bootstrap.
Bootstrap(ctx context.Context, opts *BootstrapOptions) error
// Storage returns the storage. This is only valid after Start is called.
Storage() storage.MeshStorage
// Configuration returns the current raft configuration.
Configuration() (raft.Configuration, error)
// LastIndex returns the last index sent to the Raft instance.
LastIndex() uint64
// LastAppliedIndex returns the last applied index.
LastAppliedIndex() uint64
// ListenPort returns the listen port.
ListenPort() uint16
// LeaderID returns the leader ID.
LeaderID() (string, error)
// IsLeader returns true if the Raft node is the leader.
IsLeader() bool
// IsVoter returns true if the Raft node is a voter.
IsVoter() bool
// IsObserver returns true if the Raft node is an observer.
IsObserver() bool
// AddNonVoter adds a non-voting node to the cluster with timeout enforced by the context.
AddNonVoter(ctx context.Context, id string, addr string) error
// AddVoter adds a voting node to the cluster with timeout enforced by the context.
AddVoter(ctx context.Context, id string, addr string) error
// DemoteVoter demotes a voting node to a non-voting node with timeout enforced by the context.
DemoteVoter(ctx context.Context, id string) error
// RemoveServer removes a peer from the cluster with timeout enforced by the context.
RemoveServer(ctx context.Context, id string, wait bool) error
// Apply applies a raft log entry.
Apply(ctx context.Context, log *v1.RaftLogEntry) (*v1.RaftApplyResponse, error)
// Snapshot requests a raft snapshot. It returns a reader containing the contents
// and metadata about the snapshot.
Snapshot() (*raft.SnapshotMeta, io.ReadCloser, error)
// Barrier issues a barrier request to the cluster. This is a no-op if the node is not the leader.
Barrier(ctx context.Context, timeout time.Duration) (took time.Duration, err error)
// Stop stops the Raft node.
Stop(ctx context.Context) error
}
Raft is the interface for Raft consensus and storage.
func NewPassthrough ¶ added in v0.2.0
func NewPassthrough(dialer transport.NodeDialer) Raft
NewPassthrough creates a new raft instance that is a no-op for most methods and uses the given Dialer for storage connections.
type SnapshotMeta ¶
type SnapshotMeta = raft.SnapshotMeta
SnapshotMeta is an alias for raft.SnapshotMeta.
type StartOptions ¶
type StartOptions struct {
// NodeID is the node ID.
NodeID string
// Transport is the Raft transport.
Transport transport.RaftTransport
// MeshStorage is the mesh storage.
MeshStorage storage.MeshStorage
// RaftStorage is the Raft storage.
RaftStorage storage.RaftStorage
}
StartOptons are options for starting a Raft node.