Skip to content

vms/platformvm: configure state cache sizes #1522 #1677

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

Merged
merged 10 commits into from
Jul 22, 2023
3 changes: 2 additions & 1 deletion vms/platformvm/blocks/builder/helpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -228,17 +228,18 @@ func defaultState(
) state.State {
require := require.New(t)

execCfg, _ := config.GetExecutionConfig([]byte(`{}`))
genesisBytes := buildGenesisTest(t, ctx)
state, err := state.New(
db,
genesisBytes,
prometheus.NewRegistry(),
cfg,
execCfg,
ctx,
metrics.Noop,
rewards,
&utils.Atomic[bool]{},
trackChecksum,
)
require.NoError(err)

Expand Down
3 changes: 2 additions & 1 deletion vms/platformvm/blocks/executor/helpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -268,16 +268,17 @@ func defaultState(
rewards reward.Calculator,
) state.State {
genesisBytes := buildGenesisTest(ctx)
execCfg, _ := config.GetExecutionConfig([]byte(`{}`))
state, err := state.New(
db,
genesisBytes,
prometheus.NewRegistry(),
cfg,
execCfg,
ctx,
metrics.Noop,
rewards,
&utils.Atomic[bool]{},
trackChecksum,
)
if err != nil {
panic(err)
Expand Down
57 changes: 57 additions & 0 deletions vms/platformvm/config/execution_config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
// Copyright (C) 2019-2023, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.

package config

import (
"encoding/json"

"github.com/ava-labs/avalanchego/utils/units"
)

const (
blockCacheSize = 64 * units.MiB
txCacheSize = 128 * units.MiB
transformedSubnetTxCacheSize = 4 * units.MiB

validatorDiffsCacheSize = 2048
rewardUTXOsCacheSize = 2048
chainCacheSize = 2048
chainDBCacheSize = 2048
checksumsEnabled = false
)

// ExecutionConfig provides execution parameters of PlatformVM
type ExecutionConfig struct {
BlockCacheSize int `json:"block-cache-size"`
TxCacheSize int `json:"tx-cache-size"`
TransformedSubnetTxCacheSize int `json:"transformed-subnet-tx-cache-size"`
ValidatorDiffsCacheSize int `json:"validator-diffs-cache-size"`
RewardUTXOsCacheSize int `json:"reward-utxos-cache-size"`
ChainCacheSize int `json:"chain-cache-size"`
ChainDBCacheSize int `json:"chain-db-cache-size"`
ChecksumsEnabled bool `json:"checksums-enabled"`
}

// GetExecutionConfig returns an ExecutionConfig
// input is unmarshalled into an ExecutionConfig previously
// initialized with default values
func GetExecutionConfig(b []byte) (*ExecutionConfig, error) {
ec := &ExecutionConfig{
BlockCacheSize: blockCacheSize,
TxCacheSize: txCacheSize,
TransformedSubnetTxCacheSize: transformedSubnetTxCacheSize,
ValidatorDiffsCacheSize: validatorDiffsCacheSize,
RewardUTXOsCacheSize: rewardUTXOsCacheSize,
ChainCacheSize: chainCacheSize,
ChainDBCacheSize: chainDBCacheSize,
ChecksumsEnabled: checksumsEnabled,
}

// if bytes are empty keep default values
if len(b) == 0 {
return ec, nil
}

return ec, json.Unmarshal(b, ec)
}
93 changes: 93 additions & 0 deletions vms/platformvm/config/execution_config_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
// Copyright (C) 2019-2023, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.

package config

import (
"testing"

"github.com/stretchr/testify/require"
)

func TestExecutionConfigUnmarshal(t *testing.T) {
t.Run("default values from empty json", func(t *testing.T) {
require := require.New(t)
b := []byte(`{}`)
ec, err := GetExecutionConfig(b)
require.NoError(err)
expected := ExecutionConfig{
BlockCacheSize: blockCacheSize,
TxCacheSize: txCacheSize,
TransformedSubnetTxCacheSize: transformedSubnetTxCacheSize,
ValidatorDiffsCacheSize: validatorDiffsCacheSize,
RewardUTXOsCacheSize: rewardUTXOsCacheSize,
ChainCacheSize: chainCacheSize,
ChainDBCacheSize: chainDBCacheSize,
ChecksumsEnabled: checksumsEnabled,
}
require.Equal(expected, *ec)
})

t.Run("default values from empty bytes", func(t *testing.T) {
require := require.New(t)
b := []byte(``)
ec, err := GetExecutionConfig(b)
require.NoError(err)
expected := ExecutionConfig{
BlockCacheSize: blockCacheSize,
TxCacheSize: txCacheSize,
TransformedSubnetTxCacheSize: transformedSubnetTxCacheSize,
ValidatorDiffsCacheSize: validatorDiffsCacheSize,
RewardUTXOsCacheSize: rewardUTXOsCacheSize,
ChainCacheSize: chainCacheSize,
ChainDBCacheSize: chainDBCacheSize,
ChecksumsEnabled: checksumsEnabled,
}
require.Equal(expected, *ec)
})

t.Run("mix default and extracted values from json", func(t *testing.T) {
require := require.New(t)
b := []byte(`{"block-cache-size":1}`)
ec, err := GetExecutionConfig(b)
require.NoError(err)
expected := ExecutionConfig{
BlockCacheSize: 1,
TxCacheSize: txCacheSize,
TransformedSubnetTxCacheSize: transformedSubnetTxCacheSize,
ValidatorDiffsCacheSize: validatorDiffsCacheSize,
RewardUTXOsCacheSize: rewardUTXOsCacheSize,
ChainCacheSize: chainCacheSize,
ChainDBCacheSize: chainDBCacheSize,
ChecksumsEnabled: checksumsEnabled,
}
require.Equal(expected, *ec)
})

t.Run("all values extracted from json", func(t *testing.T) {
require := require.New(t)
b := []byte(`{
"block-cache-size":1,
"tx-cache-size":2,
"transformed-subnet-tx-cache-size":3,
"validator-diffs-cache-size": 4,
"reward-utxos-cache-size": 5,
"chain-cache-size": 6,
"chain-db-cache-size": 7,
"checksums-enabled": true
}`)
ec, err := GetExecutionConfig(b)
require.NoError(err)
expected := ExecutionConfig{
BlockCacheSize: 1,
TxCacheSize: 2,
TransformedSubnetTxCacheSize: 3,
ValidatorDiffsCacheSize: 4,
RewardUTXOsCacheSize: 5,
ChainCacheSize: 6,
ChainDBCacheSize: 7,
ChecksumsEnabled: true,
}
require.Equal(expected, *ec)
})
}
40 changes: 14 additions & 26 deletions vms/platformvm/state/state.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ import (
"github.com/ava-labs/avalanchego/utils/crypto/bls"
"github.com/ava-labs/avalanchego/utils/hashing"
"github.com/ava-labs/avalanchego/utils/math"
"github.com/ava-labs/avalanchego/utils/units"
"github.com/ava-labs/avalanchego/utils/wrappers"
"github.com/ava-labs/avalanchego/vms/components/avax"
"github.com/ava-labs/avalanchego/vms/platformvm/blocks"
Expand All @@ -40,18 +39,7 @@ import (
"github.com/ava-labs/avalanchego/vms/platformvm/txs"
)

const (
blockCacheSize = 64 * units.MiB
txCacheSize = 128 * units.MiB
transformedSubnetTxCacheSize = 4 * units.MiB

pointerOverhead = wrappers.LongLen

validatorDiffsCacheSize = 2048
rewardUTXOsCacheSize = 2048
chainCacheSize = 2048
chainDBCacheSize = 2048
)
const pointerOverhead = wrappers.LongLen

var (
_ State = (*state)(nil)
Expand Down Expand Up @@ -368,21 +356,21 @@ func New(
genesisBytes []byte,
metricsReg prometheus.Registerer,
cfg *config.Config,
execCfg *config.ExecutionConfig,
ctx *snow.Context,
metrics metrics.Metrics,
rewards reward.Calculator,
bootstrapped *utils.Atomic[bool],
trackChecksums bool,
) (State, error) {
s, err := new(
db,
metrics,
cfg,
execCfg,
ctx,
metricsReg,
rewards,
bootstrapped,
trackChecksums,
)
if err != nil {
return nil, err
Expand All @@ -402,16 +390,16 @@ func new(
db database.Database,
metrics metrics.Metrics,
cfg *config.Config,
execCfg *config.ExecutionConfig,
ctx *snow.Context,
metricsReg prometheus.Registerer,
rewards reward.Calculator,
bootstrapped *utils.Atomic[bool],
trackChecksums bool,
) (*state, error) {
blockCache, err := metercacher.New[ids.ID, blocks.Block](
"block_cache",
metricsReg,
cache.NewSizedLRU[ids.ID, blocks.Block](blockCacheSize, blockSize),
cache.NewSizedLRU[ids.ID, blocks.Block](execCfg.BlockCacheSize, blockSize),
)
if err != nil {
return nil, err
Expand All @@ -437,7 +425,7 @@ func new(
validatorWeightDiffsCache, err := metercacher.New[string, map[ids.NodeID]*ValidatorWeightDiff](
"validator_weight_diffs_cache",
metricsReg,
&cache.LRU[string, map[ids.NodeID]*ValidatorWeightDiff]{Size: validatorDiffsCacheSize},
&cache.LRU[string, map[ids.NodeID]*ValidatorWeightDiff]{Size: execCfg.ValidatorDiffsCacheSize},
)
if err != nil {
return nil, err
Expand All @@ -447,7 +435,7 @@ func new(
validatorPublicKeyDiffsCache, err := metercacher.New[uint64, map[ids.NodeID]*bls.PublicKey](
"validator_pub_key_diffs_cache",
metricsReg,
&cache.LRU[uint64, map[ids.NodeID]*bls.PublicKey]{Size: validatorDiffsCacheSize},
&cache.LRU[uint64, map[ids.NodeID]*bls.PublicKey]{Size: execCfg.ValidatorDiffsCacheSize},
)
if err != nil {
return nil, err
Expand All @@ -456,7 +444,7 @@ func new(
txCache, err := metercacher.New(
"tx_cache",
metricsReg,
cache.NewSizedLRU[ids.ID, *txAndStatus](txCacheSize, txAndStatusSize),
cache.NewSizedLRU[ids.ID, *txAndStatus](execCfg.TxCacheSize, txAndStatusSize),
)
if err != nil {
return nil, err
Expand All @@ -466,14 +454,14 @@ func new(
rewardUTXOsCache, err := metercacher.New[ids.ID, []*avax.UTXO](
"reward_utxos_cache",
metricsReg,
&cache.LRU[ids.ID, []*avax.UTXO]{Size: rewardUTXOsCacheSize},
&cache.LRU[ids.ID, []*avax.UTXO]{Size: execCfg.RewardUTXOsCacheSize},
)
if err != nil {
return nil, err
}

utxoDB := prefixdb.New(utxoPrefix, baseDB)
utxoState, err := avax.NewMeteredUTXOState(utxoDB, txs.GenesisCodec, metricsReg, trackChecksums)
utxoState, err := avax.NewMeteredUTXOState(utxoDB, txs.GenesisCodec, metricsReg, execCfg.ChecksumsEnabled)
if err != nil {
return nil, err
}
Expand All @@ -483,7 +471,7 @@ func new(
transformedSubnetCache, err := metercacher.New(
"transformed_subnet_cache",
metricsReg,
cache.NewSizedLRU[ids.ID, *txs.Tx](transformedSubnetTxCacheSize, txSize),
cache.NewSizedLRU[ids.ID, *txs.Tx](execCfg.TransformedSubnetTxCacheSize, txSize),
)
if err != nil {
return nil, err
Expand All @@ -492,7 +480,7 @@ func new(
supplyCache, err := metercacher.New[ids.ID, *uint64](
"supply_cache",
metricsReg,
&cache.LRU[ids.ID, *uint64]{Size: chainCacheSize},
&cache.LRU[ids.ID, *uint64]{Size: execCfg.ChainCacheSize},
)
if err != nil {
return nil, err
Expand All @@ -501,7 +489,7 @@ func new(
chainCache, err := metercacher.New[ids.ID, []*txs.Tx](
"chain_cache",
metricsReg,
&cache.LRU[ids.ID, []*txs.Tx]{Size: chainCacheSize},
&cache.LRU[ids.ID, []*txs.Tx]{Size: execCfg.ChainCacheSize},
)
if err != nil {
return nil, err
Expand All @@ -510,7 +498,7 @@ func new(
chainDBCache, err := metercacher.New[ids.ID, linkeddb.LinkedDB](
"chain_db_cache",
metricsReg,
&cache.LRU[ids.ID, linkeddb.LinkedDB]{Size: chainDBCacheSize},
&cache.LRU[ids.ID, linkeddb.LinkedDB]{Size: execCfg.ChainDBCacheSize},
)
if err != nil {
return nil, err
Expand Down
5 changes: 2 additions & 3 deletions vms/platformvm/state/state_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,6 @@ import (
"github.com/ava-labs/avalanchego/vms/secp256k1fx"
)

const trackChecksum = false

var (
initialTxID = ids.GenerateTestID()
initialNodeID = ids.GenerateTestNodeID()
Expand Down Expand Up @@ -498,12 +496,14 @@ func newStateFromDB(require *require.Assertions, db database.Database) State {
vdrs := validators.NewManager()
primaryVdrs := validators.NewSet()
_ = vdrs.Add(constants.PrimaryNetworkID, primaryVdrs)
execCfg, _ := config.GetExecutionConfig(nil)
state, err := new(
db,
metrics.Noop,
&config.Config{
Validators: vdrs,
},
execCfg,
&snow.Context{},
prometheus.NewRegistry(),
reward.NewCalculator(reward.Config{
Expand All @@ -513,7 +513,6 @@ func newStateFromDB(require *require.Assertions, db database.Database) State {
SupplyCap: 720 * units.MegaAvax,
}),
&utils.Atomic[bool]{},
trackChecksum,
)
require.NoError(err)
require.NotNil(state)
Expand Down
3 changes: 2 additions & 1 deletion vms/platformvm/txs/executor/helpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -220,16 +220,17 @@ func defaultState(
rewards reward.Calculator,
) state.State {
genesisBytes := buildGenesisTest(ctx)
execCfg, _ := config.GetExecutionConfig(nil)
state, err := state.New(
db,
genesisBytes,
prometheus.NewRegistry(),
cfg,
execCfg,
ctx,
metrics.Noop,
rewards,
&utils.Atomic[bool]{},
trackChecksum,
)
if err != nil {
panic(err)
Expand Down
Loading