raft: randomize election timeout

This commit is contained in:
Xiang Li 2014-07-14 22:59:16 -07:00 committed by Yicheng Qin
parent 3921295b21
commit 9c8aff66a1
2 changed files with 5 additions and 2 deletions

View File

@ -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{}),
} }

View File

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