From 2e3dc96133f15e80cdac6c9e6cbc7c863c3c5f14 Mon Sep 17 00:00:00 2001 From: Arnaud Mimart <33665250+amimart@users.noreply.github.com> Date: Fri, 23 Dec 2022 15:04:15 +0100 Subject: [PATCH] fix(register): ensure missedblocks propulated --- app/actor/subscription/actor.go | 11 +++++++++++ app/nemeton/store.go | 19 ++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/app/actor/subscription/actor.go b/app/actor/subscription/actor.go index 3588064..74b3fde 100644 --- a/app/actor/subscription/actor.go +++ b/app/actor/subscription/actor.go @@ -2,6 +2,7 @@ package subscription import ( "context" + "fmt" "time" "okp4/nemeton-leaderboard/app/util" @@ -28,6 +29,7 @@ type Actor struct { ctx context.Context eventPID *actor.PID offsetStore *offset.Store + lastHeight *int64 } func NewSubscriber(mongoURI, dbName string, eventPID *actor.PID) (*Actor, error) { @@ -117,6 +119,8 @@ func (a *Actor) handleNewBlockEvent(data map[string]interface{}) { logger := log.With().Time("blockTime", e.Time).Int64("height", e.Height).Logger() logger.Info().Msg("Handle NewBlock event") + a.lastHeight = &e.Height + consensusAddr := make([]types.ConsAddress, len(e.Signatures)) for i, signature := range e.Signatures { consensusAddr[i] = signature.GetValidatorAddress() @@ -184,6 +188,12 @@ func (a *Actor) handleValidatorRegisteredEvent(data map[string]interface{}) { return } + if a.lastHeight == nil { + log.Err(fmt.Errorf("doesn't have a last height")). + Interface("data", data). + Msg("🤕 Couldn't register validator") + } + if err := a.store.RegisterValidator( context.Background(), e.Valoper, @@ -193,6 +203,7 @@ func (a *Actor) handleValidatorRegisteredEvent(data map[string]interface{}) { e.Discord, e.Country, e.Twitter, + *a.lastHeight, ); err != nil { log.Err(err).Interface("data", data).Msg("🤕 Couldn't register validator") } diff --git a/app/nemeton/store.go b/app/nemeton/store.go index fcb7538..4d5eb58 100644 --- a/app/nemeton/store.go +++ b/app/nemeton/store.go @@ -321,13 +321,30 @@ func (s *Store) RegisterValidator( description stakingtypes.Description, discord, country string, twitter *string, + lastHeight int64, ) error { validator, err := NewValidator(valoper, delegator, valcons, description, discord, country, twitter) if err != nil { return err } - _, err = s.db.Collection(validatorsCollectionName).InsertOne(ctx, validator) + res, err := s.db.Collection(validatorsCollectionName).InsertOne(ctx, validator) + if err != nil { + return err + } + + _, err = s.db.Collection(validatorsCollectionName).UpdateOne( + ctx, + bson.M{"_id": res.InsertedID}, + bson.M{ + "missedBlocks": bson.A{ + bson.M{ + "from": 1, + "to": lastHeight + 1, + }, + }, + }, + ) return err }