Browse Source

raft: randomize election timeout

Xiang Li 11 years ago
parent
commit
9c8aff66a1
2 changed files with 5 additions and 2 deletions
  1. 4 1
      raft/node.go
  2. 1 1
      raft/node_test.go

+ 4 - 1
raft/node.go

@@ -3,7 +3,9 @@ package raft
 import (
 import (
 	"encoding/json"
 	"encoding/json"
 	golog "log"
 	golog "log"
+	"math/rand"
 	"sync/atomic"
 	"sync/atomic"
+	"time"
 )
 )
 
 
 type Interface interface {
 type Interface interface {
@@ -36,9 +38,10 @@ func New(id int64, heartbeat, election tick) *Node {
 		panic("election is least three times as heartbeat [election: %d, heartbeat: %d]")
 		panic("election is least three times as heartbeat [election: %d, heartbeat: %d]")
 	}
 	}
 
 
+	rand.Seed(time.Now().UnixNano())
 	n := &Node{
 	n := &Node{
 		heartbeat: heartbeat,
 		heartbeat: heartbeat,
-		election:  election,
+		election:  election + tick(rand.Int31())%election,
 		sm:        newStateMachine(id, []int64{id}),
 		sm:        newStateMachine(id, []int64{id}),
 		rmNodes:   make(map[int64]struct{}),
 		rmNodes:   make(map[int64]struct{}),
 	}
 	}

+ 1 - 1
raft/node_test.go

@@ -16,7 +16,7 @@ func TestTickMsgHup(t *testing.T) {
 	// simulate to patch the join log
 	// simulate to patch the join log
 	n.Step(Message{Type: msgApp, Commit: 1, Entries: []Entry{Entry{}}})
 	n.Step(Message{Type: msgApp, Commit: 1, Entries: []Entry{Entry{}}})
 
 
-	for i := 0; i < defaultElection+1; i++ {
+	for i := 0; i < defaultElection*2; i++ {
 		n.Tick()
 		n.Tick()
 	}
 	}