Merge pull request #2006 from xiang90/cluster_clean

cluster clean up
This commit is contained in:
Xiang Li 2014-12-25 20:45:01 -08:00
commit 9c84443f42
2 changed files with 46 additions and 44 deletions

View File

@ -135,12 +135,6 @@ func (c *Cluster) Members() []*Member {
return []*Member(sms) return []*Member(sms)
} }
type SortableMemberSlice []*Member
func (s SortableMemberSlice) Len() int { return len(s) }
func (s SortableMemberSlice) Less(i, j int) bool { return s[i].ID < s[j].ID }
func (s SortableMemberSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
func (c *Cluster) Member(id types.ID) *Member { func (c *Cluster) Member(id types.ID) *Member {
c.Lock() c.Lock()
defer c.Unlock() defer c.Unlock()
@ -181,25 +175,23 @@ func (c *Cluster) IsIDRemoved(id types.ID) bool {
return c.removed[id] return c.removed[id]
} }
// PeerURLs returns a list of all peer addresses. Each address is prefixed // PeerURLs returns a list of all peer addresses.
// with the scheme (currently "http://"). The returned list is sorted in // The returned list is sorted in ascending lexicographical order.
// ascending lexicographical order.
func (c *Cluster) PeerURLs() []string { func (c *Cluster) PeerURLs() []string {
c.Lock() c.Lock()
defer c.Unlock() defer c.Unlock()
endpoints := make([]string, 0) urls := make([]string, 0)
for _, p := range c.members { for _, p := range c.members {
for _, addr := range p.PeerURLs { for _, addr := range p.PeerURLs {
endpoints = append(endpoints, addr) urls = append(urls, addr)
} }
} }
sort.Strings(endpoints) sort.Strings(urls)
return endpoints return urls
} }
// ClientURLs returns a list of all client addresses. Each address is prefixed // ClientURLs returns a list of all client addresses.
// with the scheme (currently "http://"). The returned list is sorted in // The returned list is sorted in ascending lexicographical order.
// ascending lexicographical order.
func (c *Cluster) ClientURLs() []string { func (c *Cluster) ClientURLs() []string {
c.Lock() c.Lock()
defer c.Unlock() defer c.Unlock()
@ -356,34 +348,6 @@ func (c *Cluster) UpdateMember(nm *Member) {
c.members[nm.ID].RaftAttributes = nm.RaftAttributes c.members[nm.ID].RaftAttributes = nm.RaftAttributes
} }
// nodeToMember builds member through a store node.
// the child nodes of the given node should be sorted by key.
func nodeToMember(n *store.NodeExtern) (*Member, error) {
m := &Member{ID: mustParseMemberIDFromKey(n.Key)}
attrs := make(map[string][]byte)
raftAttrKey := path.Join(n.Key, raftAttributesSuffix)
attrKey := path.Join(n.Key, attributesSuffix)
for _, nn := range n.Nodes {
if nn.Key != raftAttrKey && nn.Key != attrKey {
return nil, fmt.Errorf("unknown key %q", nn.Key)
}
attrs[nn.Key] = []byte(*nn.Value)
}
if data := attrs[raftAttrKey]; data != nil {
if err := json.Unmarshal(data, &m.RaftAttributes); err != nil {
return nil, fmt.Errorf("unmarshal raftAttributes error: %v", err)
}
} else {
return nil, fmt.Errorf("raftAttributes key doesn't exist")
}
if data := attrs[attrKey]; data != nil {
if err := json.Unmarshal(data, &m.Attributes); err != nil {
return m, fmt.Errorf("unmarshal attributes error: %v", err)
}
}
return m, nil
}
func membersFromStore(st store.Store) (map[types.ID]*Member, map[types.ID]bool) { func membersFromStore(st store.Store) (map[types.ID]*Member, map[types.ID]bool) {
members := make(map[types.ID]*Member) members := make(map[types.ID]*Member)
removed := make(map[types.ID]bool) removed := make(map[types.ID]bool)

View File

@ -19,6 +19,7 @@ package etcdserver
import ( import (
"crypto/sha1" "crypto/sha1"
"encoding/binary" "encoding/binary"
"encoding/json"
"fmt" "fmt"
"log" "log"
"math/rand" "math/rand"
@ -27,6 +28,7 @@ import (
"time" "time"
"github.com/coreos/etcd/pkg/types" "github.com/coreos/etcd/pkg/types"
"github.com/coreos/etcd/store"
) )
// RaftAttributes represents the raft related attributes of an etcd member. // RaftAttributes represents the raft related attributes of an etcd member.
@ -121,6 +123,42 @@ func removedMemberStoreKey(id types.ID) string {
return path.Join(storeRemovedMembersPrefix, id.String()) return path.Join(storeRemovedMembersPrefix, id.String())
} }
// nodeToMember builds member from a key value node.
// the child nodes of the given node MUST be sorted by key.
func nodeToMember(n *store.NodeExtern) (*Member, error) {
m := &Member{ID: mustParseMemberIDFromKey(n.Key)}
attrs := make(map[string][]byte)
raftAttrKey := path.Join(n.Key, raftAttributesSuffix)
attrKey := path.Join(n.Key, attributesSuffix)
for _, nn := range n.Nodes {
if nn.Key != raftAttrKey && nn.Key != attrKey {
return nil, fmt.Errorf("unknown key %q", nn.Key)
}
attrs[nn.Key] = []byte(*nn.Value)
}
if data := attrs[raftAttrKey]; data != nil {
if err := json.Unmarshal(data, &m.RaftAttributes); err != nil {
return nil, fmt.Errorf("unmarshal raftAttributes error: %v", err)
}
} else {
return nil, fmt.Errorf("raftAttributes key doesn't exist")
}
if data := attrs[attrKey]; data != nil {
if err := json.Unmarshal(data, &m.Attributes); err != nil {
return m, fmt.Errorf("unmarshal attributes error: %v", err)
}
}
return m, nil
}
// implement sort by ID interface
type SortableMemberSlice []*Member
func (s SortableMemberSlice) Len() int { return len(s) }
func (s SortableMemberSlice) Less(i, j int) bool { return s[i].ID < s[j].ID }
func (s SortableMemberSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
// implement sort by peer urls interface
type SortableMemberSliceByPeerURLs []*Member type SortableMemberSliceByPeerURLs []*Member
func (p SortableMemberSliceByPeerURLs) Len() int { return len(p) } func (p SortableMemberSliceByPeerURLs) Len() int { return len(p) }