mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
commit
9c84443f42
@ -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)
|
||||||
|
@ -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) }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user