[NOD-1510] Update reachability reindex root based on header tips selected tip (#1001)

This commit is contained in:
Ori Newman 2020-11-04 06:55:59 -08:00 committed by GitHub
parent 2eb0d946e5
commit baf8d25656
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 55 additions and 19 deletions

View File

@ -103,7 +103,7 @@ func (f *factory) NewConsensus(dagParams *dagconfig.Params, db infrastructuredat
dbManager, dbManager,
ghostdagDataStore, ghostdagDataStore,
acceptanceDataStore) acceptanceDataStore)
headerTipsManager := headertipsmanager.New(dbManager, dagTopologyManager, headerTipsStore) headerTipsManager := headertipsmanager.New(dbManager, dagTopologyManager, ghostdagManager, headerTipsStore)
genesisHash := (*externalapi.DomainHash)(dagParams.GenesisHash) genesisHash := (*externalapi.DomainHash)(dagParams.GenesisHash)
mergeDepthManager := mergedepthmanager.New( mergeDepthManager := mergedepthmanager.New(
dagParams.FinalityDepth(), dagParams.FinalityDepth(),

View File

@ -5,7 +5,7 @@ import "github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
// GHOSTDAGManager resolves and manages GHOSTDAG block data // GHOSTDAGManager resolves and manages GHOSTDAG block data
type GHOSTDAGManager interface { type GHOSTDAGManager interface {
GHOSTDAG(blockHash *externalapi.DomainHash) error GHOSTDAG(blockHash *externalapi.DomainHash) error
ChooseSelectedParent(blockHashA *externalapi.DomainHash, blockHashB *externalapi.DomainHash) (*externalapi.DomainHash, error) ChooseSelectedParent(blockHashes ...*externalapi.DomainHash) (*externalapi.DomainHash, error)
Less(blockHashA *externalapi.DomainHash, ghostdagDataA *BlockGHOSTDAGData, Less(blockHashA *externalapi.DomainHash, ghostdagDataA *BlockGHOSTDAGData,
blockHashB *externalapi.DomainHash, ghostdagDataB *BlockGHOSTDAGData) bool blockHashB *externalapi.DomainHash, ghostdagDataB *BlockGHOSTDAGData) bool
} }

View File

@ -5,4 +5,5 @@ import "github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
// HeaderTipsManager manages the state of the header tips // HeaderTipsManager manages the state of the header tips
type HeaderTipsManager interface { type HeaderTipsManager interface {
AddHeaderTip(hash *externalapi.DomainHash) error AddHeaderTip(hash *externalapi.DomainHash) error
SelectedTip() (*externalapi.DomainHash, error)
} }

View File

@ -62,6 +62,11 @@ func (bp *blockProcessor) validateAndInsertBlock(block *externalapi.DomainBlock)
return err return err
} }
oldHeadersSelectedTip, err := bp.headerTipsManager.SelectedTip()
if err != nil {
return err
}
if mode.State == externalapi.SyncStateHeadersFirst { if mode.State == externalapi.SyncStateHeadersFirst {
err = bp.headerTipsManager.AddHeaderTip(hash) err = bp.headerTipsManager.AddHeaderTip(hash)
if err != nil { if err != nil {
@ -81,6 +86,11 @@ func (bp *blockProcessor) validateAndInsertBlock(block *externalapi.DomainBlock)
bp.headerTipsStore.Stage(tips) bp.headerTipsStore.Stage(tips)
} }
err = bp.updateReachabilityReindexRoot(oldHeadersSelectedTip)
if err != nil {
return err
}
// Trigger pruning, which will check if the pruning point changed and delete the data if it did. // Trigger pruning, which will check if the pruning point changed and delete the data if it did.
err = bp.pruningManager.FindNextPruningPoint() err = bp.pruningManager.FindNextPruningPoint()
if err != nil { if err != nil {
@ -90,6 +100,19 @@ func (bp *blockProcessor) validateAndInsertBlock(block *externalapi.DomainBlock)
return bp.commitAllChanges() return bp.commitAllChanges()
} }
func (bp *blockProcessor) updateReachabilityReindexRoot(oldHeadersSelectedTip *externalapi.DomainHash) error {
headersSelectedTip, err := bp.headerTipsManager.SelectedTip()
if err != nil {
return err
}
if *headersSelectedTip == *oldHeadersSelectedTip {
return nil
}
return bp.reachabilityManager.UpdateReindexRoot(headersSelectedTip)
}
func (bp *blockProcessor) checkBlockStatus(hash *externalapi.DomainHash, mode *externalapi.SyncInfo) error { func (bp *blockProcessor) checkBlockStatus(hash *externalapi.DomainHash, mode *externalapi.SyncInfo) error {
exists, err := bp.blockStatusStore.Exists(bp.databaseContext, hash) exists, err := bp.blockStatusStore.Exists(bp.databaseContext, hash)
if err != nil { if err != nil {

View File

@ -24,11 +24,6 @@ func (csm *consensusStateManager) AddBlockToVirtual(blockHash *externalapi.Domai
if err != nil { if err != nil {
return err return err
} }
err = csm.reachabilityManager.UpdateReindexRoot(blockHash)
if err != nil {
return err
}
} }
} }

View File

@ -32,23 +32,25 @@ func (gm *ghostdagManager) less(blockHashA *externalapi.DomainHash, blockHashB *
return chosenSelectedParent == blockHashB, nil return chosenSelectedParent == blockHashB, nil
} }
func (gm *ghostdagManager) ChooseSelectedParent(blockHashA *externalapi.DomainHash, func (gm *ghostdagManager) ChooseSelectedParent(blockHashes ...*externalapi.DomainHash) (*externalapi.DomainHash, error) {
blockHashB *externalapi.DomainHash) (*externalapi.DomainHash, error) { selectedParent := blockHashes[0]
selectedParentGHOSTDAGData, err := gm.ghostdagDataStore.Get(gm.databaseContext, selectedParent)
blockAGHOSTDAGData, err := gm.ghostdagDataStore.Get(gm.databaseContext, blockHashA)
if err != nil { if err != nil {
return nil, err return nil, err
} }
blockBGHOSTDAGData, err := gm.ghostdagDataStore.Get(gm.databaseContext, blockHashB) for _, blockHash := range blockHashes {
blockGHOSTDAGData, err := gm.ghostdagDataStore.Get(gm.databaseContext, blockHash)
if err != nil { if err != nil {
return nil, err return nil, err
} }
if gm.Less(blockHashA, blockAGHOSTDAGData, blockHashB, blockBGHOSTDAGData) { if gm.Less(selectedParent, selectedParentGHOSTDAGData, blockHash, blockGHOSTDAGData) {
return blockHashB, nil selectedParent = blockHash
selectedParentGHOSTDAGData = blockGHOSTDAGData
}
} }
return blockHashA, nil return selectedParent, nil
} }
func (gm *ghostdagManager) Less(blockHashA *externalapi.DomainHash, ghostdagDataA *model.BlockGHOSTDAGData, func (gm *ghostdagManager) Less(blockHashA *externalapi.DomainHash, ghostdagDataA *model.BlockGHOSTDAGData,

View File

@ -8,16 +8,19 @@ import (
type headerTipsManager struct { type headerTipsManager struct {
databaseContext model.DBReader databaseContext model.DBReader
dagTopologyManager model.DAGTopologyManager dagTopologyManager model.DAGTopologyManager
ghostdagManager model.GHOSTDAGManager
headerTipsStore model.HeaderTipsStore headerTipsStore model.HeaderTipsStore
} }
// New instantiates a new HeaderTipsManager // New instantiates a new HeaderTipsManager
func New(databaseContext model.DBReader, func New(databaseContext model.DBReader,
dagTopologyManager model.DAGTopologyManager, dagTopologyManager model.DAGTopologyManager,
ghostdagManager model.GHOSTDAGManager,
headerTipsStore model.HeaderTipsStore) model.HeaderTipsManager { headerTipsStore model.HeaderTipsStore) model.HeaderTipsManager {
return &headerTipsManager{ return &headerTipsManager{
databaseContext: databaseContext, databaseContext: databaseContext,
dagTopologyManager: dagTopologyManager, dagTopologyManager: dagTopologyManager,
ghostdagManager: ghostdagManager,
headerTipsStore: headerTipsStore, headerTipsStore: headerTipsStore,
} }
} }

View File

@ -0,0 +1,12 @@
package headertipsmanager
import "github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
func (h headerTipsManager) SelectedTip() (*externalapi.DomainHash, error) {
tips, err := h.headerTipsStore.Tips(h.databaseContext)
if err != nil {
return nil, err
}
return h.ghostdagManager.ChooseSelectedParent(tips...)
}