diff --git a/cmd/node/config/config.toml b/cmd/node/config/config.toml index 7b750bbe5ae..53de02e0847 100644 --- a/cmd/node/config/config.toml +++ b/cmd/node/config/config.toml @@ -33,6 +33,11 @@ # SyncProcessTimeSupernovaInMillis is the value in milliseconds used when processing blocks while synchronizing blocks after Supernova SyncProcessTimeSupernovaInMillis = 6000 + # MaxNumOfRequestsForHeaderProof represents how many times the sync process will request the proof + # for a header already cached in the pool before evicting that header. Eviction allows the next + # sync iteration to fetch a fresh header+proof pair by nonce + MaxNumOfRequestsForHeaderProof = 10 + # SetGuardianEpochsDelay represents the delay in epochs between the execution time of the SetGuardian transaction and # the activation of the configured guardian. # Make sure that this is greater than the unbonding period! diff --git a/config/config.go b/config/config.go index 17aff27f089..e28cafa709c 100644 --- a/config/config.go +++ b/config/config.go @@ -429,6 +429,7 @@ type GeneralSettingsConfig struct { GenesisMaxNumberOfShards uint32 SyncProcessTimeInMillis uint32 SyncProcessTimeSupernovaInMillis uint32 + MaxNumOfRequestsForHeaderProof uint32 SetGuardianEpochsDelay uint32 MaxProposalNonceGap uint64 ChainParametersByEpoch []ChainParametersByEpochConfig diff --git a/factory/consensus/consensusComponents.go b/factory/consensus/consensusComponents.go index 8862fe21de6..7bb8adef965 100644 --- a/factory/consensus/consensusComponents.go +++ b/factory/consensus/consensusComponents.go @@ -498,38 +498,39 @@ func (ccf *consensusComponentsFactory) createShardBootstrapper() (process.Bootst } argsBaseBootstrapper := sync.ArgBaseBootstrapper{ - PoolsHolder: ccf.dataComponents.Datapool(), - Store: ccf.dataComponents.StorageService(), - ChainHandler: ccf.dataComponents.Blockchain(), - RoundHandler: ccf.processComponents.RoundHandler(), - BlockProcessor: ccf.processComponents.BlockProcessor(), - Hasher: ccf.coreComponents.Hasher(), - Marshalizer: ccf.coreComponents.InternalMarshalizer(), - ForkDetector: ccf.processComponents.ForkDetector(), - RequestHandler: ccf.processComponents.RequestHandler(), - ShardCoordinator: ccf.processComponents.ShardCoordinator(), - Accounts: ccf.stateComponents.AccountsAdapter(), - BlackListHandler: ccf.processComponents.BlackListHandler(), - NetworkWatcher: ccf.networkComponents.NetworkMessenger(), - BootStorer: ccf.processComponents.BootStorer(), - StorageBootstrapper: shardStorageBootstrapper, - EpochHandler: ccf.processComponents.EpochStartTrigger(), - MiniblocksProvider: ccf.dataComponents.MiniBlocksProvider(), - Uint64Converter: ccf.coreComponents.Uint64ByteSliceConverter(), - AppStatusHandler: ccf.statusCoreComponents.AppStatusHandler(), - OutportHandler: ccf.statusComponents.OutportHandler(), - AccountsDBSyncer: accountsDBSyncer, - CurrentEpochProvider: ccf.processComponents.CurrentEpochProvider(), - IsInImportMode: ccf.isInImportMode, - HistoryRepo: ccf.processComponents.HistoryRepository(), - ScheduledTxsExecutionHandler: ccf.processComponents.ScheduledTxsExecutionHandler(), - ProcessWaitTime: time.Duration(ccf.config.GeneralSettings.SyncProcessTimeInMillis) * time.Millisecond, - ProcessWaitTimeSupernova: time.Duration(ccf.config.GeneralSettings.SyncProcessTimeSupernovaInMillis) * time.Millisecond, - RepopulateTokensSupplies: ccf.flagsConfig.RepopulateTokensSupplies, - EnableEpochsHandler: ccf.coreComponents.EnableEpochsHandler(), - ExecutionManager: ccf.processComponents.ExecutionManager(), - EnableRoundsHandler: ccf.coreComponents.EnableRoundsHandler(), - ProcessConfigsHandler: ccf.coreComponents.ProcessConfigsHandler(), + PoolsHolder: ccf.dataComponents.Datapool(), + Store: ccf.dataComponents.StorageService(), + ChainHandler: ccf.dataComponents.Blockchain(), + RoundHandler: ccf.processComponents.RoundHandler(), + BlockProcessor: ccf.processComponents.BlockProcessor(), + Hasher: ccf.coreComponents.Hasher(), + Marshalizer: ccf.coreComponents.InternalMarshalizer(), + ForkDetector: ccf.processComponents.ForkDetector(), + RequestHandler: ccf.processComponents.RequestHandler(), + ShardCoordinator: ccf.processComponents.ShardCoordinator(), + Accounts: ccf.stateComponents.AccountsAdapter(), + BlackListHandler: ccf.processComponents.BlackListHandler(), + NetworkWatcher: ccf.networkComponents.NetworkMessenger(), + BootStorer: ccf.processComponents.BootStorer(), + StorageBootstrapper: shardStorageBootstrapper, + EpochHandler: ccf.processComponents.EpochStartTrigger(), + MiniblocksProvider: ccf.dataComponents.MiniBlocksProvider(), + Uint64Converter: ccf.coreComponents.Uint64ByteSliceConverter(), + AppStatusHandler: ccf.statusCoreComponents.AppStatusHandler(), + OutportHandler: ccf.statusComponents.OutportHandler(), + AccountsDBSyncer: accountsDBSyncer, + CurrentEpochProvider: ccf.processComponents.CurrentEpochProvider(), + IsInImportMode: ccf.isInImportMode, + HistoryRepo: ccf.processComponents.HistoryRepository(), + ScheduledTxsExecutionHandler: ccf.processComponents.ScheduledTxsExecutionHandler(), + ProcessWaitTime: time.Duration(ccf.config.GeneralSettings.SyncProcessTimeInMillis) * time.Millisecond, + ProcessWaitTimeSupernova: time.Duration(ccf.config.GeneralSettings.SyncProcessTimeSupernovaInMillis) * time.Millisecond, + MaxNumOfRequestsForHeaderProof: ccf.config.GeneralSettings.MaxNumOfRequestsForHeaderProof, + RepopulateTokensSupplies: ccf.flagsConfig.RepopulateTokensSupplies, + EnableEpochsHandler: ccf.coreComponents.EnableEpochsHandler(), + ExecutionManager: ccf.processComponents.ExecutionManager(), + EnableRoundsHandler: ccf.coreComponents.EnableRoundsHandler(), + ProcessConfigsHandler: ccf.coreComponents.ProcessConfigsHandler(), } argsShardBootstrapper := sync.ArgShardBootstrapper{ @@ -635,38 +636,39 @@ func (ccf *consensusComponentsFactory) createMetaChainBootstrapper() (process.Bo } argsBaseBootstrapper := sync.ArgBaseBootstrapper{ - PoolsHolder: ccf.dataComponents.Datapool(), - Store: ccf.dataComponents.StorageService(), - ChainHandler: ccf.dataComponents.Blockchain(), - RoundHandler: ccf.processComponents.RoundHandler(), - BlockProcessor: ccf.processComponents.BlockProcessor(), - ExecutionManager: ccf.processComponents.ExecutionManager(), - Hasher: ccf.coreComponents.Hasher(), - Marshalizer: ccf.coreComponents.InternalMarshalizer(), - ForkDetector: ccf.processComponents.ForkDetector(), - RequestHandler: ccf.processComponents.RequestHandler(), - ShardCoordinator: ccf.processComponents.ShardCoordinator(), - Accounts: ccf.stateComponents.AccountsAdapter(), - BlackListHandler: ccf.processComponents.BlackListHandler(), - NetworkWatcher: ccf.networkComponents.NetworkMessenger(), - BootStorer: ccf.processComponents.BootStorer(), - StorageBootstrapper: metaStorageBootstrapper, - EpochHandler: ccf.processComponents.EpochStartTrigger(), - MiniblocksProvider: ccf.dataComponents.MiniBlocksProvider(), - Uint64Converter: ccf.coreComponents.Uint64ByteSliceConverter(), - AppStatusHandler: ccf.statusCoreComponents.AppStatusHandler(), - OutportHandler: ccf.statusComponents.OutportHandler(), - AccountsDBSyncer: accountsDBSyncer, - CurrentEpochProvider: ccf.processComponents.CurrentEpochProvider(), - IsInImportMode: ccf.isInImportMode, - HistoryRepo: ccf.processComponents.HistoryRepository(), - ScheduledTxsExecutionHandler: ccf.processComponents.ScheduledTxsExecutionHandler(), - ProcessWaitTime: time.Duration(ccf.config.GeneralSettings.SyncProcessTimeInMillis) * time.Millisecond, - ProcessWaitTimeSupernova: time.Duration(ccf.config.GeneralSettings.SyncProcessTimeSupernovaInMillis) * time.Millisecond, - RepopulateTokensSupplies: ccf.flagsConfig.RepopulateTokensSupplies, - EnableEpochsHandler: ccf.coreComponents.EnableEpochsHandler(), - EnableRoundsHandler: ccf.coreComponents.EnableRoundsHandler(), - ProcessConfigsHandler: ccf.coreComponents.ProcessConfigsHandler(), + PoolsHolder: ccf.dataComponents.Datapool(), + Store: ccf.dataComponents.StorageService(), + ChainHandler: ccf.dataComponents.Blockchain(), + RoundHandler: ccf.processComponents.RoundHandler(), + BlockProcessor: ccf.processComponents.BlockProcessor(), + ExecutionManager: ccf.processComponents.ExecutionManager(), + Hasher: ccf.coreComponents.Hasher(), + Marshalizer: ccf.coreComponents.InternalMarshalizer(), + ForkDetector: ccf.processComponents.ForkDetector(), + RequestHandler: ccf.processComponents.RequestHandler(), + ShardCoordinator: ccf.processComponents.ShardCoordinator(), + Accounts: ccf.stateComponents.AccountsAdapter(), + BlackListHandler: ccf.processComponents.BlackListHandler(), + NetworkWatcher: ccf.networkComponents.NetworkMessenger(), + BootStorer: ccf.processComponents.BootStorer(), + StorageBootstrapper: metaStorageBootstrapper, + EpochHandler: ccf.processComponents.EpochStartTrigger(), + MiniblocksProvider: ccf.dataComponents.MiniBlocksProvider(), + Uint64Converter: ccf.coreComponents.Uint64ByteSliceConverter(), + AppStatusHandler: ccf.statusCoreComponents.AppStatusHandler(), + OutportHandler: ccf.statusComponents.OutportHandler(), + AccountsDBSyncer: accountsDBSyncer, + CurrentEpochProvider: ccf.processComponents.CurrentEpochProvider(), + IsInImportMode: ccf.isInImportMode, + HistoryRepo: ccf.processComponents.HistoryRepository(), + ScheduledTxsExecutionHandler: ccf.processComponents.ScheduledTxsExecutionHandler(), + ProcessWaitTime: time.Duration(ccf.config.GeneralSettings.SyncProcessTimeInMillis) * time.Millisecond, + ProcessWaitTimeSupernova: time.Duration(ccf.config.GeneralSettings.SyncProcessTimeSupernovaInMillis) * time.Millisecond, + MaxNumOfRequestsForHeaderProof: ccf.config.GeneralSettings.MaxNumOfRequestsForHeaderProof, + RepopulateTokensSupplies: ccf.flagsConfig.RepopulateTokensSupplies, + EnableEpochsHandler: ccf.coreComponents.EnableEpochsHandler(), + EnableRoundsHandler: ccf.coreComponents.EnableRoundsHandler(), + ProcessConfigsHandler: ccf.coreComponents.ProcessConfigsHandler(), } argsMetaBootstrapper := sync.ArgMetaBootstrapper{ diff --git a/integrationTests/consensus/consensus_test.go b/integrationTests/consensus/consensus_test.go index 85ad98c97bf..955e50b1843 100644 --- a/integrationTests/consensus/consensus_test.go +++ b/integrationTests/consensus/consensus_test.go @@ -521,6 +521,7 @@ func startNodesWithCommitBlock(nodes []*integrationTests.TestConsensusNode, mute GeneralSettings: config.GeneralSettingsConfig{ SyncProcessTimeInMillis: 6000, SyncProcessTimeSupernovaInMillis: 3000, + MaxNumOfRequestsForHeaderProof: 10, }, }, BootstrapRoundIndex: 0, diff --git a/integrationTests/testSyncNode.go b/integrationTests/testSyncNode.go index 45e040e2821..a6264e939c4 100644 --- a/integrationTests/testSyncNode.go +++ b/integrationTests/testSyncNode.go @@ -324,38 +324,39 @@ func (tpn *TestProcessorNode) initBlockProcessorWithSync() { func (tpn *TestProcessorNode) createShardBootstrapper() (TestBootstrapper, error) { argsBaseBootstrapper := sync.ArgBaseBootstrapper{ - PoolsHolder: tpn.DataPool, - Store: tpn.Storage, - ChainHandler: tpn.BlockChain, - RoundHandler: tpn.RoundHandler, - BlockProcessor: tpn.BlockProcessor, - ExecutionManager: tpn.ExecutionManager, - Hasher: TestHasher, - Marshalizer: TestMarshalizer, - ForkDetector: tpn.ForkDetector, - RequestHandler: tpn.RequestHandler, - ShardCoordinator: tpn.ShardCoordinator, - Accounts: tpn.AccntState, - BlackListHandler: tpn.BlockBlackListHandler, - NetworkWatcher: tpn.MainMessenger, - BootStorer: tpn.BootstrapStorer, - StorageBootstrapper: tpn.StorageBootstrapper, - EpochHandler: tpn.EpochStartTrigger, - MiniblocksProvider: tpn.MiniblocksProvider, - Uint64Converter: TestUint64Converter, - AppStatusHandler: TestAppStatusHandler, - OutportHandler: disabled.NewDisabledOutport(), - AccountsDBSyncer: &mock.AccountsDBSyncerStub{}, - CurrentEpochProvider: &testscommon.CurrentEpochProviderStub{}, - IsInImportMode: false, - HistoryRepo: &dblookupext.HistoryRepositoryStub{}, - ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, - ProcessWaitTime: tpn.RoundHandler.TimeDuration(), - ProcessWaitTimeSupernova: tpn.RoundHandler.TimeDuration(), - RepopulateTokensSupplies: false, - EnableEpochsHandler: tpn.EnableEpochsHandler, - EnableRoundsHandler: tpn.EnableRoundsHandler, - ProcessConfigsHandler: tpn.ProcessConfigsHandler, + PoolsHolder: tpn.DataPool, + Store: tpn.Storage, + ChainHandler: tpn.BlockChain, + RoundHandler: tpn.RoundHandler, + BlockProcessor: tpn.BlockProcessor, + ExecutionManager: tpn.ExecutionManager, + Hasher: TestHasher, + Marshalizer: TestMarshalizer, + ForkDetector: tpn.ForkDetector, + RequestHandler: tpn.RequestHandler, + ShardCoordinator: tpn.ShardCoordinator, + Accounts: tpn.AccntState, + BlackListHandler: tpn.BlockBlackListHandler, + NetworkWatcher: tpn.MainMessenger, + BootStorer: tpn.BootstrapStorer, + StorageBootstrapper: tpn.StorageBootstrapper, + EpochHandler: tpn.EpochStartTrigger, + MiniblocksProvider: tpn.MiniblocksProvider, + Uint64Converter: TestUint64Converter, + AppStatusHandler: TestAppStatusHandler, + OutportHandler: disabled.NewDisabledOutport(), + AccountsDBSyncer: &mock.AccountsDBSyncerStub{}, + CurrentEpochProvider: &testscommon.CurrentEpochProviderStub{}, + IsInImportMode: false, + HistoryRepo: &dblookupext.HistoryRepositoryStub{}, + ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, + ProcessWaitTime: tpn.RoundHandler.TimeDuration(), + ProcessWaitTimeSupernova: tpn.RoundHandler.TimeDuration(), + MaxNumOfRequestsForHeaderProof: 10, + RepopulateTokensSupplies: false, + EnableEpochsHandler: tpn.EnableEpochsHandler, + EnableRoundsHandler: tpn.EnableRoundsHandler, + ProcessConfigsHandler: tpn.ProcessConfigsHandler, } argsShardBootstrapper := sync.ArgShardBootstrapper{ @@ -374,38 +375,39 @@ func (tpn *TestProcessorNode) createShardBootstrapper() (TestBootstrapper, error func (tpn *TestProcessorNode) createMetaChainBootstrapper() (TestBootstrapper, error) { argsBaseBootstrapper := sync.ArgBaseBootstrapper{ - PoolsHolder: tpn.DataPool, - Store: tpn.Storage, - ChainHandler: tpn.BlockChain, - RoundHandler: tpn.RoundHandler, - BlockProcessor: tpn.BlockProcessor, - ExecutionManager: tpn.ExecutionManager, - Hasher: TestHasher, - Marshalizer: TestMarshalizer, - ForkDetector: tpn.ForkDetector, - RequestHandler: tpn.RequestHandler, - ShardCoordinator: tpn.ShardCoordinator, - Accounts: tpn.AccntState, - BlackListHandler: tpn.BlockBlackListHandler, - NetworkWatcher: tpn.MainMessenger, - BootStorer: tpn.BootstrapStorer, - StorageBootstrapper: tpn.StorageBootstrapper, - EpochHandler: tpn.EpochStartTrigger, - MiniblocksProvider: tpn.MiniblocksProvider, - Uint64Converter: TestUint64Converter, - AppStatusHandler: TestAppStatusHandler, - OutportHandler: disabled.NewDisabledOutport(), - AccountsDBSyncer: &mock.AccountsDBSyncerStub{}, - CurrentEpochProvider: &testscommon.CurrentEpochProviderStub{}, - IsInImportMode: false, - HistoryRepo: &dblookupext.HistoryRepositoryStub{}, - ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, - ProcessWaitTime: tpn.RoundHandler.TimeDuration(), - ProcessWaitTimeSupernova: tpn.RoundHandler.TimeDuration(), - RepopulateTokensSupplies: false, - EnableEpochsHandler: &enableEpochsHandlerMock.EnableEpochsHandlerStub{}, - EnableRoundsHandler: tpn.EnableRoundsHandler, - ProcessConfigsHandler: tpn.ProcessConfigsHandler, + PoolsHolder: tpn.DataPool, + Store: tpn.Storage, + ChainHandler: tpn.BlockChain, + RoundHandler: tpn.RoundHandler, + BlockProcessor: tpn.BlockProcessor, + ExecutionManager: tpn.ExecutionManager, + Hasher: TestHasher, + Marshalizer: TestMarshalizer, + ForkDetector: tpn.ForkDetector, + RequestHandler: tpn.RequestHandler, + ShardCoordinator: tpn.ShardCoordinator, + Accounts: tpn.AccntState, + BlackListHandler: tpn.BlockBlackListHandler, + NetworkWatcher: tpn.MainMessenger, + BootStorer: tpn.BootstrapStorer, + StorageBootstrapper: tpn.StorageBootstrapper, + EpochHandler: tpn.EpochStartTrigger, + MiniblocksProvider: tpn.MiniblocksProvider, + Uint64Converter: TestUint64Converter, + AppStatusHandler: TestAppStatusHandler, + OutportHandler: disabled.NewDisabledOutport(), + AccountsDBSyncer: &mock.AccountsDBSyncerStub{}, + CurrentEpochProvider: &testscommon.CurrentEpochProviderStub{}, + IsInImportMode: false, + HistoryRepo: &dblookupext.HistoryRepositoryStub{}, + ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, + ProcessWaitTime: tpn.RoundHandler.TimeDuration(), + ProcessWaitTimeSupernova: tpn.RoundHandler.TimeDuration(), + MaxNumOfRequestsForHeaderProof: 10, + RepopulateTokensSupplies: false, + EnableEpochsHandler: &enableEpochsHandlerMock.EnableEpochsHandlerStub{}, + EnableRoundsHandler: tpn.EnableRoundsHandler, + ProcessConfigsHandler: tpn.ProcessConfigsHandler, } argsMetaBootstrapper := sync.ArgMetaBootstrapper{ diff --git a/process/errors.go b/process/errors.go index 483e7a827d5..e6fb9a9ba87 100644 --- a/process/errors.go +++ b/process/errors.go @@ -1149,6 +1149,9 @@ var ErrNilHeartbeatCacher = errors.New("nil heartbeat cacher") // ErrInvalidProcessWaitTime signals that an invalid process wait time was provided var ErrInvalidProcessWaitTime = errors.New("invalid process wait time") +// ErrInvalidMaxNumOfRequestsForHeaderProof signals that an invalid max number of requests for header proof was provided +var ErrInvalidMaxNumOfRequestsForHeaderProof = errors.New("invalid max num of requests for header proof") + // ErrMetaHeaderEpochOutOfRange signals that the given header is out of accepted range var ErrMetaHeaderEpochOutOfRange = errors.New("epoch out of range for meta block header") diff --git a/process/sync/argBootstrapper.go b/process/sync/argBootstrapper.go index 1e7c35bd11c..3265b62d2c6 100644 --- a/process/sync/argBootstrapper.go +++ b/process/sync/argBootstrapper.go @@ -21,38 +21,39 @@ import ( // ArgBaseBootstrapper holds all dependencies required by the bootstrap data factory in order to create // new instances type ArgBaseBootstrapper struct { - HistoryRepo dblookupext.HistoryRepository - PoolsHolder dataRetriever.PoolsHolder - Store dataRetriever.StorageService - ChainHandler data.ChainHandler - RoundHandler consensus.RoundHandler - BlockProcessor process.BlockProcessor - ExecutionManager process.ExecutionManager - Hasher hashing.Hasher - Marshalizer marshal.Marshalizer - ForkDetector process.ForkDetector - RequestHandler process.RequestHandler - ShardCoordinator sharding.Coordinator - Accounts state.AccountsAdapter - BlackListHandler process.TimeCacher - NetworkWatcher process.NetworkConnectionWatcher - BootStorer process.BootStorer - StorageBootstrapper process.BootstrapperFromStorage - EpochHandler dataRetriever.EpochHandler - MiniblocksProvider process.MiniBlockProvider - Uint64Converter typeConverters.Uint64ByteSliceConverter - AppStatusHandler core.AppStatusHandler - OutportHandler outport.OutportHandler - AccountsDBSyncer process.AccountsDBSyncer - CurrentEpochProvider process.CurrentNetworkEpochProviderHandler - IsInImportMode bool - ScheduledTxsExecutionHandler process.ScheduledTxsExecutionHandler - ProcessWaitTime time.Duration - ProcessWaitTimeSupernova time.Duration - RepopulateTokensSupplies bool - EnableEpochsHandler common.EnableEpochsHandler - EnableRoundsHandler common.EnableRoundsHandler - ProcessConfigsHandler common.ProcessConfigsHandler + HistoryRepo dblookupext.HistoryRepository + PoolsHolder dataRetriever.PoolsHolder + Store dataRetriever.StorageService + ChainHandler data.ChainHandler + RoundHandler consensus.RoundHandler + BlockProcessor process.BlockProcessor + ExecutionManager process.ExecutionManager + Hasher hashing.Hasher + Marshalizer marshal.Marshalizer + ForkDetector process.ForkDetector + RequestHandler process.RequestHandler + ShardCoordinator sharding.Coordinator + Accounts state.AccountsAdapter + BlackListHandler process.TimeCacher + NetworkWatcher process.NetworkConnectionWatcher + BootStorer process.BootStorer + StorageBootstrapper process.BootstrapperFromStorage + EpochHandler dataRetriever.EpochHandler + MiniblocksProvider process.MiniBlockProvider + Uint64Converter typeConverters.Uint64ByteSliceConverter + AppStatusHandler core.AppStatusHandler + OutportHandler outport.OutportHandler + AccountsDBSyncer process.AccountsDBSyncer + CurrentEpochProvider process.CurrentNetworkEpochProviderHandler + IsInImportMode bool + ScheduledTxsExecutionHandler process.ScheduledTxsExecutionHandler + ProcessWaitTime time.Duration + ProcessWaitTimeSupernova time.Duration + MaxNumOfRequestsForHeaderProof uint32 + RepopulateTokensSupplies bool + EnableEpochsHandler common.EnableEpochsHandler + EnableRoundsHandler common.EnableRoundsHandler + ProcessConfigsHandler common.ProcessConfigsHandler } // ArgShardBootstrapper holds all dependencies required by the bootstrap data factory in order to create diff --git a/process/sync/baseSync.go b/process/sync/baseSync.go index 8e88eb84424..14dba83f2e8 100644 --- a/process/sync/baseSync.go +++ b/process/sync/baseSync.go @@ -123,6 +123,10 @@ type baseBootstrap struct { mapNonceSyncedWithErrors map[uint64]uint32 mutNonceSyncedWithErrors sync.RWMutex + mapNonceProofRequests map[uint64]uint32 + mutNonceProofRequests sync.RWMutex + maxNumOfRequestsForHeaderProof uint32 + requestMiniBlocks func(headerHandler data.HeaderHandler) networkWatcher process.NetworkConnectionWatcher @@ -704,6 +708,9 @@ func checkBaseBootstrapParameters(arguments ArgBaseBootstrapper) error { if arguments.ProcessWaitTimeSupernova < minimumProcessWaitTime { return fmt.Errorf("%w for Supernova, minimum is %v, provided is %v", process.ErrInvalidProcessWaitTime, minimumProcessWaitTime, arguments.ProcessWaitTimeSupernova) } + if arguments.MaxNumOfRequestsForHeaderProof == 0 { + return process.ErrInvalidMaxNumOfRequestsForHeaderProof + } if check.IfNil(arguments.EnableEpochsHandler) { return process.ErrNilEnableEpochsHandler } @@ -831,6 +838,19 @@ func (boot *baseBootstrap) incrementSyncedWithErrorsForNonce(nonce uint64) uint3 return numSyncedWithErrors } +func (boot *baseBootstrap) incrementProofRequestsForNonce(nonce uint64) uint32 { + boot.mutNonceProofRequests.Lock() + defer boot.mutNonceProofRequests.Unlock() + boot.mapNonceProofRequests[nonce]++ + return boot.mapNonceProofRequests[nonce] +} + +func (boot *baseBootstrap) resetProofRequestsForNonce(nonce uint64) { + boot.mutNonceProofRequests.Lock() + delete(boot.mapNonceProofRequests, nonce) + boot.mutNonceProofRequests.Unlock() +} + func (boot *baseBootstrap) prepareForSyncAtBoostrapIfNeeded() error { // this will be triggered only once, after a full node restart. // it is needed for the case when the node will go through bootstrap process and start @@ -1808,11 +1828,27 @@ func (boot *baseBootstrap) getHeaderWithNonceRequestingIfMissing(nonce uint64) ( hasHeader := err == nil if hasHeader && boot.hasProof(hash, hdr) { + boot.resetProofRequestsForNonce(nonce) return hdr, hash, nil } needsProof := boot.checkNeedsProofByNonce(nonce, hdr, hash) + if hasHeader && needsProof { + numRequests := boot.incrementProofRequestsForNonce(nonce) + if numRequests > boot.maxNumOfRequestsForHeaderProof { + log.Debug("getHeaderWithNonceRequestingIfMissing: max proof requests reached, removing potentially stale header from pool", + "nonce", nonce, + "hash", hex.EncodeToString(hash), + "numRequests", numRequests, + ) + + boot.headers.RemoveHeaderByHash(hash) + boot.resetProofRequestsForNonce(nonce) + hasHeader = false + } + } + if hasHeader { boot.requestHandler.SetEpoch(hdr.GetEpoch()) } @@ -1834,6 +1870,7 @@ func (boot *baseBootstrap) getHeaderWithNonceRequestingIfMissing(nonce uint64) ( return nil, nil, process.ErrMissingHeaderProof } + boot.resetProofRequestsForNonce(nonce) return hdr, hash, nil } @@ -2216,6 +2253,7 @@ func (boot *baseBootstrap) init() { boot.syncStateListeners = make([]func(bool), 0) boot.requestedHashes = process.RequiredDataPool{} boot.mapNonceSyncedWithErrors = make(map[uint64]uint32) + boot.mapNonceProofRequests = make(map[uint64]uint32) } func (boot *baseBootstrap) requestHeaders(fromNonce uint64, toNonce uint64) { diff --git a/process/sync/metablock.go b/process/sync/metablock.go index 71b12d956a4..77a2575cebc 100644 --- a/process/sync/metablock.go +++ b/process/sync/metablock.go @@ -53,40 +53,41 @@ func NewMetaBootstrap(arguments ArgMetaBootstrapper) (*MetaBootstrap, error) { } base := &baseBootstrap{ - chainHandler: arguments.ChainHandler, - blockProcessor: arguments.BlockProcessor, - executionManager: arguments.ExecutionManager, - store: arguments.Store, - headers: arguments.PoolsHolder.Headers(), - proofs: arguments.PoolsHolder.Proofs(), - dataPool: arguments.PoolsHolder, - roundHandler: arguments.RoundHandler, - hasher: arguments.Hasher, - marshalizer: arguments.Marshalizer, - forkDetector: arguments.ForkDetector, - requestHandler: arguments.RequestHandler, - shardCoordinator: arguments.ShardCoordinator, - accounts: arguments.Accounts, - blackListHandler: arguments.BlackListHandler, - networkWatcher: arguments.NetworkWatcher, - bootStorer: arguments.BootStorer, - storageBootstrapper: arguments.StorageBootstrapper, - epochHandler: arguments.EpochHandler, - miniBlocksProvider: arguments.MiniblocksProvider, - uint64Converter: arguments.Uint64Converter, - poolsHolder: arguments.PoolsHolder, - statusHandler: arguments.AppStatusHandler, - outportHandler: arguments.OutportHandler, - accountsDBSyncer: arguments.AccountsDBSyncer, - currentEpochProvider: arguments.CurrentEpochProvider, - isInImportMode: arguments.IsInImportMode, - historyRepo: arguments.HistoryRepo, - scheduledTxsExecutionHandler: arguments.ScheduledTxsExecutionHandler, - processWaitTime: arguments.ProcessWaitTime, - processWaitTimeSupernova: arguments.ProcessWaitTimeSupernova, - enableEpochsHandler: arguments.EnableEpochsHandler, - enableRoundsHandler: arguments.EnableRoundsHandler, - processConfigsHandler: arguments.ProcessConfigsHandler, + chainHandler: arguments.ChainHandler, + blockProcessor: arguments.BlockProcessor, + executionManager: arguments.ExecutionManager, + store: arguments.Store, + headers: arguments.PoolsHolder.Headers(), + proofs: arguments.PoolsHolder.Proofs(), + dataPool: arguments.PoolsHolder, + roundHandler: arguments.RoundHandler, + hasher: arguments.Hasher, + marshalizer: arguments.Marshalizer, + forkDetector: arguments.ForkDetector, + requestHandler: arguments.RequestHandler, + shardCoordinator: arguments.ShardCoordinator, + accounts: arguments.Accounts, + blackListHandler: arguments.BlackListHandler, + networkWatcher: arguments.NetworkWatcher, + bootStorer: arguments.BootStorer, + storageBootstrapper: arguments.StorageBootstrapper, + epochHandler: arguments.EpochHandler, + miniBlocksProvider: arguments.MiniblocksProvider, + uint64Converter: arguments.Uint64Converter, + poolsHolder: arguments.PoolsHolder, + statusHandler: arguments.AppStatusHandler, + outportHandler: arguments.OutportHandler, + accountsDBSyncer: arguments.AccountsDBSyncer, + currentEpochProvider: arguments.CurrentEpochProvider, + isInImportMode: arguments.IsInImportMode, + historyRepo: arguments.HistoryRepo, + scheduledTxsExecutionHandler: arguments.ScheduledTxsExecutionHandler, + processWaitTime: arguments.ProcessWaitTime, + processWaitTimeSupernova: arguments.ProcessWaitTimeSupernova, + maxNumOfRequestsForHeaderProof: arguments.MaxNumOfRequestsForHeaderProof, + enableEpochsHandler: arguments.EnableEpochsHandler, + enableRoundsHandler: arguments.EnableRoundsHandler, + processConfigsHandler: arguments.ProcessConfigsHandler, } if base.isInImportMode { diff --git a/process/sync/metablock_test.go b/process/sync/metablock_test.go index 3ac8b1ace9b..27bf1c639bc 100644 --- a/process/sync/metablock_test.go +++ b/process/sync/metablock_test.go @@ -64,37 +64,38 @@ func CreateMetaBootstrapMockArguments() sync.ArgMetaBootstrapper { _ = shardCoordinator.SetSelfId(core.MetachainShardId) argsBaseBootstrapper := sync.ArgBaseBootstrapper{ - PoolsHolder: createMockPools(), - Store: createStore(), - ChainHandler: initBlockchain(), - RoundHandler: &mock.RoundHandlerMock{}, - BlockProcessor: &testscommon.BlockProcessorStub{}, - ExecutionManager: &processMocks.ExecutionManagerMock{}, - Hasher: &hashingMocks.HasherMock{}, - Marshalizer: &mock.MarshalizerMock{}, - ForkDetector: &mock.ForkDetectorMock{}, - RequestHandler: &testscommon.RequestHandlerStub{}, - ShardCoordinator: shardCoordinator, - Accounts: &stateMock.AccountsStub{}, - BlackListHandler: &testscommon.TimeCacheStub{}, - NetworkWatcher: initNetworkWatcher(), - BootStorer: &mock.BoostrapStorerMock{}, - StorageBootstrapper: &mock.StorageBootstrapperMock{}, - EpochHandler: &mock.EpochStartTriggerStub{}, - MiniblocksProvider: &mock.MiniBlocksProviderStub{}, - Uint64Converter: &mock.Uint64ByteSliceConverterMock{}, - AppStatusHandler: &statusHandlerMock.AppStatusHandlerStub{}, - OutportHandler: &outport.OutportStub{}, - AccountsDBSyncer: &mock.AccountsDBSyncerStub{}, - CurrentEpochProvider: &testscommon.CurrentEpochProviderStub{}, - HistoryRepo: &dblookupext.HistoryRepositoryStub{}, - ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, - ProcessWaitTime: testProcessWaitTime, - ProcessWaitTimeSupernova: testProcessWaitTime, - RepopulateTokensSupplies: false, - EnableEpochsHandler: &enableEpochsHandlerMock.EnableEpochsHandlerStub{}, - EnableRoundsHandler: &testscommon.EnableRoundsHandlerStub{}, - ProcessConfigsHandler: testscommon.GetDefaultProcessConfigsHandler(), + PoolsHolder: createMockPools(), + Store: createStore(), + ChainHandler: initBlockchain(), + RoundHandler: &mock.RoundHandlerMock{}, + BlockProcessor: &testscommon.BlockProcessorStub{}, + ExecutionManager: &processMocks.ExecutionManagerMock{}, + Hasher: &hashingMocks.HasherMock{}, + Marshalizer: &mock.MarshalizerMock{}, + ForkDetector: &mock.ForkDetectorMock{}, + RequestHandler: &testscommon.RequestHandlerStub{}, + ShardCoordinator: shardCoordinator, + Accounts: &stateMock.AccountsStub{}, + BlackListHandler: &testscommon.TimeCacheStub{}, + NetworkWatcher: initNetworkWatcher(), + BootStorer: &mock.BoostrapStorerMock{}, + StorageBootstrapper: &mock.StorageBootstrapperMock{}, + EpochHandler: &mock.EpochStartTriggerStub{}, + MiniblocksProvider: &mock.MiniBlocksProviderStub{}, + Uint64Converter: &mock.Uint64ByteSliceConverterMock{}, + AppStatusHandler: &statusHandlerMock.AppStatusHandlerStub{}, + OutportHandler: &outport.OutportStub{}, + AccountsDBSyncer: &mock.AccountsDBSyncerStub{}, + CurrentEpochProvider: &testscommon.CurrentEpochProviderStub{}, + HistoryRepo: &dblookupext.HistoryRepositoryStub{}, + ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, + ProcessWaitTime: testProcessWaitTime, + ProcessWaitTimeSupernova: testProcessWaitTime, + MaxNumOfRequestsForHeaderProof: 10, + RepopulateTokensSupplies: false, + EnableEpochsHandler: &enableEpochsHandlerMock.EnableEpochsHandlerStub{}, + EnableRoundsHandler: &testscommon.EnableRoundsHandlerStub{}, + ProcessConfigsHandler: testscommon.GetDefaultProcessConfigsHandler(), } argsMetaBootstrapper := sync.ArgMetaBootstrapper{ @@ -405,6 +406,18 @@ func TestNewMetaBootstrap_InvalidProcessTimeShouldErr(t *testing.T) { assert.True(t, errors.Is(err, process.ErrInvalidProcessWaitTime)) } +func TestNewMetaBootstrap_InvalidMaxNumOfRequestsForHeaderProofShouldErr(t *testing.T) { + t.Parallel() + + args := CreateMetaBootstrapMockArguments() + args.MaxNumOfRequestsForHeaderProof = 0 + + bs, err := sync.NewMetaBootstrap(args) + + assert.True(t, check.IfNil(bs)) + assert.True(t, errors.Is(err, process.ErrInvalidMaxNumOfRequestsForHeaderProof)) +} + func TestNewMetaBootstrap_NilEnableEpochsHandlerShouldErr(t *testing.T) { t.Parallel() diff --git a/process/sync/shardblock.go b/process/sync/shardblock.go index 6fe62307530..8bc0a61d79c 100644 --- a/process/sync/shardblock.go +++ b/process/sync/shardblock.go @@ -40,41 +40,42 @@ func NewShardBootstrap(arguments ArgShardBootstrapper) (*ShardBootstrap, error) } base := &baseBootstrap{ - chainHandler: arguments.ChainHandler, - blockProcessor: arguments.BlockProcessor, - executionManager: arguments.ExecutionManager, - store: arguments.Store, - headers: arguments.PoolsHolder.Headers(), - proofs: arguments.PoolsHolder.Proofs(), - dataPool: arguments.PoolsHolder, - roundHandler: arguments.RoundHandler, - hasher: arguments.Hasher, - marshalizer: arguments.Marshalizer, - forkDetector: arguments.ForkDetector, - requestHandler: arguments.RequestHandler, - shardCoordinator: arguments.ShardCoordinator, - accounts: arguments.Accounts, - blackListHandler: arguments.BlackListHandler, - networkWatcher: arguments.NetworkWatcher, - bootStorer: arguments.BootStorer, - storageBootstrapper: arguments.StorageBootstrapper, - epochHandler: arguments.EpochHandler, - miniBlocksProvider: arguments.MiniblocksProvider, - uint64Converter: arguments.Uint64Converter, - poolsHolder: arguments.PoolsHolder, - statusHandler: arguments.AppStatusHandler, - outportHandler: arguments.OutportHandler, - accountsDBSyncer: arguments.AccountsDBSyncer, - currentEpochProvider: arguments.CurrentEpochProvider, - isInImportMode: arguments.IsInImportMode, - historyRepo: arguments.HistoryRepo, - scheduledTxsExecutionHandler: arguments.ScheduledTxsExecutionHandler, - processWaitTime: arguments.ProcessWaitTime, - processWaitTimeSupernova: arguments.ProcessWaitTimeSupernova, - repopulateTokensSupplies: arguments.RepopulateTokensSupplies, - enableEpochsHandler: arguments.EnableEpochsHandler, - enableRoundsHandler: arguments.EnableRoundsHandler, - processConfigsHandler: arguments.ProcessConfigsHandler, + chainHandler: arguments.ChainHandler, + blockProcessor: arguments.BlockProcessor, + executionManager: arguments.ExecutionManager, + store: arguments.Store, + headers: arguments.PoolsHolder.Headers(), + proofs: arguments.PoolsHolder.Proofs(), + dataPool: arguments.PoolsHolder, + roundHandler: arguments.RoundHandler, + hasher: arguments.Hasher, + marshalizer: arguments.Marshalizer, + forkDetector: arguments.ForkDetector, + requestHandler: arguments.RequestHandler, + shardCoordinator: arguments.ShardCoordinator, + accounts: arguments.Accounts, + blackListHandler: arguments.BlackListHandler, + networkWatcher: arguments.NetworkWatcher, + bootStorer: arguments.BootStorer, + storageBootstrapper: arguments.StorageBootstrapper, + epochHandler: arguments.EpochHandler, + miniBlocksProvider: arguments.MiniblocksProvider, + uint64Converter: arguments.Uint64Converter, + poolsHolder: arguments.PoolsHolder, + statusHandler: arguments.AppStatusHandler, + outportHandler: arguments.OutportHandler, + accountsDBSyncer: arguments.AccountsDBSyncer, + currentEpochProvider: arguments.CurrentEpochProvider, + isInImportMode: arguments.IsInImportMode, + historyRepo: arguments.HistoryRepo, + scheduledTxsExecutionHandler: arguments.ScheduledTxsExecutionHandler, + processWaitTime: arguments.ProcessWaitTime, + processWaitTimeSupernova: arguments.ProcessWaitTimeSupernova, + maxNumOfRequestsForHeaderProof: arguments.MaxNumOfRequestsForHeaderProof, + repopulateTokensSupplies: arguments.RepopulateTokensSupplies, + enableEpochsHandler: arguments.EnableEpochsHandler, + enableRoundsHandler: arguments.EnableRoundsHandler, + processConfigsHandler: arguments.ProcessConfigsHandler, } if base.isInImportMode { diff --git a/process/sync/shardblock_test.go b/process/sync/shardblock_test.go index 6447e654ee4..fcdde5daee3 100644 --- a/process/sync/shardblock_test.go +++ b/process/sync/shardblock_test.go @@ -351,37 +351,38 @@ func initRoundHandler() consensus.RoundHandler { func CreateShardBootstrapMockArguments() sync.ArgShardBootstrapper { argsBaseBootstrapper := sync.ArgBaseBootstrapper{ - PoolsHolder: createMockPools(), - Store: createStore(), - ChainHandler: initBlockchain(), - RoundHandler: &mock.RoundHandlerMock{}, - BlockProcessor: &testscommon.BlockProcessorStub{}, - ExecutionManager: &processMocks.ExecutionManagerMock{}, - Hasher: &hashingMocks.HasherMock{}, - Marshalizer: &mock.MarshalizerMock{}, - ForkDetector: &mock.ForkDetectorMock{}, - RequestHandler: &testscommon.RequestHandlerStub{}, - ShardCoordinator: mock.NewOneShardCoordinatorMock(), - Accounts: &stateMock.AccountsStub{}, - BlackListHandler: &testscommon.TimeCacheStub{}, - NetworkWatcher: initNetworkWatcher(), - BootStorer: &mock.BoostrapStorerMock{}, - StorageBootstrapper: &mock.StorageBootstrapperMock{}, - EpochHandler: &mock.EpochStartTriggerStub{}, - MiniblocksProvider: &mock.MiniBlocksProviderStub{}, - Uint64Converter: &mock.Uint64ByteSliceConverterMock{}, - AppStatusHandler: &statusHandlerMock.AppStatusHandlerStub{}, - OutportHandler: &outport.OutportStub{}, - AccountsDBSyncer: &mock.AccountsDBSyncerStub{}, - CurrentEpochProvider: &testscommon.CurrentEpochProviderStub{}, - HistoryRepo: &dblookupext.HistoryRepositoryStub{}, - ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, - ProcessWaitTime: testProcessWaitTime, - ProcessWaitTimeSupernova: testProcessWaitTime, - RepopulateTokensSupplies: false, - EnableEpochsHandler: &enableEpochsHandlerMock.EnableEpochsHandlerStub{}, - EnableRoundsHandler: &testscommon.EnableRoundsHandlerStub{}, - ProcessConfigsHandler: testscommon.GetDefaultProcessConfigsHandler(), + PoolsHolder: createMockPools(), + Store: createStore(), + ChainHandler: initBlockchain(), + RoundHandler: &mock.RoundHandlerMock{}, + BlockProcessor: &testscommon.BlockProcessorStub{}, + ExecutionManager: &processMocks.ExecutionManagerMock{}, + Hasher: &hashingMocks.HasherMock{}, + Marshalizer: &mock.MarshalizerMock{}, + ForkDetector: &mock.ForkDetectorMock{}, + RequestHandler: &testscommon.RequestHandlerStub{}, + ShardCoordinator: mock.NewOneShardCoordinatorMock(), + Accounts: &stateMock.AccountsStub{}, + BlackListHandler: &testscommon.TimeCacheStub{}, + NetworkWatcher: initNetworkWatcher(), + BootStorer: &mock.BoostrapStorerMock{}, + StorageBootstrapper: &mock.StorageBootstrapperMock{}, + EpochHandler: &mock.EpochStartTriggerStub{}, + MiniblocksProvider: &mock.MiniBlocksProviderStub{}, + Uint64Converter: &mock.Uint64ByteSliceConverterMock{}, + AppStatusHandler: &statusHandlerMock.AppStatusHandlerStub{}, + OutportHandler: &outport.OutportStub{}, + AccountsDBSyncer: &mock.AccountsDBSyncerStub{}, + CurrentEpochProvider: &testscommon.CurrentEpochProviderStub{}, + HistoryRepo: &dblookupext.HistoryRepositoryStub{}, + ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, + ProcessWaitTime: testProcessWaitTime, + ProcessWaitTimeSupernova: testProcessWaitTime, + MaxNumOfRequestsForHeaderProof: 10, + RepopulateTokensSupplies: false, + EnableEpochsHandler: &enableEpochsHandlerMock.EnableEpochsHandlerStub{}, + EnableRoundsHandler: &testscommon.EnableRoundsHandlerStub{}, + ProcessConfigsHandler: testscommon.GetDefaultProcessConfigsHandler(), } argsShardBootstrapper := sync.ArgShardBootstrapper{ @@ -634,6 +635,18 @@ func TestNewShardBootstrap_InvalidProcessWaitTimeSupernovaShouldErr(t *testing.T assert.Contains(t, err.Error(), "Supernova") } +func TestNewShardBootstrap_InvalidMaxNumOfRequestsForHeaderProofShouldErr(t *testing.T) { + t.Parallel() + + args := CreateShardBootstrapMockArguments() + args.MaxNumOfRequestsForHeaderProof = 0 + + bs, err := sync.NewShardBootstrap(args) + + assert.True(t, check.IfNil(bs)) + assert.True(t, errors.Is(err, process.ErrInvalidMaxNumOfRequestsForHeaderProof)) +} + func TestNewShardBootstrap_NilEnableEpochsHandlerShouldErr(t *testing.T) { t.Parallel() @@ -2552,6 +2565,86 @@ func TestShardBootstrap_SyncBlock_WithEquivalentProofs(t *testing.T) { assert.Nil(t, err) }) + t.Run("should remove stale header from pool when max proof requests reached", func(t *testing.T) { + t.Parallel() + + args := CreateShardBootstrapMockArguments() + args.MaxNumOfRequestsForHeaderProof = 2 + + args.EnableEpochsHandler = &enableEpochsHandlerMock.EnableEpochsHandlerStub{ + IsFlagEnabledInEpochCalled: func(flag core.EnableEpochFlag, epoch uint32) bool { + return flag == common.AndromedaFlag + }, + } + + hdr := block.Header{Nonce: 1} + blkc := &testscommon.ChainHandlerStub{ + GetGenesisHeaderCalled: func() data.HeaderHandler { + return &block.Header{} + }, + GetCurrentBlockHeaderCalled: func() data.HeaderHandler { + return &hdr + }, + } + args.ChainHandler = blkc + + forkDetector := &mock.ForkDetectorMock{} + forkDetector.CheckForkCalled = func() *process.ForkInfo { + return process.NewForkInfo() + } + forkDetector.ProbableHighestNonceCalled = func() uint64 { + return 100 + } + forkDetector.GetNotarizedHeaderHashCalled = func(nonce uint64) []byte { + return nil + } + args.ForkDetector = forkDetector + args.RoundHandler, _ = round.NewRound(createDefaultRoundArgs()) + args.BlockProcessor = createBlockProcessor(args.ChainHandler) + + pools := createMockPools() + pools.ProofsCalled = func() dataRetriever.ProofsPool { + return &dataRetrieverMock.ProofsPoolMock{ + GetProofByNonceCalled: func(headerNonce uint64, shardID uint32) (data.HeaderProofHandler, error) { + return nil, errors.New("missing proof") + }, + HasProofCalled: func(shardID uint32, headerHash []byte) bool { + return false + }, + } + } + + staleHash := []byte("stale-hash") + removeCount := 0 + var removedHash []byte + pools.HeadersCalled = func() dataRetriever.HeadersPool { + hcs := &mock.HeadersCacherStub{} + hcs.GetHeaderByNonceAndShardIdCalled = func(hdrNonce uint64, shardId uint32) ([]data.HeaderHandler, [][]byte, error) { + return []data.HeaderHandler{ + &block.Header{Nonce: 2, Round: 1, RootHash: []byte("stale")}, + }, [][]byte{staleHash}, nil + } + hcs.RemoveHeaderByHashCalled = func(headerHash []byte) { + removeCount++ + removedHash = headerHash + } + return hcs + } + args.PoolsHolder = pools + + bs, _ := sync.NewShardBootstrap(args) + + _ = bs.SyncBlock(context.Background()) + require.Equal(t, 0, removeCount) + + _ = bs.SyncBlock(context.Background()) + require.Equal(t, 0, removeCount) + + _ = bs.SyncBlock(context.Background()) + require.Equal(t, 1, removeCount) + require.Equal(t, staleHash, removedHash) + }) + t.Run("should receive header and proof if missing, requesting by hash", func(t *testing.T) { t.Parallel() diff --git a/testscommon/components/configs.go b/testscommon/components/configs.go index b3672ef1d32..c6f051a719a 100644 --- a/testscommon/components/configs.go +++ b/testscommon/components/configs.go @@ -149,11 +149,12 @@ func GetGeneralConfig() config.Config { Shards: 16, }, GeneralSettings: config.GeneralSettingsConfig{ - ChainID: "undefined", - MinTransactionVersion: 1, - GenesisMaxNumberOfShards: 3, - SetGuardianEpochsDelay: 20, - MaxProposalNonceGap: 10, + ChainID: "undefined", + MinTransactionVersion: 1, + GenesisMaxNumberOfShards: 3, + SetGuardianEpochsDelay: 20, + MaxProposalNonceGap: 10, + MaxNumOfRequestsForHeaderProof: 10, ChainParametersByEpoch: []config.ChainParametersByEpochConfig{ { EnableEpoch: 0, diff --git a/testscommon/generalConfig.go b/testscommon/generalConfig.go index df01b6ec29c..aa111dfe225 100644 --- a/testscommon/generalConfig.go +++ b/testscommon/generalConfig.go @@ -55,6 +55,7 @@ func GetGeneralConfig() config.Config { MaxComputableRounds: 1000, SyncProcessTimeInMillis: 6000, SyncProcessTimeSupernovaInMillis: 3000, + MaxNumOfRequestsForHeaderProof: 10, SetGuardianEpochsDelay: 20, StatusPollingIntervalSec: 10, MaxProposalNonceGap: 10,