*: create ID type

This creates a simple ID type (wrapped around uint64) to provide for
standard serialization/deserialization to a string (i.e. base 16
encoded). This replaces strutil so now that package is removed.
This commit is contained in:
Jonathan Boulle
2014-10-30 17:31:14 -07:00
parent 781abc1db0
commit 55c92ad456
18 changed files with 188 additions and 162 deletions

View File

@ -40,21 +40,21 @@ const (
)
type ClusterInfo interface {
ID() uint64
ID() types.ID
ClientURLs() []string
// Members returns a slice of members sorted by their ID
Members() []*Member
Member(id uint64) *Member
Member(id types.ID) *Member
}
// Cluster is a list of Members that belong to the same raft cluster
type Cluster struct {
id uint64
id types.ID
token string
members map[uint64]*Member
members map[types.ID]*Member
// removed contains the ids of removed members in the cluster.
// removed id cannot be reused.
removed map[uint64]bool
removed map[types.ID]bool
store store.Store
}
@ -119,7 +119,7 @@ func NewClusterFromStore(token string, st store.Store) *Cluster {
return c
}
func NewClusterFromMembers(token string, id uint64, membs []*Member) *Cluster {
func NewClusterFromMembers(token string, id types.ID, membs []*Member) *Cluster {
c := newCluster(token)
c.id = id
for _, m := range membs {
@ -131,12 +131,12 @@ func NewClusterFromMembers(token string, id uint64, membs []*Member) *Cluster {
func newCluster(token string) *Cluster {
return &Cluster{
token: token,
members: make(map[uint64]*Member),
removed: make(map[uint64]bool),
members: make(map[types.ID]*Member),
removed: make(map[types.ID]bool),
}
}
func (c Cluster) ID() uint64 { return c.id }
func (c Cluster) ID() types.ID { return c.id }
func (c Cluster) Members() []*Member {
var sms SortableMemberSlice
@ -153,7 +153,7 @@ 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 uint64) *Member {
func (c *Cluster) Member(id types.ID) *Member {
return c.members[id]
}
@ -172,16 +172,16 @@ func (c *Cluster) MemberByName(name string) *Member {
return memb
}
func (c Cluster) MemberIDs() []uint64 {
var ids []uint64
func (c Cluster) MemberIDs() []types.ID {
var ids []types.ID
for _, m := range c.members {
ids = append(ids, m.ID)
}
sort.Sort(types.Uint64Slice(ids))
sort.Sort(types.IDSlice(ids))
return ids
}
func (c *Cluster) IsIDRemoved(id uint64) bool {
func (c *Cluster) IsIDRemoved(id types.ID) bool {
return c.removed[id]
}
@ -244,7 +244,7 @@ func (c *Cluster) ValidateAndAssignIDs(membs []*Member) error {
}
omembs[i].ID = membs[i].ID
}
c.members = make(map[uint64]*Member)
c.members = make(map[types.ID]*Member)
for _, m := range omembs {
c.members[m.ID] = m
}
@ -255,13 +255,13 @@ func (c *Cluster) genID() {
mIDs := c.MemberIDs()
b := make([]byte, 8*len(mIDs))
for i, id := range mIDs {
binary.BigEndian.PutUint64(b[8*i:], id)
binary.BigEndian.PutUint64(b[8*i:], uint64(id))
}
hash := sha1.Sum(b)
c.id = binary.BigEndian.Uint64(hash[:8])
c.id = types.ID(binary.BigEndian.Uint64(hash[:8]))
}
func (c *Cluster) SetID(id uint64) { c.id = id }
func (c *Cluster) SetID(id types.ID) { c.id = id }
func (c *Cluster) SetStore(st store.Store) { c.store = st }
@ -289,7 +289,7 @@ func (c *Cluster) AddMember(m *Member) {
// RemoveMember removes a member from the store.
// The given id MUST exist, or the function panics.
func (c *Cluster) RemoveMember(id uint64) {
func (c *Cluster) RemoveMember(id types.ID) {
if _, err := c.store.Delete(memberStoreKey(id), true, true); err != nil {
log.Panicf("delete peer should never fail: %v", err)
}