aboutsummaryrefslogtreecommitdiffstats
path: root/core/agreement-mgr.go
diff options
context:
space:
mode:
authorJimmy Hu <jimmy.hu@dexon.org>2019-01-24 11:49:25 +0800
committerGitHub <noreply@github.com>2019-01-24 11:49:25 +0800
commitb6ca251bcb6e1a19a7276afe68bf37a4372670fa (patch)
treeb1aac8e9759f150d58009020cd92b579e766895c /core/agreement-mgr.go
parent779f63a9f6fc3f4c628f0b97c822546ac51d0eb6 (diff)
downloaddexon-consensus-b6ca251bcb6e1a19a7276afe68bf37a4372670fa.tar
dexon-consensus-b6ca251bcb6e1a19a7276afe68bf37a4372670fa.tar.gz
dexon-consensus-b6ca251bcb6e1a19a7276afe68bf37a4372670fa.tar.bz2
dexon-consensus-b6ca251bcb6e1a19a7276afe68bf37a4372670fa.tar.lz
dexon-consensus-b6ca251bcb6e1a19a7276afe68bf37a4372670fa.tar.xz
dexon-consensus-b6ca251bcb6e1a19a7276afe68bf37a4372670fa.tar.zst
dexon-consensus-b6ca251bcb6e1a19a7276afe68bf37a4372670fa.zip
core: Add vote filter (#430)
* core: ignore usless vote * core: export SkipBlockHash and NullBlockHash * core: add VoteFilter * Add test * New VoteFilter for each round
Diffstat (limited to 'core/agreement-mgr.go')
-rw-r--r--core/agreement-mgr.go15
1 files changed, 13 insertions, 2 deletions
diff --git a/core/agreement-mgr.go b/core/agreement-mgr.go
index 7410977..a8fab7c 100644
--- a/core/agreement-mgr.go
+++ b/core/agreement-mgr.go
@@ -94,6 +94,7 @@ type agreementMgr struct {
initRound uint64
configs []*agreementMgrConfig
baModules []*agreement
+ voteFilters []*utils.VoteFilter
waitGroup sync.WaitGroup
pendingVotes map[uint64][]*types.Vote
pendingBlocks map[uint64][]*types.Block
@@ -201,6 +202,7 @@ func (mgr *agreementMgr) appendConfig(
// Hacky way to make agreement module self contained.
recv.agreementModule = agrModule
mgr.baModules = append(mgr.baModules, agrModule)
+ mgr.voteFilters = append(mgr.voteFilters, utils.NewVoteFilter())
if mgr.isRunning {
mgr.waitGroup.Add(1)
go func(idx uint32) {
@@ -213,7 +215,6 @@ func (mgr *agreementMgr) appendConfig(
}
func (mgr *agreementMgr) processVote(v *types.Vote) error {
- v = v.Clone()
mgr.lock.RLock()
defer mgr.lock.RUnlock()
if v.Position.ChainID >= uint32(len(mgr.baModules)) {
@@ -224,7 +225,16 @@ func (mgr *agreementMgr) processVote(v *types.Vote) error {
"initRound", mgr.initRound)
return utils.ErrInvalidChainID
}
- return mgr.baModules[v.Position.ChainID].processVote(v)
+ filter := mgr.voteFilters[v.Position.ChainID]
+ if filter.Filter(v) {
+ return nil
+ }
+ v = v.Clone()
+ err := mgr.baModules[v.Position.ChainID].processVote(v)
+ if err == nil {
+ mgr.baModules[v.Position.ChainID].updateFilter(filter)
+ }
+ return err
}
func (mgr *agreementMgr) processBlock(b *types.Block) error {
@@ -423,6 +433,7 @@ Loop:
Round: setting.recv.round(),
ChainID: math.MaxUint32,
}
+ mgr.voteFilters[chainID] = utils.NewVoteFilter()
if err := mgr.baRoutineForOneRound(&setting); err != nil {
mgr.logger.Error("BA routine failed",
"error", err,