Documentation ¶
Index ¶
- Constants
- Variables
- func MemberAttributesStorePath(id types.ID) string
- func ValidateClusterAndAssignIDs(local *Cluster, existing *Cluster) error
- type Attributes
- type Cluster
- func GetClusterFromRemotePeers(urls []string, tr *http.Transport) (*Cluster, error)
- func NewClusterFromMembers(token string, id types.ID, membs []*Member) *Cluster
- func NewClusterFromStore(token string, st store.Store) *Cluster
- func NewClusterFromString(token string, cluster string) (*Cluster, error)
- func (c *Cluster) AddMember(m *Member)
- func (c *Cluster) ClientURLs() []string
- func (c *Cluster) ID() types.ID
- func (c *Cluster) IsIDRemoved(id types.ID) bool
- func (c *Cluster) Member(id types.ID) *Member
- func (c *Cluster) MemberByName(name string) *Member
- func (c *Cluster) MemberIDs() []types.ID
- func (c *Cluster) Members() []*Member
- func (c *Cluster) PeerURLs() []string
- func (c *Cluster) Recover()
- func (c *Cluster) RemoveMember(id types.ID)
- func (c *Cluster) SetID(id types.ID)
- func (c *Cluster) SetStore(st store.Store)
- func (c *Cluster) String() string
- func (c *Cluster) UpdateAttributes(id types.ID, attr Attributes)
- func (c *Cluster) UpdateRaftAttributes(id types.ID, raftAttr RaftAttributes)
- func (c *Cluster) Validate() error
- func (c *Cluster) ValidateConfigurationChange(cc raftpb.ConfChange) error
- type ClusterInfo
- type EtcdServer
- func (s *EtcdServer) AddMember(ctx context.Context, memb Member) error
- func (s *EtcdServer) ClusterVersion() *semver.Version
- func (s *EtcdServer) Do(ctx context.Context, r pb.Request) (Response, error)
- func (s *EtcdServer) ID() types.ID
- func (s *EtcdServer) Index() uint64
- func (s *EtcdServer) IsIDRemoved(id uint64) bool
- func (s *EtcdServer) Lead() uint64
- func (s *EtcdServer) Leader() types.ID
- func (s *EtcdServer) LeaderStats() []byte
- func (s *EtcdServer) PauseSending()
- func (s *EtcdServer) Process(ctx context.Context, m raftpb.Message) error
- func (s *EtcdServer) RaftHandler() http.Handler
- func (s *EtcdServer) RemoveMember(ctx context.Context, id uint64) error
- func (s *EtcdServer) ReportSnapshot(id uint64, status raft.SnapshotStatus)
- func (s *EtcdServer) ReportUnreachable(id uint64)
- func (s *EtcdServer) ResumeSending()
- func (s *EtcdServer) SelfStats() []byte
- func (s *EtcdServer) Start()
- func (s *EtcdServer) Stop()
- func (s *EtcdServer) StopNotify() <-chan struct{}
- func (s *EtcdServer) StoreStats() []byte
- func (s *EtcdServer) Term() uint64
- func (s *EtcdServer) UpdateMember(ctx context.Context, memb Member) error
- type Member
- type RaftAttributes
- type RaftTimer
- type Response
- type Server
- type ServerConfig
- func (c *ServerConfig) MemberDir() string
- func (c *ServerConfig) Print()
- func (c *ServerConfig) PrintWithInitial()
- func (c *ServerConfig) ShouldDiscover() bool
- func (c *ServerConfig) SnapDir() string
- func (c *ServerConfig) VerifyBootstrap() error
- func (c *ServerConfig) VerifyJoinExisting() error
- func (c *ServerConfig) WALDir() string
- type SortableMemberSlice
- type SortableMemberSliceByPeerURLs
- type Storage
Constants ¶
const ( DefaultSnapCount = 10000 StoreClusterPrefix = "/0" StoreKeysPrefix = "/1" )
Variables ¶
var ( ErrUnknownMethod = errors.New("etcdserver: unknown method") ErrStopped = errors.New("etcdserver: server stopped") ErrIDRemoved = errors.New("etcdserver: ID removed") ErrIDExists = errors.New("etcdserver: ID exists") ErrIDNotFound = errors.New("etcdserver: ID not found") ErrPeerURLexists = errors.New("etcdserver: peerURL exists") ErrCanceled = errors.New("etcdserver: request cancelled") ErrTimeout = errors.New("etcdserver: request timed out") )
Functions ¶
func ValidateClusterAndAssignIDs ¶
ValidateClusterAndAssignIDs validates the local cluster by matching the PeerURLs with the existing cluster. If the validation succeeds, it assigns the IDs from the existing cluster to the local cluster. If the validation fails, an error will be returned.
Types ¶
type Attributes ¶
type Attributes struct { Name string `json:"name,omitempty"` ClientURLs []string `json:"clientURLs,omitempty"` }
Attributes represents all the non-raft related attributes of an etcd member.
type Cluster ¶
type Cluster struct { sync.Mutex // guards members and removed map // contains filtered or unexported fields }
Cluster is a list of Members that belong to the same raft cluster
func GetClusterFromRemotePeers ¶
GetClusterFromRemotePeers takes a set of URLs representing etcd peers, and attempts to construct a Cluster by accessing the members endpoint on one of these URLs. The first URL to provide a response is used. If no URLs provide a response, or a Cluster cannot be successfully created from a received response, an error is returned.
func NewClusterFromMembers ¶
func NewClusterFromString ¶
NewClusterFromString returns a Cluster instantiated from the given cluster token and cluster string, by parsing members from a set of discovery-formatted names-to-IPs, like: mach0=http://1.1.1.1,mach0=http://2.2.2.2,mach1=http://3.3.3.3,mach2=http://4.4.4.4
func (*Cluster) AddMember ¶
AddMember adds a new Member into the cluster, and saves the given member's raftAttributes into the store. The given member should have empty attributes. A Member with a matching id must not exist.
func (*Cluster) ClientURLs ¶
ClientURLs returns a list of all client addresses. The returned list is sorted in ascending lexicographical order.
func (*Cluster) MemberByName ¶
MemberByName returns a Member with the given name if exists. If more than one member has the given name, it will panic.
func (*Cluster) PeerURLs ¶
PeerURLs returns a list of all peer addresses. The returned list is sorted in ascending lexicographical order.
func (*Cluster) RemoveMember ¶
RemoveMember removes a member from the store. The given id MUST exist, or the function panics.
func (*Cluster) UpdateAttributes ¶
func (c *Cluster) UpdateAttributes(id types.ID, attr Attributes)
func (*Cluster) UpdateRaftAttributes ¶
func (c *Cluster) UpdateRaftAttributes(id types.ID, raftAttr RaftAttributes)
func (*Cluster) Validate ¶
Validate ensures that there is no identical urls in the cluster peer list
func (*Cluster) ValidateConfigurationChange ¶
func (c *Cluster) ValidateConfigurationChange(cc raftpb.ConfChange) error
ValidateConfigurationChange takes a proposed ConfChange and ensures that it is still valid.
type ClusterInfo ¶
type ClusterInfo interface { // ID returns the cluster ID ID() types.ID // ClientURLs returns an aggregate set of all URLs on which this // cluster is listening for client requests ClientURLs() []string // Members returns a slice of members sorted by their ID Members() []*Member // Member retrieves a particular member based on ID, or nil if the // member does not exist in the cluster Member(id types.ID) *Member // IsIDRemoved checks whether the given ID has been removed from this // cluster at some point in the past IsIDRemoved(id types.ID) bool }
type EtcdServer ¶
type EtcdServer struct { Cluster *Cluster SyncTicker <-chan time.Time // contains filtered or unexported fields }
EtcdServer is the production implementation of the Server interface
func NewServer ¶
func NewServer(cfg *ServerConfig) (*EtcdServer, error)
NewServer creates a new EtcdServer from the supplied configuration. The configuration is considered static for the lifetime of the EtcdServer.
func (*EtcdServer) AddMember ¶
func (s *EtcdServer) AddMember(ctx context.Context, memb Member) error
func (*EtcdServer) ClusterVersion ¶
func (s *EtcdServer) ClusterVersion() *semver.Version
func (*EtcdServer) Do ¶
Do interprets r and performs an operation on s.store according to r.Method and other fields. If r.Method is "POST", "PUT", "DELETE", or a "GET" with Quorum == true, r will be sent through consensus before performing its respective operation. Do will block until an action is performed or there is an error.
func (*EtcdServer) ID ¶
func (s *EtcdServer) ID() types.ID
func (*EtcdServer) IsIDRemoved ¶
func (s *EtcdServer) IsIDRemoved(id uint64) bool
func (*EtcdServer) Lead ¶
func (s *EtcdServer) Lead() uint64
Only for testing purpose TODO: add Raft server interface to expose raft related info: Index, Term, Lead, Committed, Applied, LastIndex, etc.
func (*EtcdServer) Leader ¶
func (s *EtcdServer) Leader() types.ID
func (*EtcdServer) LeaderStats ¶
func (s *EtcdServer) LeaderStats() []byte
func (*EtcdServer) PauseSending ¶
func (s *EtcdServer) PauseSending()
func (*EtcdServer) RaftHandler ¶
func (s *EtcdServer) RaftHandler() http.Handler
func (*EtcdServer) RemoveMember ¶
func (s *EtcdServer) RemoveMember(ctx context.Context, id uint64) error
func (*EtcdServer) ReportSnapshot ¶
func (s *EtcdServer) ReportSnapshot(id uint64, status raft.SnapshotStatus)
func (*EtcdServer) ReportUnreachable ¶
func (s *EtcdServer) ReportUnreachable(id uint64)
func (*EtcdServer) ResumeSending ¶
func (s *EtcdServer) ResumeSending()
func (*EtcdServer) SelfStats ¶
func (s *EtcdServer) SelfStats() []byte
func (*EtcdServer) Start ¶
func (s *EtcdServer) Start()
Start prepares and starts server in a new goroutine. It is no longer safe to modify a server's fields after it has been sent to Start. It also starts a goroutine to publish its server information.
func (*EtcdServer) Stop ¶
func (s *EtcdServer) Stop()
Stop stops the server gracefully, and shuts down the running goroutine. Stop should be called after a Start(s), otherwise it will block forever.
func (*EtcdServer) StopNotify ¶
func (s *EtcdServer) StopNotify() <-chan struct{}
StopNotify returns a channel that receives a empty struct when the server is stopped.
func (*EtcdServer) StoreStats ¶
func (s *EtcdServer) StoreStats() []byte
func (*EtcdServer) Term ¶
func (s *EtcdServer) Term() uint64
func (*EtcdServer) UpdateMember ¶
func (s *EtcdServer) UpdateMember(ctx context.Context, memb Member) error
type Member ¶
type Member struct { ID types.ID `json:"id"` RaftAttributes Attributes }
func NewMember ¶
NewMember creates a Member without an ID and generates one based on the name, peer URLs. This is used for bootstrapping/adding new member.
func (*Member) PickPeerURL ¶
PickPeerURL chooses a random address from a given Member's PeerURLs. It will panic if there is no PeerURLs available in Member.
type RaftAttributes ¶
type RaftAttributes struct { // TODO(philips): ensure these are URLs PeerURLs []string `json:"peerURLs"` }
RaftAttributes represents the raft related attributes of an etcd member.
type Server ¶
type Server interface { // Start performs any initialization of the Server necessary for it to // begin serving requests. It must be called before Do or Process. // Start must be non-blocking; any long-running server functionality // should be implemented in goroutines. Start() // Stop terminates the Server and performs any necessary finalization. // Do and Process cannot be called after Stop has been invoked. Stop() // ID returns the ID of the Server. ID() types.ID // Leader returns the ID of the leader Server. Leader() types.ID // Do takes a request and attempts to fulfill it, returning a Response. Do(ctx context.Context, r pb.Request) (Response, error) // Process takes a raft message and applies it to the server's raft state // machine, respecting any timeout of the given context. Process(ctx context.Context, m raftpb.Message) error // AddMember attempts to add a member into the cluster. It will return // ErrIDRemoved if member ID is removed from the cluster, or return // ErrIDExists if member ID exists in the cluster. AddMember(ctx context.Context, memb Member) error // RemoveMember attempts to remove a member from the cluster. It will // return ErrIDRemoved if member ID is removed from the cluster, or return // ErrIDNotFound if member ID is not in the cluster. RemoveMember(ctx context.Context, id uint64) error // UpdateMember attempts to update a existing member in the cluster. It will // return ErrIDNotFound if the member ID does not exist. UpdateMember(ctx context.Context, updateMemb Member) error // ClusterVersion is the cluster-wide minimum major.minor version. // Cluster version is set to the min version that a etcd member is // compatible with when first bootstrap. // // During a rolling upgrades, the ClusterVersion will be updated // automatically after a sync. (10 second by default) // // The API/raft component can utilize ClusterVersion to determine if // it can accept a client request or a raft RPC. ClusterVersion() *semver.Version }
type ServerConfig ¶
type ServerConfig struct { Name string DiscoveryURL string DiscoveryProxy string ClientURLs types.URLs PeerURLs types.URLs DataDir string SnapCount uint64 MaxSnapFiles uint MaxWALFiles uint Cluster *Cluster NewCluster bool ForceNewCluster bool Transport *http.Transport TickMs uint ElectionTicks int }
ServerConfig holds the configuration of etcd as taken from the command line or discovery.
func (*ServerConfig) MemberDir ¶
func (c *ServerConfig) MemberDir() string
func (*ServerConfig) Print ¶
func (c *ServerConfig) Print()
func (*ServerConfig) PrintWithInitial ¶
func (c *ServerConfig) PrintWithInitial()
func (*ServerConfig) ShouldDiscover ¶
func (c *ServerConfig) ShouldDiscover() bool
func (*ServerConfig) SnapDir ¶
func (c *ServerConfig) SnapDir() string
func (*ServerConfig) VerifyBootstrap ¶
func (c *ServerConfig) VerifyBootstrap() error
VerifyBootstrapConfig sanity-checks the initial config for bootstrap case and returns an error for things that should never happen.
func (*ServerConfig) VerifyJoinExisting ¶
func (c *ServerConfig) VerifyJoinExisting() error
VerifyJoinExisting sanity-checks the initial config for join existing cluster case and returns an error for things that should never happen.
func (*ServerConfig) WALDir ¶
func (c *ServerConfig) WALDir() string
type SortableMemberSlice ¶
type SortableMemberSlice []*Member
implement sort by ID interface
func (SortableMemberSlice) Len ¶
func (s SortableMemberSlice) Len() int
func (SortableMemberSlice) Less ¶
func (s SortableMemberSlice) Less(i, j int) bool
func (SortableMemberSlice) Swap ¶
func (s SortableMemberSlice) Swap(i, j int)
type SortableMemberSliceByPeerURLs ¶
type SortableMemberSliceByPeerURLs []*Member
implement sort by peer urls interface
func (SortableMemberSliceByPeerURLs) Len ¶
func (p SortableMemberSliceByPeerURLs) Len() int
func (SortableMemberSliceByPeerURLs) Less ¶
func (p SortableMemberSliceByPeerURLs) Less(i, j int) bool
func (SortableMemberSliceByPeerURLs) Swap ¶
func (p SortableMemberSliceByPeerURLs) Swap(i, j int)
type Storage ¶
type Storage interface { // Save function saves ents and state to the underlying stable storage. // Save MUST block until st and ents are on stable storage. Save(st raftpb.HardState, ents []raftpb.Entry) error // SaveSnap function saves snapshot to the underlying stable storage. SaveSnap(snap raftpb.Snapshot) error // Close closes the Storage and performs finalization. Close() error }
func NewStorage ¶
func NewStorage(w *wal.WAL, s *snap.Snapshotter) Storage