From a42d52482c5679dac797aebc33cd452c49d7e4dd Mon Sep 17 00:00:00 2001 From: Jonathan Boulle Date: Wed, 17 Sep 2014 14:38:10 -0700 Subject: [PATCH] etcdserver: use simple PRNG for GenID --- etcdserver/server.go | 23 +++++++++-------------- etcdserver/server_test.go | 13 +++++++++++++ 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/etcdserver/server.go b/etcdserver/server.go index dee3910f9..45e364d98 100644 --- a/etcdserver/server.go +++ b/etcdserver/server.go @@ -1,14 +1,11 @@ package etcdserver import ( - "encoding/binary" "errors" - "io" "log" + "math/rand" "time" - crand "crypto/rand" - pb "github.com/coreos/etcd/etcdserver/etcdserverpb" "github.com/coreos/etcd/raft" "github.com/coreos/etcd/raft/raftpb" @@ -27,6 +24,10 @@ var ( ErrStopped = errors.New("etcdserver: server stopped") ) +func init() { + rand.Seed(time.Now().UnixNano()) +} + type SendFunc func(m []raftpb.Message) type SaveFunc func(st raftpb.HardState, ents []raftpb.Entry) @@ -295,17 +296,11 @@ func (s *EtcdServer) snapshot() { // TODO: move the function to /id pkg maybe? // GenID generates a random id that is not equal to 0. -func GenID() int64 { - for { - b := make([]byte, 8) - if _, err := io.ReadFull(crand.Reader, b); err != nil { - panic(err) // really bad stuff happened - } - n := int64(binary.BigEndian.Uint64(b)) - if n != 0 { - return n - } +func GenID() (n int64) { + for n == 0 { + n = rand.Int63() } + return } func getBool(v *bool) (vv bool, set bool) { diff --git a/etcdserver/server_test.go b/etcdserver/server_test.go index 8430fd51d..1caedb230 100644 --- a/etcdserver/server_test.go +++ b/etcdserver/server_test.go @@ -635,3 +635,16 @@ func (p *storageRecorder) SaveSnap(st raftpb.Snapshot) { } p.record("SaveSnap") } + +func TestGenID(t *testing.T) { + // Sanity check that the GenID function has been seeded appropriately + // (math/rand is seeded with 1 by default) + r := rand.NewSource(int64(1)) + var n int64 + for n == 0 { + n = r.Int63() + } + if n == GenID() { + t.Fatalf("GenID's rand seeded with 1!") + } +}