aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/dexon-foundation/dexon-consensus/core/syncer/consensus.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/dexon-foundation/dexon-consensus/core/syncer/consensus.go')
-rw-r--r--vendor/github.com/dexon-foundation/dexon-consensus/core/syncer/consensus.go88
1 files changed, 22 insertions, 66 deletions
diff --git a/vendor/github.com/dexon-foundation/dexon-consensus/core/syncer/consensus.go b/vendor/github.com/dexon-foundation/dexon-consensus/core/syncer/consensus.go
index 4fc24b407..24c781aac 100644
--- a/vendor/github.com/dexon-foundation/dexon-consensus/core/syncer/consensus.go
+++ b/vendor/github.com/dexon-foundation/dexon-consensus/core/syncer/consensus.go
@@ -66,8 +66,6 @@ type Consensus struct {
randomnessResults map[common.Hash]*types.BlockRandomnessResult
blocks types.BlocksByPosition
agreementModule *agreement
- configs []*types.Config
- roundBeginHeights []uint64
agreementRoundCut uint64
heightEvt *common.Event
roundEvt *utils.RoundEvent
@@ -102,19 +100,15 @@ func NewConsensus(
logger common.Logger) *Consensus {
con := &Consensus{
- dMoment: dMoment,
- app: app,
- gov: gov,
- db: db,
- network: network,
- nodeSetCache: utils.NewNodeSetCache(gov),
- tsigVerifier: core.NewTSigVerifierCache(gov, 7),
- prv: prv,
- logger: logger,
- configs: []*types.Config{
- utils.GetConfigWithPanic(gov, 0, logger),
- },
- roundBeginHeights: []uint64{0},
+ dMoment: dMoment,
+ app: app,
+ gov: gov,
+ db: db,
+ network: network,
+ nodeSetCache: utils.NewNodeSetCache(gov),
+ tsigVerifier: core.NewTSigVerifierCache(gov, 7),
+ prv: prv,
+ logger: logger,
receiveChan: make(chan *types.Block, 1000),
pullChan: make(chan common.Hash, 1000),
randomnessResults: make(map[common.Hash]*types.BlockRandomnessResult),
@@ -153,13 +147,12 @@ func (con *Consensus) assureBuffering() {
)
if height == 0 {
con.roundEvt, err = utils.NewRoundEvent(con.ctx, con.gov, con.logger,
- uint64(0), uint64(0), uint64(0), core.ConfigRoundShift)
+ 0, 0, core.ConfigRoundShift)
} else {
var b types.Block
if b, err = con.db.GetBlock(blockHash); err == nil {
- beginHeight := con.roundBeginHeights[b.Position.Round]
con.roundEvt, err = utils.NewRoundEvent(con.ctx, con.gov,
- con.logger, b.Position.Round, beginHeight, beginHeight,
+ con.logger, b.Position.Round, b.Finalization.Height,
core.ConfigRoundShift)
}
}
@@ -176,6 +169,7 @@ func (con *Consensus) assureBuffering() {
continue
}
con.nodeSetCache.Purge(e.Round + 1)
+ con.tsigVerifier.Purge(e.Round + 1)
}
})
// Register a round event handler to notify CRS to agreementModule.
@@ -197,7 +191,7 @@ func (con *Consensus) assureBuffering() {
return false
case <-time.After(500 * time.Millisecond):
con.logger.Warn(
- "agreement input channel is full when putting CRS",
+ "Agreement input channel is full when notifying new round",
"round", e.Round,
)
return true
@@ -223,7 +217,7 @@ func (con *Consensus) checkIfSynced(blocks []*types.Block) (synced bool) {
con.lock.RLock()
defer con.lock.RUnlock()
defer func() {
- con.logger.Debug("syncer synced status",
+ con.logger.Debug("Syncer synced status",
"last-block", blocks[len(blocks)-1],
"synced", synced,
)
@@ -264,7 +258,6 @@ func (con *Consensus) ForceSync(skip bool) {
panic(err)
}
con.logger.Info("Force Sync", "block", &block)
- con.setupConfigsUntilRound(block.Position.Round + core.ConfigRoundShift - 1)
con.syncedLastBlock = &block
con.stopBuffering()
// We might call stopBuffering without calling assureBuffering.
@@ -310,20 +303,19 @@ func (con *Consensus) SyncBlocks(
// tip in DB.
_, tipHeight := con.db.GetCompactionChainTipInfo()
if blocks[0].Finalization.Height != tipHeight+1 {
- con.logger.Error("mismatched finalization height",
+ con.logger.Error("Mismatched finalization height",
"now", blocks[0].Finalization.Height,
"expected", tipHeight+1,
)
err = ErrInvalidSyncingFinalizationHeight
return
}
- con.logger.Trace("syncBlocks",
+ con.logger.Trace("SyncBlocks",
"position", &blocks[0].Position,
"final height", blocks[0].Finalization.Height,
"len", len(blocks),
"latest", latest,
)
- con.setupConfigs(blocks)
for _, b := range blocks {
if err = con.db.PutBlock(*b); err != nil {
// A block might be put into db when confirmed by BA, but not
@@ -339,7 +331,7 @@ func (con *Consensus) SyncBlocks(
b.Hash, b.Finalization.Height); err != nil {
return
}
- go con.heightEvt.NotifyHeight(b.Finalization.Height)
+ con.heightEvt.NotifyHeight(b.Finalization.Height)
}
if latest {
con.assureBuffering()
@@ -377,7 +369,6 @@ func (con *Consensus) GetSyncedConsensus() (*core.Consensus, error) {
var err error
con.syncedConsensus, err = core.NewConsensusFromSyncer(
con.syncedLastBlock,
- con.roundBeginHeights[con.syncedLastBlock.Position.Round],
con.syncedSkipNext,
con.dMoment,
con.app,
@@ -413,14 +404,14 @@ func (con *Consensus) stopBuffering() {
return
}
con.duringBuffering = false
- con.logger.Trace("syncer is about to stop")
+ con.logger.Trace("Syncer is about to stop")
// Stop network and CRS routines, wait until they are all stoped.
con.ctxCancel()
return
}() {
return
}
- con.logger.Trace("stop syncer modules")
+ con.logger.Trace("Stop syncer modules")
con.roundEvt.Stop()
con.waitGroup.Done()
// Wait for all routines depends on con.agreementModule stopped.
@@ -433,9 +424,9 @@ func (con *Consensus) stopBuffering() {
con.dummyMsgBuffer = append(con.dummyMsgBuffer, msg)
})
// Stop agreements.
- con.logger.Trace("stop syncer agreement modules")
+ con.logger.Trace("Stop syncer agreement modules")
con.stopAgreement()
- con.logger.Trace("syncer stopped")
+ con.logger.Trace("Syncer stopped")
return
}
@@ -447,48 +438,13 @@ func (con *Consensus) isEmptyBlock(b *types.Block) bool {
// buildEmptyBlock builds an empty block in agreement.
func (con *Consensus) buildEmptyBlock(b *types.Block, parent *types.Block) {
- cfg := con.configs[b.Position.Round]
+ cfg := utils.GetConfigWithPanic(con.gov, b.Position.Round, con.logger)
b.Timestamp = parent.Timestamp.Add(cfg.MinBlockInterval)
b.Witness.Height = parent.Witness.Height
b.Witness.Data = make([]byte, len(parent.Witness.Data))
copy(b.Witness.Data, parent.Witness.Data)
}
-// setupConfigs is called by SyncBlocks with blocks from compaction chain. In
-// the first time, setupConfigs setups from round 0.
-func (con *Consensus) setupConfigs(blocks []*types.Block) {
- // Find max round in blocks.
- var maxRound uint64
- for _, b := range blocks {
- if b.Position.Round > maxRound {
- maxRound = b.Position.Round
- }
- }
- // Get configs from governance.
- //
- // In fullnode, the notification of new round is yet another TX, which
- // needs to be executed after corresponding block delivered. Thus, the
- // configuration for 'maxRound + core.ConfigRoundShift' won't be ready when
- // seeing this block.
- con.setupConfigsUntilRound(maxRound + core.ConfigRoundShift - 1)
-}
-
-func (con *Consensus) setupConfigsUntilRound(round uint64) {
- con.lock.Lock()
- defer con.lock.Unlock()
- con.logger.Debug("syncer setupConfigs",
- "until-round", round,
- "length", len(con.configs),
- )
- for r := uint64(len(con.configs)); r <= round; r++ {
- cfg := utils.GetConfigWithPanic(con.gov, r, con.logger)
- con.configs = append(con.configs, cfg)
- con.roundBeginHeights = append(
- con.roundBeginHeights,
- con.roundBeginHeights[r-1]+con.configs[r-1].RoundLength)
- }
-}
-
// startAgreement starts agreements for receiving votes and agreements.
func (con *Consensus) startAgreement() {
// Start a routine for listening receive channel and pull block channel.