Skip to content

Remove RequestBuildBlock on P-Chain Mempool #3705

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

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 25 additions & 9 deletions vms/platformvm/block/builder/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (
"github.com/ava-labs/avalanchego/ids"
"github.com/ava-labs/avalanchego/snow"
"github.com/ava-labs/avalanchego/snow/consensus/snowman"
"github.com/ava-labs/avalanchego/snow/engine/common"
"github.com/ava-labs/avalanchego/utils/set"
"github.com/ava-labs/avalanchego/utils/timer/mockable"
"github.com/ava-labs/avalanchego/utils/units"
Expand All @@ -25,7 +26,7 @@ import (
"github.com/ava-labs/avalanchego/vms/platformvm/status"
"github.com/ava-labs/avalanchego/vms/platformvm/txs"
"github.com/ava-labs/avalanchego/vms/platformvm/txs/fee"
"github.com/ava-labs/avalanchego/vms/platformvm/txs/mempool"
"github.com/ava-labs/avalanchego/vms/txs/mempool"

smblock "github.com/ava-labs/avalanchego/snow/engine/snowman/block"
blockexecutor "github.com/ava-labs/avalanchego/vms/platformvm/block/executor"
Expand Down Expand Up @@ -53,7 +54,7 @@ var (

type Builder interface {
smblock.BuildBlockWithContextChainVM
mempool.Mempool
mempool.Mempool[*txs.Tx]

// StartBlockTimer starts to issue block creation requests to advance the
// chain timestamp.
Expand Down Expand Up @@ -82,8 +83,9 @@ type Builder interface {

// builder implements a simple builder to convert txs into valid blocks
type builder struct {
mempool.Mempool
mempool.Mempool[*txs.Tx]

toEngine chan<- common.Message
txExecutorBackend *txexecutor.Backend
blkManager blockexecutor.Manager

Expand All @@ -95,12 +97,14 @@ type builder struct {
}

func New(
mempool mempool.Mempool,
mempool mempool.Mempool[*txs.Tx],
toEngine chan<- common.Message,
txExecutorBackend *txexecutor.Backend,
blkManager blockexecutor.Manager,
) Builder {
return &builder{
Mempool: mempool,
toEngine: toEngine,
txExecutorBackend: txExecutorBackend,
blkManager: blkManager,
resetTimer: make(chan struct{}, 1),
Expand Down Expand Up @@ -143,7 +147,10 @@ func (b *builder) StartBlockTimer() {
}

// Block needs to be issued to advance time.
b.Mempool.RequestBuildBlock(true /*=emptyBlockPermitted*/)
select {
case b.toEngine <- common.PendingTxs:
default:
}

// Invariant: ResetBlockTimer is guaranteed to be called after
// [durationToSleep] returns a value <= 0. This is because we
Expand Down Expand Up @@ -225,7 +232,16 @@ func (b *builder) BuildBlockWithContext(
) (snowman.Block, error) {
// If there are still transactions in the mempool, then we need to
// re-trigger block building.
defer b.Mempool.RequestBuildBlock(false /*=emptyBlockPermitted*/)
defer func() {
if b.Mempool.Len() == 0 {
return
}

select {
case b.toEngine <- common.PendingTxs:
default:
}
}()

b.txExecutorBackend.Ctx.Log.Debug("starting to attempt to build a block")

Expand Down Expand Up @@ -402,7 +418,7 @@ func packDurangoBlockTxs(
ctx context.Context,
parentID ids.ID,
parentState state.Chain,
mempool mempool.Mempool,
mempool mempool.Mempool[*txs.Tx],
backend *txexecutor.Backend,
manager blockexecutor.Manager,
timestamp time.Time,
Expand Down Expand Up @@ -463,7 +479,7 @@ func packEtnaBlockTxs(
ctx context.Context,
parentID ids.ID,
parentState state.Chain,
mempool mempool.Mempool,
mempool mempool.Mempool[*txs.Tx],
backend *txexecutor.Backend,
manager blockexecutor.Manager,
timestamp time.Time,
Expand Down Expand Up @@ -563,7 +579,7 @@ func executeTx(
ctx context.Context,
parentID ids.ID,
stateDiff state.Diff,
mempool mempool.Mempool,
mempool mempool.Mempool[*txs.Tx],
backend *txexecutor.Backend,
manager blockexecutor.Manager,
pChainHeight uint64,
Expand Down
8 changes: 6 additions & 2 deletions vms/platformvm/block/builder/helpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ import (

blockexecutor "github.com/ava-labs/avalanchego/vms/platformvm/block/executor"
txexecutor "github.com/ava-labs/avalanchego/vms/platformvm/txs/executor"
txmempool "github.com/ava-labs/avalanchego/vms/txs/mempool"
)

const (
Expand All @@ -67,7 +68,7 @@ type mutableSharedMemory struct {
type environment struct {
Builder
blkManager blockexecutor.Manager
mempool mempool.Mempool
mempool txmempool.Mempool[*txs.Tx]
network *network.Network
sender *enginetest.Sender

Expand Down Expand Up @@ -142,11 +143,12 @@ func newEnvironment(t *testing.T, f upgradetest.Fork) *environment { //nolint:un
metrics, err := metrics.New(registerer)
require.NoError(err)

res.mempool, err = mempool.New("mempool", registerer, nil)
res.mempool, err = mempool.New("mempool", registerer)
require.NoError(err)

res.blkManager = blockexecutor.NewManager(
res.mempool,
nil,
metrics,
res.state,
&res.backend,
Expand All @@ -161,6 +163,7 @@ func newEnvironment(t *testing.T, f upgradetest.Fork) *environment { //nolint:un
res.backend.Ctx.ValidatorState,
txVerifier,
res.mempool,
nil,
res.backend.Config.PartialSyncPrimaryNetwork,
res.sender,
&res.ctx.Lock,
Expand All @@ -173,6 +176,7 @@ func newEnvironment(t *testing.T, f upgradetest.Fork) *environment { //nolint:un

res.Builder = New(
res.mempool,
nil,
&res.backend,
res.blkManager,
)
Expand Down
5 changes: 3 additions & 2 deletions vms/platformvm/block/executor/backend.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,15 @@ import (
"github.com/ava-labs/avalanchego/utils/set"
"github.com/ava-labs/avalanchego/vms/platformvm/block"
"github.com/ava-labs/avalanchego/vms/platformvm/state"
"github.com/ava-labs/avalanchego/vms/platformvm/txs/mempool"
"github.com/ava-labs/avalanchego/vms/platformvm/txs"
"github.com/ava-labs/avalanchego/vms/txs/mempool"
)

var errConflictingParentTxs = errors.New("block contains a transaction that conflicts with a transaction in a parent block")

// Shared fields used by visitors.
type backend struct {
mempool.Mempool
mempool.Mempool[*txs.Tx]
// lastAccepted is the ID of the last block that had Accept() called on it.
lastAccepted ids.ID

Expand Down
8 changes: 6 additions & 2 deletions vms/platformvm/block/executor/helpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ import (
"github.com/ava-labs/avalanchego/vms/platformvm/validators/validatorstest"
"github.com/ava-labs/avalanchego/vms/secp256k1fx"
"github.com/ava-labs/avalanchego/wallet/chain/p/wallet"

txmempool "github.com/ava-labs/avalanchego/vms/txs/mempool"
)

const (
Expand Down Expand Up @@ -81,7 +83,7 @@ type test struct {

type environment struct {
blkManager Manager
mempool mempool.Mempool
mempool txmempool.Mempool[*txs.Tx]
sender *enginetest.Sender

isBootstrapped *utils.Atomic[bool]
Expand Down Expand Up @@ -153,14 +155,15 @@ func newEnvironment(t *testing.T, ctrl *gomock.Controller, f upgradetest.Fork) *
metrics := metrics.Noop

var err error
res.mempool, err = mempool.New("mempool", registerer, nil)
res.mempool, err = mempool.New("mempool", registerer)
if err != nil {
panic(fmt.Errorf("failed to create mempool: %w", err))
}

if ctrl == nil {
res.blkManager = NewManager(
res.mempool,
nil,
metrics,
res.state,
res.backend,
Expand All @@ -170,6 +173,7 @@ func newEnvironment(t *testing.T, ctrl *gomock.Controller, f upgradetest.Fork) *
} else {
res.blkManager = NewManager(
res.mempool,
nil,
metrics,
res.mockedState,
res.backend,
Expand Down
7 changes: 5 additions & 2 deletions vms/platformvm/block/executor/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,16 @@ import (

"github.com/ava-labs/avalanchego/ids"
"github.com/ava-labs/avalanchego/snow/consensus/snowman"
"github.com/ava-labs/avalanchego/snow/engine/common"
"github.com/ava-labs/avalanchego/utils/set"
"github.com/ava-labs/avalanchego/vms/platformvm/block"
"github.com/ava-labs/avalanchego/vms/platformvm/metrics"
"github.com/ava-labs/avalanchego/vms/platformvm/state"
"github.com/ava-labs/avalanchego/vms/platformvm/txs"
"github.com/ava-labs/avalanchego/vms/platformvm/txs/executor"
"github.com/ava-labs/avalanchego/vms/platformvm/txs/fee"
"github.com/ava-labs/avalanchego/vms/platformvm/txs/mempool"
"github.com/ava-labs/avalanchego/vms/platformvm/validators"
"github.com/ava-labs/avalanchego/vms/txs/mempool"
)

var (
Expand Down Expand Up @@ -51,7 +52,8 @@ type Manager interface {
}

func NewManager(
mempool mempool.Mempool,
mempool mempool.Mempool[*txs.Tx],
toEngine chan<- common.Message,
metrics metrics.Metrics,
s state.State,
txExecutorBackend *executor.Backend,
Expand All @@ -76,6 +78,7 @@ func NewManager(
},
rejector: &rejector{
backend: backend,
toEngine: toEngine,
addTxsToMempool: !txExecutorBackend.Config.PartialSyncPrimaryNetwork,
},
preferred: lastAccepted,
Expand Down
11 changes: 10 additions & 1 deletion vms/platformvm/block/executor/rejector.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package executor
import (
"go.uber.org/zap"

"github.com/ava-labs/avalanchego/snow/engine/common"
"github.com/ava-labs/avalanchego/vms/platformvm/block"
)

Expand All @@ -16,6 +17,7 @@ var _ block.Visitor = (*rejector)(nil)
// being shutdown.
type rejector struct {
*backend
toEngine chan<- common.Message
addTxsToMempool bool
}

Expand Down Expand Up @@ -82,7 +84,14 @@ func (r *rejector) rejectBlock(b block.Block, blockType string) error {
}
}

r.Mempool.RequestBuildBlock(false /*=emptyBlockPermitted*/)
if r.Mempool.Len() == 0 {
return nil
}

select {
case r.toEngine <- common.PendingTxs:
default:
}

return nil
}
2 changes: 1 addition & 1 deletion vms/platformvm/block/executor/rejector_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ func TestRejectBlock(t *testing.T) {
blk, err := tt.newBlockFunc()
require.NoError(err)

mempool, err := mempool.New("", prometheus.NewRegistry(), nil)
mempool, err := mempool.New("", prometheus.NewRegistry())
require.NoError(err)
state := state.NewMockState(ctrl)
blkIDToState := map[ids.ID]*blockState{
Expand Down
16 changes: 8 additions & 8 deletions vms/platformvm/block/executor/verifier_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ func newTestVerifier(t testing.TB, c testVerifierConfig) *verifier {
c.ValidatorFeeConfig = genesis.LocalParams.ValidatorFeeConfig
}

mempool, err := mempool.New("", prometheus.NewRegistry(), nil)
mempool, err := mempool.New("", prometheus.NewRegistry())
require.NoError(err)

var (
Expand Down Expand Up @@ -454,7 +454,7 @@ func TestVerifierVisitCommitBlock(t *testing.T) {

// Create mocked dependencies.
s := state.NewMockState(ctrl)
mempool, err := mempool.New("", prometheus.NewRegistry(), nil)
mempool, err := mempool.New("", prometheus.NewRegistry())
require.NoError(err)
parentID := ids.GenerateTestID()
parentStatelessBlk := block.NewMockBlock(ctrl)
Expand Down Expand Up @@ -528,7 +528,7 @@ func TestVerifierVisitAbortBlock(t *testing.T) {

// Create mocked dependencies.
s := state.NewMockState(ctrl)
mempool, err := mempool.New("", prometheus.NewRegistry(), nil)
mempool, err := mempool.New("", prometheus.NewRegistry())
require.NoError(err)
parentID := ids.GenerateTestID()
parentStatelessBlk := block.NewMockBlock(ctrl)
Expand Down Expand Up @@ -603,7 +603,7 @@ func TestVerifyUnverifiedParent(t *testing.T) {

// Create mocked dependencies.
s := state.NewMockState(ctrl)
mempool, err := mempool.New("", prometheus.NewRegistry(), nil)
mempool, err := mempool.New("", prometheus.NewRegistry())
require.NoError(err)
parentID := ids.GenerateTestID()

Expand Down Expand Up @@ -674,7 +674,7 @@ func TestBanffAbortBlockTimestampChecks(t *testing.T) {

// Create mocked dependencies.
s := state.NewMockState(ctrl)
mempool, err := mempool.New("", prometheus.NewRegistry(), nil)
mempool, err := mempool.New("", prometheus.NewRegistry())
require.NoError(err)
parentID := ids.GenerateTestID()
parentStatelessBlk := block.NewMockBlock(ctrl)
Expand Down Expand Up @@ -775,7 +775,7 @@ func TestBanffCommitBlockTimestampChecks(t *testing.T) {

// Create mocked dependencies.
s := state.NewMockState(ctrl)
mempool, err := mempool.New("", prometheus.NewRegistry(), nil)
mempool, err := mempool.New("", prometheus.NewRegistry())
require.NoError(err)
parentID := ids.GenerateTestID()
parentStatelessBlk := block.NewMockBlock(ctrl)
Expand Down Expand Up @@ -844,7 +844,7 @@ func TestVerifierVisitApricotStandardBlockWithProposalBlockParent(t *testing.T)

// Create mocked dependencies.
s := state.NewMockState(ctrl)
mempool, err := mempool.New("", prometheus.NewRegistry(), nil)
mempool, err := mempool.New("", prometheus.NewRegistry())
require.NoError(err)
parentID := ids.GenerateTestID()
parentStatelessBlk := block.NewMockBlock(ctrl)
Expand Down Expand Up @@ -901,7 +901,7 @@ func TestVerifierVisitBanffStandardBlockWithProposalBlockParent(t *testing.T) {

// Create mocked dependencies.
s := state.NewMockState(ctrl)
mempool, err := mempool.New("", prometheus.NewRegistry(), nil)
mempool, err := mempool.New("", prometheus.NewRegistry())
require.NoError(err)
parentID := ids.GenerateTestID()
parentStatelessBlk := block.NewMockBlock(ctrl)
Expand Down
Loading