From cd2d9724247d557107ca3fa2d0c84a68cc4bdf02 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Tue, 26 Nov 2019 17:51:46 +0400 Subject: [PATCH] cs: set missing_validators(_power) metrics to 0 for 1st block also, do not send any LastCommitInfo.Votes for 1st block. remember that the first LastCommit is intentionally empty, so it makes sense for LastCommitInfo.Votes to also be empty. Because we can't really tell if validator signed or not. Similar for ^ metrics, we can't say if particular validator was missing or not. Closes #4192 --- consensus/state.go | 26 ++++++++++++++++---------- state/execution.go | 19 ++++++++++--------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/consensus/state.go b/consensus/state.go index 015c3b513cd..edab0a5971d 100644 --- a/consensus/state.go +++ b/consensus/state.go @@ -1461,20 +1461,26 @@ func (cs *ConsensusState) finalizeCommit(height int64) { func (cs *ConsensusState) recordMetrics(height int64, block *types.Block) { cs.metrics.Validators.Set(float64(cs.Validators.Size())) cs.metrics.ValidatorsPower.Set(float64(cs.Validators.TotalVotingPower())) - missingValidators := 0 - missingValidatorsPower := int64(0) - for i, val := range cs.Validators.Validators { - if i >= len(block.LastCommit.Signatures) { - break - } - commitSig := block.LastCommit.Signatures[i] - if commitSig.Absent() { - missingValidators++ - missingValidatorsPower += val.VotingPower + + var ( + missingValidators int + missingValidatorsPower int64 + ) + // height=0 -> MissingValidators and MissingValidatorsPower are both 0. + // Remember that the first LastCommit is intentionally empty, so it's not + // fair to increment missing validators number. + if height > 1 { + for i, val := range cs.Validators.Validators { + commitSig := block.LastCommit.Signatures[i] + if commitSig.Absent() { + missingValidators++ + missingValidatorsPower += val.VotingPower + } } } cs.metrics.MissingValidators.Set(float64(missingValidators)) cs.metrics.MissingValidatorsPower.Set(float64(missingValidatorsPower)) + cs.metrics.ByzantineValidators.Set(float64(len(block.Evidence.Evidence))) byzantineValidatorsPower := int64(0) for _, ev := range block.Evidence.Evidence { diff --git a/state/execution.go b/state/execution.go index 1db51590955..3848d2a5c1d 100644 --- a/state/execution.go +++ b/state/execution.go @@ -332,16 +332,17 @@ func getBeginBlockValidatorInfo(block *types.Block, stateDB dbm.DB) (abci.LastCo lastValSet = types.NewValidatorSet(nil) } - for i, val := range lastValSet.Validators { - if i >= len(block.LastCommit.Signatures) { - break - } - commitSig := block.LastCommit.Signatures[i] - voteInfo := abci.VoteInfo{ - Validator: types.TM2PB.Validator(val), - SignedLastBlock: !commitSig.Absent(), + // block.Height=1 -> LastCommitInfo.Votes are empty. + // Remember that the first LastCommit is intentionally empty, so it makes + // sense for LastCommitInfo.Votes to also be empty. + if block.Height > 1 { + for i, val := range lastValSet.Validators { + commitSig := block.LastCommit.Signatures[i] + voteInfos[i] = abci.VoteInfo{ + Validator: types.TM2PB.Validator(val), + SignedLastBlock: !commitSig.Absent(), + } } - voteInfos[i] = voteInfo } for i, ev := range block.Evidence.Evidence {