[NOD-1550] Don't request blocks for invs that are known to be orphans (#1108)

* [NOD-1550] Implement IsOrphan().

* [NOD-1550] Don't request blocks for invs that are known to be orphans.
This commit is contained in:
stasatdaglabs 2020-11-18 13:37:14 +02:00 committed by GitHub
parent 75d21d39cc
commit ed386bbc8f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 20 additions and 2 deletions

View File

@ -53,7 +53,7 @@ type FlowContext struct {
peersMutex sync.RWMutex
orphans map[externalapi.DomainHash]*externalapi.DomainBlock
orphansMutex sync.Mutex
orphansMutex sync.RWMutex
}
// New returns a new instance of FlowContext.

View File

@ -58,11 +58,15 @@ func (f *FlowContext) selectPeerForIBD(syncInfo *externalapi.SyncInfo) (*peerpkg
for _, peer := range f.peers {
peerSelectedTipHash := peer.SelectedTipHash()
if f.IsOrphan(peerSelectedTipHash) {
continue
}
blockInfo, err := f.domain.Consensus().GetBlockInfo(peerSelectedTipHash)
if err != nil {
return nil, err
}
if syncInfo.State == externalapi.SyncStateHeadersFirst {
if !blockInfo.Exists {
return peer, nil

View File

@ -18,6 +18,15 @@ func (f *FlowContext) AddOrphan(orphanBlock *externalapi.DomainBlock) {
log.Infof("Received a block with missing parents, adding to orphan pool: %s", orphanHash)
}
// IsOrphan returns whether the given blockHash belongs to an orphan block
func (f *FlowContext) IsOrphan(blockHash *externalapi.DomainHash) bool {
f.orphansMutex.RLock()
defer f.orphansMutex.RUnlock()
_, ok := f.orphans[*blockHash]
return ok
}
// UnorphanBlocks removes the block from the orphan set, and remove all of the blocks that are not orphans anymore.
func (f *FlowContext) UnorphanBlocks(rootBlock *externalapi.DomainBlock) ([]*externalapi.DomainBlock, error) {
f.orphansMutex.Lock()

View File

@ -26,6 +26,7 @@ type RelayInvsContext interface {
IsInIBD() bool
Broadcast(message appmessage.Message) error
AddOrphan(orphanBlock *externalapi.DomainBlock)
IsOrphan(blockHash *externalapi.DomainHash) bool
}
type handleRelayInvsFlow struct {
@ -71,6 +72,10 @@ func (flow *handleRelayInvsFlow) start() error {
continue
}
if flow.IsOrphan(inv.Hash) {
continue
}
err = flow.StartIBDIfRequired()
if err != nil {
return err