From 215ab512cd2a48d1766ffaedbde41a8c74f27cca Mon Sep 17 00:00:00 2001 From: Ori Newman Date: Thu, 5 Nov 2020 02:39:39 -0800 Subject: [PATCH] [NOD-1515] Allow to process pruning point while in SyncStateMissingUTXOSet (#1005) --- .../blockprocessor/validateandinsertblock.go | 14 ++++++++++++-- .../consensusstatemanager/set_pruning_utxo_set.go | 5 ++++- domain/consensus/processes/syncmanager/antipast.go | 11 ++++++++++- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/domain/consensus/processes/blockprocessor/validateandinsertblock.go b/domain/consensus/processes/blockprocessor/validateandinsertblock.go index e9ac9e2dd..ac1b2f2e2 100644 --- a/domain/consensus/processes/blockprocessor/validateandinsertblock.go +++ b/domain/consensus/processes/blockprocessor/validateandinsertblock.go @@ -13,11 +13,21 @@ func (bp *blockProcessor) validateAndInsertBlock(block *externalapi.DomainBlock) return err } + hash := consensusserialization.HeaderHash(block.Header) if mode.State == externalapi.SyncStateMissingUTXOSet { - return errors.Errorf("cannot insert blocks while in %s mode", mode.State) + headerTipsPruningPoint, err := bp.consensusStateManager.HeaderTipsPruningPoint() + if err != nil { + return err + } + + if *hash != *headerTipsPruningPoint { + return errors.Errorf("cannot insert blocks other than the header pruning point "+ + "while in %s mode", mode.State) + } + + mode.State = externalapi.SyncStateMissingBlockBodies } - hash := consensusserialization.HeaderHash(block.Header) if mode.State == externalapi.SyncStateHeadersFirst && len(block.Transactions) != 0 { mode.State = externalapi.SyncStateNormal log.Warnf("block %s contains transactions while validating in header only mode", hash) diff --git a/domain/consensus/processes/consensusstatemanager/set_pruning_utxo_set.go b/domain/consensus/processes/consensusstatemanager/set_pruning_utxo_set.go index f198ae58f..8651162db 100644 --- a/domain/consensus/processes/consensusstatemanager/set_pruning_utxo_set.go +++ b/domain/consensus/processes/consensusstatemanager/set_pruning_utxo_set.go @@ -64,7 +64,10 @@ func (csm *consensusStateManager) setPruningPointUTXOSet(serializedUTXOSet []byt return err } - csm.consensusStateStore.StageVirtualUTXOSet(protoUTXOSetToReadOnlyUTXOSetIterator(protoUTXOSet)) + err = csm.consensusStateStore.StageVirtualUTXOSet(protoUTXOSetToReadOnlyUTXOSetIterator(protoUTXOSet)) + if err != nil { + return err + } err = csm.ghostdagManager.GHOSTDAG(model.VirtualBlockHash) if err != nil { diff --git a/domain/consensus/processes/syncmanager/antipast.go b/domain/consensus/processes/syncmanager/antipast.go index b0db17549..a0e0f45d6 100644 --- a/domain/consensus/processes/syncmanager/antipast.go +++ b/domain/consensus/processes/syncmanager/antipast.go @@ -111,7 +111,16 @@ func (sm *syncManager) missingBlockBodyHashes(highHash *externalapi.DomainHash) lowHash := headerTipsPruningPoint for selectedChildIterator.Next() { - lowHash = selectedChildIterator.Get() + selectedChild := selectedChildIterator.Get() + selectedChildStatus, err := sm.blockStatusStore.Get(sm.databaseContext, selectedChild) + if err != nil { + return nil, err + } + + if selectedChildStatus != externalapi.StatusHeaderOnly { + lowHash = selectedChild + break + } } hashesBetween, err := sm.antiPastHashesBetween(lowHash, highHash)