mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
etcdserver: rebase on master and code clean
This commit is contained in:
parent
e21de51768
commit
8eee8c260e
@ -41,6 +41,8 @@ const (
|
||||
type ClusterInfo interface {
|
||||
ID() uint64
|
||||
ClientURLs() []string
|
||||
Members() map[uint64]*Member
|
||||
Member(id uint64) *Member
|
||||
}
|
||||
|
||||
// Cluster is a list of Members that belong to the same raft cluster
|
||||
@ -48,14 +50,15 @@ type Cluster struct {
|
||||
id uint64
|
||||
name string
|
||||
members map[uint64]*Member
|
||||
// removed indicates ids of removed members in the cluster so far
|
||||
// removed contains the ids of removed members in the cluster.
|
||||
// removed id cannot be reused.
|
||||
removed map[uint64]bool
|
||||
store store.Store
|
||||
}
|
||||
|
||||
// NewClusterFromString returns Cluster through given clusterName and parsing
|
||||
// members from a sets of names to IPs discovery formatted like:
|
||||
// mach0=http://1.1.1.1,mach0=http://2.2.2.2,mach0=http://1.1.1.1,mach1=http://2.2.2.2,mach1=http://3.3.3.3
|
||||
// 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 NewClusterFromString(name string, cluster string) (*Cluster, error) {
|
||||
c := newCluster(name)
|
||||
|
||||
@ -91,7 +94,7 @@ func NewClusterFromStore(name string, st store.Store) *Cluster {
|
||||
for _, n := range e.Node.Nodes {
|
||||
m, err := nodeToMember(n)
|
||||
if err != nil {
|
||||
log.Panicf("unexpected nodeToMember error: %v", err)
|
||||
log.Panicf("nodeToMember should never fail: %v", err)
|
||||
}
|
||||
c.members[m.ID] = m
|
||||
}
|
||||
@ -126,6 +129,8 @@ func (c *Cluster) Member(id uint64) *Member {
|
||||
return c.members[id]
|
||||
}
|
||||
|
||||
// MemberByName returns a Member with the given name if exists.
|
||||
// If more than one member has the given name, it will return one randomly.
|
||||
func (c *Cluster) MemberByName(name string) *Member {
|
||||
for _, m := range c.members {
|
||||
if m.Name == name {
|
||||
@ -144,7 +149,7 @@ func (c Cluster) MemberIDs() []uint64 {
|
||||
return ids
|
||||
}
|
||||
|
||||
func (c *Cluster) IsMemberRemoved(id uint64) bool {
|
||||
func (c *Cluster) IsIDremoved(id uint64) bool {
|
||||
return c.removed[id]
|
||||
}
|
||||
|
||||
@ -197,13 +202,9 @@ func (c *Cluster) genID() {
|
||||
c.id = binary.BigEndian.Uint64(hash[:8])
|
||||
}
|
||||
|
||||
func (c *Cluster) SetID(id uint64) {
|
||||
c.id = id
|
||||
}
|
||||
func (c *Cluster) SetID(id uint64) { c.id = id }
|
||||
|
||||
func (c *Cluster) SetStore(st store.Store) {
|
||||
c.store = st
|
||||
}
|
||||
func (c *Cluster) SetStore(st store.Store) { c.store = st }
|
||||
|
||||
// AddMember puts a new Member into the store.
|
||||
// A Member with a matching id must not exist.
|
||||
@ -228,7 +229,7 @@ func (c *Cluster) AddMember(m *Member) {
|
||||
}
|
||||
|
||||
// RemoveMember removes a member from the store.
|
||||
// The given id MUST exist.
|
||||
// The given id MUST exist, or the function panics.
|
||||
func (c *Cluster) RemoveMember(id uint64) {
|
||||
if _, err := c.store.Delete(memberStoreKey(id), true, true); err != nil {
|
||||
log.Panicf("delete peer should never fail: %v", err)
|
||||
|
@ -132,7 +132,7 @@ func TestClusterMember(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestClusterMemberFromName(t *testing.T) {
|
||||
func TestClusterMemberByName(t *testing.T) {
|
||||
membs := []Member{
|
||||
newTestMember(1, nil, "node1", nil),
|
||||
newTestMember(2, nil, "node2", nil),
|
||||
|
@ -160,7 +160,7 @@ func (h serverHandler) serveAdminMembers(w http.ResponseWriter, r *http.Request)
|
||||
case "GET":
|
||||
idStr := strings.TrimPrefix(r.URL.Path, adminMembersPrefix)
|
||||
if idStr == "" {
|
||||
msmap := h.clusterStore.Get().Members()
|
||||
msmap := h.clusterInfo.Members()
|
||||
ms := make(SortableMemberSlice, 0, len(msmap))
|
||||
for _, m := range msmap {
|
||||
ms = append(ms, m)
|
||||
@ -177,7 +177,7 @@ func (h serverHandler) serveAdminMembers(w http.ResponseWriter, r *http.Request)
|
||||
http.Error(w, err.Error(), http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
m := h.clusterStore.Get().FindID(id)
|
||||
m := h.clusterInfo.Member(id)
|
||||
if m == nil {
|
||||
http.Error(w, "member not found", http.StatusNotFound)
|
||||
return
|
||||
|
@ -1533,24 +1533,23 @@ func (s *serverRecorder) RemoveMember(_ context.Context, id uint64) error {
|
||||
}
|
||||
|
||||
func TestServeAdminMembersGet(t *testing.T) {
|
||||
memb1 := etcdserver.Member{ID: 1, Attributes: etcdserver.Attributes{ClientURLs: []string{"http://localhost:8080"}}}
|
||||
memb2 := etcdserver.Member{ID: 2, Attributes: etcdserver.Attributes{ClientURLs: []string{"http://localhost:8081"}}}
|
||||
cluster := &fakeCluster{
|
||||
members: []etcdserver.Member{
|
||||
{ID: 1, Attributes: etcdserver.Attributes{ClientURLs: []string{"http://localhost:8080"}}},
|
||||
{ID: 2, Attributes: etcdserver.Attributes{ClientURLs: []string{"http://localhost:8081"}}},
|
||||
},
|
||||
members: map[uint64]*etcdserver.Member{1: &memb1, 2: &memb2},
|
||||
}
|
||||
h := &serverHandler{
|
||||
server: &serverRecorder{},
|
||||
clock: clockwork.NewFakeClock(),
|
||||
clusterStore: cluster,
|
||||
clusterInfo: cluster,
|
||||
}
|
||||
|
||||
msb, err := json.Marshal(cluster.members)
|
||||
msb, err := json.Marshal([]etcdserver.Member{memb1, memb2})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
wms := string(msb) + "\n"
|
||||
mb, err := json.Marshal(cluster.members[0])
|
||||
mb, err := json.Marshal(memb1)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@ -1747,7 +1746,10 @@ func TestTrimNodeExternPrefix(t *testing.T) {
|
||||
type fakeCluster struct {
|
||||
id uint64
|
||||
clientURLs []string
|
||||
members map[uint64]*etcdserver.Member
|
||||
}
|
||||
|
||||
func (c *fakeCluster) ID() uint64 { return c.id }
|
||||
func (c *fakeCluster) ClientURLs() []string { return c.clientURLs }
|
||||
func (c *fakeCluster) Members() map[uint64]*etcdserver.Member { return c.members }
|
||||
func (c *fakeCluster) Member(id uint64) *etcdserver.Member { return c.members[id] }
|
||||
|
@ -266,7 +266,7 @@ func (s *EtcdServer) start() {
|
||||
}
|
||||
|
||||
func (s *EtcdServer) Process(ctx context.Context, m raftpb.Message) error {
|
||||
if s.Cluster.IsMemberRemoved(m.From) {
|
||||
if s.Cluster.IsIDremoved(m.From) {
|
||||
return ErrRemoved
|
||||
}
|
||||
return s.node.Step(ctx, m)
|
||||
@ -612,7 +612,7 @@ func (s *EtcdServer) applyConfChange(cc raftpb.ConfChange, nodes []uint64) error
|
||||
}
|
||||
|
||||
func (s *EtcdServer) checkConfChange(cc raftpb.ConfChange, nodes []uint64) error {
|
||||
if s.Cluster.IsMemberRemoved(cc.NodeID) {
|
||||
if s.Cluster.IsIDremoved(cc.NodeID) {
|
||||
return ErrIDRemoved
|
||||
}
|
||||
switch cc.Type {
|
||||
|
Loading…
x
Reference in New Issue
Block a user