bsc/core/receipt_processor.go
Steven Tran 31463f8dd1
parallel bloom calculation (#445)
* parallel bloom calculation

* indent

* add condition if bloomJobs not nil

* add handler for worker

* fix format

* bloomWorker should exit when all txs have been processed

* rename BloomPair => BloomHash

* add size to map

* rename & unique variable

* bloomJobs => bloomProcessors

* fix

* only assign bloom if empty

* abstraction method for processing receipt bloom

* remove duplicate receipt_processor

* rename Processor

* fix  ReceiptProcessor

* fix ReceiptBloomGenertor typo

* reduce worker to 1

* remove empty wg

* add defence code to check if channel is closed

* remove nil

* format fix

* remove thread pool

* use max 100 worker capacity

* reduce worker size

* refactor startWorker
2021-10-15 16:30:44 +08:00

66 lines
1.3 KiB
Go

package core
import (
"bytes"
"sync"
"github.com/ethereum/go-ethereum/core/types"
)
type ReceiptProcessor interface {
Apply(receipt *types.Receipt)
}
var (
_ ReceiptProcessor = (*ReceiptBloomGenerator)(nil)
_ ReceiptProcessor = (*AsyncReceiptBloomGenerator)(nil)
)
func NewReceiptBloomGenerator() *ReceiptBloomGenerator {
return &ReceiptBloomGenerator{}
}
type ReceiptBloomGenerator struct {
}
func (p *ReceiptBloomGenerator) Apply(receipt *types.Receipt) {
receipt.Bloom = types.CreateBloom(types.Receipts{receipt})
}
func NewAsyncReceiptBloomGenerator(txNums int) *AsyncReceiptBloomGenerator {
generator := &AsyncReceiptBloomGenerator{
receipts: make(chan *types.Receipt, txNums),
}
generator.startWorker()
return generator
}
type AsyncReceiptBloomGenerator struct {
receipts chan *types.Receipt
wg sync.WaitGroup
isClosed bool
}
func (p *AsyncReceiptBloomGenerator) startWorker() {
p.wg.Add(1)
go func() {
defer p.wg.Done()
for receipt := range p.receipts {
if receipt != nil && bytes.Equal(receipt.Bloom[:], types.EmptyBloom[:]) {
receipt.Bloom = types.CreateBloom(types.Receipts{receipt})
}
}
}()
}
func (p *AsyncReceiptBloomGenerator) Apply(receipt *types.Receipt) {
if !p.isClosed {
p.receipts <- receipt
}
}
func (p *AsyncReceiptBloomGenerator) Close() {
close(p.receipts)
p.isClosed = true
p.wg.Wait()
}