فهرست منبع

etcdserver: have newMember take an optional time field

This will be used by members joining an existing cluster or joining
using discovery.
Brandon Philips 11 سال پیش
والد
کامیت
aa5b6cdc9e
3فایلهای تغییر یافته به همراه37 افزوده شده و 2 حذف شده
  1. 1 1
      etcdserver/cluster.go
  2. 7 1
      etcdserver/member.go
  3. 29 0
      etcdserver/member_test.go

+ 1 - 1
etcdserver/cluster.go

@@ -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

+ 7 - 1
etcdserver/member.go

@@ -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 - 0
etcdserver/member_test.go

@@ -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)
+		}
+	}
+}