From 18bf1d71fcc18bdd27d3f64203edceae0d32ac6e Mon Sep 17 00:00:00 2001 From: EclesioMeloJunior Date: Thu, 7 Apr 2022 09:25:35 -0400 Subject: [PATCH 01/21] fix: verify if next epoch already contains some definition --- dot/digest/digest.go | 32 ++-- dot/digest/digest_test.go | 71 +++++++++ dot/digest/interface.go | 2 + dot/digest/mock_epoch_state_test.go | 147 ++++++++++++++++++ dot/rpc/modules/mocks/block_api.go | 2 +- dot/rpc/modules/mocks/block_finality_api.go | 2 +- dot/rpc/modules/mocks/block_producer_api.go | 2 +- dot/rpc/modules/mocks/core_api.go | 2 +- dot/rpc/modules/mocks/network_api.go | 2 +- dot/rpc/modules/mocks/rpcapi.go | 2 +- dot/rpc/modules/mocks/runtime_storage_api.go | 2 +- dot/rpc/modules/mocks/storage_api.go | 2 +- dot/rpc/modules/mocks/sync_state_api.go | 2 +- dot/rpc/modules/mocks/system_api.go | 2 +- .../modules/mocks/transaction_state_api.go | 2 +- dot/state/epoch.go | 24 +++ dot/state/epoch_test.go | 34 +++- dot/state/mock_observer.go | 2 +- dot/sync/mocks/babe_verifier.go | 2 +- dot/sync/mocks/block_import_handler.go | 2 +- dot/sync/mocks/block_state.go | 2 +- dot/sync/mocks/finality_gadget.go | 2 +- dot/sync/mocks/network.go | 2 +- lib/babe/mocks/block_import_handler.go | 2 +- lib/grandpa/mocks/network.go | 2 +- lib/runtime/mock_memory_test.go | 2 +- lib/runtime/mocks/instance.go | 2 +- lib/runtime/mocks/transaction_state.go | 2 +- lib/runtime/mocks/version.go | 2 +- lib/services/mocks/service.go | 2 +- 30 files changed, 315 insertions(+), 43 deletions(-) create mode 100644 dot/digest/mock_epoch_state_test.go diff --git a/dot/digest/digest.go b/dot/digest/digest.go index ad17d166d9..6bca24a510 100644 --- a/dot/digest/digest.go +++ b/dot/digest/digest.go @@ -17,8 +17,6 @@ import ( var ( _ services.Service = &Handler{} - - ErrDefineNextEpoch = errors.New("cannot define next epoch data and config") ) // Handler is used to handle consensus messages and relevant authority updates to BABE and GRANDPA @@ -267,23 +265,29 @@ func (h *Handler) persistBABEDigestsForNextEpoch(finalizedHeader *types.Header) } nextEpoch := currEpoch + 1 - err = h.epochState.FinalizeBABENextEpochData(nextEpoch) - if err != nil && !errors.Is(err, state.ErrEpochNotInMemory) { - return fmt.Errorf("cannot finalize babe next epoch data for block number %d (%s): %w", - finalizedHeader.Number, finalizedHeader.Hash(), err) + + appliedEpochData, appliedConfigData, err := h.epochState.AlreadyDefined(nextEpoch) + if err != nil { + return fmt.Errorf("cannot check if next epoch is already defined: %w", err) } - err = h.epochState.FinalizeBABENextConfigData(nextEpoch) - if err == nil { - return nil - } else if errors.Is(err, state.ErrEpochNotInMemory) { - return fmt.Errorf("%w: %s", ErrDefineNextEpoch, err) + if !appliedEpochData { + err = h.epochState.FinalizeBABENextEpochData(nextEpoch) + if err != nil && !errors.Is(err, state.ErrEpochNotInMemory) { + return fmt.Errorf("cannot finalize babe next epoch data for block number %d (%s): %w", + finalizedHeader.Number, finalizedHeader.Hash(), err) + } } - // the epoch state does not contains any information about the next epoch - return fmt.Errorf("cannot finalize babe next config data for block number %d (%s): %w", - finalizedHeader.Number, finalizedHeader.Hash(), err) + if !appliedConfigData { + err = h.epochState.FinalizeBABENextConfigData(nextEpoch) + if err != nil && !errors.Is(err, state.ErrEpochNotInMemory) { + return fmt.Errorf("cannot finalize babe next config data for block number %d (%s): %w", + finalizedHeader.Number, finalizedHeader.Hash(), err) + } + } + return nil } func (h *Handler) handleGrandpaChangesOnImport(num uint) error { diff --git a/dot/digest/digest_test.go b/dot/digest/digest_test.go index dcb0d8633b..53bd99b4c0 100644 --- a/dot/digest/digest_test.go +++ b/dot/digest/digest_test.go @@ -4,6 +4,7 @@ package digest import ( + "errors" "testing" "time" @@ -515,3 +516,73 @@ func TestHandler_HandleNextConfigData(t *testing.T) { require.NoError(t, err) require.Equal(t, act.ToConfigData(), stored) } + +func Test_persistBABEDigestsForNextEpoch(t *testing.T) { + type testStruct struct { + defineNextEpochData bool + defineNextConfigData bool + expectedErr error + alreadyDefinedFuncThrowError bool + } + + tests := map[string]testStruct{ + "epoch_data_already_defined": { + defineNextEpochData: true, + }, + "config_data_already_defined": { + defineNextConfigData: true, + }, + "both_already_defined": { + defineNextEpochData: true, + defineNextConfigData: true, + }, + "both_not_defined": {}, + "error_while_checking_already_defined": { + alreadyDefinedFuncThrowError: true, + expectedErr: errors.New( + "cannot check if next epoch is already defined: problems while calling function"), + }, + } + + for testName, tt := range tests { + tt := tt + t.Run(testName, func(t *testing.T) { + testFinalizedHeader := &types.Header{} + + ctrl := gomock.NewController(t) + epochStateMock := NewMockEpochState(ctrl) + + var currentEpoch uint64 = 1 + epochStateMock.EXPECT().GetEpochForBlock(testFinalizedHeader). + Return(currentEpoch, nil) + + if tt.alreadyDefinedFuncThrowError { + epochStateMock.EXPECT().AlreadyDefined(currentEpoch+1). + Return(false, false, errors.New("problems while calling function")) + } else { + epochStateMock.EXPECT().AlreadyDefined(currentEpoch+1). + Return(tt.defineNextEpochData, tt.defineNextConfigData, nil) + + if !tt.defineNextEpochData { + epochStateMock.EXPECT().FinalizeBABENextEpochData(currentEpoch + 1) + } + + if !tt.defineNextConfigData { + epochStateMock.EXPECT().FinalizeBABENextConfigData(currentEpoch + 1) + } + } + + digestHandler := &Handler{ + epochState: epochStateMock, + } + + err := digestHandler.persistBABEDigestsForNextEpoch(testFinalizedHeader) + if tt.expectedErr != nil { + require.Error(t, err) + require.EqualError(t, err, tt.expectedErr.Error()) + } else { + require.NoError(t, err) + } + }) + } +} diff --git a/dot/digest/interface.go b/dot/digest/interface.go index 22c2fda1e5..b4899396c2 100644 --- a/dot/digest/interface.go +++ b/dot/digest/interface.go @@ -18,6 +18,7 @@ type BlockState interface { FreeFinalisedNotifierChannel(ch chan *types.FinalisationInfo) } +//go:generate mockgen -destination=mock_epoch_state_test.go -package $GOPACKAGE . EpochState // EpochState is the interface for state.EpochState type EpochState interface { GetEpochForBlock(header *types.Header) (uint64, error) @@ -28,6 +29,7 @@ type EpochState interface { StoreBABENextConfigData(epoch uint64, hash common.Hash, nextEpochData types.NextConfigData) FinalizeBABENextEpochData(epoch uint64) error FinalizeBABENextConfigData(epoch uint64) error + AlreadyDefined(epoch uint64) (epochData bool, configData bool, err error) } // GrandpaState is the interface for the state.GrandpaState diff --git a/dot/digest/mock_epoch_state_test.go b/dot/digest/mock_epoch_state_test.go new file mode 100644 index 0000000000..9b2ea3c305 --- /dev/null +++ b/dot/digest/mock_epoch_state_test.go @@ -0,0 +1,147 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/ChainSafe/gossamer/dot/digest (interfaces: EpochState) + +// Package digest is a generated GoMock package. +package digest + +import ( + reflect "reflect" + + types "github.com/ChainSafe/gossamer/dot/types" + common "github.com/ChainSafe/gossamer/lib/common" + gomock "github.com/golang/mock/gomock" +) + +// MockEpochState is a mock of EpochState interface. +type MockEpochState struct { + ctrl *gomock.Controller + recorder *MockEpochStateMockRecorder +} + +// MockEpochStateMockRecorder is the mock recorder for MockEpochState. +type MockEpochStateMockRecorder struct { + mock *MockEpochState +} + +// NewMockEpochState creates a new mock instance. +func NewMockEpochState(ctrl *gomock.Controller) *MockEpochState { + mock := &MockEpochState{ctrl: ctrl} + mock.recorder = &MockEpochStateMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockEpochState) EXPECT() *MockEpochStateMockRecorder { + return m.recorder +} + +// AlreadyDefined mocks base method. +func (m *MockEpochState) AlreadyDefined(arg0 uint64) (bool, bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AlreadyDefined", arg0) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(bool) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// AlreadyDefined indicates an expected call of AlreadyDefined. +func (mr *MockEpochStateMockRecorder) AlreadyDefined(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AlreadyDefined", reflect.TypeOf((*MockEpochState)(nil).AlreadyDefined), arg0) +} + +// FinalizeBABENextConfigData mocks base method. +func (m *MockEpochState) FinalizeBABENextConfigData(arg0 uint64) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FinalizeBABENextConfigData", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// FinalizeBABENextConfigData indicates an expected call of FinalizeBABENextConfigData. +func (mr *MockEpochStateMockRecorder) FinalizeBABENextConfigData(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FinalizeBABENextConfigData", reflect.TypeOf((*MockEpochState)(nil).FinalizeBABENextConfigData), arg0) +} + +// FinalizeBABENextEpochData mocks base method. +func (m *MockEpochState) FinalizeBABENextEpochData(arg0 uint64) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FinalizeBABENextEpochData", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// FinalizeBABENextEpochData indicates an expected call of FinalizeBABENextEpochData. +func (mr *MockEpochStateMockRecorder) FinalizeBABENextEpochData(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FinalizeBABENextEpochData", reflect.TypeOf((*MockEpochState)(nil).FinalizeBABENextEpochData), arg0) +} + +// GetEpochForBlock mocks base method. +func (m *MockEpochState) GetEpochForBlock(arg0 *types.Header) (uint64, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetEpochForBlock", arg0) + ret0, _ := ret[0].(uint64) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetEpochForBlock indicates an expected call of GetEpochForBlock. +func (mr *MockEpochStateMockRecorder) GetEpochForBlock(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetEpochForBlock", reflect.TypeOf((*MockEpochState)(nil).GetEpochForBlock), arg0) +} + +// SetConfigData mocks base method. +func (m *MockEpochState) SetConfigData(arg0 uint64, arg1 *types.ConfigData) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetConfigData", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// SetConfigData indicates an expected call of SetConfigData. +func (mr *MockEpochStateMockRecorder) SetConfigData(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetConfigData", reflect.TypeOf((*MockEpochState)(nil).SetConfigData), arg0, arg1) +} + +// SetEpochData mocks base method. +func (m *MockEpochState) SetEpochData(arg0 uint64, arg1 *types.EpochData) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetEpochData", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// SetEpochData indicates an expected call of SetEpochData. +func (mr *MockEpochStateMockRecorder) SetEpochData(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetEpochData", reflect.TypeOf((*MockEpochState)(nil).SetEpochData), arg0, arg1) +} + +// StoreBABENextConfigData mocks base method. +func (m *MockEpochState) StoreBABENextConfigData(arg0 uint64, arg1 common.Hash, arg2 types.NextConfigData) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "StoreBABENextConfigData", arg0, arg1, arg2) +} + +// StoreBABENextConfigData indicates an expected call of StoreBABENextConfigData. +func (mr *MockEpochStateMockRecorder) StoreBABENextConfigData(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StoreBABENextConfigData", reflect.TypeOf((*MockEpochState)(nil).StoreBABENextConfigData), arg0, arg1, arg2) +} + +// StoreBABENextEpochData mocks base method. +func (m *MockEpochState) StoreBABENextEpochData(arg0 uint64, arg1 common.Hash, arg2 types.NextEpochData) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "StoreBABENextEpochData", arg0, arg1, arg2) +} + +// StoreBABENextEpochData indicates an expected call of StoreBABENextEpochData. +func (mr *MockEpochStateMockRecorder) StoreBABENextEpochData(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StoreBABENextEpochData", reflect.TypeOf((*MockEpochState)(nil).StoreBABENextEpochData), arg0, arg1, arg2) +} diff --git a/dot/rpc/modules/mocks/block_api.go b/dot/rpc/modules/mocks/block_api.go index 8fae0eb002..e181efe6c1 100644 --- a/dot/rpc/modules/mocks/block_api.go +++ b/dot/rpc/modules/mocks/block_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.0. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/block_finality_api.go b/dot/rpc/modules/mocks/block_finality_api.go index cd163ce5c7..88f5603664 100644 --- a/dot/rpc/modules/mocks/block_finality_api.go +++ b/dot/rpc/modules/mocks/block_finality_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.0. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/block_producer_api.go b/dot/rpc/modules/mocks/block_producer_api.go index a18e2ace04..145a12cf05 100644 --- a/dot/rpc/modules/mocks/block_producer_api.go +++ b/dot/rpc/modules/mocks/block_producer_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.0. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/core_api.go b/dot/rpc/modules/mocks/core_api.go index baacb5b5b0..c0b7888174 100644 --- a/dot/rpc/modules/mocks/core_api.go +++ b/dot/rpc/modules/mocks/core_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.0. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/network_api.go b/dot/rpc/modules/mocks/network_api.go index 8ab4e28bec..7612263725 100644 --- a/dot/rpc/modules/mocks/network_api.go +++ b/dot/rpc/modules/mocks/network_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.0. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/rpcapi.go b/dot/rpc/modules/mocks/rpcapi.go index e5be5e8790..8a98eb7e7b 100644 --- a/dot/rpc/modules/mocks/rpcapi.go +++ b/dot/rpc/modules/mocks/rpcapi.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.0. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/runtime_storage_api.go b/dot/rpc/modules/mocks/runtime_storage_api.go index 0380c1cf82..cbeb4e6da5 100644 --- a/dot/rpc/modules/mocks/runtime_storage_api.go +++ b/dot/rpc/modules/mocks/runtime_storage_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.0. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/storage_api.go b/dot/rpc/modules/mocks/storage_api.go index 2b4557ce82..bfa38698ee 100644 --- a/dot/rpc/modules/mocks/storage_api.go +++ b/dot/rpc/modules/mocks/storage_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.0. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/sync_state_api.go b/dot/rpc/modules/mocks/sync_state_api.go index cfbc014ea4..36eb613373 100644 --- a/dot/rpc/modules/mocks/sync_state_api.go +++ b/dot/rpc/modules/mocks/sync_state_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.0. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/system_api.go b/dot/rpc/modules/mocks/system_api.go index f8f39b0c6a..d7d66e836a 100644 --- a/dot/rpc/modules/mocks/system_api.go +++ b/dot/rpc/modules/mocks/system_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.0. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/transaction_state_api.go b/dot/rpc/modules/mocks/transaction_state_api.go index d783820fa4..8bfc29a641 100644 --- a/dot/rpc/modules/mocks/transaction_state_api.go +++ b/dot/rpc/modules/mocks/transaction_state_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.0. DO NOT EDIT. package mocks diff --git a/dot/state/epoch.go b/dot/state/epoch.go index d77ae8fc32..1e97b78e97 100644 --- a/dot/state/epoch.go +++ b/dot/state/epoch.go @@ -512,6 +512,30 @@ func (s *EpochState) SkipVerify(header *types.Header) (bool, error) { return false, nil } +// AlreadyDefined will true for each returned value if it is already defined in the database for the given epoch +func (s *EpochState) AlreadyDefined(epoch uint64) (epochData bool, configData bool, err error) { + keys := [...][]byte{epochDataKey(epoch), configDataKey(epoch)} + applied := [...]bool{false, false} + + for idx, key := range keys { + enc, err := s.db.Get(key) + + if errors.Is(err, chaindb.ErrKeyNotFound) { + continue + } else if err != nil { + return false, false, fmt.Errorf("cannot retrieve %s from database: %w", string(key), err) + } + + if len(enc) == 0 { + continue + } + + applied[idx] = true + } + + return applied[0], applied[1], nil +} + // StoreBABENextEpochData stores the types.NextEpochData under epoch and hash keys func (s *EpochState) StoreBABENextEpochData(epoch uint64, hash common.Hash, nextEpochData types.NextEpochData) { s.nextEpochDataLock.Lock() diff --git a/dot/state/epoch_test.go b/dot/state/epoch_test.go index f3b4247890..1071f2a3ab 100644 --- a/dot/state/epoch_test.go +++ b/dot/state/epoch_test.go @@ -401,12 +401,24 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { err := epochState.blockState.db.Put(headerKey(tt.finalizeHash), []byte{}) require.NoError(t, err) + // before finalize next epoch data this epoch should not be defined + definedEpochData, definedConfigData, err := epochState.AlreadyDefined(tt.finalizeEpoch) + require.NoError(t, err) + require.False(t, definedEpochData) + require.False(t, definedConfigData) + err = epochState.FinalizeBABENextEpochData(tt.finalizeEpoch) if tt.expectErr != nil { require.ErrorIs(t, err, tt.expectErr) } else { require.NoError(t, err) + // after finalize next epoch data this epoch should not defined + definedEpochData, definedConfigData, err := epochState.AlreadyDefined(tt.finalizeEpoch) + require.NoError(t, err) + require.True(t, definedEpochData) + require.False(t, definedConfigData) + expected, err := expectedNextEpochData.ToEpochData() require.NoError(t, err) @@ -422,7 +434,7 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { } } -type inMemotyNextConfighData struct { +type inMemoryNextConfighData struct { epoch uint64 hashes []common.Hash nextConfigDatas []types.NextConfigData @@ -431,7 +443,7 @@ type inMemotyNextConfighData struct { func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { tests := map[string]struct { finalizeHash common.Hash - inMemoryEpoch []inMemotyNextConfighData + inMemoryEpoch []inMemoryNextConfighData finalizeEpoch uint64 expectErr error shouldRemainInMemory int @@ -440,7 +452,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { shouldRemainInMemory: 1, finalizeEpoch: 2, finalizeHash: common.MustHexToHash("0x68a27df5a52ff2251df2cc8368f7dcefb305a13bb3d89b65c8fb070f23877f2c"), - inMemoryEpoch: []inMemotyNextConfighData{ + inMemoryEpoch: []inMemoryNextConfighData{ { epoch: 1, hashes: []common.Hash{ @@ -511,7 +523,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { finalizeEpoch: 1, finalizeHash: common.Hash{}, // finalize when the hash does not exists expectErr: errHashNotPersisted, - inMemoryEpoch: []inMemotyNextConfighData{ + inMemoryEpoch: []inMemoryNextConfighData{ { epoch: 1, hashes: []common.Hash{ @@ -544,7 +556,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { finalizeEpoch: 3, // try to finalize a epoch that does not exists finalizeHash: common.Hash{}, expectErr: ErrEpochNotInMemory, - inMemoryEpoch: []inMemotyNextConfighData{ + inMemoryEpoch: []inMemoryNextConfighData{ { epoch: 1, hashes: []common.Hash{ @@ -591,12 +603,24 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { err := epochState.blockState.db.Put(headerKey(tt.finalizeHash), []byte{}) require.NoError(t, err) + // before finalize next config data this epoch should not be defined + definedEpochData, definedConfigData, err := epochState.AlreadyDefined(tt.finalizeEpoch) + require.NoError(t, err) + require.False(t, definedEpochData) + require.False(t, definedConfigData) + err = epochState.FinalizeBABENextConfigData(tt.finalizeEpoch) if tt.expectErr != nil { require.ErrorIs(t, err, tt.expectErr) } else { require.NoError(t, err) + // after finalize next config data this epoch should be defined + definedEpochData, definedConfigData, err = epochState.AlreadyDefined(tt.finalizeEpoch) + require.NoError(t, err) + require.False(t, definedEpochData) + require.True(t, definedConfigData) + gotConfigData, err := epochState.GetConfigData(tt.finalizeEpoch, nil) require.NoError(t, err) require.Equal(t, expectedConfigData.ToConfigData(), gotConfigData) diff --git a/dot/state/mock_observer.go b/dot/state/mock_observer.go index 6a0683586d..eacd834d94 100644 --- a/dot/state/mock_observer.go +++ b/dot/state/mock_observer.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.0. DO NOT EDIT. package state diff --git a/dot/sync/mocks/babe_verifier.go b/dot/sync/mocks/babe_verifier.go index 0be36b3ad8..5fbccebf5f 100644 --- a/dot/sync/mocks/babe_verifier.go +++ b/dot/sync/mocks/babe_verifier.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.0. DO NOT EDIT. package mocks diff --git a/dot/sync/mocks/block_import_handler.go b/dot/sync/mocks/block_import_handler.go index 10488e6f7a..707889776a 100644 --- a/dot/sync/mocks/block_import_handler.go +++ b/dot/sync/mocks/block_import_handler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.0. DO NOT EDIT. package mocks diff --git a/dot/sync/mocks/block_state.go b/dot/sync/mocks/block_state.go index 367601d550..fe80df7afb 100644 --- a/dot/sync/mocks/block_state.go +++ b/dot/sync/mocks/block_state.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.0. DO NOT EDIT. package mocks diff --git a/dot/sync/mocks/finality_gadget.go b/dot/sync/mocks/finality_gadget.go index f3c1fc3e5e..6e0c24e5f5 100644 --- a/dot/sync/mocks/finality_gadget.go +++ b/dot/sync/mocks/finality_gadget.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.0. DO NOT EDIT. package mocks diff --git a/dot/sync/mocks/network.go b/dot/sync/mocks/network.go index d1b945bde6..e57141d40b 100644 --- a/dot/sync/mocks/network.go +++ b/dot/sync/mocks/network.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.0. DO NOT EDIT. package mocks diff --git a/lib/babe/mocks/block_import_handler.go b/lib/babe/mocks/block_import_handler.go index c803e1f65b..9ef4b5f84f 100644 --- a/lib/babe/mocks/block_import_handler.go +++ b/lib/babe/mocks/block_import_handler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.0. DO NOT EDIT. package mocks diff --git a/lib/grandpa/mocks/network.go b/lib/grandpa/mocks/network.go index a1930740db..8756166777 100644 --- a/lib/grandpa/mocks/network.go +++ b/lib/grandpa/mocks/network.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.0. DO NOT EDIT. package mocks diff --git a/lib/runtime/mock_memory_test.go b/lib/runtime/mock_memory_test.go index 97374c51cc..43d9af4e69 100644 --- a/lib/runtime/mock_memory_test.go +++ b/lib/runtime/mock_memory_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.0. DO NOT EDIT. package runtime diff --git a/lib/runtime/mocks/instance.go b/lib/runtime/mocks/instance.go index 9188ba2349..01067cae59 100644 --- a/lib/runtime/mocks/instance.go +++ b/lib/runtime/mocks/instance.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.0. DO NOT EDIT. package mocks diff --git a/lib/runtime/mocks/transaction_state.go b/lib/runtime/mocks/transaction_state.go index 952ecfad4e..f6e3c1d492 100644 --- a/lib/runtime/mocks/transaction_state.go +++ b/lib/runtime/mocks/transaction_state.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.0. DO NOT EDIT. package mocks diff --git a/lib/runtime/mocks/version.go b/lib/runtime/mocks/version.go index b389875077..9844101e0d 100644 --- a/lib/runtime/mocks/version.go +++ b/lib/runtime/mocks/version.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.0. DO NOT EDIT. package mocks diff --git a/lib/services/mocks/service.go b/lib/services/mocks/service.go index 98752d2740..f57699b99a 100644 --- a/lib/services/mocks/service.go +++ b/lib/services/mocks/service.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.0. DO NOT EDIT. package mocks From 5ca05d0a18ba4bc32db6963ba5d73d16d79ae817 Mon Sep 17 00:00:00 2001 From: EclesioMeloJunior Date: Thu, 7 Apr 2022 09:38:19 -0400 Subject: [PATCH 02/21] chore: upgrade mockery version --- Makefile | 1 - dot/rpc/modules/mocks/block_api.go | 2 +- dot/rpc/modules/mocks/block_finality_api.go | 2 +- dot/rpc/modules/mocks/block_producer_api.go | 2 +- dot/rpc/modules/mocks/core_api.go | 2 +- dot/rpc/modules/mocks/network_api.go | 2 +- dot/rpc/modules/mocks/rpcapi.go | 2 +- dot/rpc/modules/mocks/runtime_storage_api.go | 2 +- dot/rpc/modules/mocks/storage_api.go | 2 +- dot/rpc/modules/mocks/sync_state_api.go | 2 +- dot/rpc/modules/mocks/system_api.go | 2 +- dot/rpc/modules/mocks/transaction_state_api.go | 2 +- dot/state/mock_observer.go | 2 +- dot/sync/mocks/babe_verifier.go | 2 +- dot/sync/mocks/block_import_handler.go | 2 +- dot/sync/mocks/block_state.go | 2 +- dot/sync/mocks/finality_gadget.go | 2 +- dot/sync/mocks/network.go | 2 +- lib/babe/mocks/block_import_handler.go | 2 +- lib/grandpa/mocks/network.go | 2 +- lib/runtime/mock_memory_test.go | 2 +- lib/runtime/mocks/instance.go | 2 +- lib/runtime/mocks/transaction_state.go | 2 +- lib/runtime/mocks/version.go | 2 +- lib/services/mocks/service.go | 2 +- 25 files changed, 24 insertions(+), 25 deletions(-) diff --git a/Makefile b/Makefile index 40efe95b21..fc3c79a99a 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,6 @@ lint: clean: rm -fr ./bin - proto: go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28 protoc -I=./dot/network/proto --go_out=./dot/network/proto dot/network/proto/api.v1.proto diff --git a/dot/rpc/modules/mocks/block_api.go b/dot/rpc/modules/mocks/block_api.go index e181efe6c1..8fae0eb002 100644 --- a/dot/rpc/modules/mocks/block_api.go +++ b/dot/rpc/modules/mocks/block_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.0. DO NOT EDIT. +// Code generated by mockery v2.10.4. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/block_finality_api.go b/dot/rpc/modules/mocks/block_finality_api.go index 88f5603664..cd163ce5c7 100644 --- a/dot/rpc/modules/mocks/block_finality_api.go +++ b/dot/rpc/modules/mocks/block_finality_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.0. DO NOT EDIT. +// Code generated by mockery v2.10.4. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/block_producer_api.go b/dot/rpc/modules/mocks/block_producer_api.go index 145a12cf05..a18e2ace04 100644 --- a/dot/rpc/modules/mocks/block_producer_api.go +++ b/dot/rpc/modules/mocks/block_producer_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.0. DO NOT EDIT. +// Code generated by mockery v2.10.4. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/core_api.go b/dot/rpc/modules/mocks/core_api.go index c0b7888174..baacb5b5b0 100644 --- a/dot/rpc/modules/mocks/core_api.go +++ b/dot/rpc/modules/mocks/core_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.0. DO NOT EDIT. +// Code generated by mockery v2.10.4. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/network_api.go b/dot/rpc/modules/mocks/network_api.go index 7612263725..8ab4e28bec 100644 --- a/dot/rpc/modules/mocks/network_api.go +++ b/dot/rpc/modules/mocks/network_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.0. DO NOT EDIT. +// Code generated by mockery v2.10.4. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/rpcapi.go b/dot/rpc/modules/mocks/rpcapi.go index 8a98eb7e7b..e5be5e8790 100644 --- a/dot/rpc/modules/mocks/rpcapi.go +++ b/dot/rpc/modules/mocks/rpcapi.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.0. DO NOT EDIT. +// Code generated by mockery v2.10.4. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/runtime_storage_api.go b/dot/rpc/modules/mocks/runtime_storage_api.go index cbeb4e6da5..0380c1cf82 100644 --- a/dot/rpc/modules/mocks/runtime_storage_api.go +++ b/dot/rpc/modules/mocks/runtime_storage_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.0. DO NOT EDIT. +// Code generated by mockery v2.10.4. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/storage_api.go b/dot/rpc/modules/mocks/storage_api.go index bfa38698ee..2b4557ce82 100644 --- a/dot/rpc/modules/mocks/storage_api.go +++ b/dot/rpc/modules/mocks/storage_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.0. DO NOT EDIT. +// Code generated by mockery v2.10.4. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/sync_state_api.go b/dot/rpc/modules/mocks/sync_state_api.go index 36eb613373..cfbc014ea4 100644 --- a/dot/rpc/modules/mocks/sync_state_api.go +++ b/dot/rpc/modules/mocks/sync_state_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.0. DO NOT EDIT. +// Code generated by mockery v2.10.4. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/system_api.go b/dot/rpc/modules/mocks/system_api.go index d7d66e836a..f8f39b0c6a 100644 --- a/dot/rpc/modules/mocks/system_api.go +++ b/dot/rpc/modules/mocks/system_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.0. DO NOT EDIT. +// Code generated by mockery v2.10.4. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/transaction_state_api.go b/dot/rpc/modules/mocks/transaction_state_api.go index 8bfc29a641..d783820fa4 100644 --- a/dot/rpc/modules/mocks/transaction_state_api.go +++ b/dot/rpc/modules/mocks/transaction_state_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.0. DO NOT EDIT. +// Code generated by mockery v2.10.4. DO NOT EDIT. package mocks diff --git a/dot/state/mock_observer.go b/dot/state/mock_observer.go index eacd834d94..6a0683586d 100644 --- a/dot/state/mock_observer.go +++ b/dot/state/mock_observer.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.0. DO NOT EDIT. +// Code generated by mockery v2.10.4. DO NOT EDIT. package state diff --git a/dot/sync/mocks/babe_verifier.go b/dot/sync/mocks/babe_verifier.go index 5fbccebf5f..0be36b3ad8 100644 --- a/dot/sync/mocks/babe_verifier.go +++ b/dot/sync/mocks/babe_verifier.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.0. DO NOT EDIT. +// Code generated by mockery v2.10.4. DO NOT EDIT. package mocks diff --git a/dot/sync/mocks/block_import_handler.go b/dot/sync/mocks/block_import_handler.go index 707889776a..10488e6f7a 100644 --- a/dot/sync/mocks/block_import_handler.go +++ b/dot/sync/mocks/block_import_handler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.0. DO NOT EDIT. +// Code generated by mockery v2.10.4. DO NOT EDIT. package mocks diff --git a/dot/sync/mocks/block_state.go b/dot/sync/mocks/block_state.go index fe80df7afb..367601d550 100644 --- a/dot/sync/mocks/block_state.go +++ b/dot/sync/mocks/block_state.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.0. DO NOT EDIT. +// Code generated by mockery v2.10.4. DO NOT EDIT. package mocks diff --git a/dot/sync/mocks/finality_gadget.go b/dot/sync/mocks/finality_gadget.go index 6e0c24e5f5..f3c1fc3e5e 100644 --- a/dot/sync/mocks/finality_gadget.go +++ b/dot/sync/mocks/finality_gadget.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.0. DO NOT EDIT. +// Code generated by mockery v2.10.4. DO NOT EDIT. package mocks diff --git a/dot/sync/mocks/network.go b/dot/sync/mocks/network.go index e57141d40b..d1b945bde6 100644 --- a/dot/sync/mocks/network.go +++ b/dot/sync/mocks/network.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.0. DO NOT EDIT. +// Code generated by mockery v2.10.4. DO NOT EDIT. package mocks diff --git a/lib/babe/mocks/block_import_handler.go b/lib/babe/mocks/block_import_handler.go index 9ef4b5f84f..c803e1f65b 100644 --- a/lib/babe/mocks/block_import_handler.go +++ b/lib/babe/mocks/block_import_handler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.0. DO NOT EDIT. +// Code generated by mockery v2.10.4. DO NOT EDIT. package mocks diff --git a/lib/grandpa/mocks/network.go b/lib/grandpa/mocks/network.go index 8756166777..a1930740db 100644 --- a/lib/grandpa/mocks/network.go +++ b/lib/grandpa/mocks/network.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.0. DO NOT EDIT. +// Code generated by mockery v2.10.4. DO NOT EDIT. package mocks diff --git a/lib/runtime/mock_memory_test.go b/lib/runtime/mock_memory_test.go index 43d9af4e69..97374c51cc 100644 --- a/lib/runtime/mock_memory_test.go +++ b/lib/runtime/mock_memory_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.0. DO NOT EDIT. +// Code generated by mockery v2.10.4. DO NOT EDIT. package runtime diff --git a/lib/runtime/mocks/instance.go b/lib/runtime/mocks/instance.go index 01067cae59..9188ba2349 100644 --- a/lib/runtime/mocks/instance.go +++ b/lib/runtime/mocks/instance.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.0. DO NOT EDIT. +// Code generated by mockery v2.10.4. DO NOT EDIT. package mocks diff --git a/lib/runtime/mocks/transaction_state.go b/lib/runtime/mocks/transaction_state.go index f6e3c1d492..952ecfad4e 100644 --- a/lib/runtime/mocks/transaction_state.go +++ b/lib/runtime/mocks/transaction_state.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.0. DO NOT EDIT. +// Code generated by mockery v2.10.4. DO NOT EDIT. package mocks diff --git a/lib/runtime/mocks/version.go b/lib/runtime/mocks/version.go index 9844101e0d..b389875077 100644 --- a/lib/runtime/mocks/version.go +++ b/lib/runtime/mocks/version.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.0. DO NOT EDIT. +// Code generated by mockery v2.10.4. DO NOT EDIT. package mocks diff --git a/lib/services/mocks/service.go b/lib/services/mocks/service.go index f57699b99a..98752d2740 100644 --- a/lib/services/mocks/service.go +++ b/lib/services/mocks/service.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.0. DO NOT EDIT. +// Code generated by mockery v2.10.4. DO NOT EDIT. package mocks From 44c3892331ee4bdf5bead4cbdfea66725ece2aa2 Mon Sep 17 00:00:00 2001 From: EclesioMeloJunior Date: Thu, 7 Apr 2022 09:45:26 -0400 Subject: [PATCH 03/21] chore: remove duplicated code with generics --- Makefile | 1 + dot/state/epoch_test.go | 54 ++++++++++++++++++----------------------- 2 files changed, 25 insertions(+), 30 deletions(-) diff --git a/Makefile b/Makefile index fc3c79a99a..40efe95b21 100644 --- a/Makefile +++ b/Makefile @@ -25,6 +25,7 @@ lint: clean: rm -fr ./bin + proto: go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28 protoc -I=./dot/network/proto --go_out=./dot/network/proto dot/network/proto/api.v1.proto diff --git a/dot/state/epoch_test.go b/dot/state/epoch_test.go index 1071f2a3ab..acdd4d2dd5 100644 --- a/dot/state/epoch_test.go +++ b/dot/state/epoch_test.go @@ -226,10 +226,10 @@ func TestEpochState_GetEpochFromTime(t *testing.T) { require.Equal(t, uint64(99), epoch) } -type inMemoryNextEpochData struct { - epoch uint64 - hashes []common.Hash - nextEpochDatas []types.NextEpochData +type inMemoryBABEData[T any] struct { + epoch uint64 + hashes []common.Hash + Data []T } func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { @@ -254,7 +254,7 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { tests := map[string]struct { finalizeHash common.Hash - inMemoryEpoch []inMemoryNextEpochData + inMemoryEpoch []inMemoryBABEData[types.NextEpochData] finalizeEpoch uint64 expectErr error shouldRemainInMemory int @@ -263,7 +263,7 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { shouldRemainInMemory: 1, finalizeEpoch: 2, finalizeHash: common.MustHexToHash("0x68a27df5a52ff2251df2cc8368f7dcefb305a13bb3d89b65c8fb070f23877f2c"), - inMemoryEpoch: []inMemoryNextEpochData{ + inMemoryEpoch: []inMemoryBABEData[types.NextEpochData]{ { epoch: 1, hashes: []common.Hash{ @@ -271,7 +271,7 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { common.MustHexToHash("0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3"), common.MustHexToHash("0xc0096358534ec8d21d01d34b836eed476a1c343f8724fa2153dc0725ad797a90"), }, - nextEpochDatas: []types.NextEpochData{ + Data: []types.NextEpochData{ { Authorities: authorities[:3], Randomness: [32]byte{1}, @@ -293,7 +293,7 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { common.MustHexToHash("0xd380bee22de487a707cbda65dd9d4e2188f736908c42cf390c8919d4f7fc547c"), common.MustHexToHash("0x68a27df5a52ff2251df2cc8368f7dcefb305a13bb3d89b65c8fb070f23877f2c"), }, - nextEpochDatas: []types.NextEpochData{ + Data: []types.NextEpochData{ { Authorities: authorities[6:], Randomness: [32]byte{1}, @@ -313,7 +313,7 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { hashes: []common.Hash{ common.MustHexToHash("0xab5c9230a7dde8bb90a6728ba4a0165423294dac14336b1443f865b796ff682c"), }, - nextEpochDatas: []types.NextEpochData{ + Data: []types.NextEpochData{ { Authorities: authorities[6:], Randomness: [32]byte{1}, @@ -327,7 +327,7 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { finalizeEpoch: 1, finalizeHash: common.Hash{}, // finalize when the hash does not exists expectErr: errHashNotPersisted, - inMemoryEpoch: []inMemoryNextEpochData{ + inMemoryEpoch: []inMemoryBABEData[types.NextEpochData]{ { epoch: 1, hashes: []common.Hash{ @@ -335,7 +335,7 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { common.MustHexToHash("0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3"), common.MustHexToHash("0xc0096358534ec8d21d01d34b836eed476a1c343f8724fa2153dc0725ad797a90"), }, - nextEpochDatas: []types.NextEpochData{ + Data: []types.NextEpochData{ { Authorities: authorities[:3], Randomness: [32]byte{1}, @@ -357,7 +357,7 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { finalizeEpoch: 3, // try to finalize a epoch that does not exists finalizeHash: common.Hash{}, expectErr: ErrEpochNotInMemory, - inMemoryEpoch: []inMemoryNextEpochData{ + inMemoryEpoch: []inMemoryBABEData[types.NextEpochData]{ { epoch: 1, hashes: []common.Hash{ @@ -365,7 +365,7 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { common.MustHexToHash("0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3"), common.MustHexToHash("0xc0096358534ec8d21d01d34b836eed476a1c343f8724fa2153dc0725ad797a90"), }, - nextEpochDatas: []types.NextEpochData{ + Data: []types.NextEpochData{ { Authorities: authorities[:3], Randomness: [32]byte{1}, @@ -390,7 +390,7 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { for _, e := range tt.inMemoryEpoch { for i, hash := range e.hashes { - epochState.StoreBABENextEpochData(e.epoch, hash, e.nextEpochDatas[i]) + epochState.StoreBABENextEpochData(e.epoch, hash, e.Data[i]) } } @@ -434,16 +434,10 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { } } -type inMemoryNextConfighData struct { - epoch uint64 - hashes []common.Hash - nextConfigDatas []types.NextConfigData -} - func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { tests := map[string]struct { finalizeHash common.Hash - inMemoryEpoch []inMemoryNextConfighData + inMemoryEpoch []inMemoryBABEData[types.NextConfigData] finalizeEpoch uint64 expectErr error shouldRemainInMemory int @@ -452,7 +446,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { shouldRemainInMemory: 1, finalizeEpoch: 2, finalizeHash: common.MustHexToHash("0x68a27df5a52ff2251df2cc8368f7dcefb305a13bb3d89b65c8fb070f23877f2c"), - inMemoryEpoch: []inMemoryNextConfighData{ + inMemoryEpoch: []inMemoryBABEData[types.NextConfigData]{ { epoch: 1, hashes: []common.Hash{ @@ -460,7 +454,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { common.MustHexToHash("0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3"), common.MustHexToHash("0xc0096358534ec8d21d01d34b836eed476a1c343f8724fa2153dc0725ad797a90"), }, - nextConfigDatas: []types.NextConfigData{ + Data: []types.NextConfigData{ { C1: 1, C2: 2, @@ -485,7 +479,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { common.MustHexToHash("0xd380bee22de487a707cbda65dd9d4e2188f736908c42cf390c8919d4f7fc547c"), common.MustHexToHash("0x68a27df5a52ff2251df2cc8368f7dcefb305a13bb3d89b65c8fb070f23877f2c"), }, - nextConfigDatas: []types.NextConfigData{ + Data: []types.NextConfigData{ { C1: 1, C2: 2, @@ -508,7 +502,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { hashes: []common.Hash{ common.MustHexToHash("0xab5c9230a7dde8bb90a6728ba4a0165423294dac14336b1443f865b796ff682c"), }, - nextConfigDatas: []types.NextConfigData{ + Data: []types.NextConfigData{ { C1: 1, C2: 2, @@ -523,7 +517,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { finalizeEpoch: 1, finalizeHash: common.Hash{}, // finalize when the hash does not exists expectErr: errHashNotPersisted, - inMemoryEpoch: []inMemoryNextConfighData{ + inMemoryEpoch: []inMemoryBABEData[types.NextConfigData]{ { epoch: 1, hashes: []common.Hash{ @@ -531,7 +525,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { common.MustHexToHash("0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3"), common.MustHexToHash("0xc0096358534ec8d21d01d34b836eed476a1c343f8724fa2153dc0725ad797a90"), }, - nextConfigDatas: []types.NextConfigData{ + Data: []types.NextConfigData{ { C1: 1, C2: 2, @@ -556,7 +550,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { finalizeEpoch: 3, // try to finalize a epoch that does not exists finalizeHash: common.Hash{}, expectErr: ErrEpochNotInMemory, - inMemoryEpoch: []inMemoryNextConfighData{ + inMemoryEpoch: []inMemoryBABEData[types.NextConfigData]{ { epoch: 1, hashes: []common.Hash{ @@ -564,7 +558,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { common.MustHexToHash("0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3"), common.MustHexToHash("0xc0096358534ec8d21d01d34b836eed476a1c343f8724fa2153dc0725ad797a90"), }, - nextConfigDatas: []types.NextConfigData{ + Data: []types.NextConfigData{ { C1: 1, C2: 2, @@ -592,7 +586,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { for _, e := range tt.inMemoryEpoch { for i, hash := range e.hashes { - epochState.StoreBABENextConfigData(e.epoch, hash, e.nextConfigDatas[i]) + epochState.StoreBABENextConfigData(e.epoch, hash, e.Data[i]) } } From d69c694e1bdfe76047272cd3b399cf267108a111 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ecl=C3=A9sio=20Junior?= Date: Thu, 7 Apr 2022 14:34:17 -0400 Subject: [PATCH 04/21] chore: improve test comment Co-authored-by: Quentin McGaw --- dot/state/epoch_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dot/state/epoch_test.go b/dot/state/epoch_test.go index acdd4d2dd5..f725b1e9fe 100644 --- a/dot/state/epoch_test.go +++ b/dot/state/epoch_test.go @@ -597,7 +597,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { err := epochState.blockState.db.Put(headerKey(tt.finalizeHash), []byte{}) require.NoError(t, err) - // before finalize next config data this epoch should not be defined + // before finalize next config data for this epoch should not be defined definedEpochData, definedConfigData, err := epochState.AlreadyDefined(tt.finalizeEpoch) require.NoError(t, err) require.False(t, definedEpochData) From 27bd2e815a2b2e6d68143fc037e3585e266b746b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ecl=C3=A9sio=20Junior?= Date: Thu, 7 Apr 2022 14:34:24 -0400 Subject: [PATCH 05/21] chore: improve test comment Co-authored-by: Quentin McGaw --- dot/state/epoch_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dot/state/epoch_test.go b/dot/state/epoch_test.go index f725b1e9fe..5ac2af93ad 100644 --- a/dot/state/epoch_test.go +++ b/dot/state/epoch_test.go @@ -609,7 +609,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { } else { require.NoError(t, err) - // after finalize next config data this epoch should be defined + // after finalize next config data for this epoch should be defined definedEpochData, definedConfigData, err = epochState.AlreadyDefined(tt.finalizeEpoch) require.NoError(t, err) require.False(t, definedEpochData) From bbddab4e7513bc8694a6f3054937e4bc5b3539fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ecl=C3=A9sio=20Junior?= Date: Thu, 7 Apr 2022 14:35:47 -0400 Subject: [PATCH 06/21] chore: improve test comment Co-authored-by: Quentin McGaw --- dot/state/epoch_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dot/state/epoch_test.go b/dot/state/epoch_test.go index 5ac2af93ad..519ee62a67 100644 --- a/dot/state/epoch_test.go +++ b/dot/state/epoch_test.go @@ -413,7 +413,7 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { } else { require.NoError(t, err) - // after finalize next epoch data this epoch should not defined + // after finalize next epoch data for this epoch should not defined definedEpochData, definedConfigData, err := epochState.AlreadyDefined(tt.finalizeEpoch) require.NoError(t, err) require.True(t, definedEpochData) From 71309cfce48f1b71756b20277893c037eea6e649 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ecl=C3=A9sio=20Junior?= Date: Thu, 7 Apr 2022 14:36:02 -0400 Subject: [PATCH 07/21] chore: improve test comment Co-authored-by: Quentin McGaw --- dot/state/epoch_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dot/state/epoch_test.go b/dot/state/epoch_test.go index 519ee62a67..655a7d8fd0 100644 --- a/dot/state/epoch_test.go +++ b/dot/state/epoch_test.go @@ -401,7 +401,7 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { err := epochState.blockState.db.Put(headerKey(tt.finalizeHash), []byte{}) require.NoError(t, err) - // before finalize next epoch data this epoch should not be defined + // before finalize next epoch data for this epoch should not be defined definedEpochData, definedConfigData, err := epochState.AlreadyDefined(tt.finalizeEpoch) require.NoError(t, err) require.False(t, definedEpochData) From 58edb997550e8abfad71c3218a596cae1a40cc57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ecl=C3=A9sio=20Junior?= Date: Thu, 7 Apr 2022 14:37:17 -0400 Subject: [PATCH 08/21] chore: remove the go:generate from the `EpochState`'s comment Co-authored-by: Quentin McGaw --- dot/digest/interface.go | 1 + 1 file changed, 1 insertion(+) diff --git a/dot/digest/interface.go b/dot/digest/interface.go index b4899396c2..1ef2b561a8 100644 --- a/dot/digest/interface.go +++ b/dot/digest/interface.go @@ -19,6 +19,7 @@ type BlockState interface { } //go:generate mockgen -destination=mock_epoch_state_test.go -package $GOPACKAGE . EpochState + // EpochState is the interface for state.EpochState type EpochState interface { GetEpochForBlock(header *types.Header) (uint64, error) From 47c8836f265c970fbaa2bf3b7c64523cdb638f92 Mon Sep 17 00:00:00 2001 From: EclesioMeloJunior Date: Fri, 8 Apr 2022 09:50:49 -0400 Subject: [PATCH 09/21] chore: use functions to define mocks in the test cases --- dot/digest/digest_test.go | 102 +++++++++++++++++++++++++------------- 1 file changed, 68 insertions(+), 34 deletions(-) diff --git a/dot/digest/digest_test.go b/dot/digest/digest_test.go index 53bd99b4c0..6e1800e3c7 100644 --- a/dot/digest/digest_test.go +++ b/dot/digest/digest_test.go @@ -518,27 +518,83 @@ func TestHandler_HandleNextConfigData(t *testing.T) { } func Test_persistBABEDigestsForNextEpoch(t *testing.T) { + const currentEpoch uint64 = 1 + type testStruct struct { - defineNextEpochData bool - defineNextConfigData bool - expectedErr error - alreadyDefinedFuncThrowError bool + expectedErr error + epochState func(ctrl *gomock.Controller) EpochState } tests := map[string]testStruct{ "epoch_data_already_defined": { - defineNextEpochData: true, + epochState: func(ctrl *gomock.Controller) EpochState { + epochStateMock := NewMockEpochState(ctrl) + + epochStateMock.EXPECT().GetEpochForBlock(&types.Header{}). + Return(currentEpoch, nil) + + epochStateMock.EXPECT().AlreadyDefined(currentEpoch+1). + Return(true, false, nil) + + epochStateMock.EXPECT().FinalizeBABENextConfigData(currentEpoch + 1) + return epochStateMock + }, }, "config_data_already_defined": { - defineNextConfigData: true, + epochState: func(ctrl *gomock.Controller) EpochState { + epochStateMock := NewMockEpochState(ctrl) + + epochStateMock.EXPECT().GetEpochForBlock(&types.Header{}). + Return(currentEpoch, nil) + + epochStateMock.EXPECT().AlreadyDefined(currentEpoch+1). + Return(false, true, nil) + + epochStateMock.EXPECT().FinalizeBABENextEpochData(currentEpoch + 1) + return epochStateMock + }, }, "both_already_defined": { - defineNextEpochData: true, - defineNextConfigData: true, + epochState: func(ctrl *gomock.Controller) EpochState { + epochStateMock := NewMockEpochState(ctrl) + + epochStateMock.EXPECT().GetEpochForBlock(&types.Header{}). + Return(currentEpoch, nil) + + epochStateMock.EXPECT().AlreadyDefined(currentEpoch+1). + Return(true, true, nil) + + return epochStateMock + }, + }, + "both_not_defined": { + epochState: func(ctrl *gomock.Controller) EpochState { + epochStateMock := NewMockEpochState(ctrl) + + epochStateMock.EXPECT().GetEpochForBlock(&types.Header{}). + Return(currentEpoch, nil) + + epochStateMock.EXPECT().AlreadyDefined(currentEpoch+1). + Return(false, false, nil) + + epochStateMock.EXPECT().FinalizeBABENextEpochData(currentEpoch + 1) + epochStateMock.EXPECT().FinalizeBABENextConfigData(currentEpoch + 1) + + return epochStateMock + }, }, - "both_not_defined": {}, "error_while_checking_already_defined": { - alreadyDefinedFuncThrowError: true, + epochState: func(ctrl *gomock.Controller) EpochState { + epochStateMock := NewMockEpochState(ctrl) + + epochStateMock.EXPECT().GetEpochForBlock(&types.Header{}). + Return(currentEpoch, nil) + + epochStateMock.EXPECT().AlreadyDefined(currentEpoch+1). + Return(false, false, errors.New("problems while calling function")) + + return epochStateMock + }, expectedErr: errors.New( "cannot check if next epoch is already defined: problems while calling function"), }, @@ -547,36 +603,14 @@ func Test_persistBABEDigestsForNextEpoch(t *testing.T) { for testName, tt := range tests { tt := tt t.Run(testName, func(t *testing.T) { - testFinalizedHeader := &types.Header{} - ctrl := gomock.NewController(t) - epochStateMock := NewMockEpochState(ctrl) - - var currentEpoch uint64 = 1 - epochStateMock.EXPECT().GetEpochForBlock(testFinalizedHeader). - Return(currentEpoch, nil) - - if tt.alreadyDefinedFuncThrowError { - epochStateMock.EXPECT().AlreadyDefined(currentEpoch+1). - Return(false, false, errors.New("problems while calling function")) - } else { - epochStateMock.EXPECT().AlreadyDefined(currentEpoch+1). - Return(tt.defineNextEpochData, tt.defineNextConfigData, nil) - - if !tt.defineNextEpochData { - epochStateMock.EXPECT().FinalizeBABENextEpochData(currentEpoch + 1) - } - - if !tt.defineNextConfigData { - epochStateMock.EXPECT().FinalizeBABENextConfigData(currentEpoch + 1) - } - } + epochStateMock := tt.epochState(ctrl) digestHandler := &Handler{ epochState: epochStateMock, } - err := digestHandler.persistBABEDigestsForNextEpoch(testFinalizedHeader) + err := digestHandler.persistBABEDigestsForNextEpoch(&types.Header{}) if tt.expectedErr != nil { require.Error(t, err) require.EqualError(t, err, tt.expectedErr.Error()) From 931e8a0015203a04ccfa2d449dec64e20d5a82d6 Mon Sep 17 00:00:00 2001 From: EclesioMeloJunior Date: Tue, 12 Apr 2022 11:28:45 -0400 Subject: [PATCH 10/21] chore: split into two different functions and check for existence before persit --- dot/digest/digest.go | 45 ++----- dot/digest/digest_test.go | 105 ---------------- dot/digest/interface.go | 5 +- dot/digest/mock_epoch_state_test.go | 20 +-- dot/state/epoch.go | 79 +++++++----- dot/state/epoch_test.go | 183 +++++++++++++--------------- 6 files changed, 140 insertions(+), 297 deletions(-) diff --git a/dot/digest/digest.go b/dot/digest/digest.go index 6bca24a510..631be163f8 100644 --- a/dot/digest/digest.go +++ b/dot/digest/digest.go @@ -8,7 +8,6 @@ import ( "errors" "fmt" - "github.com/ChainSafe/gossamer/dot/state" "github.com/ChainSafe/gossamer/dot/types" "github.com/ChainSafe/gossamer/internal/log" "github.com/ChainSafe/gossamer/lib/services" @@ -240,9 +239,14 @@ func (h *Handler) handleBlockFinalisation(ctx context.Context) { continue } - err := h.persistBABEDigestsForNextEpoch(&info.Header) + err := h.epochState.FinalizeBABENextEpochData(&info.Header) if err != nil { - h.logger.Errorf("failed to store babe next epoch digest: %s", err) + h.logger.Errorf("failed to persist babe next epoch data: %s", err) + } + + err = h.epochState.FinalizeBABENextConfigData(&info.Header) + if err != nil { + h.logger.Errorf("failed to persist babe next epoch config: %s", err) } err = h.handleGrandpaChangesOnFinalization(info.Header.Number) @@ -255,41 +259,6 @@ func (h *Handler) handleBlockFinalisation(ctx context.Context) { } } -// persistBABEDigestsForNextEpoch is called only when a block is finalised -// and defines the correct next epoch data and next config data. -func (h *Handler) persistBABEDigestsForNextEpoch(finalizedHeader *types.Header) error { - currEpoch, err := h.epochState.GetEpochForBlock(finalizedHeader) - if err != nil { - return fmt.Errorf("cannot get epoch for block %d (%s): %w", - finalizedHeader.Number, finalizedHeader.Hash(), err) - } - - nextEpoch := currEpoch + 1 - - appliedEpochData, appliedConfigData, err := h.epochState.AlreadyDefined(nextEpoch) - if err != nil { - return fmt.Errorf("cannot check if next epoch is already defined: %w", err) - } - - if !appliedEpochData { - err = h.epochState.FinalizeBABENextEpochData(nextEpoch) - if err != nil && !errors.Is(err, state.ErrEpochNotInMemory) { - return fmt.Errorf("cannot finalize babe next epoch data for block number %d (%s): %w", - finalizedHeader.Number, finalizedHeader.Hash(), err) - } - } - - if !appliedConfigData { - err = h.epochState.FinalizeBABENextConfigData(nextEpoch) - if err != nil && !errors.Is(err, state.ErrEpochNotInMemory) { - return fmt.Errorf("cannot finalize babe next config data for block number %d (%s): %w", - finalizedHeader.Number, finalizedHeader.Hash(), err) - } - } - - return nil -} - func (h *Handler) handleGrandpaChangesOnImport(num uint) error { resume := h.grandpaResume if resume != nil && num >= resume.atBlock { diff --git a/dot/digest/digest_test.go b/dot/digest/digest_test.go index 6e1800e3c7..dcb0d8633b 100644 --- a/dot/digest/digest_test.go +++ b/dot/digest/digest_test.go @@ -4,7 +4,6 @@ package digest import ( - "errors" "testing" "time" @@ -516,107 +515,3 @@ func TestHandler_HandleNextConfigData(t *testing.T) { require.NoError(t, err) require.Equal(t, act.ToConfigData(), stored) } - -func Test_persistBABEDigestsForNextEpoch(t *testing.T) { - const currentEpoch uint64 = 1 - - type testStruct struct { - expectedErr error - epochState func(ctrl *gomock.Controller) EpochState - } - - tests := map[string]testStruct{ - "epoch_data_already_defined": { - epochState: func(ctrl *gomock.Controller) EpochState { - epochStateMock := NewMockEpochState(ctrl) - - epochStateMock.EXPECT().GetEpochForBlock(&types.Header{}). - Return(currentEpoch, nil) - - epochStateMock.EXPECT().AlreadyDefined(currentEpoch+1). - Return(true, false, nil) - - epochStateMock.EXPECT().FinalizeBABENextConfigData(currentEpoch + 1) - return epochStateMock - }, - }, - "config_data_already_defined": { - epochState: func(ctrl *gomock.Controller) EpochState { - epochStateMock := NewMockEpochState(ctrl) - - epochStateMock.EXPECT().GetEpochForBlock(&types.Header{}). - Return(currentEpoch, nil) - - epochStateMock.EXPECT().AlreadyDefined(currentEpoch+1). - Return(false, true, nil) - - epochStateMock.EXPECT().FinalizeBABENextEpochData(currentEpoch + 1) - return epochStateMock - }, - }, - "both_already_defined": { - epochState: func(ctrl *gomock.Controller) EpochState { - epochStateMock := NewMockEpochState(ctrl) - - epochStateMock.EXPECT().GetEpochForBlock(&types.Header{}). - Return(currentEpoch, nil) - - epochStateMock.EXPECT().AlreadyDefined(currentEpoch+1). - Return(true, true, nil) - - return epochStateMock - }, - }, - "both_not_defined": { - epochState: func(ctrl *gomock.Controller) EpochState { - epochStateMock := NewMockEpochState(ctrl) - - epochStateMock.EXPECT().GetEpochForBlock(&types.Header{}). - Return(currentEpoch, nil) - - epochStateMock.EXPECT().AlreadyDefined(currentEpoch+1). - Return(false, false, nil) - - epochStateMock.EXPECT().FinalizeBABENextEpochData(currentEpoch + 1) - epochStateMock.EXPECT().FinalizeBABENextConfigData(currentEpoch + 1) - - return epochStateMock - }, - }, - "error_while_checking_already_defined": { - epochState: func(ctrl *gomock.Controller) EpochState { - epochStateMock := NewMockEpochState(ctrl) - - epochStateMock.EXPECT().GetEpochForBlock(&types.Header{}). - Return(currentEpoch, nil) - - epochStateMock.EXPECT().AlreadyDefined(currentEpoch+1). - Return(false, false, errors.New("problems while calling function")) - - return epochStateMock - }, - expectedErr: errors.New( - "cannot check if next epoch is already defined: problems while calling function"), - }, - } - - for testName, tt := range tests { - tt := tt - t.Run(testName, func(t *testing.T) { - ctrl := gomock.NewController(t) - epochStateMock := tt.epochState(ctrl) - - digestHandler := &Handler{ - epochState: epochStateMock, - } - - err := digestHandler.persistBABEDigestsForNextEpoch(&types.Header{}) - if tt.expectedErr != nil { - require.Error(t, err) - require.EqualError(t, err, tt.expectedErr.Error()) - } else { - require.NoError(t, err) - } - }) - } -} diff --git a/dot/digest/interface.go b/dot/digest/interface.go index 1ef2b561a8..268ae36c7b 100644 --- a/dot/digest/interface.go +++ b/dot/digest/interface.go @@ -28,9 +28,8 @@ type EpochState interface { StoreBABENextEpochData(epoch uint64, hash common.Hash, nextEpochData types.NextEpochData) StoreBABENextConfigData(epoch uint64, hash common.Hash, nextEpochData types.NextConfigData) - FinalizeBABENextEpochData(epoch uint64) error - FinalizeBABENextConfigData(epoch uint64) error - AlreadyDefined(epoch uint64) (epochData bool, configData bool, err error) + FinalizeBABENextEpochData(finalizedHeader *types.Header) error + FinalizeBABENextConfigData(finalizedHeader *types.Header) error } // GrandpaState is the interface for the state.GrandpaState diff --git a/dot/digest/mock_epoch_state_test.go b/dot/digest/mock_epoch_state_test.go index 9b2ea3c305..943e4cad7d 100644 --- a/dot/digest/mock_epoch_state_test.go +++ b/dot/digest/mock_epoch_state_test.go @@ -35,24 +35,8 @@ func (m *MockEpochState) EXPECT() *MockEpochStateMockRecorder { return m.recorder } -// AlreadyDefined mocks base method. -func (m *MockEpochState) AlreadyDefined(arg0 uint64) (bool, bool, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "AlreadyDefined", arg0) - ret0, _ := ret[0].(bool) - ret1, _ := ret[1].(bool) - ret2, _ := ret[2].(error) - return ret0, ret1, ret2 -} - -// AlreadyDefined indicates an expected call of AlreadyDefined. -func (mr *MockEpochStateMockRecorder) AlreadyDefined(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AlreadyDefined", reflect.TypeOf((*MockEpochState)(nil).AlreadyDefined), arg0) -} - // FinalizeBABENextConfigData mocks base method. -func (m *MockEpochState) FinalizeBABENextConfigData(arg0 uint64) error { +func (m *MockEpochState) FinalizeBABENextConfigData(arg0 *types.Header) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FinalizeBABENextConfigData", arg0) ret0, _ := ret[0].(error) @@ -66,7 +50,7 @@ func (mr *MockEpochStateMockRecorder) FinalizeBABENextConfigData(arg0 interface{ } // FinalizeBABENextEpochData mocks base method. -func (m *MockEpochState) FinalizeBABENextEpochData(arg0 uint64) error { +func (m *MockEpochState) FinalizeBABENextEpochData(arg0 *types.Header) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FinalizeBABENextEpochData", arg0) ret0, _ := ret[0].(error) diff --git a/dot/state/epoch.go b/dot/state/epoch.go index 1e97b78e97..0097a9af5a 100644 --- a/dot/state/epoch.go +++ b/dot/state/epoch.go @@ -512,30 +512,6 @@ func (s *EpochState) SkipVerify(header *types.Header) (bool, error) { return false, nil } -// AlreadyDefined will true for each returned value if it is already defined in the database for the given epoch -func (s *EpochState) AlreadyDefined(epoch uint64) (epochData bool, configData bool, err error) { - keys := [...][]byte{epochDataKey(epoch), configDataKey(epoch)} - applied := [...]bool{false, false} - - for idx, key := range keys { - enc, err := s.db.Get(key) - - if errors.Is(err, chaindb.ErrKeyNotFound) { - continue - } else if err != nil { - return false, false, fmt.Errorf("cannot retrieve %s from database: %w", string(key), err) - } - - if len(enc) == 0 { - continue - } - - applied[idx] = true - } - - return applied[0], applied[1], nil -} - // StoreBABENextEpochData stores the types.NextEpochData under epoch and hash keys func (s *EpochState) StoreBABENextEpochData(epoch uint64, hash common.Hash, nextEpochData types.NextEpochData) { s.nextEpochDataLock.Lock() @@ -564,11 +540,29 @@ func (s *EpochState) StoreBABENextConfigData(epoch uint64, hash common.Hash, nex // getting the set of hashes from the received epoch and for each hash // check if the header is in the database then it's been finalized and // thus we can also set the corresponding EpochData in the database -func (s *EpochState) FinalizeBABENextEpochData(epoch uint64) error { +func (s *EpochState) FinalizeBABENextEpochData(finalizedHeader *types.Header) error { s.nextEpochDataLock.Lock() defer s.nextEpochDataLock.Unlock() - finalizedNextEpochData, err := lookupForNextEpochPersistedHash(s.nextEpochData, s, epoch) + finalizedBlockEpoch, err := s.GetEpochForBlock(finalizedHeader) + if err != nil { + return fmt.Errorf("cannot get epoch for block %d (%s): %w", + finalizedHeader.Number, finalizedHeader.Hash(), err) + } + + nextEpoch := finalizedBlockEpoch + 1 + + epochInDatabase, err := s.getEpochDataInDatabase(nextEpoch) + if err != nil && !errors.Is(err, chaindb.ErrKeyNotFound) { + return fmt.Errorf("cannot check if next epoch data is already defined for epoch %d: %w", nextEpoch, err) + } + + // config already defined we don't need to lookup in the map + if epochInDatabase != nil { + return nil + } + + finalizedNextEpochData, err := lookupForNextEpochPersistedHash(s.nextEpochData, s, nextEpoch) if err != nil { return fmt.Errorf("cannot find next epoch data: %w", err) } @@ -578,14 +572,14 @@ func (s *EpochState) FinalizeBABENextEpochData(epoch uint64) error { return fmt.Errorf("cannot transform epoch data: %w", err) } - err = s.SetEpochData(epoch, ed) + err = s.SetEpochData(nextEpoch, ed) if err != nil { return fmt.Errorf("cannot set epoch data: %w", err) } // remove previous epochs from the memory for e := range s.nextEpochData { - if e <= epoch { + if e <= nextEpoch { delete(s.nextEpochData, e) } } @@ -597,24 +591,45 @@ func (s *EpochState) FinalizeBABENextEpochData(epoch uint64) error { // getting the set of hashes from the received epoch and for each hash // check if the header is in the database then it's been finalized and // thus we can also set the corresponding NextConfigData in the database -func (s *EpochState) FinalizeBABENextConfigData(epoch uint64) error { +func (s *EpochState) FinalizeBABENextConfigData(finalizedHeader *types.Header) error { s.nextConfigDataLock.Lock() defer s.nextConfigDataLock.Unlock() - finalizedNextConfigData, err := lookupForNextEpochPersistedHash(s.nextConfigData, s, epoch) + finalizedBlockEpoch, err := s.GetEpochForBlock(finalizedHeader) if err != nil { + return fmt.Errorf("cannot get epoch for block %d (%s): %w", + finalizedHeader.Number, finalizedHeader.Hash(), err) + } + + nextEpoch := finalizedBlockEpoch + 1 + + configInDatabase, err := s.getConfigDataInDatabase(nextEpoch) + if err != nil && !errors.Is(err, chaindb.ErrKeyNotFound) { + return fmt.Errorf("cannot check if next epoch config is already defined for epoch %d: %w", nextEpoch, err) + } + + // config already defined we don't need to lookup in the map + if configInDatabase != nil { + return nil + } + + // not every epoch will have `ConfigData` + finalizedNextConfigData, err := lookupForNextEpochPersistedHash(s.nextConfigData, s, nextEpoch) + if errors.Is(err, ErrEpochNotInMemory) { + return nil + } else if err != nil { return fmt.Errorf("cannot find next config data: %w", err) } cd := finalizedNextConfigData.ToConfigData() - err = s.SetConfigData(epoch, cd) + err = s.SetConfigData(nextEpoch, cd) if err != nil { return fmt.Errorf("cannot set config data: %w", err) } // remove previous epochs from the memory for e := range s.nextConfigData { - if e <= epoch { + if e <= nextEpoch { delete(s.nextConfigData, e) } } diff --git a/dot/state/epoch_test.go b/dot/state/epoch_test.go index 655a7d8fd0..112e347260 100644 --- a/dot/state/epoch_test.go +++ b/dot/state/epoch_test.go @@ -252,17 +252,40 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { } } + babePrimaryPreDigest := types.BabePrimaryPreDigest{ + SlotNumber: 301, // block on epoch 1 with digest for epoch 2 + VRFOutput: [32]byte{}, + VRFProof: [64]byte{}, + } + + preRuntimeDigest, err := babePrimaryPreDigest.ToPreRuntimeDigest() + require.NoError(t, err) + + digest := scale.NewVaryingDataTypeSlice(scale.MustNewVaryingDataType( + types.PreRuntimeDigest{})) + + require.NoError(t, digest.Add(*preRuntimeDigest)) + + // a random finalized header for testing purposes + finalizedHeader := &types.Header{ + ParentHash: common.Hash{}, + Number: 1, + Digest: digest, + } + + finalizedHeaderHash := finalizedHeader.Hash() + tests := map[string]struct { - finalizeHash common.Hash + finalizedHeader *types.Header inMemoryEpoch []inMemoryBABEData[types.NextEpochData] finalizeEpoch uint64 expectErr error shouldRemainInMemory int }{ - "store_and_finalize_successfully": { + "store_and_finalize_succesfully": { shouldRemainInMemory: 1, finalizeEpoch: 2, - finalizeHash: common.MustHexToHash("0x68a27df5a52ff2251df2cc8368f7dcefb305a13bb3d89b65c8fb070f23877f2c"), + finalizedHeader: finalizedHeader, inMemoryEpoch: []inMemoryBABEData[types.NextEpochData]{ { epoch: 1, @@ -291,7 +314,7 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { hashes: []common.Hash{ common.MustHexToHash("0x5b940c7fc0a1c5a58e4d80c5091dd003303b8f18e90a989f010c1be6f392bed1"), common.MustHexToHash("0xd380bee22de487a707cbda65dd9d4e2188f736908c42cf390c8919d4f7fc547c"), - common.MustHexToHash("0x68a27df5a52ff2251df2cc8368f7dcefb305a13bb3d89b65c8fb070f23877f2c"), + finalizedHeaderHash, }, Data: []types.NextEpochData{ { @@ -324,12 +347,13 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { }, "cannot_finalize_hash_not_stored": { shouldRemainInMemory: 1, - finalizeEpoch: 1, - finalizeHash: common.Hash{}, // finalize when the hash does not exists - expectErr: errHashNotPersisted, + finalizeEpoch: 2, + // this header hash is not in the database + finalizedHeader: finalizedHeader, + expectErr: errHashNotPersisted, inMemoryEpoch: []inMemoryBABEData[types.NextEpochData]{ { - epoch: 1, + epoch: 2, hashes: []common.Hash{ common.MustHexToHash("0x9da3ce2785da743bfbc13449db7dcb7a69c07ca914276d839abe7bedc6ac8fed"), common.MustHexToHash("0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3"), @@ -353,34 +377,11 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { }, }, "cannot_finalize_in_memory_epoch_not_found": { - shouldRemainInMemory: 1, + shouldRemainInMemory: 0, finalizeEpoch: 3, // try to finalize a epoch that does not exists - finalizeHash: common.Hash{}, + finalizedHeader: finalizedHeader, expectErr: ErrEpochNotInMemory, - inMemoryEpoch: []inMemoryBABEData[types.NextEpochData]{ - { - epoch: 1, - hashes: []common.Hash{ - common.MustHexToHash("0x9da3ce2785da743bfbc13449db7dcb7a69c07ca914276d839abe7bedc6ac8fed"), - common.MustHexToHash("0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3"), - common.MustHexToHash("0xc0096358534ec8d21d01d34b836eed476a1c343f8724fa2153dc0725ad797a90"), - }, - Data: []types.NextEpochData{ - { - Authorities: authorities[:3], - Randomness: [32]byte{1}, - }, - { - Authorities: authorities[3:6], - Randomness: [32]byte{2}, - }, - { - Authorities: authorities[6:], - Randomness: [32]byte{3}, - }, - }, - }, - }, + inMemoryEpoch: []inMemoryBABEData[types.NextEpochData]{}, }, } @@ -396,29 +397,17 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { require.Len(t, epochState.nextEpochData, len(tt.inMemoryEpoch)) - expectedNextEpochData := epochState.nextEpochData[tt.finalizeEpoch][tt.finalizeHash] - - err := epochState.blockState.db.Put(headerKey(tt.finalizeHash), []byte{}) - require.NoError(t, err) + expectedNextEpochData := epochState.nextEpochData[tt.finalizeEpoch][tt.finalizedHeader.Hash()] - // before finalize next epoch data for this epoch should not be defined - definedEpochData, definedConfigData, err := epochState.AlreadyDefined(tt.finalizeEpoch) + err := epochState.blockState.db.Put(headerKey(tt.finalizedHeader.Hash()), []byte{}) require.NoError(t, err) - require.False(t, definedEpochData) - require.False(t, definedConfigData) - err = epochState.FinalizeBABENextEpochData(tt.finalizeEpoch) + err = epochState.FinalizeBABENextEpochData(tt.finalizedHeader) if tt.expectErr != nil { require.ErrorIs(t, err, tt.expectErr) } else { require.NoError(t, err) - // after finalize next epoch data for this epoch should not defined - definedEpochData, definedConfigData, err := epochState.AlreadyDefined(tt.finalizeEpoch) - require.NoError(t, err) - require.True(t, definedEpochData) - require.False(t, definedConfigData) - expected, err := expectedNextEpochData.ToEpochData() require.NoError(t, err) @@ -435,8 +424,31 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { } func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { + babePrimaryPreDigest := types.BabePrimaryPreDigest{ + SlotNumber: 301, // block on epoch 1 with changes to epoch 2 + VRFOutput: [32]byte{}, + VRFProof: [64]byte{}, + } + + preRuntimeDigest, err := babePrimaryPreDigest.ToPreRuntimeDigest() + require.NoError(t, err) + + digest := scale.NewVaryingDataTypeSlice(scale.MustNewVaryingDataType( + types.PreRuntimeDigest{})) + + require.NoError(t, digest.Add(*preRuntimeDigest)) + + // a random finalized header for testing purposes + finalizedHeader := &types.Header{ + ParentHash: common.Hash{}, + Number: 1, + Digest: digest, + } + + finalizedHeaderHash := finalizedHeader.Hash() + tests := map[string]struct { - finalizeHash common.Hash + finalizedHeader *types.Header inMemoryEpoch []inMemoryBABEData[types.NextConfigData] finalizeEpoch uint64 expectErr error @@ -445,7 +457,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { "store_and_finalize_successfully": { shouldRemainInMemory: 1, finalizeEpoch: 2, - finalizeHash: common.MustHexToHash("0x68a27df5a52ff2251df2cc8368f7dcefb305a13bb3d89b65c8fb070f23877f2c"), + finalizedHeader: finalizedHeader, inMemoryEpoch: []inMemoryBABEData[types.NextConfigData]{ { epoch: 1, @@ -477,7 +489,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { hashes: []common.Hash{ common.MustHexToHash("0x5b940c7fc0a1c5a58e4d80c5091dd003303b8f18e90a989f010c1be6f392bed1"), common.MustHexToHash("0xd380bee22de487a707cbda65dd9d4e2188f736908c42cf390c8919d4f7fc547c"), - common.MustHexToHash("0x68a27df5a52ff2251df2cc8368f7dcefb305a13bb3d89b65c8fb070f23877f2c"), + finalizedHeaderHash, }, Data: []types.NextConfigData{ { @@ -514,12 +526,12 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { }, "cannot_finalize_hash_doesnt_exists": { shouldRemainInMemory: 1, - finalizeEpoch: 1, - finalizeHash: common.Hash{}, // finalize when the hash does not exists + finalizeEpoch: 2, + finalizedHeader: finalizedHeader, // finalize when the hash does not exists expectErr: errHashNotPersisted, inMemoryEpoch: []inMemoryBABEData[types.NextConfigData]{ { - epoch: 1, + epoch: 2, hashes: []common.Hash{ common.MustHexToHash("0x9da3ce2785da743bfbc13449db7dcb7a69c07ca914276d839abe7bedc6ac8fed"), common.MustHexToHash("0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3"), @@ -545,38 +557,11 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { }, }, }, - "cannot_finalize_in_memory_epoch_not_found": { - shouldRemainInMemory: 1, - finalizeEpoch: 3, // try to finalize a epoch that does not exists - finalizeHash: common.Hash{}, - expectErr: ErrEpochNotInMemory, - inMemoryEpoch: []inMemoryBABEData[types.NextConfigData]{ - { - epoch: 1, - hashes: []common.Hash{ - common.MustHexToHash("0x9da3ce2785da743bfbc13449db7dcb7a69c07ca914276d839abe7bedc6ac8fed"), - common.MustHexToHash("0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3"), - common.MustHexToHash("0xc0096358534ec8d21d01d34b836eed476a1c343f8724fa2153dc0725ad797a90"), - }, - Data: []types.NextConfigData{ - { - C1: 1, - C2: 2, - SecondarySlots: 0, - }, - { - C1: 2, - C2: 3, - SecondarySlots: 1, - }, - { - C1: 3, - C2: 4, - SecondarySlots: 0, - }, - }, - }, - }, + "in_memory_config_not_found_shouldnt_return_error": { + shouldRemainInMemory: 0, + finalizeEpoch: 1, // try to finalize a epoch that does not exists + finalizedHeader: finalizedHeader, + inMemoryEpoch: []inMemoryBABEData[types.NextConfigData]{}, }, } @@ -592,29 +577,25 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { require.Len(t, epochState.nextConfigData, len(tt.inMemoryEpoch)) - expectedConfigData := epochState.nextConfigData[tt.finalizeEpoch][tt.finalizeHash] + // if there is no data in memory we try to finalize the net config data + // it should return nil since next epoch config data will not be in every epoch's first block + if len(tt.inMemoryEpoch) == 0 { + err = epochState.FinalizeBABENextConfigData(tt.finalizedHeader) + require.NoError(t, err) + return + } - err := epochState.blockState.db.Put(headerKey(tt.finalizeHash), []byte{}) - require.NoError(t, err) + expectedConfigData := epochState.nextConfigData[tt.finalizeEpoch][tt.finalizedHeader.Hash()] - // before finalize next config data for this epoch should not be defined - definedEpochData, definedConfigData, err := epochState.AlreadyDefined(tt.finalizeEpoch) + err := epochState.blockState.db.Put(headerKey(tt.finalizedHeader.Hash()), []byte{}) require.NoError(t, err) - require.False(t, definedEpochData) - require.False(t, definedConfigData) - err = epochState.FinalizeBABENextConfigData(tt.finalizeEpoch) + err = epochState.FinalizeBABENextConfigData(tt.finalizedHeader) if tt.expectErr != nil { require.ErrorIs(t, err, tt.expectErr) } else { require.NoError(t, err) - // after finalize next config data for this epoch should be defined - definedEpochData, definedConfigData, err = epochState.AlreadyDefined(tt.finalizeEpoch) - require.NoError(t, err) - require.False(t, definedEpochData) - require.True(t, definedConfigData) - gotConfigData, err := epochState.GetConfigData(tt.finalizeEpoch, nil) require.NoError(t, err) require.Equal(t, expectedConfigData.ToConfigData(), gotConfigData) From 73e3c330bb51c31296665bcce69b5fc3ade100a1 Mon Sep 17 00:00:00 2001 From: EclesioMeloJunior Date: Tue, 12 Apr 2022 11:35:39 -0400 Subject: [PATCH 11/21] chore: fix the ci lint warns --- dot/state/epoch_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dot/state/epoch_test.go b/dot/state/epoch_test.go index 112e347260..6953873f85 100644 --- a/dot/state/epoch_test.go +++ b/dot/state/epoch_test.go @@ -282,7 +282,7 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { expectErr error shouldRemainInMemory int }{ - "store_and_finalize_succesfully": { + "store_and_finalize_successfully": { shouldRemainInMemory: 1, finalizeEpoch: 2, finalizedHeader: finalizedHeader, From 38ddcaa0c36734a379365c1d47b12fe071397ec3 Mon Sep 17 00:00:00 2001 From: EclesioMeloJunior Date: Tue, 12 Apr 2022 16:59:44 -0400 Subject: [PATCH 12/21] chore: use a more descriptive name --- dot/state/epoch.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dot/state/epoch.go b/dot/state/epoch.go index 0097a9af5a..1d86a0ad53 100644 --- a/dot/state/epoch.go +++ b/dot/state/epoch.go @@ -562,7 +562,7 @@ func (s *EpochState) FinalizeBABENextEpochData(finalizedHeader *types.Header) er return nil } - finalizedNextEpochData, err := lookupForNextEpochPersistedHash(s.nextEpochData, s, nextEpoch) + finalizedNextEpochData, err := findFinalizedHeaderForEpoch(s.nextEpochData, s, nextEpoch) if err != nil { return fmt.Errorf("cannot find next epoch data: %w", err) } @@ -614,7 +614,7 @@ func (s *EpochState) FinalizeBABENextConfigData(finalizedHeader *types.Header) e } // not every epoch will have `ConfigData` - finalizedNextConfigData, err := lookupForNextEpochPersistedHash(s.nextConfigData, s, nextEpoch) + finalizedNextConfigData, err := findFinalizedHeaderForEpoch(s.nextConfigData, s, nextEpoch) if errors.Is(err, ErrEpochNotInMemory) { return nil } else if err != nil { @@ -637,10 +637,10 @@ func (s *EpochState) FinalizeBABENextConfigData(finalizedHeader *types.Header) e return nil } -// lookupForNextEpochPersistedHash given a specific epoch (the key) will go through the hashes looking +// findFinalizedHeaderForEpoch given a specific epoch (the key) will go through the hashes looking // for a database persisted hash (belonging to the finalized chain) // which contains the right configuration to be persisted and safely used -func lookupForNextEpochPersistedHash[T types.NextConfigData | types.NextEpochData]( +func findFinalizedHeaderForEpoch[T types.NextConfigData | types.NextEpochData]( nextEpochMap map[uint64]map[common.Hash]T, es *EpochState, epoch uint64) (next *T, err error) { hashes, has := nextEpochMap[epoch] if !has { From dfd06d2407b7d2c16bc02ab76f3963648757a65c Mon Sep 17 00:00:00 2001 From: EclesioMeloJunior Date: Wed, 13 Apr 2022 09:11:27 -0400 Subject: [PATCH 13/21] chore: unexport `Data` field on epoch_test.go --- dot/state/epoch_test.go | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/dot/state/epoch_test.go b/dot/state/epoch_test.go index 6953873f85..d45eea16a1 100644 --- a/dot/state/epoch_test.go +++ b/dot/state/epoch_test.go @@ -229,7 +229,7 @@ func TestEpochState_GetEpochFromTime(t *testing.T) { type inMemoryBABEData[T any] struct { epoch uint64 hashes []common.Hash - Data []T + data []T } func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { @@ -294,7 +294,7 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { common.MustHexToHash("0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3"), common.MustHexToHash("0xc0096358534ec8d21d01d34b836eed476a1c343f8724fa2153dc0725ad797a90"), }, - Data: []types.NextEpochData{ + data: []types.NextEpochData{ { Authorities: authorities[:3], Randomness: [32]byte{1}, @@ -316,7 +316,7 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { common.MustHexToHash("0xd380bee22de487a707cbda65dd9d4e2188f736908c42cf390c8919d4f7fc547c"), finalizedHeaderHash, }, - Data: []types.NextEpochData{ + data: []types.NextEpochData{ { Authorities: authorities[6:], Randomness: [32]byte{1}, @@ -336,7 +336,7 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { hashes: []common.Hash{ common.MustHexToHash("0xab5c9230a7dde8bb90a6728ba4a0165423294dac14336b1443f865b796ff682c"), }, - Data: []types.NextEpochData{ + data: []types.NextEpochData{ { Authorities: authorities[6:], Randomness: [32]byte{1}, @@ -359,7 +359,7 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { common.MustHexToHash("0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3"), common.MustHexToHash("0xc0096358534ec8d21d01d34b836eed476a1c343f8724fa2153dc0725ad797a90"), }, - Data: []types.NextEpochData{ + data: []types.NextEpochData{ { Authorities: authorities[:3], Randomness: [32]byte{1}, @@ -391,7 +391,7 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { for _, e := range tt.inMemoryEpoch { for i, hash := range e.hashes { - epochState.StoreBABENextEpochData(e.epoch, hash, e.Data[i]) + epochState.StoreBABENextEpochData(e.epoch, hash, e.data[i]) } } @@ -466,7 +466,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { common.MustHexToHash("0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3"), common.MustHexToHash("0xc0096358534ec8d21d01d34b836eed476a1c343f8724fa2153dc0725ad797a90"), }, - Data: []types.NextConfigData{ + data: []types.NextConfigData{ { C1: 1, C2: 2, @@ -491,7 +491,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { common.MustHexToHash("0xd380bee22de487a707cbda65dd9d4e2188f736908c42cf390c8919d4f7fc547c"), finalizedHeaderHash, }, - Data: []types.NextConfigData{ + data: []types.NextConfigData{ { C1: 1, C2: 2, @@ -514,7 +514,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { hashes: []common.Hash{ common.MustHexToHash("0xab5c9230a7dde8bb90a6728ba4a0165423294dac14336b1443f865b796ff682c"), }, - Data: []types.NextConfigData{ + data: []types.NextConfigData{ { C1: 1, C2: 2, @@ -537,7 +537,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { common.MustHexToHash("0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3"), common.MustHexToHash("0xc0096358534ec8d21d01d34b836eed476a1c343f8724fa2153dc0725ad797a90"), }, - Data: []types.NextConfigData{ + data: []types.NextConfigData{ { C1: 1, C2: 2, @@ -571,7 +571,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { for _, e := range tt.inMemoryEpoch { for i, hash := range e.hashes { - epochState.StoreBABENextConfigData(e.epoch, hash, e.Data[i]) + epochState.StoreBABENextConfigData(e.epoch, hash, e.data[i]) } } From 89a119fdc0541455c1c0b93ef0041865e367fc1f Mon Sep 17 00:00:00 2001 From: EclesioMeloJunior Date: Wed, 13 Apr 2022 09:15:55 -0400 Subject: [PATCH 14/21] chore: addressing last nits --- dot/state/epoch_test.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/dot/state/epoch_test.go b/dot/state/epoch_test.go index d45eea16a1..aed2e4451b 100644 --- a/dot/state/epoch_test.go +++ b/dot/state/epoch_test.go @@ -438,7 +438,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { require.NoError(t, digest.Add(*preRuntimeDigest)) - // a random finalized header for testing purposes + // finalized header for testing purposes finalizedHeader := &types.Header{ ParentHash: common.Hash{}, Number: 1, @@ -450,13 +450,13 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { tests := map[string]struct { finalizedHeader *types.Header inMemoryEpoch []inMemoryBABEData[types.NextConfigData] - finalizeEpoch uint64 + finalizedEpoch uint64 expectErr error shouldRemainInMemory int }{ "store_and_finalize_successfully": { shouldRemainInMemory: 1, - finalizeEpoch: 2, + finalizedEpoch: 2, finalizedHeader: finalizedHeader, inMemoryEpoch: []inMemoryBABEData[types.NextConfigData]{ { @@ -526,8 +526,8 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { }, "cannot_finalize_hash_doesnt_exists": { shouldRemainInMemory: 1, - finalizeEpoch: 2, - finalizedHeader: finalizedHeader, // finalize when the hash does not exists + finalizedEpoch: 2, + finalizedHeader: finalizedHeader, // finalize when the hash does not exist expectErr: errHashNotPersisted, inMemoryEpoch: []inMemoryBABEData[types.NextConfigData]{ { @@ -559,7 +559,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { }, "in_memory_config_not_found_shouldnt_return_error": { shouldRemainInMemory: 0, - finalizeEpoch: 1, // try to finalize a epoch that does not exists + finalizedEpoch: 1, // try to finalize an epoch that does not exist finalizedHeader: finalizedHeader, inMemoryEpoch: []inMemoryBABEData[types.NextConfigData]{}, }, @@ -585,7 +585,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { return } - expectedConfigData := epochState.nextConfigData[tt.finalizeEpoch][tt.finalizedHeader.Hash()] + expectedConfigData := epochState.nextConfigData[tt.finalizedEpoch][tt.finalizedHeader.Hash()] err := epochState.blockState.db.Put(headerKey(tt.finalizedHeader.Hash()), []byte{}) require.NoError(t, err) @@ -596,7 +596,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { } else { require.NoError(t, err) - gotConfigData, err := epochState.GetConfigData(tt.finalizeEpoch, nil) + gotConfigData, err := epochState.GetConfigData(tt.finalizedEpoch, nil) require.NoError(t, err) require.Equal(t, expectedConfigData.ToConfigData(), gotConfigData) } From f4cc36a0b0d433882698577ec2bcb61c9887ff14 Mon Sep 17 00:00:00 2001 From: EclesioMeloJunior Date: Wed, 13 Apr 2022 09:33:08 -0400 Subject: [PATCH 15/21] chore: rename to a better name --- dot/state/epoch.go | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/dot/state/epoch.go b/dot/state/epoch.go index 1d86a0ad53..b0f0bbada9 100644 --- a/dot/state/epoch.go +++ b/dot/state/epoch.go @@ -244,7 +244,7 @@ func (s *EpochState) SetEpochData(epoch uint64, info *types.EpochData) error { // otherwise will try to get the data from the in-memory map using the header // if the header params is nil then it will search only in database func (s *EpochState) GetEpochData(epoch uint64, header *types.Header) (*types.EpochData, error) { - epochData, err := s.getEpochDataInDatabase(epoch) + epochData, err := s.getEpochDataFromDatabase(epoch) if err == nil && epochData != nil { return epochData, nil } @@ -256,7 +256,7 @@ func (s *EpochState) GetEpochData(epoch uint64, header *types.Header) (*types.Ep return epochData, nil } - epochData, err = s.getEpochDataInMemory(epoch, header) + epochData, err = s.getEpochDataFromMemory(epoch, header) if err != nil { return nil, fmt.Errorf("failed to get epoch data from memory: %w", err) } @@ -264,8 +264,8 @@ func (s *EpochState) GetEpochData(epoch uint64, header *types.Header) (*types.Ep return epochData, nil } -// getEpochDataInDatabase returns the epoch data for a given epoch persisted in database -func (s *EpochState) getEpochDataInDatabase(epoch uint64) (*types.EpochData, error) { +// getEpochDataFromDatabase returns the epoch data for a given epoch persisted in database +func (s *EpochState) getEpochDataFromDatabase(epoch uint64) (*types.EpochData, error) { enc, err := s.db.Get(epochDataKey(epoch)) if err != nil { return nil, err @@ -280,8 +280,8 @@ func (s *EpochState) getEpochDataInDatabase(epoch uint64) (*types.EpochData, err return raw.ToEpochData() } -// getEpochDataInMemory retrieves the right epoch data that belongs to the header parameter -func (s *EpochState) getEpochDataInMemory(epoch uint64, header *types.Header) (*types.EpochData, error) { +// getEpochDataFromMemory retrieves the right epoch data that belongs to the header parameter +func (s *EpochState) getEpochDataFromMemory(epoch uint64, header *types.Header) (*types.EpochData, error) { s.nextEpochDataLock.RLock() defer s.nextEpochDataLock.RUnlock() @@ -359,7 +359,7 @@ func (s *EpochState) setLatestConfigData(epoch uint64) error { // otherwise tries to get the data from the in-memory map using the header. // If the header params is nil then it will search only in the database func (s *EpochState) GetConfigData(epoch uint64, header *types.Header) (*types.ConfigData, error) { - configData, err := s.getConfigDataInDatabase(epoch) + configData, err := s.getConfigDataFromDatabase(epoch) if err == nil && configData != nil { return configData, nil } @@ -371,7 +371,7 @@ func (s *EpochState) GetConfigData(epoch uint64, header *types.Header) (*types.C return configData, nil } - configData, err = s.getConfigDataInMemory(epoch, header) + configData, err = s.getConfigDataFromMemory(epoch, header) if err != nil { return nil, fmt.Errorf("failed to get config data from memory: %w", err) } @@ -379,8 +379,8 @@ func (s *EpochState) GetConfigData(epoch uint64, header *types.Header) (*types.C return configData, nil } -// getConfigDataInDatabase returns the BABE config data for a given epoch persisted in database -func (s *EpochState) getConfigDataInDatabase(epoch uint64) (*types.ConfigData, error) { +// getConfigDataFromDatabase returns the BABE config data for a given epoch persisted in database +func (s *EpochState) getConfigDataFromDatabase(epoch uint64) (*types.ConfigData, error) { enc, err := s.db.Get(configDataKey(epoch)) if err != nil { return nil, err @@ -395,8 +395,8 @@ func (s *EpochState) getConfigDataInDatabase(epoch uint64) (*types.ConfigData, e return info, nil } -// getConfigDataInMemory retrieves the BABE config data for a given epoch that belongs to the header parameter -func (s *EpochState) getConfigDataInMemory(epoch uint64, header *types.Header) (*types.ConfigData, error) { +// getConfigDataFromMemory retrieves the BABE config data for a given epoch that belongs to the header parameter +func (s *EpochState) getConfigDataFromMemory(epoch uint64, header *types.Header) (*types.ConfigData, error) { s.nextConfigDataLock.RLock() defer s.nextConfigDataLock.RUnlock() @@ -552,7 +552,7 @@ func (s *EpochState) FinalizeBABENextEpochData(finalizedHeader *types.Header) er nextEpoch := finalizedBlockEpoch + 1 - epochInDatabase, err := s.getEpochDataInDatabase(nextEpoch) + epochInDatabase, err := s.getEpochDataFromDatabase(nextEpoch) if err != nil && !errors.Is(err, chaindb.ErrKeyNotFound) { return fmt.Errorf("cannot check if next epoch data is already defined for epoch %d: %w", nextEpoch, err) } @@ -603,7 +603,7 @@ func (s *EpochState) FinalizeBABENextConfigData(finalizedHeader *types.Header) e nextEpoch := finalizedBlockEpoch + 1 - configInDatabase, err := s.getConfigDataInDatabase(nextEpoch) + configInDatabase, err := s.getConfigDataFromDatabase(nextEpoch) if err != nil && !errors.Is(err, chaindb.ErrKeyNotFound) { return fmt.Errorf("cannot check if next epoch config is already defined for epoch %d: %w", nextEpoch, err) } From 71ee157e88270b8adfc0fccda14dc884bf4fae82 Mon Sep 17 00:00:00 2001 From: EclesioMeloJunior Date: Wed, 13 Apr 2022 09:34:26 -0400 Subject: [PATCH 16/21] chore: fix comments --- dot/state/epoch.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dot/state/epoch.go b/dot/state/epoch.go index b0f0bbada9..ca64fdfce4 100644 --- a/dot/state/epoch.go +++ b/dot/state/epoch.go @@ -557,7 +557,7 @@ func (s *EpochState) FinalizeBABENextEpochData(finalizedHeader *types.Header) er return fmt.Errorf("cannot check if next epoch data is already defined for epoch %d: %w", nextEpoch, err) } - // config already defined we don't need to lookup in the map + // epoch data already defined we don't need to lookup in the map if epochInDatabase != nil { return nil } @@ -608,7 +608,7 @@ func (s *EpochState) FinalizeBABENextConfigData(finalizedHeader *types.Header) e return fmt.Errorf("cannot check if next epoch config is already defined for epoch %d: %w", nextEpoch, err) } - // config already defined we don't need to lookup in the map + // config data already defined we don't need to lookup in the map if configInDatabase != nil { return nil } From cdd29eaf87aad35d380635e069dc18a6ae97b2e3 Mon Sep 17 00:00:00 2001 From: EclesioMeloJunior Date: Wed, 13 Apr 2022 12:37:55 -0400 Subject: [PATCH 17/21] chore: addressing comments --- dot/state/epoch.go | 7 +++++++ dot/state/epoch_test.go | 26 +++++++++++++------------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/dot/state/epoch.go b/dot/state/epoch.go index ca64fdfce4..731349cc8f 100644 --- a/dot/state/epoch.go +++ b/dot/state/epoch.go @@ -553,6 +553,9 @@ func (s *EpochState) FinalizeBABENextEpochData(finalizedHeader *types.Header) er nextEpoch := finalizedBlockEpoch + 1 epochInDatabase, err := s.getEpochDataFromDatabase(nextEpoch) + + // if an error occurs and the error is chaindb.ErrKeyNotFound we ignore + // since this error is what we will handle in the next lines if err != nil && !errors.Is(err, chaindb.ErrKeyNotFound) { return fmt.Errorf("cannot check if next epoch data is already defined for epoch %d: %w", nextEpoch, err) } @@ -604,6 +607,9 @@ func (s *EpochState) FinalizeBABENextConfigData(finalizedHeader *types.Header) e nextEpoch := finalizedBlockEpoch + 1 configInDatabase, err := s.getConfigDataFromDatabase(nextEpoch) + + // if an error occurs and the error is chaindb.ErrKeyNotFound we ignore + // since this error is what we will handle in the next lines if err != nil && !errors.Is(err, chaindb.ErrKeyNotFound) { return fmt.Errorf("cannot check if next epoch config is already defined for epoch %d: %w", nextEpoch, err) } @@ -616,6 +622,7 @@ func (s *EpochState) FinalizeBABENextConfigData(finalizedHeader *types.Header) e // not every epoch will have `ConfigData` finalizedNextConfigData, err := findFinalizedHeaderForEpoch(s.nextConfigData, s, nextEpoch) if errors.Is(err, ErrEpochNotInMemory) { + logger.Debugf("config data for epoch %d not found in memory", nextEpoch) return nil } else if err != nil { return fmt.Errorf("cannot find next config data: %w", err) diff --git a/dot/state/epoch_test.go b/dot/state/epoch_test.go index aed2e4451b..dd9d413866 100644 --- a/dot/state/epoch_test.go +++ b/dot/state/epoch_test.go @@ -227,9 +227,9 @@ func TestEpochState_GetEpochFromTime(t *testing.T) { } type inMemoryBABEData[T any] struct { - epoch uint64 - hashes []common.Hash - data []T + epoch uint64 + hashes []common.Hash + nextData []T } func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { @@ -294,7 +294,7 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { common.MustHexToHash("0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3"), common.MustHexToHash("0xc0096358534ec8d21d01d34b836eed476a1c343f8724fa2153dc0725ad797a90"), }, - data: []types.NextEpochData{ + nextData: []types.NextEpochData{ { Authorities: authorities[:3], Randomness: [32]byte{1}, @@ -316,7 +316,7 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { common.MustHexToHash("0xd380bee22de487a707cbda65dd9d4e2188f736908c42cf390c8919d4f7fc547c"), finalizedHeaderHash, }, - data: []types.NextEpochData{ + nextData: []types.NextEpochData{ { Authorities: authorities[6:], Randomness: [32]byte{1}, @@ -336,7 +336,7 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { hashes: []common.Hash{ common.MustHexToHash("0xab5c9230a7dde8bb90a6728ba4a0165423294dac14336b1443f865b796ff682c"), }, - data: []types.NextEpochData{ + nextData: []types.NextEpochData{ { Authorities: authorities[6:], Randomness: [32]byte{1}, @@ -359,7 +359,7 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { common.MustHexToHash("0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3"), common.MustHexToHash("0xc0096358534ec8d21d01d34b836eed476a1c343f8724fa2153dc0725ad797a90"), }, - data: []types.NextEpochData{ + nextData: []types.NextEpochData{ { Authorities: authorities[:3], Randomness: [32]byte{1}, @@ -391,7 +391,7 @@ func TestStoreAndFinalizeBabeNextEpochData(t *testing.T) { for _, e := range tt.inMemoryEpoch { for i, hash := range e.hashes { - epochState.StoreBABENextEpochData(e.epoch, hash, e.data[i]) + epochState.StoreBABENextEpochData(e.epoch, hash, e.nextData[i]) } } @@ -466,7 +466,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { common.MustHexToHash("0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3"), common.MustHexToHash("0xc0096358534ec8d21d01d34b836eed476a1c343f8724fa2153dc0725ad797a90"), }, - data: []types.NextConfigData{ + nextData: []types.NextConfigData{ { C1: 1, C2: 2, @@ -491,7 +491,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { common.MustHexToHash("0xd380bee22de487a707cbda65dd9d4e2188f736908c42cf390c8919d4f7fc547c"), finalizedHeaderHash, }, - data: []types.NextConfigData{ + nextData: []types.NextConfigData{ { C1: 1, C2: 2, @@ -514,7 +514,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { hashes: []common.Hash{ common.MustHexToHash("0xab5c9230a7dde8bb90a6728ba4a0165423294dac14336b1443f865b796ff682c"), }, - data: []types.NextConfigData{ + nextData: []types.NextConfigData{ { C1: 1, C2: 2, @@ -537,7 +537,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { common.MustHexToHash("0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3"), common.MustHexToHash("0xc0096358534ec8d21d01d34b836eed476a1c343f8724fa2153dc0725ad797a90"), }, - data: []types.NextConfigData{ + nextData: []types.NextConfigData{ { C1: 1, C2: 2, @@ -571,7 +571,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { for _, e := range tt.inMemoryEpoch { for i, hash := range e.hashes { - epochState.StoreBABENextConfigData(e.epoch, hash, e.data[i]) + epochState.StoreBABENextConfigData(e.epoch, hash, e.nextData[i]) } } From 16f35dceedae5a1479a64d9b65a70725e570ce37 Mon Sep 17 00:00:00 2001 From: EclesioMeloJunior Date: Wed, 13 Apr 2022 14:29:52 -0400 Subject: [PATCH 18/21] chore: update mockery verison --- dot/rpc/modules/mocks/block_api.go | 2 +- dot/rpc/modules/mocks/block_finality_api.go | 2 +- dot/rpc/modules/mocks/block_producer_api.go | 2 +- dot/rpc/modules/mocks/core_api.go | 2 +- dot/rpc/modules/mocks/network_api.go | 2 +- dot/rpc/modules/mocks/rpcapi.go | 2 +- dot/rpc/modules/mocks/runtime_storage_api.go | 2 +- dot/rpc/modules/mocks/storage_api.go | 2 +- dot/rpc/modules/mocks/sync_state_api.go | 2 +- dot/rpc/modules/mocks/system_api.go | 2 +- dot/rpc/modules/mocks/transaction_state_api.go | 2 +- dot/state/mock_observer.go | 2 +- dot/sync/mocks/babe_verifier.go | 2 +- dot/sync/mocks/block_import_handler.go | 2 +- dot/sync/mocks/block_state.go | 2 +- dot/sync/mocks/finality_gadget.go | 2 +- dot/sync/mocks/network.go | 2 +- lib/babe/mocks/block_import_handler.go | 2 +- lib/grandpa/mocks/network.go | 2 +- lib/runtime/mock_memory_test.go | 2 +- lib/runtime/mocks/instance.go | 2 +- lib/runtime/mocks/transaction_state.go | 2 +- lib/runtime/mocks/version.go | 2 +- lib/services/mocks/service.go | 2 +- 24 files changed, 24 insertions(+), 24 deletions(-) diff --git a/dot/rpc/modules/mocks/block_api.go b/dot/rpc/modules/mocks/block_api.go index 8fae0eb002..7fa7736ddb 100644 --- a/dot/rpc/modules/mocks/block_api.go +++ b/dot/rpc/modules/mocks/block_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.6. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/block_finality_api.go b/dot/rpc/modules/mocks/block_finality_api.go index cd163ce5c7..21117ca358 100644 --- a/dot/rpc/modules/mocks/block_finality_api.go +++ b/dot/rpc/modules/mocks/block_finality_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.6. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/block_producer_api.go b/dot/rpc/modules/mocks/block_producer_api.go index a18e2ace04..fd40639138 100644 --- a/dot/rpc/modules/mocks/block_producer_api.go +++ b/dot/rpc/modules/mocks/block_producer_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.6. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/core_api.go b/dot/rpc/modules/mocks/core_api.go index baacb5b5b0..59105fbd01 100644 --- a/dot/rpc/modules/mocks/core_api.go +++ b/dot/rpc/modules/mocks/core_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.6. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/network_api.go b/dot/rpc/modules/mocks/network_api.go index 8ab4e28bec..76871f8469 100644 --- a/dot/rpc/modules/mocks/network_api.go +++ b/dot/rpc/modules/mocks/network_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.6. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/rpcapi.go b/dot/rpc/modules/mocks/rpcapi.go index e5be5e8790..a65beb315e 100644 --- a/dot/rpc/modules/mocks/rpcapi.go +++ b/dot/rpc/modules/mocks/rpcapi.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.6. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/runtime_storage_api.go b/dot/rpc/modules/mocks/runtime_storage_api.go index 0380c1cf82..840c96d059 100644 --- a/dot/rpc/modules/mocks/runtime_storage_api.go +++ b/dot/rpc/modules/mocks/runtime_storage_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.6. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/storage_api.go b/dot/rpc/modules/mocks/storage_api.go index 2b4557ce82..8cb3fbe5bf 100644 --- a/dot/rpc/modules/mocks/storage_api.go +++ b/dot/rpc/modules/mocks/storage_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.6. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/sync_state_api.go b/dot/rpc/modules/mocks/sync_state_api.go index cfbc014ea4..0e9e8c078b 100644 --- a/dot/rpc/modules/mocks/sync_state_api.go +++ b/dot/rpc/modules/mocks/sync_state_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.6. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/system_api.go b/dot/rpc/modules/mocks/system_api.go index f8f39b0c6a..21889736fb 100644 --- a/dot/rpc/modules/mocks/system_api.go +++ b/dot/rpc/modules/mocks/system_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.6. DO NOT EDIT. package mocks diff --git a/dot/rpc/modules/mocks/transaction_state_api.go b/dot/rpc/modules/mocks/transaction_state_api.go index d783820fa4..82fc6e7553 100644 --- a/dot/rpc/modules/mocks/transaction_state_api.go +++ b/dot/rpc/modules/mocks/transaction_state_api.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.6. DO NOT EDIT. package mocks diff --git a/dot/state/mock_observer.go b/dot/state/mock_observer.go index 6a0683586d..dfdb42adcc 100644 --- a/dot/state/mock_observer.go +++ b/dot/state/mock_observer.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.6. DO NOT EDIT. package state diff --git a/dot/sync/mocks/babe_verifier.go b/dot/sync/mocks/babe_verifier.go index 0be36b3ad8..3b11bbf29d 100644 --- a/dot/sync/mocks/babe_verifier.go +++ b/dot/sync/mocks/babe_verifier.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.6. DO NOT EDIT. package mocks diff --git a/dot/sync/mocks/block_import_handler.go b/dot/sync/mocks/block_import_handler.go index 10488e6f7a..6b4cd46b3f 100644 --- a/dot/sync/mocks/block_import_handler.go +++ b/dot/sync/mocks/block_import_handler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.6. DO NOT EDIT. package mocks diff --git a/dot/sync/mocks/block_state.go b/dot/sync/mocks/block_state.go index 367601d550..2f9d48d9af 100644 --- a/dot/sync/mocks/block_state.go +++ b/dot/sync/mocks/block_state.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.6. DO NOT EDIT. package mocks diff --git a/dot/sync/mocks/finality_gadget.go b/dot/sync/mocks/finality_gadget.go index f3c1fc3e5e..6179f5d6fd 100644 --- a/dot/sync/mocks/finality_gadget.go +++ b/dot/sync/mocks/finality_gadget.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.6. DO NOT EDIT. package mocks diff --git a/dot/sync/mocks/network.go b/dot/sync/mocks/network.go index d1b945bde6..d9c8accaf5 100644 --- a/dot/sync/mocks/network.go +++ b/dot/sync/mocks/network.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.6. DO NOT EDIT. package mocks diff --git a/lib/babe/mocks/block_import_handler.go b/lib/babe/mocks/block_import_handler.go index c803e1f65b..c4c61cf002 100644 --- a/lib/babe/mocks/block_import_handler.go +++ b/lib/babe/mocks/block_import_handler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.6. DO NOT EDIT. package mocks diff --git a/lib/grandpa/mocks/network.go b/lib/grandpa/mocks/network.go index a1930740db..5d7e607e03 100644 --- a/lib/grandpa/mocks/network.go +++ b/lib/grandpa/mocks/network.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.6. DO NOT EDIT. package mocks diff --git a/lib/runtime/mock_memory_test.go b/lib/runtime/mock_memory_test.go index 97374c51cc..9fca62f217 100644 --- a/lib/runtime/mock_memory_test.go +++ b/lib/runtime/mock_memory_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.6. DO NOT EDIT. package runtime diff --git a/lib/runtime/mocks/instance.go b/lib/runtime/mocks/instance.go index 9188ba2349..c8f2353909 100644 --- a/lib/runtime/mocks/instance.go +++ b/lib/runtime/mocks/instance.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.6. DO NOT EDIT. package mocks diff --git a/lib/runtime/mocks/transaction_state.go b/lib/runtime/mocks/transaction_state.go index 952ecfad4e..f7dd59036c 100644 --- a/lib/runtime/mocks/transaction_state.go +++ b/lib/runtime/mocks/transaction_state.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.6. DO NOT EDIT. package mocks diff --git a/lib/runtime/mocks/version.go b/lib/runtime/mocks/version.go index b389875077..1999794717 100644 --- a/lib/runtime/mocks/version.go +++ b/lib/runtime/mocks/version.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.6. DO NOT EDIT. package mocks diff --git a/lib/services/mocks/service.go b/lib/services/mocks/service.go index 98752d2740..d6af8c0324 100644 --- a/lib/services/mocks/service.go +++ b/lib/services/mocks/service.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.6. DO NOT EDIT. package mocks From 1149c1f093bc85dd495069d14a95eb748393ba98 Mon Sep 17 00:00:00 2001 From: EclesioMeloJunior Date: Wed, 13 Apr 2022 14:45:28 -0400 Subject: [PATCH 19/21] chore: update devnet mocks as well --- devnet/cmd/scale-down-ecs-service/mocks/ecsapi.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devnet/cmd/scale-down-ecs-service/mocks/ecsapi.go b/devnet/cmd/scale-down-ecs-service/mocks/ecsapi.go index b77faa9dd9..c3dd446d7a 100644 --- a/devnet/cmd/scale-down-ecs-service/mocks/ecsapi.go +++ b/devnet/cmd/scale-down-ecs-service/mocks/ecsapi.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.10.4. DO NOT EDIT. +// Code generated by mockery v2.10.6. DO NOT EDIT. package mocks From ac0bdd45df38492e60d9f426ac143b26a81ef28f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ecl=C3=A9sio=20Junior?= Date: Thu, 14 Apr 2022 08:45:45 -0400 Subject: [PATCH 20/21] chore: improve comments Co-authored-by: Quentin McGaw --- dot/state/epoch.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dot/state/epoch.go b/dot/state/epoch.go index 731349cc8f..cdc3fba584 100644 --- a/dot/state/epoch.go +++ b/dot/state/epoch.go @@ -646,7 +646,7 @@ func (s *EpochState) FinalizeBABENextConfigData(finalizedHeader *types.Header) e // findFinalizedHeaderForEpoch given a specific epoch (the key) will go through the hashes looking // for a database persisted hash (belonging to the finalized chain) -// which contains the right configuration to be persisted and safely used +// which contains the right configuration or data to be persisted and safely used func findFinalizedHeaderForEpoch[T types.NextConfigData | types.NextEpochData]( nextEpochMap map[uint64]map[common.Hash]T, es *EpochState, epoch uint64) (next *T, err error) { hashes, has := nextEpochMap[epoch] From 1fd682d1b7e439b524e876230fb9f960fd9237b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ecl=C3=A9sio=20Junior?= Date: Thu, 14 Apr 2022 08:45:59 -0400 Subject: [PATCH 21/21] chore: improve comments Co-authored-by: Quentin McGaw --- dot/state/epoch_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dot/state/epoch_test.go b/dot/state/epoch_test.go index dd9d413866..234e22ca55 100644 --- a/dot/state/epoch_test.go +++ b/dot/state/epoch_test.go @@ -577,7 +577,7 @@ func TestStoreAndFinalizeBabeNextConfigData(t *testing.T) { require.Len(t, epochState.nextConfigData, len(tt.inMemoryEpoch)) - // if there is no data in memory we try to finalize the net config data + // if there is no data in memory we try to finalize the next config data // it should return nil since next epoch config data will not be in every epoch's first block if len(tt.inMemoryEpoch) == 0 { err = epochState.FinalizeBABENextConfigData(tt.finalizedHeader)