View Source
const (
	DefaultSnapCount = 10000

	StoreAdminPrefix = "/0"
	StoreKeysPrefix  = "/1"


View Source
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")


func GenID

func GenID() (n uint64)

    TODO: move the function to /id pkg maybe? GenID generates a random id that is not equal to 0.

    func MemberAttributesStorePath

    func MemberAttributesStorePath(id types.ID) string

    func UpgradeWAL

    func UpgradeWAL(cfg *ServerConfig, ver wal.WalVersion) error

      UpgradeWAL converts an older version of the EtcdServer data to the newest version. It must ensure that, after upgrading, the most recent version is present.

      func ValidateClusterAndAssignIDs

      func ValidateClusterAndAssignIDs(local *Cluster, existing *Cluster) error

        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.


        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 {
          	// contains filtered or unexported fields

            Cluster is a list of Members that belong to the same raft cluster

            func GetClusterFromPeers

            func GetClusterFromPeers(urls []string) (*Cluster, error)

              GetClusterFromPeers 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 NewClusterFromMembers(token string, id types.ID, membs []*Member) *Cluster

              func NewClusterFromStore

              func NewClusterFromStore(token string, st store.Store) *Cluster

              func NewClusterFromString

              func NewClusterFromString(token string, cluster string) (*Cluster, error)

                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=,mach0=,mach1=,mach2=

                func (*Cluster) AddMember

                func (c *Cluster) AddMember(m *Member)

                  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

                  func (c *Cluster) ClientURLs() []string

                    ClientURLs returns a list of all client addresses. Each address is prefixed with the scheme (currently "http://"). The returned list is sorted in ascending lexicographical order.

                    func (*Cluster) ID

                    func (c *Cluster) ID() types.ID

                    func (*Cluster) IsIDRemoved

                    func (c *Cluster) IsIDRemoved(id types.ID) bool

                    func (*Cluster) Member

                    func (c *Cluster) Member(id types.ID) *Member

                    func (*Cluster) MemberByName

                    func (c *Cluster) MemberByName(name string) *Member

                      MemberByName returns a Member with the given name if exists. If more than one member has the given name, it will panic.

                      func (*Cluster) MemberIDs

                      func (c *Cluster) MemberIDs() []types.ID

                      func (*Cluster) Members

                      func (c *Cluster) Members() []*Member

                      func (*Cluster) PeerURLs

                      func (c *Cluster) PeerURLs() []string

                        PeerURLs returns a list of all peer addresses. Each address is prefixed with the scheme (currently "http://"). The returned list is sorted in ascending lexicographical order.

                        func (*Cluster) Recover

                        func (c *Cluster) Recover()

                        func (*Cluster) RemoveMember

                        func (c *Cluster) RemoveMember(id types.ID)

                          RemoveMember removes a member from the store. The given id MUST exist, or the function panics.

                          func (*Cluster) SetID

                          func (c *Cluster) SetID(id types.ID)

                          func (*Cluster) SetStore

                          func (c *Cluster) SetStore(st store.Store)

                          func (*Cluster) String

                          func (c *Cluster) String() string

                          func (*Cluster) UpdateMember

                          func (c *Cluster) UpdateMember(nm *Member)

                          func (*Cluster) UpdateMemberAttributes

                          func (c *Cluster) UpdateMemberAttributes(id types.ID, attr Attributes)

                          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
                            	Ticker     <-chan time.Time
                            	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) Do

                                func (s *EtcdServer) Do(ctx context.Context, r pb.Request) (Response, error)

                                  Do interprets r and performs an operation on 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) Index

                                  func (s *EtcdServer) Index() uint64

                                    Implement the RaftTimer interface

                                    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) LeaderStats

                                      func (s *EtcdServer) LeaderStats() []byte

                                      func (*EtcdServer) PauseSending

                                      func (s *EtcdServer) PauseSending()

                                        for testing

                                        func (*EtcdServer) Process

                                        func (s *EtcdServer) Process(ctx context.Context, m raftpb.Message) error

                                        func (*EtcdServer) RemoveMember

                                        func (s *EtcdServer) RemoveMember(ctx context.Context, id uint64) error

                                        func (*EtcdServer) ResumeSending

                                        func (s *EtcdServer) ResumeSending()

                                        func (*EtcdServer) SelfStats

                                        func (s *EtcdServer) SelfStats() []byte

                                        func (*EtcdServer) SenderFinder

                                        func (s *EtcdServer) SenderFinder() rafthttp.SenderFinder

                                        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"`

                                              func NewMember

                                              func NewMember(name string, peerURLs types.URLs, clusterName string, now *time.Time) *Member

                                                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) Clone

                                                func (m *Member) Clone() *Member

                                                func (*Member) PickPeerURL

                                                func (m *Member) PickPeerURL() string

                                                  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 RaftTimer

                                                    type RaftTimer interface {
                                                    	Index() uint64
                                                    	Term() uint64

                                                    type Response

                                                    type Response struct {
                                                    	Event   *store.Event
                                                    	Watcher store.Watcher
                                                    	// contains filtered or unexported fields

                                                    type SendHub

                                                    type SendHub interface {
                                                    	Send(m []raftpb.Message)
                                                    	Add(m *Member)
                                                    	Remove(id types.ID)
                                                    	Update(m *Member)
                                                    	ShouldStopNotify() <-chan struct{}

                                                    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.
                                                    	// Stop terminates the Server and performs any necessary finalization.
                                                    	// Do and Process cannot be called after Stop has been invoked.
                                                    	// ID returns the ID of the Server.
                                                    	ID() 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

                                                    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

                                                      ServerConfig holds the configuration of etcd as taken from the command line or discovery.

                                                      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) VerifyBootstrapConfig

                                                      func (c *ServerConfig) VerifyBootstrapConfig() error

                                                        VerifyBootstrapConfig sanity-checks the initial config and returns an error for things that should never happen.

                                                        func (*ServerConfig) WALDir

                                                        func (c *ServerConfig) WALDir() string

                                                        type SortableMemberSlice

                                                        type SortableMemberSlice []*Member

                                                        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

                                                        func (SortableMemberSliceByPeerURLs) Len

                                                        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
                                                        	// TODO: WAL should be able to control cut itself. After implement self-controlled cut,
                                                        	// remove it in this interface.
                                                        	// Cut cuts out a new wal file for saving new state and entries.
                                                        	Cut() error
                                                        	// Close closes the Storage and performs finalization.
                                                        	Close() error


                                                        Path Synopsis
                                                        Package etcdserverpb is a generated protocol buffer package.
                                                        Package etcdserverpb is a generated protocol buffer package.