Browse Source

cluster: separate out membersFromStore from newClusterFromStore

Xiang Li 11 years ago
parent
commit
98406af448
2 changed files with 33 additions and 27 deletions
  1. 32 27
      etcdserver/cluster.go
  2. 1 0
      etcdserver/member.go

+ 32 - 27
etcdserver/cluster.go

@@ -89,33 +89,7 @@ func NewClusterFromString(token string, cluster string) (*Cluster, error) {
 func NewClusterFromStore(token string, st store.Store) *Cluster {
 func NewClusterFromStore(token string, st store.Store) *Cluster {
 	c := newCluster(token)
 	c := newCluster(token)
 	c.store = st
 	c.store = st
-
-	e, err := c.store.Get(storeMembersPrefix, true, true)
-	if err != nil {
-		if isKeyNotFound(err) {
-			return c
-		}
-		log.Panicf("get storeMembers should never fail: %v", err)
-	}
-	for _, n := range e.Node.Nodes {
-		m, err := nodeToMember(n)
-		if err != nil {
-			log.Panicf("nodeToMember should never fail: %v", err)
-		}
-		c.members[m.ID] = m
-	}
-
-	e, err = c.store.Get(storeRemovedMembersPrefix, true, true)
-	if err != nil {
-		if isKeyNotFound(err) {
-			return c
-		}
-		log.Panicf("get storeRemovedMembers should never fail: %v", err)
-	}
-	for _, n := range e.Node.Nodes {
-		c.removed[mustParseMemberIDFromKey(n.Key)] = true
-	}
-
+	c.members, c.removed = membersFromStore(c.store)
 	return c
 	return c
 }
 }
 
 
@@ -322,6 +296,37 @@ func nodeToMember(n *store.NodeExtern) (*Member, error) {
 	return m, nil
 	return m, nil
 }
 }
 
 
+func membersFromStore(st store.Store) (map[types.ID]*Member, map[types.ID]bool) {
+	members := make(map[types.ID]*Member)
+	removed := make(map[types.ID]bool)
+	e, err := st.Get(storeMembersPrefix, true, true)
+	if err != nil {
+		if isKeyNotFound(err) {
+			return members, removed
+		}
+		log.Panicf("get storeMembers should never fail: %v", err)
+	}
+	for _, n := range e.Node.Nodes {
+		m, err := nodeToMember(n)
+		if err != nil {
+			log.Panicf("nodeToMember should never fail: %v", err)
+		}
+		members[m.ID] = m
+	}
+
+	e, err = st.Get(storeRemovedMembersPrefix, true, true)
+	if err != nil {
+		if isKeyNotFound(err) {
+			return members, removed
+		}
+		log.Panicf("get storeRemovedMembers should never fail: %v", err)
+	}
+	for _, n := range e.Node.Nodes {
+		removed[mustParseMemberIDFromKey(n.Key)] = true
+	}
+	return members, removed
+}
+
 func isKeyNotFound(err error) bool {
 func isKeyNotFound(err error) bool {
 	e, ok := err.(*etcdErr.Error)
 	e, ok := err.(*etcdErr.Error)
 	return ok && e.ErrorCode == etcdErr.EcodeKeyNotFound
 	return ok && e.ErrorCode == etcdErr.EcodeKeyNotFound

+ 1 - 0
etcdserver/member.go

@@ -45,6 +45,7 @@ type Member struct {
 	ID types.ID `json:"id"`
 	ID types.ID `json:"id"`
 	RaftAttributes
 	RaftAttributes
 	Attributes
 	Attributes
+	verified bool
 }
 }
 
 
 // newMember creates a Member without an ID and generates one based on the
 // newMember creates a Member without an ID and generates one based on the