|
@@ -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
|