etcdserver: use path.Join for member key in cluster

This commit is contained in:
Yicheng Qin
2014-10-23 11:57:42 -07:00
parent 3d243baacd
commit f8b8bdeb17
2 changed files with 13 additions and 9 deletions

View File

@ -23,6 +23,7 @@ import (
"fmt" "fmt"
"log" "log"
"net/url" "net/url"
"path"
"sort" "sort"
"strings" "strings"
@ -33,8 +34,8 @@ import (
) )
const ( const (
raftAttributesSuffix = "/raftAttributes" raftAttributesSuffix = "raftAttributes"
attributesSuffix = "/attributes" attributesSuffix = "attributes"
) )
type ClusterInfo interface { type ClusterInfo interface {
@ -47,6 +48,7 @@ type Cluster struct {
id uint64 id uint64
name string name string
members map[uint64]*Member members map[uint64]*Member
// removed indicates ids of removed members in the cluster so far
removed map[uint64]bool removed map[uint64]bool
store store.Store store store.Store
} }
@ -103,7 +105,7 @@ func NewClusterFromStore(name string, st store.Store) *Cluster {
if isKeyNotFound(err) { if isKeyNotFound(err) {
return c return c
} }
log.Panicf("get member should never fail: %v", err) log.Panicf("get storeMembers should never fail: %v", err)
} }
for _, n := range e.Node.Nodes { for _, n := range e.Node.Nodes {
m, err := nodeToMember(n) m, err := nodeToMember(n)
@ -118,7 +120,7 @@ func NewClusterFromStore(name string, st store.Store) *Cluster {
if isKeyNotFound(err) { if isKeyNotFound(err) {
return c return c
} }
log.Panicf("get member should never fail: %v", err) log.Panicf("get storeRemovedMembers should never fail: %v", err)
} }
for _, n := range e.Node.Nodes { for _, n := range e.Node.Nodes {
c.removed[parseMemberID(n.Key)] = true c.removed[parseMemberID(n.Key)] = true
@ -229,14 +231,16 @@ func (c *Cluster) AddMember(m *Member) {
if err != nil { if err != nil {
log.Panicf("marshal error: %v", err) log.Panicf("marshal error: %v", err)
} }
if _, err := c.store.Create(memberStoreKey(m.ID)+raftAttributesSuffix, false, string(b), false, store.Permanent); err != nil { p := path.Join(memberStoreKey(m.ID), raftAttributesSuffix)
if _, err := c.store.Create(p, false, string(b), false, store.Permanent); err != nil {
log.Panicf("add raftAttributes should never fail: %v", err) log.Panicf("add raftAttributes should never fail: %v", err)
} }
b, err = json.Marshal(m.Attributes) b, err = json.Marshal(m.Attributes)
if err != nil { if err != nil {
log.Panicf("marshal error: %v", err) log.Panicf("marshal error: %v", err)
} }
if _, err := c.store.Create(memberStoreKey(m.ID)+attributesSuffix, false, string(b), false, store.Permanent); err != nil { p = path.Join(memberStoreKey(m.ID), attributesSuffix)
if _, err := c.store.Create(p, false, string(b), false, store.Permanent); err != nil {
log.Panicf("add attributes should never fail: %v", err) log.Panicf("add attributes should never fail: %v", err)
} }
c.members[m.ID] = m c.members[m.ID] = m
@ -262,13 +266,13 @@ func nodeToMember(n *store.NodeExtern) (*Member, error) {
if len(n.Nodes) != 2 { if len(n.Nodes) != 2 {
return m, fmt.Errorf("len(nodes) = %d, want 2", len(n.Nodes)) return m, fmt.Errorf("len(nodes) = %d, want 2", len(n.Nodes))
} }
if w := n.Key + attributesSuffix; n.Nodes[0].Key != w { if w := path.Join(n.Key, attributesSuffix); n.Nodes[0].Key != w {
return m, fmt.Errorf("key = %v, want %v", n.Nodes[0].Key, w) return m, fmt.Errorf("key = %v, want %v", n.Nodes[0].Key, w)
} }
if err := json.Unmarshal([]byte(*n.Nodes[0].Value), &m.Attributes); err != nil { if err := json.Unmarshal([]byte(*n.Nodes[0].Value), &m.Attributes); err != nil {
return m, fmt.Errorf("unmarshal attributes error: %v", err) return m, fmt.Errorf("unmarshal attributes error: %v", err)
} }
if w := n.Key + raftAttributesSuffix; n.Nodes[1].Key != w { if w := path.Join(n.Key, raftAttributesSuffix); n.Nodes[1].Key != w {
return m, fmt.Errorf("key = %v, want %v", n.Nodes[1].Key, w) return m, fmt.Errorf("key = %v, want %v", n.Nodes[1].Key, w)
} }
if err := json.Unmarshal([]byte(*n.Nodes[1].Value), &m.RaftAttributes); err != nil { if err := json.Unmarshal([]byte(*n.Nodes[1].Value), &m.RaftAttributes); err != nil {

View File

@ -495,7 +495,7 @@ func (s *EtcdServer) publish(retryInterval time.Duration) {
req := pb.Request{ req := pb.Request{
ID: GenID(), ID: GenID(),
Method: "PUT", Method: "PUT",
Path: memberStoreKey(s.id) + attributesSuffix, Path: path.Join(memberStoreKey(s.id), attributesSuffix),
Val: string(b), Val: string(b),
} }