github.com/evdatsion/aphelion-dpos-bft@v0.32.1/state/store_test.go (about)

     1  package state_test
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/assert"
     9  	"github.com/stretchr/testify/require"
    10  
    11  	cfg "github.com/evdatsion/aphelion-dpos-bft/config"
    12  	dbm "github.com/evdatsion/aphelion-dpos-bft/libs/db"
    13  	sm "github.com/evdatsion/aphelion-dpos-bft/state"
    14  	"github.com/evdatsion/aphelion-dpos-bft/types"
    15  )
    16  
    17  func TestStoreLoadValidators(t *testing.T) {
    18  	stateDB := dbm.NewMemDB()
    19  	val, _ := types.RandValidator(true, 10)
    20  	vals := types.NewValidatorSet([]*types.Validator{val})
    21  
    22  	// 1) LoadValidators loads validators using a height where they were last changed
    23  	sm.SaveValidatorsInfo(stateDB, 1, 1, vals)
    24  	sm.SaveValidatorsInfo(stateDB, 2, 1, vals)
    25  	loadedVals, err := sm.LoadValidators(stateDB, 2)
    26  	require.NoError(t, err)
    27  	assert.NotZero(t, loadedVals.Size())
    28  
    29  	// 2) LoadValidators loads validators using a checkpoint height
    30  
    31  	// TODO(melekes): REMOVE in 0.33 release
    32  	// https://github.com/evdatsion/aphelion-dpos-bft/issues/3543
    33  	// for releases prior to v0.31.4, it uses last height changed
    34  	valInfo := &sm.ValidatorsInfo{
    35  		LastHeightChanged: sm.ValSetCheckpointInterval,
    36  	}
    37  	stateDB.Set(sm.CalcValidatorsKey(sm.ValSetCheckpointInterval), valInfo.Bytes())
    38  	assert.NotPanics(t, func() {
    39  		sm.SaveValidatorsInfo(stateDB, sm.ValSetCheckpointInterval+1, 1, vals)
    40  		loadedVals, err := sm.LoadValidators(stateDB, sm.ValSetCheckpointInterval+1)
    41  		if err != nil {
    42  			t.Fatal(err)
    43  		}
    44  		if loadedVals.Size() == 0 {
    45  			t.Fatal("Expected validators to be non-empty")
    46  		}
    47  	})
    48  	// ENDREMOVE
    49  
    50  	sm.SaveValidatorsInfo(stateDB, sm.ValSetCheckpointInterval, 1, vals)
    51  
    52  	loadedVals, err = sm.LoadValidators(stateDB, sm.ValSetCheckpointInterval)
    53  	require.NoError(t, err)
    54  	assert.NotZero(t, loadedVals.Size())
    55  }
    56  
    57  func BenchmarkLoadValidators(b *testing.B) {
    58  	const valSetSize = 100
    59  
    60  	config := cfg.ResetTestRoot("state_")
    61  	defer os.RemoveAll(config.RootDir)
    62  	dbType := dbm.DBBackendType(config.DBBackend)
    63  	stateDB := dbm.NewDB("state", dbType, config.DBDir())
    64  	state, err := sm.LoadStateFromDBOrGenesisFile(stateDB, config.GenesisFile())
    65  	if err != nil {
    66  		b.Fatal(err)
    67  	}
    68  	state.Validators = genValSet(valSetSize)
    69  	state.NextValidators = state.Validators.CopyIncrementProposerPriority(1)
    70  	sm.SaveState(stateDB, state)
    71  
    72  	for i := 10; i < 10000000000; i *= 10 { // 10, 100, 1000, ...
    73  		sm.SaveValidatorsInfo(stateDB, int64(i), state.LastHeightValidatorsChanged, state.NextValidators)
    74  
    75  		b.Run(fmt.Sprintf("height=%d", i), func(b *testing.B) {
    76  			for n := 0; n < b.N; n++ {
    77  				_, err := sm.LoadValidators(stateDB, int64(i))
    78  				if err != nil {
    79  					b.Fatal(err)
    80  				}
    81  			}
    82  		})
    83  	}
    84  }