Skip to content

Commit

Permalink
Add X-chain txs metrics (ava-labs#2756)
Browse files Browse the repository at this point in the history
Co-authored-by: Stephen <stephen@avalabs.org>
  • Loading branch information
gyuho and StephenButtolph committed Mar 20, 2023
1 parent 98790f4 commit e5e04ce
Show file tree
Hide file tree
Showing 12 changed files with 454 additions and 65 deletions.
3 changes: 2 additions & 1 deletion scripts/mocks.mockgen.txt
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ github.com/ava-labs/avalanchego/utils/hashing=Hasher=utils/hashing/mock_hasher.g
github.com/ava-labs/avalanchego/utils/logging=Logger=utils/logging/mock_logger.go
github.com/ava-labs/avalanchego/utils/resource=User=utils/resource/mock_user.go
github.com/ava-labs/avalanchego/vms/avm/blocks=Block=vms/avm/blocks/mock_block.go
github.com/ava-labs/avalanchego/vms/avm/metrics=Metrics=vms/avm/metrics/mock_metrics.go
github.com/ava-labs/avalanchego/vms/avm/states=Chain,State,Diff=vms/avm/states/mock_states.go
github.com/ava-labs/avalanchego/vms/avm/txs/mempool=Mempool=vms/avm/txs/mempool/mock_mempool.go
github.com/ava-labs/avalanchego/vms/components/avax=TransferableIn=vms/components/avax/mock_transferable_in.go
Expand All @@ -47,4 +48,4 @@ github.com/ava-labs/avalanchego/vms/registry=VMGetter=vms/registry/mock_vm_gette
github.com/ava-labs/avalanchego/vms/registry=VMRegisterer=vms/registry/mock_vm_registerer.go
github.com/ava-labs/avalanchego/vms/registry=VMRegistry=vms/registry/mock_vm_registry.go
github.com/ava-labs/avalanchego/vms=Factory,Manager=vms/mock_manager.go
github.com/ava-labs/avalanchego/x/sync=Client=x/sync/mock_client.go
github.com/ava-labs/avalanchego/x/sync=Client=x/sync/mock_client.go
6 changes: 5 additions & 1 deletion vms/avm/blocks/builder/builder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import (
"github.com/ava-labs/avalanchego/version"
"github.com/ava-labs/avalanchego/vms/avm/blocks"
"github.com/ava-labs/avalanchego/vms/avm/fxs"
"github.com/ava-labs/avalanchego/vms/avm/metrics"
"github.com/ava-labs/avalanchego/vms/avm/states"
"github.com/ava-labs/avalanchego/vms/avm/txs"
"github.com/ava-labs/avalanchego/vms/avm/txs/mempool"
Expand Down Expand Up @@ -549,7 +550,10 @@ func TestBlockBuilderAddLocalTx(t *testing.T) {
state.AddBlock(parentBlk)
state.SetLastAccepted(parentBlk.ID())

manager := blkexecutor.NewManager(mempool, state, backend, clk, onAccept)
metrics, err := metrics.New("", registerer)
require.NoError(err)

manager := blkexecutor.NewManager(mempool, metrics, state, backend, clk, onAccept)

manager.SetPreference(parentBlk.ID())

Expand Down
2 changes: 1 addition & 1 deletion vms/avm/blocks/executor/block.go
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,7 @@ func (b *Block) Accept(context.Context) error {
if err := b.manager.backend.Ctx.SharedMemory.Apply(blkState.atomicRequests, batch); err != nil {
return fmt.Errorf("failed to apply state diff to shared memory: %w", err)
}
return nil
return b.manager.metrics.MarkBlockAccepted(b)
}

func (b *Block) Reject(context.Context) error {
Expand Down
109 changes: 109 additions & 0 deletions vms/avm/blocks/executor/block_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
"github.com/ava-labs/avalanchego/utils/set"
"github.com/ava-labs/avalanchego/utils/timer/mockable"
"github.com/ava-labs/avalanchego/vms/avm/blocks"
"github.com/ava-labs/avalanchego/vms/avm/metrics"
"github.com/ava-labs/avalanchego/vms/avm/states"
"github.com/ava-labs/avalanchego/vms/avm/txs"
"github.com/ava-labs/avalanchego/vms/avm/txs/executor"
Expand Down Expand Up @@ -126,6 +127,7 @@ func TestBlockVerify(t *testing.T) {
Block: mockBlock,
manager: &manager{
mempool: mempool,
metrics: metrics.NewMockMetrics(ctrl),
blkIDToState: map[ids.ID]*blockState{},
clk: &mockable.Clock{},
},
Expand Down Expand Up @@ -279,6 +281,7 @@ func TestBlockVerify(t *testing.T) {
Block: mockBlock,
manager: &manager{
mempool: mempool,
metrics: metrics.NewMockMetrics(ctrl),
blkIDToState: map[ids.ID]*blockState{
parentID: {
onAcceptState: mockParentState,
Expand Down Expand Up @@ -328,6 +331,7 @@ func TestBlockVerify(t *testing.T) {
Block: mockBlock,
manager: &manager{
mempool: mempool,
metrics: metrics.NewMockMetrics(ctrl),
backend: &executor.Backend{},
blkIDToState: map[ids.ID]*blockState{
parentID: {
Expand Down Expand Up @@ -405,6 +409,7 @@ func TestBlockVerify(t *testing.T) {
Block: mockBlock,
manager: &manager{
mempool: mempool,
metrics: metrics.NewMockMetrics(ctrl),
backend: &executor.Backend{},
blkIDToState: map[ids.ID]*blockState{
parentID: {
Expand Down Expand Up @@ -514,6 +519,7 @@ func TestBlockVerify(t *testing.T) {
Block: mockBlock,
manager: &manager{
mempool: mockMempool,
metrics: metrics.NewMockMetrics(ctrl),
backend: &executor.Backend{},
blkIDToState: map[ids.ID]*blockState{
parentID: {
Expand Down Expand Up @@ -589,6 +595,7 @@ func TestBlockAccept(t *testing.T) {
Block: mockBlock,
manager: &manager{
mempool: mempool,
metrics: metrics.NewMockMetrics(ctrl),
backend: &executor.Backend{
Ctx: &snow.Context{
Log: logging.NoLog{},
Expand Down Expand Up @@ -686,6 +693,106 @@ func TestBlockAccept(t *testing.T) {
},
expectedErr: errTest,
},
{
name: "failed to apply metrics",
blockFunc: func(ctrl *gomock.Controller) *Block {
blockID := ids.GenerateTestID()
mockBlock := blocks.NewMockBlock(ctrl)
mockBlock.EXPECT().ID().Return(blockID).AnyTimes()
mockBlock.EXPECT().Height().Return(uint64(0)).AnyTimes()
mockBlock.EXPECT().Parent().Return(ids.GenerateTestID()).AnyTimes()
mockBlock.EXPECT().Txs().Return([]*txs.Tx{}).AnyTimes()

mempool := mempool.NewMockMempool(ctrl)
mempool.EXPECT().Remove(gomock.Any()).AnyTimes()

mockManagerState := states.NewMockState(ctrl)
// Note the returned batch is nil but not used
// because we mock the call to shared memory
mockManagerState.EXPECT().CommitBatch().Return(nil, nil)
mockManagerState.EXPECT().Abort()

mockSharedMemory := atomic.NewMockSharedMemory(ctrl)
mockSharedMemory.EXPECT().Apply(gomock.Any(), gomock.Any()).Return(nil)

mockOnAcceptState := states.NewMockDiff(ctrl)
mockOnAcceptState.EXPECT().Apply(mockManagerState)

metrics := metrics.NewMockMetrics(ctrl)
metrics.EXPECT().MarkBlockAccepted(gomock.Any()).Return(errTest)

return &Block{
Block: mockBlock,
manager: &manager{
state: mockManagerState,
mempool: mempool,
metrics: metrics,
backend: &executor.Backend{
Ctx: &snow.Context{
SharedMemory: mockSharedMemory,
Log: logging.NoLog{},
},
},
blkIDToState: map[ids.ID]*blockState{
blockID: {
onAcceptState: mockOnAcceptState,
},
},
},
}
},
expectedErr: errTest,
},
{
name: "no error",
blockFunc: func(ctrl *gomock.Controller) *Block {
blockID := ids.GenerateTestID()
mockBlock := blocks.NewMockBlock(ctrl)
mockBlock.EXPECT().ID().Return(blockID).AnyTimes()
mockBlock.EXPECT().Height().Return(uint64(0)).AnyTimes()
mockBlock.EXPECT().Parent().Return(ids.GenerateTestID()).AnyTimes()
mockBlock.EXPECT().Txs().Return([]*txs.Tx{}).AnyTimes()

mempool := mempool.NewMockMempool(ctrl)
mempool.EXPECT().Remove(gomock.Any()).AnyTimes()

mockManagerState := states.NewMockState(ctrl)
// Note the returned batch is nil but not used
// because we mock the call to shared memory
mockManagerState.EXPECT().CommitBatch().Return(nil, nil)
mockManagerState.EXPECT().Abort()

mockSharedMemory := atomic.NewMockSharedMemory(ctrl)
mockSharedMemory.EXPECT().Apply(gomock.Any(), gomock.Any()).Return(nil)

mockOnAcceptState := states.NewMockDiff(ctrl)
mockOnAcceptState.EXPECT().Apply(mockManagerState)

metrics := metrics.NewMockMetrics(ctrl)
metrics.EXPECT().MarkBlockAccepted(gomock.Any()).Return(nil)

return &Block{
Block: mockBlock,
manager: &manager{
state: mockManagerState,
mempool: mempool,
metrics: metrics,
backend: &executor.Backend{
Ctx: &snow.Context{
SharedMemory: mockSharedMemory,
Log: logging.NoLog{},
},
},
blkIDToState: map[ids.ID]*blockState{
blockID: {
onAcceptState: mockOnAcceptState,
},
},
},
}
},
expectedErr: nil,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
Expand Down Expand Up @@ -769,6 +876,7 @@ func TestBlockReject(t *testing.T) {
manager: &manager{
preferred: preferredID,
mempool: mempool,
metrics: metrics.NewMockMetrics(ctrl),
backend: &executor.Backend{
Bootstrapped: true,
Ctx: &snow.Context{
Expand Down Expand Up @@ -827,6 +935,7 @@ func TestBlockReject(t *testing.T) {
manager: &manager{
preferred: preferredID,
mempool: mempool,
metrics: metrics.NewMockMetrics(ctrl),
backend: &executor.Backend{
Bootstrapped: true,
Ctx: &snow.Context{
Expand Down
4 changes: 4 additions & 0 deletions vms/avm/blocks/executor/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"github.com/ava-labs/avalanchego/utils/set"
"github.com/ava-labs/avalanchego/utils/timer/mockable"
"github.com/ava-labs/avalanchego/vms/avm/blocks"
"github.com/ava-labs/avalanchego/vms/avm/metrics"
"github.com/ava-labs/avalanchego/vms/avm/states"
"github.com/ava-labs/avalanchego/vms/avm/txs"
"github.com/ava-labs/avalanchego/vms/avm/txs/executor"
Expand Down Expand Up @@ -49,6 +50,7 @@ type Manager interface {

func NewManager(
mempool mempool.Mempool,
metrics metrics.Metrics,
state states.State,
backend *executor.Backend,
clk *mockable.Clock,
Expand All @@ -58,6 +60,7 @@ func NewManager(
return &manager{
backend: backend,
state: state,
metrics: metrics,
mempool: mempool,
clk: clk,
onAccept: onAccept,
Expand All @@ -70,6 +73,7 @@ func NewManager(
type manager struct {
backend *executor.Backend
state states.State
metrics metrics.Metrics
mempool mempool.Mempool
clk *mockable.Clock
// Invariant: onAccept is called when [tx] is being marked as accepted, but
Expand Down
49 changes: 0 additions & 49 deletions vms/avm/metrics.go

This file was deleted.

0 comments on commit e5e04ce

Please sign in to comment.