Browse Source

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 years ago
parent
commit
aa5b6cdc9e
3 changed files with 37 additions and 2 deletions
  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] == "" {
 		if len(urls) == 0 || urls[0] == "" {
 			return fmt.Errorf("Empty URL given for %q", name)
 			return fmt.Errorf("Empty URL given for %q", name)
 		}
 		}
-		m := newMember(name, urls)
+		m := newMember(name, urls, nil)
 		err := c.Add(*m)
 		err := c.Add(*m)
 		if err != nil {
 		if err != nil {
 			return err
 			return err

+ 7 - 1
etcdserver/member.go

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