Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

parallel bloom calculation #445

Merged
merged 27 commits into from
Oct 15, 2021
Merged

parallel bloom calculation #445

merged 27 commits into from
Oct 15, 2021

Conversation

steventranjs
Copy link
Contributor

@steventranjs steventranjs commented Oct 9, 2021

Description

  • Trigger receipt.Bloom calculation in a new thread channel out of applyTransaction

Rationale

  • Enhance applyTransaction processing

Example

add an example CLI or API response...

Changes

Notable changes:

  • add each change in a bullet point here
  • ...

Preflight checks

  • build passed (make build)
  • tests passed (make test)
  • manual transaction test passed

Already reviewed by

...

Related issues

... reference related issue #'s here ...

core/state_processor.go Outdated Show resolved Hide resolved
core/state_processor.go Outdated Show resolved Hide resolved
core/state_processor.go Outdated Show resolved Hide resolved
core/state_processor.go Outdated Show resolved Hide resolved
core/state_processor.go Outdated Show resolved Hide resolved
core/state_processor.go Outdated Show resolved Hide resolved
miner/worker.go Outdated Show resolved Hide resolved
miner/worker.go Outdated Show resolved Hide resolved
@unclezoro unclezoro changed the base branch from master to develop October 11, 2021 10:52
core/state_processor.go Outdated Show resolved Hide resolved
core/state_processor.go Outdated Show resolved Hide resolved
core/state_processor.go Outdated Show resolved Hide resolved
miner/worker.go Outdated Show resolved Hide resolved
@j75689
Copy link
Contributor

j75689 commented Oct 12, 2021

I have an idea. Maybe we can define an interface to process some receipt data, like.

package core

import (
	"bytes"
	"sync"

	"github.com/ethereum/go-ethereum/core/types"
)

type ReceiptProcesser interface {
	Apply(receipt *types.Receipt)
}

var (
	_ ReceiptProcesser = (*ReceiptBloomGenertor)(nil)
	_ ReceiptProcesser = (*AsyncReceiptBloomGenertor)(nil)
)

func NewReceiptBloomGenertor() *ReceiptBloomGenertor {
	return &ReceiptBloomGenertor{}
}

type ReceiptBloomGenertor struct {
}

func (p *ReceiptBloomGenertor) Apply(receipt *types.Receipt) {
	receipt.Bloom = types.CreateBloom(types.Receipts{receipt})
}

func NewAsyncReceiptBloomGenertor(length, workerSize int) *AsyncReceiptBloomGenertor {
	generator := &AsyncReceiptBloomGenertor{
		receipts: make(chan *types.Receipt, length),
		wg:       sync.WaitGroup{},
	}
	generator.startWorker(workerSize)
	return generator
}

type AsyncReceiptBloomGenertor struct {
	receipts chan *types.Receipt
	wg       sync.WaitGroup
}

func (p *AsyncReceiptBloomGenertor) startWorker(workerSize int) {
	p.wg.Add(workerSize)
	for i := 0; i < workerSize; i++ {
		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 *AsyncReceiptBloomGenertor) Apply(receipt *types.Receipt) {
	p.receipts <- receipt
}

func (p *AsyncReceiptBloomGenertor) Close() {
	close(p.receipts)
	p.wg.Wait()
}

And change the interface of applyTransaction

func applyTransaction(msg types.Message, config *params.ChainConfig, bc ChainContext, author *common.Address, gp *GasPool, statedb *state.StateDB, header *types.Header, tx *types.Transaction, usedGas *uint64, evm *vm.EVM, receiptProcessers ...ReceiptProcesser) (*types.Receipt, error){
...
    // Set the receipt logs and create the bloom filter.
    receipt.Logs = statedb.GetLogs(tx.Hash())
    receipt.BlockHash = statedb.BlockHash()
    receipt.BlockNumber = header.Number
    receipt.TransactionIndex = uint(statedb.TxIndex())
    for _, receiptProcesser := range receiptProcessers {
    	receiptProcesser.Apply(receipt)
    }
}

And pass the bloomProcesser

// initilise bloom processors
bloomProcessors := core.NewAsyncReceiptBloomGenertor(txs.CurrentSize(), gopool.Threads(txs.CurrentSize()))
...

This may be easier to expand in the future, you can see the detail of this commit -> j75689@81f2a3e

core/state_processor.go Outdated Show resolved Hide resolved
miner/worker.go Outdated Show resolved Hide resolved
eth/catalyst/api.go Outdated Show resolved Hide resolved
core/state_processor.go Outdated Show resolved Hide resolved
miner/worker.go Outdated Show resolved Hide resolved
core/state_processor.go Outdated Show resolved Hide resolved
@unclezoro unclezoro merged commit 31463f8 into bnb-chain:develop Oct 15, 2021
@steventranjs steventranjs deleted the bloom-worker branch October 15, 2021 08:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants