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