diff --git a/dataRetriever/dataPool/proofsCache/proofsCache.go b/dataRetriever/dataPool/proofsCache/proofsCache.go index b8aaaf38cd1..3e2c4f0a93d 100644 --- a/dataRetriever/dataPool/proofsCache/proofsCache.go +++ b/dataRetriever/dataPool/proofsCache/proofsCache.go @@ -114,3 +114,10 @@ func (pc *proofsCache) cleanupProofsInBucket(bucket *proofNonceBucket) { delete(pc.proofsByHash, headerHash) } } + +func (pc *proofsCache) getNumProofsByHash() int { + pc.mutProofsCache.RLock() + defer pc.mutProofsCache.RUnlock() + + return len(pc.proofsByHash) +} diff --git a/dataRetriever/dataPool/proofsCache/proofsPool.go b/dataRetriever/dataPool/proofsCache/proofsPool.go index d5c4c4a7629..b9f9d2f69ee 100644 --- a/dataRetriever/dataPool/proofsCache/proofsPool.go +++ b/dataRetriever/dataPool/proofsCache/proofsPool.go @@ -224,6 +224,18 @@ func (pp *proofsPool) RegisterHandler(handler func(headerProof data.HeaderProofH pp.mutAddedProofSubscribers.Unlock() } +func (pp *proofsPool) Len() int { + pp.mutCache.RLock() + defer pp.mutCache.RUnlock() + + numProofsByHash := 0 + for _, proofsPerShard := range pp.cache { + numProofsByHash += proofsPerShard.getNumProofsByHash() + } + + return numProofsByHash +} + // IsInterfaceNil returns true if there is no value under the interface func (pp *proofsPool) IsInterfaceNil() bool { return pp == nil diff --git a/dataRetriever/interface.go b/dataRetriever/interface.go index 9d0ef822ad5..cd3e77c12cf 100644 --- a/dataRetriever/interface.go +++ b/dataRetriever/interface.go @@ -392,5 +392,6 @@ type ProofsPool interface { GetProofByNonce(headerNonce uint64, shardID uint32) (data.HeaderProofHandler, error) HasProof(shardID uint32, headerHash []byte) bool IsProofInPoolEqualTo(headerProof data.HeaderProofHandler) bool + Len() int IsInterfaceNil() bool } diff --git a/process/block/baseProcess.go b/process/block/baseProcess.go index 81b0e1ad9d1..95b910d8a79 100644 --- a/process/block/baseProcess.go +++ b/process/block/baseProcess.go @@ -1312,6 +1312,41 @@ func (bp *baseProcessor) cleanupPools(headerHandler data.HeaderHandler) { // cleanup all unexecuted transaction from txpool bp.cleanupUnexecutableTxsFromPool(executionResultHeaderHash) } + + if headerHandler.GetRound()%50 == 0 { + go bp.logPoolsSize() + } +} + +func (bp *baseProcessor) logPoolsSize() { + dp := bp.dataPool + + log.Debug("logPoolsSize", + "postProcessTxs", "len", dp.PostProcessTransactions().Len(), "size", dp.PostProcessTransactions().SizeInBytesContained(), + "executedMiniBlocksCache", "len", dp.ExecutedMiniBlocks().Len(), "size", dp.ExecutedMiniBlocks().SizeInBytesContained(), + "miniblocks", "len", dp.MiniBlocks().Len(), "size", dp.MiniBlocks().SizeInBytesContained(), + "proofs", "len", dp.Proofs().Len(), + ) + + log.Debug("logPoolsSize headers", + "headers", "len", dp.Headers().Len(), + ) + for i := uint32(0); i < bp.shardCoordinator.NumberOfShards(); i++ { + log.Debug("per shard", + "shardID", i, "numHeaders", dp.Headers().GetNumHeaders(i), + ) + } + log.Debug("per shard", + "shardID", core.MetachainShardId, "numHeaders", dp.Headers().GetNumHeaders(core.MetachainShardId), + ) + + txPoolCounts := dp.Transactions().GetCounts() + + log.Debug("logPoolsSize txPool", + "numTrackedBlocks", dp.Transactions().GetNumTrackedBlocks(), + "numTrackedAccounts", dp.Transactions().GetNumTrackedAccounts(), + "id", txPoolCounts.String(), "total", txPoolCounts.GetTotal(), "total size", txPoolCounts.GetTotalSize(), + ) } func (bp *baseProcessor) cleanupUnexecutableTxsFromPool(headerHash []byte) { diff --git a/testscommon/dataRetriever/proofsPoolMock.go b/testscommon/dataRetriever/proofsPoolMock.go index c7450a411fb..364d45d0340 100644 --- a/testscommon/dataRetriever/proofsPoolMock.go +++ b/testscommon/dataRetriever/proofsPoolMock.go @@ -87,6 +87,10 @@ func (p *ProofsPoolMock) RegisterHandler(handler func(headerProof data.HeaderPro } } +func (p *ProofsPoolMock) Len() int { + return 0 +} + // IsInterfaceNil - func (p *ProofsPoolMock) IsInterfaceNil() bool { return p == nil