From 2a0a6a1dd425942021520bcbeb28271f4cf49432 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 11 Feb 2025 13:01:34 +0200 Subject: [PATCH 1/9] fix writing on channel when a block is requested in order to attest the current one --- process/block/baseProcess.go | 10 +++++++--- process/block/metablock.go | 6 ++++++ process/block/shardblock.go | 6 ++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/process/block/baseProcess.go b/process/block/baseProcess.go index 8d67ec7a10..df657b80fb 100644 --- a/process/block/baseProcess.go +++ b/process/block/baseProcess.go @@ -11,6 +11,7 @@ import ( "time" "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-core-go/core/atomic" "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-core-go/data" "github.com/multiversx/mx-chain-core-go/data/block" @@ -124,8 +125,9 @@ type baseProcessor struct { nonceOfFirstCommittedBlock core.OptionalUint64 extraDelayRequestBlockInfo time.Duration - proofsPool dataRetriever.ProofsPool - chanNextHeader chan bool + proofsPool dataRetriever.ProofsPool + chanNextHeader chan bool + isWaitingForNextHeader atomic.Flag } type bootStorerDataArgs struct { @@ -2349,7 +2351,7 @@ func (bp *baseProcessor) checkProofRequestingNextHeaderBlockingIfMissing( return nil } - log.Trace("could not find proof for header, requesting the next one", + log.Debug("could not find proof for header, requesting the next one", "current hash", hex.EncodeToString(headerHash), "header shard", headerShard) err := bp.requestNextHeaderBlocking(headerNonce+1, headerShard) @@ -2368,6 +2370,7 @@ func (bp *baseProcessor) requestNextHeaderBlocking(nonce uint64, shardID uint32) headersPool := bp.dataPool.Headers() _ = core.EmptyChannel(bp.chanNextHeader) + bp.isWaitingForNextHeader.SetValue(true) if shardID == core.MetachainShardId { go bp.requestHandler.RequestMetaHeaderByNonce(nonce) @@ -2388,6 +2391,7 @@ func (bp *baseProcessor) requestNextHeaderBlocking(nonce uint64, shardID uint32) func (bp *baseProcessor) waitForNextHeader() error { select { case <-bp.chanNextHeader: + bp.isWaitingForNextHeader.Reset() return nil case <-time.After(bp.extraDelayRequestBlockInfo): return process.ErrTimeIsOut diff --git a/process/block/metablock.go b/process/block/metablock.go index ca3ba86687..6d2b07d54f 100644 --- a/process/block/metablock.go +++ b/process/block/metablock.go @@ -2073,6 +2073,12 @@ func (mp *metaProcessor) receivedShardHeader(headerHandler data.HeaderHandler, s "hash", shardHeaderHash, ) + if mp.isWaitingForNextHeader.IsSet() { + log.Trace("received shard header attesting the previous one") + mp.chanNextHeader <- true + return + } + mp.hdrsForCurrBlock.mutHdrsForBlock.Lock() haveMissingShardHeaders := mp.hdrsForCurrBlock.missingHdrs > 0 || mp.hdrsForCurrBlock.missingFinalityAttestingHdrs > 0 diff --git a/process/block/shardblock.go b/process/block/shardblock.go index 83af49a03d..503ffd7d09 100644 --- a/process/block/shardblock.go +++ b/process/block/shardblock.go @@ -1751,6 +1751,12 @@ func (sp *shardProcessor) receivedMetaBlock(headerHandler data.HeaderHandler, me "hash", metaBlockHash, ) + if sp.isWaitingForNextHeader.IsSet() { + log.Trace("received meta header attesting the previous one") + sp.chanNextHeader <- true + return + } + sp.hdrsForCurrBlock.mutHdrsForBlock.Lock() haveMissingMetaHeaders := sp.hdrsForCurrBlock.missingHdrs > 0 || sp.hdrsForCurrBlock.missingFinalityAttestingHdrs > 0 From 1139d85a3694c593aa01ec893d63a1dc1d55ddea Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 11 Feb 2025 15:49:23 +0200 Subject: [PATCH 2/9] fixes after review --- process/block/baseProcess.go | 90 +++++++++++++++++++++++------------- process/block/metablock.go | 17 +++---- process/block/shardblock.go | 20 ++++---- 3 files changed, 76 insertions(+), 51 deletions(-) diff --git a/process/block/baseProcess.go b/process/block/baseProcess.go index df657b80fb..ecc9d71da7 100644 --- a/process/block/baseProcess.go +++ b/process/block/baseProcess.go @@ -11,7 +11,6 @@ import ( "time" "github.com/multiversx/mx-chain-core-go/core" - "github.com/multiversx/mx-chain-core-go/core/atomic" "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-core-go/data" "github.com/multiversx/mx-chain-core-go/data/block" @@ -125,9 +124,10 @@ type baseProcessor struct { nonceOfFirstCommittedBlock core.OptionalUint64 extraDelayRequestBlockInfo time.Duration - proofsPool dataRetriever.ProofsPool - chanNextHeader chan bool - isWaitingForNextHeader atomic.Flag + proofsPool dataRetriever.ProofsPool + mutRequestedAttestingNoncesMap sync.RWMutex + requestedAttestingNoncesMap map[string]uint64 + allProofsReceived chan bool } type bootStorerDataArgs struct { @@ -2342,58 +2342,84 @@ func (bp *baseProcessor) getHeaderHash(header data.HeaderHandler) ([]byte, error return bp.hasher.Compute(string(marshalledHeader)), nil } -func (bp *baseProcessor) checkProofRequestingNextHeaderBlockingIfMissing( +func (bp *baseProcessor) checkProofRequestingNextHeaderIfMissing( headerShard uint32, headerHash []byte, headerNonce uint64, -) error { +) { if bp.proofsPool.HasProof(headerShard, headerHash) { - return nil + return } log.Debug("could not find proof for header, requesting the next one", "current hash", hex.EncodeToString(headerHash), "header shard", headerShard) - err := bp.requestNextHeaderBlocking(headerNonce+1, headerShard) - if err != nil { - return err - } - - if bp.proofsPool.HasProof(headerShard, headerHash) { - return nil - } - return fmt.Errorf("%w for header hash %s", process.ErrMissingHeaderProof, hex.EncodeToString(headerHash)) + bp.requestNextHeader(headerHash, headerNonce+1, headerShard) } -func (bp *baseProcessor) requestNextHeaderBlocking(nonce uint64, shardID uint32) error { - headersPool := bp.dataPool.Headers() - - _ = core.EmptyChannel(bp.chanNextHeader) - bp.isWaitingForNextHeader.SetValue(true) +func (bp *baseProcessor) requestNextHeader(currentHeaderHash []byte, nonce uint64, shardID uint32) { + bp.mutRequestedAttestingNoncesMap.Lock() + bp.requestedAttestingNoncesMap[string(currentHeaderHash)] = nonce + bp.mutRequestedAttestingNoncesMap.Unlock() if shardID == core.MetachainShardId { go bp.requestHandler.RequestMetaHeaderByNonce(nonce) } else { go bp.requestHandler.RequestShardHeaderByNonce(shardID, nonce) } +} - err := bp.waitForNextHeader() - if err != nil { - return err +func (bp *baseProcessor) waitAllMissingProofs() error { + bp.mutRequestedAttestingNoncesMap.RLock() + isWaitingForProofs := len(bp.requestedAttestingNoncesMap) > 0 + bp.mutRequestedAttestingNoncesMap.RUnlock() + if !isWaitingForProofs { + return nil } - _, _, err = process.GetShardHeaderFromPoolWithNonce(nonce, shardID, headersPool) - - return err -} - -func (bp *baseProcessor) waitForNextHeader() error { select { - case <-bp.chanNextHeader: - bp.isWaitingForNextHeader.Reset() + case <-bp.allProofsReceived: return nil case <-time.After(bp.extraDelayRequestBlockInfo): + bp.mutRequestedAttestingNoncesMap.RLock() + defer bp.mutRequestedAttestingNoncesMap.RUnlock() + + logMessage := "" + for hash := range bp.requestedAttestingNoncesMap { + logMessage += fmt.Sprintf("\nhash = %s", hex.EncodeToString([]byte(hash))) + } + + log.Debug("baseProcessor.waitAllMissingProofs still pending proofs for headers" + logMessage) + return process.ErrTimeIsOut } } + +func (bp *baseProcessor) checkReceivedHeaderAndUpdateMissingAttesting(headerHandler data.HeaderHandler) { + if !common.ShouldBlockHavePrevProof(headerHandler, bp.enableEpochsHandler, common.EquivalentMessagesFlag) { + return + } + + bp.mutRequestedAttestingNoncesMap.Lock() + defer bp.mutRequestedAttestingNoncesMap.Unlock() + + receivedShard := headerHandler.GetShardID() + prevHash := headerHandler.GetPrevHash() + _, isHeaderWithoutProof := bp.requestedAttestingNoncesMap[string(prevHash)] + if !isHeaderWithoutProof { + log.Debug("received header does not have previous hash any of the requested ones") + return + } + + if !bp.proofsPool.HasProof(receivedShard, prevHash) { + log.Debug("received next header but proof is still missing", "hash", hex.EncodeToString(prevHash)) + return + } + + delete(bp.requestedAttestingNoncesMap, string(prevHash)) + + if len(bp.requestedAttestingNoncesMap) == 0 { + bp.allProofsReceived <- true + } +} diff --git a/process/block/metablock.go b/process/block/metablock.go index 6d2b07d54f..e2f41a9c9c 100644 --- a/process/block/metablock.go +++ b/process/block/metablock.go @@ -423,6 +423,10 @@ func (mp *metaProcessor) checkProofsForShardData(header *block.MetaBlock) error return nil } + mp.mutRequestedAttestingNoncesMap.Lock() + mp.requestedAttestingNoncesMap = make(map[string]uint64) + mp.mutRequestedAttestingNoncesMap.Unlock() + for _, shardData := range header.ShardInfo { // TODO: consider the validation of the proof: // compare the one from proofsPool with what shardData.CurrentSignature and shardData.CurrentPubKeysBitmap hold @@ -437,10 +441,7 @@ func (mp *metaProcessor) checkProofsForShardData(header *block.MetaBlock) error continue } - err := mp.checkProofRequestingNextHeaderBlockingIfMissing(shardData.ShardID, shardData.HeaderHash, shardData.Nonce) - if err != nil { - return err - } + go mp.checkProofRequestingNextHeaderIfMissing(shardData.ShardID, shardData.HeaderHash, shardData.Nonce) if !common.ShouldBlockHavePrevProof(shardHeader.hdr, mp.enableEpochsHandler, common.EquivalentMessagesFlag) { continue @@ -464,7 +465,7 @@ func (mp *metaProcessor) checkProofsForShardData(header *block.MetaBlock) error } } - return nil + return mp.waitAllMissingProofs() } func (mp *metaProcessor) processEpochStartMetaBlock( @@ -2073,11 +2074,7 @@ func (mp *metaProcessor) receivedShardHeader(headerHandler data.HeaderHandler, s "hash", shardHeaderHash, ) - if mp.isWaitingForNextHeader.IsSet() { - log.Trace("received shard header attesting the previous one") - mp.chanNextHeader <- true - return - } + mp.checkReceivedHeaderAndUpdateMissingAttesting(headerHandler) mp.hdrsForCurrBlock.mutHdrsForBlock.Lock() diff --git a/process/block/shardblock.go b/process/block/shardblock.go index 503ffd7d09..a0596f06cd 100644 --- a/process/block/shardblock.go +++ b/process/block/shardblock.go @@ -293,6 +293,10 @@ func (sp *shardProcessor) ProcessBlock( return process.ErrAccountStateDirty } + sp.mutRequestedAttestingNoncesMap.Lock() + sp.requestedAttestingNoncesMap = make(map[string]uint64) + sp.mutRequestedAttestingNoncesMap.Unlock() + // check proofs for cross notarized metablocks for _, metaBlockHash := range header.GetMetaBlockHashes() { hInfo, ok := sp.hdrsForCurrBlock.hdrHashAndInfo[string(metaBlockHash)] @@ -304,10 +308,12 @@ func (sp *shardProcessor) ProcessBlock( continue } - err = sp.checkProofRequestingNextHeaderBlockingIfMissing(core.MetachainShardId, metaBlockHash, hInfo.hdr.GetNonce()) - if err != nil { - return err - } + go sp.checkProofRequestingNextHeaderIfMissing(core.MetachainShardId, metaBlockHash, hInfo.hdr.GetNonce()) + } + + err = sp.waitAllMissingProofs() + if err != nil { + return err } defer func() { @@ -1751,11 +1757,7 @@ func (sp *shardProcessor) receivedMetaBlock(headerHandler data.HeaderHandler, me "hash", metaBlockHash, ) - if sp.isWaitingForNextHeader.IsSet() { - log.Trace("received meta header attesting the previous one") - sp.chanNextHeader <- true - return - } + sp.checkReceivedHeaderAndUpdateMissingAttesting(headerHandler) sp.hdrsForCurrBlock.mutHdrsForBlock.Lock() From 32d381c9e77eedd7bd268cd1d81632b1ce20451a Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 11 Feb 2025 16:04:59 +0200 Subject: [PATCH 3/9] avoid unwanted logs --- process/block/baseProcess.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/process/block/baseProcess.go b/process/block/baseProcess.go index ecc9d71da7..0f57bd08a6 100644 --- a/process/block/baseProcess.go +++ b/process/block/baseProcess.go @@ -2404,6 +2404,11 @@ func (bp *baseProcessor) checkReceivedHeaderAndUpdateMissingAttesting(headerHand bp.mutRequestedAttestingNoncesMap.Lock() defer bp.mutRequestedAttestingNoncesMap.Unlock() + isWaitingForProofs := len(bp.requestedAttestingNoncesMap) > 0 + if !isWaitingForProofs { + return + } + receivedShard := headerHandler.GetShardID() prevHash := headerHandler.GetPrevHash() _, isHeaderWithoutProof := bp.requestedAttestingNoncesMap[string(prevHash)] From fe0aacec44efd935d30cbc56e6c48ccbad6bc082 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 11 Feb 2025 16:38:32 +0200 Subject: [PATCH 4/9] cosmetic changes + empty chan --- process/block/baseProcess.go | 8 +++++--- process/block/metablock.go | 1 + process/block/shardblock.go | 1 + 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/process/block/baseProcess.go b/process/block/baseProcess.go index 0f57bd08a6..b7cd61c5e2 100644 --- a/process/block/baseProcess.go +++ b/process/block/baseProcess.go @@ -2401,14 +2401,16 @@ func (bp *baseProcessor) checkReceivedHeaderAndUpdateMissingAttesting(headerHand return } - bp.mutRequestedAttestingNoncesMap.Lock() - defer bp.mutRequestedAttestingNoncesMap.Unlock() - + bp.mutRequestedAttestingNoncesMap.RLock() isWaitingForProofs := len(bp.requestedAttestingNoncesMap) > 0 + defer bp.mutRequestedAttestingNoncesMap.RUnlock() if !isWaitingForProofs { return } + bp.mutRequestedAttestingNoncesMap.Lock() + defer bp.mutRequestedAttestingNoncesMap.Unlock() + receivedShard := headerHandler.GetShardID() prevHash := headerHandler.GetPrevHash() _, isHeaderWithoutProof := bp.requestedAttestingNoncesMap[string(prevHash)] diff --git a/process/block/metablock.go b/process/block/metablock.go index e2f41a9c9c..08228a7240 100644 --- a/process/block/metablock.go +++ b/process/block/metablock.go @@ -425,6 +425,7 @@ func (mp *metaProcessor) checkProofsForShardData(header *block.MetaBlock) error mp.mutRequestedAttestingNoncesMap.Lock() mp.requestedAttestingNoncesMap = make(map[string]uint64) + _ = core.EmptyChannel(mp.allProofsReceived) mp.mutRequestedAttestingNoncesMap.Unlock() for _, shardData := range header.ShardInfo { diff --git a/process/block/shardblock.go b/process/block/shardblock.go index a0596f06cd..cc55876237 100644 --- a/process/block/shardblock.go +++ b/process/block/shardblock.go @@ -295,6 +295,7 @@ func (sp *shardProcessor) ProcessBlock( sp.mutRequestedAttestingNoncesMap.Lock() sp.requestedAttestingNoncesMap = make(map[string]uint64) + _ = core.EmptyChannel(sp.allProofsReceived) sp.mutRequestedAttestingNoncesMap.Unlock() // check proofs for cross notarized metablocks From ea0b8efaba4b4182acdf016ccc3ef35018c9e578 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 11 Feb 2025 16:57:04 +0200 Subject: [PATCH 5/9] no need for goroutines on checkProofRequestingNextHeaderIfMissing --- process/block/metablock.go | 2 +- process/block/shardblock.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/process/block/metablock.go b/process/block/metablock.go index 08228a7240..2f8ce9571d 100644 --- a/process/block/metablock.go +++ b/process/block/metablock.go @@ -442,7 +442,7 @@ func (mp *metaProcessor) checkProofsForShardData(header *block.MetaBlock) error continue } - go mp.checkProofRequestingNextHeaderIfMissing(shardData.ShardID, shardData.HeaderHash, shardData.Nonce) + mp.checkProofRequestingNextHeaderIfMissing(shardData.ShardID, shardData.HeaderHash, shardData.Nonce) if !common.ShouldBlockHavePrevProof(shardHeader.hdr, mp.enableEpochsHandler, common.EquivalentMessagesFlag) { continue diff --git a/process/block/shardblock.go b/process/block/shardblock.go index cc55876237..af3bdaff0a 100644 --- a/process/block/shardblock.go +++ b/process/block/shardblock.go @@ -309,7 +309,7 @@ func (sp *shardProcessor) ProcessBlock( continue } - go sp.checkProofRequestingNextHeaderIfMissing(core.MetachainShardId, metaBlockHash, hInfo.hdr.GetNonce()) + sp.checkProofRequestingNextHeaderIfMissing(core.MetachainShardId, metaBlockHash, hInfo.hdr.GetNonce()) } err = sp.waitAllMissingProofs() From 7bf2b24cd6bc06490c8c7ffd31d08715112f3beb Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 11 Feb 2025 17:07:04 +0200 Subject: [PATCH 6/9] do not write on chan under mut protection --- process/block/baseProcess.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/process/block/baseProcess.go b/process/block/baseProcess.go index b7cd61c5e2..6d4469410a 100644 --- a/process/block/baseProcess.go +++ b/process/block/baseProcess.go @@ -2409,24 +2409,28 @@ func (bp *baseProcessor) checkReceivedHeaderAndUpdateMissingAttesting(headerHand } bp.mutRequestedAttestingNoncesMap.Lock() - defer bp.mutRequestedAttestingNoncesMap.Unlock() receivedShard := headerHandler.GetShardID() prevHash := headerHandler.GetPrevHash() _, isHeaderWithoutProof := bp.requestedAttestingNoncesMap[string(prevHash)] if !isHeaderWithoutProof { log.Debug("received header does not have previous hash any of the requested ones") + bp.mutRequestedAttestingNoncesMap.Unlock() return } if !bp.proofsPool.HasProof(receivedShard, prevHash) { log.Debug("received next header but proof is still missing", "hash", hex.EncodeToString(prevHash)) + bp.mutRequestedAttestingNoncesMap.Unlock() return } delete(bp.requestedAttestingNoncesMap, string(prevHash)) - if len(bp.requestedAttestingNoncesMap) == 0 { + allProofsReceived := len(bp.requestedAttestingNoncesMap) == 0 + bp.mutRequestedAttestingNoncesMap.Unlock() + + if allProofsReceived { bp.allProofsReceived <- true } } From 554398df8f5f28aae5839b7ff4456846be94918d Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 11 Feb 2025 17:09:57 +0200 Subject: [PATCH 7/9] remove improper defer --- process/block/baseProcess.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process/block/baseProcess.go b/process/block/baseProcess.go index 6d4469410a..a22fa002d9 100644 --- a/process/block/baseProcess.go +++ b/process/block/baseProcess.go @@ -2403,7 +2403,7 @@ func (bp *baseProcessor) checkReceivedHeaderAndUpdateMissingAttesting(headerHand bp.mutRequestedAttestingNoncesMap.RLock() isWaitingForProofs := len(bp.requestedAttestingNoncesMap) > 0 - defer bp.mutRequestedAttestingNoncesMap.RUnlock() + bp.mutRequestedAttestingNoncesMap.RUnlock() if !isWaitingForProofs { return } From 81f985cef3a1786512b18ce2292c5674ab813f22 Mon Sep 17 00:00:00 2001 From: Adrian Dobrita Date: Tue, 11 Feb 2025 17:54:51 +0200 Subject: [PATCH 8/9] - fix validation of grace period for transition to new epoch in shard. - update probable highest nonce on bootstrap --- process/block/shardblock.go | 7 ++++++- process/sync/storageBootstrap/baseStorageBootstrapper.go | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/process/block/shardblock.go b/process/block/shardblock.go index 83af49a03d..4ee811b8f4 100644 --- a/process/block/shardblock.go +++ b/process/block/shardblock.go @@ -487,10 +487,15 @@ func (sp *shardProcessor) checkEpochCorrectness( process.ErrEpochDoesNotMatch, header.GetEpoch(), sp.epochStartTrigger.MetaEpoch()) } + epochChangeConfirmed := sp.epochStartTrigger.EpochStartRound() < sp.epochStartTrigger.EpochFinalityAttestingRound() + if sp.enableEpochsHandler.IsFlagEnabledInEpoch(common.EquivalentMessagesFlag, header.GetEpoch()) { + epochChangeConfirmed = sp.epochStartTrigger.EpochStartRound() <= sp.epochStartTrigger.EpochFinalityAttestingRound() + } + isOldEpochAndShouldBeNew := sp.epochStartTrigger.IsEpochStart() && header.GetRound() > sp.epochStartTrigger.EpochFinalityAttestingRound()+process.EpochChangeGracePeriod && header.GetEpoch() < sp.epochStartTrigger.MetaEpoch() && - sp.epochStartTrigger.EpochStartRound() < sp.epochStartTrigger.EpochFinalityAttestingRound() + epochChangeConfirmed if isOldEpochAndShouldBeNew { return fmt.Errorf("%w proposed header with epoch %d should be in epoch %d", process.ErrEpochDoesNotMatch, header.GetEpoch(), sp.epochStartTrigger.MetaEpoch()) diff --git a/process/sync/storageBootstrap/baseStorageBootstrapper.go b/process/sync/storageBootstrap/baseStorageBootstrapper.go index bb013cb50a..e2a063007a 100644 --- a/process/sync/storageBootstrap/baseStorageBootstrapper.go +++ b/process/sync/storageBootstrap/baseStorageBootstrapper.go @@ -456,6 +456,7 @@ func (st *storageBootstrapper) applyBlock(headerHash []byte, header data.HeaderH st.forkDetector.AddCheckpoint(header.GetNonce(), header.GetRound(), headerHash) if header.GetShardID() == core.MetachainShardId || !check.IfNilReflect(header.GetPreviousProof()) { st.forkDetector.SetFinalToLastCheckpoint() + st.forkDetector.ResetProbableHighestNonce() } return nil } From bf92b848d7602ee649ec83e994754affc368ec5a Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 11 Feb 2025 18:21:21 +0200 Subject: [PATCH 9/9] fixes after review --- process/block/baseProcess.go | 27 ++++++++++++++------------- process/block/metablock.go | 10 +++++----- process/block/shardblock.go | 6 +++--- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/process/block/baseProcess.go b/process/block/baseProcess.go index a22fa002d9..657d4a5471 100644 --- a/process/block/baseProcess.go +++ b/process/block/baseProcess.go @@ -2370,7 +2370,7 @@ func (bp *baseProcessor) requestNextHeader(currentHeaderHash []byte, nonce uint6 } } -func (bp *baseProcessor) waitAllMissingProofs() error { +func (bp *baseProcessor) waitAllMissingProofs(waitTime time.Duration) error { bp.mutRequestedAttestingNoncesMap.RLock() isWaitingForProofs := len(bp.requestedAttestingNoncesMap) > 0 bp.mutRequestedAttestingNoncesMap.RUnlock() @@ -2381,7 +2381,7 @@ func (bp *baseProcessor) waitAllMissingProofs() error { select { case <-bp.allProofsReceived: return nil - case <-time.After(bp.extraDelayRequestBlockInfo): + case <-time.After(waitTime): bp.mutRequestedAttestingNoncesMap.RLock() defer bp.mutRequestedAttestingNoncesMap.RUnlock() @@ -2396,7 +2396,7 @@ func (bp *baseProcessor) waitAllMissingProofs() error { } } -func (bp *baseProcessor) checkReceivedHeaderAndUpdateMissingAttesting(headerHandler data.HeaderHandler) { +func (bp *baseProcessor) checkReceivedHeaderIfAttestingIsNeeded(headerHandler data.HeaderHandler) { if !common.ShouldBlockHavePrevProof(headerHandler, bp.enableEpochsHandler, common.EquivalentMessagesFlag) { return } @@ -2408,29 +2408,30 @@ func (bp *baseProcessor) checkReceivedHeaderAndUpdateMissingAttesting(headerHand return } + allProofsReceived := bp.checkReceivedHeaderAndUpdateMissingAttesting(headerHandler) + if allProofsReceived { + bp.allProofsReceived <- true + } +} + +func (bp *baseProcessor) checkReceivedHeaderAndUpdateMissingAttesting(headerHandler data.HeaderHandler) bool { bp.mutRequestedAttestingNoncesMap.Lock() + defer bp.mutRequestedAttestingNoncesMap.Unlock() receivedShard := headerHandler.GetShardID() prevHash := headerHandler.GetPrevHash() _, isHeaderWithoutProof := bp.requestedAttestingNoncesMap[string(prevHash)] if !isHeaderWithoutProof { log.Debug("received header does not have previous hash any of the requested ones") - bp.mutRequestedAttestingNoncesMap.Unlock() - return + return len(bp.requestedAttestingNoncesMap) == 0 } if !bp.proofsPool.HasProof(receivedShard, prevHash) { log.Debug("received next header but proof is still missing", "hash", hex.EncodeToString(prevHash)) - bp.mutRequestedAttestingNoncesMap.Unlock() - return + return len(bp.requestedAttestingNoncesMap) == 0 } delete(bp.requestedAttestingNoncesMap, string(prevHash)) - allProofsReceived := len(bp.requestedAttestingNoncesMap) == 0 - bp.mutRequestedAttestingNoncesMap.Unlock() - - if allProofsReceived { - bp.allProofsReceived <- true - } + return len(bp.requestedAttestingNoncesMap) == 0 } diff --git a/process/block/metablock.go b/process/block/metablock.go index 2f8ce9571d..9f7c193fcf 100644 --- a/process/block/metablock.go +++ b/process/block/metablock.go @@ -343,7 +343,7 @@ func (mp *metaProcessor) ProcessBlock( } } - err = mp.checkProofsForShardData(header) + err = mp.checkProofsForShardData(header, haveTime()) if err != nil { return err } @@ -418,15 +418,15 @@ func (mp *metaProcessor) ProcessBlock( return nil } -func (mp *metaProcessor) checkProofsForShardData(header *block.MetaBlock) error { +func (mp *metaProcessor) checkProofsForShardData(header *block.MetaBlock, waitTime time.Duration) error { if !(mp.enableEpochsHandler.IsFlagEnabledInEpoch(common.EquivalentMessagesFlag, header.Epoch) && header.GetNonce() > 1) { return nil } mp.mutRequestedAttestingNoncesMap.Lock() mp.requestedAttestingNoncesMap = make(map[string]uint64) - _ = core.EmptyChannel(mp.allProofsReceived) mp.mutRequestedAttestingNoncesMap.Unlock() + _ = core.EmptyChannel(mp.allProofsReceived) for _, shardData := range header.ShardInfo { // TODO: consider the validation of the proof: @@ -466,7 +466,7 @@ func (mp *metaProcessor) checkProofsForShardData(header *block.MetaBlock) error } } - return mp.waitAllMissingProofs() + return mp.waitAllMissingProofs(waitTime) } func (mp *metaProcessor) processEpochStartMetaBlock( @@ -2075,7 +2075,7 @@ func (mp *metaProcessor) receivedShardHeader(headerHandler data.HeaderHandler, s "hash", shardHeaderHash, ) - mp.checkReceivedHeaderAndUpdateMissingAttesting(headerHandler) + mp.checkReceivedHeaderIfAttestingIsNeeded(headerHandler) mp.hdrsForCurrBlock.mutHdrsForBlock.Lock() diff --git a/process/block/shardblock.go b/process/block/shardblock.go index dc00a4fc25..e88dc71828 100644 --- a/process/block/shardblock.go +++ b/process/block/shardblock.go @@ -295,8 +295,8 @@ func (sp *shardProcessor) ProcessBlock( sp.mutRequestedAttestingNoncesMap.Lock() sp.requestedAttestingNoncesMap = make(map[string]uint64) - _ = core.EmptyChannel(sp.allProofsReceived) sp.mutRequestedAttestingNoncesMap.Unlock() + _ = core.EmptyChannel(sp.allProofsReceived) // check proofs for cross notarized metablocks for _, metaBlockHash := range header.GetMetaBlockHashes() { @@ -312,7 +312,7 @@ func (sp *shardProcessor) ProcessBlock( sp.checkProofRequestingNextHeaderIfMissing(core.MetachainShardId, metaBlockHash, hInfo.hdr.GetNonce()) } - err = sp.waitAllMissingProofs() + err = sp.waitAllMissingProofs(haveTime()) if err != nil { return err } @@ -1763,7 +1763,7 @@ func (sp *shardProcessor) receivedMetaBlock(headerHandler data.HeaderHandler, me "hash", metaBlockHash, ) - sp.checkReceivedHeaderAndUpdateMissingAttesting(headerHandler) + sp.checkReceivedHeaderIfAttestingIsNeeded(headerHandler) sp.hdrsForCurrBlock.mutHdrsForBlock.Lock()