etcdserver: have newMember take an optional time field

This will be used by members joining an existing cluster or joining
using discovery.
This commit is contained in:
Brandon Philips 2014-09-30 14:57:04 -07:00
parent ce70e63cc6
commit aa5b6cdc9e
3 changed files with 37 additions and 2 deletions

View File

@ -71,7 +71,7 @@ func (c *Cluster) Set(s string) error {
if len(urls) == 0 || urls[0] == "" {
return fmt.Errorf("Empty URL given for %q", name)
}
m := newMember(name, urls)
m := newMember(name, urls, nil)
err := c.Add(*m)
if err != nil {
return err

View File

@ -3,9 +3,11 @@ package etcdserver
import (
"crypto/sha1"
"encoding/binary"
"fmt"
"path"
"sort"
"strconv"
"time"
)
const machineKVPrefix = "/_etcd/machines/"
@ -20,7 +22,7 @@ type Member struct {
// newMember creates a Member without an ID and generates one based on the
// name, peer URLs. This is used for bootstrapping.
func newMember(name string, peerURLs []string) *Member {
func newMember(name string, peerURLs []string, now *time.Time) *Member {
sort.Strings(peerURLs)
m := &Member{Name: name, PeerURLs: peerURLs}
@ -29,6 +31,10 @@ func newMember(name string, peerURLs []string) *Member {
b = append(b, []byte(p)...)
}
if now != nil {
b = append(b, []byte(fmt.Sprintf("%d", now.Unix()))...)
}
hash := sha1.Sum(b)
m.ID = int64(binary.BigEndian.Uint64(hash[:8]))
if m.ID < 0 {

29
etcdserver/member_test.go Normal file
View File

@ -0,0 +1,29 @@
package etcdserver
import (
"testing"
"time"
)
func timeParse(value string) (*time.Time) {
t, err := time.Parse(time.RFC3339, value)
if err != nil {
panic(err)
}
return &t
}
func TestMemberTime(t *testing.T) {
tests := []struct {
mem *Member
id int64
}{
{newMember("mem1", []string{"http://10.0.0.8:2379"}, nil), 7206348984215161146},
{newMember("mem1", []string{"http://10.0.0.1:2379"}, timeParse("1984-12-23T15:04:05Z")), 5483967913615174889},
}
for i, tt := range tests {
if tt.mem.ID != tt.id {
t.Errorf("#%d: mem.ID = %v, want %v", i, tt.mem.ID, tt.id)
}
}
}