From 0c12e56fd33497528917da88cab032029206aa93 Mon Sep 17 00:00:00 2001 From: Simon Schubert Date: Thu, 3 Nov 2016 10:46:49 +0100 Subject: [PATCH] sbft: get rid of s.seq Suggested-by: Gabor Hosszu Change-Id: I9cbb91bf0870a2c7cea9f6a54d2acb4b4e0c32f1 Signed-off-by: Simon Schubert --- consensus/simplebft/backlog.go | 2 +- consensus/simplebft/checkpoint.go | 1 - consensus/simplebft/connection.go | 5 ++--- consensus/simplebft/newview.go | 10 ++++----- consensus/simplebft/newview_test.go | 6 +++--- consensus/simplebft/simplebft.go | 33 ++++++++++++----------------- consensus/simplebft/viewchange.go | 18 ++++++++-------- consensus/simplebft/xset.go | 4 ++-- 8 files changed, 35 insertions(+), 44 deletions(-) diff --git a/consensus/simplebft/backlog.go b/consensus/simplebft/backlog.go index c5036d62498..80fb0b4aeda 100644 --- a/consensus/simplebft/backlog.go +++ b/consensus/simplebft/backlog.go @@ -32,7 +32,7 @@ func (s *SBFT) testBacklog2(m *Msg, src uint64) bool { if !s.activeView { return true } - if seq.Seq > s.cur.subject.Seq.Seq || seq.View > s.seq.View { + if seq.Seq > s.cur.subject.Seq.Seq || seq.View > s.view { return true } return false diff --git a/consensus/simplebft/checkpoint.go b/consensus/simplebft/checkpoint.go index ed0a5a27748..0d0ed62f60e 100644 --- a/consensus/simplebft/checkpoint.go +++ b/consensus/simplebft/checkpoint.go @@ -98,7 +98,6 @@ func (s *SBFT) handleCheckpoint(c *Checkpoint, src uint64) { batch := *s.cur.preprep.Batch batch.Signatures = cpset s.sys.Deliver(&batch) - s.seq = *s.cur.subject.Seq s.cur.timeout.Cancel() log.Infof("request %s %s completed on %d", s.cur.subject.Seq, hash2str(s.cur.subject.Digest), s.id) diff --git a/consensus/simplebft/connection.go b/consensus/simplebft/connection.go index 8f0b9d8a18a..c64f2a6d45a 100644 --- a/consensus/simplebft/connection.go +++ b/consensus/simplebft/connection.go @@ -68,7 +68,6 @@ func (s *SBFT) handleHello(h *Hello, src uint64) { if s.sys.LastBatch().DecodeHeader().Seq < bh.Seq { s.sys.Deliver(h.Batch) - s.seq.Seq = bh.Seq } if h.NewView != nil { @@ -89,8 +88,8 @@ func (s *SBFT) handleHello(h *Hello, src uint64) { return } - if s.seq.View <= h.NewView.View { - s.seq.View = h.NewView.View + if s.view < h.NewView.View { + s.view = h.NewView.View } s.activeView = true } diff --git a/consensus/simplebft/newview.go b/consensus/simplebft/newview.go index 64b715ac20f..17dfb69c380 100644 --- a/consensus/simplebft/newview.go +++ b/consensus/simplebft/newview.go @@ -22,7 +22,7 @@ import ( ) func (s *SBFT) maybeSendNewView() { - if s.lastNewViewSent != nil && s.lastNewViewSent.View == s.seq.View { + if s.lastNewViewSent != nil && s.lastNewViewSent.View == s.view { return } @@ -30,7 +30,7 @@ func (s *SBFT) maybeSendNewView() { var vcs []*ViewChange for src, state := range s.replicaState { - if state.viewchange != nil && state.viewchange.View == s.seq.View { + if state.viewchange != nil && state.viewchange.View == s.view { vset[uint64(src)] = state.signedViewchange vcs = append(vcs, state.viewchange) } @@ -56,7 +56,7 @@ func (s *SBFT) maybeSendNewView() { } nv := &NewView{ - View: s.seq.View, + View: s.view, Vset: vset, Xset: xset, Batch: batch, @@ -146,8 +146,8 @@ func (s *SBFT) processNewView() { return } - nv := s.replicaState[s.primaryIDView(s.seq.View)].newview - if nv == nil || nv.View != s.seq.View { + nv := s.replicaState[s.primaryIDView(s.view)].newview + if nv == nil || nv.View != s.view { return } diff --git a/consensus/simplebft/newview_test.go b/consensus/simplebft/newview_test.go index 34b5b421070..02a052437bb 100644 --- a/consensus/simplebft/newview_test.go +++ b/consensus/simplebft/newview_test.go @@ -22,7 +22,7 @@ import ( ) func TestXsetNoByz(t *testing.T) { - s := &SBFT{config: Config{N: 4, F: 1}, seq: SeqView{3, 1}} + s := &SBFT{config: Config{N: 4, F: 1}, view: 3} vcs := []*ViewChange{ &ViewChange{ View: 3, @@ -57,7 +57,7 @@ func TestXsetNoByz(t *testing.T) { } func TestXsetByz0(t *testing.T) { - s := &SBFT{config: Config{N: 4, F: 1}, seq: SeqView{3, 1}} + s := &SBFT{config: Config{N: 4, F: 1}, view: 3} vcs := []*ViewChange{ &ViewChange{ View: 3, @@ -103,7 +103,7 @@ func TestXsetByz0(t *testing.T) { } func TestXsetByz2(t *testing.T) { - s := &SBFT{config: Config{N: 4, F: 1}, seq: SeqView{3, 1}} + s := &SBFT{config: Config{N: 4, F: 1}, view: 3} vcs := []*ViewChange{ &ViewChange{ View: 3, diff --git a/consensus/simplebft/simplebft.go b/consensus/simplebft/simplebft.go index 1beb69a74a3..f9272cd025a 100644 --- a/consensus/simplebft/simplebft.go +++ b/consensus/simplebft/simplebft.go @@ -57,7 +57,7 @@ type SBFT struct { config Config id uint64 - seq SeqView + view uint64 batch []*Request batchTimer Canceller cur reqInfo @@ -109,15 +109,8 @@ func New(id uint64, config *Config, sys System) (*SBFT, error) { } s.sys.SetReceiver(s) - lastBatch := s.sys.LastBatch() - bh, err := s.checkBatch(lastBatch, false) - if err != nil { - panic(err) - } - - s.seq.View = 0 - s.seq.Seq = bh.Seq - s.cur.subject.Seq = &s.seq + s.view = 0 + s.cur.subject.Seq = &SeqView{} s.cur.sentCommit = true s.cur.executed = true s.cur.checkpointDone = true @@ -125,10 +118,8 @@ func New(id uint64, config *Config, sys System) (*SBFT, error) { pp := &Preprepare{} if s.sys.Restore("preprepare", pp) { - s.seq.View = pp.Seq.View - if pp.Seq.Seq > bh.Seq { - s.seq = *pp.Seq - s.seq.Seq -= 1 + s.view = pp.Seq.View + if pp.Seq.Seq > s.seq() { s.acceptPreprepare(pp) } } @@ -141,7 +132,7 @@ func New(id uint64, config *Config, sys System) (*SBFT, error) { s.cur.executed = true } - if s.seq.Seq == 0 { + if s.seq() == 0 { s.activeView = true } @@ -156,21 +147,23 @@ func (s *SBFT) primaryIDView(v uint64) uint64 { } func (s *SBFT) primaryID() uint64 { - return s.primaryIDView(s.seq.View) + return s.primaryIDView(s.view) } func (s *SBFT) isPrimary() bool { return s.primaryID() == s.id } +func (s *SBFT) seq() uint64 { + return s.sys.LastBatch().DecodeHeader().Seq +} + func (s *SBFT) nextSeq() SeqView { - seq := s.seq - seq.Seq += 1 - return seq + return SeqView{Seq: s.seq() + 1, View: s.view} } func (s *SBFT) nextView() uint64 { - return s.seq.View + 1 + return s.view + 1 } func (s *SBFT) noFaultyQuorum() int { diff --git a/consensus/simplebft/viewchange.go b/consensus/simplebft/viewchange.go index f6be9b76631..b9a3047c5c9 100644 --- a/consensus/simplebft/viewchange.go +++ b/consensus/simplebft/viewchange.go @@ -19,16 +19,16 @@ package simplebft import "time" func (s *SBFT) sendViewChange() { - s.seq.View = s.nextView() + s.view = s.nextView() s.cur.timeout.Cancel() s.activeView = false for src := range s.replicaState { state := &s.replicaState[src] - if state.viewchange != nil && state.viewchange.View < s.seq.View { + if state.viewchange != nil && state.viewchange.View < s.view { state.viewchange = nil } } - log.Noticef("sending viewchange for view %d", s.seq.View) + log.Noticef("sending viewchange for view %d", s.view) var q, p []*Subject if s.cur.sentCommit { @@ -39,10 +39,10 @@ func (s *SBFT) sendViewChange() { } vc := &ViewChange{ - View: s.seq.View, + View: s.view, Qset: q, Pset: p, - Executed: s.seq.Seq, + Executed: s.seq(), } svc := s.sign(vc) s.viewChangeTimer.Cancel() @@ -68,8 +68,8 @@ func (s *SBFT) handleViewChange(svc *Signed, src uint64) { log.Noticef("invalid viewchange: %s", err) return } - if vc.View < s.seq.View { - log.Debugf("old view change from %s for view %d, we are in view %d", src, vc.View, s.seq.View) + if vc.View < s.view { + log.Debugf("old view change from %s for view %d, we are in view %d", src, vc.View, s.view) return } if ovc := s.replicaState[src].viewchange; ovc != nil && vc.View <= ovc.View { @@ -94,9 +94,9 @@ func (s *SBFT) handleViewChange(svc *Signed, src uint64) { if quorum == s.oneCorrectQuorum() { // catch up to the minimum view - if s.seq.View < min { + if s.view < min { log.Notice("we are behind on view change, resending for newer view") - s.seq.View = min - 1 + s.view = min - 1 s.sendViewChange() return } diff --git a/consensus/simplebft/xset.go b/consensus/simplebft/xset.go index 5d8441c68c5..2a97208d93e 100644 --- a/consensus/simplebft/xset.go +++ b/consensus/simplebft/xset.go @@ -128,7 +128,7 @@ nextm: log.Debugf("selecting %d with %x", next, mtuple.Digest) xset = &Subject{ - Seq: &SeqView{Seq: next, View: s.seq.View}, + Seq: &SeqView{Seq: next, View: s.view}, Digest: mtuple.Digest, } break nextm @@ -141,7 +141,7 @@ nextm: if emptycount >= s.noFaultyQuorum() { log.Debugf("selecting null request for %d", next) xset = &Subject{ - Seq: &SeqView{Seq: next, View: s.seq.View}, + Seq: &SeqView{Seq: next, View: s.view}, Digest: nil, } }