From 2c243b6ecf53cea9c84b67f082cbb134f1fd736f Mon Sep 17 00:00:00 2001 From: jules01 Date: Mon, 3 Oct 2022 17:10:59 +0300 Subject: [PATCH 001/110] - made the process debugger to auto revert its log level, if required --- cmd/node/config/config.toml | 2 ++ config/config.go | 9 +++++---- debug/process/debugger.go | 28 +++++++++++++++++++++++++--- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/cmd/node/config/config.toml b/cmd/node/config/config.toml index b8932eb4625..39c4f936899 100644 --- a/cmd/node/config/config.toml +++ b/cmd/node/config/config.toml @@ -820,6 +820,8 @@ DebuggingLogLevel = "*:DEBUG,p2p:TRACE,debug:DEBUG,process:TRACE,intercept:TRACE" GoRoutinesDump = true PollingTimeInSeconds = 240 # 4 minutes + # setting this to 0 disbles the automatic revert of the log level + RevertLogLevelTimeInSeconds = 600 # 10 minutes [Health] IntervalVerifyMemoryInSeconds = 30 diff --git a/config/config.go b/config/config.go index 4b8ed817812..b11b6c8150d 100644 --- a/config/config.go +++ b/config/config.go @@ -519,10 +519,11 @@ type EpochStartDebugConfig struct { // ProcessDebugConfig will hold the process debug configuration type ProcessDebugConfig struct { - Enabled bool - GoRoutinesDump bool - DebuggingLogLevel string - PollingTimeInSeconds int + Enabled bool + GoRoutinesDump bool + DebuggingLogLevel string + PollingTimeInSeconds int + RevertLogLevelTimeInSeconds int } // ApiRoutesConfig holds the configuration related to Rest API routes diff --git a/debug/process/debugger.go b/debug/process/debugger.go index 19d599e2d13..762f53b140f 100644 --- a/debug/process/debugger.go +++ b/debug/process/debugger.go @@ -29,6 +29,7 @@ type processDebugger struct { pollingTime time.Duration debuggingLogLevel string dumpGoRoutines bool + revertTimeInSeconds int } // NewProcessDebugger creates a new debugger instance used to monitor the block process flow @@ -42,9 +43,10 @@ func NewProcessDebugger(config config.ProcessDebugConfig) (*processDebugger, err d := &processDebugger{ timer: time.NewTimer(pollingTime), - pollingTime: pollingTime, - debuggingLogLevel: config.DebuggingLogLevel, - dumpGoRoutines: config.GoRoutinesDump, + pollingTime: pollingTime, + debuggingLogLevel: config.DebuggingLogLevel, + dumpGoRoutines: config.GoRoutinesDump, + revertTimeInSeconds: config.RevertLogLevelTimeInSeconds, } ctx, cancel := context.WithCancel(context.Background()) @@ -158,10 +160,30 @@ func dumpGoRoutines() { } func (debugger *processDebugger) changeLog() { + oldLogLevel := logger.GetLogLevelPattern() + + errSetLogLevel := logger.SetLogLevel(debugger.debuggingLogLevel) + if errSetLogLevel != nil { + log.Error("debugger.changeLog: cannot change log level", "error", errSetLogLevel) + } + + if debugger.revertTimeInSeconds > 0 { + go debugger.revertLogLevel(oldLogLevel) + } +} + +func (debugger *processDebugger) revertLogLevel(oldLogLevel string) { + timeToWait := time.Second * time.Duration(debugger.revertTimeInSeconds) + log.Debug("debugger.revertLogLevel", "original log level", oldLogLevel, "will revert in", timeToWait) + + time.Sleep(timeToWait) + errSetLogLevel := logger.SetLogLevel(debugger.debuggingLogLevel) if errSetLogLevel != nil { log.Error("debugger.changeLog: cannot change log level", "error", errSetLogLevel) } + log.Debug("debugger.revertLogLevel", "reverted log level", oldLogLevel) + debugger.cancel() } // IsInterfaceNil returns true if there is no value under the interface From 03d6dff0503a9089d3ce225953b8e02cb0223f1e Mon Sep 17 00:00:00 2001 From: jules01 Date: Wed, 5 Oct 2022 11:15:02 +0300 Subject: [PATCH 002/110] - fixed process debugger after local system tests --- debug/process/debugger.go | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/debug/process/debugger.go b/debug/process/debugger.go index 762f53b140f..24030bf3691 100644 --- a/debug/process/debugger.go +++ b/debug/process/debugger.go @@ -69,7 +69,7 @@ func checkConfigs(config config.ProcessDebugConfig) error { } func (debugger *processDebugger) processLoop(ctx context.Context) { - log.Debug("processor debugger processLoop is starting...") + log.Debug("processDebugger processLoop is starting...") defer debugger.timer.Stop() @@ -78,7 +78,7 @@ func (debugger *processDebugger) processLoop(ctx context.Context) { select { case <-ctx.Done(): - log.Debug("processor debugger processLoop is closing...") + log.Debug("processDebugger processLoop is closing...") return case <-debugger.timer.C: debugger.checkRounds() @@ -98,7 +98,7 @@ func (debugger *processDebugger) shouldTriggerUpdatingLastCheckedRound() bool { isNodeStarting := debugger.lastCheckedBlockRound == 0 && debugger.lastCommittedBlockRound <= 0 if isNodeStarting { - log.Debug("processor debugger: node is starting") + log.Debug("processDebugger: node is starting") return false } @@ -109,13 +109,13 @@ func (debugger *processDebugger) shouldTriggerUpdatingLastCheckedRound() bool { isFirstCommit := debugger.lastCheckedBlockRound == 0 && debugger.lastCommittedBlockRound > 0 if isFirstCommit { - log.Debug("processor debugger: first committed block", "round", debugger.lastCommittedBlockRound) + log.Debug("processDebugger: first committed block", "round", debugger.lastCommittedBlockRound) return false } isNodeRunning := debugger.lastCheckedBlockRound < debugger.lastCommittedBlockRound if isNodeRunning { - log.Debug("processor debugger: node is running, nothing to do", "round", debugger.lastCommittedBlockRound) + log.Debug("processDebugger: node is running, nothing to do", "round", debugger.lastCommittedBlockRound) return false } @@ -127,7 +127,7 @@ func (debugger *processDebugger) trigger() { lastCommittedBlockRound := debugger.lastCommittedBlockRound debugger.mut.RUnlock() - log.Warn("processor debugger: node is stuck", + log.Warn("processDebugger: node is stuck", "last committed round", lastCommittedBlockRound) debugger.logChangeHandler() @@ -142,7 +142,7 @@ func (debugger *processDebugger) SetLastCommittedBlockRound(round uint64) { debugger.mut.Lock() defer debugger.mut.Unlock() - log.Debug("processor debugger: updated last committed block round", "round", round) + log.Debug("processDebugger: updated last committed block round", "round", round) debugger.lastCommittedBlockRound = int64(round) } @@ -164,26 +164,27 @@ func (debugger *processDebugger) changeLog() { errSetLogLevel := logger.SetLogLevel(debugger.debuggingLogLevel) if errSetLogLevel != nil { - log.Error("debugger.changeLog: cannot change log level", "error", errSetLogLevel) + log.Error("processDebugger: cannot change log level", "error", errSetLogLevel) } if debugger.revertTimeInSeconds > 0 { go debugger.revertLogLevel(oldLogLevel) } + + debugger.cancel() } func (debugger *processDebugger) revertLogLevel(oldLogLevel string) { timeToWait := time.Second * time.Duration(debugger.revertTimeInSeconds) - log.Debug("debugger.revertLogLevel", "original log level", oldLogLevel, "will revert in", timeToWait) + log.Debug("processDebugger revertLogLevel", "original log level", oldLogLevel, "will revert in", timeToWait) time.Sleep(timeToWait) - errSetLogLevel := logger.SetLogLevel(debugger.debuggingLogLevel) + errSetLogLevel := logger.SetLogLevel(oldLogLevel) if errSetLogLevel != nil { - log.Error("debugger.changeLog: cannot change log level", "error", errSetLogLevel) + log.Error("processDebugger changeLog: cannot change log level", "error", errSetLogLevel) } - log.Debug("debugger.revertLogLevel", "reverted log level", oldLogLevel) - debugger.cancel() + log.Debug("processDebugger revertLogLevel", "reverted log level", oldLogLevel) } // IsInterfaceNil returns true if there is no value under the interface From 21ce11bac2b35a6f5fe1dc8d927307ee776f7312 Mon Sep 17 00:00:00 2001 From: jules01 Date: Wed, 5 Oct 2022 11:17:07 +0300 Subject: [PATCH 003/110] - moved the closing only if the revertTimeInSeconds was provided --- debug/process/debugger.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debug/process/debugger.go b/debug/process/debugger.go index 24030bf3691..c8755c50065 100644 --- a/debug/process/debugger.go +++ b/debug/process/debugger.go @@ -168,10 +168,10 @@ func (debugger *processDebugger) changeLog() { } if debugger.revertTimeInSeconds > 0 { + debugger.cancel() + go debugger.revertLogLevel(oldLogLevel) } - - debugger.cancel() } func (debugger *processDebugger) revertLogLevel(oldLogLevel string) { From c426046417f7cc9916badcece8fa517a92408465 Mon Sep 17 00:00:00 2001 From: jules01 Date: Wed, 5 Oct 2022 11:48:23 +0300 Subject: [PATCH 004/110] - fixes after review --- cmd/node/config/config.toml | 2 +- debug/process/debugger.go | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/cmd/node/config/config.toml b/cmd/node/config/config.toml index 39c4f936899..9f76e8c6304 100644 --- a/cmd/node/config/config.toml +++ b/cmd/node/config/config.toml @@ -820,7 +820,7 @@ DebuggingLogLevel = "*:DEBUG,p2p:TRACE,debug:DEBUG,process:TRACE,intercept:TRACE" GoRoutinesDump = true PollingTimeInSeconds = 240 # 4 minutes - # setting this to 0 disbles the automatic revert of the log level + # setting this to 0 disables the automatic revert of the log level RevertLogLevelTimeInSeconds = 600 # 10 minutes [Health] diff --git a/debug/process/debugger.go b/debug/process/debugger.go index c8755c50065..9cda307f792 100644 --- a/debug/process/debugger.go +++ b/debug/process/debugger.go @@ -165,6 +165,7 @@ func (debugger *processDebugger) changeLog() { errSetLogLevel := logger.SetLogLevel(debugger.debuggingLogLevel) if errSetLogLevel != nil { log.Error("processDebugger: cannot change log level", "error", errSetLogLevel) + return } if debugger.revertTimeInSeconds > 0 { @@ -182,8 +183,10 @@ func (debugger *processDebugger) revertLogLevel(oldLogLevel string) { errSetLogLevel := logger.SetLogLevel(oldLogLevel) if errSetLogLevel != nil { - log.Error("processDebugger changeLog: cannot change log level", "error", errSetLogLevel) + log.Error("processDebugger revertLogLevel: cannot change log level", "error", errSetLogLevel) + return } + log.Debug("processDebugger revertLogLevel", "reverted log level", oldLogLevel) } From 5d4cca0d3934e12fb0360c4cd543393af8e5e9e4 Mon Sep 17 00:00:00 2001 From: ssd04 Date: Thu, 6 Oct 2022 17:30:34 +0300 Subject: [PATCH 005/110] add metric for trie snapshot in progress --- common/constants.go | 3 ++ common/disabled/appStatusHandler.go | 42 +++++++++++++++++++ common/disabled/appStatusHandler_test.go | 31 ++++++++++++++ epochStart/metachain/systemSCs_test.go | 1 + .../processing/blockProcessorCreator_test.go | 2 + factory/state/stateComponents.go | 5 ++- genesis/process/memoryComponents.go | 1 + .../state/stateTrie/stateTrie_test.go | 3 ++ integrationTests/testInitializer.go | 2 + node/metrics/metrics.go | 1 + state/accountsDB.go | 15 ++++++- state/accountsDB_test.go | 16 ++++++- state/errors.go | 3 ++ .../factory/accountsAdapterAPICreator_test.go | 2 + .../storagePruningManager_test.go | 2 + 15 files changed, 126 insertions(+), 3 deletions(-) create mode 100644 common/disabled/appStatusHandler.go create mode 100644 common/disabled/appStatusHandler_test.go diff --git a/common/constants.go b/common/constants.go index 8008b8c141b..319178bc879 100644 --- a/common/constants.go +++ b/common/constants.go @@ -817,3 +817,6 @@ const ( // MaxIndexOfTxInMiniBlock defines the maximum index of a tx inside one mini block const MaxIndexOfTxInMiniBlock = int32(29999) + +// MetricTrieSnapshotIsProgress is the metric that outputs the status of the trie snapshot, if it's in progress or not +const MetricTrieSnapshotIsProgress = "erd_trie_snapshot_in_progress" diff --git a/common/disabled/appStatusHandler.go b/common/disabled/appStatusHandler.go new file mode 100644 index 00000000000..2c028a4a681 --- /dev/null +++ b/common/disabled/appStatusHandler.go @@ -0,0 +1,42 @@ +package disabled + +type appStatusHandler struct { +} + +// NewAppStatusHandler creates a new instance of disabled app status handler +func NewAppStatusHandler() *appStatusHandler { + return &appStatusHandler{} +} + +// AddUint64 does nothing +func (ash *appStatusHandler) AddUint64(key string, value uint64) { +} + +// Increment does nothing +func (ash *appStatusHandler) Increment(key string) { +} + +// Decrement does nothing +func (ash *appStatusHandler) Decrement(key string) { +} + +// SetInt64Value does nothing +func (ash *appStatusHandler) SetInt64Value(key string, value int64) { +} + +// SetUInt64Value does nothing +func (ash *appStatusHandler) SetUInt64Value(key string, value uint64) { +} + +// SetStringValue does nothing +func (ash *appStatusHandler) SetStringValue(key string, value string) { +} + +// Close does nothing +func (ash *appStatusHandler) Close() { +} + +// IsInterfaceNil - +func (ash *appStatusHandler) IsInterfaceNil() bool { + return ash == nil +} diff --git a/common/disabled/appStatusHandler_test.go b/common/disabled/appStatusHandler_test.go new file mode 100644 index 00000000000..57cb45ae5f2 --- /dev/null +++ b/common/disabled/appStatusHandler_test.go @@ -0,0 +1,31 @@ +package disabled + +import ( + "fmt" + "testing" + + "github.com/ElrondNetwork/elrond-go-core/core/check" + "github.com/stretchr/testify/assert" +) + +func TestAppStatusHandler_MethodsShouldNotPanic(t *testing.T) { + t.Parallel() + + defer func() { + r := recover() + if r != nil { + assert.Fail(t, fmt.Sprintf("should have not panicked: %v", r)) + } + }() + + ash := NewAppStatusHandler() + assert.False(t, check.IfNil(ash)) + + ash.AddUint64("key", uint64(0)) + ash.Increment("key") + ash.Decrement("key") + ash.SetInt64Value("key", int64(1)) + ash.SetUInt64Value("key", uint64(2)) + ash.SetStringValue("key", "true") + ash.Close() +} diff --git a/epochStart/metachain/systemSCs_test.go b/epochStart/metachain/systemSCs_test.go index 057b0c04a43..772bc491bd7 100644 --- a/epochStart/metachain/systemSCs_test.go +++ b/epochStart/metachain/systemSCs_test.go @@ -896,6 +896,7 @@ func createAccountsDB( StoragePruningManager: spm, ProcessingMode: common.Normal, ProcessStatusHandler: &testscommon.ProcessStatusHandlerStub{}, + AppStatusHandler: &statusHandlerMock.AppStatusHandlerStub{}, } adb, _ := state.NewAccountsDB(args) return adb diff --git a/factory/processing/blockProcessorCreator_test.go b/factory/processing/blockProcessorCreator_test.go index a2a507a74f8..5cd2d6f1e94 100644 --- a/factory/processing/blockProcessorCreator_test.go +++ b/factory/processing/blockProcessorCreator_test.go @@ -20,6 +20,7 @@ import ( componentsMock "github.com/ElrondNetwork/elrond-go/testscommon/components" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" + "github.com/ElrondNetwork/elrond-go/testscommon/statusHandler" storageManager "github.com/ElrondNetwork/elrond-go/testscommon/storage" trieMock "github.com/ElrondNetwork/elrond-go/testscommon/trie" "github.com/ElrondNetwork/elrond-go/trie" @@ -206,6 +207,7 @@ func createAccountAdapter( StoragePruningManager: disabled.NewDisabledStoragePruningManager(), ProcessingMode: common.Normal, ProcessStatusHandler: &testscommon.ProcessStatusHandlerStub{}, + AppStatusHandler: &statusHandler.AppStatusHandlerStub{}, } adb, err := state.NewAccountsDB(args) if err != nil { diff --git a/factory/state/stateComponents.go b/factory/state/stateComponents.go index 09606e5d6b3..0ab3e5b69b7 100644 --- a/factory/state/stateComponents.go +++ b/factory/state/stateComponents.go @@ -80,7 +80,7 @@ func NewStateComponentsFactory(args StateComponentsFactoryArgs) (*stateComponent shardCoordinator: args.ShardCoordinator, core: args.Core, storageService: args.StorageService, - processingMode: args.ProcessingMode, + processingMode: args.ProcessingMode, shouldSerializeSnapshots: args.ShouldSerializeSnapshots, chainHandler: args.ChainHandler, }, nil @@ -134,6 +134,7 @@ func (scf *stateComponentsFactory) createAccountsAdapters(triesContainer common. ProcessingMode: scf.processingMode, ShouldSerializeSnapshots: scf.shouldSerializeSnapshots, ProcessStatusHandler: scf.core.ProcessStatusHandler(), + AppStatusHandler: scf.core.StatusHandler(), } accountsAdapter, err := state.NewAccountsDB(argsProcessingAccountsDB) if err != nil { @@ -148,6 +149,7 @@ func (scf *stateComponentsFactory) createAccountsAdapters(triesContainer common. StoragePruningManager: storagePruning, ProcessingMode: scf.processingMode, ProcessStatusHandler: scf.core.ProcessStatusHandler(), + AppStatusHandler: scf.core.StatusHandler(), } accountsAdapterApiOnFinal, err := factoryState.CreateAccountsAdapterAPIOnFinal(argsAPIAccountsDB, scf.chainHandler) @@ -196,6 +198,7 @@ func (scf *stateComponentsFactory) createPeerAdapter(triesContainer common.Tries ProcessingMode: scf.processingMode, ShouldSerializeSnapshots: scf.shouldSerializeSnapshots, ProcessStatusHandler: scf.core.ProcessStatusHandler(), + AppStatusHandler: scf.core.StatusHandler(), } peerAdapter, err := state.NewPeerAccountsDB(argsProcessingPeerAccountsDB) if err != nil { diff --git a/genesis/process/memoryComponents.go b/genesis/process/memoryComponents.go index e0f4ef63155..65198dc4b66 100644 --- a/genesis/process/memoryComponents.go +++ b/genesis/process/memoryComponents.go @@ -31,6 +31,7 @@ func createAccountAdapter( StoragePruningManager: disabled.NewDisabledStoragePruningManager(), ProcessingMode: common.Normal, ProcessStatusHandler: commonDisabled.NewProcessStatusHandler(), + AppStatusHandler: commonDisabled.NewAppStatusHandler(), } adb, err := state.NewAccountsDB(args) diff --git a/integrationTests/state/stateTrie/stateTrie_test.go b/integrationTests/state/stateTrie/stateTrie_test.go index 88175afd2fc..cd640b94cce 100644 --- a/integrationTests/state/stateTrie/stateTrie_test.go +++ b/integrationTests/state/stateTrie/stateTrie_test.go @@ -36,6 +36,7 @@ import ( "github.com/ElrondNetwork/elrond-go/storage/database" "github.com/ElrondNetwork/elrond-go/storage/storageunit" "github.com/ElrondNetwork/elrond-go/testscommon" + "github.com/ElrondNetwork/elrond-go/testscommon/statusHandler" trieMock "github.com/ElrondNetwork/elrond-go/testscommon/trie" "github.com/ElrondNetwork/elrond-go/trie" trieFactory "github.com/ElrondNetwork/elrond-go/trie/factory" @@ -1065,6 +1066,7 @@ func createAccounts( StoragePruningManager: spm, ProcessingMode: common.Normal, ProcessStatusHandler: &testscommon.ProcessStatusHandlerStub{}, + AppStatusHandler: &statusHandler.AppStatusHandlerStub{}, } adb, _ := state.NewAccountsDB(argsAccountsDB) @@ -2408,6 +2410,7 @@ func createAccountsDBTestSetup() *state.AccountsDB { StoragePruningManager: spm, ProcessingMode: common.Normal, ProcessStatusHandler: &testscommon.ProcessStatusHandlerStub{}, + AppStatusHandler: &statusHandler.AppStatusHandlerStub{}, } adb, _ := state.NewAccountsDB(argsAccountsDB) diff --git a/integrationTests/testInitializer.go b/integrationTests/testInitializer.go index e2048445b80..ba34f92ca8e 100644 --- a/integrationTests/testInitializer.go +++ b/integrationTests/testInitializer.go @@ -59,6 +59,7 @@ import ( dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" "github.com/ElrondNetwork/elrond-go/testscommon/p2pmocks" testStorage "github.com/ElrondNetwork/elrond-go/testscommon/state" + "github.com/ElrondNetwork/elrond-go/testscommon/statusHandler" statusHandlerMock "github.com/ElrondNetwork/elrond-go/testscommon/statusHandler" "github.com/ElrondNetwork/elrond-go/trie" "github.com/ElrondNetwork/elrond-go/trie/hashesHolder" @@ -450,6 +451,7 @@ func CreateAccountsDB( StoragePruningManager: spm, ProcessingMode: common.Normal, ProcessStatusHandler: &testscommon.ProcessStatusHandlerStub{}, + AppStatusHandler: &statusHandler.AppStatusHandlerStub{}, } adb, _ := state.NewAccountsDB(args) diff --git a/node/metrics/metrics.go b/node/metrics/metrics.go index 25f083db4ae..c7cfde27464 100644 --- a/node/metrics/metrics.go +++ b/node/metrics/metrics.go @@ -65,6 +65,7 @@ func InitBaseMetrics(statusHandlerUtils StatusHandlersUtils) error { appStatusHandler.SetStringValue(common.MetricP2PCrossShardObservers, initString) appStatusHandler.SetStringValue(common.MetricP2PFullHistoryObservers, initString) appStatusHandler.SetStringValue(common.MetricP2PUnknownPeers, initString) + appStatusHandler.SetStringValue(common.MetricTrieSnapshotIsProgress, initString) appStatusHandler.SetStringValue(common.MetricInflation, initZeroString) appStatusHandler.SetStringValue(common.MetricDevRewardsInEpoch, initZeroString) diff --git a/state/accountsDB.go b/state/accountsDB.go index 5a4382b97eb..7225c211b11 100644 --- a/state/accountsDB.go +++ b/state/accountsDB.go @@ -6,6 +6,7 @@ import ( "encoding/hex" "fmt" "runtime/debug" + "strconv" "sync" "time" @@ -89,6 +90,7 @@ type AccountsDB struct { shouldSerializeSnapshots bool loadCodeMeasurements *loadingMeasurements processStatusHandler common.ProcessStatusHandler + appStatusHandler core.AppStatusHandler stackDebug []byte } @@ -105,6 +107,7 @@ type ArgsAccountsDB struct { ProcessingMode common.NodeProcessingMode ShouldSerializeSnapshots bool ProcessStatusHandler common.ProcessStatusHandler + AppStatusHandler core.AppStatusHandler } // NewAccountsDB creates a new account manager @@ -114,6 +117,8 @@ func NewAccountsDB(args ArgsAccountsDB) (*AccountsDB, error) { return nil, err } + args.AppStatusHandler.SetStringValue(common.MetricTrieSnapshotIsProgress, strconv.FormatBool(false)) + return createAccountsDb(args), nil } @@ -135,6 +140,7 @@ func createAccountsDb(args ArgsAccountsDB) *AccountsDB { shouldSerializeSnapshots: args.ShouldSerializeSnapshots, lastSnapshot: &snapshotInfo{}, processStatusHandler: args.ProcessStatusHandler, + appStatusHandler: args.AppStatusHandler, isSnapshotInProgress: atomic.Flag{}, } } @@ -158,6 +164,9 @@ func checkArgsAccountsDB(args ArgsAccountsDB) error { if check.IfNil(args.ProcessStatusHandler) { return ErrNilProcessStatusHandler } + if check.IfNil(args.AppStatusHandler) { + return ErrNilAppStatusHandler + } return nil } @@ -1145,6 +1154,7 @@ func (adb *AccountsDB) prepareSnapshot(rootHash []byte) (common.StorageManager, } adb.isSnapshotInProgress.SetValue(true) + adb.appStatusHandler.SetStringValue(common.MetricTrieSnapshotIsProgress, strconv.FormatBool(adb.isSnapshotInProgress.IsSet())) adb.lastSnapshot.rootHash = rootHash adb.lastSnapshot.epoch = epoch err = trieStorageManager.Put([]byte(lastSnapshotStarted), rootHash) @@ -1204,7 +1214,10 @@ func (adb *AccountsDB) processSnapshotCompletion( ) { adb.finishSnapshotOperation(rootHash, stats, missingNodesCh, message, trieStorageManager) - defer adb.isSnapshotInProgress.Reset() + defer func() { + adb.isSnapshotInProgress.Reset() + adb.appStatusHandler.SetStringValue(common.MetricTrieSnapshotIsProgress, strconv.FormatBool(adb.isSnapshotInProgress.IsSet())) + }() containsErrorDuringSnapshot := emptyErrChanReturningHadContained(errChan) shouldNotMarkActive := trieStorageManager.IsClosed() || containsErrorDuringSnapshot diff --git a/state/accountsDB_test.go b/state/accountsDB_test.go index 3ff3dc8266e..1e4961c9342 100644 --- a/state/accountsDB_test.go +++ b/state/accountsDB_test.go @@ -6,12 +6,13 @@ import ( "crypto/rand" "errors" "fmt" - "github.com/ElrondNetwork/elrond-go/common/holders" "strings" "sync" "testing" "time" + "github.com/ElrondNetwork/elrond-go/common/holders" + "github.com/ElrondNetwork/elrond-go-core/core" atomicFlag "github.com/ElrondNetwork/elrond-go-core/core/atomic" "github.com/ElrondNetwork/elrond-go-core/core/check" @@ -27,6 +28,7 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" + "github.com/ElrondNetwork/elrond-go/testscommon/statusHandler" trieMock "github.com/ElrondNetwork/elrond-go/testscommon/trie" "github.com/ElrondNetwork/elrond-go/trie" "github.com/ElrondNetwork/elrond-go/trie/hashesHolder" @@ -54,6 +56,7 @@ func createMockAccountsDBArgs() state.ArgsAccountsDB { StoragePruningManager: disabled.NewDisabledStoragePruningManager(), ProcessingMode: common.Normal, ProcessStatusHandler: &testscommon.ProcessStatusHandlerStub{}, + AppStatusHandler: &statusHandler.AppStatusHandlerStub{}, } } @@ -117,6 +120,7 @@ func getDefaultStateComponents( StoragePruningManager: spm, ProcessingMode: common.Normal, ProcessStatusHandler: &testscommon.ProcessStatusHandlerStub{}, + AppStatusHandler: &statusHandler.AppStatusHandlerStub{}, } adb, _ := state.NewAccountsDB(argsAccountsDB) @@ -186,6 +190,16 @@ func TestNewAccountsDB(t *testing.T) { assert.True(t, check.IfNil(adb)) assert.Equal(t, state.ErrNilProcessStatusHandler, err) }) + t.Run("nil app status handler should error", func(t *testing.T) { + t.Parallel() + + args := createMockAccountsDBArgs() + args.AppStatusHandler = nil + + adb, err := state.NewAccountsDB(args) + assert.True(t, check.IfNil(adb)) + assert.Equal(t, state.ErrNilAppStatusHandler, err) + }) t.Run("should work", func(t *testing.T) { t.Parallel() diff --git a/state/errors.go b/state/errors.go index 89cc3da65e0..fbf993458d1 100644 --- a/state/errors.go +++ b/state/errors.go @@ -144,6 +144,9 @@ var ErrNilRootHash = errors.New("nil root hash") // ErrNilProcessStatusHandler signals that a nil process status handler was provided var ErrNilProcessStatusHandler = errors.New("nil process status handler") +// ErrNilAppStatusHandler signals that a nil app status handler was provided +var ErrNilAppStatusHandler = errors.New("nil app status handler") + // ErrNilBlockInfo signals that a nil block info was provided var ErrNilBlockInfo = errors.New("nil block info") diff --git a/state/factory/accountsAdapterAPICreator_test.go b/state/factory/accountsAdapterAPICreator_test.go index 0c657585eea..ef89b111ae5 100644 --- a/state/factory/accountsAdapterAPICreator_test.go +++ b/state/factory/accountsAdapterAPICreator_test.go @@ -9,6 +9,7 @@ import ( "github.com/ElrondNetwork/elrond-go/state" "github.com/ElrondNetwork/elrond-go/testscommon" mockState "github.com/ElrondNetwork/elrond-go/testscommon/state" + "github.com/ElrondNetwork/elrond-go/testscommon/statusHandler" mockTrie "github.com/ElrondNetwork/elrond-go/testscommon/trie" "github.com/stretchr/testify/assert" ) @@ -26,6 +27,7 @@ func createMockAccountsArgs() state.ArgsAccountsDB { StoragePruningManager: &mockState.StoragePruningManagerStub{}, ProcessingMode: 0, ProcessStatusHandler: &testscommon.ProcessStatusHandlerStub{}, + AppStatusHandler: &statusHandler.AppStatusHandlerStub{}, } } diff --git a/state/storagePruningManager/storagePruningManager_test.go b/state/storagePruningManager/storagePruningManager_test.go index 0f4c19fe572..69b51c38c8c 100644 --- a/state/storagePruningManager/storagePruningManager_test.go +++ b/state/storagePruningManager/storagePruningManager_test.go @@ -10,6 +10,7 @@ import ( "github.com/ElrondNetwork/elrond-go/state/storagePruningManager/evictionWaitingList" "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" + "github.com/ElrondNetwork/elrond-go/testscommon/statusHandler" "github.com/ElrondNetwork/elrond-go/trie" "github.com/ElrondNetwork/elrond-go/trie/hashesHolder" "github.com/stretchr/testify/assert" @@ -45,6 +46,7 @@ func getDefaultTrieAndAccountsDbAndStoragePruningManager() (common.Trie, *state. StoragePruningManager: spm, ProcessingMode: common.Normal, ProcessStatusHandler: &testscommon.ProcessStatusHandlerStub{}, + AppStatusHandler: &statusHandler.AppStatusHandlerStub{}, } adb, _ := state.NewAccountsDB(argsAccountsDB) From 7a693ff50714d05b1e2c33489d7daeaaef4acefb Mon Sep 17 00:00:00 2001 From: ssd04 Date: Thu, 6 Oct 2022 18:34:00 +0300 Subject: [PATCH 006/110] add metric for trie snapshot start time --- common/constants.go | 3 +++ node/metrics/metrics.go | 3 +++ node/metrics/metrics_test.go | 6 ++++++ state/accountsDB.go | 2 ++ state/snapshotStatistics.go | 5 +++++ 5 files changed, 19 insertions(+) diff --git a/common/constants.go b/common/constants.go index 319178bc879..927d30183bf 100644 --- a/common/constants.go +++ b/common/constants.go @@ -820,3 +820,6 @@ const MaxIndexOfTxInMiniBlock = int32(29999) // MetricTrieSnapshotIsProgress is the metric that outputs the status of the trie snapshot, if it's in progress or not const MetricTrieSnapshotIsProgress = "erd_trie_snapshot_in_progress" + +// MetricTrieSnapshotStartTime is the metric that outputs the start time of the trie snapshot, if it is in progress +const MetricTrieSnapshotStartTime = "erd_trie_snapshot_start_time" diff --git a/node/metrics/metrics.go b/node/metrics/metrics.go index c7cfde27464..2c60dc6288a 100644 --- a/node/metrics/metrics.go +++ b/node/metrics/metrics.go @@ -14,6 +14,7 @@ import ( const millisecondsInSecond = 1000 const initUint = uint64(0) +const initInt = int64(0) const initString = "" const initZeroString = "0" @@ -51,6 +52,8 @@ func InitBaseMetrics(statusHandlerUtils StatusHandlersUtils) error { appStatusHandler.SetUInt64Value(common.MetricNumConnectedPeers, initUint) appStatusHandler.SetUInt64Value(common.MetricEpochForEconomicsData, initUint) + appStatusHandler.SetInt64Value(common.MetricTrieSnapshotStartTime, initInt) + appStatusHandler.SetStringValue(common.MetricConsensusState, initString) appStatusHandler.SetStringValue(common.MetricConsensusRoundState, initString) appStatusHandler.SetStringValue(common.MetricCurrentBlockHash, initString) diff --git a/node/metrics/metrics_test.go b/node/metrics/metrics_test.go index 7d3a7a86b1e..676181402b4 100644 --- a/node/metrics/metrics_test.go +++ b/node/metrics/metrics_test.go @@ -54,6 +54,8 @@ func TestInitBaseMetrics(t *testing.T) { common.MetricInflation, common.MetricDevRewardsInEpoch, common.MetricTotalFees, + common.MetricTrieSnapshotIsProgress, + common.MetricTrieSnapshotStartTime, } keys := make(map[string]struct{}) @@ -68,6 +70,10 @@ func TestInitBaseMetrics(t *testing.T) { require.Equal(t, value, initUint) keys[key] = struct{}{} }, + SetInt64ValueHandler: func(key string, value int64) { + require.Equal(t, value, initInt) + keys[key] = struct{}{} + }, } sm := &statusHandler.StatusHandlersUtilsMock{ diff --git a/state/accountsDB.go b/state/accountsDB.go index 7225c211b11..d403ba10bd1 100644 --- a/state/accountsDB.go +++ b/state/accountsDB.go @@ -1119,6 +1119,7 @@ func (adb *AccountsDB) SnapshotState(rootHash []byte) { missingNodesChannel := make(chan []byte, missingNodesChannelSize) errChan := make(chan error, 1) stats := newSnapshotStatistics(1, 1) + adb.appStatusHandler.SetInt64Value(common.MetricTrieSnapshotStartTime, stats.GetUnixStartTime()) go func() { leavesChannel := make(chan core.KeyValueHolder, leavesChannelSize) stats.NewSnapshotStarted() @@ -1217,6 +1218,7 @@ func (adb *AccountsDB) processSnapshotCompletion( defer func() { adb.isSnapshotInProgress.Reset() adb.appStatusHandler.SetStringValue(common.MetricTrieSnapshotIsProgress, strconv.FormatBool(adb.isSnapshotInProgress.IsSet())) + adb.appStatusHandler.SetInt64Value(common.MetricTrieSnapshotStartTime, 0) }() containsErrorDuringSnapshot := emptyErrChanReturningHadContained(errChan) diff --git a/state/snapshotStatistics.go b/state/snapshotStatistics.go index 8bc57a8e9bf..cb6c1848a33 100644 --- a/state/snapshotStatistics.go +++ b/state/snapshotStatistics.go @@ -73,6 +73,11 @@ func (ss *snapshotStatistics) SyncFinished() { ss.wgSync.Done() } +// GetUnixStartTime will get the start time in unix format +func (ss *snapshotStatistics) GetUnixStartTime() int64 { + return ss.startTime.Unix() +} + // PrintStats will print the stats after the snapshot has finished func (ss *snapshotStatistics) PrintStats(identifier string, rootHash []byte) { ss.mutex.RLock() From 2ed395dea914babd5a862c2b484c45e3f7a4b947 Mon Sep 17 00:00:00 2001 From: ssd04 Date: Thu, 6 Oct 2022 23:08:11 +0300 Subject: [PATCH 007/110] fix vm integration tests initializer --- integrationTests/vm/testInitializer.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/integrationTests/vm/testInitializer.go b/integrationTests/vm/testInitializer.go index dc76d4418f5..c2c8eba1cba 100644 --- a/integrationTests/vm/testInitializer.go +++ b/integrationTests/vm/testInitializer.go @@ -58,6 +58,7 @@ import ( dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" "github.com/ElrondNetwork/elrond-go/testscommon/shardingMocks" + "github.com/ElrondNetwork/elrond-go/testscommon/statusHandler" storageStubs "github.com/ElrondNetwork/elrond-go/testscommon/storage" "github.com/ElrondNetwork/elrond-go/testscommon/txDataBuilder" "github.com/ElrondNetwork/elrond-go/trie" @@ -318,6 +319,7 @@ func CreateInMemoryShardAccountsDB() *state.AccountsDB { StoragePruningManager: spm, ProcessingMode: common.Normal, ProcessStatusHandler: &testscommon.ProcessStatusHandlerStub{}, + AppStatusHandler: &statusHandler.AppStatusHandlerStub{}, } adb, _ := state.NewAccountsDB(argsAccountsDB) From bce49f82eca1413c4f8d621ba9398f8b81a27cfc Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Fri, 7 Oct 2022 17:39:56 +0300 Subject: [PATCH 008/110] added back missing disabled resolver --- .../baseResolversContainerFactory.go | 7 +++++++ .../metaResolversContainerFactory.go | 5 +++++ .../metaResolversContainerFactory_test.go | 4 +++- .../shardResolversContainerFactory.go | 5 +++++ .../shardResolversContainerFactory_test.go | 4 +++- 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/dataRetriever/factory/storageResolversContainer/baseResolversContainerFactory.go b/dataRetriever/factory/storageResolversContainer/baseResolversContainerFactory.go index 8dcaa92265f..35580621819 100644 --- a/dataRetriever/factory/storageResolversContainer/baseResolversContainerFactory.go +++ b/dataRetriever/factory/storageResolversContainer/baseResolversContainerFactory.go @@ -240,3 +240,10 @@ func (brcf *baseResolversContainerFactory) generatePeerAuthenticationResolver() return brcf.container.Add(identifierPeerAuth, peerAuthResolver) } + +func (brcf *baseResolversContainerFactory) generateValidatorInfoResolver() error { + identifierValidatorInfo := common.ValidatorInfoTopic + validatorInfoResolver := disabledResolvers.NewDisabledValidatorInfoResolver() + + return brcf.container.Add(identifierValidatorInfo, validatorInfoResolver) +} diff --git a/dataRetriever/factory/storageResolversContainer/metaResolversContainerFactory.go b/dataRetriever/factory/storageResolversContainer/metaResolversContainerFactory.go index 98badcbf5bb..cb6a819cf10 100644 --- a/dataRetriever/factory/storageResolversContainer/metaResolversContainerFactory.go +++ b/dataRetriever/factory/storageResolversContainer/metaResolversContainerFactory.go @@ -99,6 +99,11 @@ func (mrcf *metaResolversContainerFactory) Create() (dataRetriever.ResolversCont return nil, err } + err = mrcf.generateValidatorInfoResolver() + if err != nil { + return nil, err + } + return mrcf.container, nil } diff --git a/dataRetriever/factory/storageResolversContainer/metaResolversContainerFactory_test.go b/dataRetriever/factory/storageResolversContainer/metaResolversContainerFactory_test.go index 80642bd968e..e8baaf6a6b2 100644 --- a/dataRetriever/factory/storageResolversContainer/metaResolversContainerFactory_test.go +++ b/dataRetriever/factory/storageResolversContainer/metaResolversContainerFactory_test.go @@ -170,8 +170,10 @@ func TestMetaResolversContainerFactory_With4ShardsShouldWork(t *testing.T) { numResolversTxs := noOfShards + 1 numResolversTrieNodes := 2 numPeerAuthentication := 1 + numValidatorInfo := 1 totalResolvers := numResolversShardHeadersForMetachain + numResolverMetablocks + numResolversMiniBlocks + - numResolversUnsigned + numResolversTxs + numResolversTrieNodes + numResolversRewards + numPeerAuthentication + numResolversUnsigned + numResolversTxs + numResolversTrieNodes + numResolversRewards + numPeerAuthentication + + numValidatorInfo assert.Equal(t, totalResolvers, container.Len()) assert.Equal(t, totalResolvers, container.Len()) diff --git a/dataRetriever/factory/storageResolversContainer/shardResolversContainerFactory.go b/dataRetriever/factory/storageResolversContainer/shardResolversContainerFactory.go index 000ff9fae0e..e57968445fb 100644 --- a/dataRetriever/factory/storageResolversContainer/shardResolversContainerFactory.go +++ b/dataRetriever/factory/storageResolversContainer/shardResolversContainerFactory.go @@ -99,6 +99,11 @@ func (srcf *shardResolversContainerFactory) Create() (dataRetriever.ResolversCon return nil, err } + err = srcf.generateValidatorInfoResolver() + if err != nil { + return nil, err + } + return srcf.container, nil } diff --git a/dataRetriever/factory/storageResolversContainer/shardResolversContainerFactory_test.go b/dataRetriever/factory/storageResolversContainer/shardResolversContainerFactory_test.go index ada3ae77ad6..4d927946317 100644 --- a/dataRetriever/factory/storageResolversContainer/shardResolversContainerFactory_test.go +++ b/dataRetriever/factory/storageResolversContainer/shardResolversContainerFactory_test.go @@ -174,8 +174,10 @@ func TestShardResolversContainerFactory_With4ShardsShouldWork(t *testing.T) { numResolverMetaBlockHeaders := 1 numResolverTrieNodes := 1 numPeerAuthentication := 1 + numValidatorInfo := 1 totalResolvers := numResolverTxs + numResolverHeaders + numResolverMiniBlocks + - numResolverMetaBlockHeaders + numResolverSCRs + numResolverRewardTxs + numResolverTrieNodes + numPeerAuthentication + numResolverMetaBlockHeaders + numResolverSCRs + numResolverRewardTxs + numResolverTrieNodes + + numPeerAuthentication + numValidatorInfo assert.Equal(t, totalResolvers, container.Len()) } From ace4b227627595a49eb445c44ac57d8ac2a0dbb7 Mon Sep 17 00:00:00 2001 From: ssd04 Date: Mon, 10 Oct 2022 09:10:05 +0300 Subject: [PATCH 009/110] change trie snapshot start time metric to last duration --- common/constants.go | 4 ++-- node/metrics/metrics.go | 2 +- node/metrics/metrics_test.go | 2 +- state/accountsDB.go | 4 ++-- state/snapshotStatistics.go | 6 +++--- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/common/constants.go b/common/constants.go index 927d30183bf..e325417efdc 100644 --- a/common/constants.go +++ b/common/constants.go @@ -821,5 +821,5 @@ const MaxIndexOfTxInMiniBlock = int32(29999) // MetricTrieSnapshotIsProgress is the metric that outputs the status of the trie snapshot, if it's in progress or not const MetricTrieSnapshotIsProgress = "erd_trie_snapshot_in_progress" -// MetricTrieSnapshotStartTime is the metric that outputs the start time of the trie snapshot, if it is in progress -const MetricTrieSnapshotStartTime = "erd_trie_snapshot_start_time" +// MetricTrieSnapshotLastDurationSec is the metric that outputs the duration in seconds of the last snapshot, if snapshot is in progress it will be set to 0 +const MetricTrieSnapshotLastDurationSec = "erd_trie_snapshot_last_duration_in_seconds" diff --git a/node/metrics/metrics.go b/node/metrics/metrics.go index 2c60dc6288a..05b35c897bc 100644 --- a/node/metrics/metrics.go +++ b/node/metrics/metrics.go @@ -52,7 +52,7 @@ func InitBaseMetrics(statusHandlerUtils StatusHandlersUtils) error { appStatusHandler.SetUInt64Value(common.MetricNumConnectedPeers, initUint) appStatusHandler.SetUInt64Value(common.MetricEpochForEconomicsData, initUint) - appStatusHandler.SetInt64Value(common.MetricTrieSnapshotStartTime, initInt) + appStatusHandler.SetInt64Value(common.MetricTrieSnapshotLastDurationSec, initInt) appStatusHandler.SetStringValue(common.MetricConsensusState, initString) appStatusHandler.SetStringValue(common.MetricConsensusRoundState, initString) diff --git a/node/metrics/metrics_test.go b/node/metrics/metrics_test.go index 676181402b4..cf270b5414f 100644 --- a/node/metrics/metrics_test.go +++ b/node/metrics/metrics_test.go @@ -55,7 +55,7 @@ func TestInitBaseMetrics(t *testing.T) { common.MetricDevRewardsInEpoch, common.MetricTotalFees, common.MetricTrieSnapshotIsProgress, - common.MetricTrieSnapshotStartTime, + common.MetricTrieSnapshotLastDurationSec, } keys := make(map[string]struct{}) diff --git a/state/accountsDB.go b/state/accountsDB.go index d403ba10bd1..a0c4ec70814 100644 --- a/state/accountsDB.go +++ b/state/accountsDB.go @@ -1119,7 +1119,7 @@ func (adb *AccountsDB) SnapshotState(rootHash []byte) { missingNodesChannel := make(chan []byte, missingNodesChannelSize) errChan := make(chan error, 1) stats := newSnapshotStatistics(1, 1) - adb.appStatusHandler.SetInt64Value(common.MetricTrieSnapshotStartTime, stats.GetUnixStartTime()) + adb.appStatusHandler.SetInt64Value(common.MetricTrieSnapshotLastDurationSec, 0) go func() { leavesChannel := make(chan core.KeyValueHolder, leavesChannelSize) stats.NewSnapshotStarted() @@ -1218,7 +1218,7 @@ func (adb *AccountsDB) processSnapshotCompletion( defer func() { adb.isSnapshotInProgress.Reset() adb.appStatusHandler.SetStringValue(common.MetricTrieSnapshotIsProgress, strconv.FormatBool(adb.isSnapshotInProgress.IsSet())) - adb.appStatusHandler.SetInt64Value(common.MetricTrieSnapshotStartTime, 0) + adb.appStatusHandler.SetInt64Value(common.MetricTrieSnapshotLastDurationSec, stats.GetSnapshotDuration()) }() containsErrorDuringSnapshot := emptyErrChanReturningHadContained(errChan) diff --git a/state/snapshotStatistics.go b/state/snapshotStatistics.go index cb6c1848a33..e554c515a93 100644 --- a/state/snapshotStatistics.go +++ b/state/snapshotStatistics.go @@ -73,9 +73,9 @@ func (ss *snapshotStatistics) SyncFinished() { ss.wgSync.Done() } -// GetUnixStartTime will get the start time in unix format -func (ss *snapshotStatistics) GetUnixStartTime() int64 { - return ss.startTime.Unix() +// GetSnapshotDuration will get the duration in seconds of the last snapshot +func (ss *snapshotStatistics) GetSnapshotDuration() int64 { + return int64(time.Since(ss.startTime).Truncate(time.Second).Seconds()) } // PrintStats will print the stats after the snapshot has finished From bc5db61e197d480b5695f318045ed791d0c32306 Mon Sep 17 00:00:00 2001 From: ssd04 Date: Tue, 11 Oct 2022 11:49:13 +0300 Subject: [PATCH 010/110] fix reference in accounts db unit tests --- state/accountsDB_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/state/accountsDB_test.go b/state/accountsDB_test.go index 1e4961c9342..3a8ba83565f 100644 --- a/state/accountsDB_test.go +++ b/state/accountsDB_test.go @@ -11,13 +11,12 @@ import ( "testing" "time" - "github.com/ElrondNetwork/elrond-go/common/holders" - "github.com/ElrondNetwork/elrond-go-core/core" atomicFlag "github.com/ElrondNetwork/elrond-go-core/core/atomic" "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-core/marshal" "github.com/ElrondNetwork/elrond-go/common" + "github.com/ElrondNetwork/elrond-go/common/holders" "github.com/ElrondNetwork/elrond-go/config" "github.com/ElrondNetwork/elrond-go/process/mock" "github.com/ElrondNetwork/elrond-go/state" From f3646e6c6bd80a04d8c5c049a5ba32ba611b1dd9 Mon Sep 17 00:00:00 2001 From: ssd04 Date: Tue, 11 Oct 2022 15:07:05 +0300 Subject: [PATCH 011/110] fix after review: last snapshot metric renaming --- common/constants.go | 4 ++-- node/metrics/metrics.go | 2 +- node/metrics/metrics_test.go | 2 +- state/accountsDB.go | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/common/constants.go b/common/constants.go index e325417efdc..7abcbb9b1e4 100644 --- a/common/constants.go +++ b/common/constants.go @@ -821,5 +821,5 @@ const MaxIndexOfTxInMiniBlock = int32(29999) // MetricTrieSnapshotIsProgress is the metric that outputs the status of the trie snapshot, if it's in progress or not const MetricTrieSnapshotIsProgress = "erd_trie_snapshot_in_progress" -// MetricTrieSnapshotLastDurationSec is the metric that outputs the duration in seconds of the last snapshot, if snapshot is in progress it will be set to 0 -const MetricTrieSnapshotLastDurationSec = "erd_trie_snapshot_last_duration_in_seconds" +// MetricLastTrieSnapshotDurationSec is the metric that outputs the duration in seconds of the last snapshot, if snapshot is in progress it will be set to 0 +const MetricLastTrieSnapshotDurationSec = "erd_trie_snapshot_last_duration_in_seconds" diff --git a/node/metrics/metrics.go b/node/metrics/metrics.go index 05b35c897bc..f6ead650021 100644 --- a/node/metrics/metrics.go +++ b/node/metrics/metrics.go @@ -52,7 +52,7 @@ func InitBaseMetrics(statusHandlerUtils StatusHandlersUtils) error { appStatusHandler.SetUInt64Value(common.MetricNumConnectedPeers, initUint) appStatusHandler.SetUInt64Value(common.MetricEpochForEconomicsData, initUint) - appStatusHandler.SetInt64Value(common.MetricTrieSnapshotLastDurationSec, initInt) + appStatusHandler.SetInt64Value(common.MetricLastTrieSnapshotDurationSec, initInt) appStatusHandler.SetStringValue(common.MetricConsensusState, initString) appStatusHandler.SetStringValue(common.MetricConsensusRoundState, initString) diff --git a/node/metrics/metrics_test.go b/node/metrics/metrics_test.go index cf270b5414f..56a1099ffe2 100644 --- a/node/metrics/metrics_test.go +++ b/node/metrics/metrics_test.go @@ -55,7 +55,7 @@ func TestInitBaseMetrics(t *testing.T) { common.MetricDevRewardsInEpoch, common.MetricTotalFees, common.MetricTrieSnapshotIsProgress, - common.MetricTrieSnapshotLastDurationSec, + common.MetricLastTrieSnapshotDurationSec, } keys := make(map[string]struct{}) diff --git a/state/accountsDB.go b/state/accountsDB.go index 169c07080ba..3d2eff73bda 100644 --- a/state/accountsDB.go +++ b/state/accountsDB.go @@ -1121,7 +1121,7 @@ func (adb *AccountsDB) SnapshotState(rootHash []byte) { missingNodesChannel := make(chan []byte, missingNodesChannelSize) errChan := make(chan error, 1) stats := newSnapshotStatistics(1, 1) - adb.appStatusHandler.SetInt64Value(common.MetricTrieSnapshotLastDurationSec, 0) + adb.appStatusHandler.SetInt64Value(common.MetricLastTrieSnapshotDurationSec, 0) go func() { leavesChannel := make(chan core.KeyValueHolder, leavesChannelSize) stats.NewSnapshotStarted() @@ -1220,7 +1220,7 @@ func (adb *AccountsDB) processSnapshotCompletion( defer func() { adb.isSnapshotInProgress.Reset() adb.appStatusHandler.SetStringValue(common.MetricTrieSnapshotIsProgress, strconv.FormatBool(adb.isSnapshotInProgress.IsSet())) - adb.appStatusHandler.SetInt64Value(common.MetricTrieSnapshotLastDurationSec, stats.GetSnapshotDuration()) + adb.appStatusHandler.SetInt64Value(common.MetricLastTrieSnapshotDurationSec, stats.GetSnapshotDuration()) }() containsErrorDuringSnapshot := emptyErrChanReturningHadContained(errChan) From 244cd11805a1c05c19de5786c44df58af678325e Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Thu, 13 Oct 2022 12:14:23 +0300 Subject: [PATCH 012/110] added real storage resolver for validator info deleted disabled validator info resolver update currentEpochValidatorInfoPool to return a copy of the element on getter --- .../dataPool/currentEpochValidatorInfoPool.go | 10 ++-- .../currentEpochValidatorInfoPool_test.go | 5 ++ .../baseResolversContainerFactory.go | 20 ++++++- .../disabled/validatorInfoResolver.go | 54 ------------------- .../disabled/validatorInfoResolver_test.go | 47 ---------------- .../storageResolvers/sliceResolver.go | 8 +-- 6 files changed, 34 insertions(+), 110 deletions(-) delete mode 100644 dataRetriever/resolvers/disabled/validatorInfoResolver.go delete mode 100644 dataRetriever/resolvers/disabled/validatorInfoResolver_test.go diff --git a/dataRetriever/dataPool/currentEpochValidatorInfoPool.go b/dataRetriever/dataPool/currentEpochValidatorInfoPool.go index 34ba5a841ab..14c6dd0fa74 100644 --- a/dataRetriever/dataPool/currentEpochValidatorInfoPool.go +++ b/dataRetriever/dataPool/currentEpochValidatorInfoPool.go @@ -12,21 +12,21 @@ var _ dataRetriever.ValidatorInfoCacher = (*validatorInfoMapCacher)(nil) type validatorInfoMapCacher struct { mutValidatorInfo sync.RWMutex - validatorInfoForEpoch map[string]*state.ShardValidatorInfo + validatorInfoForEpoch map[string]state.ShardValidatorInfo } // NewCurrentEpochValidatorInfoPool returns a new validator info pool to be used for the current epoch func NewCurrentEpochValidatorInfoPool() *validatorInfoMapCacher { return &validatorInfoMapCacher{ mutValidatorInfo: sync.RWMutex{}, - validatorInfoForEpoch: make(map[string]*state.ShardValidatorInfo), + validatorInfoForEpoch: make(map[string]state.ShardValidatorInfo), } } // Clean creates a new validator info pool func (vimc *validatorInfoMapCacher) Clean() { vimc.mutValidatorInfo.Lock() - vimc.validatorInfoForEpoch = make(map[string]*state.ShardValidatorInfo) + vimc.validatorInfoForEpoch = make(map[string]state.ShardValidatorInfo) vimc.mutValidatorInfo.Unlock() } @@ -40,7 +40,7 @@ func (vimc *validatorInfoMapCacher) GetValidatorInfo(validatorInfoHash []byte) ( return nil, dataRetriever.ErrValidatorInfoNotFoundInEpochPool } - return validatorInfo, nil + return &validatorInfo, nil } // AddValidatorInfo adds the validator info for the given hash @@ -50,7 +50,7 @@ func (vimc *validatorInfoMapCacher) AddValidatorInfo(validatorInfoHash []byte, v } vimc.mutValidatorInfo.Lock() - vimc.validatorInfoForEpoch[string(validatorInfoHash)] = validatorInfo + vimc.validatorInfoForEpoch[string(validatorInfoHash)] = *validatorInfo vimc.mutValidatorInfo.Unlock() } diff --git a/dataRetriever/dataPool/currentEpochValidatorInfoPool_test.go b/dataRetriever/dataPool/currentEpochValidatorInfoPool_test.go index 0337e815ddf..774dd72fdc3 100644 --- a/dataRetriever/dataPool/currentEpochValidatorInfoPool_test.go +++ b/dataRetriever/dataPool/currentEpochValidatorInfoPool_test.go @@ -27,6 +27,11 @@ func TestCurrentEpochValidatorInfoPool_AddGetCleanTx(t *testing.T) { require.Nil(t, err) require.Equal(t, validatorInfo, validatorInfoFromPool) + validatorInfoFromPool.Index++ + validatorInfoFromPool2, err := currentValidatorInfoPool.GetValidatorInfo(validatorInfoHash) + require.Nil(t, err) + require.NotEqual(t, validatorInfoFromPool, validatorInfoFromPool2) + currentValidatorInfoPool.Clean() validatorInfoFromPool, err = currentValidatorInfoPool.GetValidatorInfo(validatorInfoHash) require.Nil(t, validatorInfoFromPool) diff --git a/dataRetriever/factory/storageResolversContainer/baseResolversContainerFactory.go b/dataRetriever/factory/storageResolversContainer/baseResolversContainerFactory.go index 35580621819..42c445394ab 100644 --- a/dataRetriever/factory/storageResolversContainer/baseResolversContainerFactory.go +++ b/dataRetriever/factory/storageResolversContainer/baseResolversContainerFactory.go @@ -242,8 +242,26 @@ func (brcf *baseResolversContainerFactory) generatePeerAuthenticationResolver() } func (brcf *baseResolversContainerFactory) generateValidatorInfoResolver() error { + validatorInfoStorer, err := brcf.store.GetStorer(dataRetriever.UnsignedTransactionUnit) + if err != nil { + return err + } + identifierValidatorInfo := common.ValidatorInfoTopic - validatorInfoResolver := disabledResolvers.NewDisabledValidatorInfoResolver() + arg := storageResolvers.ArgSliceResolver{ + Messenger: brcf.messenger, + ResponseTopicName: identifierValidatorInfo, + Storage: validatorInfoStorer, + DataPacker: brcf.dataPacker, + Marshalizer: brcf.marshalizer, + ManualEpochStartNotifier: brcf.manualEpochStartNotifier, + ChanGracefullyClose: brcf.chanGracefullyClose, + DelayBeforeGracefulClose: defaultBeforeGracefulClose, + } + validatorInfoResolver, err := storageResolvers.NewSliceResolver(arg) + if err != nil { + return err + } return brcf.container.Add(identifierValidatorInfo, validatorInfoResolver) } diff --git a/dataRetriever/resolvers/disabled/validatorInfoResolver.go b/dataRetriever/resolvers/disabled/validatorInfoResolver.go deleted file mode 100644 index c6322fe3051..00000000000 --- a/dataRetriever/resolvers/disabled/validatorInfoResolver.go +++ /dev/null @@ -1,54 +0,0 @@ -package disabled - -import ( - "github.com/ElrondNetwork/elrond-go-core/core" - "github.com/ElrondNetwork/elrond-go/dataRetriever" - "github.com/ElrondNetwork/elrond-go/p2p" -) - -type validatorInfoResolver struct { -} - -// NewDisabledValidatorInfoResolver creates a new disabled validator info resolver instance -func NewDisabledValidatorInfoResolver() *validatorInfoResolver { - return &validatorInfoResolver{} -} - -// RequestDataFromHash does nothing and returns nil -func (res *validatorInfoResolver) RequestDataFromHash(_ []byte, _ uint32) error { - return nil -} - -// RequestDataFromHashArray does nothing and returns nil -func (res *validatorInfoResolver) RequestDataFromHashArray(_ [][]byte, _ uint32) error { - return nil -} - -// ProcessReceivedMessage does nothing and returns nil -func (res *validatorInfoResolver) ProcessReceivedMessage(_ p2p.MessageP2P, _ core.PeerID) error { - return nil -} - -// SetResolverDebugHandler does nothing and returns nil -func (res *validatorInfoResolver) SetResolverDebugHandler(_ dataRetriever.ResolverDebugHandler) error { - return nil -} - -// SetNumPeersToQuery does nothing -func (res *validatorInfoResolver) SetNumPeersToQuery(_ int, _ int) { -} - -// NumPeersToQuery returns 0 and 0 -func (res *validatorInfoResolver) NumPeersToQuery() (int, int) { - return 0, 0 -} - -// Close does nothing and returns nil -func (res *validatorInfoResolver) Close() error { - return nil -} - -// IsInterfaceNil returns true if there is no value under the interface -func (res *validatorInfoResolver) IsInterfaceNil() bool { - return res == nil -} diff --git a/dataRetriever/resolvers/disabled/validatorInfoResolver_test.go b/dataRetriever/resolvers/disabled/validatorInfoResolver_test.go deleted file mode 100644 index cdd43fda758..00000000000 --- a/dataRetriever/resolvers/disabled/validatorInfoResolver_test.go +++ /dev/null @@ -1,47 +0,0 @@ -package disabled - -import ( - "fmt" - "testing" - - "github.com/ElrondNetwork/elrond-go-core/core/check" - "github.com/stretchr/testify/assert" -) - -func TestNewDisabledValidatorInfoResolver(t *testing.T) { - t.Parallel() - - resolver := NewDisabledValidatorInfoResolver() - assert.False(t, check.IfNil(resolver)) -} - -func Test_validatorInfoResolver_SetResolverDebugHandler(t *testing.T) { - t.Parallel() - - defer func() { - r := recover() - if r != nil { - assert.Fail(t, fmt.Sprintf("should have not failed %v", r)) - } - }() - - resolver := NewDisabledValidatorInfoResolver() - - err := resolver.RequestDataFromHash(nil, 0) - assert.Nil(t, err) - - err = resolver.RequestDataFromHashArray(nil, 0) - assert.Nil(t, err) - - err = resolver.SetResolverDebugHandler(nil) - assert.Nil(t, err) - - value1, value2 := resolver.NumPeersToQuery() - assert.Zero(t, value1) - assert.Zero(t, value2) - - err = resolver.Close() - assert.Nil(t, err) - - resolver.SetNumPeersToQuery(100, 100) -} diff --git a/dataRetriever/storageResolvers/sliceResolver.go b/dataRetriever/storageResolvers/sliceResolver.go index 6b58ec877cb..72892ccc296 100644 --- a/dataRetriever/storageResolvers/sliceResolver.go +++ b/dataRetriever/storageResolvers/sliceResolver.go @@ -98,9 +98,10 @@ func (sliceRes *sliceResolver) RequestDataFromHashArray(hashes [][]byte, _ uint3 mb, errTemp := sliceRes.storage.Get(hash) if errTemp != nil { errFetch = fmt.Errorf("%w for hash %s", errTemp, logger.DisplayByteSlice(hash)) - log.Trace("fetchMbAsByteSlice missing", + log.Trace("fetchByteSlice missing", "error", errFetch.Error(), - "hash", hash) + "hash", hash, + "topic", sliceRes.responseTopicName) errorsFound++ continue @@ -121,7 +122,8 @@ func (sliceRes *sliceResolver) RequestDataFromHashArray(hashes [][]byte, _ uint3 } if errFetch != nil { - errFetch = fmt.Errorf("resolveMbRequestByHashArray last error %w from %d encountered errors", errFetch, errorsFound) + errFetch = fmt.Errorf("resolveRequestByHashArray on topic %s, last error %w from %d encountered errors", + sliceRes.responseTopicName, errFetch, errorsFound) sliceRes.signalGracefullyClose() } From d3e5db49f0e74d31fcf0330e9447e431e67469cc Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Thu, 13 Oct 2022 12:43:31 +0300 Subject: [PATCH 013/110] reverted changes on currentEpochValidatorInfoPool --- .../dataPool/currentEpochValidatorInfoPool.go | 10 +++++----- .../dataPool/currentEpochValidatorInfoPool_test.go | 5 ----- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/dataRetriever/dataPool/currentEpochValidatorInfoPool.go b/dataRetriever/dataPool/currentEpochValidatorInfoPool.go index 14c6dd0fa74..34ba5a841ab 100644 --- a/dataRetriever/dataPool/currentEpochValidatorInfoPool.go +++ b/dataRetriever/dataPool/currentEpochValidatorInfoPool.go @@ -12,21 +12,21 @@ var _ dataRetriever.ValidatorInfoCacher = (*validatorInfoMapCacher)(nil) type validatorInfoMapCacher struct { mutValidatorInfo sync.RWMutex - validatorInfoForEpoch map[string]state.ShardValidatorInfo + validatorInfoForEpoch map[string]*state.ShardValidatorInfo } // NewCurrentEpochValidatorInfoPool returns a new validator info pool to be used for the current epoch func NewCurrentEpochValidatorInfoPool() *validatorInfoMapCacher { return &validatorInfoMapCacher{ mutValidatorInfo: sync.RWMutex{}, - validatorInfoForEpoch: make(map[string]state.ShardValidatorInfo), + validatorInfoForEpoch: make(map[string]*state.ShardValidatorInfo), } } // Clean creates a new validator info pool func (vimc *validatorInfoMapCacher) Clean() { vimc.mutValidatorInfo.Lock() - vimc.validatorInfoForEpoch = make(map[string]state.ShardValidatorInfo) + vimc.validatorInfoForEpoch = make(map[string]*state.ShardValidatorInfo) vimc.mutValidatorInfo.Unlock() } @@ -40,7 +40,7 @@ func (vimc *validatorInfoMapCacher) GetValidatorInfo(validatorInfoHash []byte) ( return nil, dataRetriever.ErrValidatorInfoNotFoundInEpochPool } - return &validatorInfo, nil + return validatorInfo, nil } // AddValidatorInfo adds the validator info for the given hash @@ -50,7 +50,7 @@ func (vimc *validatorInfoMapCacher) AddValidatorInfo(validatorInfoHash []byte, v } vimc.mutValidatorInfo.Lock() - vimc.validatorInfoForEpoch[string(validatorInfoHash)] = *validatorInfo + vimc.validatorInfoForEpoch[string(validatorInfoHash)] = validatorInfo vimc.mutValidatorInfo.Unlock() } diff --git a/dataRetriever/dataPool/currentEpochValidatorInfoPool_test.go b/dataRetriever/dataPool/currentEpochValidatorInfoPool_test.go index 774dd72fdc3..0337e815ddf 100644 --- a/dataRetriever/dataPool/currentEpochValidatorInfoPool_test.go +++ b/dataRetriever/dataPool/currentEpochValidatorInfoPool_test.go @@ -27,11 +27,6 @@ func TestCurrentEpochValidatorInfoPool_AddGetCleanTx(t *testing.T) { require.Nil(t, err) require.Equal(t, validatorInfo, validatorInfoFromPool) - validatorInfoFromPool.Index++ - validatorInfoFromPool2, err := currentValidatorInfoPool.GetValidatorInfo(validatorInfoHash) - require.Nil(t, err) - require.NotEqual(t, validatorInfoFromPool, validatorInfoFromPool2) - currentValidatorInfoPool.Clean() validatorInfoFromPool, err = currentValidatorInfoPool.GetValidatorInfo(validatorInfoHash) require.Nil(t, validatorInfoFromPool) From eea8c41421732eefa498d4948e2eb68e766fd5e2 Mon Sep 17 00:00:00 2001 From: Darius Date: Fri, 14 Oct 2022 10:36:32 +0300 Subject: [PATCH 014/110] Update common/constants.go Co-authored-by: mariusmihaic <82832880+mariusmihaic@users.noreply.github.com> --- common/constants.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/constants.go b/common/constants.go index 7abcbb9b1e4..0146484fb3c 100644 --- a/common/constants.go +++ b/common/constants.go @@ -821,5 +821,5 @@ const MaxIndexOfTxInMiniBlock = int32(29999) // MetricTrieSnapshotIsProgress is the metric that outputs the status of the trie snapshot, if it's in progress or not const MetricTrieSnapshotIsProgress = "erd_trie_snapshot_in_progress" -// MetricLastTrieSnapshotDurationSec is the metric that outputs the duration in seconds of the last snapshot, if snapshot is in progress it will be set to 0 +// MetricLastTrieSnapshotDurationSec is the metric that outputs the duration in seconds of the last snapshot. If snapshot is in progress it will be set to 0 const MetricLastTrieSnapshotDurationSec = "erd_trie_snapshot_last_duration_in_seconds" From ec31579d6316fccc246226f39fd0707295487af9 Mon Sep 17 00:00:00 2001 From: ssd04 Date: Fri, 14 Oct 2022 11:01:29 +0300 Subject: [PATCH 015/110] fixes after review: comment updates, use require.notpanics --- common/disabled/appStatusHandler.go | 2 +- common/disabled/appStatusHandler_test.go | 25 ++++++++++-------------- state/snapshotStatistics.go | 3 ++- 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/common/disabled/appStatusHandler.go b/common/disabled/appStatusHandler.go index 2c028a4a681..574d3fea971 100644 --- a/common/disabled/appStatusHandler.go +++ b/common/disabled/appStatusHandler.go @@ -36,7 +36,7 @@ func (ash *appStatusHandler) SetStringValue(key string, value string) { func (ash *appStatusHandler) Close() { } -// IsInterfaceNil - +// IsInterfaceNil returns nil if there is no value under the interface func (ash *appStatusHandler) IsInterfaceNil() bool { return ash == nil } diff --git a/common/disabled/appStatusHandler_test.go b/common/disabled/appStatusHandler_test.go index 57cb45ae5f2..3380232276e 100644 --- a/common/disabled/appStatusHandler_test.go +++ b/common/disabled/appStatusHandler_test.go @@ -1,31 +1,26 @@ package disabled import ( - "fmt" "testing" "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestAppStatusHandler_MethodsShouldNotPanic(t *testing.T) { t.Parallel() - defer func() { - r := recover() - if r != nil { - assert.Fail(t, fmt.Sprintf("should have not panicked: %v", r)) - } - }() - ash := NewAppStatusHandler() assert.False(t, check.IfNil(ash)) - ash.AddUint64("key", uint64(0)) - ash.Increment("key") - ash.Decrement("key") - ash.SetInt64Value("key", int64(1)) - ash.SetUInt64Value("key", uint64(2)) - ash.SetStringValue("key", "true") - ash.Close() + require.NotPanics(t, func() { + ash.AddUint64("key", uint64(0)) + ash.Increment("key") + ash.Decrement("key") + ash.SetInt64Value("key", int64(1)) + ash.SetUInt64Value("key", uint64(2)) + ash.SetStringValue("key", "true") + ash.Close() + }) } diff --git a/state/snapshotStatistics.go b/state/snapshotStatistics.go index 4b26b8c1df7..71f5c9a529c 100644 --- a/state/snapshotStatistics.go +++ b/state/snapshotStatistics.go @@ -67,7 +67,8 @@ func (ss *snapshotStatistics) SyncFinished() { // GetSnapshotDuration will get the duration in seconds of the last snapshot func (ss *snapshotStatistics) GetSnapshotDuration() int64 { - return int64(time.Since(ss.startTime).Truncate(time.Second).Seconds()) + duration := time.Since(ss.startTime).Truncate(time.Second) + return int64(duration.Seconds()) } // PrintStats will print the stats after the snapshot has finished From 0c822995f748159fc4a853bb3dbdebd699e2a22d Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Fri, 14 Oct 2022 11:54:52 +0300 Subject: [PATCH 016/110] created bootstrap heartbeat sender --- .../blockchain/bootstrapBlockchain.go | 29 +++ .../blockchain/bootstrapBlockchain_test.go | 19 ++ epochStart/bootstrap/common.go | 3 + epochStart/bootstrap/process.go | 10 + epochStart/bootstrap/process_test.go | 2 + epochStart/bootstrap/storageProcess.go | 1 + epochStart/errors.go | 3 + factory/bootstrap/bootstrapComponents.go | 41 +++- factory/heartbeat/heartbeatV2Components.go | 62 +++--- .../heartbeat/heartbeatV2Components_test.go | 14 +- heartbeat/interface.go | 1 + heartbeat/mock/currentBlockProviderStub.go | 10 +- heartbeat/sender/bootstrapSender.go | 77 +++++++ heartbeat/sender/bootstrapSender_test.go | 192 ++++++++++++++++++ heartbeat/sender/disabled/hardforkHandler.go | 22 ++ heartbeat/sender/disabled/senderHandler.go | 29 +++ .../startInEpoch/startInEpoch_test.go | 2 + integrationTests/testProcessorNode.go | 14 +- node/nodeRunner.go | 18 +- process/peer/bootstrapPeerTypeProvider.go | 31 +++ .../peer/bootstrapPeerTypeProvider_test.go | 22 ++ redundancy/bootstrapRedundancy.go | 42 ++++ redundancy/bootstrapRedundancy_test.go | 33 +++ 23 files changed, 621 insertions(+), 56 deletions(-) create mode 100644 dataRetriever/blockchain/bootstrapBlockchain.go create mode 100644 dataRetriever/blockchain/bootstrapBlockchain_test.go create mode 100644 heartbeat/sender/bootstrapSender.go create mode 100644 heartbeat/sender/bootstrapSender_test.go create mode 100644 heartbeat/sender/disabled/hardforkHandler.go create mode 100644 heartbeat/sender/disabled/senderHandler.go create mode 100644 process/peer/bootstrapPeerTypeProvider.go create mode 100644 process/peer/bootstrapPeerTypeProvider_test.go create mode 100644 redundancy/bootstrapRedundancy.go create mode 100644 redundancy/bootstrapRedundancy_test.go diff --git a/dataRetriever/blockchain/bootstrapBlockchain.go b/dataRetriever/blockchain/bootstrapBlockchain.go new file mode 100644 index 00000000000..6862a9c1152 --- /dev/null +++ b/dataRetriever/blockchain/bootstrapBlockchain.go @@ -0,0 +1,29 @@ +package blockchain + +import "github.com/ElrondNetwork/elrond-go-core/data" + +type bootstrapBlockchain struct { + currentBlockHeader data.HeaderHandler +} + +// NewBootstrapBlockchain returns a new instance of bootstrapBlockchain +// It should be used for bootstrap only! +func NewBootstrapBlockchain() *bootstrapBlockchain { + return &bootstrapBlockchain{} +} + +// GetCurrentBlockHeader returns the current block header +func (bbc *bootstrapBlockchain) GetCurrentBlockHeader() data.HeaderHandler { + return bbc.currentBlockHeader +} + +// SetCurrentBlockHeaderAndRootHash returns nil always and saves the current block header +func (bbc *bootstrapBlockchain) SetCurrentBlockHeaderAndRootHash(bh data.HeaderHandler, _ []byte) error { + bbc.currentBlockHeader = bh + return nil +} + +// IsInterfaceNil returns true if there is no value under the interface +func (bbc *bootstrapBlockchain) IsInterfaceNil() bool { + return bbc == nil +} diff --git a/dataRetriever/blockchain/bootstrapBlockchain_test.go b/dataRetriever/blockchain/bootstrapBlockchain_test.go new file mode 100644 index 00000000000..959a0ecb1c1 --- /dev/null +++ b/dataRetriever/blockchain/bootstrapBlockchain_test.go @@ -0,0 +1,19 @@ +package blockchain + +import ( + "testing" + + "github.com/ElrondNetwork/elrond-go-core/core/check" + "github.com/ElrondNetwork/elrond-go/testscommon" + "github.com/stretchr/testify/assert" +) + +func TestNewBootstrapBlockchain(t *testing.T) { + t.Parallel() + + blockchain := NewBootstrapBlockchain() + assert.False(t, check.IfNil(blockchain)) + providedHeaderHandler := &testscommon.HeaderHandlerStub{} + assert.Nil(t, blockchain.SetCurrentBlockHeaderAndRootHash(providedHeaderHandler, nil)) + assert.Equal(t, providedHeaderHandler, blockchain.GetCurrentBlockHeader()) +} diff --git a/epochStart/bootstrap/common.go b/epochStart/bootstrap/common.go index 03160c08145..c076068678b 100644 --- a/epochStart/bootstrap/common.go +++ b/epochStart/bootstrap/common.go @@ -106,6 +106,9 @@ func checkArguments(args ArgsEpochStartBootstrap) error { if args.GeneralConfig.TrieSync.NumConcurrentTrieSyncers < 1 { return fmt.Errorf("%s: %w", baseErrorMessage, epochStart.ErrInvalidNumConcurrentTrieSyncers) } + if check.IfNil(args.BootstrapHeartbeatSender) { + return fmt.Errorf("%s: %w", baseErrorMessage, epochStart.ErrNilHeartbeatSender) + } return nil } diff --git a/epochStart/bootstrap/process.go b/epochStart/bootstrap/process.go index 76695a715d4..b95fc35029d 100644 --- a/epochStart/bootstrap/process.go +++ b/epochStart/bootstrap/process.go @@ -106,6 +106,7 @@ type epochStartBootstrap struct { maxHardCapForMissingNodes int trieSyncerVersion int checkNodesOnDisk bool + bootstrapHeartbeatSender update.Closer // created components requestHandler process.RequestHandler @@ -168,6 +169,7 @@ type ArgsEpochStartBootstrap struct { HeaderIntegrityVerifier process.HeaderIntegrityVerifier DataSyncerCreator types.ScheduledDataSyncerCreator ScheduledSCRsStorer storage.Storer + BootstrapHeartbeatSender update.Closer } type dataToSync struct { @@ -212,6 +214,7 @@ func NewEpochStartBootstrap(args ArgsEpochStartBootstrap) (*epochStartBootstrap, dataSyncerFactory: args.DataSyncerCreator, storerScheduledSCRs: args.ScheduledSCRsStorer, shardCoordinator: args.GenesisShardCoordinator, + bootstrapHeartbeatSender: args.BootstrapHeartbeatSender, } whiteListCache, err := storageunit.NewCache(storageFactory.GetCacherFromConfig(epochStartProvider.generalConfig.WhiteListPool)) @@ -299,6 +302,7 @@ func (e *epochStartBootstrap) isNodeInGenesisNodesConfig() bool { // Bootstrap runs the fast bootstrap method from the network or local storage func (e *epochStartBootstrap) Bootstrap() (Parameters, error) { defer e.closeTrieComponents() + defer e.closeBootstrapHeartbeatSender() if e.flagsConfig.ForceStartFromNetwork { log.Warn("epochStartBootstrap.Bootstrap: forcing start from network") @@ -1241,6 +1245,12 @@ func (e *epochStartBootstrap) closeTrieComponents() { } } +func (e *epochStartBootstrap) closeBootstrapHeartbeatSender() { + if !check.IfNil(e.bootstrapHeartbeatSender) { + log.LogIfError(e.bootstrapHeartbeatSender.Close()) + } +} + // Close closes the component's opened storage services/started go-routines func (e *epochStartBootstrap) Close() error { e.mutTrieStorageManagers.RLock() diff --git a/epochStart/bootstrap/process_test.go b/epochStart/bootstrap/process_test.go index 8d721f99b47..21d7f452987 100644 --- a/epochStart/bootstrap/process_test.go +++ b/epochStart/bootstrap/process_test.go @@ -43,6 +43,7 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon/syncer" "github.com/ElrondNetwork/elrond-go/testscommon/validatorInfoCacher" "github.com/ElrondNetwork/elrond-go/trie/factory" + updateMocks "github.com/ElrondNetwork/elrond-go/update/mock" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -222,6 +223,7 @@ func createMockEpochStartBootstrapArgs( FlagsConfig: config.ContextFlagsConfig{ ForceStartFromNetwork: false, }, + BootstrapHeartbeatSender: &updateMocks.CloserStub{}, } } diff --git a/epochStart/bootstrap/storageProcess.go b/epochStart/bootstrap/storageProcess.go index 9bb14106976..630a0b68eb1 100644 --- a/epochStart/bootstrap/storageProcess.go +++ b/epochStart/bootstrap/storageProcess.go @@ -72,6 +72,7 @@ func NewStorageEpochStartBootstrap(args ArgsStorageEpochStartBootstrap) (*storag // Bootstrap runs the fast bootstrap method from local storage or from import-db directory func (sesb *storageEpochStartBootstrap) Bootstrap() (Parameters, error) { defer sesb.closeTrieComponents() + defer sesb.closeBootstrapHeartbeatSender() if !sesb.generalConfig.GeneralSettings.StartInEpochEnabled { return sesb.bootstrapFromLocalStorage() diff --git a/epochStart/errors.go b/epochStart/errors.go index e2b8499618b..d6246bb48fd 100644 --- a/epochStart/errors.go +++ b/epochStart/errors.go @@ -322,3 +322,6 @@ var ErrNilEnableEpochsHandler = errors.New("nil enable epochs handler") // ErrNilValidatorInfoStorage signals that nil validator info storage has been provided var ErrNilValidatorInfoStorage = errors.New("nil validator info storage") + +// ErrNilHeartbeatSender signals that nil heartbeat sender has been provided +var ErrNilHeartbeatSender = errors.New("nil heartbeat sender") diff --git a/factory/bootstrap/bootstrapComponents.go b/factory/bootstrap/bootstrapComponents.go index 2995e46af77..1e2ec3a0bd3 100644 --- a/factory/bootstrap/bootstrapComponents.go +++ b/factory/bootstrap/bootstrapComponents.go @@ -3,6 +3,7 @@ package bootstrap import ( "fmt" "path/filepath" + "time" "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" @@ -10,12 +11,16 @@ import ( nodeFactory "github.com/ElrondNetwork/elrond-go/cmd/node/factory" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/config" + "github.com/ElrondNetwork/elrond-go/dataRetriever/blockchain" "github.com/ElrondNetwork/elrond-go/epochStart/bootstrap" "github.com/ElrondNetwork/elrond-go/errors" "github.com/ElrondNetwork/elrond-go/factory" "github.com/ElrondNetwork/elrond-go/factory/block" + "github.com/ElrondNetwork/elrond-go/heartbeat/sender" "github.com/ElrondNetwork/elrond-go/process/headerCheck" + "github.com/ElrondNetwork/elrond-go/process/peer" "github.com/ElrondNetwork/elrond-go/process/smartContract" + "github.com/ElrondNetwork/elrond-go/redundancy" "github.com/ElrondNetwork/elrond-go/sharding" "github.com/ElrondNetwork/elrond-go/storage" "github.com/ElrondNetwork/elrond-go/storage/directoryhandler" @@ -157,6 +162,39 @@ func (bcf *bootstrapComponentsFactory) Create() (*bootstrapComponents, error) { return nil, err } + privateKey := bcf.cryptoComponents.PrivateKey() + boostrapRedundancy, err := redundancy.NewBootstrapNodeRedundancy(privateKey) + if err != nil { + return nil, err + } + + heartbeatTopic := common.HeartbeatV2Topic + genesisShardCoordinator.CommunicationIdentifier(genesisShardCoordinator.SelfId()) + peerSubType := core.RegularPeer + if bcf.prefConfig.Preferences.FullArchive { + peerSubType = core.FullHistoryObserver + } + heartbeatCfg := bcf.config.HeartbeatV2 + argsHeartbeatSender := sender.ArgBootstrapSender{ + Messenger: bcf.networkComponents.NetworkMessenger(), + Marshaller: bcf.coreComponents.InternalMarshalizer(), + HeartbeatTopic: heartbeatTopic, + HeartbeatTimeBetweenSends: time.Second * time.Duration(heartbeatCfg.HeartbeatTimeBetweenSendsInSec), + HeartbeatTimeBetweenSendsWhenError: time.Second * time.Duration(heartbeatCfg.HeartbeatTimeBetweenSendsWhenErrorInSec), + HeartbeatThresholdBetweenSends: heartbeatCfg.HeartbeatThresholdBetweenSends, + VersionNumber: bcf.flagsConfig.Version, + NodeDisplayName: bcf.prefConfig.Preferences.NodeDisplayName, + Identity: bcf.prefConfig.Preferences.Identity, + PeerSubType: peerSubType, + CurrentBlockProvider: blockchain.NewBootstrapBlockchain(), + PrivateKey: privateKey, + RedundancyHandler: boostrapRedundancy, + PeerTypeProvider: peer.NewBootstrapPeerTypeProvider(), + } + bootstrapHeartbeatSender, err := sender.NewBootstrapSender(argsHeartbeatSender) + if err != nil { + return nil, err + } + dataSyncerFactory := bootstrap.NewScheduledDataSyncerFactory() epochStartBootstrapArgs := bootstrap.ArgsEpochStartBootstrap{ @@ -179,7 +217,8 @@ func (bcf *bootstrapComponentsFactory) Create() (*bootstrapComponents, error) { StatusHandler: bcf.coreComponents.StatusHandler(), HeaderIntegrityVerifier: headerIntegrityVerifier, DataSyncerCreator: dataSyncerFactory, - ScheduledSCRsStorer: nil, // will be updated after sync from network + ScheduledSCRsStorer: nil, // will be updated after sync from network + BootstrapHeartbeatSender: bootstrapHeartbeatSender, // will be closed after sync } var epochStartBootstrapper factory.EpochStartBootstrapper diff --git a/factory/heartbeat/heartbeatV2Components.go b/factory/heartbeat/heartbeatV2Components.go index 402fd72f9dd..4a694d093f7 100644 --- a/factory/heartbeat/heartbeatV2Components.go +++ b/factory/heartbeat/heartbeatV2Components.go @@ -21,27 +21,27 @@ import ( // ArgHeartbeatV2ComponentsFactory represents the argument for the heartbeat v2 components factory type ArgHeartbeatV2ComponentsFactory struct { - Config config.Config - Prefs config.Preferences - AppVersion string - BoostrapComponents factory.BootstrapComponentsHolder - CoreComponents factory.CoreComponentsHolder - DataComponents factory.DataComponentsHolder - NetworkComponents factory.NetworkComponentsHolder - CryptoComponents factory.CryptoComponentsHolder - ProcessComponents factory.ProcessComponentsHolder + Config config.Config + Prefs config.Preferences + AppVersion string + BootstrapComponents factory.BootstrapComponentsHolder + CoreComponents factory.CoreComponentsHolder + DataComponents factory.DataComponentsHolder + NetworkComponents factory.NetworkComponentsHolder + CryptoComponents factory.CryptoComponentsHolder + ProcessComponents factory.ProcessComponentsHolder } type heartbeatV2ComponentsFactory struct { - config config.Config - prefs config.Preferences - version string - boostrapComponents factory.BootstrapComponentsHolder - coreComponents factory.CoreComponentsHolder - dataComponents factory.DataComponentsHolder - networkComponents factory.NetworkComponentsHolder - cryptoComponents factory.CryptoComponentsHolder - processComponents factory.ProcessComponentsHolder + config config.Config + prefs config.Preferences + version string + bootstrapComponents factory.BootstrapComponentsHolder + coreComponents factory.CoreComponentsHolder + dataComponents factory.DataComponentsHolder + networkComponents factory.NetworkComponentsHolder + cryptoComponents factory.CryptoComponentsHolder + processComponents factory.ProcessComponentsHolder } type heartbeatV2Components struct { @@ -60,20 +60,20 @@ func NewHeartbeatV2ComponentsFactory(args ArgHeartbeatV2ComponentsFactory) (*hea } return &heartbeatV2ComponentsFactory{ - config: args.Config, - prefs: args.Prefs, - version: args.AppVersion, - boostrapComponents: args.BoostrapComponents, - coreComponents: args.CoreComponents, - dataComponents: args.DataComponents, - networkComponents: args.NetworkComponents, - cryptoComponents: args.CryptoComponents, - processComponents: args.ProcessComponents, + config: args.Config, + prefs: args.Prefs, + version: args.AppVersion, + bootstrapComponents: args.BootstrapComponents, + coreComponents: args.CoreComponents, + dataComponents: args.DataComponents, + networkComponents: args.NetworkComponents, + cryptoComponents: args.CryptoComponents, + processComponents: args.ProcessComponents, }, nil } func checkHeartbeatV2FactoryArgs(args ArgHeartbeatV2ComponentsFactory) error { - if check.IfNil(args.BoostrapComponents) { + if check.IfNil(args.BootstrapComponents) { return errors.ErrNilBootstrapComponentsHolder } if check.IfNil(args.CoreComponents) { @@ -124,7 +124,7 @@ func (hcf *heartbeatV2ComponentsFactory) Create() (*heartbeatV2Components, error peerSubType = core.FullHistoryObserver } - shardC := hcf.boostrapComponents.ShardCoordinator() + shardC := hcf.bootstrapComponents.ShardCoordinator() heartbeatTopic := common.HeartbeatV2Topic + shardC.CommunicationIdentifier(shardC.SelfId()) argPeerTypeProvider := peer.ArgPeerTypeProvider{ @@ -167,7 +167,7 @@ func (hcf *heartbeatV2ComponentsFactory) Create() (*heartbeatV2Components, error return nil, err } - epochBootstrapParams := hcf.boostrapComponents.EpochBootstrapParams() + epochBootstrapParams := hcf.bootstrapComponents.EpochBootstrapParams() argsProcessor := processor.ArgPeerAuthenticationRequestsProcessor{ RequestHandler: hcf.processComponents.RequestHandler(), NodesCoordinator: hcf.processComponents.NodesCoordinator(), @@ -188,7 +188,7 @@ func (hcf *heartbeatV2ComponentsFactory) Create() (*heartbeatV2Components, error argsDirectConnectionsProcessor := processor.ArgDirectConnectionsProcessor{ Messenger: hcf.networkComponents.NetworkMessenger(), Marshaller: hcf.coreComponents.InternalMarshalizer(), - ShardCoordinator: hcf.boostrapComponents.ShardCoordinator(), + ShardCoordinator: hcf.bootstrapComponents.ShardCoordinator(), DelayBetweenNotifications: time.Second * time.Duration(cfg.DelayBetweenConnectionNotificationsInSec), NodesCoordinator: hcf.processComponents.NodesCoordinator(), } diff --git a/factory/heartbeat/heartbeatV2Components_test.go b/factory/heartbeat/heartbeatV2Components_test.go index 8d2829c1f3c..14d0e4bae4f 100644 --- a/factory/heartbeat/heartbeatV2Components_test.go +++ b/factory/heartbeat/heartbeatV2Components_test.go @@ -64,13 +64,13 @@ func createMockHeartbeatV2ComponentsFactoryArgs() heartbeatComp.ArgHeartbeatV2Co Identity: "identity", }, }, - AppVersion: "test", - BoostrapComponents: bootstrapC, - CoreComponents: coreC, - DataComponents: dataC, - NetworkComponents: networkC, - CryptoComponents: cryptoC, - ProcessComponents: processC, + AppVersion: "test", + BootstrapComponents: bootstrapC, + CoreComponents: coreC, + DataComponents: dataC, + NetworkComponents: networkC, + CryptoComponents: cryptoC, + ProcessComponents: processC, } } diff --git a/heartbeat/interface.go b/heartbeat/interface.go index cb69acf532a..0e2d2eb8920 100644 --- a/heartbeat/interface.go +++ b/heartbeat/interface.go @@ -103,6 +103,7 @@ type ValidatorStatisticsProcessor interface { // CurrentBlockProvider can provide the current block that the node was able to commit type CurrentBlockProvider interface { GetCurrentBlockHeader() data.HeaderHandler + SetCurrentBlockHeaderAndRootHash(bh data.HeaderHandler, rootHash []byte) error IsInterfaceNil() bool } diff --git a/heartbeat/mock/currentBlockProviderStub.go b/heartbeat/mock/currentBlockProviderStub.go index c9a6674a26f..e9278e29ea8 100644 --- a/heartbeat/mock/currentBlockProviderStub.go +++ b/heartbeat/mock/currentBlockProviderStub.go @@ -6,7 +6,15 @@ import ( // CurrentBlockProviderStub - type CurrentBlockProviderStub struct { - GetCurrentBlockHeaderCalled func() data.HeaderHandler + GetCurrentBlockHeaderCalled func() data.HeaderHandler + SetCurrentBlockHeaderAndRootHashCalled func(bh data.HeaderHandler, rootHash []byte) error +} + +func (cbps *CurrentBlockProviderStub) SetCurrentBlockHeaderAndRootHash(bh data.HeaderHandler, rootHash []byte) error { + if cbps.SetCurrentBlockHeaderAndRootHashCalled != nil { + return cbps.SetCurrentBlockHeaderAndRootHashCalled(bh, rootHash) + } + return nil } // GetCurrentBlockHeader - diff --git a/heartbeat/sender/bootstrapSender.go b/heartbeat/sender/bootstrapSender.go new file mode 100644 index 00000000000..aedfc3a5de7 --- /dev/null +++ b/heartbeat/sender/bootstrapSender.go @@ -0,0 +1,77 @@ +package sender + +import ( + "time" + + "github.com/ElrondNetwork/elrond-go-core/core" + "github.com/ElrondNetwork/elrond-go-core/marshal" + crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go/heartbeat" + "github.com/ElrondNetwork/elrond-go/heartbeat/sender/disabled" +) + +// ArgBootstrapSender represents the arguments for the bootstrap bootstrapSender +type ArgBootstrapSender struct { + Messenger heartbeat.P2PMessenger + Marshaller marshal.Marshalizer + HeartbeatTopic string + HeartbeatTimeBetweenSends time.Duration + HeartbeatTimeBetweenSendsWhenError time.Duration + HeartbeatThresholdBetweenSends float64 + VersionNumber string + NodeDisplayName string + Identity string + PeerSubType core.P2PPeerSubType + CurrentBlockProvider heartbeat.CurrentBlockProvider + PrivateKey crypto.PrivateKey + RedundancyHandler heartbeat.NodeRedundancyHandler + PeerTypeProvider heartbeat.PeerTypeProviderHandler +} + +// bootstrapSender defines the component which sends heartbeat messages during bootstrap +type bootstrapSender struct { + heartbeatSender *heartbeatSender + routineHandler *routineHandler +} + +// NewBootstrapSender creates a new instance of bootstrapSender +func NewBootstrapSender(args ArgBootstrapSender) (*bootstrapSender, error) { + hbs, err := newHeartbeatSender(argHeartbeatSender{ + argBaseSender: argBaseSender{ + messenger: args.Messenger, + marshaller: args.Marshaller, + topic: args.HeartbeatTopic, + timeBetweenSends: args.HeartbeatTimeBetweenSends, + timeBetweenSendsWhenError: args.HeartbeatTimeBetweenSendsWhenError, + thresholdBetweenSends: args.HeartbeatThresholdBetweenSends, + privKey: args.PrivateKey, + redundancyHandler: args.RedundancyHandler, + }, + versionNumber: args.VersionNumber, + nodeDisplayName: args.NodeDisplayName, + identity: args.Identity, + peerSubType: args.PeerSubType, + currentBlockProvider: args.CurrentBlockProvider, + peerTypeProvider: args.PeerTypeProvider, + }) + if err != nil { + return nil, err + } + + return &bootstrapSender{ + heartbeatSender: hbs, + routineHandler: newRoutineHandler(disabled.NewDisabledSenderHandler(), hbs, disabled.NewDisabledHardforkHandler()), + }, nil +} + +// Close closes the internal components +func (sender *bootstrapSender) Close() error { + sender.routineHandler.closeProcessLoop() + + return nil +} + +// IsInterfaceNil returns true if there is no value under the interface +func (sender *bootstrapSender) IsInterfaceNil() bool { + return sender == nil +} diff --git a/heartbeat/sender/bootstrapSender_test.go b/heartbeat/sender/bootstrapSender_test.go new file mode 100644 index 00000000000..78b39ba82eb --- /dev/null +++ b/heartbeat/sender/bootstrapSender_test.go @@ -0,0 +1,192 @@ +package sender + +import ( + "errors" + "strings" + "testing" + "time" + + "github.com/ElrondNetwork/elrond-go-core/core" + "github.com/ElrondNetwork/elrond-go-core/core/check" + "github.com/ElrondNetwork/elrond-go/heartbeat" + "github.com/ElrondNetwork/elrond-go/heartbeat/mock" + "github.com/ElrondNetwork/elrond-go/testscommon" + "github.com/ElrondNetwork/elrond-go/testscommon/cryptoMocks" + "github.com/ElrondNetwork/elrond-go/testscommon/p2pmocks" + "github.com/stretchr/testify/assert" +) + +func createMockBootstrapSenderArgs() ArgBootstrapSender { + return ArgBootstrapSender{ + Messenger: &p2pmocks.MessengerStub{}, + Marshaller: &testscommon.MarshalizerMock{}, + HeartbeatTopic: "hb-topic", + HeartbeatTimeBetweenSends: time.Second, + HeartbeatTimeBetweenSendsWhenError: time.Second, + HeartbeatThresholdBetweenSends: 0.1, + VersionNumber: "v1", + NodeDisplayName: "node", + Identity: "identity", + PeerSubType: core.RegularPeer, + CurrentBlockProvider: &mock.CurrentBlockProviderStub{}, + PrivateKey: &cryptoMocks.PrivateKeyStub{}, + RedundancyHandler: &mock.RedundancyHandlerStub{}, + PeerTypeProvider: &mock.PeerTypeProviderStub{}, + } +} + +func TestNewBootstrapSender(t *testing.T) { + t.Parallel() + + t.Run("nil peer messenger should error", func(t *testing.T) { + t.Parallel() + + args := createMockBootstrapSenderArgs() + args.Messenger = nil + senderInstance, err := NewBootstrapSender(args) + + assert.Nil(t, senderInstance) + assert.Equal(t, heartbeat.ErrNilMessenger, err) + }) + t.Run("nil marshaller should error", func(t *testing.T) { + t.Parallel() + + args := createMockBootstrapSenderArgs() + args.Marshaller = nil + senderInstance, err := NewBootstrapSender(args) + + assert.Nil(t, senderInstance) + assert.Equal(t, heartbeat.ErrNilMarshaller, err) + }) + t.Run("empty heartbeat topic should error", func(t *testing.T) { + t.Parallel() + + args := createMockBootstrapSenderArgs() + args.HeartbeatTopic = "" + senderInstance, err := NewBootstrapSender(args) + + assert.Nil(t, senderInstance) + assert.Equal(t, heartbeat.ErrEmptySendTopic, err) + }) + t.Run("invalid time between sends should error", func(t *testing.T) { + t.Parallel() + + args := createMockBootstrapSenderArgs() + args.HeartbeatTimeBetweenSends = time.Second - time.Nanosecond + senderInstance, err := NewBootstrapSender(args) + + assert.Nil(t, senderInstance) + assert.True(t, errors.Is(err, heartbeat.ErrInvalidTimeDuration)) + assert.True(t, strings.Contains(err.Error(), "timeBetweenSends")) + assert.False(t, strings.Contains(err.Error(), "timeBetweenSendsWhenError")) + }) + t.Run("invalid time between sends should error", func(t *testing.T) { + t.Parallel() + + args := createMockBootstrapSenderArgs() + args.HeartbeatTimeBetweenSendsWhenError = time.Second - time.Nanosecond + senderInstance, err := NewBootstrapSender(args) + + assert.Nil(t, senderInstance) + assert.True(t, errors.Is(err, heartbeat.ErrInvalidTimeDuration)) + assert.True(t, strings.Contains(err.Error(), "timeBetweenSendsWhenError")) + }) + t.Run("version number too long should error", func(t *testing.T) { + t.Parallel() + + args := createMockBootstrapSenderArgs() + args.VersionNumber = string(make([]byte, 150)) + senderInstance, err := NewBootstrapSender(args) + + assert.Nil(t, senderInstance) + assert.True(t, errors.Is(err, heartbeat.ErrPropertyTooLong)) + assert.True(t, strings.Contains(err.Error(), "versionNumber")) + }) + t.Run("node display name too long should error", func(t *testing.T) { + t.Parallel() + + args := createMockBootstrapSenderArgs() + args.NodeDisplayName = string(make([]byte, 150)) + senderInstance, err := NewBootstrapSender(args) + + assert.Nil(t, senderInstance) + assert.True(t, errors.Is(err, heartbeat.ErrPropertyTooLong)) + assert.True(t, strings.Contains(err.Error(), "nodeDisplayName")) + }) + t.Run("identity name too long should error", func(t *testing.T) { + t.Parallel() + + args := createMockBootstrapSenderArgs() + args.Identity = string(make([]byte, 150)) + senderInstance, err := NewBootstrapSender(args) + + assert.Nil(t, senderInstance) + assert.True(t, errors.Is(err, heartbeat.ErrPropertyTooLong)) + assert.True(t, strings.Contains(err.Error(), "identity")) + }) + t.Run("nil current block provider should error", func(t *testing.T) { + t.Parallel() + + args := createMockBootstrapSenderArgs() + args.CurrentBlockProvider = nil + senderInstance, err := NewBootstrapSender(args) + + assert.Nil(t, senderInstance) + assert.Equal(t, heartbeat.ErrNilCurrentBlockProvider, err) + }) + t.Run("nil private key should error", func(t *testing.T) { + t.Parallel() + + args := createMockBootstrapSenderArgs() + args.PrivateKey = nil + senderInstance, err := NewBootstrapSender(args) + + assert.Nil(t, senderInstance) + assert.Equal(t, heartbeat.ErrNilPrivateKey, err) + }) + t.Run("nil redundancy handler should error", func(t *testing.T) { + t.Parallel() + + args := createMockBootstrapSenderArgs() + args.RedundancyHandler = nil + senderInstance, err := NewBootstrapSender(args) + + assert.Nil(t, senderInstance) + assert.Equal(t, heartbeat.ErrNilRedundancyHandler, err) + }) + t.Run("nil peer type provider should error", func(t *testing.T) { + t.Parallel() + + args := createMockBootstrapSenderArgs() + args.PeerTypeProvider = nil + senderInstance, err := NewBootstrapSender(args) + + assert.Nil(t, senderInstance) + assert.Equal(t, heartbeat.ErrNilPeerTypeProvider, err) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + args := createMockBootstrapSenderArgs() + senderInstance, err := NewBootstrapSender(args) + + assert.False(t, check.IfNil(senderInstance)) + assert.Nil(t, err) + }) +} + +func TestBootstrapSender_Close(t *testing.T) { + t.Parallel() + + defer func() { + r := recover() + if r != nil { + assert.Fail(t, "should not panic") + } + }() + + args := createMockBootstrapSenderArgs() + senderInstance, _ := NewBootstrapSender(args) + err := senderInstance.Close() + assert.Nil(t, err) +} diff --git a/heartbeat/sender/disabled/hardforkHandler.go b/heartbeat/sender/disabled/hardforkHandler.go new file mode 100644 index 00000000000..9ce2c30ec8c --- /dev/null +++ b/heartbeat/sender/disabled/hardforkHandler.go @@ -0,0 +1,22 @@ +package disabled + +type disabledHardforkHandler struct { +} + +// NewDisabledHardforkHandler returns a new instance of disabledHardforkHandler +func NewDisabledHardforkHandler() *disabledHardforkHandler { + return &disabledHardforkHandler{} +} + +// ShouldTriggerHardfork returns a new chan +func (sender *disabledHardforkHandler) ShouldTriggerHardfork() <-chan struct{} { + return make(chan struct{}) +} + +// Execute does nothing +func (sender *disabledHardforkHandler) Execute() { +} + +// Close does nothing +func (sender *disabledHardforkHandler) Close() { +} diff --git a/heartbeat/sender/disabled/senderHandler.go b/heartbeat/sender/disabled/senderHandler.go new file mode 100644 index 00000000000..96bbc59bd5e --- /dev/null +++ b/heartbeat/sender/disabled/senderHandler.go @@ -0,0 +1,29 @@ +package disabled + +import "time" + +type disabledSenderHandler struct { +} + +// NewDisabledSenderHandler returns a new instance of disabledSenderHandler +func NewDisabledSenderHandler() *disabledSenderHandler { + return &disabledSenderHandler{} +} + +// ExecutionReadyChannel returns a new chan +func (sender *disabledSenderHandler) ExecutionReadyChannel() <-chan time.Time { + return make(chan time.Time) +} + +// Execute does nothing +func (sender *disabledSenderHandler) Execute() { +} + +// Close does nothing +func (sender *disabledSenderHandler) Close() { +} + +// IsInterfaceNil returns true if there is no value under the interface +func (sender *disabledSenderHandler) IsInterfaceNil() bool { + return sender == nil +} diff --git a/integrationTests/multiShard/endOfEpoch/startInEpoch/startInEpoch_test.go b/integrationTests/multiShard/endOfEpoch/startInEpoch/startInEpoch_test.go index 46412193c65..b77f90b9cfc 100644 --- a/integrationTests/multiShard/endOfEpoch/startInEpoch/startInEpoch_test.go +++ b/integrationTests/multiShard/endOfEpoch/startInEpoch/startInEpoch_test.go @@ -35,6 +35,7 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon/scheduledDataSyncer" "github.com/ElrondNetwork/elrond-go/testscommon/shardingMocks" statusHandlerMock "github.com/ElrondNetwork/elrond-go/testscommon/statusHandler" + updateMocks "github.com/ElrondNetwork/elrond-go/update/mock" "github.com/stretchr/testify/assert" ) @@ -258,6 +259,7 @@ func testNodeStartsInEpoch(t *testing.T, shardID uint32, expectedHighestRound ui FlagsConfig: config.ContextFlagsConfig{ ForceStartFromNetwork: false, }, + BootstrapHeartbeatSender: &updateMocks.CloserStub{}, } epochStartBootstrap, err := bootstrap.NewEpochStartBootstrap(argsBootstrapHandler) diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index 0f37f9d8b82..07ab0ec0d5e 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -12,7 +12,6 @@ import ( "sync/atomic" "time" - arwenConfig "github.com/ElrondNetwork/wasm-vm/config" "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-core/core/partitioning" @@ -118,6 +117,7 @@ import ( "github.com/ElrondNetwork/elrond-go/vm/systemSmartContracts/defaults" vmcommon "github.com/ElrondNetwork/elrond-vm-common" "github.com/ElrondNetwork/elrond-vm-common/parsers" + arwenConfig "github.com/ElrondNetwork/wasm-vm/config" ) var zero = big.NewInt(0) @@ -2873,12 +2873,12 @@ func (tpn *TestProcessorNode) createHeartbeatWithHardforkTrigger() { PublicKeyToListenFrom: hardforkPubKey, }, }, - BoostrapComponents: tpn.Node.GetBootstrapComponents(), - CoreComponents: tpn.Node.GetCoreComponents(), - DataComponents: tpn.Node.GetDataComponents(), - NetworkComponents: tpn.Node.GetNetworkComponents(), - CryptoComponents: tpn.Node.GetCryptoComponents(), - ProcessComponents: tpn.Node.GetProcessComponents(), + BootstrapComponents: tpn.Node.GetBootstrapComponents(), + CoreComponents: tpn.Node.GetCoreComponents(), + DataComponents: tpn.Node.GetDataComponents(), + NetworkComponents: tpn.Node.GetNetworkComponents(), + CryptoComponents: tpn.Node.GetCryptoComponents(), + ProcessComponents: tpn.Node.GetProcessComponents(), } heartbeatV2Factory, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(hbv2FactoryArgs) diff --git a/node/nodeRunner.go b/node/nodeRunner.go index f20b4880a2d..3426eae267f 100644 --- a/node/nodeRunner.go +++ b/node/nodeRunner.go @@ -923,15 +923,15 @@ func (nr *nodeRunner) CreateManagedHeartbeatV2Components( processComponents mainFactory.ProcessComponentsHolder, ) (mainFactory.HeartbeatV2ComponentsHandler, error) { heartbeatV2Args := heartbeatComp.ArgHeartbeatV2ComponentsFactory{ - Config: *nr.configs.GeneralConfig, - Prefs: *nr.configs.PreferencesConfig, - AppVersion: nr.configs.FlagsConfig.Version, - BoostrapComponents: bootstrapComponents, - CoreComponents: coreComponents, - DataComponents: dataComponents, - NetworkComponents: networkComponents, - CryptoComponents: cryptoComponents, - ProcessComponents: processComponents, + Config: *nr.configs.GeneralConfig, + Prefs: *nr.configs.PreferencesConfig, + AppVersion: nr.configs.FlagsConfig.Version, + BootstrapComponents: bootstrapComponents, + CoreComponents: coreComponents, + DataComponents: dataComponents, + NetworkComponents: networkComponents, + CryptoComponents: cryptoComponents, + ProcessComponents: processComponents, } heartbeatV2ComponentsFactory, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(heartbeatV2Args) diff --git a/process/peer/bootstrapPeerTypeProvider.go b/process/peer/bootstrapPeerTypeProvider.go new file mode 100644 index 00000000000..0dd1482a3e3 --- /dev/null +++ b/process/peer/bootstrapPeerTypeProvider.go @@ -0,0 +1,31 @@ +package peer + +import ( + "github.com/ElrondNetwork/elrond-go/common" + "github.com/ElrondNetwork/elrond-go/state" +) + +// bootstrapPeerTypeProvider implements PeerTypeProviderHandler interface +type bootstrapPeerTypeProvider struct { +} + +// NewBootstrapPeerTypeProvider returns a new instance of bootstrapPeerTypeProvider +// It should be used for bootstrap only! +func NewBootstrapPeerTypeProvider() *bootstrapPeerTypeProvider { + return &bootstrapPeerTypeProvider{} +} + +// ComputeForPubKey returns common.ObserverList and shard 0 always +func (bptp *bootstrapPeerTypeProvider) ComputeForPubKey(_ []byte) (common.PeerType, uint32, error) { + return common.ObserverList, 0, nil +} + +// GetAllPeerTypeInfos returns an empty slice +func (bptp *bootstrapPeerTypeProvider) GetAllPeerTypeInfos() []*state.PeerTypeInfo { + return make([]*state.PeerTypeInfo, 0) +} + +// IsInterfaceNil returns true if there is no value under the interface +func (bptp *bootstrapPeerTypeProvider) IsInterfaceNil() bool { + return bptp == nil +} diff --git a/process/peer/bootstrapPeerTypeProvider_test.go b/process/peer/bootstrapPeerTypeProvider_test.go new file mode 100644 index 00000000000..8090eb208a8 --- /dev/null +++ b/process/peer/bootstrapPeerTypeProvider_test.go @@ -0,0 +1,22 @@ +package peer + +import ( + "testing" + + "github.com/ElrondNetwork/elrond-go-core/core/check" + "github.com/ElrondNetwork/elrond-go/common" + "github.com/ElrondNetwork/elrond-go/state" + "github.com/stretchr/testify/assert" +) + +func TestNewBootstrapPeerTypeProvider(t *testing.T) { + t.Parallel() + + peerTypeProvider := NewBootstrapPeerTypeProvider() + assert.False(t, check.IfNil(peerTypeProvider)) + assert.Equal(t, make([]*state.PeerTypeInfo, 0), peerTypeProvider.GetAllPeerTypeInfos()) + peerType, shard, err := peerTypeProvider.ComputeForPubKey(nil) + assert.Nil(t, err) + assert.Equal(t, uint32(0), shard) + assert.Equal(t, common.ObserverList, peerType) +} diff --git a/redundancy/bootstrapRedundancy.go b/redundancy/bootstrapRedundancy.go new file mode 100644 index 00000000000..5d29f2558a8 --- /dev/null +++ b/redundancy/bootstrapRedundancy.go @@ -0,0 +1,42 @@ +package redundancy + +import ( + "github.com/ElrondNetwork/elrond-go-core/core/check" + crypto "github.com/ElrondNetwork/elrond-go-crypto" +) + +type bootstrapNodeRedundancy struct { + observerPrivateKey crypto.PrivateKey +} + +// NewBootstrapNodeRedundancy returns a new instance of bootstrapNodeRedundancy +// It should be used for bootstrap only! +func NewBootstrapNodeRedundancy(nodePrivateKey crypto.PrivateKey) (*bootstrapNodeRedundancy, error) { + if check.IfNil(nodePrivateKey) { + return nil, ErrNilObserverPrivateKey + } + + return &bootstrapNodeRedundancy{ + observerPrivateKey: nodePrivateKey, + }, nil +} + +// IsRedundancyNode returns false always +func (bnr *bootstrapNodeRedundancy) IsRedundancyNode() bool { + return false +} + +// IsMainMachineActive returns true always +func (bnr *bootstrapNodeRedundancy) IsMainMachineActive() bool { + return true +} + +// ObserverPrivateKey returns node's private key +func (bnr *bootstrapNodeRedundancy) ObserverPrivateKey() crypto.PrivateKey { + return bnr.observerPrivateKey +} + +// IsInterfaceNil returns true if there is no value under the interface +func (bnr *bootstrapNodeRedundancy) IsInterfaceNil() bool { + return bnr == nil +} diff --git a/redundancy/bootstrapRedundancy_test.go b/redundancy/bootstrapRedundancy_test.go new file mode 100644 index 00000000000..bcf4db3bc42 --- /dev/null +++ b/redundancy/bootstrapRedundancy_test.go @@ -0,0 +1,33 @@ +package redundancy + +import ( + "testing" + + "github.com/ElrondNetwork/elrond-go-core/core/check" + "github.com/ElrondNetwork/elrond-go/redundancy/mock" + "github.com/stretchr/testify/assert" +) + +func TestNewBootstrapNodeRedundancy(t *testing.T) { + t.Parallel() + + t.Run("nil key should error", func(t *testing.T) { + t.Parallel() + + bnr, err := NewBootstrapNodeRedundancy(nil) + assert.Equal(t, ErrNilObserverPrivateKey, err) + assert.True(t, check.IfNil(bnr)) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + providedKey := &mock.PrivateKeyStub{} + bnr, err := NewBootstrapNodeRedundancy(providedKey) + assert.Nil(t, err) + assert.False(t, check.IfNil(bnr)) + + assert.False(t, bnr.IsRedundancyNode()) + assert.True(t, bnr.IsMainMachineActive()) + assert.Equal(t, providedKey, bnr.ObserverPrivateKey()) + }) +} From c5869469d849807d1fda79e0b02a06b849da8fec Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Fri, 14 Oct 2022 12:21:11 +0300 Subject: [PATCH 017/110] fixed typo --- factory/bootstrap/bootstrapComponents.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/factory/bootstrap/bootstrapComponents.go b/factory/bootstrap/bootstrapComponents.go index 1e2ec3a0bd3..b1b9706ed70 100644 --- a/factory/bootstrap/bootstrapComponents.go +++ b/factory/bootstrap/bootstrapComponents.go @@ -163,7 +163,7 @@ func (bcf *bootstrapComponentsFactory) Create() (*bootstrapComponents, error) { } privateKey := bcf.cryptoComponents.PrivateKey() - boostrapRedundancy, err := redundancy.NewBootstrapNodeRedundancy(privateKey) + bootstrapRedundancy, err := redundancy.NewBootstrapNodeRedundancy(privateKey) if err != nil { return nil, err } @@ -187,7 +187,7 @@ func (bcf *bootstrapComponentsFactory) Create() (*bootstrapComponents, error) { PeerSubType: peerSubType, CurrentBlockProvider: blockchain.NewBootstrapBlockchain(), PrivateKey: privateKey, - RedundancyHandler: boostrapRedundancy, + RedundancyHandler: bootstrapRedundancy, PeerTypeProvider: peer.NewBootstrapPeerTypeProvider(), } bootstrapHeartbeatSender, err := sender.NewBootstrapSender(argsHeartbeatSender) From edb636f5d02d4c65b6e2ecc067128e65d68422ac Mon Sep 17 00:00:00 2001 From: Sebastian Marian Date: Fri, 14 Oct 2022 12:42:53 +0300 Subject: [PATCH 018/110] * Implemented saving validator info into storage for shard nodes --- epochStart/shardchain/peerMiniBlocksSyncer.go | 4 +- process/block/preprocess/basePreProcess.go | 9 ++- .../preprocess/validatorInfoPreProcessor.go | 48 +++++++++++- .../validatorInfoPreProcessor_test.go | 74 +++++++++++++++++++ 4 files changed, 127 insertions(+), 8 deletions(-) diff --git a/epochStart/shardchain/peerMiniBlocksSyncer.go b/epochStart/shardchain/peerMiniBlocksSyncer.go index d1f320227f9..fc3353c1fad 100644 --- a/epochStart/shardchain/peerMiniBlocksSyncer.go +++ b/epochStart/shardchain/peerMiniBlocksSyncer.go @@ -277,13 +277,13 @@ func (p *peerMiniBlockSyncer) setMissingValidatorsInfo(miniBlock *block.MiniBloc for _, txHash := range miniBlock.TxHashes { p.mapAllValidatorsInfo[string(txHash)] = nil - validatorInfoObjectFound, ok := p.validatorsInfoPool.SearchFirstData(txHash) + val, ok := p.validatorsInfoPool.SearchFirstData(txHash) if !ok { numMissingValidatorsInfo++ continue } - validatorInfo, ok := validatorInfoObjectFound.(*state.ShardValidatorInfo) + validatorInfo, ok := val.(*state.ShardValidatorInfo) if !ok { numMissingValidatorsInfo++ continue diff --git a/process/block/preprocess/basePreProcess.go b/process/block/preprocess/basePreProcess.go index 8ded3963eec..2f614cf4c74 100644 --- a/process/block/preprocess/basePreProcess.go +++ b/process/block/preprocess/basePreProcess.go @@ -250,21 +250,22 @@ func (bpp *basePreProcess) saveTransactionToStorage( forBlock.mutTxsForBlock.RUnlock() if txInfoFromMap == nil || txInfoFromMap.tx == nil { - log.Warn("basePreProcess.saveTransactionToStorage", "type", dataUnit, "txHash", txHash, "error", process.ErrMissingTransaction.Error()) + log.Warn("basePreProcess.saveTransactionToStorage", "txHash", txHash, "dataUnit", dataUnit, "error", process.ErrMissingTransaction) return } buff, err := bpp.marshalizer.Marshal(txInfoFromMap.tx) if err != nil { - log.Warn("basePreProcess.saveTransactionToStorage", "txHash", txHash, "error", err.Error()) + log.Warn("basePreProcess.saveTransactionToStorage: Marshal", "txHash", txHash, "error", err) return } errNotCritical := store.Put(dataUnit, txHash, buff) if errNotCritical != nil { - log.Debug("store.Put", - "error", errNotCritical.Error(), + log.Debug("basePreProcess.saveTransactionToStorage: Put", + "txHash", txHash, "dataUnit", dataUnit, + "error", errNotCritical, ) } } diff --git a/process/block/preprocess/validatorInfoPreProcessor.go b/process/block/preprocess/validatorInfoPreProcessor.go index 8fb47ed9615..686bc189efa 100644 --- a/process/block/preprocess/validatorInfoPreProcessor.go +++ b/process/block/preprocess/validatorInfoPreProcessor.go @@ -165,11 +165,55 @@ func (vip *validatorInfoPreprocessor) ProcessBlockTransactions( return nil } -// SaveTxsToStorage does nothing -func (vip *validatorInfoPreprocessor) SaveTxsToStorage(_ *block.Body) error { +// SaveTxsToStorage saves validator info from body into storage +func (vip *validatorInfoPreprocessor) SaveTxsToStorage(body *block.Body) error { + if check.IfNil(body) { + return process.ErrNilBlockBody + } + + for i := 0; i < len(body.MiniBlocks); i++ { + miniBlock := body.MiniBlocks[i] + if miniBlock.Type != block.PeerBlock { + continue + } + + vip.saveValidatorInfoToStorage(miniBlock) + } + return nil } +func (vip *validatorInfoPreprocessor) saveValidatorInfoToStorage(miniBlock *block.MiniBlock) { + for _, txHash := range miniBlock.TxHashes { + val, ok := vip.validatorsInfoPool.SearchFirstData(txHash) + if !ok { + log.Debug("validatorInfoPreprocessor.saveValidatorInfoToStorage: SearchFirstData: tx not found in validator info pool", "txHash", txHash) + continue + } + + validatorInfo, ok := val.(*state.ShardValidatorInfo) + if !ok { + log.Warn("validatorInfoPreprocessor.saveValidatorInfoToStorage: wrong type assertion", "txHash", txHash) + continue + } + + buff, err := vip.marshalizer.Marshal(validatorInfo) + if err != nil { + log.Warn("validatorInfoPreprocessor.saveValidatorInfoToStorage: Marshal", "txHash", txHash, "error", err) + continue + } + + err = vip.storage.Put(dataRetriever.UnsignedTransactionUnit, txHash, buff) + if err != nil { + log.Debug("validatorInfoPreprocessor.saveValidatorInfoToStorage: Put", + "txHash", txHash, + "dataUnit", dataRetriever.UnsignedTransactionUnit, + "error", err, + ) + } + } +} + // CreateBlockStarted cleans the local cache map for processed/created validators info at this round func (vip *validatorInfoPreprocessor) CreateBlockStarted() { _ = core.EmptyChannel(vip.chReceivedAllValidatorsInfo) diff --git a/process/block/preprocess/validatorInfoPreProcessor_test.go b/process/block/preprocess/validatorInfoPreProcessor_test.go index a52ed8bb04a..d09998745dd 100644 --- a/process/block/preprocess/validatorInfoPreProcessor_test.go +++ b/process/block/preprocess/validatorInfoPreProcessor_test.go @@ -3,6 +3,8 @@ package preprocess import ( "bytes" "errors" + "github.com/ElrondNetwork/elrond-go-core/data/rewardTx" + "github.com/stretchr/testify/require" "testing" "github.com/ElrondNetwork/elrond-go-core/core" @@ -495,3 +497,75 @@ func TestNewValidatorInfoPreprocessor_RestoreValidatorsInfo(t *testing.T) { assert.True(t, wasCalledWithExpectedKey) }) } + +func TestValidatorInfoPreprocessor_SaveTxsToStorageShouldWork(t *testing.T) { + t.Parallel() + + txHash1 := []byte("txHash1") + txHash2 := []byte("txHash2") + txHash3 := []byte("txHash3") + txHash4 := []byte("txHash4") + + tdp := initDataPool() + + tdp.ValidatorsInfoCalled = func() dataRetriever.ShardedDataCacherNotifier { + return &testscommon.ShardedDataStub{ + SearchFirstDataCalled: func(key []byte) (value interface{}, ok bool) { + if bytes.Equal(key, txHash1) { + return nil, false + } + if bytes.Equal(key, txHash2) { + return &state.ValidatorInfo{}, true + } + if bytes.Equal(key, txHash3) { + return &state.ShardValidatorInfo{}, true + } + if bytes.Equal(key, txHash4) { + return &rewardTx.RewardTx{}, true + } + return nil, false + }, + } + } + + putHashes := make([][]byte, 0) + storer := &storage.ChainStorerStub{ + PutCalled: func(unitType dataRetriever.UnitType, key []byte, value []byte) error { + putHashes = append(putHashes, key) + return nil + }, + } + + vip, _ := NewValidatorInfoPreprocessor( + &hashingMocks.HasherMock{}, + &testscommon.MarshalizerMock{}, + &testscommon.BlockSizeComputationStub{}, + tdp.ValidatorsInfo(), + storer, + &testscommon.EnableEpochsHandlerStub{}, + ) + + err := vip.SaveTxsToStorage(nil) + assert.Equal(t, process.ErrNilBlockBody, err) + + peersHashes := [][]byte{txHash1, txHash2, txHash3} + rewardsHashes := [][]byte{txHash4} + + mb1 := block.MiniBlock{ + TxHashes: rewardsHashes, + Type: block.RewardsBlock, + } + mb2 := block.MiniBlock{ + TxHashes: peersHashes, + Type: block.PeerBlock, + } + + blockBody := &block.Body{} + blockBody.MiniBlocks = append(blockBody.MiniBlocks, &mb1, &mb2) + + err = vip.SaveTxsToStorage(blockBody) + + assert.Nil(t, err) + require.Equal(t, 1, len(putHashes)) + assert.Equal(t, txHash3, putHashes[0]) +} From 075729c640a062aa067dcaa274720c9c2f91f66e Mon Sep 17 00:00:00 2001 From: Sebastian Marian Date: Fri, 14 Oct 2022 12:47:35 +0300 Subject: [PATCH 019/110] * Fixed go imports --- process/block/preprocess/validatorInfoPreProcessor_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/process/block/preprocess/validatorInfoPreProcessor_test.go b/process/block/preprocess/validatorInfoPreProcessor_test.go index d09998745dd..ec05a1593b0 100644 --- a/process/block/preprocess/validatorInfoPreProcessor_test.go +++ b/process/block/preprocess/validatorInfoPreProcessor_test.go @@ -3,12 +3,11 @@ package preprocess import ( "bytes" "errors" - "github.com/ElrondNetwork/elrond-go-core/data/rewardTx" - "github.com/stretchr/testify/require" "testing" "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/data/block" + "github.com/ElrondNetwork/elrond-go-core/data/rewardTx" "github.com/ElrondNetwork/elrond-go/dataRetriever" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/state" @@ -17,6 +16,7 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" "github.com/ElrondNetwork/elrond-go/testscommon/storage" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestNewValidatorInfoPreprocessor_NilHasherShouldErr(t *testing.T) { From cfd9fcf01421007a03e5d37817e12eba24461c96 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Fri, 14 Oct 2022 13:39:47 +0300 Subject: [PATCH 020/110] fixes after review --- .../blockchain/bootstrapBlockchain.go | 12 +++- factory/bootstrap/bootstrapComponents.go | 64 ++++++++++--------- heartbeat/mock/currentBlockProviderStub.go | 1 + heartbeat/sender/bootstrapSender_test.go | 2 +- heartbeat/sender/heartbeatSender_test.go | 2 +- .../sender/peerAuthenticationSender_test.go | 2 +- heartbeat/sender/sender_test.go | 2 +- 7 files changed, 51 insertions(+), 34 deletions(-) diff --git a/dataRetriever/blockchain/bootstrapBlockchain.go b/dataRetriever/blockchain/bootstrapBlockchain.go index 6862a9c1152..f142a69f2cf 100644 --- a/dataRetriever/blockchain/bootstrapBlockchain.go +++ b/dataRetriever/blockchain/bootstrapBlockchain.go @@ -1,9 +1,14 @@ package blockchain -import "github.com/ElrondNetwork/elrond-go-core/data" +import ( + "sync" + + "github.com/ElrondNetwork/elrond-go-core/data" +) type bootstrapBlockchain struct { currentBlockHeader data.HeaderHandler + mut sync.RWMutex } // NewBootstrapBlockchain returns a new instance of bootstrapBlockchain @@ -14,11 +19,16 @@ func NewBootstrapBlockchain() *bootstrapBlockchain { // GetCurrentBlockHeader returns the current block header func (bbc *bootstrapBlockchain) GetCurrentBlockHeader() data.HeaderHandler { + bbc.mut.RLock() + defer bbc.mut.RUnlock() return bbc.currentBlockHeader } // SetCurrentBlockHeaderAndRootHash returns nil always and saves the current block header func (bbc *bootstrapBlockchain) SetCurrentBlockHeaderAndRootHash(bh data.HeaderHandler, _ []byte) error { + bbc.mut.Lock() + defer bbc.mut.Unlock() + bbc.currentBlockHeader = bh return nil } diff --git a/factory/bootstrap/bootstrapComponents.go b/factory/bootstrap/bootstrapComponents.go index b1b9706ed70..a08d54eae26 100644 --- a/factory/bootstrap/bootstrapComponents.go +++ b/factory/bootstrap/bootstrapComponents.go @@ -27,6 +27,7 @@ import ( storageFactory "github.com/ElrondNetwork/elrond-go/storage/factory" "github.com/ElrondNetwork/elrond-go/storage/latestData" "github.com/ElrondNetwork/elrond-go/storage/storageunit" + "github.com/ElrondNetwork/elrond-go/update" ) var log = logger.GetOrCreate("factory") @@ -162,35 +163,7 @@ func (bcf *bootstrapComponentsFactory) Create() (*bootstrapComponents, error) { return nil, err } - privateKey := bcf.cryptoComponents.PrivateKey() - bootstrapRedundancy, err := redundancy.NewBootstrapNodeRedundancy(privateKey) - if err != nil { - return nil, err - } - - heartbeatTopic := common.HeartbeatV2Topic + genesisShardCoordinator.CommunicationIdentifier(genesisShardCoordinator.SelfId()) - peerSubType := core.RegularPeer - if bcf.prefConfig.Preferences.FullArchive { - peerSubType = core.FullHistoryObserver - } - heartbeatCfg := bcf.config.HeartbeatV2 - argsHeartbeatSender := sender.ArgBootstrapSender{ - Messenger: bcf.networkComponents.NetworkMessenger(), - Marshaller: bcf.coreComponents.InternalMarshalizer(), - HeartbeatTopic: heartbeatTopic, - HeartbeatTimeBetweenSends: time.Second * time.Duration(heartbeatCfg.HeartbeatTimeBetweenSendsInSec), - HeartbeatTimeBetweenSendsWhenError: time.Second * time.Duration(heartbeatCfg.HeartbeatTimeBetweenSendsWhenErrorInSec), - HeartbeatThresholdBetweenSends: heartbeatCfg.HeartbeatThresholdBetweenSends, - VersionNumber: bcf.flagsConfig.Version, - NodeDisplayName: bcf.prefConfig.Preferences.NodeDisplayName, - Identity: bcf.prefConfig.Preferences.Identity, - PeerSubType: peerSubType, - CurrentBlockProvider: blockchain.NewBootstrapBlockchain(), - PrivateKey: privateKey, - RedundancyHandler: bootstrapRedundancy, - PeerTypeProvider: peer.NewBootstrapPeerTypeProvider(), - } - bootstrapHeartbeatSender, err := sender.NewBootstrapSender(argsHeartbeatSender) + bootstrapHeartbeatSender, err := bcf.createHeartbeatSender(genesisShardCoordinator) if err != nil { return nil, err } @@ -284,6 +257,39 @@ func (bcf *bootstrapComponentsFactory) createHeaderFactory(handler nodeFactory.H return block.NewShardHeaderFactory(handler) } +func (bcf *bootstrapComponentsFactory) createHeartbeatSender(shardCoordinator sharding.Coordinator) (update.Closer, error) { + privateKey := bcf.cryptoComponents.PrivateKey() + bootstrapRedundancy, err := redundancy.NewBootstrapNodeRedundancy(privateKey) + if err != nil { + return nil, err + } + + heartbeatTopic := common.HeartbeatV2Topic + shardCoordinator.CommunicationIdentifier(shardCoordinator.SelfId()) + peerSubType := core.RegularPeer + if bcf.prefConfig.Preferences.FullArchive { + peerSubType = core.FullHistoryObserver + } + heartbeatCfg := bcf.config.HeartbeatV2 + argsHeartbeatSender := sender.ArgBootstrapSender{ + Messenger: bcf.networkComponents.NetworkMessenger(), + Marshaller: bcf.coreComponents.InternalMarshalizer(), + HeartbeatTopic: heartbeatTopic, + HeartbeatTimeBetweenSends: time.Second * time.Duration(heartbeatCfg.HeartbeatTimeBetweenSendsInSec), + HeartbeatTimeBetweenSendsWhenError: time.Second * time.Duration(heartbeatCfg.HeartbeatTimeBetweenSendsWhenErrorInSec), + HeartbeatThresholdBetweenSends: heartbeatCfg.HeartbeatThresholdBetweenSends, + VersionNumber: bcf.flagsConfig.Version, + NodeDisplayName: bcf.prefConfig.Preferences.NodeDisplayName, + Identity: bcf.prefConfig.Preferences.Identity, + PeerSubType: peerSubType, + CurrentBlockProvider: blockchain.NewBootstrapBlockchain(), + PrivateKey: privateKey, + RedundancyHandler: bootstrapRedundancy, + PeerTypeProvider: peer.NewBootstrapPeerTypeProvider(), + } + + return sender.NewBootstrapSender(argsHeartbeatSender) +} + // Close closes the bootstrap components, closing at the same time any running goroutines func (bc *bootstrapComponents) Close() error { // TODO: close all components diff --git a/heartbeat/mock/currentBlockProviderStub.go b/heartbeat/mock/currentBlockProviderStub.go index e9278e29ea8..cff851606c8 100644 --- a/heartbeat/mock/currentBlockProviderStub.go +++ b/heartbeat/mock/currentBlockProviderStub.go @@ -10,6 +10,7 @@ type CurrentBlockProviderStub struct { SetCurrentBlockHeaderAndRootHashCalled func(bh data.HeaderHandler, rootHash []byte) error } +// SetCurrentBlockHeaderAndRootHash - func (cbps *CurrentBlockProviderStub) SetCurrentBlockHeaderAndRootHash(bh data.HeaderHandler, rootHash []byte) error { if cbps.SetCurrentBlockHeaderAndRootHashCalled != nil { return cbps.SetCurrentBlockHeaderAndRootHashCalled(bh, rootHash) diff --git a/heartbeat/sender/bootstrapSender_test.go b/heartbeat/sender/bootstrapSender_test.go index 78b39ba82eb..70d48e24b9c 100644 --- a/heartbeat/sender/bootstrapSender_test.go +++ b/heartbeat/sender/bootstrapSender_test.go @@ -80,7 +80,7 @@ func TestNewBootstrapSender(t *testing.T) { assert.True(t, strings.Contains(err.Error(), "timeBetweenSends")) assert.False(t, strings.Contains(err.Error(), "timeBetweenSendsWhenError")) }) - t.Run("invalid time between sends should error", func(t *testing.T) { + t.Run("invalid time between sends when error should error", func(t *testing.T) { t.Parallel() args := createMockBootstrapSenderArgs() diff --git a/heartbeat/sender/heartbeatSender_test.go b/heartbeat/sender/heartbeatSender_test.go index f0401a0669c..d2345352f5b 100644 --- a/heartbeat/sender/heartbeatSender_test.go +++ b/heartbeat/sender/heartbeatSender_test.go @@ -79,7 +79,7 @@ func TestNewHeartbeatSender(t *testing.T) { assert.True(t, strings.Contains(err.Error(), "timeBetweenSends")) assert.False(t, strings.Contains(err.Error(), "timeBetweenSendsWhenError")) }) - t.Run("invalid time between sends should error", func(t *testing.T) { + t.Run("invalid time between sends when error should error", func(t *testing.T) { t.Parallel() argBase := createMockBaseArgs() diff --git a/heartbeat/sender/peerAuthenticationSender_test.go b/heartbeat/sender/peerAuthenticationSender_test.go index bb598356d62..5f3d145cb43 100644 --- a/heartbeat/sender/peerAuthenticationSender_test.go +++ b/heartbeat/sender/peerAuthenticationSender_test.go @@ -159,7 +159,7 @@ func TestNewPeerAuthenticationSender(t *testing.T) { assert.True(t, strings.Contains(err.Error(), "timeBetweenSends")) assert.False(t, strings.Contains(err.Error(), "timeBetweenSendsWhenError")) }) - t.Run("invalid time between sends should error", func(t *testing.T) { + t.Run("invalid time between sends when error should error", func(t *testing.T) { t.Parallel() argsBase := createMockBaseArgs() diff --git a/heartbeat/sender/sender_test.go b/heartbeat/sender/sender_test.go index c09270d2923..c6781e6e8ff 100644 --- a/heartbeat/sender/sender_test.go +++ b/heartbeat/sender/sender_test.go @@ -124,7 +124,7 @@ func TestNewSender(t *testing.T) { assert.True(t, strings.Contains(err.Error(), "timeBetweenSends")) assert.False(t, strings.Contains(err.Error(), "timeBetweenSendsWhenError")) }) - t.Run("invalid time between sends should error", func(t *testing.T) { + t.Run("invalid time between sends when error should error", func(t *testing.T) { t.Parallel() args := createMockSenderArgs() From cb97e21ea73109f84779bceda95dd0cd06f4fa7e Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Mon, 17 Oct 2022 14:30:34 +0300 Subject: [PATCH 021/110] EN-13311: fix delegation contract's owner delegation logs --- vm/systemSmartContracts/logs.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/vm/systemSmartContracts/logs.go b/vm/systemSmartContracts/logs.go index 358741a7292..44a492f46da 100644 --- a/vm/systemSmartContracts/logs.go +++ b/vm/systemSmartContracts/logs.go @@ -4,7 +4,6 @@ import ( "math/big" "strconv" - "github.com/ElrondNetwork/elrond-go-core/core" vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) @@ -53,8 +52,7 @@ func (d *delegation) createAndAddLogEntryForDelegate( address := contractCallInput.CallerAddr function := contractCallInput.Function if function == initFromValidatorData || - function == mergeValidatorDataToDelegation || - function == core.SCDeployInitFunctionName { + function == mergeValidatorDataToDelegation { address = contractCallInput.Arguments[0] topics = append(topics, contractCallInput.RecipientAddr) From c43441d4f2c5f97f4aa934cbdb378309f4969936 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 17 Oct 2022 18:16:29 +0300 Subject: [PATCH 022/110] fix after review, moved bootstrapHeartbeatSender creation just before sync start --- epochStart/bootstrap/common.go | 3 - .../epochStartMetaBlockProcessor_test.go | 27 ++--- epochStart/bootstrap/interface.go | 2 + epochStart/bootstrap/process.go | 45 +++++++- epochStart/bootstrap/process_test.go | 7 +- ...torageEpochStartMetaBlockProcessor_test.go | 25 +++-- .../bootstrap/syncEpochStartMeta_test.go | 9 +- epochStart/errors.go | 3 - epochStart/mock/cryptoComponentsMock.go | 6 + epochStart/mock/messengerStub.go | 104 ------------------ factory/bootstrap/bootstrapComponents.go | 47 +------- factory/status/statusComponents.go | 1 - .../startInEpoch/startInEpoch_test.go | 2 - process/interface.go | 1 + process/mock/cryptoComponentsMock.go | 6 + testscommon/trie/statisticsMock.go | 3 - 16 files changed, 94 insertions(+), 197 deletions(-) delete mode 100644 epochStart/mock/messengerStub.go diff --git a/epochStart/bootstrap/common.go b/epochStart/bootstrap/common.go index c076068678b..03160c08145 100644 --- a/epochStart/bootstrap/common.go +++ b/epochStart/bootstrap/common.go @@ -106,9 +106,6 @@ func checkArguments(args ArgsEpochStartBootstrap) error { if args.GeneralConfig.TrieSync.NumConcurrentTrieSyncers < 1 { return fmt.Errorf("%s: %w", baseErrorMessage, epochStart.ErrInvalidNumConcurrentTrieSyncers) } - if check.IfNil(args.BootstrapHeartbeatSender) { - return fmt.Errorf("%s: %w", baseErrorMessage, epochStart.ErrNilHeartbeatSender) - } return nil } diff --git a/epochStart/bootstrap/epochStartMetaBlockProcessor_test.go b/epochStart/bootstrap/epochStartMetaBlockProcessor_test.go index 98aacb5a655..d4a0a827fc4 100644 --- a/epochStart/bootstrap/epochStartMetaBlockProcessor_test.go +++ b/epochStart/bootstrap/epochStartMetaBlockProcessor_test.go @@ -13,6 +13,7 @@ import ( "github.com/ElrondNetwork/elrond-go/epochStart/mock" "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" + "github.com/ElrondNetwork/elrond-go/testscommon/p2pmocks" "github.com/stretchr/testify/assert" ) @@ -37,7 +38,7 @@ func TestNewEpochStartMetaBlockProcessor_NilRequestHandlerShouldErr(t *testing.T t.Parallel() esmbp, err := NewEpochStartMetaBlockProcessor( - &mock.MessengerStub{}, + &p2pmocks.MessengerStub{}, nil, &mock.MarshalizerMock{}, &hashingMocks.HasherMock{}, @@ -54,7 +55,7 @@ func TestNewEpochStartMetaBlockProcessor_NilMarshalizerShouldErr(t *testing.T) { t.Parallel() esmbp, err := NewEpochStartMetaBlockProcessor( - &mock.MessengerStub{}, + &p2pmocks.MessengerStub{}, &testscommon.RequestHandlerStub{}, nil, &hashingMocks.HasherMock{}, @@ -71,7 +72,7 @@ func TestNewEpochStartMetaBlockProcessor_NilHasherShouldErr(t *testing.T) { t.Parallel() esmbp, err := NewEpochStartMetaBlockProcessor( - &mock.MessengerStub{}, + &p2pmocks.MessengerStub{}, &testscommon.RequestHandlerStub{}, &mock.MarshalizerMock{}, nil, @@ -88,7 +89,7 @@ func TestNewEpochStartMetaBlockProcessor_InvalidConsensusPercentageShouldErr(t * t.Parallel() esmbp, err := NewEpochStartMetaBlockProcessor( - &mock.MessengerStub{}, + &p2pmocks.MessengerStub{}, &testscommon.RequestHandlerStub{}, &mock.MarshalizerMock{}, &hashingMocks.HasherMock{}, @@ -105,7 +106,7 @@ func TestNewEpochStartMetaBlockProcessorOkValsShouldWork(t *testing.T) { t.Parallel() esmbp, err := NewEpochStartMetaBlockProcessor( - &mock.MessengerStub{}, + &p2pmocks.MessengerStub{}, &testscommon.RequestHandlerStub{}, &mock.MarshalizerMock{}, &hashingMocks.HasherMock{}, @@ -135,7 +136,7 @@ func TestNewEpochStartMetaBlockProcessorOkValsShouldWorkAfterMoreTriesWaitingFor counter := 0 esmbp, err := NewEpochStartMetaBlockProcessor( - &mock.MessengerStub{ + &p2pmocks.MessengerStub{ ConnectedPeersCalled: func() []core.PeerID { peers := getConnectedPeers(counter) counter++ @@ -158,7 +159,7 @@ func TestEpochStartMetaBlockProcessor_Validate(t *testing.T) { t.Parallel() esmbp, _ := NewEpochStartMetaBlockProcessor( - &mock.MessengerStub{}, + &p2pmocks.MessengerStub{}, &testscommon.RequestHandlerStub{}, &mock.MarshalizerMock{}, &hashingMocks.HasherMock{}, @@ -174,7 +175,7 @@ func TestEpochStartMetaBlockProcessor_SaveNilInterceptedDataShouldNotReturnError t.Parallel() esmbp, _ := NewEpochStartMetaBlockProcessor( - &mock.MessengerStub{}, + &p2pmocks.MessengerStub{}, &testscommon.RequestHandlerStub{}, &mock.MarshalizerMock{}, &hashingMocks.HasherMock{}, @@ -191,7 +192,7 @@ func TestEpochStartMetaBlockProcessor_SaveOkInterceptedDataShouldWork(t *testing t.Parallel() esmbp, _ := NewEpochStartMetaBlockProcessor( - &mock.MessengerStub{}, + &p2pmocks.MessengerStub{}, &testscommon.RequestHandlerStub{}, &mock.MarshalizerMock{}, &hashingMocks.HasherMock{}, @@ -216,7 +217,7 @@ func TestEpochStartMetaBlockProcessor_GetEpochStartMetaBlockShouldTimeOut(t *tes t.Parallel() esmbp, _ := NewEpochStartMetaBlockProcessor( - &mock.MessengerStub{ + &p2pmocks.MessengerStub{ ConnectedPeersCalled: func() []core.PeerID { return []core.PeerID{"peer_0", "peer_1", "peer_2", "peer_3", "peer_4", "peer_5"} }, @@ -240,7 +241,7 @@ func TestEpochStartMetaBlockProcessor_GetEpochStartMetaBlockShouldReturnMostRece t.Parallel() esmbp, _ := NewEpochStartMetaBlockProcessor( - &mock.MessengerStub{ + &p2pmocks.MessengerStub{ ConnectedPeersCalled: func() []core.PeerID { return []core.PeerID{"peer_0", "peer_1", "peer_2", "peer_3", "peer_4", "peer_5"} }, @@ -276,7 +277,7 @@ func TestEpochStartMetaBlockProcessor_GetEpochStartMetaBlockShouldWorkFromFirstT t.Parallel() esmbp, _ := NewEpochStartMetaBlockProcessor( - &mock.MessengerStub{ + &p2pmocks.MessengerStub{ ConnectedPeersCalled: func() []core.PeerID { return []core.PeerID{"peer_0", "peer_1", "peer_2", "peer_3", "peer_4", "peer_5"} }, @@ -320,7 +321,7 @@ func TestEpochStartMetaBlockProcessor_GetEpochStartMetaBlockShouldWorkAfterMulti func testEpochStartMbIsReceivedWithSleepBetweenReceivedMessages(t *testing.T, tts time.Duration) { esmbp, _ := NewEpochStartMetaBlockProcessor( - &mock.MessengerStub{ + &p2pmocks.MessengerStub{ ConnectedPeersCalled: func() []core.PeerID { return []core.PeerID{"peer_0", "peer_1", "peer_2", "peer_3", "peer_4", "peer_5"} }, diff --git a/epochStart/bootstrap/interface.go b/epochStart/bootstrap/interface.go index 84b9d2f56d5..c6c42878ab4 100644 --- a/epochStart/bootstrap/interface.go +++ b/epochStart/bootstrap/interface.go @@ -40,6 +40,8 @@ type Messenger interface { UnjoinAllTopics() error ConnectedPeers() []core.PeerID Verify(payload []byte, pid core.PeerID, signature []byte) error + Broadcast(topic string, buff []byte) + Sign(payload []byte) ([]byte, error) } // RequestHandler defines which methods a request handler should implement diff --git a/epochStart/bootstrap/process.go b/epochStart/bootstrap/process.go index b95fc35029d..5e444a42206 100644 --- a/epochStart/bootstrap/process.go +++ b/epochStart/bootstrap/process.go @@ -18,6 +18,7 @@ import ( "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/config" "github.com/ElrondNetwork/elrond-go/dataRetriever" + "github.com/ElrondNetwork/elrond-go/dataRetriever/blockchain" factoryDataPool "github.com/ElrondNetwork/elrond-go/dataRetriever/factory" "github.com/ElrondNetwork/elrond-go/dataRetriever/factory/containers" "github.com/ElrondNetwork/elrond-go/dataRetriever/factory/resolverscontainer" @@ -27,11 +28,14 @@ import ( factoryInterceptors "github.com/ElrondNetwork/elrond-go/epochStart/bootstrap/factory" "github.com/ElrondNetwork/elrond-go/epochStart/bootstrap/types" factoryDisabled "github.com/ElrondNetwork/elrond-go/factory/disabled" + "github.com/ElrondNetwork/elrond-go/heartbeat/sender" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/block/preprocess" "github.com/ElrondNetwork/elrond-go/process/heartbeat/validator" "github.com/ElrondNetwork/elrond-go/process/interceptors" disabledInterceptors "github.com/ElrondNetwork/elrond-go/process/interceptors/disabled" + "github.com/ElrondNetwork/elrond-go/process/peer" + "github.com/ElrondNetwork/elrond-go/redundancy" "github.com/ElrondNetwork/elrond-go/sharding" "github.com/ElrondNetwork/elrond-go/sharding/nodesCoordinator" "github.com/ElrondNetwork/elrond-go/state" @@ -169,7 +173,6 @@ type ArgsEpochStartBootstrap struct { HeaderIntegrityVerifier process.HeaderIntegrityVerifier DataSyncerCreator types.ScheduledDataSyncerCreator ScheduledSCRsStorer storage.Storer - BootstrapHeartbeatSender update.Closer } type dataToSync struct { @@ -214,7 +217,6 @@ func NewEpochStartBootstrap(args ArgsEpochStartBootstrap) (*epochStartBootstrap, dataSyncerFactory: args.DataSyncerCreator, storerScheduledSCRs: args.ScheduledSCRsStorer, shardCoordinator: args.GenesisShardCoordinator, - bootstrapHeartbeatSender: args.BootstrapHeartbeatSender, } whiteListCache, err := storageunit.NewCache(storageFactory.GetCacherFromConfig(epochStartProvider.generalConfig.WhiteListPool)) @@ -658,6 +660,11 @@ func (e *epochStartBootstrap) requestAndProcessing() (Parameters, error) { return Parameters{}, err } + err = e.createHeartbeatSender() + if err != nil { + return Parameters{}, err + } + if e.shardCoordinator.SelfId() == core.MetachainShardId { err = e.requestAndProcessForMeta(miniBlocks) if err != nil { @@ -1221,6 +1228,40 @@ func (e *epochStartBootstrap) applyShardIDAsObserverIfNeeded(receivedShardID uin return receivedShardID } +func (e *epochStartBootstrap) createHeartbeatSender() error { + privateKey := e.cryptoComponentsHolder.PrivateKey() + bootstrapRedundancy, err := redundancy.NewBootstrapNodeRedundancy(privateKey) + if err != nil { + return err + } + + heartbeatTopic := common.HeartbeatV2Topic + e.shardCoordinator.CommunicationIdentifier(e.shardCoordinator.SelfId()) + peerSubType := core.RegularPeer + if e.prefsConfig.FullArchive { + peerSubType = core.FullHistoryObserver + } + heartbeatCfg := e.generalConfig.HeartbeatV2 + argsHeartbeatSender := sender.ArgBootstrapSender{ + Messenger: e.messenger, + Marshaller: e.coreComponentsHolder.InternalMarshalizer(), + HeartbeatTopic: heartbeatTopic, + HeartbeatTimeBetweenSends: time.Second * time.Duration(heartbeatCfg.HeartbeatTimeBetweenSendsInSec), + HeartbeatTimeBetweenSendsWhenError: time.Second * time.Duration(heartbeatCfg.HeartbeatTimeBetweenSendsWhenErrorInSec), + HeartbeatThresholdBetweenSends: heartbeatCfg.HeartbeatThresholdBetweenSends, + VersionNumber: e.flagsConfig.Version, + NodeDisplayName: e.prefsConfig.NodeDisplayName, + Identity: e.prefsConfig.Identity, + PeerSubType: peerSubType, + CurrentBlockProvider: blockchain.NewBootstrapBlockchain(), + PrivateKey: privateKey, + RedundancyHandler: bootstrapRedundancy, + PeerTypeProvider: peer.NewBootstrapPeerTypeProvider(), + } + + e.bootstrapHeartbeatSender, err = sender.NewBootstrapSender(argsHeartbeatSender) + return err +} + func (e *epochStartBootstrap) closeTrieComponents() { if e.trieStorageManagers != nil { log.Debug("closing all trieStorageManagers", "num", len(e.trieStorageManagers)) diff --git a/epochStart/bootstrap/process_test.go b/epochStart/bootstrap/process_test.go index 21d7f452987..0dfb01f038d 100644 --- a/epochStart/bootstrap/process_test.go +++ b/epochStart/bootstrap/process_test.go @@ -36,6 +36,7 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon/genericMocks" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" "github.com/ElrondNetwork/elrond-go/testscommon/nodeTypeProviderMock" + "github.com/ElrondNetwork/elrond-go/testscommon/p2pmocks" "github.com/ElrondNetwork/elrond-go/testscommon/scheduledDataSyncer" "github.com/ElrondNetwork/elrond-go/testscommon/shardingMocks" statusHandlerMock "github.com/ElrondNetwork/elrond-go/testscommon/statusHandler" @@ -43,7 +44,6 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon/syncer" "github.com/ElrondNetwork/elrond-go/testscommon/validatorInfoCacher" "github.com/ElrondNetwork/elrond-go/trie/factory" - updateMocks "github.com/ElrondNetwork/elrond-go/update/mock" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -101,7 +101,7 @@ func createMockEpochStartBootstrapArgs( ScheduledSCRsStorer: genericMocks.NewStorerMock(), CoreComponentsHolder: coreMock, CryptoComponentsHolder: cryptoMock, - Messenger: &mock.MessengerStub{}, + Messenger: &p2pmocks.MessengerStub{}, GeneralConfig: config.Config{ MiniBlocksStorage: generalCfg.MiniBlocksStorage, PeerBlockBodyStorage: generalCfg.PeerBlockBodyStorage, @@ -223,7 +223,6 @@ func createMockEpochStartBootstrapArgs( FlagsConfig: config.ContextFlagsConfig{ ForceStartFromNetwork: false, }, - BootstrapHeartbeatSender: &updateMocks.CloserStub{}, } } @@ -1652,7 +1651,7 @@ func TestRequestAndProcessing(t *testing.T) { args.GenesisNodesConfig = getNodesConfigMock(1) expectedErr := errors.New("expected error") - args.Messenger = &mock.MessengerStub{ + args.Messenger = &p2pmocks.MessengerStub{ CreateTopicCalled: func(topic string, identifier bool) error { return expectedErr }, diff --git a/epochStart/bootstrap/storageEpochStartMetaBlockProcessor_test.go b/epochStart/bootstrap/storageEpochStartMetaBlockProcessor_test.go index a7381b8fce0..d87ce72882a 100644 --- a/epochStart/bootstrap/storageEpochStartMetaBlockProcessor_test.go +++ b/epochStart/bootstrap/storageEpochStartMetaBlockProcessor_test.go @@ -13,6 +13,7 @@ import ( "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" + "github.com/ElrondNetwork/elrond-go/testscommon/p2pmocks" "github.com/stretchr/testify/assert" ) @@ -29,7 +30,7 @@ func TestNewStorageEpochStartMetaBlockProcessor_InvalidArgumentsShouldErr(t *tes assert.Equal(t, epochStart.ErrNilMessenger, err) sesmbp, err = NewStorageEpochStartMetaBlockProcessor( - &mock.MessengerStub{}, + &p2pmocks.MessengerStub{}, nil, &mock.MarshalizerMock{}, &hashingMocks.HasherMock{}, @@ -38,7 +39,7 @@ func TestNewStorageEpochStartMetaBlockProcessor_InvalidArgumentsShouldErr(t *tes assert.Equal(t, epochStart.ErrNilRequestHandler, err) sesmbp, err = NewStorageEpochStartMetaBlockProcessor( - &mock.MessengerStub{}, + &p2pmocks.MessengerStub{}, &testscommon.RequestHandlerStub{}, nil, &hashingMocks.HasherMock{}, @@ -47,7 +48,7 @@ func TestNewStorageEpochStartMetaBlockProcessor_InvalidArgumentsShouldErr(t *tes assert.Equal(t, epochStart.ErrNilMarshalizer, err) sesmbp, err = NewStorageEpochStartMetaBlockProcessor( - &mock.MessengerStub{}, + &p2pmocks.MessengerStub{}, &testscommon.RequestHandlerStub{}, &mock.MarshalizerMock{}, nil, @@ -60,7 +61,7 @@ func TestNewStorageEpochStartMetaBlockProcessor_ShouldWork(t *testing.T) { t.Parallel() sesmbp, err := NewStorageEpochStartMetaBlockProcessor( - &mock.MessengerStub{}, + &p2pmocks.MessengerStub{}, &testscommon.RequestHandlerStub{}, &mock.MarshalizerMock{}, &hashingMocks.HasherMock{}, @@ -73,7 +74,7 @@ func TestStorageEpochStartMetaBlockProcessor_Validate(t *testing.T) { t.Parallel() sesmbp, _ := NewStorageEpochStartMetaBlockProcessor( - &mock.MessengerStub{}, + &p2pmocks.MessengerStub{}, &testscommon.RequestHandlerStub{}, &mock.MarshalizerMock{}, &hashingMocks.HasherMock{}, @@ -92,7 +93,7 @@ func TestStorageEpochStartMetaBlockProcessor_RegisterHandlerShouldNotPanic(t *te }() sesmbp, _ := NewStorageEpochStartMetaBlockProcessor( - &mock.MessengerStub{}, + &p2pmocks.MessengerStub{}, &testscommon.RequestHandlerStub{}, &mock.MarshalizerMock{}, &hashingMocks.HasherMock{}, @@ -104,7 +105,7 @@ func TestStorageEpochStartMetaBlockProcessor_SaveNilData(t *testing.T) { t.Parallel() sesmbp, _ := NewStorageEpochStartMetaBlockProcessor( - &mock.MessengerStub{}, + &p2pmocks.MessengerStub{}, &testscommon.RequestHandlerStub{}, &mock.MarshalizerMock{}, &hashingMocks.HasherMock{}, @@ -120,7 +121,7 @@ func TestStorageEpochStartMetaBlockProcessor_SaveNotAHeader(t *testing.T) { t.Parallel() sesmbp, _ := NewStorageEpochStartMetaBlockProcessor( - &mock.MessengerStub{}, + &p2pmocks.MessengerStub{}, &testscommon.RequestHandlerStub{}, &mock.MarshalizerMock{}, &hashingMocks.HasherMock{}, @@ -136,7 +137,7 @@ func TestStorageEpochStartMetaBlockProcessor_SaveNotAnEpochStartBlock(t *testing t.Parallel() sesmbp, _ := NewStorageEpochStartMetaBlockProcessor( - &mock.MessengerStub{}, + &p2pmocks.MessengerStub{}, &testscommon.RequestHandlerStub{}, &mock.MarshalizerMock{}, &hashingMocks.HasherMock{}, @@ -158,7 +159,7 @@ func TestStorageEpochStartMetaBlockProcessor_SaveShouldWork(t *testing.T) { t.Parallel() sesmbp, _ := NewStorageEpochStartMetaBlockProcessor( - &mock.MessengerStub{}, + &p2pmocks.MessengerStub{}, &testscommon.RequestHandlerStub{}, &mock.MarshalizerMock{}, &hashingMocks.HasherMock{}, @@ -195,7 +196,7 @@ func TestStorageEpochStartMetaBlockProcessor_GetEpochStartMetaBlockShouldRequest var sesmbp EpochStartMetaBlockInterceptorProcessor sesmbp, _ = NewStorageEpochStartMetaBlockProcessor( - &mock.MessengerStub{}, + &p2pmocks.MessengerStub{}, &testscommon.RequestHandlerStub{ RequestStartOfEpochMetaBlockCalled: func(epoch uint32) { numRequests++ @@ -218,7 +219,7 @@ func TestStorageEpochStartMetaBlockProcessor_GetEpochStartMetaBlockContextDoneSh var sesmbp EpochStartMetaBlockInterceptorProcessor sesmbp, _ = NewStorageEpochStartMetaBlockProcessor( - &mock.MessengerStub{}, + &p2pmocks.MessengerStub{}, &testscommon.RequestHandlerStub{}, &mock.MarshalizerMock{}, &hashingMocks.HasherMock{}, diff --git a/epochStart/bootstrap/syncEpochStartMeta_test.go b/epochStart/bootstrap/syncEpochStartMeta_test.go index 1711bea24c3..0fa41225e0e 100644 --- a/epochStart/bootstrap/syncEpochStartMeta_test.go +++ b/epochStart/bootstrap/syncEpochStartMeta_test.go @@ -17,6 +17,7 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon/cryptoMocks" "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" + "github.com/ElrondNetwork/elrond-go/testscommon/p2pmocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -64,7 +65,7 @@ func TestEpochStartMetaSyncer_SyncEpochStartMetaRegisterMessengerProcessorFailsS expectedErr := errors.New("expected error") args := getEpochStartSyncerArgs() - messenger := &mock.MessengerStub{ + messenger := &p2pmocks.MessengerStub{ RegisterMessageProcessorCalled: func(_ string, _ string, _ p2p.MessageProcessor) error { return expectedErr }, @@ -83,7 +84,7 @@ func TestEpochStartMetaSyncer_SyncEpochStartMetaProcessorFailsShouldErr(t *testi expectedErr := errors.New("expected error") args := getEpochStartSyncerArgs() - messenger := &mock.MessengerStub{ + messenger := &p2pmocks.MessengerStub{ ConnectedPeersCalled: func() []core.PeerID { return []core.PeerID{"peer_0", "peer_1", "peer_2", "peer_3", "peer_4", "peer_5"} }, @@ -109,7 +110,7 @@ func TestEpochStartMetaSyncer_SyncEpochStartMetaShouldWork(t *testing.T) { expectedMb := &block.MetaBlock{Nonce: 37} args := getEpochStartSyncerArgs() - messenger := &mock.MessengerStub{ + messenger := &p2pmocks.MessengerStub{ ConnectedPeersCalled: func() []core.PeerID { return []core.PeerID{"peer_0", "peer_1", "peer_2", "peer_3", "peer_4", "peer_5"} }, @@ -150,7 +151,7 @@ func getEpochStartSyncerArgs() ArgsNewEpochStartMetaSyncer { TxKeyGen: &cryptoMocks.KeyGenStub{}, }, RequestHandler: &testscommon.RequestHandlerStub{}, - Messenger: &mock.MessengerStub{}, + Messenger: &p2pmocks.MessengerStub{}, ShardCoordinator: mock.NewMultiShardsCoordinatorMock(2), EconomicsData: &economicsmocks.EconomicsHandlerStub{}, WhitelistHandler: &testscommon.WhiteListHandlerStub{}, diff --git a/epochStart/errors.go b/epochStart/errors.go index d6246bb48fd..e2b8499618b 100644 --- a/epochStart/errors.go +++ b/epochStart/errors.go @@ -322,6 +322,3 @@ var ErrNilEnableEpochsHandler = errors.New("nil enable epochs handler") // ErrNilValidatorInfoStorage signals that nil validator info storage has been provided var ErrNilValidatorInfoStorage = errors.New("nil validator info storage") - -// ErrNilHeartbeatSender signals that nil heartbeat sender has been provided -var ErrNilHeartbeatSender = errors.New("nil heartbeat sender") diff --git a/epochStart/mock/cryptoComponentsMock.go b/epochStart/mock/cryptoComponentsMock.go index 1d65646728c..7487522c8d0 100644 --- a/epochStart/mock/cryptoComponentsMock.go +++ b/epochStart/mock/cryptoComponentsMock.go @@ -10,6 +10,7 @@ import ( // CryptoComponentsMock - type CryptoComponentsMock struct { + PrivKey crypto.PrivateKey PubKey crypto.PublicKey BlockSig crypto.SingleSigner TxSig crypto.SingleSigner @@ -20,6 +21,11 @@ type CryptoComponentsMock struct { mutCrypto sync.RWMutex } +// PrivateKey - +func (ccm *CryptoComponentsMock) PrivateKey() crypto.PrivateKey { + return ccm.PrivKey +} + // PublicKey - func (ccm *CryptoComponentsMock) PublicKey() crypto.PublicKey { return ccm.PubKey diff --git a/epochStart/mock/messengerStub.go b/epochStart/mock/messengerStub.go deleted file mode 100644 index 13634d7d613..00000000000 --- a/epochStart/mock/messengerStub.go +++ /dev/null @@ -1,104 +0,0 @@ -package mock - -import ( - "github.com/ElrondNetwork/elrond-go-core/core" - "github.com/ElrondNetwork/elrond-go/p2p" -) - -// MessengerStub - -type MessengerStub struct { - ConnectedPeersCalled func() []core.PeerID - RegisterMessageProcessorCalled func(topic string, identifier string, handler p2p.MessageProcessor) error - CreateTopicCalled func(topic string, identifier bool) error - UnjoinAllTopicsCalled func() error - IDCalled func() core.PeerID - VerifyCalled func(payload []byte, pid core.PeerID, signature []byte) error -} - -// ConnectedPeersOnTopic - -func (m *MessengerStub) ConnectedPeersOnTopic(_ string) []core.PeerID { - return []core.PeerID{"peer0"} -} - -// ConnectedFullHistoryPeersOnTopic - -func (m *MessengerStub) ConnectedFullHistoryPeersOnTopic(_ string) []core.PeerID { - return []core.PeerID{"peer0"} -} - -// SendToConnectedPeer - -func (m *MessengerStub) SendToConnectedPeer(_ string, _ []byte, _ core.PeerID) error { - return nil -} - -// IsInterfaceNil - -func (m *MessengerStub) IsInterfaceNil() bool { - return m == nil -} - -// HasTopic - -func (m *MessengerStub) HasTopic(_ string) bool { - return false -} - -// CreateTopic - -func (m *MessengerStub) CreateTopic(topic string, identifier bool) error { - if m.CreateTopicCalled != nil { - return m.CreateTopicCalled(topic, identifier) - } - return nil -} - -// RegisterMessageProcessor - -func (m *MessengerStub) RegisterMessageProcessor(topic string, identifier string, handler p2p.MessageProcessor) error { - if m.RegisterMessageProcessorCalled != nil { - return m.RegisterMessageProcessorCalled(topic, identifier, handler) - } - - return nil -} - -// UnregisterMessageProcessor - -func (m *MessengerStub) UnregisterMessageProcessor(_ string, _ string) error { - return nil -} - -// UnregisterAllMessageProcessors - -func (m *MessengerStub) UnregisterAllMessageProcessors() error { - return nil -} - -// UnjoinAllTopics - -func (m *MessengerStub) UnjoinAllTopics() error { - if m.UnjoinAllTopicsCalled != nil { - return m.UnjoinAllTopicsCalled() - } - - return nil -} - -// ConnectedPeers - -func (m *MessengerStub) ConnectedPeers() []core.PeerID { - if m.ConnectedPeersCalled != nil { - return m.ConnectedPeersCalled() - } - - return []core.PeerID{"peer0", "peer1", "peer2", "peer3", "peer4", "peer5"} -} - -// ID - -func (m *MessengerStub) ID() core.PeerID { - if m.IDCalled != nil { - return m.IDCalled() - } - - return "peer ID" -} - -// Verify - -func (m *MessengerStub) Verify(payload []byte, pid core.PeerID, signature []byte) error { - if m.VerifyCalled != nil { - return m.VerifyCalled(payload, pid, signature) - } - - return nil -} diff --git a/factory/bootstrap/bootstrapComponents.go b/factory/bootstrap/bootstrapComponents.go index a08d54eae26..2995e46af77 100644 --- a/factory/bootstrap/bootstrapComponents.go +++ b/factory/bootstrap/bootstrapComponents.go @@ -3,7 +3,6 @@ package bootstrap import ( "fmt" "path/filepath" - "time" "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" @@ -11,23 +10,18 @@ import ( nodeFactory "github.com/ElrondNetwork/elrond-go/cmd/node/factory" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/config" - "github.com/ElrondNetwork/elrond-go/dataRetriever/blockchain" "github.com/ElrondNetwork/elrond-go/epochStart/bootstrap" "github.com/ElrondNetwork/elrond-go/errors" "github.com/ElrondNetwork/elrond-go/factory" "github.com/ElrondNetwork/elrond-go/factory/block" - "github.com/ElrondNetwork/elrond-go/heartbeat/sender" "github.com/ElrondNetwork/elrond-go/process/headerCheck" - "github.com/ElrondNetwork/elrond-go/process/peer" "github.com/ElrondNetwork/elrond-go/process/smartContract" - "github.com/ElrondNetwork/elrond-go/redundancy" "github.com/ElrondNetwork/elrond-go/sharding" "github.com/ElrondNetwork/elrond-go/storage" "github.com/ElrondNetwork/elrond-go/storage/directoryhandler" storageFactory "github.com/ElrondNetwork/elrond-go/storage/factory" "github.com/ElrondNetwork/elrond-go/storage/latestData" "github.com/ElrondNetwork/elrond-go/storage/storageunit" - "github.com/ElrondNetwork/elrond-go/update" ) var log = logger.GetOrCreate("factory") @@ -163,11 +157,6 @@ func (bcf *bootstrapComponentsFactory) Create() (*bootstrapComponents, error) { return nil, err } - bootstrapHeartbeatSender, err := bcf.createHeartbeatSender(genesisShardCoordinator) - if err != nil { - return nil, err - } - dataSyncerFactory := bootstrap.NewScheduledDataSyncerFactory() epochStartBootstrapArgs := bootstrap.ArgsEpochStartBootstrap{ @@ -190,8 +179,7 @@ func (bcf *bootstrapComponentsFactory) Create() (*bootstrapComponents, error) { StatusHandler: bcf.coreComponents.StatusHandler(), HeaderIntegrityVerifier: headerIntegrityVerifier, DataSyncerCreator: dataSyncerFactory, - ScheduledSCRsStorer: nil, // will be updated after sync from network - BootstrapHeartbeatSender: bootstrapHeartbeatSender, // will be closed after sync + ScheduledSCRsStorer: nil, // will be updated after sync from network } var epochStartBootstrapper factory.EpochStartBootstrapper @@ -257,39 +245,6 @@ func (bcf *bootstrapComponentsFactory) createHeaderFactory(handler nodeFactory.H return block.NewShardHeaderFactory(handler) } -func (bcf *bootstrapComponentsFactory) createHeartbeatSender(shardCoordinator sharding.Coordinator) (update.Closer, error) { - privateKey := bcf.cryptoComponents.PrivateKey() - bootstrapRedundancy, err := redundancy.NewBootstrapNodeRedundancy(privateKey) - if err != nil { - return nil, err - } - - heartbeatTopic := common.HeartbeatV2Topic + shardCoordinator.CommunicationIdentifier(shardCoordinator.SelfId()) - peerSubType := core.RegularPeer - if bcf.prefConfig.Preferences.FullArchive { - peerSubType = core.FullHistoryObserver - } - heartbeatCfg := bcf.config.HeartbeatV2 - argsHeartbeatSender := sender.ArgBootstrapSender{ - Messenger: bcf.networkComponents.NetworkMessenger(), - Marshaller: bcf.coreComponents.InternalMarshalizer(), - HeartbeatTopic: heartbeatTopic, - HeartbeatTimeBetweenSends: time.Second * time.Duration(heartbeatCfg.HeartbeatTimeBetweenSendsInSec), - HeartbeatTimeBetweenSendsWhenError: time.Second * time.Duration(heartbeatCfg.HeartbeatTimeBetweenSendsWhenErrorInSec), - HeartbeatThresholdBetweenSends: heartbeatCfg.HeartbeatThresholdBetweenSends, - VersionNumber: bcf.flagsConfig.Version, - NodeDisplayName: bcf.prefConfig.Preferences.NodeDisplayName, - Identity: bcf.prefConfig.Preferences.Identity, - PeerSubType: peerSubType, - CurrentBlockProvider: blockchain.NewBootstrapBlockchain(), - PrivateKey: privateKey, - RedundancyHandler: bootstrapRedundancy, - PeerTypeProvider: peer.NewBootstrapPeerTypeProvider(), - } - - return sender.NewBootstrapSender(argsHeartbeatSender) -} - // Close closes the bootstrap components, closing at the same time any running goroutines func (bc *bootstrapComponents) Close() error { // TODO: close all components diff --git a/factory/status/statusComponents.go b/factory/status/statusComponents.go index 80ee44a1f04..e7c4f788a2e 100644 --- a/factory/status/statusComponents.go +++ b/factory/status/statusComponents.go @@ -32,7 +32,6 @@ type statusComponents struct { statusHandler core.AppStatusHandler outportHandler outport.OutportHandler softwareVersion statistics.SoftwareVersionChecker - resourceMonitor statistics.ResourceMonitorHandler cancelFunc func() } diff --git a/integrationTests/multiShard/endOfEpoch/startInEpoch/startInEpoch_test.go b/integrationTests/multiShard/endOfEpoch/startInEpoch/startInEpoch_test.go index b77f90b9cfc..46412193c65 100644 --- a/integrationTests/multiShard/endOfEpoch/startInEpoch/startInEpoch_test.go +++ b/integrationTests/multiShard/endOfEpoch/startInEpoch/startInEpoch_test.go @@ -35,7 +35,6 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon/scheduledDataSyncer" "github.com/ElrondNetwork/elrond-go/testscommon/shardingMocks" statusHandlerMock "github.com/ElrondNetwork/elrond-go/testscommon/statusHandler" - updateMocks "github.com/ElrondNetwork/elrond-go/update/mock" "github.com/stretchr/testify/assert" ) @@ -259,7 +258,6 @@ func testNodeStartsInEpoch(t *testing.T, shardID uint32, expectedHighestRound ui FlagsConfig: config.ContextFlagsConfig{ ForceStartFromNetwork: false, }, - BootstrapHeartbeatSender: &updateMocks.CloserStub{}, } epochStartBootstrap, err := bootstrap.NewEpochStartBootstrap(argsBootstrapHandler) diff --git a/process/interface.go b/process/interface.go index ec847e18209..d75a002995b 100644 --- a/process/interface.go +++ b/process/interface.go @@ -1142,6 +1142,7 @@ type CryptoComponentsHolder interface { SetMultiSignerContainer(ms cryptoCommon.MultiSignerContainer) error PeerSignatureHandler() crypto.PeerSignatureHandler PublicKey() crypto.PublicKey + PrivateKey() crypto.PrivateKey Clone() interface{} IsInterfaceNil() bool } diff --git a/process/mock/cryptoComponentsMock.go b/process/mock/cryptoComponentsMock.go index 60bd0918dca..09632b91bac 100644 --- a/process/mock/cryptoComponentsMock.go +++ b/process/mock/cryptoComponentsMock.go @@ -17,6 +17,7 @@ type CryptoComponentsMock struct { BlKeyGen crypto.KeyGenerator TxKeyGen crypto.KeyGenerator PubKey crypto.PublicKey + PrivKey crypto.PrivateKey mutMultiSig sync.RWMutex } @@ -82,6 +83,11 @@ func (ccm *CryptoComponentsMock) PublicKey() crypto.PublicKey { return ccm.PubKey } +// PrivateKey - +func (ccm *CryptoComponentsMock) PrivateKey() crypto.PrivateKey { + return ccm.PrivKey +} + // Clone - func (ccm *CryptoComponentsMock) Clone() interface{} { return &CryptoComponentsMock{ diff --git a/testscommon/trie/statisticsMock.go b/testscommon/trie/statisticsMock.go index a2b5be5733d..5cc1e98a45b 100644 --- a/testscommon/trie/statisticsMock.go +++ b/testscommon/trie/statisticsMock.go @@ -6,9 +6,6 @@ import ( // MockStatistics - type MockStatistics struct { - size uint64 - numDataTries uint64 - numNodes uint64 WaitForSnapshotsToFinishCalled func() } From d39e1d3fdf5c83eab04272067731468d44f3168c Mon Sep 17 00:00:00 2001 From: BeniaminDrasovean Date: Mon, 17 Oct 2022 18:44:28 +0300 Subject: [PATCH 023/110] add depth parameter to tryGet method from trie --- trie/branchNode.go | 14 +++++++------- trie/branchNode_test.go | 25 ++++++++++++++++--------- trie/extensionNode.go | 12 ++++++------ trie/extensionNode_test.go | 30 ++++++++++++++++++------------ trie/interface.go | 2 +- trie/leafNode.go | 8 ++++---- trie/leafNode_test.go | 16 ++++++++++------ trie/patriciaMerkleTrie.go | 2 +- 8 files changed, 63 insertions(+), 46 deletions(-) diff --git a/trie/branchNode.go b/trie/branchNode.go index 3a64b651eb9..7d8cc34c221 100644 --- a/trie/branchNode.go +++ b/trie/branchNode.go @@ -442,28 +442,28 @@ func (bn *branchNode) isPosCollapsed(pos int) bool { return bn.children[pos] == nil && len(bn.EncodedChildren[pos]) != 0 } -func (bn *branchNode) tryGet(key []byte, db common.DBWriteCacher) (value []byte, err error) { +func (bn *branchNode) tryGet(key []byte, currentDepth uint32, db common.DBWriteCacher) (value []byte, maxDepth uint32, err error) { err = bn.isEmptyOrNil() if err != nil { - return nil, fmt.Errorf("tryGet error %w", err) + return nil, currentDepth, fmt.Errorf("tryGet error %w", err) } if len(key) == 0 { - return nil, nil + return nil, currentDepth, nil } childPos := key[firstByte] if childPosOutOfRange(childPos) { - return nil, ErrChildPosOutOfRange + return nil, currentDepth, ErrChildPosOutOfRange } key = key[1:] err = resolveIfCollapsed(bn, childPos, db) if err != nil { - return nil, err + return nil, currentDepth, err } if bn.children[childPos] == nil { - return nil, nil + return nil, currentDepth, nil } - return bn.children[childPos].tryGet(key, db) + return bn.children[childPos].tryGet(key, currentDepth+1, db) } func (bn *branchNode) getNext(key []byte, db common.DBWriteCacher) (node, []byte, error) { diff --git a/trie/branchNode_test.go b/trie/branchNode_test.go index abf64d5bdec..77ba18777d7 100644 --- a/trie/branchNode_test.go +++ b/trie/branchNode_test.go @@ -492,9 +492,10 @@ func TestBranchNode_tryGet(t *testing.T) { childPos := byte(2) key := append([]byte{childPos}, []byte("dog")...) - val, err := bn.tryGet(key, nil) + val, maxDepth, err := bn.tryGet(key, 0, nil) assert.Equal(t, []byte("dog"), val) assert.Nil(t, err) + assert.Equal(t, uint32(1), maxDepth) } func TestBranchNode_tryGetEmptyKey(t *testing.T) { @@ -503,9 +504,10 @@ func TestBranchNode_tryGetEmptyKey(t *testing.T) { bn, _ := getBnAndCollapsedBn(getTestMarshalizerAndHasher()) var key []byte - val, err := bn.tryGet(key, nil) + val, maxDepth, err := bn.tryGet(key, 0, nil) assert.Nil(t, err) assert.Nil(t, val) + assert.Equal(t, uint32(0), maxDepth) } func TestBranchNode_tryGetChildPosOutOfRange(t *testing.T) { @@ -514,9 +516,10 @@ func TestBranchNode_tryGetChildPosOutOfRange(t *testing.T) { bn, _ := getBnAndCollapsedBn(getTestMarshalizerAndHasher()) key := []byte("dog") - val, err := bn.tryGet(key, nil) + val, maxDepth, err := bn.tryGet(key, 0, nil) assert.Equal(t, ErrChildPosOutOfRange, err) assert.Nil(t, val) + assert.Equal(t, uint32(0), maxDepth) } func TestBranchNode_tryGetNilChild(t *testing.T) { @@ -525,9 +528,10 @@ func TestBranchNode_tryGetNilChild(t *testing.T) { bn, _ := getBnAndCollapsedBn(getTestMarshalizerAndHasher()) nilChildKey := []byte{3} - val, err := bn.tryGet(nilChildKey, nil) + val, maxDepth, err := bn.tryGet(nilChildKey, 0, nil) assert.Nil(t, err) assert.Nil(t, val) + assert.Equal(t, uint32(0), maxDepth) } func TestBranchNode_tryGetCollapsedNode(t *testing.T) { @@ -542,9 +546,10 @@ func TestBranchNode_tryGetCollapsedNode(t *testing.T) { childPos := byte(2) key := append([]byte{childPos}, []byte("dog")...) - val, err := collapsedBn.tryGet(key, db) + val, maxDepth, err := collapsedBn.tryGet(key, 0, db) assert.Equal(t, []byte("dog"), val) assert.Nil(t, err) + assert.Equal(t, uint32(1), maxDepth) } func TestBranchNode_tryGetEmptyNode(t *testing.T) { @@ -554,9 +559,10 @@ func TestBranchNode_tryGetEmptyNode(t *testing.T) { childPos := byte(2) key := append([]byte{childPos}, []byte("dog")...) - val, err := bn.tryGet(key, nil) + val, maxDepth, err := bn.tryGet(key, 0, nil) assert.True(t, errors.Is(err, ErrEmptyBranchNode)) assert.Nil(t, val) + assert.Equal(t, uint32(0), maxDepth) } func TestBranchNode_tryGetNilNode(t *testing.T) { @@ -566,9 +572,10 @@ func TestBranchNode_tryGetNilNode(t *testing.T) { childPos := byte(2) key := append([]byte{childPos}, []byte("dog")...) - val, err := bn.tryGet(key, nil) + val, maxDepth, err := bn.tryGet(key, 0, nil) assert.True(t, errors.Is(err, ErrNilBranchNode)) assert.Nil(t, val) + assert.Equal(t, uint32(0), maxDepth) } func TestBranchNode_getNext(t *testing.T) { @@ -667,7 +674,7 @@ func TestBranchNode_insertCollapsedNode(t *testing.T) { assert.NotNil(t, newBn) assert.Nil(t, err) - val, _ := newBn.tryGet(key, db) + val, _, _ := newBn.tryGet(key, 0, db) assert.Equal(t, []byte("dogs"), val) } @@ -870,7 +877,7 @@ func TestBranchNode_deleteCollapsedNode(t *testing.T) { assert.True(t, dirty) assert.Nil(t, err) - val, err := newBn.tryGet(key, db) + val, _, err := newBn.tryGet(key, 0, db) assert.Nil(t, val) assert.Nil(t, err) } diff --git a/trie/extensionNode.go b/trie/extensionNode.go index 490a3f704c6..c6c092bc3ea 100644 --- a/trie/extensionNode.go +++ b/trie/extensionNode.go @@ -329,26 +329,26 @@ func (en *extensionNode) isPosCollapsed(_ int) bool { return en.isCollapsed() } -func (en *extensionNode) tryGet(key []byte, db common.DBWriteCacher) (value []byte, err error) { +func (en *extensionNode) tryGet(key []byte, currentDepth uint32, db common.DBWriteCacher) (value []byte, maxDepth uint32, err error) { err = en.isEmptyOrNil() if err != nil { - return nil, fmt.Errorf("tryGet error %w", err) + return nil, currentDepth, fmt.Errorf("tryGet error %w", err) } keyTooShort := len(key) < len(en.Key) if keyTooShort { - return nil, nil + return nil, currentDepth, nil } keysDontMatch := !bytes.Equal(en.Key, key[:len(en.Key)]) if keysDontMatch { - return nil, nil + return nil, currentDepth, nil } key = key[len(en.Key):] err = resolveIfCollapsed(en, 0, db) if err != nil { - return nil, err + return nil, currentDepth, err } - return en.child.tryGet(key, db) + return en.child.tryGet(key, currentDepth+1, db) } func (en *extensionNode) getNext(key []byte, db common.DBWriteCacher) (node, []byte, error) { diff --git a/trie/extensionNode_test.go b/trie/extensionNode_test.go index 55c0f06c4cd..11606939b15 100644 --- a/trie/extensionNode_test.go +++ b/trie/extensionNode_test.go @@ -380,9 +380,10 @@ func TestExtensionNode_tryGet(t *testing.T) { key := append(enKey, bnKey...) key = append(key, lnKey...) - val, err := en.tryGet(key, nil) + val, maxDepth, err := en.tryGet(key, 0, nil) assert.Equal(t, dogBytes, val) assert.Nil(t, err) + assert.Equal(t, uint32(2), maxDepth) } func TestExtensionNode_tryGetEmptyKey(t *testing.T) { @@ -391,9 +392,10 @@ func TestExtensionNode_tryGetEmptyKey(t *testing.T) { en, _ := getEnAndCollapsedEn() var key []byte - val, err := en.tryGet(key, nil) + val, maxDepth, err := en.tryGet(key, 0, nil) assert.Nil(t, err) assert.Nil(t, val) + assert.Equal(t, uint32(0), maxDepth) } func TestExtensionNode_tryGetWrongKey(t *testing.T) { @@ -402,9 +404,10 @@ func TestExtensionNode_tryGetWrongKey(t *testing.T) { en, _ := getEnAndCollapsedEn() key := []byte("gdo") - val, err := en.tryGet(key, nil) + val, maxDepth, err := en.tryGet(key, 0, nil) assert.Nil(t, err) assert.Nil(t, val) + assert.Equal(t, uint32(0), maxDepth) } func TestExtensionNode_tryGetCollapsedNode(t *testing.T) { @@ -421,9 +424,10 @@ func TestExtensionNode_tryGetCollapsedNode(t *testing.T) { key := append(enKey, bnKey...) key = append(key, lnKey...) - val, err := collapsedEn.tryGet(key, db) + val, maxDepth, err := collapsedEn.tryGet(key, 0, db) assert.Equal(t, []byte("dog"), val) assert.Nil(t, err) + assert.Equal(t, uint32(2), maxDepth) } func TestExtensionNode_tryGetEmptyNode(t *testing.T) { @@ -432,9 +436,10 @@ func TestExtensionNode_tryGetEmptyNode(t *testing.T) { en := &extensionNode{} key := []byte("dog") - val, err := en.tryGet(key, nil) + val, maxDepth, err := en.tryGet(key, 0, nil) assert.True(t, errors.Is(err, ErrEmptyExtensionNode)) assert.Nil(t, val) + assert.Equal(t, uint32(0), maxDepth) } func TestExtensionNode_tryGetNilNode(t *testing.T) { @@ -443,9 +448,10 @@ func TestExtensionNode_tryGetNilNode(t *testing.T) { var en *extensionNode key := []byte("dog") - val, err := en.tryGet(key, nil) + val, maxDepth, err := en.tryGet(key, 0, nil) assert.True(t, errors.Is(err, ErrNilExtensionNode)) assert.Nil(t, val) + assert.Equal(t, uint32(0), maxDepth) } func TestExtensionNode_getNext(t *testing.T) { @@ -491,7 +497,7 @@ func TestExtensionNode_insert(t *testing.T) { assert.NotNil(t, newNode) assert.Nil(t, err) - val, _ := newNode.tryGet(key, nil) + val, _, _ := newNode.tryGet(key, 0, nil) assert.Equal(t, []byte("dogs"), val) } @@ -510,7 +516,7 @@ func TestExtensionNode_insertCollapsedNode(t *testing.T) { assert.NotNil(t, newNode) assert.Nil(t, err) - val, _ := newNode.tryGet(key, db) + val, _, _ := newNode.tryGet(key, 0, db) assert.Equal(t, []byte("dogs"), val) } @@ -605,13 +611,13 @@ func TestExtensionNode_delete(t *testing.T) { key := append(enKey, bnKey...) key = append(key, lnKey...) - val, _ := en.tryGet(key, nil) + val, _, _ := en.tryGet(key, 0, nil) assert.Equal(t, dogBytes, val) dirty, _, _, err := en.delete(key, nil) assert.True(t, dirty) assert.Nil(t, err) - val, _ = en.tryGet(key, nil) + val, _, _ = en.tryGet(key, 0, nil) assert.Nil(t, val) } @@ -697,13 +703,13 @@ func TestExtensionNode_deleteCollapsedNode(t *testing.T) { key := append(enKey, bnKey...) key = append(key, lnKey...) - val, _ := en.tryGet(key, db) + val, _, _ := en.tryGet(key, 0, db) assert.Equal(t, []byte("dog"), val) dirty, newNode, _, err := collapsedEn.delete(key, db) assert.True(t, dirty) assert.Nil(t, err) - val, _ = newNode.tryGet(key, db) + val, _, _ = newNode.tryGet(key, 0, db) assert.Nil(t, val) } diff --git a/trie/interface.go b/trie/interface.go index 0d5e30f5435..a18d73947cb 100644 --- a/trie/interface.go +++ b/trie/interface.go @@ -27,7 +27,7 @@ type node interface { resolveCollapsed(pos byte, db common.DBWriteCacher) error hashNode() ([]byte, error) hashChildren() error - tryGet(key []byte, db common.DBWriteCacher) ([]byte, error) + tryGet(key []byte, depth uint32, db common.DBWriteCacher) ([]byte, uint32, error) getNext(key []byte, db common.DBWriteCacher) (node, []byte, error) insert(n *leafNode, db common.DBWriteCacher) (node, [][]byte, error) delete(key []byte, db common.DBWriteCacher) (bool, node, [][]byte, error) diff --git a/trie/leafNode.go b/trie/leafNode.go index 5e6c16978fb..8ce78650053 100644 --- a/trie/leafNode.go +++ b/trie/leafNode.go @@ -248,16 +248,16 @@ func (ln *leafNode) isPosCollapsed(_ int) bool { return false } -func (ln *leafNode) tryGet(key []byte, _ common.DBWriteCacher) (value []byte, err error) { +func (ln *leafNode) tryGet(key []byte, currentDepth uint32, _ common.DBWriteCacher) (value []byte, maxDepth uint32, err error) { err = ln.isEmptyOrNil() if err != nil { - return nil, fmt.Errorf("tryGet error %w", err) + return nil, currentDepth, fmt.Errorf("tryGet error %w", err) } if bytes.Equal(key, ln.Key) { - return ln.Value, nil + return ln.Value, currentDepth, nil } - return nil, nil + return nil, currentDepth, nil } func (ln *leafNode) getNext(key []byte, _ common.DBWriteCacher) (node, []byte, error) { diff --git a/trie/leafNode_test.go b/trie/leafNode_test.go index 6a918b702fd..19f6253463f 100644 --- a/trie/leafNode_test.go +++ b/trie/leafNode_test.go @@ -236,9 +236,10 @@ func TestLeafNode_tryGet(t *testing.T) { ln := getLn(getTestMarshalizerAndHasher()) key := []byte("dog") - val, err := ln.tryGet(key, nil) + val, maxDepth, err := ln.tryGet(key, 0, nil) assert.Equal(t, []byte("dog"), val) assert.Nil(t, err) + assert.Equal(t, uint32(0), maxDepth) } func TestLeafNode_tryGetWrongKey(t *testing.T) { @@ -247,9 +248,10 @@ func TestLeafNode_tryGetWrongKey(t *testing.T) { ln := getLn(getTestMarshalizerAndHasher()) wrongKey := []byte{1, 2, 3} - val, err := ln.tryGet(wrongKey, nil) + val, maxDepth, err := ln.tryGet(wrongKey, 0, nil) assert.Nil(t, val) assert.Nil(t, err) + assert.Equal(t, uint32(0), maxDepth) } func TestLeafNode_tryGetEmptyNode(t *testing.T) { @@ -258,9 +260,10 @@ func TestLeafNode_tryGetEmptyNode(t *testing.T) { ln := &leafNode{} key := []byte("dog") - val, err := ln.tryGet(key, nil) + val, maxDepth, err := ln.tryGet(key, 0, nil) assert.True(t, errors.Is(err, ErrEmptyLeafNode)) assert.Nil(t, val) + assert.Equal(t, uint32(0), maxDepth) } func TestLeafNode_tryGetNilNode(t *testing.T) { @@ -269,9 +272,10 @@ func TestLeafNode_tryGetNilNode(t *testing.T) { var ln *leafNode key := []byte("dog") - val, err := ln.tryGet(key, nil) + val, maxDepth, err := ln.tryGet(key, 0, nil) assert.True(t, errors.Is(err, ErrNilLeafNode)) assert.Nil(t, val) + assert.Equal(t, uint32(0), maxDepth) } func TestLeafNode_getNext(t *testing.T) { @@ -322,7 +326,7 @@ func TestLeafNode_insertAtSameKey(t *testing.T) { assert.NotNil(t, newNode) assert.Nil(t, err) - val, _ := newNode.tryGet(key, nil) + val, _, _ := newNode.tryGet(key, 0, nil) assert.Equal(t, expectedVal, val) } @@ -342,7 +346,7 @@ func TestLeafNode_insertAtDifferentKey(t *testing.T) { assert.NotNil(t, newNode) assert.Nil(t, err) - val, _ := newNode.tryGet(nodeKey, nil) + val, _, _ := newNode.tryGet(nodeKey, 0, nil) assert.Equal(t, nodeVal, val) assert.IsType(t, &branchNode{}, newNode) } diff --git a/trie/patriciaMerkleTrie.go b/trie/patriciaMerkleTrie.go index dad20bccf9d..e1b8ead0896 100644 --- a/trie/patriciaMerkleTrie.go +++ b/trie/patriciaMerkleTrie.go @@ -89,7 +89,7 @@ func (tr *patriciaMerkleTrie) Get(key []byte) ([]byte, error) { } hexKey := keyBytesToHex(key) - val, err := tr.root.tryGet(hexKey, tr.trieStorage) + val, _, err := tr.root.tryGet(hexKey, rootDepthLevel, tr.trieStorage) if err != nil { err = fmt.Errorf("trie get error: %w, for key %v", err, hex.EncodeToString(key)) return nil, err From e95df2888d8c18445f86dcbb372410d78d2c5708 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 17 Oct 2022 18:47:27 +0300 Subject: [PATCH 024/110] fix tests and messenger stub ID() method --- epochStart/bootstrap/process_test.go | 1 + testscommon/p2pmocks/messengerStub.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/epochStart/bootstrap/process_test.go b/epochStart/bootstrap/process_test.go index 0dfb01f038d..09ad454ca0d 100644 --- a/epochStart/bootstrap/process_test.go +++ b/epochStart/bootstrap/process_test.go @@ -84,6 +84,7 @@ func createComponentsForEpochStart() (*mock.CoreComponentsMock, *mock.CryptoComp }, &mock.CryptoComponentsMock{ PubKey: &cryptoMocks.PublicKeyStub{}, + PrivKey: &cryptoMocks.PrivateKeyStub{}, BlockSig: &cryptoMocks.SignerStub{}, TxSig: &cryptoMocks.SignerStub{}, BlKeyGen: &cryptoMocks.KeyGenStub{}, diff --git a/testscommon/p2pmocks/messengerStub.go b/testscommon/p2pmocks/messengerStub.go index ea6bfddb3f1..f423d3666d2 100644 --- a/testscommon/p2pmocks/messengerStub.go +++ b/testscommon/p2pmocks/messengerStub.go @@ -61,7 +61,7 @@ func (ms *MessengerStub) ID() core.PeerID { return ms.IDCalled() } - return "" + return "peer ID" } // RegisterMessageProcessor - From a052aea616988e5bb2f2e6279b0f526b6317ac66 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 17 Oct 2022 18:57:00 +0300 Subject: [PATCH 025/110] moved trieSyncStatistics into statusCoreComponents in order to pass it to bootstrap components as well --- epochStart/bootstrap/common.go | 6 + epochStart/bootstrap/process.go | 5 + epochStart/bootstrap/process_test.go | 25 +++- epochStart/errors.go | 6 + epochStart/mock/statusCoreComponentsMock.go | 18 +++ errors/errors.go | 3 + factory/bootstrap/bootstrapComponents.go | 59 +++++---- factory/consensus/consensusComponents.go | 2 + factory/interface.go | 13 ++ factory/statusCore/statusCoreComponents.go | 11 +- .../statusCore/statusCoreComponentsHandler.go | 15 +++ heartbeat/errors.go | 3 + heartbeat/heartbeat.pb.go | 97 ++++++++++----- heartbeat/interface.go | 6 + heartbeat/proto/heartbeat.proto | 5 +- heartbeat/sender/bootstrapSender.go | 14 ++- heartbeat/sender/bootstrapSender_test.go | 11 ++ .../disabled/trieSyncStatisticsProvider.go | 19 +++ heartbeat/sender/heartbeatSender.go | 50 ++++---- heartbeat/sender/heartbeatSender_test.go | 35 ++++-- heartbeat/sender/peerAuthenticationSender.go | 5 +- heartbeat/sender/sender.go | 14 ++- .../state/stateTrieSync/stateTrieSync_test.go | 3 +- node/nodeRunner.go | 2 + process/interface.go | 18 +++ state/errors.go | 3 + state/syncer/baseAccountsSyncer.go | 44 +++---- state/syncer/userAccountsSyncer.go | 16 ++- state/syncer/validatorAccountsSyncer.go | 6 +- testscommon/sizeSyncStatisticsHandlerStub.go | 113 ++++++++++++++++++ .../accountDBSyncerContainerFactory.go | 2 + 31 files changed, 492 insertions(+), 137 deletions(-) create mode 100644 epochStart/mock/statusCoreComponentsMock.go create mode 100644 heartbeat/sender/disabled/trieSyncStatisticsProvider.go create mode 100644 testscommon/sizeSyncStatisticsHandlerStub.go diff --git a/epochStart/bootstrap/common.go b/epochStart/bootstrap/common.go index 03160c08145..90d0b55d5be 100644 --- a/epochStart/bootstrap/common.go +++ b/epochStart/bootstrap/common.go @@ -25,6 +25,9 @@ func checkArguments(args ArgsEpochStartBootstrap) error { if check.IfNil(args.CryptoComponentsHolder) { return fmt.Errorf("%s: %w", baseErrorMessage, epochStart.ErrNilCryptoComponentsHolder) } + if check.IfNil(args.StatusCoreComponentsHolder) { + return fmt.Errorf("%s: %w", baseErrorMessage, epochStart.ErrNilStatusCoreComponentsHolder) + } if check.IfNil(args.CryptoComponentsHolder.PublicKey()) { return fmt.Errorf("%s: %w", baseErrorMessage, epochStart.ErrNilPubKey) } @@ -52,6 +55,9 @@ func checkArguments(args ArgsEpochStartBootstrap) error { if check.IfNil(args.CoreComponentsHolder.PathHandler()) { return fmt.Errorf("%s: %w", baseErrorMessage, epochStart.ErrNilPathManager) } + if check.IfNil(args.StatusCoreComponentsHolder.TrieSyncStatistics()) { + return fmt.Errorf("%s: %w", baseErrorMessage, epochStart.ErrNilTrieSyncStatistics) + } if args.GenesisNodesConfig == nil { return fmt.Errorf("%s: %w", baseErrorMessage, epochStart.ErrNilGenesisNodesConfig) } diff --git a/epochStart/bootstrap/process.go b/epochStart/bootstrap/process.go index 5e444a42206..6baa78b6d4e 100644 --- a/epochStart/bootstrap/process.go +++ b/epochStart/bootstrap/process.go @@ -89,6 +89,7 @@ type epochStartBootstrap struct { destinationShardAsObserver uint32 coreComponentsHolder process.CoreComponentsHolder cryptoComponentsHolder process.CryptoComponentsHolder + statusCoreComponentsHolder process.StatusCoreComponentsHolder messenger Messenger generalConfig config.Config prefsConfig config.PreferencesConfig @@ -155,6 +156,7 @@ type baseDataInStorage struct { type ArgsEpochStartBootstrap struct { CoreComponentsHolder process.CoreComponentsHolder CryptoComponentsHolder process.CryptoComponentsHolder + StatusCoreComponentsHolder process.StatusCoreComponentsHolder DestinationShardAsObserver uint32 Messenger Messenger GeneralConfig config.Config @@ -192,6 +194,7 @@ func NewEpochStartBootstrap(args ArgsEpochStartBootstrap) (*epochStartBootstrap, epochStartProvider := &epochStartBootstrap{ coreComponentsHolder: args.CoreComponentsHolder, cryptoComponentsHolder: args.CryptoComponentsHolder, + statusCoreComponentsHolder: args.StatusCoreComponentsHolder, messenger: args.Messenger, generalConfig: args.GeneralConfig, prefsConfig: args.PrefsConfig, @@ -1057,6 +1060,7 @@ func (e *epochStartBootstrap) syncUserAccountsState(rootHash []byte) error { TrieSyncerVersion: e.trieSyncerVersion, CheckNodesOnDisk: e.checkNodesOnDisk, StorageMarker: storageMarker.NewTrieStorageMarker(), + SyncStatisticsHandler: e.statusCoreComponentsHolder.TrieSyncStatistics(), }, ShardId: e.shardCoordinator.SelfId(), Throttler: thr, @@ -1256,6 +1260,7 @@ func (e *epochStartBootstrap) createHeartbeatSender() error { PrivateKey: privateKey, RedundancyHandler: bootstrapRedundancy, PeerTypeProvider: peer.NewBootstrapPeerTypeProvider(), + TrieSyncStatisticsProvider: e.statusCoreComponentsHolder.TrieSyncStatistics(), } e.bootstrapHeartbeatSender, err = sender.NewBootstrapSender(argsHeartbeatSender) diff --git a/epochStart/bootstrap/process_test.go b/epochStart/bootstrap/process_test.go index 09ad454ca0d..bfb34526352 100644 --- a/epochStart/bootstrap/process_test.go +++ b/epochStart/bootstrap/process_test.go @@ -102,7 +102,10 @@ func createMockEpochStartBootstrapArgs( ScheduledSCRsStorer: genericMocks.NewStorerMock(), CoreComponentsHolder: coreMock, CryptoComponentsHolder: cryptoMock, - Messenger: &p2pmocks.MessengerStub{}, + StatusCoreComponentsHolder: &mock.StatusCoreComponentsMock{ + TrieSyncStatisticsField: &testscommon.SizeSyncStatisticsHandlerStub{}, + }, + Messenger: &p2pmocks.MessengerStub{}, GeneralConfig: config.Config{ MiniBlocksStorage: generalCfg.MiniBlocksStorage, PeerBlockBodyStorage: generalCfg.PeerBlockBodyStorage, @@ -280,6 +283,16 @@ func TestNewEpochStartBootstrap_NilArgsChecks(t *testing.T) { require.Nil(t, epochStartProvider) require.True(t, errors.Is(err, epochStart.ErrNilCryptoComponentsHolder)) }) + t.Run("nil statusCoreComponents", func(t *testing.T) { + t.Parallel() + + args := createMockEpochStartBootstrapArgs(createComponentsForEpochStart()) + args.StatusCoreComponentsHolder = nil + + epochStartProvider, err := NewEpochStartBootstrap(args) + require.Nil(t, epochStartProvider) + require.True(t, errors.Is(err, epochStart.ErrNilStatusCoreComponentsHolder)) + }) t.Run("nil pubKey", func(t *testing.T) { t.Parallel() @@ -410,6 +423,16 @@ func TestNewEpochStartBootstrap_NilArgsChecks(t *testing.T) { require.Nil(t, epochStartProvider) require.True(t, errors.Is(err, epochStart.ErrNilPubkeyConverter)) }) + t.Run("nil trieSyncStatistics", func(t *testing.T) { + t.Parallel() + + args := createMockEpochStartBootstrapArgs(createComponentsForEpochStart()) + args.StatusCoreComponentsHolder = &mock.StatusCoreComponentsMock{} + + epochStartProvider, err := NewEpochStartBootstrap(args) + require.Nil(t, epochStartProvider) + require.True(t, errors.Is(err, epochStart.ErrNilTrieSyncStatistics)) + }) t.Run("nil roundHandler", func(t *testing.T) { t.Parallel() diff --git a/epochStart/errors.go b/epochStart/errors.go index e2b8499618b..5488098d6dd 100644 --- a/epochStart/errors.go +++ b/epochStart/errors.go @@ -98,6 +98,9 @@ var ErrNilCoreComponentsHolder = errors.New("nil core components holder") // ErrNilCryptoComponentsHolder signals that a nil crypto components holder was provided var ErrNilCryptoComponentsHolder = errors.New("nil crypto components holder") +// ErrNilStatusCoreComponentsHolder signals that a nil status core components holder was provided +var ErrNilStatusCoreComponentsHolder = errors.New("nil status core components holder") + // ErrRewardMiniBlocksNumDoesNotMatch signals that number of created and received rewards miniblocks is not equal var ErrRewardMiniBlocksNumDoesNotMatch = errors.New("number of created and received rewards miniblocks missmatch") @@ -322,3 +325,6 @@ var ErrNilEnableEpochsHandler = errors.New("nil enable epochs handler") // ErrNilValidatorInfoStorage signals that nil validator info storage has been provided var ErrNilValidatorInfoStorage = errors.New("nil validator info storage") + +// ErrNilTrieSyncStatistics signals that nil trie sync statistics has been provided +var ErrNilTrieSyncStatistics = errors.New("nil trie sync statistics") diff --git a/epochStart/mock/statusCoreComponentsMock.go b/epochStart/mock/statusCoreComponentsMock.go new file mode 100644 index 00000000000..29e9f30248a --- /dev/null +++ b/epochStart/mock/statusCoreComponentsMock.go @@ -0,0 +1,18 @@ +package mock + +import "github.com/ElrondNetwork/elrond-go/process" + +// StatusCoreComponentsMock - +type StatusCoreComponentsMock struct { + TrieSyncStatisticsField process.TrieSyncStatisticsProvider +} + +// TrieSyncStatistics - +func (sccm *StatusCoreComponentsMock) TrieSyncStatistics() process.TrieSyncStatisticsProvider { + return sccm.TrieSyncStatisticsField +} + +// IsInterfaceNil - +func (sccm *StatusCoreComponentsMock) IsInterfaceNil() bool { + return sccm == nil +} diff --git a/errors/errors.go b/errors/errors.go index 635341cce9c..7b574d9672c 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -529,3 +529,6 @@ var ErrNilNetworkStatistics = errors.New("nil network statistics") // ErrNilResourceMonitor signals that a nil resource monitor was provided var ErrNilResourceMonitor = errors.New("nil resource monitor") + +// ErrNilTrieSyncStatistics signals that a nil trie sync statistics was provided +var ErrNilTrieSyncStatistics = errors.New("nil trie sync statistics") diff --git a/factory/bootstrap/bootstrapComponents.go b/factory/bootstrap/bootstrapComponents.go index 2995e46af77..d738cd85757 100644 --- a/factory/bootstrap/bootstrapComponents.go +++ b/factory/bootstrap/bootstrapComponents.go @@ -28,26 +28,28 @@ var log = logger.GetOrCreate("factory") // BootstrapComponentsFactoryArgs holds the arguments needed to create a botstrap components factory type BootstrapComponentsFactoryArgs struct { - Config config.Config - RoundConfig config.RoundConfig - PrefConfig config.Preferences - ImportDbConfig config.ImportDbConfig - FlagsConfig config.ContextFlagsConfig - WorkingDir string - CoreComponents factory.CoreComponentsHolder - CryptoComponents factory.CryptoComponentsHolder - NetworkComponents factory.NetworkComponentsHolder + Config config.Config + RoundConfig config.RoundConfig + PrefConfig config.Preferences + ImportDbConfig config.ImportDbConfig + FlagsConfig config.ContextFlagsConfig + WorkingDir string + CoreComponents factory.CoreComponentsHolder + CryptoComponents factory.CryptoComponentsHolder + NetworkComponents factory.NetworkComponentsHolder + StatusCoreComponents factory.StatusCoreComponentsHolder } type bootstrapComponentsFactory struct { - config config.Config - prefConfig config.Preferences - importDbConfig config.ImportDbConfig - flagsConfig config.ContextFlagsConfig - workingDir string - coreComponents factory.CoreComponentsHolder - cryptoComponents factory.CryptoComponentsHolder - networkComponents factory.NetworkComponentsHolder + config config.Config + prefConfig config.Preferences + importDbConfig config.ImportDbConfig + flagsConfig config.ContextFlagsConfig + workingDir string + coreComponents factory.CoreComponentsHolder + cryptoComponents factory.CryptoComponentsHolder + networkComponents factory.NetworkComponentsHolder + statusCoreComponents factory.StatusCoreComponentsHolder } type bootstrapComponents struct { @@ -71,19 +73,26 @@ func NewBootstrapComponentsFactory(args BootstrapComponentsFactoryArgs) (*bootst if check.IfNil(args.NetworkComponents) { return nil, errors.ErrNilNetworkComponentsHolder } + if check.IfNil(args.StatusCoreComponents) { + return nil, errors.ErrNilStatusCoreComponents + } + if check.IfNil(args.StatusCoreComponents.TrieSyncStatistics()) { + return nil, errors.ErrNilTrieSyncStatistics + } if args.WorkingDir == "" { return nil, errors.ErrInvalidWorkingDir } return &bootstrapComponentsFactory{ - config: args.Config, - prefConfig: args.PrefConfig, - importDbConfig: args.ImportDbConfig, - flagsConfig: args.FlagsConfig, - workingDir: args.WorkingDir, - coreComponents: args.CoreComponents, - cryptoComponents: args.CryptoComponents, - networkComponents: args.NetworkComponents, + config: args.Config, + prefConfig: args.PrefConfig, + importDbConfig: args.ImportDbConfig, + flagsConfig: args.FlagsConfig, + workingDir: args.WorkingDir, + coreComponents: args.CoreComponents, + cryptoComponents: args.CryptoComponents, + networkComponents: args.NetworkComponents, + statusCoreComponents: args.StatusCoreComponents, }, nil } diff --git a/factory/consensus/consensusComponents.go b/factory/consensus/consensusComponents.go index d3873f4381e..9ad73da6db7 100644 --- a/factory/consensus/consensusComponents.go +++ b/factory/consensus/consensusComponents.go @@ -24,6 +24,7 @@ import ( "github.com/ElrondNetwork/elrond-go/sharding" "github.com/ElrondNetwork/elrond-go/state/syncer" trieFactory "github.com/ElrondNetwork/elrond-go/trie/factory" + "github.com/ElrondNetwork/elrond-go/trie/statistics" "github.com/ElrondNetwork/elrond-go/trie/storageMarker" "github.com/ElrondNetwork/elrond-go/update" ) @@ -502,6 +503,7 @@ func (ccf *consensusComponentsFactory) createArgsBaseAccountsSyncer(trieStorageM TrieSyncerVersion: ccf.config.TrieSync.TrieSyncerVersion, CheckNodesOnDisk: ccf.config.TrieSync.CheckNodesOnDisk, StorageMarker: storageMarker.NewTrieStorageMarker(), + SyncStatisticsHandler: statistics.NewTrieSyncStatistics(), } } diff --git a/factory/interface.go b/factory/interface.go index dd6059017d6..e372b697172 100644 --- a/factory/interface.go +++ b/factory/interface.go @@ -147,6 +147,7 @@ type CoreComponentsHandler interface { type StatusCoreComponentsHolder interface { ResourceMonitor() ResourceMonitor NetworkStatistics() NetworkStatisticsProvider + TrieSyncStatistics() TrieSyncStatisticsProvider IsInterfaceNil() bool } @@ -548,3 +549,15 @@ type NetworkStatisticsProvider interface { Close() error IsInterfaceNil() bool } + +// TrieSyncStatisticsProvider is able to provide trie sync statistics +type TrieSyncStatisticsProvider interface { + data.SyncStatisticsHandler + AddNumBytesReceived(bytes uint64) + NumBytesReceived() uint64 + NumTries() int + AddProcessingTime(duration time.Duration) + IncrementIteration() + ProcessingTime() time.Duration + NumIterations() int +} diff --git a/factory/statusCore/statusCoreComponents.go b/factory/statusCore/statusCoreComponents.go index 8bc50fd12f0..2e6394f77ea 100644 --- a/factory/statusCore/statusCoreComponents.go +++ b/factory/statusCore/statusCoreComponents.go @@ -6,6 +6,7 @@ import ( "github.com/ElrondNetwork/elrond-go/common/statistics/machine" "github.com/ElrondNetwork/elrond-go/config" "github.com/ElrondNetwork/elrond-go/factory" + trieStatistics "github.com/ElrondNetwork/elrond-go/trie/statistics" ) // StatusCoreComponentsFactoryArgs holds the arguments needed for creating a status core components factory @@ -20,8 +21,9 @@ type statusCoreComponentsFactory struct { // statusCoreComponents is the DTO used for core components type statusCoreComponents struct { - resourceMonitor factory.ResourceMonitor - networkStatistics factory.NetworkStatisticsProvider + resourceMonitor factory.ResourceMonitor + networkStatistics factory.NetworkStatisticsProvider + trieSyncStatistics factory.TrieSyncStatisticsProvider } // NewStatusCoreComponentsFactory initializes the factory which is responsible to creating status core components @@ -45,8 +47,9 @@ func (sccf *statusCoreComponentsFactory) Create() (*statusCoreComponents, error) } return &statusCoreComponents{ - resourceMonitor: resourceMonitor, - networkStatistics: netStats, + resourceMonitor: resourceMonitor, + networkStatistics: netStats, + trieSyncStatistics: trieStatistics.NewTrieSyncStatistics(), }, nil } diff --git a/factory/statusCore/statusCoreComponentsHandler.go b/factory/statusCore/statusCoreComponentsHandler.go index 96e8344c4c2..93f5a099991 100644 --- a/factory/statusCore/statusCoreComponentsHandler.go +++ b/factory/statusCore/statusCoreComponentsHandler.go @@ -79,6 +79,9 @@ func (mscc *managedStatusCoreComponents) CheckSubcomponents() error { if check.IfNil(mscc.resourceMonitor) { return errors.ErrNilResourceMonitor } + if check.IfNil(mscc.trieSyncStatistics) { + return errors.ErrNilTrieSyncStatistics + } return nil } @@ -107,6 +110,18 @@ func (mscc *managedStatusCoreComponents) ResourceMonitor() factory.ResourceMonit return mscc.statusCoreComponents.resourceMonitor } +// TrieSyncStatistics returns the trie sync statistics instance +func (mscc *managedStatusCoreComponents) TrieSyncStatistics() factory.TrieSyncStatisticsProvider { + mscc.mutCoreComponents.RLock() + defer mscc.mutCoreComponents.RUnlock() + + if mscc.statusCoreComponents == nil { + return nil + } + + return mscc.statusCoreComponents.trieSyncStatistics +} + // IsInterfaceNil returns true if there is no value under the interface func (mscc *managedStatusCoreComponents) IsInterfaceNil() bool { return mscc == nil diff --git a/heartbeat/errors.go b/heartbeat/errors.go index 186ee964af8..f07a4f09334 100644 --- a/heartbeat/errors.go +++ b/heartbeat/errors.go @@ -143,3 +143,6 @@ var ErrNilHeartbeatMonitor = errors.New("nil heartbeat monitor") // ErrNilHeartbeatSenderInfoProvider signals that a nil heartbeat sender info provider was provided var ErrNilHeartbeatSenderInfoProvider = errors.New("nil heartbeat sender info provider") + +// ErrNilTrieSyncStatisticsProvider signals that a nil trie sync statistics provider was provided +var ErrNilTrieSyncStatisticsProvider = errors.New("nil trie sync statistics provider") diff --git a/heartbeat/heartbeat.pb.go b/heartbeat/heartbeat.pb.go index 2601305f4fd..f201d913139 100644 --- a/heartbeat/heartbeat.pb.go +++ b/heartbeat/heartbeat.pb.go @@ -197,8 +197,9 @@ func (m *PeerAuthentication) GetPayloadSignature() []byte { // Payload represents the DTO used as payload for both HeartbeatV2 and PeerAuthentication messages type Payload struct { - Timestamp int64 `protobuf:"varint,1,opt,name=Timestamp,proto3" json:"Timestamp,omitempty"` - HardforkMessage string `protobuf:"bytes,2,opt,name=HardforkMessage,proto3" json:"HardforkMessage,omitempty"` + Timestamp int64 `protobuf:"varint,1,opt,name=Timestamp,proto3" json:"Timestamp,omitempty"` + HardforkMessage string `protobuf:"bytes,2,opt,name=HardforkMessage,proto3" json:"HardforkMessage,omitempty"` + NumTrieNodesSynced uint64 `protobuf:"varint,3,opt,name=NumTrieNodesSynced,proto3" json:"NumTrieNodesSynced,omitempty"` } func (m *Payload) Reset() { *m = Payload{} } @@ -247,6 +248,13 @@ func (m *Payload) GetHardforkMessage() string { return "" } +func (m *Payload) GetNumTrieNodesSynced() uint64 { + if m != nil { + return m.NumTrieNodesSynced + } + return 0 +} + func init() { proto.RegisterType((*HeartbeatV2)(nil), "proto.HeartbeatV2") proto.RegisterType((*PeerAuthentication)(nil), "proto.PeerAuthentication") @@ -256,31 +264,32 @@ func init() { func init() { proto.RegisterFile("heartbeat.proto", fileDescriptor_3c667767fb9826a9) } var fileDescriptor_3c667767fb9826a9 = []byte{ - // 377 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x92, 0xbf, 0x8e, 0xda, 0x40, - 0x10, 0xc6, 0xbd, 0x01, 0x43, 0x58, 0x40, 0xa0, 0x55, 0x14, 0xad, 0xa2, 0x68, 0x65, 0xa1, 0x14, - 0x56, 0x8a, 0x14, 0xc9, 0x03, 0x44, 0x89, 0x52, 0x90, 0x22, 0x96, 0x63, 0x10, 0x45, 0xba, 0x35, - 0x9e, 0x80, 0x05, 0xf6, 0x5a, 0xeb, 0x75, 0xe1, 0xee, 0x1e, 0xe1, 0x9e, 0xe1, 0xaa, 0x7b, 0x94, - 0x2b, 0x29, 0x29, 0x0f, 0xbb, 0xb9, 0x92, 0x47, 0x38, 0x79, 0x8f, 0x3f, 0x86, 0xab, 0x76, 0xbe, - 0xdf, 0x7e, 0x9a, 0x9d, 0x99, 0x1d, 0x3c, 0x58, 0x02, 0x97, 0xca, 0x07, 0xae, 0xbe, 0x24, 0x52, - 0x28, 0x41, 0x4c, 0x7d, 0x8c, 0x4a, 0x84, 0xbb, 0xe3, 0xe3, 0xd5, 0xec, 0x2b, 0xa1, 0xb8, 0xed, - 0xf2, 0x7c, 0x2d, 0x78, 0x40, 0x91, 0x85, 0xec, 0x9e, 0x77, 0x94, 0xe4, 0x13, 0xee, 0xcf, 0x40, - 0xa6, 0xa1, 0x88, 0x9d, 0x2c, 0xf2, 0x41, 0xd2, 0x37, 0x16, 0xb2, 0x3b, 0xde, 0x25, 0x24, 0x36, - 0x1e, 0x38, 0x22, 0x80, 0x5f, 0x61, 0x9a, 0xac, 0x79, 0xee, 0xf0, 0x08, 0x68, 0x43, 0xfb, 0xae, - 0x31, 0xf9, 0x80, 0xdf, 0xfe, 0x0e, 0x20, 0x56, 0xa1, 0xca, 0x69, 0x53, 0x5b, 0x4e, 0x9a, 0xbc, - 0xc3, 0xa6, 0x23, 0xe2, 0x39, 0x50, 0xd3, 0x42, 0x76, 0xd3, 0x7b, 0x11, 0xc4, 0xc2, 0x5d, 0x17, - 0x40, 0x4e, 0x32, 0x7f, 0x9a, 0x27, 0x40, 0x5b, 0x16, 0xb2, 0xfb, 0x5e, 0x1d, 0x91, 0xf7, 0xb8, - 0xe5, 0x66, 0xfe, 0x0a, 0x72, 0xda, 0xd6, 0xc5, 0x1f, 0xd4, 0xe8, 0x0e, 0x61, 0x52, 0xf9, 0x7e, - 0x64, 0x6a, 0x59, 0x3d, 0x31, 0xe7, 0x2a, 0x14, 0x71, 0xcd, 0x8e, 0xea, 0x76, 0xf2, 0x11, 0x77, - 0x26, 0xe1, 0x22, 0xe6, 0x2a, 0x93, 0xa0, 0xdb, 0xec, 0x79, 0x67, 0x40, 0x86, 0xb8, 0xe1, 0x86, - 0x81, 0x6e, 0xab, 0xe7, 0x55, 0x61, 0x7d, 0x68, 0xcd, 0xcb, 0xa1, 0x7d, 0xc6, 0xc3, 0x43, 0x78, - 0x4e, 0x68, 0x6a, 0xcb, 0x2b, 0x3e, 0xfa, 0x7b, 0xca, 0x52, 0x15, 0x30, 0x0d, 0x23, 0x48, 0x15, - 0x8f, 0x12, 0x5d, 0x5b, 0xc3, 0x3b, 0x83, 0x6a, 0xc6, 0x63, 0x2e, 0x83, 0xff, 0x42, 0xae, 0xfe, - 0x40, 0x9a, 0xf2, 0x05, 0x1c, 0xfe, 0xe2, 0x1a, 0xff, 0xfc, 0xbe, 0xd9, 0x31, 0x63, 0xbb, 0x63, - 0xc6, 0x7e, 0xc7, 0xd0, 0x4d, 0xc1, 0xd0, 0x7d, 0xc1, 0xd0, 0x43, 0xc1, 0xd0, 0xa6, 0x60, 0xe8, - 0xb1, 0x60, 0xe8, 0xa9, 0x60, 0xc6, 0xbe, 0x60, 0xe8, 0xb6, 0x64, 0xc6, 0xa6, 0x64, 0xc6, 0xb6, - 0x64, 0xc6, 0xbf, 0xce, 0x69, 0x57, 0xfc, 0x96, 0xde, 0x92, 0x6f, 0xcf, 0x01, 0x00, 0x00, 0xff, - 0xff, 0x3f, 0xda, 0xe8, 0xad, 0x3f, 0x02, 0x00, 0x00, + // 398 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x52, 0xb1, 0x6e, 0xd4, 0x40, + 0x10, 0xf5, 0x70, 0xf6, 0x85, 0xdb, 0x5c, 0x94, 0x68, 0x85, 0xd0, 0x0a, 0xa1, 0x95, 0x75, 0xa2, + 0xb0, 0x28, 0x52, 0xc0, 0x07, 0x20, 0x10, 0x45, 0x28, 0xb0, 0xac, 0xbd, 0x53, 0x0a, 0xba, 0xf5, + 0x79, 0x48, 0x56, 0x89, 0xbd, 0xd6, 0x7a, 0x5d, 0xb8, 0x83, 0x3f, 0xe0, 0x1b, 0xa8, 0xf8, 0x14, + 0xca, 0x2b, 0x53, 0x72, 0x76, 0x43, 0x99, 0x4f, 0x40, 0xde, 0x5c, 0xee, 0x9c, 0x23, 0x95, 0xe7, + 0xbd, 0x79, 0x1a, 0xbf, 0x79, 0x3b, 0xe4, 0xf8, 0x12, 0xa5, 0xb1, 0x29, 0x4a, 0x7b, 0x5a, 0x1a, + 0x6d, 0x35, 0x0d, 0xdc, 0x67, 0xd6, 0x01, 0x39, 0x3c, 0xbb, 0x6f, 0x9d, 0xbf, 0xa1, 0x8c, 0x1c, + 0x24, 0xb2, 0xb9, 0xd6, 0x32, 0x63, 0x10, 0x42, 0x34, 0x15, 0xf7, 0x90, 0xbe, 0x22, 0x47, 0xe7, + 0x68, 0x2a, 0xa5, 0x8b, 0xb8, 0xce, 0x53, 0x34, 0xec, 0x49, 0x08, 0xd1, 0x44, 0x3c, 0x24, 0x69, + 0x44, 0x8e, 0x63, 0x9d, 0xe1, 0x47, 0x55, 0x95, 0xd7, 0xb2, 0x89, 0x65, 0x8e, 0x6c, 0xe4, 0x74, + 0xfb, 0x34, 0x7d, 0x41, 0x9e, 0x7e, 0xca, 0xb0, 0xb0, 0xca, 0x36, 0xcc, 0x77, 0x92, 0x2d, 0xa6, + 0xcf, 0x48, 0x10, 0xeb, 0x62, 0x89, 0x2c, 0x08, 0x21, 0xf2, 0xc5, 0x1d, 0xa0, 0x21, 0x39, 0x4c, + 0x10, 0xcd, 0xbc, 0x4e, 0x17, 0x4d, 0x89, 0x6c, 0x1c, 0x42, 0x74, 0x24, 0x86, 0x14, 0x7d, 0x4e, + 0xc6, 0x49, 0x9d, 0x5e, 0x61, 0xc3, 0x0e, 0x9c, 0xf9, 0x0d, 0x9a, 0xfd, 0x04, 0x42, 0x7b, 0xdd, + 0xfb, 0xda, 0x5e, 0xf6, 0xbf, 0x58, 0x4a, 0xab, 0x74, 0x31, 0x90, 0xc3, 0x50, 0x4e, 0x5f, 0x92, + 0xc9, 0x5c, 0x5d, 0x14, 0xd2, 0xd6, 0x06, 0xdd, 0x9a, 0x53, 0xb1, 0x23, 0xe8, 0x09, 0x19, 0x25, + 0x2a, 0x73, 0x6b, 0x4d, 0x45, 0x5f, 0x0e, 0x43, 0xf3, 0x1f, 0x86, 0xf6, 0x9a, 0x9c, 0x6c, 0xca, + 0xdd, 0xc0, 0xc0, 0x49, 0xfe, 0xe3, 0x67, 0xdf, 0x61, 0x3b, 0xa6, 0x77, 0xb0, 0x50, 0x39, 0x56, + 0x56, 0xe6, 0xa5, 0x33, 0x37, 0x12, 0x3b, 0xa2, 0x0f, 0xf9, 0x4c, 0x9a, 0xec, 0xab, 0x36, 0x57, + 0x9f, 0xb1, 0xaa, 0xe4, 0x05, 0x6e, 0x1e, 0x63, 0x9f, 0xa6, 0xa7, 0x84, 0xc6, 0x75, 0xbe, 0x30, + 0x0a, 0xfb, 0xf8, 0xab, 0x79, 0x53, 0x2c, 0xf1, 0xce, 0xba, 0x2f, 0x1e, 0xe9, 0x7c, 0x78, 0xb7, + 0x5a, 0x73, 0xef, 0x66, 0xcd, 0xbd, 0xdb, 0x35, 0x87, 0x6f, 0x2d, 0x87, 0x5f, 0x2d, 0x87, 0xdf, + 0x2d, 0x87, 0x55, 0xcb, 0xe1, 0x4f, 0xcb, 0xe1, 0x6f, 0xcb, 0xbd, 0xdb, 0x96, 0xc3, 0x8f, 0x8e, + 0x7b, 0xab, 0x8e, 0x7b, 0x37, 0x1d, 0xf7, 0xbe, 0x4c, 0xb6, 0xc7, 0x95, 0x8e, 0xdd, 0x59, 0xbd, + 0xfd, 0x17, 0x00, 0x00, 0xff, 0xff, 0xc1, 0x96, 0x8d, 0x30, 0x70, 0x02, 0x00, 0x00, } func (this *HeartbeatV2) Equal(that interface{}) bool { @@ -386,6 +395,9 @@ func (this *Payload) Equal(that interface{}) bool { if this.HardforkMessage != that1.HardforkMessage { return false } + if this.NumTrieNodesSynced != that1.NumTrieNodesSynced { + return false + } return true } func (this *HeartbeatV2) GoString() string { @@ -422,10 +434,11 @@ func (this *Payload) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 6) + s := make([]string, 0, 7) s = append(s, "&heartbeat.Payload{") s = append(s, "Timestamp: "+fmt.Sprintf("%#v", this.Timestamp)+",\n") s = append(s, "HardforkMessage: "+fmt.Sprintf("%#v", this.HardforkMessage)+",\n") + s = append(s, "NumTrieNodesSynced: "+fmt.Sprintf("%#v", this.NumTrieNodesSynced)+",\n") s = append(s, "}") return strings.Join(s, "") } @@ -583,6 +596,11 @@ func (m *Payload) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.NumTrieNodesSynced != 0 { + i = encodeVarintHeartbeat(dAtA, i, uint64(m.NumTrieNodesSynced)) + i-- + dAtA[i] = 0x18 + } if len(m.HardforkMessage) > 0 { i -= len(m.HardforkMessage) copy(dAtA[i:], m.HardforkMessage) @@ -686,6 +704,9 @@ func (m *Payload) Size() (n int) { if l > 0 { n += 1 + l + sovHeartbeat(uint64(l)) } + if m.NumTrieNodesSynced != 0 { + n += 1 + sovHeartbeat(uint64(m.NumTrieNodesSynced)) + } return n } @@ -732,6 +753,7 @@ func (this *Payload) String() string { s := strings.Join([]string{`&Payload{`, `Timestamp:` + fmt.Sprintf("%v", this.Timestamp) + `,`, `HardforkMessage:` + fmt.Sprintf("%v", this.HardforkMessage) + `,`, + `NumTrieNodesSynced:` + fmt.Sprintf("%v", this.NumTrieNodesSynced) + `,`, `}`, }, "") return s @@ -1302,6 +1324,25 @@ func (m *Payload) Unmarshal(dAtA []byte) error { } m.HardforkMessage = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NumTrieNodesSynced", wireType) + } + m.NumTrieNodesSynced = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowHeartbeat + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.NumTrieNodesSynced |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipHeartbeat(dAtA[iNdEx:]) diff --git a/heartbeat/interface.go b/heartbeat/interface.go index 0e2d2eb8920..f218c1ad5eb 100644 --- a/heartbeat/interface.go +++ b/heartbeat/interface.go @@ -122,3 +122,9 @@ type NodesCoordinator interface { GetValidatorWithPublicKey(publicKey []byte) (validator nodesCoordinator.Validator, shardId uint32, err error) IsInterfaceNil() bool } + +// TrieSyncStatisticsProvider is able to provide trie sync statistics +type TrieSyncStatisticsProvider interface { + NumReceived() int + IsInterfaceNil() bool +} diff --git a/heartbeat/proto/heartbeat.proto b/heartbeat/proto/heartbeat.proto index 30047088eda..2228cd46915 100644 --- a/heartbeat/proto/heartbeat.proto +++ b/heartbeat/proto/heartbeat.proto @@ -28,6 +28,7 @@ message PeerAuthentication { // Payload represents the DTO used as payload for both HeartbeatV2 and PeerAuthentication messages message Payload { - int64 Timestamp = 1; - string HardforkMessage = 2; + int64 Timestamp = 1; + string HardforkMessage = 2; + uint64 NumTrieNodesSynced = 3; } diff --git a/heartbeat/sender/bootstrapSender.go b/heartbeat/sender/bootstrapSender.go index aedfc3a5de7..bae82f67e73 100644 --- a/heartbeat/sender/bootstrapSender.go +++ b/heartbeat/sender/bootstrapSender.go @@ -26,6 +26,7 @@ type ArgBootstrapSender struct { PrivateKey crypto.PrivateKey RedundancyHandler heartbeat.NodeRedundancyHandler PeerTypeProvider heartbeat.PeerTypeProviderHandler + TrieSyncStatisticsProvider heartbeat.TrieSyncStatisticsProvider } // bootstrapSender defines the component which sends heartbeat messages during bootstrap @@ -47,12 +48,13 @@ func NewBootstrapSender(args ArgBootstrapSender) (*bootstrapSender, error) { privKey: args.PrivateKey, redundancyHandler: args.RedundancyHandler, }, - versionNumber: args.VersionNumber, - nodeDisplayName: args.NodeDisplayName, - identity: args.Identity, - peerSubType: args.PeerSubType, - currentBlockProvider: args.CurrentBlockProvider, - peerTypeProvider: args.PeerTypeProvider, + versionNumber: args.VersionNumber, + nodeDisplayName: args.NodeDisplayName, + identity: args.Identity, + peerSubType: args.PeerSubType, + currentBlockProvider: args.CurrentBlockProvider, + peerTypeProvider: args.PeerTypeProvider, + trieSyncStatisticsProvider: args.TrieSyncStatisticsProvider, }) if err != nil { return nil, err diff --git a/heartbeat/sender/bootstrapSender_test.go b/heartbeat/sender/bootstrapSender_test.go index 70d48e24b9c..984455635be 100644 --- a/heartbeat/sender/bootstrapSender_test.go +++ b/heartbeat/sender/bootstrapSender_test.go @@ -32,6 +32,7 @@ func createMockBootstrapSenderArgs() ArgBootstrapSender { PrivateKey: &cryptoMocks.PrivateKeyStub{}, RedundancyHandler: &mock.RedundancyHandlerStub{}, PeerTypeProvider: &mock.PeerTypeProviderStub{}, + TrieSyncStatisticsProvider: &testscommon.SizeSyncStatisticsHandlerStub{}, } } @@ -164,6 +165,16 @@ func TestNewBootstrapSender(t *testing.T) { assert.Nil(t, senderInstance) assert.Equal(t, heartbeat.ErrNilPeerTypeProvider, err) }) + t.Run("nil trie sync statistics provider should error", func(t *testing.T) { + t.Parallel() + + args := createMockBootstrapSenderArgs() + args.TrieSyncStatisticsProvider = nil + senderInstance, err := NewBootstrapSender(args) + + assert.Nil(t, senderInstance) + assert.Equal(t, heartbeat.ErrNilTrieSyncStatisticsProvider, err) + }) t.Run("should work", func(t *testing.T) { t.Parallel() diff --git a/heartbeat/sender/disabled/trieSyncStatisticsProvider.go b/heartbeat/sender/disabled/trieSyncStatisticsProvider.go new file mode 100644 index 00000000000..fca73659025 --- /dev/null +++ b/heartbeat/sender/disabled/trieSyncStatisticsProvider.go @@ -0,0 +1,19 @@ +package disabled + +type trieSyncStatisticsProvider struct { +} + +// NewTrieSyncStatisticsProvider returns a new instance of trieSyncStatisticsProvider +func NewTrieSyncStatisticsProvider() *trieSyncStatisticsProvider { + return &trieSyncStatisticsProvider{} +} + +// NumReceived returns 0 always +func (tssp *trieSyncStatisticsProvider) NumReceived() int { + return 0 +} + +// IsInterfaceNil returns true if there is no value under the interface +func (tssp *trieSyncStatisticsProvider) IsInterfaceNil() bool { + return tssp == nil +} diff --git a/heartbeat/sender/heartbeatSender.go b/heartbeat/sender/heartbeatSender.go index 914139ea82a..fc833c2aee0 100644 --- a/heartbeat/sender/heartbeatSender.go +++ b/heartbeat/sender/heartbeatSender.go @@ -15,22 +15,24 @@ const maxSizeInBytes = 128 // argHeartbeatSender represents the arguments for the heartbeat sender type argHeartbeatSender struct { argBaseSender - versionNumber string - nodeDisplayName string - identity string - peerSubType core.P2PPeerSubType - currentBlockProvider heartbeat.CurrentBlockProvider - peerTypeProvider heartbeat.PeerTypeProviderHandler + versionNumber string + nodeDisplayName string + identity string + peerSubType core.P2PPeerSubType + currentBlockProvider heartbeat.CurrentBlockProvider + peerTypeProvider heartbeat.PeerTypeProviderHandler + trieSyncStatisticsProvider heartbeat.TrieSyncStatisticsProvider } type heartbeatSender struct { baseSender - versionNumber string - nodeDisplayName string - identity string - peerSubType core.P2PPeerSubType - currentBlockProvider heartbeat.CurrentBlockProvider - peerTypeProvider heartbeat.PeerTypeProviderHandler + versionNumber string + nodeDisplayName string + identity string + peerSubType core.P2PPeerSubType + currentBlockProvider heartbeat.CurrentBlockProvider + peerTypeProvider heartbeat.PeerTypeProviderHandler + trieSyncStatisticsProvider heartbeat.TrieSyncStatisticsProvider } // newHeartbeatSender creates a new instance of type heartbeatSender @@ -41,13 +43,14 @@ func newHeartbeatSender(args argHeartbeatSender) (*heartbeatSender, error) { } return &heartbeatSender{ - baseSender: createBaseSender(args.argBaseSender), - versionNumber: args.versionNumber, - nodeDisplayName: args.nodeDisplayName, - identity: args.identity, - peerSubType: args.peerSubType, - currentBlockProvider: args.currentBlockProvider, - peerTypeProvider: args.peerTypeProvider, + baseSender: createBaseSender(args.argBaseSender), + versionNumber: args.versionNumber, + nodeDisplayName: args.nodeDisplayName, + identity: args.identity, + peerSubType: args.peerSubType, + currentBlockProvider: args.currentBlockProvider, + peerTypeProvider: args.peerTypeProvider, + trieSyncStatisticsProvider: args.trieSyncStatisticsProvider, }, nil } @@ -74,6 +77,9 @@ func checkHeartbeatSenderArgs(args argHeartbeatSender) error { if check.IfNil(args.peerTypeProvider) { return heartbeat.ErrNilPeerTypeProvider } + if check.IfNil(args.trieSyncStatisticsProvider) { + return heartbeat.ErrNilTrieSyncStatisticsProvider + } return nil } @@ -93,9 +99,11 @@ func (sender *heartbeatSender) Execute() { } func (sender *heartbeatSender) execute() error { + trieNodesReceived := sender.trieSyncStatisticsProvider.NumReceived() payload := &heartbeat.Payload{ - Timestamp: time.Now().Unix(), - HardforkMessage: "", // sent through peer authentication message + Timestamp: time.Now().Unix(), + HardforkMessage: "", // sent through peer authentication message + NumTrieNodesSynced: uint64(trieNodesReceived), } payloadBytes, err := sender.marshaller.Marshal(payload) if err != nil { diff --git a/heartbeat/sender/heartbeatSender_test.go b/heartbeat/sender/heartbeatSender_test.go index d2345352f5b..36c482ed9e8 100644 --- a/heartbeat/sender/heartbeatSender_test.go +++ b/heartbeat/sender/heartbeatSender_test.go @@ -20,13 +20,14 @@ var expectedErr = errors.New("expected error") func createMockHeartbeatSenderArgs(argBase argBaseSender) argHeartbeatSender { return argHeartbeatSender{ - argBaseSender: argBase, - versionNumber: "v1", - nodeDisplayName: "node", - identity: "identity", - peerSubType: core.RegularPeer, - currentBlockProvider: &mock.CurrentBlockProviderStub{}, - peerTypeProvider: &mock.PeerTypeProviderStub{}, + argBaseSender: argBase, + versionNumber: "v1", + nodeDisplayName: "node", + identity: "identity", + peerSubType: core.RegularPeer, + currentBlockProvider: &mock.CurrentBlockProviderStub{}, + peerTypeProvider: &mock.PeerTypeProviderStub{}, + trieSyncStatisticsProvider: &testscommon.SizeSyncStatisticsHandlerStub{}, } } @@ -186,6 +187,16 @@ func TestNewHeartbeatSender(t *testing.T) { assert.Nil(t, senderInstance) assert.Equal(t, heartbeat.ErrNilPeerTypeProvider, err) }) + t.Run("nil trie sync statistics provider should error", func(t *testing.T) { + t.Parallel() + + args := createMockHeartbeatSenderArgs(createMockBaseArgs()) + args.trieSyncStatisticsProvider = nil + senderInstance, err := newHeartbeatSender(args) + + assert.Nil(t, senderInstance) + assert.Equal(t, heartbeat.ErrNilTrieSyncStatisticsProvider, err) + }) t.Run("should work", func(t *testing.T) { t.Parallel() @@ -296,6 +307,7 @@ func TestHeartbeatSender_execute(t *testing.T) { t.Run("should work", func(t *testing.T) { t.Parallel() + providedNumTrieNodesSynced := 100 argsBase := createMockBaseArgs() broadcastCalled := false argsBase.messenger = &mock.MessengerStub{ @@ -307,24 +319,29 @@ func TestHeartbeatSender_execute(t *testing.T) { pk := argsBase.privKey.GeneratePublic() pkBytes, _ := pk.ToByteArray() assert.Equal(t, pkBytes, recoveredMessage.Pubkey) + recoveredPayload := &heartbeat.Payload{} + err = argsBase.marshaller.Unmarshal(recoveredPayload, recoveredMessage.Payload) + assert.Nil(t, err) + assert.Equal(t, uint64(providedNumTrieNodesSynced), recoveredPayload.NumTrieNodesSynced) broadcastCalled = true }, } args := createMockHeartbeatSenderArgs(argsBase) - args.currentBlockProvider = &mock.CurrentBlockProviderStub{ GetCurrentBlockHeaderCalled: func() data.HeaderHandler { return &testscommon.HeaderHandlerStub{} }, } - providedPeerType := common.EligibleList args.peerTypeProvider = &mock.PeerTypeProviderStub{ ComputeForPubKeyCalled: func(pubKey []byte) (common.PeerType, uint32, error) { return providedPeerType, 0, nil }, } + args.trieSyncStatisticsProvider = &testscommon.SizeSyncStatisticsHandlerStub{ + NumReceivedField: providedNumTrieNodesSynced, + } senderInstance, _ := newHeartbeatSender(args) assert.False(t, check.IfNil(senderInstance)) diff --git a/heartbeat/sender/peerAuthenticationSender.go b/heartbeat/sender/peerAuthenticationSender.go index c6f1eb4d003..5dcea5d0a3c 100644 --- a/heartbeat/sender/peerAuthenticationSender.go +++ b/heartbeat/sender/peerAuthenticationSender.go @@ -116,8 +116,9 @@ func (sender *peerAuthenticationSender) execute() (error, bool) { hardforkPayload, isTriggered := sender.getHardforkPayload() payload := &heartbeat.Payload{ - Timestamp: time.Now().Unix(), - HardforkMessage: string(hardforkPayload), + Timestamp: time.Now().Unix(), + HardforkMessage: string(hardforkPayload), + NumTrieNodesSynced: 0, // sent through heartbeat v2 message } payloadBytes, err := sender.marshaller.Marshal(payload) if err != nil { diff --git a/heartbeat/sender/sender.go b/heartbeat/sender/sender.go index e6de708fe3f..74c95f6129a 100644 --- a/heartbeat/sender/sender.go +++ b/heartbeat/sender/sender.go @@ -7,6 +7,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/marshal" crypto "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/heartbeat" + "github.com/ElrondNetwork/elrond-go/heartbeat/sender/disabled" ) // ArgSender represents the arguments for the sender @@ -81,12 +82,13 @@ func NewSender(args ArgSender) (*sender, error) { privKey: args.PrivateKey, redundancyHandler: args.RedundancyHandler, }, - versionNumber: args.VersionNumber, - nodeDisplayName: args.NodeDisplayName, - identity: args.Identity, - peerSubType: args.PeerSubType, - currentBlockProvider: args.CurrentBlockProvider, - peerTypeProvider: args.PeerTypeProvider, + versionNumber: args.VersionNumber, + nodeDisplayName: args.NodeDisplayName, + identity: args.Identity, + peerSubType: args.PeerSubType, + currentBlockProvider: args.CurrentBlockProvider, + peerTypeProvider: args.PeerTypeProvider, + trieSyncStatisticsProvider: disabled.NewTrieSyncStatisticsProvider(), }) if err != nil { return nil, err diff --git a/integrationTests/state/stateTrieSync/stateTrieSync_test.go b/integrationTests/state/stateTrieSync/stateTrieSync_test.go index ce33595f6da..ca16b1642a8 100644 --- a/integrationTests/state/stateTrieSync/stateTrieSync_test.go +++ b/integrationTests/state/stateTrieSync/stateTrieSync_test.go @@ -8,7 +8,6 @@ import ( "testing" "time" - arwenConfig "github.com/ElrondNetwork/wasm-vm/config" "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/throttler" logger "github.com/ElrondNetwork/elrond-go-logger" @@ -27,6 +26,7 @@ import ( "github.com/ElrondNetwork/elrond-go/trie/statistics" "github.com/ElrondNetwork/elrond-go/trie/storageMarker" "github.com/ElrondNetwork/elrond-go/vm/systemSmartContracts/defaults" + arwenConfig "github.com/ElrondNetwork/wasm-vm/config" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -591,6 +591,7 @@ func getUserAccountSyncerArgs(node *integrationTests.TestProcessorNode, version MaxHardCapForMissingNodes: 5000, TrieSyncerVersion: version, StorageMarker: storageMarker.NewTrieStorageMarker(), + SyncStatisticsHandler: statistics.NewTrieSyncStatistics(), }, ShardId: 0, Throttler: thr, diff --git a/node/nodeRunner.go b/node/nodeRunner.go index 3426eae267f..f45d4f1fdc4 100644 --- a/node/nodeRunner.go +++ b/node/nodeRunner.go @@ -59,6 +59,7 @@ import ( storageFactory "github.com/ElrondNetwork/elrond-go/storage/factory" "github.com/ElrondNetwork/elrond-go/storage/storageunit" trieFactory "github.com/ElrondNetwork/elrond-go/trie/factory" + trieStatistics "github.com/ElrondNetwork/elrond-go/trie/statistics" "github.com/ElrondNetwork/elrond-go/trie/storageMarker" "github.com/ElrondNetwork/elrond-go/update/trigger" "github.com/google/gops/agent" @@ -679,6 +680,7 @@ func getBaseAccountSyncerArgs( TrieSyncerVersion: config.TrieSync.TrieSyncerVersion, StorageMarker: storageMarker.NewDisabledStorageMarker(), CheckNodesOnDisk: true, + SyncStatisticsHandler: trieStatistics.NewTrieSyncStatistics(), } } diff --git a/process/interface.go b/process/interface.go index d75a002995b..f1b4770297c 100644 --- a/process/interface.go +++ b/process/interface.go @@ -1147,6 +1147,24 @@ type CryptoComponentsHolder interface { IsInterfaceNil() bool } +// TrieSyncStatisticsProvider is able to provide trie sync statistics +type TrieSyncStatisticsProvider interface { + data.SyncStatisticsHandler + AddNumBytesReceived(bytes uint64) + NumBytesReceived() uint64 + NumTries() int + AddProcessingTime(duration time.Duration) + IncrementIteration() + ProcessingTime() time.Duration + NumIterations() int +} + +// StatusCoreComponentsHolder holds the status core components +type StatusCoreComponentsHolder interface { + TrieSyncStatistics() TrieSyncStatisticsProvider + IsInterfaceNil() bool +} + // NumConnectedPeersProvider defines the actions that a component that provides the number of connected peers should do type NumConnectedPeersProvider interface { ConnectedPeers() []core.PeerID diff --git a/state/errors.go b/state/errors.go index 89cc3da65e0..4cbbc32e22f 100644 --- a/state/errors.go +++ b/state/errors.go @@ -155,3 +155,6 @@ var ErrFunctionalityNotImplemented = errors.New("functionality not implemented y // ErrNilTrieSyncer signals that the trie syncer is nil var ErrNilTrieSyncer = errors.New("trie syncer is nil") + +// ErrNilSyncStatisticsHandler signals that a nil sync statistics handler was provided +var ErrNilSyncStatisticsHandler = errors.New("nil sync statistics handler") diff --git a/state/syncer/baseAccountsSyncer.go b/state/syncer/baseAccountsSyncer.go index c581a345a11..7300e70ffd9 100644 --- a/state/syncer/baseAccountsSyncer.go +++ b/state/syncer/baseAccountsSyncer.go @@ -33,6 +33,7 @@ type baseAccountsSyncer struct { maxHardCapForMissingNodes int checkNodesOnDisk bool storageMarker trie.StorageMarker + syncStatisticsHandler common.SizeSyncStatisticsHandler trieSyncerVersion int numTriesSynced int32 @@ -50,6 +51,7 @@ type ArgsNewBaseAccountsSyncer struct { RequestHandler trie.RequestHandler Timeout time.Duration Cacher storage.Cacher + SyncStatisticsHandler common.SizeSyncStatisticsHandler MaxTrieLevelInMemory uint MaxHardCapForMissingNodes int TrieSyncerVersion int @@ -72,6 +74,9 @@ func checkArgs(args ArgsNewBaseAccountsSyncer) error { if check.IfNil(args.Cacher) { return state.ErrNilCacher } + if check.IfNil(args.SyncStatisticsHandler) { + return state.ErrNilSyncStatisticsHandler + } if args.MaxHardCapForMissingNodes < 1 { return state.ErrInvalidMaxHardCapForMissingNodes } @@ -82,7 +87,6 @@ func checkArgs(args ArgsNewBaseAccountsSyncer) error { func (b *baseAccountsSyncer) syncMainTrie( rootHash []byte, trieTopic string, - ssh common.SizeSyncStatisticsHandler, ctx context.Context, ) (common.Trie, error) { b.rootHash = rootHash @@ -103,7 +107,7 @@ func (b *baseAccountsSyncer) syncMainTrie( Hasher: b.hasher, ShardId: b.shardId, Topic: trieTopic, - TrieSyncStatistics: ssh, + TrieSyncStatistics: b.syncStatisticsHandler, TimeoutHandler: b.timeoutHandler, MaxHardCapForMissingNodes: b.maxHardCapForMissingNodes, CheckNodesOnDisk: b.checkNodesOnDisk, @@ -125,7 +129,7 @@ func (b *baseAccountsSyncer) syncMainTrie( return dataTrie.Recreate(rootHash) } -func (b *baseAccountsSyncer) printStatistics(ssh common.SizeSyncStatisticsHandler, ctx context.Context) { +func (b *baseAccountsSyncer) printStatistics(ctx context.Context) { lastDataReceived := uint64(0) peakDataReceived := uint64(0) startedSync := time.Now() @@ -135,27 +139,27 @@ func (b *baseAccountsSyncer) printStatistics(ssh common.SizeSyncStatisticsHandle peakSpeed := convertBytesPerIntervalToSpeed(peakDataReceived, timeBetweenStatisticsPrints) finishedSync := time.Now() totalSyncDuration := finishedSync.Sub(startedSync) - averageSpeed := convertBytesPerIntervalToSpeed(ssh.NumBytesReceived(), totalSyncDuration) + averageSpeed := convertBytesPerIntervalToSpeed(b.syncStatisticsHandler.NumBytesReceived(), totalSyncDuration) log.Info("finished trie sync", "name", b.name, "time elapsed", totalSyncDuration.Truncate(time.Second), - "num processed", ssh.NumReceived(), - "num large nodes", ssh.NumLarge(), - "num missing", ssh.NumMissing(), - "state data size", core.ConvertBytes(ssh.NumBytesReceived()), - "total iterations", ssh.NumIterations(), - "total CPU time", ssh.ProcessingTime(), + "num processed", b.syncStatisticsHandler.NumReceived(), + "num large nodes", b.syncStatisticsHandler.NumLarge(), + "num missing", b.syncStatisticsHandler.NumMissing(), + "state data size", core.ConvertBytes(b.syncStatisticsHandler.NumBytesReceived()), + "total iterations", b.syncStatisticsHandler.NumIterations(), + "total CPU time", b.syncStatisticsHandler.ProcessingTime(), "peak processing speed", peakSpeed, "average processing speed", averageSpeed, ) return case <-time.After(timeBetweenStatisticsPrints): - bytesReceivedDelta := ssh.NumBytesReceived() - lastDataReceived - if ssh.NumBytesReceived() < lastDataReceived { + bytesReceivedDelta := b.syncStatisticsHandler.NumBytesReceived() - lastDataReceived + if b.syncStatisticsHandler.NumBytesReceived() < lastDataReceived { bytesReceivedDelta = 0 } - lastDataReceived = ssh.NumBytesReceived() + lastDataReceived = b.syncStatisticsHandler.NumBytesReceived() speed := convertBytesPerIntervalToSpeed(bytesReceivedDelta, timeBetweenStatisticsPrints) if peakDataReceived < bytesReceivedDelta { @@ -165,16 +169,16 @@ func (b *baseAccountsSyncer) printStatistics(ssh common.SizeSyncStatisticsHandle log.Info("trie sync in progress", "name", b.name, "time elapsed", time.Since(startedSync).Truncate(time.Second), - "num tries currently syncing", ssh.NumTries(), - "num processed", ssh.NumReceived(), - "num large nodes", ssh.NumLarge(), - "num missing", ssh.NumMissing(), + "num tries currently syncing", b.syncStatisticsHandler.NumTries(), + "num processed", b.syncStatisticsHandler.NumReceived(), + "num large nodes", b.syncStatisticsHandler.NumLarge(), + "num missing", b.syncStatisticsHandler.NumMissing(), "num tries synced", fmt.Sprintf("%d/%d", atomic.LoadInt32(&b.numTriesSynced), atomic.LoadInt32(&b.numMaxTries)), "intercepted trie nodes cache size", core.ConvertBytes(b.cacher.SizeInBytesContained()), "num of intercepted trie nodes", b.cacher.Len(), - "state data size", core.ConvertBytes(ssh.NumBytesReceived()), - "iterations", ssh.NumIterations(), - "CPU time", ssh.ProcessingTime(), + "state data size", core.ConvertBytes(b.syncStatisticsHandler.NumBytesReceived()), + "iterations", b.syncStatisticsHandler.NumIterations(), + "CPU time", b.syncStatisticsHandler.ProcessingTime(), "processing speed", speed) } } diff --git a/state/syncer/userAccountsSyncer.go b/state/syncer/userAccountsSyncer.go index 1ff7c0e0a0c..b8576d54ed5 100644 --- a/state/syncer/userAccountsSyncer.go +++ b/state/syncer/userAccountsSyncer.go @@ -18,7 +18,6 @@ import ( "github.com/ElrondNetwork/elrond-go/state" "github.com/ElrondNetwork/elrond-go/trie" "github.com/ElrondNetwork/elrond-go/trie/keyBuilder" - "github.com/ElrondNetwork/elrond-go/trie/statistics" ) var _ epochStart.AccountsDBSyncer = (*userAccountsSyncer)(nil) @@ -90,6 +89,7 @@ func NewUserAccountsSyncer(args ArgsNewUserAccountsSyncer) (*userAccountsSyncer, trieSyncerVersion: args.TrieSyncerVersion, checkNodesOnDisk: args.CheckNodesOnDisk, storageMarker: args.StorageMarker, + syncStatisticsHandler: args.SyncStatisticsHandler, } u := &userAccountsSyncer{ @@ -115,10 +115,9 @@ func (u *userAccountsSyncer) SyncAccounts(rootHash []byte) error { cancel() }() - tss := statistics.NewTrieSyncStatistics() - go u.printStatistics(tss, ctx) + go u.printStatistics(ctx) - mainTrie, err := u.syncMainTrie(rootHash, factory.AccountTrieNodesTopic, tss, ctx) + mainTrie, err := u.syncMainTrie(rootHash, factory.AccountTrieNodesTopic, ctx) if err != nil { return err } @@ -129,7 +128,7 @@ func (u *userAccountsSyncer) SyncAccounts(rootHash []byte) error { log.Debug("main trie synced, starting to sync data tries", "num data tries", len(u.dataTries)) - err = u.syncAccountDataTries(mainTrie, tss, ctx) + err = u.syncAccountDataTries(mainTrie, ctx) if err != nil { return err } @@ -139,7 +138,7 @@ func (u *userAccountsSyncer) SyncAccounts(rootHash []byte) error { return nil } -func (u *userAccountsSyncer) syncDataTrie(rootHash []byte, ssh common.SizeSyncStatisticsHandler, address []byte, ctx context.Context) error { +func (u *userAccountsSyncer) syncDataTrie(rootHash []byte, address []byte, ctx context.Context) error { u.syncerMutex.Lock() _, ok := u.dataTries[string(rootHash)] if ok { @@ -158,7 +157,7 @@ func (u *userAccountsSyncer) syncDataTrie(rootHash []byte, ssh common.SizeSyncSt Hasher: u.hasher, ShardId: u.shardId, Topic: factory.AccountTrieNodesTopic, - TrieSyncStatistics: ssh, + TrieSyncStatistics: u.syncStatisticsHandler, TimeoutHandler: u.timeoutHandler, MaxHardCapForMissingNodes: u.maxHardCapForMissingNodes, CheckNodesOnDisk: u.checkNodesOnDisk, @@ -202,7 +201,6 @@ func (u *userAccountsSyncer) updateDataTrieStatistics(trieSyncer trie.TrieSyncer func (u *userAccountsSyncer) syncAccountDataTries( mainTrie common.Trie, - ssh common.SizeSyncStatisticsHandler, ctx context.Context, ) error { defer u.printDataTrieStatistics() @@ -249,7 +247,7 @@ func (u *userAccountsSyncer) syncAccountDataTries( defer u.throttler.EndProcessing() log.Trace("sync data trie", "roothash", trieRootHash) - newErr := u.syncDataTrie(trieRootHash, ssh, address, ctx) + newErr := u.syncDataTrie(trieRootHash, address, ctx) if newErr != nil { errMutex.Lock() errFound = newErr diff --git a/state/syncer/validatorAccountsSyncer.go b/state/syncer/validatorAccountsSyncer.go index 5636c91c7a2..831db84fcce 100644 --- a/state/syncer/validatorAccountsSyncer.go +++ b/state/syncer/validatorAccountsSyncer.go @@ -49,6 +49,7 @@ func NewValidatorAccountsSyncer(args ArgsNewValidatorAccountsSyncer) (*validator trieSyncerVersion: args.TrieSyncerVersion, checkNodesOnDisk: args.CheckNodesOnDisk, storageMarker: args.StorageMarker, + syncStatisticsHandler: statistics.NewTrieSyncStatistics(), } u := &validatorAccountsSyncer{ @@ -71,10 +72,9 @@ func (v *validatorAccountsSyncer) SyncAccounts(rootHash []byte) error { cancel() }() - tss := statistics.NewTrieSyncStatistics() - go v.printStatistics(tss, ctx) + go v.printStatistics(ctx) - mainTrie, err := v.syncMainTrie(rootHash, factory.ValidatorTrieNodesTopic, tss, ctx) + mainTrie, err := v.syncMainTrie(rootHash, factory.ValidatorTrieNodesTopic, ctx) if err != nil { return err } diff --git a/testscommon/sizeSyncStatisticsHandlerStub.go b/testscommon/sizeSyncStatisticsHandlerStub.go new file mode 100644 index 00000000000..30359fa2fae --- /dev/null +++ b/testscommon/sizeSyncStatisticsHandlerStub.go @@ -0,0 +1,113 @@ +package testscommon + +import "time" + +// SizeSyncStatisticsHandlerStub - +type SizeSyncStatisticsHandlerStub struct { + AddNumBytesReceivedCalled func(bytes uint64) + AddProcessingTimeCalled func(duration time.Duration) + IncrementIterationCalled func() + ProcessingTimeCalled func() time.Duration + ResetCalled func() + AddNumReceivedCalled func(value int) + AddNumLargeCalled func(value int) + SetNumMissingCalled func(rootHash []byte, value int) + NumBytesReceivedField uint64 + NumTriesField int + NumIterationsField int + NumReceivedField int + NumLargeField int + NumMissingField int +} + +// Reset - +func (stub *SizeSyncStatisticsHandlerStub) Reset() { + if stub.ResetCalled != nil { + stub.ResetCalled() + } +} + +// AddNumReceived - +func (stub *SizeSyncStatisticsHandlerStub) AddNumReceived(value int) { + if stub.AddNumReceivedCalled != nil { + stub.AddNumReceivedCalled(value) + } +} + +// AddNumLarge - +func (stub *SizeSyncStatisticsHandlerStub) AddNumLarge(value int) { + if stub.AddNumLargeCalled != nil { + stub.AddNumLargeCalled(value) + } +} + +// SetNumMissing - +func (stub *SizeSyncStatisticsHandlerStub) SetNumMissing(rootHash []byte, value int) { + if stub.SetNumMissingCalled != nil { + stub.SetNumMissingCalled(rootHash, value) + } +} + +// NumReceived - +func (stub *SizeSyncStatisticsHandlerStub) NumReceived() int { + return stub.NumReceivedField +} + +// NumLarge - +func (stub *SizeSyncStatisticsHandlerStub) NumLarge() int { + return stub.NumLargeField +} + +// NumMissing - +func (stub *SizeSyncStatisticsHandlerStub) NumMissing() int { + return stub.NumMissingField +} + +// AddNumBytesReceived - +func (stub *SizeSyncStatisticsHandlerStub) AddNumBytesReceived(bytes uint64) { + if stub.AddNumBytesReceivedCalled != nil { + stub.AddNumBytesReceivedCalled(bytes) + } +} + +// NumBytesReceived - +func (stub *SizeSyncStatisticsHandlerStub) NumBytesReceived() uint64 { + return stub.NumBytesReceivedField +} + +// NumTries - +func (stub *SizeSyncStatisticsHandlerStub) NumTries() int { + return stub.NumTriesField +} + +// AddProcessingTime - +func (stub *SizeSyncStatisticsHandlerStub) AddProcessingTime(duration time.Duration) { + if stub.AddProcessingTimeCalled != nil { + stub.AddProcessingTimeCalled(duration) + } +} + +// IncrementIteration - +func (stub *SizeSyncStatisticsHandlerStub) IncrementIteration() { + if stub.IncrementIterationCalled != nil { + stub.IncrementIterationCalled() + } +} + +// ProcessingTime - +func (stub *SizeSyncStatisticsHandlerStub) ProcessingTime() time.Duration { + if stub.ProcessingTimeCalled != nil { + return stub.ProcessingTimeCalled() + } + return time.Second +} + +// NumIterations - +func (stub *SizeSyncStatisticsHandlerStub) NumIterations() int { + return stub.NumIterationsField +} + +// IsInterfaceNil - +func (stub *SizeSyncStatisticsHandlerStub) IsInterfaceNil() bool { + return stub == nil +} diff --git a/update/factory/accountDBSyncerContainerFactory.go b/update/factory/accountDBSyncerContainerFactory.go index 1e84e9312a5..666f7b53995 100644 --- a/update/factory/accountDBSyncerContainerFactory.go +++ b/update/factory/accountDBSyncerContainerFactory.go @@ -13,6 +13,7 @@ import ( "github.com/ElrondNetwork/elrond-go/state/syncer" "github.com/ElrondNetwork/elrond-go/storage" "github.com/ElrondNetwork/elrond-go/trie" + "github.com/ElrondNetwork/elrond-go/trie/statistics" "github.com/ElrondNetwork/elrond-go/trie/storageMarker" "github.com/ElrondNetwork/elrond-go/update" containers "github.com/ElrondNetwork/elrond-go/update/container" @@ -149,6 +150,7 @@ func (a *accountDBSyncersContainerFactory) createUserAccountsSyncer(shardId uint TrieSyncerVersion: a.trieSyncerVersion, CheckNodesOnDisk: a.checkNodesOnDisk, StorageMarker: storageMarker.NewTrieStorageMarker(), + SyncStatisticsHandler: statistics.NewTrieSyncStatistics(), }, ShardId: shardId, Throttler: thr, From 186abeba9070c711993a2cd2f0e7b7e33276cd85 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 17 Oct 2022 19:23:43 +0300 Subject: [PATCH 026/110] fix timeout on test --- epochStart/bootstrap/process_test.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/epochStart/bootstrap/process_test.go b/epochStart/bootstrap/process_test.go index 09ad454ca0d..87403c33b9e 100644 --- a/epochStart/bootstrap/process_test.go +++ b/epochStart/bootstrap/process_test.go @@ -102,7 +102,11 @@ func createMockEpochStartBootstrapArgs( ScheduledSCRsStorer: genericMocks.NewStorerMock(), CoreComponentsHolder: coreMock, CryptoComponentsHolder: cryptoMock, - Messenger: &p2pmocks.MessengerStub{}, + Messenger: &p2pmocks.MessengerStub{ + ConnectedPeersCalled: func() []core.PeerID { + return []core.PeerID{"peer0", "peer1", "peer2", "peer3", "peer4", "peer5"} + }, + }, GeneralConfig: config.Config{ MiniBlocksStorage: generalCfg.MiniBlocksStorage, PeerBlockBodyStorage: generalCfg.PeerBlockBodyStorage, From a0676f37ac1c7f262a36ef00c0b50f9a02e5fb36 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 17 Oct 2022 20:44:09 +0300 Subject: [PATCH 027/110] fixed all tests --- .../epochStartMetaBlockProcessor_test.go | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/epochStart/bootstrap/epochStartMetaBlockProcessor_test.go b/epochStart/bootstrap/epochStartMetaBlockProcessor_test.go index d4a0a827fc4..e811c8f1575 100644 --- a/epochStart/bootstrap/epochStartMetaBlockProcessor_test.go +++ b/epochStart/bootstrap/epochStartMetaBlockProcessor_test.go @@ -106,7 +106,10 @@ func TestNewEpochStartMetaBlockProcessorOkValsShouldWork(t *testing.T) { t.Parallel() esmbp, err := NewEpochStartMetaBlockProcessor( - &p2pmocks.MessengerStub{}, + &p2pmocks.MessengerStub{ + ConnectedPeersCalled: func() []core.PeerID { + return []core.PeerID{"peer_0", "peer_1", "peer_2", "peer_3", "peer_4", "peer_5"} + }}, &testscommon.RequestHandlerStub{}, &mock.MarshalizerMock{}, &hashingMocks.HasherMock{}, @@ -159,7 +162,10 @@ func TestEpochStartMetaBlockProcessor_Validate(t *testing.T) { t.Parallel() esmbp, _ := NewEpochStartMetaBlockProcessor( - &p2pmocks.MessengerStub{}, + &p2pmocks.MessengerStub{ + ConnectedPeersCalled: func() []core.PeerID { + return []core.PeerID{"peer_0", "peer_1", "peer_2", "peer_3", "peer_4", "peer_5"} + }}, &testscommon.RequestHandlerStub{}, &mock.MarshalizerMock{}, &hashingMocks.HasherMock{}, @@ -175,7 +181,10 @@ func TestEpochStartMetaBlockProcessor_SaveNilInterceptedDataShouldNotReturnError t.Parallel() esmbp, _ := NewEpochStartMetaBlockProcessor( - &p2pmocks.MessengerStub{}, + &p2pmocks.MessengerStub{ + ConnectedPeersCalled: func() []core.PeerID { + return []core.PeerID{"peer_0", "peer_1", "peer_2", "peer_3", "peer_4", "peer_5"} + }}, &testscommon.RequestHandlerStub{}, &mock.MarshalizerMock{}, &hashingMocks.HasherMock{}, @@ -192,7 +201,11 @@ func TestEpochStartMetaBlockProcessor_SaveOkInterceptedDataShouldWork(t *testing t.Parallel() esmbp, _ := NewEpochStartMetaBlockProcessor( - &p2pmocks.MessengerStub{}, + &p2pmocks.MessengerStub{ + ConnectedPeersCalled: func() []core.PeerID { + return []core.PeerID{"peer_0", "peer_1", "peer_2", "peer_3", "peer_4", "peer_5"} + }, + }, &testscommon.RequestHandlerStub{}, &mock.MarshalizerMock{}, &hashingMocks.HasherMock{}, From f02c9c25c602e7ed2f98dc578ff226222db08dcd Mon Sep 17 00:00:00 2001 From: BeniaminDrasovean Date: Tue, 18 Oct 2022 12:27:07 +0300 Subject: [PATCH 028/110] return trie depth for each Get() call --- common/interface.go | 2 +- epochStart/metachain/baseRewards_test.go | 6 +- epochStart/metachain/systemSCs_test.go | 12 +-- .../multiShard/smartContract/dns/dns_test.go | 2 +- .../state/stateTrie/stateTrie_test.go | 4 +- .../hooks/blockChainHook_test.go | 4 +- state/accountsDB.go | 8 +- state/accountsDB_test.go | 101 ++++++++++-------- state/interface.go | 2 +- state/journalEntries_test.go | 5 +- state/trackableDataTrie.go | 4 +- state/trackableDataTrie_test.go | 18 ++-- testscommon/trie/trieStub.go | 6 +- trie/depthFirstSync_test.go | 4 +- trie/doubleListSync_test.go | 4 +- trie/patriciaMerkleTrie.go | 10 +- trie/patriciaMerkleTrie_test.go | 35 ++++-- 17 files changed, 125 insertions(+), 102 deletions(-) diff --git a/common/interface.go b/common/interface.go index 84aedb436a1..c0c1d3f358b 100644 --- a/common/interface.go +++ b/common/interface.go @@ -27,7 +27,7 @@ type TrieIteratorChannels struct { // Trie is an interface for Merkle Trees implementations type Trie interface { - Get(key []byte) ([]byte, error) + Get(key []byte) ([]byte, uint32, error) Update(key, value []byte) error Delete(key []byte) error RootHash() ([]byte, error) diff --git a/epochStart/metachain/baseRewards_test.go b/epochStart/metachain/baseRewards_test.go index f3bcaf61e11..15ce0e90d4e 100644 --- a/epochStart/metachain/baseRewards_test.go +++ b/epochStart/metachain/baseRewards_test.go @@ -838,11 +838,11 @@ func TestBaseRewardsCreator_isSystemDelegationSC(t *testing.T) { require.Nil(t, err) userAccount.SetDataTrie(&trieMock.TrieStub{ - GetCalled: func(key []byte) ([]byte, error) { + GetCalled: func(key []byte) ([]byte, uint32, error) { if bytes.Equal(key, []byte(core.DelegationSystemSCKey)) { - return []byte("delegation"), nil + return []byte("delegation"), 0, nil } - return nil, fmt.Errorf("not found") + return nil, 0, fmt.Errorf("not found") }, }) diff --git a/epochStart/metachain/systemSCs_test.go b/epochStart/metachain/systemSCs_test.go index ac971324339..7f4097ac4f0 100644 --- a/epochStart/metachain/systemSCs_test.go +++ b/epochStart/metachain/systemSCs_test.go @@ -11,7 +11,6 @@ import ( "strconv" "testing" - arwenConfig "github.com/ElrondNetwork/wasm-vm/config" "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-core/data/block" @@ -56,6 +55,7 @@ import ( "github.com/ElrondNetwork/elrond-go/vm/systemSmartContracts/defaults" vmcommon "github.com/ElrondNetwork/elrond-vm-common" vmcommonBuiltInFunctions "github.com/ElrondNetwork/elrond-vm-common/builtInFunctions" + arwenConfig "github.com/ElrondNetwork/wasm-vm/config" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -1563,7 +1563,7 @@ func TestSystemSCProcessor_ProcessSystemSmartContractUnStakeFromDelegationContra assert.Equal(t, 4, len(validatorInfos[0])) delegationSC := loadSCAccount(args.UserAccountsDB, delegationAddr) - marshalledData, err := delegationSC.DataTrie().(common.Trie).Get([]byte("delegationStatus")) + marshalledData, _, err := delegationSC.DataTrie().(common.Trie).Get([]byte("delegationStatus")) assert.Nil(t, err) dStatus := &systemSmartContracts.DelegationContractStatus{ StakedKeys: make([]*systemSmartContracts.NodesData, 0), @@ -1652,7 +1652,7 @@ func TestSystemSCProcessor_ProcessSystemSmartContractShouldUnStakeFromAdditional } delegationSC := loadSCAccount(args.UserAccountsDB, delegationAddr) - marshalledData, err := delegationSC.DataTrie().(common.Trie).Get([]byte("delegationStatus")) + marshalledData, _, err := delegationSC.DataTrie().(common.Trie).Get([]byte("delegationStatus")) assert.Nil(t, err) dStatus := &systemSmartContracts.DelegationContractStatus{ StakedKeys: make([]*systemSmartContracts.NodesData, 0), @@ -1742,7 +1742,7 @@ func TestSystemSCProcessor_ProcessSystemSmartContractUnStakeFromAdditionalQueue( assert.Nil(t, err) delegationSC := loadSCAccount(args.UserAccountsDB, delegationAddr2) - marshalledData, err := delegationSC.DataTrie().(common.Trie).Get([]byte("delegationStatus")) + marshalledData, _, err := delegationSC.DataTrie().(common.Trie).Get([]byte("delegationStatus")) assert.Nil(t, err) dStatus := &systemSmartContracts.DelegationContractStatus{ StakedKeys: make([]*systemSmartContracts.NodesData, 0), @@ -1827,14 +1827,14 @@ func TestSystemSCProcessor_TogglePauseUnPause(t *testing.T) { assert.Nil(t, err) validatorSC := loadSCAccount(s.userAccountsDB, vm.ValidatorSCAddress) - value, _ := validatorSC.DataTrie().(common.Trie).Get([]byte("unStakeUnBondPause")) + value, _, _ := validatorSC.DataTrie().(common.Trie).Get([]byte("unStakeUnBondPause")) assert.True(t, value[0] == 1) err = s.ToggleUnStakeUnBond(false) assert.Nil(t, err) validatorSC = loadSCAccount(s.userAccountsDB, vm.ValidatorSCAddress) - value, _ = validatorSC.DataTrie().(common.Trie).Get([]byte("unStakeUnBondPause")) + value, _, _ = validatorSC.DataTrie().(common.Trie).Get([]byte("unStakeUnBondPause")) assert.True(t, value[0] == 0) } diff --git a/integrationTests/multiShard/smartContract/dns/dns_test.go b/integrationTests/multiShard/smartContract/dns/dns_test.go index 78435ea7441..841c1192a9d 100644 --- a/integrationTests/multiShard/smartContract/dns/dns_test.go +++ b/integrationTests/multiShard/smartContract/dns/dns_test.go @@ -300,7 +300,7 @@ func checkUserNamesAreDeleted( dnsAcc, _ := acnt.(state.UserAccountHandler) keyFromTrie := "value_state" + string(keccak.NewKeccak().Compute(userName)) - value, err := dnsAcc.DataTrie().(common.Trie).Get([]byte(keyFromTrie)) + value, _, err := dnsAcc.DataTrie().(common.Trie).Get([]byte(keyFromTrie)) assert.Nil(t, err) assert.Nil(t, value) } diff --git a/integrationTests/state/stateTrie/stateTrie_test.go b/integrationTests/state/stateTrie/stateTrie_test.go index 88175afd2fc..bc700e57f29 100644 --- a/integrationTests/state/stateTrie/stateTrie_test.go +++ b/integrationTests/state/stateTrie/stateTrie_test.go @@ -288,7 +288,7 @@ func TestTrieDB_RecreateFromStorageShouldWork(t *testing.T) { tr2, err := tr1.Recreate(h1) require.Nil(t, err) - valRecov, err := tr2.Get(key) + valRecov, _, err := tr2.Get(key) require.Nil(t, err) require.Equal(t, value, valRecov) } @@ -1946,7 +1946,7 @@ func checkCodeConsistency( tr := shardNode.TrieContainer.Get([]byte(trieFactory.UserAccountTrie)) if codeMap[code] != 0 { - val, err := tr.Get(codeHash) + val, _, err := tr.Get(codeHash) require.Nil(t, err) require.NotNil(t, val) diff --git a/process/smartContract/hooks/blockChainHook_test.go b/process/smartContract/hooks/blockChainHook_test.go index 1d3d90d3652..76b113f5af7 100644 --- a/process/smartContract/hooks/blockChainHook_test.go +++ b/process/smartContract/hooks/blockChainHook_test.go @@ -1660,8 +1660,8 @@ func TestBlockChainHookImpl_GetESDTToken(t *testing.T) { GetExistingAccountCalled: func(addressContainer []byte) (vmcommon.AccountHandler, error) { addressHandler := stateMock.NewAccountWrapMock(address) addressHandler.SetDataTrie(&trie.TrieStub{ - GetCalled: func(key []byte) ([]byte, error) { - return make([]byte, 0), nil + GetCalled: func(_ []byte) ([]byte, uint32, error) { + return make([]byte, 0), 0, nil }, }) diff --git a/state/accountsDB.go b/state/accountsDB.go index 98ab129f123..7f44dc1426f 100644 --- a/state/accountsDB.go +++ b/state/accountsDB.go @@ -257,7 +257,7 @@ func (adb *AccountsDB) GetCode(codeHash []byte) []byte { adb.loadCodeMeasurements.addMeasurement(len(codeEntry.Code), duration) }() - val, err := adb.getMainTrie().Get(codeHash) + val, _, err := adb.getMainTrie().Get(codeHash) if err != nil { return nil } @@ -455,7 +455,7 @@ func (adb *AccountsDB) updateNewCodeEntry(newCodeHash []byte, newCode []byte) er } func getCodeEntry(codeHash []byte, trie Updater, marshalizer marshal.Marshalizer) (*CodeEntry, error) { - val, err := trie.Get(codeHash) + val, _, err := trie.Get(codeHash) if err != nil { return nil, err } @@ -690,7 +690,7 @@ func (adb *AccountsDB) LoadAccount(address []byte) (vmcommon.AccountHandler, err } func (adb *AccountsDB) getAccount(address []byte, mainTrie common.Trie) (vmcommon.AccountHandler, error) { - val, err := mainTrie.Get(address) + val, _, err := mainTrie.Get(address) if err != nil { return nil, err } @@ -776,7 +776,7 @@ func (adb *AccountsDB) loadCode(accountHandler baseAccountHandler) error { return nil } - val, err := adb.mainTrie.Get(accountHandler.GetCodeHash()) + val, _, err := adb.mainTrie.Get(accountHandler.GetCodeHash()) if err != nil { return err } diff --git a/state/accountsDB_test.go b/state/accountsDB_test.go index 248f13e049b..a9217ed5507 100644 --- a/state/accountsDB_test.go +++ b/state/accountsDB_test.go @@ -219,8 +219,8 @@ func TestAccountsDB_SaveAccountErrWhenGettingOldAccountShouldErr(t *testing.T) { expectedErr := errors.New("trie get err") adb := generateAccountDBFromTrie(&trieMock.TrieStub{ - GetCalled: func(key []byte) (i []byte, err error) { - return nil, expectedErr + GetCalled: func(_ []byte) ([]byte, uint32, error) { + return nil, 0, expectedErr }, GetStorageManagerCalled: func() common.StorageManager { return &testscommon.StorageManagerStub{} @@ -235,8 +235,8 @@ func TestAccountsDB_SaveAccountNilOldAccount(t *testing.T) { t.Parallel() adb := generateAccountDBFromTrie(&trieMock.TrieStub{ - GetCalled: func(key []byte) (i []byte, err error) { - return nil, nil + GetCalled: func(_ []byte) ([]byte, uint32, error) { + return nil, 0, nil }, UpdateCalled: func(key, value []byte) error { return nil @@ -258,8 +258,9 @@ func TestAccountsDB_SaveAccountExistingOldAccount(t *testing.T) { acc, _ := state.NewUserAccount([]byte("someAddress")) adb := generateAccountDBFromTrie(&trieMock.TrieStub{ - GetCalled: func(key []byte) (i []byte, err error) { - return (&testscommon.MarshalizerMock{}).Marshal(acc) + GetCalled: func(_ []byte) ([]byte, uint32, error) { + serializedAcc, err := (&testscommon.MarshalizerMock{}).Marshal(acc) + return serializedAcc, 0, err }, UpdateCalled: func(key, value []byte) error { return nil @@ -279,8 +280,8 @@ func TestAccountsDB_SaveAccountSavesCodeAndDataTrieForUserAccount(t *testing.T) updateCalled := 0 trieStub := &trieMock.TrieStub{ - GetCalled: func(key []byte) (i []byte, err error) { - return nil, nil + GetCalled: func(_ []byte) ([]byte, uint32, error) { + return nil, 0, nil }, UpdateCalled: func(key, value []byte) error { return nil @@ -291,8 +292,8 @@ func TestAccountsDB_SaveAccountSavesCodeAndDataTrieForUserAccount(t *testing.T) } adb := generateAccountDBFromTrie(&trieMock.TrieStub{ - GetCalled: func(key []byte) (i []byte, err error) { - return nil, nil + GetCalled: func(_ []byte) ([]byte, uint32, error) { + return nil, 0, nil }, UpdateCalled: func(key, value []byte) error { updateCalled++ @@ -346,8 +347,8 @@ func TestAccountsDB_SaveAccountWithSomeValuesShouldWork(t *testing.T) { t.Parallel() ts := &trieMock.TrieStub{ - GetCalled: func(key []byte) (i []byte, err error) { - return nil, nil + GetCalled: func(_ []byte) ([]byte, uint32, error) { + return nil, 0, nil }, UpdateCalled: func(key, value []byte) error { return nil @@ -371,8 +372,9 @@ func TestAccountsDB_RemoveAccountShouldWork(t *testing.T) { wasCalled := false marshaller := &testscommon.MarshalizerMock{} trieStub := &trieMock.TrieStub{ - GetCalled: func(key []byte) (i []byte, err error) { - return marshaller.Marshal(stateMock.AccountWrapMock{}) + GetCalled: func(_ []byte) ([]byte, uint32, error) { + serializedAcc, err := marshaller.Marshal(stateMock.AccountWrapMock{}) + return serializedAcc, 0, err }, UpdateCalled: func(key, value []byte) error { wasCalled = true @@ -413,8 +415,8 @@ func TestAccountsDB_LoadAccountNotFoundShouldCreateEmpty(t *testing.T) { t.Parallel() trieStub := &trieMock.TrieStub{ - GetCalled: func(key []byte) (i []byte, e error) { - return nil, nil + GetCalled: func(_ []byte) ([]byte, uint32, error) { + return nil, 0, nil }, UpdateCalled: func(key, value []byte) error { return nil @@ -446,14 +448,16 @@ func TestAccountsDB_LoadAccountExistingShouldLoadDataTrie(t *testing.T) { marshaller := &testscommon.MarshalizerMock{} trieStub := &trieMock.TrieStub{ - GetCalled: func(key []byte) (i []byte, e error) { + GetCalled: func(key []byte) ([]byte, uint32, error) { if bytes.Equal(key, acc.AddressBytes()) { - return marshaller.Marshal(acc) + serializedAcc, err := marshaller.Marshal(acc) + return serializedAcc, 0, err } if bytes.Equal(key, codeHash) { - return marshaller.Marshal(state.CodeEntry{Code: code}) + serializedCodeEntry, err := marshaller.Marshal(state.CodeEntry{Code: code}) + return serializedCodeEntry, 0, err } - return nil, nil + return nil, 0, nil }, RecreateCalled: func(root []byte) (d common.Trie, err error) { return dataTrie, nil @@ -492,8 +496,8 @@ func TestAccountsDB_GetExistingAccountNotFoundShouldRetNil(t *testing.T) { t.Parallel() trieStub := &trieMock.TrieStub{ - GetCalled: func(key []byte) (i []byte, e error) { - return nil, nil + GetCalled: func(_ []byte) ([]byte, uint32, error) { + return nil, 0, nil }, GetStorageManagerCalled: func() common.StorageManager { return &testscommon.StorageManagerStub{} @@ -522,14 +526,16 @@ func TestAccountsDB_GetExistingAccountFoundShouldRetAccount(t *testing.T) { marshaller := &testscommon.MarshalizerMock{} trieStub := &trieMock.TrieStub{ - GetCalled: func(key []byte) (i []byte, e error) { + GetCalled: func(key []byte) ([]byte, uint32, error) { if bytes.Equal(key, acc.AddressBytes()) { - return marshaller.Marshal(acc) + serializedAcc, err := marshaller.Marshal(acc) + return serializedAcc, 0, err } if bytes.Equal(key, codeHash) { - return marshaller.Marshal(state.CodeEntry{Code: code}) + serializedCodeEntry, err := marshaller.Marshal(state.CodeEntry{Code: code}) + return serializedCodeEntry, 0, err } - return nil, nil + return nil, 0, nil }, RecreateCalled: func(root []byte) (d common.Trie, err error) { return dataTrie, nil @@ -568,9 +574,9 @@ func TestAccountsDB_GetAccountAccountNotFound(t *testing.T) { buff, err := marshaller.Marshal(testAccount) assert.Nil(t, err) - tr.GetCalled = func(key []byte) (bytes []byte, e error) { + tr.GetCalled = func(_ []byte) ([]byte, uint32, error) { // whatever the key is, return the same marshalized DbAccount - return buff, nil + return buff, 0, nil } args := createMockAccountsDBArgs() @@ -636,9 +642,10 @@ func TestAccountsDB_LoadCodeOkValsShouldWork(t *testing.T) { marshaller := &testscommon.MarshalizerMock{} trieStub := &trieMock.TrieStub{ - GetCalled: func(key []byte) (bytes []byte, e error) { + GetCalled: func(_ []byte) ([]byte, uint32, error) { // will return adr.Bytes() so its hash will correspond to adr.Hash() - return marshaller.Marshal(&state.CodeEntry{Code: adr}) + serializedCodeEntry, err := marshaller.Marshal(&state.CodeEntry{Code: adr}) + return serializedCodeEntry, 0, err }, GetStorageManagerCalled: func() common.StorageManager { return &testscommon.StorageManagerStub{} @@ -742,12 +749,12 @@ func TestAccountsDB_LoadDataWithSomeValuesShouldWork(t *testing.T) { trieVal = append(trieVal, []byte("identifier")...) dataTrie := &trieMock.TrieStub{ - GetCalled: func(key []byte) (i []byte, e error) { + GetCalled: func(key []byte) ([]byte, uint32, error) { if bytes.Equal(key, keyRequired) { - return trieVal, nil + return trieVal, 0, nil } - return nil, nil + return nil, 0, nil }, } @@ -795,13 +802,13 @@ func TestAccountsDB_CommitShouldCallCommitFromTrie(t *testing.T) { RootCalled: func() (i []byte, e error) { return nil, nil }, - GetCalled: func(key []byte) (i []byte, err error) { - return serializedAccount, nil + GetCalled: func(_ []byte) ([]byte, uint32, error) { + return serializedAccount, 0, nil }, RecreateCalled: func(root []byte) (trie common.Trie, err error) { return &trieMock.TrieStub{ - GetCalled: func(key []byte) (i []byte, err error) { - return []byte("doge"), nil + GetCalled: func(_ []byte) ([]byte, uint32, error) { + return []byte("doge"), 0, nil }, UpdateCalled: func(key, value []byte) error { return nil @@ -1425,7 +1432,7 @@ func checkCodeEntry( tr common.Trie, t *testing.T, ) { - val, err := tr.Get(codeHash) + val, _, err := tr.Get(codeHash) assert.Nil(t, err) assert.NotNil(t, val) @@ -1496,7 +1503,7 @@ func TestAccountsDB_saveCode_OldCodeIsNilAndNewCodeIsNotNilAndRevert(t *testing. err = adb.RevertToSnapshot(1) assert.Nil(t, err) - val, err := tr.Get(expectedCodeHash) + val, _, err := tr.Get(expectedCodeHash) assert.Nil(t, err) assert.Nil(t, val) } @@ -1563,7 +1570,7 @@ func TestAccountsDB_saveCode_OldCodeExistsAndNewCodeIsNilAndRevert(t *testing.T) assert.Nil(t, err) assert.Nil(t, userAcc.GetCodeHash()) - val, err := tr.Get(oldCodeHash) + val, _, err := tr.Get(oldCodeHash) assert.Nil(t, err) assert.Nil(t, val) @@ -1606,7 +1613,7 @@ func TestAccountsDB_saveCode_OldCodeExistsAndNewCodeExistsAndRevert(t *testing.T assert.Nil(t, err) assert.Equal(t, newCodeHash, userAcc.GetCodeHash()) - val, err := tr.Get(oldCodeHash) + val, _, err := tr.Get(oldCodeHash) assert.Nil(t, err) assert.Nil(t, val) @@ -1676,20 +1683,20 @@ func TestAccountsDB_RemoveAccountAlsoRemovesCodeAndRevertsCorrectly(t *testing.T snapshot := adb.JournalLen() - val, err := tr.Get(oldCodeHash) + val, _, err := tr.Get(oldCodeHash) assert.Nil(t, err) assert.NotNil(t, val) err = adb.RemoveAccount(addr) assert.Nil(t, err) - val, err = tr.Get(oldCodeHash) + val, _, err = tr.Get(oldCodeHash) assert.Nil(t, err) assert.Nil(t, val) _ = adb.RevertToSnapshot(snapshot) - val, err = tr.Get(oldCodeHash) + val, _, err = tr.Get(oldCodeHash) assert.Nil(t, err) assert.NotNil(t, val) } @@ -2426,11 +2433,11 @@ func TestAccountsDB_GetAccountFromBytesShouldLoadDataTrie(t *testing.T) { serializerAcc, _ := marshaller.Marshal(acc) trieStub := &trieMock.TrieStub{ - GetCalled: func(key []byte) (i []byte, e error) { + GetCalled: func(key []byte) ([]byte, uint32, error) { if bytes.Equal(key, acc.AddressBytes()) { - return serializerAcc, nil + return serializerAcc, 0, nil } - return nil, nil + return nil, 0, nil }, RecreateCalled: func(root []byte) (d common.Trie, err error) { return dataTrie, nil diff --git a/state/interface.go b/state/interface.go index cf0a6f0e5c7..4e592e5e484 100644 --- a/state/interface.go +++ b/state/interface.go @@ -17,7 +17,7 @@ type AccountFactory interface { // Updater set a new value for a key, implemented by trie type Updater interface { - Get(key []byte) ([]byte, error) + Get(key []byte) ([]byte, uint32, error) Update(key, value []byte) error IsInterfaceNil() bool } diff --git a/state/journalEntries_test.go b/state/journalEntries_test.go index 20b21eea997..e6abd26e5ae 100644 --- a/state/journalEntries_test.go +++ b/state/journalEntries_test.go @@ -58,8 +58,9 @@ func TestJournalEntryCode_OldHashIsNilAndNewHashIsNotNil(t *testing.T) { updateCalled := false trieStub := &trieMock.TrieStub{ - GetCalled: func(key []byte) ([]byte, error) { - return marshalizer.Marshal(codeEntry) + GetCalled: func(_ []byte) ([]byte, uint32, error) { + serializedCodeEntry, err := marshalizer.Marshal(codeEntry) + return serializedCodeEntry, 0, err }, UpdateCalled: func(key, value []byte) error { updateCalled = true diff --git a/state/trackableDataTrie.go b/state/trackableDataTrie.go index 7ab077b3a9c..88a12ed24d6 100644 --- a/state/trackableDataTrie.go +++ b/state/trackableDataTrie.go @@ -39,7 +39,7 @@ func (tdaw *trackableDataTrie) RetrieveValue(key []byte) ([]byte, error) { if tdaw.tr == nil { return nil, ErrNilTrie } - value, err := tdaw.tr.Get(key) + value, _, err := tdaw.tr.Get(key) if err != nil { return nil, err } @@ -103,7 +103,7 @@ func (tdaw *trackableDataTrie) SaveDirtyData(mainTrie common.Trie) (map[string][ oldValues := make(map[string][]byte) for k, v := range tdaw.dirtyData { - val, err := tdaw.tr.Get([]byte(k)) + val, _, err := tdaw.tr.Get([]byte(k)) if err != nil { return oldValues, err } diff --git a/state/trackableDataTrie_test.go b/state/trackableDataTrie_test.go index 28cf5869d53..a36167efe29 100644 --- a/state/trackableDataTrie_test.go +++ b/state/trackableDataTrie_test.go @@ -47,11 +47,11 @@ func TestTrackableDataTrie_RetrieveValueFoundInTrieShouldWork(t *testing.T) { UpdateCalled: func(key, value []byte) error { return nil }, - GetCalled: func(key []byte) (b []byte, e error) { + GetCalled: func(key []byte) ([]byte, uint32, error) { if bytes.Equal(key, expectedKey) { - return value, nil + return value, 0, nil } - return nil, nil + return nil, 0, nil }, } mdaw := state.NewTrackableDataTrie(identifier, trie) @@ -71,8 +71,8 @@ func TestTrackableDataTrie_RetrieveValueMalfunctionTrieShouldErr(t *testing.T) { UpdateCalled: func(key, value []byte) error { return nil }, - GetCalled: func(key []byte) (b []byte, e error) { - return nil, errExpected + GetCalled: func(_ []byte) ([]byte, uint32, error) { + return nil, 0, errExpected }, } mdaw := state.NewTrackableDataTrie([]byte("identifier"), trie) @@ -94,8 +94,8 @@ func TestTrackableDataTrie_RetrieveValueShouldCheckDirtyDataFirst(t *testing.T) newTrieValue := []byte("new trie value") trie := &trieMock.TrieStub{ - GetCalled: func(key []byte) (b []byte, e error) { - return trieValue, nil + GetCalled: func(_ []byte) ([]byte, uint32, error) { + return trieValue, 0, nil }, } mdaw := state.NewTrackableDataTrie([]byte("id"), trie) @@ -122,9 +122,9 @@ func TestTrackableDataTrie_SaveKeyValueShouldSaveOnlyInDirty(t *testing.T) { UpdateCalled: func(key, value []byte) error { return nil }, - GetCalled: func(key []byte) (b []byte, e error) { + GetCalled: func(_ []byte) ([]byte, uint32, error) { assert.Fail(t, "should not have saved directly in the trie") - return nil, nil + return nil, 0, nil }, } mdaw := state.NewTrackableDataTrie(identifier, trie) diff --git a/testscommon/trie/trieStub.go b/testscommon/trie/trieStub.go index ab4ea872ca0..8349b3f0317 100644 --- a/testscommon/trie/trieStub.go +++ b/testscommon/trie/trieStub.go @@ -11,7 +11,7 @@ var errNotImplemented = errors.New("not implemented") // TrieStub - type TrieStub struct { - GetCalled func(key []byte) ([]byte, error) + GetCalled func(key []byte) ([]byte, uint32, error) UpdateCalled func(key, value []byte) error DeleteCalled func(key []byte) error RootCalled func() ([]byte, error) @@ -69,12 +69,12 @@ func (ts *TrieStub) GetAllLeavesOnChannel(leavesChannels *common.TrieIteratorCha } // Get - -func (ts *TrieStub) Get(key []byte) ([]byte, error) { +func (ts *TrieStub) Get(key []byte) ([]byte, uint32, error) { if ts.GetCalled != nil { return ts.GetCalled(key) } - return nil, errNotImplemented + return nil, 0, errNotImplemented } // Update - diff --git a/trie/depthFirstSync_test.go b/trie/depthFirstSync_test.go index b1aca5ba98b..49700e228d3 100644 --- a/trie/depthFirstSync_test.go +++ b/trie/depthFirstSync_test.go @@ -125,7 +125,7 @@ func TestDepthFirstTrieSyncer_StartSyncingNewTrieShouldWork(t *testing.T) { var val []byte for i := 0; i < numKeysValues; i++ { keyVal := hasherMock.Compute(fmt.Sprintf("%d", i)) - val, err = trie.Get(keyVal) + val, _, err = trie.Get(keyVal) require.Nil(t, err) require.Equal(t, keyVal, val) } @@ -186,7 +186,7 @@ func TestDepthFirstTrieSyncer_StartSyncingPartiallyFilledTrieShouldWork(t *testi var val []byte for i := 0; i < numKeysValues; i++ { keyVal := hasherMock.Compute(fmt.Sprintf("%d", i)) - val, err = trie.Get(keyVal) + val, _, err = trie.Get(keyVal) require.Nil(t, err) require.Equal(t, keyVal, val) } diff --git a/trie/doubleListSync_test.go b/trie/doubleListSync_test.go index ee56a9b85c1..adaf053363f 100644 --- a/trie/doubleListSync_test.go +++ b/trie/doubleListSync_test.go @@ -231,7 +231,7 @@ func TestDoubleListTrieSyncer_StartSyncingNewTrieShouldWork(t *testing.T) { var val []byte for i := 0; i < numKeysValues; i++ { keyVal := hasherMock.Compute(fmt.Sprintf("%d", i)) - val, err = trie.Get(keyVal) + val, _, err = trie.Get(keyVal) require.Nil(t, err) require.Equal(t, keyVal, val) } @@ -292,7 +292,7 @@ func TestDoubleListTrieSyncer_StartSyncingPartiallyFilledTrieShouldWork(t *testi var val []byte for i := 0; i < numKeysValues; i++ { keyVal := hasherMock.Compute(fmt.Sprintf("%d", i)) - val, err = trie.Get(keyVal) + val, _, err = trie.Get(keyVal) require.Nil(t, err) require.Equal(t, keyVal, val) } diff --git a/trie/patriciaMerkleTrie.go b/trie/patriciaMerkleTrie.go index e1b8ead0896..2eb1d77dfe9 100644 --- a/trie/patriciaMerkleTrie.go +++ b/trie/patriciaMerkleTrie.go @@ -80,22 +80,22 @@ func NewTrie( // Get starts at the root and searches for the given key. // If the key is present in the tree, it returns the corresponding value -func (tr *patriciaMerkleTrie) Get(key []byte) ([]byte, error) { +func (tr *patriciaMerkleTrie) Get(key []byte) ([]byte, uint32, error) { tr.mutOperation.Lock() defer tr.mutOperation.Unlock() if tr.root == nil { - return nil, nil + return nil, 0, nil } hexKey := keyBytesToHex(key) - val, _, err := tr.root.tryGet(hexKey, rootDepthLevel, tr.trieStorage) + val, maxDepth, err := tr.root.tryGet(hexKey, rootDepthLevel, tr.trieStorage) if err != nil { err = fmt.Errorf("trie get error: %w, for key %v", err, hex.EncodeToString(key)) - return nil, err + return nil, maxDepth, err } - return val, nil + return val, maxDepth, nil } // Update updates the value at the given key. diff --git a/trie/patriciaMerkleTrie_test.go b/trie/patriciaMerkleTrie_test.go index c41965bdf92..76fda939ec3 100644 --- a/trie/patriciaMerkleTrie_test.go +++ b/trie/patriciaMerkleTrie_test.go @@ -128,7 +128,7 @@ func TestPatriciaMerkleTree_Get(t *testing.T) { tr, val := initTrieMultipleValues(10000) for i := range val { - v, _ := tr.Get(val[i]) + v, _, _ := tr.Get(val[i]) assert.Equal(t, val[i], v) } } @@ -138,7 +138,7 @@ func TestPatriciaMerkleTree_GetEmptyTrie(t *testing.T) { tr := emptyTrie() - val, err := tr.Get([]byte("dog")) + val, _, err := tr.Get([]byte("dog")) assert.Nil(t, err) assert.Nil(t, val) } @@ -151,7 +151,7 @@ func TestPatriciaMerkleTree_Update(t *testing.T) { newVal := []byte("doge") _ = tr.Update([]byte("dog"), newVal) - val, _ := tr.Get([]byte("dog")) + val, _, _ := tr.Get([]byte("dog")) assert.Equal(t, newVal, val) } @@ -163,7 +163,7 @@ func TestPatriciaMerkleTree_UpdateEmptyVal(t *testing.T) { _ = tr.Update([]byte("doe"), []byte{}) - v, _ := tr.Get([]byte("doe")) + v, _, _ := tr.Get([]byte("doe")) assert.Equal(t, empty, v) } @@ -174,7 +174,7 @@ func TestPatriciaMerkleTree_UpdateNotExisting(t *testing.T) { _ = tr.Update([]byte("does"), []byte("this")) - v, _ := tr.Get([]byte("does")) + v, _, _ := tr.Get([]byte("does")) assert.Equal(t, []byte("this"), v) } @@ -186,7 +186,7 @@ func TestPatriciaMerkleTree_Delete(t *testing.T) { _ = tr.Delete([]byte("doe")) - v, _ := tr.Get([]byte("doe")) + v, _, _ := tr.Get([]byte("doe")) assert.Equal(t, empty, v) } @@ -248,7 +248,7 @@ func TestPatriciaMerkleTrie_UpdateAndGetConcurrently(t *testing.T) { err := tr.Update([]byte(strconv.Itoa(index)), []byte(strconv.Itoa(index))) assert.Nil(t, err) - val, err := tr.Get([]byte(strconv.Itoa(index))) + val, _, err := tr.Get([]byte(strconv.Itoa(index))) assert.Nil(t, err) assert.Equal(t, []byte(strconv.Itoa(index)), val) @@ -322,7 +322,7 @@ func TestPatriciaMerkleTree_GetAfterCommit(t *testing.T) { err := tr.Commit() assert.Nil(t, err) - val, err := tr.Get([]byte("dog")) + val, _, err := tr.Get([]byte("dog")) assert.Equal(t, []byte("puppy"), val) assert.Nil(t, err) } @@ -956,6 +956,21 @@ func TestPatriciaMerkleTrie_GetOldRoot(t *testing.T) { assert.Equal(t, expecterOldRoot, tr.GetOldRoot()) } +func TestPatriciaMerkleTree_GetValueReturnsTrieDepth(t *testing.T) { + t.Parallel() + + tr := initTrie() + _, depth, err := tr.Get([]byte("doe")) + assert.Nil(t, err) + assert.Equal(t, uint32(1), depth) + _, depth, err = tr.Get([]byte("dog")) + assert.Nil(t, err) + assert.Equal(t, uint32(3), depth) + _, depth, err = tr.Get([]byte("ddog")) + assert.Nil(t, err) + assert.Equal(t, uint32(3), depth) +} + func BenchmarkPatriciaMerkleTree_Insert(b *testing.B) { tr := emptyTrie() hsh := keccak.NewKeccak() @@ -1053,7 +1068,7 @@ func BenchmarkPatriciaMerkleTree_Get(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { - _, _ = tr.Get(values[i%nrValuesInTrie]) + _, _, _ = tr.Get(values[i%nrValuesInTrie]) } } @@ -1072,7 +1087,7 @@ func BenchmarkPatriciaMerkleTree_GetCollapsedTrie(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { - _, _ = tr.Get(values[i%nrValuesInTrie]) + _, _, _ = tr.Get(values[i%nrValuesInTrie]) } } From 408ce14c3778a6a072a945adbea99d7bb36f435e Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 18 Oct 2022 15:27:53 +0300 Subject: [PATCH 029/110] added NumTrieNodesReceived on PubKeyHeartbeat to served it through api small cleanup + tests fix --- common/statistics/disabled/netStatistics.go | 5 ++++ epochStart/bootstrap/common.go | 5 +--- epochStart/bootstrap/process.go | 12 +++++---- epochStart/bootstrap/process_test.go | 16 ++--------- epochStart/mock/statusCoreComponentsMock.go | 18 ------------- factory/bootstrap/bootstrapComponents.go | 1 + heartbeat/data/heartbeatdata.go | 27 ++++++++++--------- heartbeat/monitor/monitor.go | 25 ++++++++--------- heartbeat/monitor/monitor_test.go | 19 ++++++++----- heartbeat/sender/sender.go | 13 ++++----- .../bootstrapComponents_test.go | 6 ++++- .../consensusComponents_test.go | 2 +- .../dataComponents/dataComponents_test.go | 6 ++++- .../processComponents_test.go | 2 +- .../stateComponents/stateComponents_test.go | 6 ++++- .../statusComponents/statusComponents_test.go | 2 +- node/nodeRunner.go | 20 +++++++------- process/interface.go | 18 ------------- testscommon/components/components.go | 12 +++++---- 19 files changed, 99 insertions(+), 116 deletions(-) delete mode 100644 epochStart/mock/statusCoreComponentsMock.go diff --git a/common/statistics/disabled/netStatistics.go b/common/statistics/disabled/netStatistics.go index ce1dc94a6f5..04b61a93a3b 100644 --- a/common/statistics/disabled/netStatistics.go +++ b/common/statistics/disabled/netStatistics.go @@ -24,6 +24,11 @@ func (stats *netStatistics) TotalReceivedInCurrentEpoch() string { func (stats *netStatistics) EpochConfirmed(_ uint32, _ uint64) { } +// Close returns nil +func (stats *netStatistics) Close() error { + return nil +} + // IsInterfaceNil returns true if underlying object is nil func (stats *netStatistics) IsInterfaceNil() bool { return stats == nil diff --git a/epochStart/bootstrap/common.go b/epochStart/bootstrap/common.go index 90d0b55d5be..2deb4cd019e 100644 --- a/epochStart/bootstrap/common.go +++ b/epochStart/bootstrap/common.go @@ -25,9 +25,6 @@ func checkArguments(args ArgsEpochStartBootstrap) error { if check.IfNil(args.CryptoComponentsHolder) { return fmt.Errorf("%s: %w", baseErrorMessage, epochStart.ErrNilCryptoComponentsHolder) } - if check.IfNil(args.StatusCoreComponentsHolder) { - return fmt.Errorf("%s: %w", baseErrorMessage, epochStart.ErrNilStatusCoreComponentsHolder) - } if check.IfNil(args.CryptoComponentsHolder.PublicKey()) { return fmt.Errorf("%s: %w", baseErrorMessage, epochStart.ErrNilPubKey) } @@ -55,7 +52,7 @@ func checkArguments(args ArgsEpochStartBootstrap) error { if check.IfNil(args.CoreComponentsHolder.PathHandler()) { return fmt.Errorf("%s: %w", baseErrorMessage, epochStart.ErrNilPathManager) } - if check.IfNil(args.StatusCoreComponentsHolder.TrieSyncStatistics()) { + if check.IfNil(args.TrieSyncStatisticsProvider) { return fmt.Errorf("%s: %w", baseErrorMessage, epochStart.ErrNilTrieSyncStatistics) } if args.GenesisNodesConfig == nil { diff --git a/epochStart/bootstrap/process.go b/epochStart/bootstrap/process.go index 6baa78b6d4e..914bc634670 100644 --- a/epochStart/bootstrap/process.go +++ b/epochStart/bootstrap/process.go @@ -45,6 +45,7 @@ import ( storageFactory "github.com/ElrondNetwork/elrond-go/storage/factory" "github.com/ElrondNetwork/elrond-go/storage/storageunit" "github.com/ElrondNetwork/elrond-go/trie/factory" + "github.com/ElrondNetwork/elrond-go/trie/statistics" "github.com/ElrondNetwork/elrond-go/trie/storageMarker" "github.com/ElrondNetwork/elrond-go/update" updateSync "github.com/ElrondNetwork/elrond-go/update/sync" @@ -89,7 +90,6 @@ type epochStartBootstrap struct { destinationShardAsObserver uint32 coreComponentsHolder process.CoreComponentsHolder cryptoComponentsHolder process.CryptoComponentsHolder - statusCoreComponentsHolder process.StatusCoreComponentsHolder messenger Messenger generalConfig config.Config prefsConfig config.PreferencesConfig @@ -112,6 +112,7 @@ type epochStartBootstrap struct { trieSyncerVersion int checkNodesOnDisk bool bootstrapHeartbeatSender update.Closer + trieSyncStatisticsProvider common.SizeSyncStatisticsHandler // created components requestHandler process.RequestHandler @@ -156,7 +157,6 @@ type baseDataInStorage struct { type ArgsEpochStartBootstrap struct { CoreComponentsHolder process.CoreComponentsHolder CryptoComponentsHolder process.CryptoComponentsHolder - StatusCoreComponentsHolder process.StatusCoreComponentsHolder DestinationShardAsObserver uint32 Messenger Messenger GeneralConfig config.Config @@ -175,6 +175,7 @@ type ArgsEpochStartBootstrap struct { HeaderIntegrityVerifier process.HeaderIntegrityVerifier DataSyncerCreator types.ScheduledDataSyncerCreator ScheduledSCRsStorer storage.Storer + TrieSyncStatisticsProvider common.SizeSyncStatisticsHandler } type dataToSync struct { @@ -194,7 +195,6 @@ func NewEpochStartBootstrap(args ArgsEpochStartBootstrap) (*epochStartBootstrap, epochStartProvider := &epochStartBootstrap{ coreComponentsHolder: args.CoreComponentsHolder, cryptoComponentsHolder: args.CryptoComponentsHolder, - statusCoreComponentsHolder: args.StatusCoreComponentsHolder, messenger: args.Messenger, generalConfig: args.GeneralConfig, prefsConfig: args.PrefsConfig, @@ -220,6 +220,7 @@ func NewEpochStartBootstrap(args ArgsEpochStartBootstrap) (*epochStartBootstrap, dataSyncerFactory: args.DataSyncerCreator, storerScheduledSCRs: args.ScheduledSCRsStorer, shardCoordinator: args.GenesisShardCoordinator, + trieSyncStatisticsProvider: args.TrieSyncStatisticsProvider, } whiteListCache, err := storageunit.NewCache(storageFactory.GetCacherFromConfig(epochStartProvider.generalConfig.WhiteListPool)) @@ -1060,7 +1061,7 @@ func (e *epochStartBootstrap) syncUserAccountsState(rootHash []byte) error { TrieSyncerVersion: e.trieSyncerVersion, CheckNodesOnDisk: e.checkNodesOnDisk, StorageMarker: storageMarker.NewTrieStorageMarker(), - SyncStatisticsHandler: e.statusCoreComponentsHolder.TrieSyncStatistics(), + SyncStatisticsHandler: e.trieSyncStatisticsProvider, }, ShardId: e.shardCoordinator.SelfId(), Throttler: thr, @@ -1128,6 +1129,7 @@ func (e *epochStartBootstrap) syncValidatorAccountsState(rootHash []byte) error TrieSyncerVersion: e.trieSyncerVersion, CheckNodesOnDisk: e.checkNodesOnDisk, StorageMarker: storageMarker.NewTrieStorageMarker(), + SyncStatisticsHandler: statistics.NewTrieSyncStatistics(), }, } accountsDBSyncer, err := syncer.NewValidatorAccountsSyncer(argsValidatorAccountsSyncer) @@ -1260,7 +1262,7 @@ func (e *epochStartBootstrap) createHeartbeatSender() error { PrivateKey: privateKey, RedundancyHandler: bootstrapRedundancy, PeerTypeProvider: peer.NewBootstrapPeerTypeProvider(), - TrieSyncStatisticsProvider: e.statusCoreComponentsHolder.TrieSyncStatistics(), + TrieSyncStatisticsProvider: e.trieSyncStatisticsProvider, } e.bootstrapHeartbeatSender, err = sender.NewBootstrapSender(argsHeartbeatSender) diff --git a/epochStart/bootstrap/process_test.go b/epochStart/bootstrap/process_test.go index 41b04aa527c..6a7888cf8d9 100644 --- a/epochStart/bootstrap/process_test.go +++ b/epochStart/bootstrap/process_test.go @@ -102,9 +102,6 @@ func createMockEpochStartBootstrapArgs( ScheduledSCRsStorer: genericMocks.NewStorerMock(), CoreComponentsHolder: coreMock, CryptoComponentsHolder: cryptoMock, - StatusCoreComponentsHolder: &mock.StatusCoreComponentsMock{ - TrieSyncStatisticsField: &testscommon.SizeSyncStatisticsHandlerStub{}, - }, Messenger: &p2pmocks.MessengerStub{ ConnectedPeersCalled: func() []core.PeerID { return []core.PeerID{"peer0", "peer1", "peer2", "peer3", "peer4", "peer5"} @@ -231,6 +228,7 @@ func createMockEpochStartBootstrapArgs( FlagsConfig: config.ContextFlagsConfig{ ForceStartFromNetwork: false, }, + TrieSyncStatisticsProvider: &testscommon.SizeSyncStatisticsHandlerStub{}, } } @@ -287,16 +285,6 @@ func TestNewEpochStartBootstrap_NilArgsChecks(t *testing.T) { require.Nil(t, epochStartProvider) require.True(t, errors.Is(err, epochStart.ErrNilCryptoComponentsHolder)) }) - t.Run("nil statusCoreComponents", func(t *testing.T) { - t.Parallel() - - args := createMockEpochStartBootstrapArgs(createComponentsForEpochStart()) - args.StatusCoreComponentsHolder = nil - - epochStartProvider, err := NewEpochStartBootstrap(args) - require.Nil(t, epochStartProvider) - require.True(t, errors.Is(err, epochStart.ErrNilStatusCoreComponentsHolder)) - }) t.Run("nil pubKey", func(t *testing.T) { t.Parallel() @@ -431,7 +419,7 @@ func TestNewEpochStartBootstrap_NilArgsChecks(t *testing.T) { t.Parallel() args := createMockEpochStartBootstrapArgs(createComponentsForEpochStart()) - args.StatusCoreComponentsHolder = &mock.StatusCoreComponentsMock{} + args.TrieSyncStatisticsProvider = nil epochStartProvider, err := NewEpochStartBootstrap(args) require.Nil(t, epochStartProvider) diff --git a/epochStart/mock/statusCoreComponentsMock.go b/epochStart/mock/statusCoreComponentsMock.go deleted file mode 100644 index 29e9f30248a..00000000000 --- a/epochStart/mock/statusCoreComponentsMock.go +++ /dev/null @@ -1,18 +0,0 @@ -package mock - -import "github.com/ElrondNetwork/elrond-go/process" - -// StatusCoreComponentsMock - -type StatusCoreComponentsMock struct { - TrieSyncStatisticsField process.TrieSyncStatisticsProvider -} - -// TrieSyncStatistics - -func (sccm *StatusCoreComponentsMock) TrieSyncStatistics() process.TrieSyncStatisticsProvider { - return sccm.TrieSyncStatisticsField -} - -// IsInterfaceNil - -func (sccm *StatusCoreComponentsMock) IsInterfaceNil() bool { - return sccm == nil -} diff --git a/factory/bootstrap/bootstrapComponents.go b/factory/bootstrap/bootstrapComponents.go index d738cd85757..2a9f1db97fd 100644 --- a/factory/bootstrap/bootstrapComponents.go +++ b/factory/bootstrap/bootstrapComponents.go @@ -189,6 +189,7 @@ func (bcf *bootstrapComponentsFactory) Create() (*bootstrapComponents, error) { HeaderIntegrityVerifier: headerIntegrityVerifier, DataSyncerCreator: dataSyncerFactory, ScheduledSCRsStorer: nil, // will be updated after sync from network + TrieSyncStatisticsProvider: bcf.statusCoreComponents.TrieSyncStatistics(), } var epochStartBootstrapper factory.EpochStartBootstrapper diff --git a/heartbeat/data/heartbeatdata.go b/heartbeat/data/heartbeatdata.go index 537ce26480e..eb5a7cdf078 100644 --- a/heartbeat/data/heartbeatdata.go +++ b/heartbeat/data/heartbeatdata.go @@ -9,19 +9,20 @@ import ( // PubKeyHeartbeat returns the heartbeat status for a public key type PubKeyHeartbeat struct { - PublicKey string `json:"publicKey"` - TimeStamp time.Time `json:"timeStamp"` - IsActive bool `json:"isActive"` - ReceivedShardID uint32 `json:"receivedShardID"` - ComputedShardID uint32 `json:"computedShardID"` - VersionNumber string `json:"versionNumber"` - NodeDisplayName string `json:"nodeDisplayName"` - Identity string `json:"identity"` - PeerType string `json:"peerType"` - Nonce uint64 `json:"nonce"` - NumInstances uint64 `json:"numInstances"` - PeerSubType uint32 `json:"peerSubType"` - PidString string `json:"pidString"` + PublicKey string `json:"publicKey"` + TimeStamp time.Time `json:"timeStamp"` + IsActive bool `json:"isActive"` + ReceivedShardID uint32 `json:"receivedShardID"` + ComputedShardID uint32 `json:"computedShardID"` + VersionNumber string `json:"versionNumber"` + NodeDisplayName string `json:"nodeDisplayName"` + Identity string `json:"identity"` + PeerType string `json:"peerType"` + Nonce uint64 `json:"nonce"` + NumInstances uint64 `json:"numInstances"` + PeerSubType uint32 `json:"peerSubType"` + PidString string `json:"pidString"` + NumTrieNodesReceived uint64 `json:"numTrieNodesReceived,omitempty"` } // Duration is a wrapper of the original Duration struct diff --git a/heartbeat/monitor/monitor.go b/heartbeat/monitor/monitor.go index 8a47c6496fe..6ea98280330 100644 --- a/heartbeat/monitor/monitor.go +++ b/heartbeat/monitor/monitor.go @@ -163,18 +163,19 @@ func (monitor *heartbeatV2Monitor) parseMessage(pid core.PeerID, message interfa numInstances[pk]++ pubKeyHeartbeat = data.PubKeyHeartbeat{ - PublicKey: pk, - TimeStamp: messageTime, - IsActive: monitor.isActive(messageAge), - ReceivedShardID: monitor.shardId, - ComputedShardID: peerInfo.ShardID, - VersionNumber: heartbeatV2.GetVersionNumber(), - NodeDisplayName: heartbeatV2.GetNodeDisplayName(), - Identity: heartbeatV2.GetIdentity(), - PeerType: stringType, - Nonce: heartbeatV2.GetNonce(), - PeerSubType: heartbeatV2.GetPeerSubType(), - PidString: pid.Pretty(), + PublicKey: pk, + TimeStamp: messageTime, + IsActive: monitor.isActive(messageAge), + ReceivedShardID: monitor.shardId, + ComputedShardID: peerInfo.ShardID, + VersionNumber: heartbeatV2.GetVersionNumber(), + NodeDisplayName: heartbeatV2.GetNodeDisplayName(), + Identity: heartbeatV2.GetIdentity(), + PeerType: stringType, + Nonce: heartbeatV2.GetNonce(), + PeerSubType: heartbeatV2.GetPeerSubType(), + PidString: pid.Pretty(), + NumTrieNodesReceived: payload.NumTrieNodesSynced, } return pubKeyHeartbeat, nil diff --git a/heartbeat/monitor/monitor_test.go b/heartbeat/monitor/monitor_test.go index 7299cd2b15b..ace363b47a9 100644 --- a/heartbeat/monitor/monitor_test.go +++ b/heartbeat/monitor/monitor_test.go @@ -9,6 +9,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" + "github.com/ElrondNetwork/elrond-go-core/marshal" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/heartbeat" "github.com/ElrondNetwork/elrond-go/heartbeat/data" @@ -43,7 +44,8 @@ func createHeartbeatMessage(active bool) *heartbeat.HeartbeatV2 { } payload := heartbeat.Payload{ - Timestamp: messageTimestamp, + Timestamp: messageTimestamp, + NumTrieNodesSynced: 150, } marshaller := testscommon.MarshalizerMock{} @@ -219,7 +221,7 @@ func TestHeartbeatV2Monitor_parseMessage(t *testing.T) { } hb, err := monitor.parseMessage(providedPid, message, numInstances) assert.Nil(t, err) - checkResults(t, *message, hb, true, providedMap, 0) + checkResults(t, args.Marshaller, *message, hb, true, providedMap, 0) assert.Equal(t, 0, len(providedMap)) pkFromMsg := args.PubKeyConverter.Encode(providedPkBytesFromMessage) entries, ok := numInstances[pkFromMsg] @@ -260,7 +262,7 @@ func TestHeartbeatV2Monitor_parseMessage(t *testing.T) { } hb, err := monitor.parseMessage(providedPid, message, numInstances) assert.Nil(t, err) - checkResults(t, *message, hb, true, providedMap, 0) + checkResults(t, args.Marshaller, *message, hb, true, providedMap, 0) assert.Equal(t, 0, len(providedMap)) pk := args.PubKeyConverter.Encode(providedPkBytes) entries, ok := numInstances[pk] @@ -349,7 +351,7 @@ func TestHeartbeatV2Monitor_GetHeartbeats(t *testing.T) { assert.Equal(t, len(providedStatuses)-1, len(heartbeats)) assert.Equal(t, len(providedStatuses)-1, args.Cache.Len()) // faulty message was removed from cache for i := 0; i < len(heartbeats); i++ { - checkResults(t, *providedMessages[i], heartbeats[i], providedStatuses[i], providedPids, 1) + checkResults(t, args.Marshaller, *providedMessages[i], heartbeats[i], providedStatuses[i], providedPids, 1) } assert.Equal(t, 1, len(providedPids)) // one message is skipped }) @@ -396,13 +398,13 @@ func TestHeartbeatV2Monitor_GetHeartbeats(t *testing.T) { if i > 0 { numInstances = 2 } - checkResults(t, *providedMessages[i], heartbeats[i], providedStatuses[i], providedPids, numInstances) + checkResults(t, args.Marshaller, *providedMessages[i], heartbeats[i], providedStatuses[i], providedPids, numInstances) } assert.Equal(t, 0, len(providedPids)) }) } -func checkResults(t *testing.T, message heartbeat.HeartbeatV2, hb data.PubKeyHeartbeat, isActive bool, providedPids map[string]struct{}, numInstances uint64) { +func checkResults(t *testing.T, marshaller marshal.Marshalizer, message heartbeat.HeartbeatV2, hb data.PubKeyHeartbeat, isActive bool, providedPids map[string]struct{}, numInstances uint64) { assert.Equal(t, isActive, hb.IsActive) assert.Equal(t, message.VersionNumber, hb.VersionNumber) assert.Equal(t, message.NodeDisplayName, hb.NodeDisplayName) @@ -413,4 +415,9 @@ func checkResults(t *testing.T, message heartbeat.HeartbeatV2, hb data.PubKeyHea _, ok := providedPids[hb.PidString] assert.True(t, ok) delete(providedPids, hb.PidString) + + payload := &heartbeat.Payload{} + err := marshaller.Unmarshal(payload, message.Payload) + assert.Nil(t, err) + assert.Equal(t, payload.NumTrieNodesSynced, hb.NumTrieNodesReceived) } diff --git a/heartbeat/sender/sender.go b/heartbeat/sender/sender.go index 74c95f6129a..61c6a2963aa 100644 --- a/heartbeat/sender/sender.go +++ b/heartbeat/sender/sender.go @@ -134,12 +134,13 @@ func checkSenderArgs(args ArgSender) error { privKey: args.PrivateKey, redundancyHandler: args.RedundancyHandler, }, - versionNumber: args.VersionNumber, - nodeDisplayName: args.NodeDisplayName, - identity: args.Identity, - peerSubType: args.PeerSubType, - currentBlockProvider: args.CurrentBlockProvider, - peerTypeProvider: args.PeerTypeProvider, + versionNumber: args.VersionNumber, + nodeDisplayName: args.NodeDisplayName, + identity: args.Identity, + peerSubType: args.PeerSubType, + currentBlockProvider: args.CurrentBlockProvider, + peerTypeProvider: args.PeerTypeProvider, + trieSyncStatisticsProvider: disabled.NewTrieSyncStatisticsProvider(), } return checkHeartbeatSenderArgs(hbsArgs) } diff --git a/integrationTests/factory/bootstrapComponents/bootstrapComponents_test.go b/integrationTests/factory/bootstrapComponents/bootstrapComponents_test.go index 3a41ba49585..aa7f36232f6 100644 --- a/integrationTests/factory/bootstrapComponents/bootstrapComponents_test.go +++ b/integrationTests/factory/bootstrapComponents/bootstrapComponents_test.go @@ -29,13 +29,15 @@ func TestBootstrapComponents_Create_Close_ShouldWork(t *testing.T) { chanStopNodeProcess := make(chan endProcess.ArgEndProcess) nr, err := node.NewNodeRunner(configs) require.Nil(t, err) + managedStatusCoreComponents, err := nr.CreateManagedStatusCoreComponents() + require.Nil(t, err) managedCoreComponents, err := nr.CreateManagedCoreComponents(chanStopNodeProcess) require.Nil(t, err) managedCryptoComponents, err := nr.CreateManagedCryptoComponents(managedCoreComponents) require.Nil(t, err) managedNetworkComponents, err := nr.CreateManagedNetworkComponents(managedCoreComponents) require.Nil(t, err) - managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedCoreComponents, managedCryptoComponents, managedNetworkComponents) + managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedStatusCoreComponents, managedCoreComponents, managedCryptoComponents, managedNetworkComponents) require.Nil(t, err) require.NotNil(t, managedBootstrapComponents) @@ -49,6 +51,8 @@ func TestBootstrapComponents_Create_Close_ShouldWork(t *testing.T) { require.Nil(t, err) err = managedCoreComponents.Close() require.Nil(t, err) + err = managedStatusCoreComponents.Close() + require.Nil(t, err) time.Sleep(5 * time.Second) diff --git a/integrationTests/factory/consensusComponents/consensusComponents_test.go b/integrationTests/factory/consensusComponents/consensusComponents_test.go index 45e7cf5b50b..8f163c8c53a 100644 --- a/integrationTests/factory/consensusComponents/consensusComponents_test.go +++ b/integrationTests/factory/consensusComponents/consensusComponents_test.go @@ -42,7 +42,7 @@ func TestConsensusComponents_Close_ShouldWork(t *testing.T) { require.Nil(t, err) managedNetworkComponents, err := nr.CreateManagedNetworkComponents(managedCoreComponents) require.Nil(t, err) - managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedCoreComponents, managedCryptoComponents, managedNetworkComponents) + managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedStatusCoreComponents, managedCoreComponents, managedCryptoComponents, managedNetworkComponents) require.Nil(t, err) managedDataComponents, err := nr.CreateManagedDataComponents(managedCoreComponents, managedBootstrapComponents) require.Nil(t, err) diff --git a/integrationTests/factory/dataComponents/dataComponents_test.go b/integrationTests/factory/dataComponents/dataComponents_test.go index 4db17ae017e..3a1ac0b169b 100644 --- a/integrationTests/factory/dataComponents/dataComponents_test.go +++ b/integrationTests/factory/dataComponents/dataComponents_test.go @@ -25,13 +25,15 @@ func TestDataComponents_Create_Close_ShouldWork(t *testing.T) { nr, err := node.NewNodeRunner(configs) require.Nil(t, err) + managedStatusCoreComponents, err := nr.CreateManagedStatusCoreComponents() + require.Nil(t, err) managedCoreComponents, err := nr.CreateManagedCoreComponents(chanStopNodeProcess) require.Nil(t, err) managedCryptoComponents, err := nr.CreateManagedCryptoComponents(managedCoreComponents) require.Nil(t, err) managedNetworkComponents, err := nr.CreateManagedNetworkComponents(managedCoreComponents) require.Nil(t, err) - managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedCoreComponents, managedCryptoComponents, managedNetworkComponents) + managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedStatusCoreComponents, managedCoreComponents, managedCryptoComponents, managedNetworkComponents) require.Nil(t, err) managedDataComponents, err := nr.CreateManagedDataComponents(managedCoreComponents, managedBootstrapComponents) require.Nil(t, err) @@ -49,6 +51,8 @@ func TestDataComponents_Create_Close_ShouldWork(t *testing.T) { require.Nil(t, err) err = managedCoreComponents.Close() require.Nil(t, err) + err = managedStatusCoreComponents.Close() + require.Nil(t, err) time.Sleep(5 * time.Second) diff --git a/integrationTests/factory/processComponents/processComponents_test.go b/integrationTests/factory/processComponents/processComponents_test.go index 0d1d1ef0b7b..b9f35918c17 100644 --- a/integrationTests/factory/processComponents/processComponents_test.go +++ b/integrationTests/factory/processComponents/processComponents_test.go @@ -43,7 +43,7 @@ func TestProcessComponents_Close_ShouldWork(t *testing.T) { require.Nil(t, err) managedNetworkComponents, err := nr.CreateManagedNetworkComponents(managedCoreComponents) require.Nil(t, err) - managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedCoreComponents, managedCryptoComponents, managedNetworkComponents) + managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedStatusCoreComponents, managedCoreComponents, managedCryptoComponents, managedNetworkComponents) require.Nil(t, err) managedDataComponents, err := nr.CreateManagedDataComponents(managedCoreComponents, managedBootstrapComponents) require.Nil(t, err) diff --git a/integrationTests/factory/stateComponents/stateComponents_test.go b/integrationTests/factory/stateComponents/stateComponents_test.go index 5adc8f04ac0..6b5865749e6 100644 --- a/integrationTests/factory/stateComponents/stateComponents_test.go +++ b/integrationTests/factory/stateComponents/stateComponents_test.go @@ -29,13 +29,15 @@ func TestStateComponents_Create_Close_ShouldWork(t *testing.T) { nr, err := node.NewNodeRunner(configs) require.Nil(t, err) + managedStatusCoreComponents, err := nr.CreateManagedStatusCoreComponents() + require.Nil(t, err) managedCoreComponents, err := nr.CreateManagedCoreComponents(chanStopNodeProcess) require.Nil(t, err) managedCryptoComponents, err := nr.CreateManagedCryptoComponents(managedCoreComponents) require.Nil(t, err) managedNetworkComponents, err := nr.CreateManagedNetworkComponents(managedCoreComponents) require.Nil(t, err) - managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedCoreComponents, managedCryptoComponents, managedNetworkComponents) + managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedStatusCoreComponents, managedCoreComponents, managedCryptoComponents, managedNetworkComponents) require.Nil(t, err) managedDataComponents, err := nr.CreateManagedDataComponents(managedCoreComponents, managedBootstrapComponents) require.Nil(t, err) @@ -57,6 +59,8 @@ func TestStateComponents_Create_Close_ShouldWork(t *testing.T) { require.Nil(t, err) err = managedCoreComponents.Close() require.Nil(t, err) + err = managedStatusCoreComponents.Close() + require.Nil(t, err) time.Sleep(5 * time.Second) diff --git a/integrationTests/factory/statusComponents/statusComponents_test.go b/integrationTests/factory/statusComponents/statusComponents_test.go index e7a49e3b2da..4c789d25ac7 100644 --- a/integrationTests/factory/statusComponents/statusComponents_test.go +++ b/integrationTests/factory/statusComponents/statusComponents_test.go @@ -43,7 +43,7 @@ func TestStatusComponents_Create_Close_ShouldWork(t *testing.T) { require.Nil(t, err) managedNetworkComponents, err := nr.CreateManagedNetworkComponents(managedCoreComponents) require.Nil(t, err) - managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedCoreComponents, managedCryptoComponents, managedNetworkComponents) + managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedStatusCoreComponents, managedCoreComponents, managedCryptoComponents, managedNetworkComponents) require.Nil(t, err) managedDataComponents, err := nr.CreateManagedDataComponents(managedCoreComponents, managedBootstrapComponents) require.Nil(t, err) diff --git a/node/nodeRunner.go b/node/nodeRunner.go index f45d4f1fdc4..3c1d2c02828 100644 --- a/node/nodeRunner.go +++ b/node/nodeRunner.go @@ -304,7 +304,7 @@ func (nr *nodeRunner) executeOneComponentCreationCycle( } log.Debug("creating bootstrap components") - managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedCoreComponents, managedCryptoComponents, managedNetworkComponents) + managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedStatusCoreComponents, managedCoreComponents, managedCryptoComponents, managedNetworkComponents) if err != nil { return true, err } @@ -1354,20 +1354,22 @@ func (nr *nodeRunner) CreateManagedStateComponents( // CreateManagedBootstrapComponents is the managed bootstrap components factory func (nr *nodeRunner) CreateManagedBootstrapComponents( + statusCoreComponents mainFactory.StatusCoreComponentsHolder, coreComponents mainFactory.CoreComponentsHolder, cryptoComponents mainFactory.CryptoComponentsHolder, networkComponents mainFactory.NetworkComponentsHolder, ) (mainFactory.BootstrapComponentsHandler, error) { bootstrapComponentsFactoryArgs := bootstrapComp.BootstrapComponentsFactoryArgs{ - Config: *nr.configs.GeneralConfig, - PrefConfig: *nr.configs.PreferencesConfig, - ImportDbConfig: *nr.configs.ImportDbConfig, - FlagsConfig: *nr.configs.FlagsConfig, - WorkingDir: nr.configs.FlagsConfig.WorkingDir, - CoreComponents: coreComponents, - CryptoComponents: cryptoComponents, - NetworkComponents: networkComponents, + Config: *nr.configs.GeneralConfig, + PrefConfig: *nr.configs.PreferencesConfig, + ImportDbConfig: *nr.configs.ImportDbConfig, + FlagsConfig: *nr.configs.FlagsConfig, + WorkingDir: nr.configs.FlagsConfig.WorkingDir, + CoreComponents: coreComponents, + CryptoComponents: cryptoComponents, + NetworkComponents: networkComponents, + StatusCoreComponents: statusCoreComponents, } bootstrapComponentsFactory, err := bootstrapComp.NewBootstrapComponentsFactory(bootstrapComponentsFactoryArgs) diff --git a/process/interface.go b/process/interface.go index f1b4770297c..d75a002995b 100644 --- a/process/interface.go +++ b/process/interface.go @@ -1147,24 +1147,6 @@ type CryptoComponentsHolder interface { IsInterfaceNil() bool } -// TrieSyncStatisticsProvider is able to provide trie sync statistics -type TrieSyncStatisticsProvider interface { - data.SyncStatisticsHandler - AddNumBytesReceived(bytes uint64) - NumBytesReceived() uint64 - NumTries() int - AddProcessingTime(duration time.Duration) - IncrementIteration() - ProcessingTime() time.Duration - NumIterations() int -} - -// StatusCoreComponentsHolder holds the status core components -type StatusCoreComponentsHolder interface { - TrieSyncStatistics() TrieSyncStatisticsProvider - IsInterfaceNil() bool -} - // NumConnectedPeersProvider defines the actions that a component that provides the number of connected peers should do type NumConnectedPeersProvider interface { ConnectedPeers() []core.PeerID diff --git a/testscommon/components/components.go b/testscommon/components/components.go index 9bebd47317a..66d9dc9917b 100644 --- a/testscommon/components/components.go +++ b/testscommon/components/components.go @@ -423,12 +423,14 @@ func GetBootStrapFactoryArgs() bootstrapComp.BootstrapComponentsFactoryArgs { coreComponents := GetCoreComponents() networkComponents := GetNetworkComponents() cryptoComponents := GetCryptoComponents(coreComponents) + statusCoreComponents := GetStatusCoreComponents() return bootstrapComp.BootstrapComponentsFactoryArgs{ - Config: testscommon.GetGeneralConfig(), - WorkingDir: "home", - CoreComponents: coreComponents, - CryptoComponents: cryptoComponents, - NetworkComponents: networkComponents, + Config: testscommon.GetGeneralConfig(), + WorkingDir: "home", + CoreComponents: coreComponents, + CryptoComponents: cryptoComponents, + NetworkComponents: networkComponents, + StatusCoreComponents: statusCoreComponents, PrefConfig: config.Preferences{ Preferences: config.PreferencesConfig{ DestinationShardAsObserver: "0", From f29449e0a9a60fe5e6995f726f755f11ea90d01b Mon Sep 17 00:00:00 2001 From: BeniaminDrasovean Date: Tue, 18 Oct 2022 17:04:53 +0300 Subject: [PATCH 030/110] return trie depth from RetrieveValue() --- epochStart/metachain/baseRewards.go | 2 +- epochStart/metachain/baseRewards_test.go | 6 ++--- epochStart/metachain/systemSCs_test.go | 8 +++---- genesis/mock/userAccountMock.go | 4 ++-- go.mod | 8 +++---- go.sum | 16 +++++++------- .../multiShard/relayedTx/relayedTx_test.go | 2 +- .../polynetworkbridge/bridge_test.go | 2 +- .../validatorToDelegation_test.go | 4 ++-- .../state/stateTrie/stateTrie_test.go | 16 +++++++------- .../mandosConverter/mandosConverterUtils.go | 4 ++-- .../esdt/localFuncs/esdtLocalFunsSC_test.go | 2 +- .../vm/esdt/process/esdtProcess_test.go | 8 +++---- integrationTests/vm/testInitializer.go | 4 ++-- node/node.go | 4 ++-- node/node_test.go | 4 ++-- process/rewardTransaction/process.go | 2 +- process/rewardTransaction/process_test.go | 4 ++-- process/scToProtocol/stakingToPeer.go | 2 +- process/smartContract/hooks/blockChainHook.go | 4 ++-- .../hooks/blockChainHook_test.go | 4 ++-- state/accountsDB_test.go | 6 ++--- state/baseAccount.go | 4 ++-- state/interface.go | 4 ++-- state/trackableDataTrie.go | 13 ++++++----- state/trackableDataTrie_test.go | 22 ++++++++++++------- testscommon/state/accountWrapperMock.go | 2 +- testscommon/state/userAccountStub.go | 6 ++--- testscommon/trie/dataTrieTrackerStub.go | 6 ++--- 29 files changed, 90 insertions(+), 83 deletions(-) diff --git a/epochStart/metachain/baseRewards.go b/epochStart/metachain/baseRewards.go index 7c1a18795bb..6c94e466758 100644 --- a/epochStart/metachain/baseRewards.go +++ b/epochStart/metachain/baseRewards.go @@ -331,7 +331,7 @@ func (brc *baseRewardsCreator) isSystemDelegationSC(address []byte) bool { return false } - val, err := userAcc.RetrieveValue([]byte(core.DelegationSystemSCKey)) + val, _, err := userAcc.RetrieveValue([]byte(core.DelegationSystemSCKey)) if err != nil { return false } diff --git a/epochStart/metachain/baseRewards_test.go b/epochStart/metachain/baseRewards_test.go index 15ce0e90d4e..3e17f47f82b 100644 --- a/epochStart/metachain/baseRewards_test.go +++ b/epochStart/metachain/baseRewards_test.go @@ -855,12 +855,12 @@ func TestBaseRewardsCreator_isSystemDelegationSCTrue(t *testing.T) { args.UserAccountsDB = &stateMock.AccountsStub{ GetExistingAccountCalled: func(address []byte) (vmcommon.AccountHandler, error) { return &stateMock.UserAccountStub{ - RetrieveValueCalled: func(key []byte) ([]byte, error) { + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { if bytes.Equal(key, []byte("delegation")) { - return []byte("value"), nil + return []byte("value"), 0, nil } - return nil, fmt.Errorf("error") + return nil, 0, fmt.Errorf("error") }, }, nil }, diff --git a/epochStart/metachain/systemSCs_test.go b/epochStart/metachain/systemSCs_test.go index 7f4097ac4f0..41cfbc9687a 100644 --- a/epochStart/metachain/systemSCs_test.go +++ b/epochStart/metachain/systemSCs_test.go @@ -265,7 +265,7 @@ func checkNodesStatusInSystemSCDataTrie(t *testing.T, nodes []*state.ValidatorIn systemScAccount, ok := account.(state.UserAccountHandler) require.True(t, ok) for _, nodeInfo := range nodes { - buff, err = systemScAccount.RetrieveValue(nodeInfo.PublicKey) + buff, _, err = systemScAccount.RetrieveValue(nodeInfo.PublicKey) require.Nil(t, err) require.True(t, len(buff) > 0) @@ -836,7 +836,7 @@ func addKeysToWaitingList( _ = stakingSCAcc.SaveKeyValue(waitingKey, marshaledData) } - marshaledData, _ := stakingSCAcc.RetrieveValue([]byte("waitingList")) + marshaledData, _, _ := stakingSCAcc.RetrieveValue([]byte("waitingList")) waitingListHead := &systemSmartContracts.WaitingList{} _ = marshalizer.Unmarshal(waitingListHead, marshaledData) waitingListHead.Length += uint32(len(waitingKeys)) @@ -868,7 +868,7 @@ func addKeysToWaitingList( previousKey = waitingKeyInList } - marshaledData, _ = stakingSCAcc.RetrieveValue(waitingListHead.FirstKey) + marshaledData, _, _ = stakingSCAcc.RetrieveValue(waitingListHead.FirstKey) waitingListElement := &systemSmartContracts.ElementInList{} _ = marshalizer.Unmarshal(waitingListElement, marshaledData) waitingListElement.NextKey = []byte("w_" + string(waitingKeys[0])) @@ -1758,7 +1758,7 @@ func TestSystemSCProcessor_ProcessSystemSmartContractUnStakeFromAdditionalQueue( assert.Equal(t, []byte("waitingPubKe3"), dStatus.UnStakedKeys[1].BLSKey) stakingSCAcc := loadSCAccount(args.UserAccountsDB, vm.StakingSCAddress) - marshaledData, _ := stakingSCAcc.RetrieveValue([]byte("waitingList")) + marshaledData, _, _ := stakingSCAcc.RetrieveValue([]byte("waitingList")) waitingListHead := &systemSmartContracts.WaitingList{} _ = args.Marshalizer.Unmarshal(waitingListHead, marshaledData) assert.Equal(t, uint32(3), waitingListHead.Length) diff --git a/genesis/mock/userAccountMock.go b/genesis/mock/userAccountMock.go index f2060c98e00..40cd1593c6e 100644 --- a/genesis/mock/userAccountMock.go +++ b/genesis/mock/userAccountMock.go @@ -70,8 +70,8 @@ func (uam *UserAccountMock) DataTrie() common.DataTrieHandler { } // RetrieveValue - -func (uam *UserAccountMock) RetrieveValue(_ []byte) ([]byte, error) { - return nil, nil +func (uam *UserAccountMock) RetrieveValue(_ []byte) ([]byte, uint32, error) { + return nil, 0, nil } // SaveKeyValue - diff --git a/go.mod b/go.mod index d8fcf248f5b..2b83dd02d7c 100644 --- a/go.mod +++ b/go.mod @@ -4,15 +4,15 @@ go 1.15 require ( github.com/ElrondNetwork/covalent-indexer-go v1.0.6 - github.com/ElrondNetwork/elastic-indexer-go v1.2.44 - github.com/ElrondNetwork/elrond-go-core v1.1.20 + github.com/ElrondNetwork/elastic-indexer-go v1.2.45-0.20221018133345-4162960cd397 + github.com/ElrondNetwork/elrond-go-core v1.1.21-0.20221018132248-0621ead5b6d3 github.com/ElrondNetwork/elrond-go-crypto v1.2.1 github.com/ElrondNetwork/elrond-go-logger v1.0.7 github.com/ElrondNetwork/elrond-go-p2p v1.0.2 github.com/ElrondNetwork/elrond-go-storage v1.0.1 - github.com/ElrondNetwork/elrond-vm-common v1.3.19 + github.com/ElrondNetwork/elrond-vm-common v1.3.23-0.20221018122023-fbefc7c2a3e0 github.com/ElrondNetwork/wasm-vm v1.4.59 - github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.42 + github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.43-0.20221018130126-9ac872793535 github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.42 github.com/beevik/ntp v0.3.0 github.com/davecgh/go-spew v1.1.1 diff --git a/go.sum b/go.sum index 76ee20779a1..75d1f6727b3 100644 --- a/go.sum +++ b/go.sum @@ -49,15 +49,15 @@ github.com/ElrondNetwork/concurrent-map v0.1.3 h1:j2LtPrNJuerannC1cQDE79STvi/P04 github.com/ElrondNetwork/concurrent-map v0.1.3/go.mod h1:3XwSwn4JHI0lrKxWLZvtp53Emr8BXYTmNQGwcukHJEE= github.com/ElrondNetwork/covalent-indexer-go v1.0.6 h1:+LNKItUc+Pb7WuTbil3VuiLMmdQ1AY7lBJM476PtVNE= github.com/ElrondNetwork/covalent-indexer-go v1.0.6/go.mod h1:j3h2g96vqhJAuj3aEX2PWhomae2/o7YfXGEfweNXEeQ= -github.com/ElrondNetwork/elastic-indexer-go v1.2.44 h1:RIk/zlAKfqNli5hd0LRpMFyQK7OXCcC/xfYYNJ4oMpQ= -github.com/ElrondNetwork/elastic-indexer-go v1.2.44/go.mod h1:q0SJzaMI5kTjDoi+sSqBrLmu8XUbyTOt5k865EyczPo= +github.com/ElrondNetwork/elastic-indexer-go v1.2.45-0.20221018133345-4162960cd397 h1:Mhl5CZtdPRlurvmq4s21aYWcwbUDXIrUg6gzYMC15Vk= +github.com/ElrondNetwork/elastic-indexer-go v1.2.45-0.20221018133345-4162960cd397/go.mod h1:UImkSOg50yVUIHNQqFcwlOV2IgqL93cWtlMuSGhxVik= github.com/ElrondNetwork/elrond-go-core v1.0.0/go.mod h1:FQMem7fFF4+8pQ6lVsBZq6yO+smD0nV23P4bJpmPjTo= github.com/ElrondNetwork/elrond-go-core v1.1.7/go.mod h1:O9FkkTT2H9kxCzfn40TbhoCDXzGmUrRVusMomhK/Y3g= github.com/ElrondNetwork/elrond-go-core v1.1.13/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.18/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.19/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= -github.com/ElrondNetwork/elrond-go-core v1.1.20 h1:2JbXK7BrgbMm+q9xgyW80H8Ljn+HcGfbdXZp8YuFPXc= -github.com/ElrondNetwork/elrond-go-core v1.1.20/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= +github.com/ElrondNetwork/elrond-go-core v1.1.21-0.20221018132248-0621ead5b6d3 h1:vsklPgwbT+Wym96veRHyMD4hnskZfQrYUtZBVNlOUy4= +github.com/ElrondNetwork/elrond-go-core v1.1.21-0.20221018132248-0621ead5b6d3/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-crypto v1.0.0/go.mod h1:DGiR7/j1xv729Xg8SsjYaUzWXL5svMd44REXjWS/gAc= github.com/ElrondNetwork/elrond-go-crypto v1.2.1 h1:5wWCBEZp5SMFO2+Nal8UaJNJcG9G9J4PHNNZvQpEeUE= github.com/ElrondNetwork/elrond-go-crypto v1.2.1/go.mod h1:UNmpDaJjLTKxfzUcwua2R7Mh9bicw/L3ICJt5V7zqMo= @@ -73,16 +73,16 @@ github.com/ElrondNetwork/elrond-vm-common v1.1.0/go.mod h1:w3i6f8uiuRkE68Ie/gebR github.com/ElrondNetwork/elrond-vm-common v1.2.9/go.mod h1:B/Y8WiqHyDd7xsjNYsaYbVMp1jQgQ+z4jTJkFvj/EWI= github.com/ElrondNetwork/elrond-vm-common v1.3.7/go.mod h1:seROQuR7RJCoCS7mgRXVAlvjztltY1c+UroAgWr/USE= github.com/ElrondNetwork/elrond-vm-common v1.3.16/go.mod h1:seROQuR7RJCoCS7mgRXVAlvjztltY1c+UroAgWr/USE= -github.com/ElrondNetwork/elrond-vm-common v1.3.19 h1:DsdgpQyztBbvAF/ysHfTaYYwE3qQBQLEfrIqCddZWOE= -github.com/ElrondNetwork/elrond-vm-common v1.3.19/go.mod h1:seROQuR7RJCoCS7mgRXVAlvjztltY1c+UroAgWr/USE= +github.com/ElrondNetwork/elrond-vm-common v1.3.23-0.20221018122023-fbefc7c2a3e0 h1:7xzoOtRLUVRF8QEkC2Uzb6iA7zseABBZ2RtBQncYpDc= +github.com/ElrondNetwork/elrond-vm-common v1.3.23-0.20221018122023-fbefc7c2a3e0/go.mod h1:seROQuR7RJCoCS7mgRXVAlvjztltY1c+UroAgWr/USE= github.com/ElrondNetwork/go-libp2p-pubsub v0.6.1-rc1 h1:Nu/uwYQg/QbfoQ0uD6GahYTwgtAkAwtzsB0HVfSP58I= github.com/ElrondNetwork/go-libp2p-pubsub v0.6.1-rc1/go.mod h1:pJfaShe+i5aWZx8NhSkQjvOYQYLoqPztmFUlKjToOzM= github.com/ElrondNetwork/protobuf v1.3.2 h1:qoCSYiO+8GtXBEZWEjw0WPcZfM3g7QuuJrwpN+y6Mvg= github.com/ElrondNetwork/protobuf v1.3.2/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/ElrondNetwork/wasm-vm v1.4.59 h1:7TO0R+kpkCU375Pwtw0jBlkcSoakmGSyh2U6+Aob9L0= github.com/ElrondNetwork/wasm-vm v1.4.59/go.mod h1:NopwtkceMs1N5esbLzhMU49487XdEMAqaRnVIlQ72QY= -github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.42 h1:szZcuaxPElmLvYRezR4YayPDqRxDMCWspknhtSHJQyo= -github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.42/go.mod h1:d1Pirw0GnD4Eh5lhBvX9Bn+N1AHb/FzRVKZSHwWwJLg= +github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.43-0.20221018130126-9ac872793535 h1:bR3N7fPmXykBJle2ApxVTCZ4l8iYF+SPsUvm7oTIFn8= +github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.43-0.20221018130126-9ac872793535/go.mod h1:QH1ob8K5Z7GZ2pYJ5QvOoYw/ybz16URY9T4SM3kO/xs= github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.42 h1:EhLjiR/MnWSuLW3xtWh69oBZ4zAsym/QrhGKsVWwJjw= github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.42/go.mod h1:7JeSIgpcCxKiD67iSjnlBQt7qIQf+oSuehtBQp0QgVM= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= diff --git a/integrationTests/multiShard/relayedTx/relayedTx_test.go b/integrationTests/multiShard/relayedTx/relayedTx_test.go index 4af579039a0..2751a079eee 100644 --- a/integrationTests/multiShard/relayedTx/relayedTx_test.go +++ b/integrationTests/multiShard/relayedTx/relayedTx_test.go @@ -408,7 +408,7 @@ func CheckAddressHasTokens( func getESDTDataFromKey(userAcnt state.UserAccountHandler, key []byte) (*esdt.ESDigitalToken, error) { esdtData := &esdt.ESDigitalToken{Value: big.NewInt(0)} - marshaledData, err := userAcnt.RetrieveValue(key) + marshaledData, _, err := userAcnt.RetrieveValue(key) if err != nil { return esdtData, nil } diff --git a/integrationTests/multiShard/smartContract/polynetworkbridge/bridge_test.go b/integrationTests/multiShard/smartContract/polynetworkbridge/bridge_test.go index 12c65306fdf..c0e7b6956c2 100644 --- a/integrationTests/multiShard/smartContract/polynetworkbridge/bridge_test.go +++ b/integrationTests/multiShard/smartContract/polynetworkbridge/bridge_test.go @@ -142,7 +142,7 @@ func TestBridgeSetupAndBurn(t *testing.T) { func checkBurnedOnESDTContract(t *testing.T, nodes []*integrationTests.TestProcessorNode, tokenIdentifier []byte, burntValue *big.Int) { esdtSCAcc := getUserAccountWithAddress(t, vm.ESDTSCAddress, nodes) - retrievedData, _ := esdtSCAcc.RetrieveValue(tokenIdentifier) + retrievedData, _, _ := esdtSCAcc.RetrieveValue(tokenIdentifier) tokenInSystemSC := &systemSmartContracts.ESDTDataV2{} _ = integrationTests.TestMarshalizer.Unmarshal(tokenInSystemSC, retrievedData) diff --git a/integrationTests/multiShard/validatorToDelegation/validatorToDelegation_test.go b/integrationTests/multiShard/validatorToDelegation/validatorToDelegation_test.go index 1cf42464377..e9af82fd8b0 100644 --- a/integrationTests/multiShard/validatorToDelegation/validatorToDelegation_test.go +++ b/integrationTests/multiShard/validatorToDelegation/validatorToDelegation_test.go @@ -227,7 +227,7 @@ func jailNodes(nodes []*integrationTests.TestProcessorNode, blsKeys [][]byte) { stakingAcc := acc.(state.UserAccountHandler) for _, blsKey := range blsKeys { - marshaledData, _ := stakingAcc.RetrieveValue(blsKey) + marshaledData, _, _ := stakingAcc.RetrieveValue(blsKey) stakingData := &systemSmartContracts.StakedDataV2_0{} _ = integrationTests.TestMarshalizer.Unmarshal(stakingData, marshaledData) stakingData.Jailed = true @@ -367,7 +367,7 @@ func testBLSKeyOwnerIsAddress(t *testing.T, nodes []*integrationTests.TestProces acnt, _ := n.AccntState.GetExistingAccount(vm.StakingSCAddress) userAcc, _ := acnt.(state.UserAccountHandler) - marshaledData, _ := userAcc.RetrieveValue(blsKey) + marshaledData, _, _ := userAcc.RetrieveValue(blsKey) stakingData := &systemSmartContracts.StakedDataV2_0{} _ = integrationTests.TestMarshalizer.Unmarshal(stakingData, marshaledData) assert.Equal(t, stakingData.OwnerAddress, address) diff --git a/integrationTests/state/stateTrie/stateTrie_test.go b/integrationTests/state/stateTrie/stateTrie_test.go index bc700e57f29..4234031434f 100644 --- a/integrationTests/state/stateTrie/stateTrie_test.go +++ b/integrationTests/state/stateTrie/stateTrie_test.go @@ -84,11 +84,11 @@ func TestAccountsDB_RetrieveDataWithSomeValuesShouldWork(t *testing.T) { recoveredAccount := acc.(state.UserAccountHandler) // verify data - dataRecovered, err := recoveredAccount.RetrieveValue(key1) + dataRecovered, _, err := recoveredAccount.RetrieveValue(key1) require.Nil(t, err) require.Equal(t, val1, dataRecovered) - dataRecovered, err = recoveredAccount.RetrieveValue(key2) + dataRecovered, _, err = recoveredAccount.RetrieveValue(key2) require.Nil(t, err) require.Equal(t, val2, dataRecovered) } @@ -261,7 +261,7 @@ func TestAccountsDB_CommitTwoOkAccountsShouldWork(t *testing.T) { require.Nil(t, err) require.Equal(t, balance2, newState2.(state.UserAccountHandler).GetBalance()) require.NotNil(t, newState2.(state.UserAccountHandler).GetRootHash()) - valRecovered, err := newState2.(state.UserAccountHandler).RetrieveValue(key) + valRecovered, _, err := newState2.(state.UserAccountHandler).RetrieveValue(key) require.Nil(t, err) require.Equal(t, val, valRecovered) } @@ -349,7 +349,7 @@ func TestAccountsDB_CommitTwoOkAccountsWithRecreationFromStorageShouldWork(t *te newState2 := acc2.(state.UserAccountHandler) require.Equal(t, balance2, newState2.GetBalance()) require.NotNil(t, newState2.GetRootHash()) - valRecovered, err := newState2.RetrieveValue(key) + valRecovered, _, err := newState2.RetrieveValue(key) require.Nil(t, err) require.Equal(t, val, valRecovered) } @@ -1206,7 +1206,7 @@ func TestAccountsDB_RecreateTrieInvalidatesDataTriesCache(t *testing.T) { acc1, _ = adb.LoadAccount(address1) state1 = acc1.(state.UserAccountHandler) - retrievedVal, _ := state1.RetrieveValue(key1) + retrievedVal, _, _ := state1.RetrieveValue(key1) require.Equal(t, value1, retrievedVal) } @@ -1255,11 +1255,11 @@ func TestTrieDbPruning_GetDataTrieTrackerAfterPruning(t *testing.T) { collapseTrie(state1, t) collapseTrie(stateMock, t) - val, err := state1.RetrieveValue(key1) + val, _, err := state1.RetrieveValue(key1) require.Nil(t, err) require.Equal(t, value1, val) - val, err = stateMock.RetrieveValue(key2) + val, _, err = stateMock.RetrieveValue(key2) require.Nil(t, err) require.Equal(t, value1, val) } @@ -2358,7 +2358,7 @@ func checkAccountsDataTrie(t *testing.T, index uint32, startingKey uint32, adb * accState := acc.(state.UserAccountHandler) for i := int(startingKey); i < numKeys; i++ { k, v := createDummyKeyValue(i) - actualValue, errKey := accState.RetrieveValue(k) + actualValue, _, errKey := accState.RetrieveValue(k) require.Nil(t, errKey) require.Equal(t, v, actualValue) } diff --git a/integrationTests/vm/arwen/arwenvm/mandosConverter/mandosConverterUtils.go b/integrationTests/vm/arwen/arwenvm/mandosConverter/mandosConverterUtils.go index b7a7c21a06f..9d107725c80 100644 --- a/integrationTests/vm/arwen/arwenvm/mandosConverter/mandosConverterUtils.go +++ b/integrationTests/vm/arwen/arwenvm/mandosConverter/mandosConverterUtils.go @@ -3,9 +3,9 @@ package mandosConverter import ( "testing" + "github.com/ElrondNetwork/elrond-go/config" mge "github.com/ElrondNetwork/wasm-vm/mandos-go/elrondgo-exporter" mgutil "github.com/ElrondNetwork/wasm-vm/mandos-go/util" - "github.com/ElrondNetwork/elrond-go/config" "github.com/ElrondNetwork/elrond-go-core/data/transaction" logger "github.com/ElrondNetwork/elrond-go-logger" @@ -46,7 +46,7 @@ func CheckAccounts(t *testing.T, accAdapter state.AccountsAdapter, mandosAccount // CheckStorage checks if the dataTrie of an account equals with the storage of the corresponding mandosAccount func CheckStorage(t *testing.T, dataTrie state.UserAccountHandler, mandosAccStorage map[string][]byte) { for key := range mandosAccStorage { - dataTrieValue, err := dataTrie.RetrieveValue([]byte(key)) + dataTrieValue, _, err := dataTrie.RetrieveValue([]byte(key)) require.Nil(t, err) if len(mandosAccStorage[key]) == 0 { require.Nil(t, dataTrieValue) diff --git a/integrationTests/vm/esdt/localFuncs/esdtLocalFunsSC_test.go b/integrationTests/vm/esdt/localFuncs/esdtLocalFunsSC_test.go index aace8753701..0110fef6bf6 100644 --- a/integrationTests/vm/esdt/localFuncs/esdtLocalFunsSC_test.go +++ b/integrationTests/vm/esdt/localFuncs/esdtLocalFunsSC_test.go @@ -380,6 +380,6 @@ func checkDataFromAccountAndKey( expectedData []byte, ) { userAcc := esdtCommon.GetUserAccountWithAddress(t, address, nodes) - val, _ := userAcc.RetrieveValue(key) + val, _, _ := userAcc.RetrieveValue(key) assert.Equal(t, expectedData, val) } diff --git a/integrationTests/vm/esdt/process/esdtProcess_test.go b/integrationTests/vm/esdt/process/esdtProcess_test.go index 15ee84372f4..99c25fac1db 100644 --- a/integrationTests/vm/esdt/process/esdtProcess_test.go +++ b/integrationTests/vm/esdt/process/esdtProcess_test.go @@ -144,11 +144,11 @@ func TestESDTIssueAndTransactionsOnMultiShardEnvironment(t *testing.T) { wipedAcc := esdtCommon.GetUserAccountWithAddress(t, nodes[2].OwnAccount.Address, nodes) tokenKey := []byte(core.ElrondProtectedKeyPrefix + "esdt" + tokenIdentifier) - retrievedData, _ := wipedAcc.RetrieveValue(tokenKey) + retrievedData, _, _ := wipedAcc.RetrieveValue(tokenKey) require.Equal(t, 0, len(retrievedData)) systemSCAcc := esdtCommon.GetUserAccountWithAddress(t, core.SystemAccountAddress, nodes) - retrievedData, _ = systemSCAcc.RetrieveValue(tokenKey) + retrievedData, _, _ = systemSCAcc.RetrieveValue(tokenKey) esdtGlobalMetaData := vmcommonBuiltInFunctions.ESDTGlobalMetadataFromBytes(retrievedData) require.True(t, esdtGlobalMetaData.Paused) @@ -156,7 +156,7 @@ func TestESDTIssueAndTransactionsOnMultiShardEnvironment(t *testing.T) { esdtCommon.CheckAddressHasTokens(t, tokenIssuer.OwnAccount.Address, nodes, []byte(tokenIdentifier), 0, finalSupply) esdtSCAcc := esdtCommon.GetUserAccountWithAddress(t, vm.ESDTSCAddress, nodes) - retrievedData, _ = esdtSCAcc.RetrieveValue([]byte(tokenIdentifier)) + retrievedData, _, _ = esdtSCAcc.RetrieveValue([]byte(tokenIdentifier)) tokenInSystemSC := &systemSmartContracts.ESDTDataV2{} _ = integrationTests.TestMarshalizer.Unmarshal(tokenInSystemSC, retrievedData) require.Zero(t, tokenInSystemSC.MintedValue.Cmp(big.NewInt(initialSupply+mintValue))) @@ -258,7 +258,7 @@ func TestESDTCallBurnOnANonBurnableToken(t *testing.T) { time.Sleep(time.Second) esdtSCAcc := esdtCommon.GetUserAccountWithAddress(t, vm.ESDTSCAddress, nodes) - retrievedData, _ := esdtSCAcc.RetrieveValue([]byte(tokenIdentifier)) + retrievedData, _, _ := esdtSCAcc.RetrieveValue([]byte(tokenIdentifier)) tokenInSystemSC := &systemSmartContracts.ESDTDataV2{} _ = integrationTests.TestMarshalizer.Unmarshal(tokenInSystemSC, retrievedData) require.Equal(t, initialSupply, tokenInSystemSC.MintedValue.Int64()) diff --git a/integrationTests/vm/testInitializer.go b/integrationTests/vm/testInitializer.go index cbf81f3dc7b..9cafeb92129 100644 --- a/integrationTests/vm/testInitializer.go +++ b/integrationTests/vm/testInitializer.go @@ -10,7 +10,6 @@ import ( "sync" "testing" - arwenConfig "github.com/ElrondNetwork/wasm-vm/config" "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-core/core/pubkeyConverter" @@ -66,6 +65,7 @@ import ( vmcommon "github.com/ElrondNetwork/elrond-vm-common" vmcommonBuiltInFunctions "github.com/ElrondNetwork/elrond-vm-common/builtInFunctions" "github.com/ElrondNetwork/elrond-vm-common/parsers" + arwenConfig "github.com/ElrondNetwork/wasm-vm/config" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -1003,7 +1003,7 @@ func TestDeployedContractContents( assert.NotNil(t, destinationRecovShardAccount.GetRootHash()) for variable, requiredVal := range dataValues { - contractVariableData, err := destinationRecovShardAccount.RetrieveValue([]byte(variable)) + contractVariableData, _, err := destinationRecovShardAccount.RetrieveValue([]byte(variable)) assert.Nil(t, err) assert.NotNil(t, contractVariableData) diff --git a/node/node.go b/node/node.go index 6acf235c7b7..187cf8b9673 100644 --- a/node/node.go +++ b/node/node.go @@ -339,7 +339,7 @@ func (n *Node) GetValueForKey(address string, key string, options api.AccountQue return "", api.BlockInfo{}, err } - valueBytes, err := userAccount.RetrieveValue(keyBytes) + valueBytes, _, err := userAccount.RetrieveValue(keyBytes) if err != nil { return "", api.BlockInfo{}, fmt.Errorf("fetching value error: %w", err) } @@ -1286,7 +1286,7 @@ func (n *Node) getAccountRootHashAndVal(address []byte, accBytes []byte, key []b return nil, nil, fmt.Errorf("empty dataTrie rootHash") } - retrievedVal, err := userAccount.RetrieveValue(key) + retrievedVal, _, err := userAccount.RetrieveValue(key) if err != nil { return nil, nil, err } diff --git a/node/node_test.go b/node/node_test.go index 183319e5dc0..0a5031427d6 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -3686,9 +3686,9 @@ func TestNode_GetProofDataTrieShouldWork(t *testing.T) { GetAccountFromBytesCalled: func(address []byte, accountBytes []byte) (vmcommon.AccountHandler, error) { acc := &stateMock.AccountWrapMock{} acc.SetTrackableDataTrie(&trieMock.DataTrieTrackerStub{ - RetrieveValueCalled: func(key []byte) ([]byte, error) { + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { assert.Equal(t, dataTrieKey, hex.EncodeToString(key)) - return dataTrieValue, nil + return dataTrieValue, 0, nil }, }) acc.SetRootHash(dataTrieRootHash) diff --git a/process/rewardTransaction/process.go b/process/rewardTransaction/process.go index 801b18b2e13..c452bca63c4 100644 --- a/process/rewardTransaction/process.go +++ b/process/rewardTransaction/process.go @@ -111,7 +111,7 @@ func (rtp *rewardTxProcessor) saveAccumulatedRewards( existingReward := big.NewInt(0) fullRewardKey := core.ElrondProtectedKeyPrefix + rewardKey - val, err := userAccount.RetrieveValue([]byte(fullRewardKey)) + val, _, err := userAccount.RetrieveValue([]byte(fullRewardKey)) if err == nil { existingReward.SetBytes(val) } diff --git a/process/rewardTransaction/process_test.go b/process/rewardTransaction/process_test.go index feebdf4efca..7c9020a11c2 100644 --- a/process/rewardTransaction/process_test.go +++ b/process/rewardTransaction/process_test.go @@ -245,14 +245,14 @@ func TestRewardTxProcessor_ProcessRewardTransactionToASmartContractShouldWork(t err := rtp.ProcessRewardTransaction(&rwdTx) assert.Nil(t, err) assert.True(t, saveAccountWasCalled) - val, err := userAccount.RetrieveValue([]byte(core.ElrondProtectedKeyPrefix + rewardTransaction.RewardKey)) + val, _, err := userAccount.RetrieveValue([]byte(core.ElrondProtectedKeyPrefix + rewardTransaction.RewardKey)) assert.Nil(t, err) assert.True(t, rwdTx.Value.Cmp(big.NewInt(0).SetBytes(val)) == 0) err = rtp.ProcessRewardTransaction(&rwdTx) assert.Nil(t, err) assert.True(t, saveAccountWasCalled) - val, err = userAccount.RetrieveValue([]byte(core.ElrondProtectedKeyPrefix + rewardTransaction.RewardKey)) + val, _, err = userAccount.RetrieveValue([]byte(core.ElrondProtectedKeyPrefix + rewardTransaction.RewardKey)) assert.Nil(t, err) rwdTx.Value.Add(rwdTx.Value, rwdTx.Value) assert.True(t, rwdTx.Value.Cmp(big.NewInt(0).SetBytes(val)) == 0) diff --git a/process/scToProtocol/stakingToPeer.go b/process/scToProtocol/stakingToPeer.go index 8f10bd1aad3..ba6debca5f7 100644 --- a/process/scToProtocol/stakingToPeer.go +++ b/process/scToProtocol/stakingToPeer.go @@ -139,7 +139,7 @@ func (stp *stakingToPeer) getUserAccount(key []byte) (state.UserAccountHandler, } func (stp *stakingToPeer) getStorageFromAccount(userAcc state.UserAccountHandler, key []byte) []byte { - value, err := userAcc.RetrieveValue(key) + value, _, err := userAcc.RetrieveValue(key) if err != nil { return nil } diff --git a/process/smartContract/hooks/blockChainHook.go b/process/smartContract/hooks/blockChainHook.go index ff3e6a1917a..d42bf419247 100644 --- a/process/smartContract/hooks/blockChainHook.go +++ b/process/smartContract/hooks/blockChainHook.go @@ -234,7 +234,7 @@ func (bh *BlockChainHookImpl) GetStorageData(accountAddress []byte, index []byte return nil, err } - value, err := userAcc.AccountDataHandler().RetrieveValue(index) + value, _, err := userAcc.AccountDataHandler().RetrieveValue(index) messages := []interface{}{ "address", accountAddress, "rootHash", userAcc.GetRootHash(), @@ -612,7 +612,7 @@ func (bh *BlockChainHookImpl) returnESDTTokenByLegacyMethod( esdtTokenKey = append(esdtTokenKey, big.NewInt(0).SetUint64(nonce).Bytes()...) } - value, err := userAcc.AccountDataHandler().RetrieveValue(esdtTokenKey) + value, _, err := userAcc.AccountDataHandler().RetrieveValue(esdtTokenKey) if err != nil { return nil, err } diff --git a/process/smartContract/hooks/blockChainHook_test.go b/process/smartContract/hooks/blockChainHook_test.go index 76b113f5af7..ca7f5c92a08 100644 --- a/process/smartContract/hooks/blockChainHook_test.go +++ b/process/smartContract/hooks/blockChainHook_test.go @@ -351,9 +351,9 @@ func TestBlockChainHookImpl_GetStorageDataCannotRetrieveAccountValueExpectError( expectedErr := errors.New("error retrieving value") dataTrieStub := &trie.DataTrieTrackerStub{ - RetrieveValueCalled: func(key []byte) ([]byte, error) { + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { require.Equal(t, index, key) - return nil, expectedErr + return nil, 0, expectedErr }, } account := &stateMock.AccountWrapMock{ diff --git a/state/accountsDB_test.go b/state/accountsDB_test.go index a9217ed5507..b41aeca187a 100644 --- a/state/accountsDB_test.go +++ b/state/accountsDB_test.go @@ -780,7 +780,7 @@ func TestAccountsDB_LoadDataWithSomeValuesShouldWork(t *testing.T) { assert.Nil(t, err) // verify data - dataRecov, err := account.RetrieveValue(keyRequired) + dataRecov, _, err := account.RetrieveValue(keyRequired) assert.Nil(t, err) assert.Equal(t, val, dataRecov) } @@ -1331,11 +1331,11 @@ func TestAccountsDB_SaveAccountWithoutLoading(t *testing.T) { assert.Nil(t, err) userAcc = account.(state.UserAccountHandler) - returnedVal, err := userAcc.RetrieveValue(key) + returnedVal, _, err := userAcc.RetrieveValue(key) assert.Nil(t, err) assert.Equal(t, value, returnedVal) - returnedVal, err = userAcc.RetrieveValue(key1) + returnedVal, _, err = userAcc.RetrieveValue(key1) assert.Nil(t, err) assert.Equal(t, value, returnedVal) diff --git a/state/baseAccount.go b/state/baseAccount.go index 383d288b2a9..629768ca3a7 100644 --- a/state/baseAccount.go +++ b/state/baseAccount.go @@ -35,9 +35,9 @@ func (ba *baseAccount) SetDataTrie(trie common.Trie) { } // RetrieveValue fetches the value from a particular key searching the account data store in the data trie tracker -func (ba *baseAccount) RetrieveValue(key []byte) ([]byte, error) { +func (ba *baseAccount) RetrieveValue(key []byte) ([]byte, uint32, error) { if check.IfNil(ba.dataTrieTracker) { - return nil, ErrNilTrackableDataTrie + return nil, 0, ErrNilTrackableDataTrie } return ba.dataTrieTracker.RetrieveValue(key) diff --git a/state/interface.go b/state/interface.go index 4e592e5e484..26575e8eaee 100644 --- a/state/interface.go +++ b/state/interface.go @@ -72,7 +72,7 @@ type UserAccountHandler interface { GetRootHash() []byte SetDataTrie(trie common.Trie) DataTrie() common.DataTrieHandler - RetrieveValue(key []byte) ([]byte, error) + RetrieveValue(key []byte) ([]byte, uint32, error) SaveKeyValue(key []byte, value []byte) error AddToBalance(value *big.Int) error SubFromBalance(value *big.Int) error @@ -90,7 +90,7 @@ type UserAccountHandler interface { // DataTrieTracker models what how to manipulate data held by a SC account type DataTrieTracker interface { - RetrieveValue(key []byte) ([]byte, error) + RetrieveValue(key []byte) ([]byte, uint32, error) SaveKeyValue(key []byte, value []byte) error SetDataTrie(tr common.Trie) DataTrie() common.DataTrieHandler diff --git a/state/trackableDataTrie.go b/state/trackableDataTrie.go index 88a12ed24d6..a3e23e7a570 100644 --- a/state/trackableDataTrie.go +++ b/state/trackableDataTrie.go @@ -26,27 +26,28 @@ func NewTrackableDataTrie(identifier []byte, tr common.Trie) *trackableDataTrie // RetrieveValue fetches the value from a particular key searching the account data store // The search starts with dirty map, continues with original map and ends with the trie // Data must have been retrieved from its trie -func (tdaw *trackableDataTrie) RetrieveValue(key []byte) ([]byte, error) { +func (tdaw *trackableDataTrie) RetrieveValue(key []byte) ([]byte, uint32, error) { tailLength := len(key) + len(tdaw.identifier) // search in dirty data cache if value, found := tdaw.dirtyData[string(key)]; found { log.Trace("retrieve value from dirty data", "key", key, "value", value) - return trimValue(value, tailLength) + trimmedVal, err := trimValue(value, tailLength) + return trimmedVal, 0, err } // ok, not in cache, retrieve from trie if tdaw.tr == nil { - return nil, ErrNilTrie + return nil, 0, ErrNilTrie } - value, _, err := tdaw.tr.Get(key) + value, maxDepth, err := tdaw.tr.Get(key) if err != nil { - return nil, err + return nil, maxDepth, err } log.Trace("retrieve value from trie", "key", key, "value", value) value, _ = trimValue(value, tailLength) - return value, nil + return value, maxDepth, nil } func trimValue(value []byte, tailLength int) ([]byte, error) { diff --git a/state/trackableDataTrie_test.go b/state/trackableDataTrie_test.go index a36167efe29..1ffa4ecad1e 100644 --- a/state/trackableDataTrie_test.go +++ b/state/trackableDataTrie_test.go @@ -29,8 +29,9 @@ func TestTrackableDataTrie_RetrieveValueNilDataTrieShouldErr(t *testing.T) { as := state.NewTrackableDataTrie([]byte("identifier"), nil) assert.NotNil(t, as) - _, err := as.RetrieveValue([]byte("ABC")) + _, trieDepth, err := as.RetrieveValue([]byte("ABC")) assert.NotNil(t, err) + assert.Equal(t, uint32(0), trieDepth) } func TestTrackableDataTrie_RetrieveValueFoundInTrieShouldWork(t *testing.T) { @@ -42,6 +43,7 @@ func TestTrackableDataTrie_RetrieveValueFoundInTrieShouldWork(t *testing.T) { expectedVal := []byte("value") value := append(expectedVal, expectedKey...) value = append(value, identifier...) + expectedTrieDepth := uint32(5) trie := &trieMock.TrieStub{ UpdateCalled: func(key, value []byte) error { @@ -49,7 +51,7 @@ func TestTrackableDataTrie_RetrieveValueFoundInTrieShouldWork(t *testing.T) { }, GetCalled: func(key []byte) ([]byte, uint32, error) { if bytes.Equal(key, expectedKey) { - return value, 0, nil + return value, expectedTrieDepth, nil } return nil, 0, nil }, @@ -57,9 +59,10 @@ func TestTrackableDataTrie_RetrieveValueFoundInTrieShouldWork(t *testing.T) { mdaw := state.NewTrackableDataTrie(identifier, trie) assert.NotNil(t, mdaw) - valRecovered, err := mdaw.RetrieveValue(expectedKey) + valRecovered, trieDepth, err := mdaw.RetrieveValue(expectedKey) assert.Nil(t, err) assert.Equal(t, expectedVal, valRecovered) + assert.Equal(t, expectedTrieDepth, trieDepth) } func TestTrackableDataTrie_RetrieveValueMalfunctionTrieShouldErr(t *testing.T) { @@ -78,7 +81,7 @@ func TestTrackableDataTrie_RetrieveValueMalfunctionTrieShouldErr(t *testing.T) { mdaw := state.NewTrackableDataTrie([]byte("identifier"), trie) assert.NotNil(t, mdaw) - valRecovered, err := mdaw.RetrieveValue(keyExpected) + valRecovered, _, err := mdaw.RetrieveValue(keyExpected) assert.Equal(t, errExpected, err) assert.Nil(t, valRecovered) } @@ -92,23 +95,26 @@ func TestTrackableDataTrie_RetrieveValueShouldCheckDirtyDataFirst(t *testing.T) retrievedTrieVal := []byte("value") trieValue := append(retrievedTrieVal, tail...) newTrieValue := []byte("new trie value") + expectedTrieDepth := uint32(5) trie := &trieMock.TrieStub{ GetCalled: func(_ []byte) ([]byte, uint32, error) { - return trieValue, 0, nil + return trieValue, expectedTrieDepth, nil }, } mdaw := state.NewTrackableDataTrie([]byte("id"), trie) assert.NotNil(t, mdaw) - valRecovered, err := mdaw.RetrieveValue(key) + valRecovered, trieDepth, err := mdaw.RetrieveValue(key) assert.Equal(t, retrievedTrieVal, valRecovered) assert.Nil(t, err) + assert.Equal(t, expectedTrieDepth, trieDepth) _ = mdaw.SaveKeyValue(key, newTrieValue) - valRecovered, err = mdaw.RetrieveValue(key) + valRecovered, trieDepth, err = mdaw.RetrieveValue(key) assert.Equal(t, newTrieValue, valRecovered) assert.Nil(t, err) + assert.Equal(t, uint32(0), trieDepth) } func TestTrackableDataTrie_SaveKeyValueShouldSaveOnlyInDirty(t *testing.T) { @@ -133,7 +139,7 @@ func TestTrackableDataTrie_SaveKeyValueShouldSaveOnlyInDirty(t *testing.T) { _ = mdaw.SaveKeyValue(keyExpected, value) // test in dirty - retrievedVal, err := mdaw.RetrieveValue(keyExpected) + retrievedVal, _, err := mdaw.RetrieveValue(keyExpected) assert.Nil(t, err) assert.Equal(t, value, retrievedVal) } diff --git a/testscommon/state/accountWrapperMock.go b/testscommon/state/accountWrapperMock.go index e8a0cd6cdcf..e63c48c85c7 100644 --- a/testscommon/state/accountWrapperMock.go +++ b/testscommon/state/accountWrapperMock.go @@ -116,7 +116,7 @@ func (awm *AccountWrapMock) SetCode(code []byte) { } // RetrieveValue - -func (awm *AccountWrapMock) RetrieveValue(key []byte) ([]byte, error) { +func (awm *AccountWrapMock) RetrieveValue(key []byte) ([]byte, uint32, error) { return awm.trackableDataTrie.RetrieveValue(key) } diff --git a/testscommon/state/userAccountStub.go b/testscommon/state/userAccountStub.go index 55235b36b59..04e79a7e9ad 100644 --- a/testscommon/state/userAccountStub.go +++ b/testscommon/state/userAccountStub.go @@ -14,7 +14,7 @@ var _ state.UserAccountHandler = (*UserAccountStub)(nil) type UserAccountStub struct { Balance *big.Int AddToBalanceCalled func(value *big.Int) error - RetrieveValueCalled func(_ []byte) ([]byte, error) + RetrieveValueCalled func(_ []byte) ([]byte, uint32, error) } // HasNewCode - @@ -138,12 +138,12 @@ func (u *UserAccountStub) DataTrie() common.DataTrieHandler { } // RetrieveValue - -func (u *UserAccountStub) RetrieveValue(key []byte) ([]byte, error) { +func (u *UserAccountStub) RetrieveValue(key []byte) ([]byte, uint32, error) { if u.RetrieveValueCalled != nil { return u.RetrieveValueCalled(key) } - return nil, nil + return nil, 0, nil } // SaveKeyValue - diff --git a/testscommon/trie/dataTrieTrackerStub.go b/testscommon/trie/dataTrieTrackerStub.go index d8fba985b32..9c864a221ec 100644 --- a/testscommon/trie/dataTrieTrackerStub.go +++ b/testscommon/trie/dataTrieTrackerStub.go @@ -6,7 +6,7 @@ import ( // DataTrieTrackerStub - type DataTrieTrackerStub struct { - RetrieveValueCalled func(key []byte) ([]byte, error) + RetrieveValueCalled func(key []byte) ([]byte, uint32, error) SaveKeyValueCalled func(key []byte, value []byte) error SetDataTrieCalled func(tr common.Trie) DataTrieCalled func() common.Trie @@ -14,12 +14,12 @@ type DataTrieTrackerStub struct { } // RetrieveValue - -func (dtts *DataTrieTrackerStub) RetrieveValue(key []byte) ([]byte, error) { +func (dtts *DataTrieTrackerStub) RetrieveValue(key []byte) ([]byte, uint32, error) { if dtts.RetrieveValueCalled != nil { return dtts.RetrieveValueCalled(key) } - return []byte{}, nil + return []byte{}, 0, nil } // SaveKeyValue - From 51dfe3f3aa0312e8e21888b5f36f90b247a7b608 Mon Sep 17 00:00:00 2001 From: ssd04 Date: Tue, 18 Oct 2022 17:28:35 +0300 Subject: [PATCH 031/110] added separate metrics peer accounts --- common/constants.go | 14 ++++++++++---- node/metrics/metrics.go | 6 ++++-- node/metrics/metrics_test.go | 6 ++++-- state/accountsDB.go | 28 ++++++++++++++++++++++------ state/peerAccountsDB.go | 11 ++++++++++- 5 files changed, 50 insertions(+), 15 deletions(-) diff --git a/common/constants.go b/common/constants.go index 0146484fb3c..a98209a5667 100644 --- a/common/constants.go +++ b/common/constants.go @@ -818,8 +818,14 @@ const ( // MaxIndexOfTxInMiniBlock defines the maximum index of a tx inside one mini block const MaxIndexOfTxInMiniBlock = int32(29999) -// MetricTrieSnapshotIsProgress is the metric that outputs the status of the trie snapshot, if it's in progress or not -const MetricTrieSnapshotIsProgress = "erd_trie_snapshot_in_progress" +// MetricAccountsSnapshotIsProgress is the metric that outputs the status of the accounts snapshot, if it's in progress or not +const MetricAccountsSnapshotIsProgress = "erd_accounts_snapshot_in_progress" -// MetricLastTrieSnapshotDurationSec is the metric that outputs the duration in seconds of the last snapshot. If snapshot is in progress it will be set to 0 -const MetricLastTrieSnapshotDurationSec = "erd_trie_snapshot_last_duration_in_seconds" +// MetricLastAccountsSnapshotDurationSec is the metric that outputs the duration in seconds of the last accounts db snapshot. If snapshot is in progress it will be set to 0 +const MetricLastAccountsSnapshotDurationSec = "erd_accounts_snapshot_last_duration_in_seconds" + +// MetricPeersSnapshotIsProgress is the metric that outputs the status of the peers snapshot, if it's in progress or not +const MetricPeersSnapshotIsProgress = "erd_peers_snapshot_in_progress" + +// MetricLastPeersSnapshotDurationSec is the metric that outputs the duration in seconds of the last peers db snapshot. If snapshot is in progress it will be set to 0 +const MetricLastPeersSnapshotDurationSec = "erd_peers_snapshot_last_duration_in_seconds" diff --git a/node/metrics/metrics.go b/node/metrics/metrics.go index f6ead650021..ba26c7c9dcb 100644 --- a/node/metrics/metrics.go +++ b/node/metrics/metrics.go @@ -52,7 +52,8 @@ func InitBaseMetrics(statusHandlerUtils StatusHandlersUtils) error { appStatusHandler.SetUInt64Value(common.MetricNumConnectedPeers, initUint) appStatusHandler.SetUInt64Value(common.MetricEpochForEconomicsData, initUint) - appStatusHandler.SetInt64Value(common.MetricLastTrieSnapshotDurationSec, initInt) + appStatusHandler.SetInt64Value(common.MetricLastAccountsSnapshotDurationSec, initInt) + appStatusHandler.SetInt64Value(common.MetricLastPeersSnapshotDurationSec, initInt) appStatusHandler.SetStringValue(common.MetricConsensusState, initString) appStatusHandler.SetStringValue(common.MetricConsensusRoundState, initString) @@ -68,7 +69,8 @@ func InitBaseMetrics(statusHandlerUtils StatusHandlersUtils) error { appStatusHandler.SetStringValue(common.MetricP2PCrossShardObservers, initString) appStatusHandler.SetStringValue(common.MetricP2PFullHistoryObservers, initString) appStatusHandler.SetStringValue(common.MetricP2PUnknownPeers, initString) - appStatusHandler.SetStringValue(common.MetricTrieSnapshotIsProgress, initString) + appStatusHandler.SetStringValue(common.MetricAccountsSnapshotIsProgress, initString) + appStatusHandler.SetStringValue(common.MetricPeersSnapshotIsProgress, initString) appStatusHandler.SetStringValue(common.MetricInflation, initZeroString) appStatusHandler.SetStringValue(common.MetricDevRewardsInEpoch, initZeroString) diff --git a/node/metrics/metrics_test.go b/node/metrics/metrics_test.go index 56a1099ffe2..5c2d8a27d0f 100644 --- a/node/metrics/metrics_test.go +++ b/node/metrics/metrics_test.go @@ -54,8 +54,10 @@ func TestInitBaseMetrics(t *testing.T) { common.MetricInflation, common.MetricDevRewardsInEpoch, common.MetricTotalFees, - common.MetricTrieSnapshotIsProgress, - common.MetricLastTrieSnapshotDurationSec, + common.MetricAccountsSnapshotIsProgress, + common.MetricLastAccountsSnapshotDurationSec, + common.MetricPeersSnapshotIsProgress, + common.MetricLastPeersSnapshotDurationSec, } keys := make(map[string]struct{}) diff --git a/state/accountsDB.go b/state/accountsDB.go index 3d2eff73bda..6a617daf3e9 100644 --- a/state/accountsDB.go +++ b/state/accountsDB.go @@ -29,6 +29,8 @@ const ( leavesChannelSize = 100 missingNodesChannelSize = 100 lastSnapshotStarted = "lastSnapshot" + userTrieSnapshotMsg = "snapshotState user trie" + peerTrieSnapshotMsg = "snapshotState peer trie" ) type loadingMeasurements struct { @@ -119,7 +121,7 @@ func NewAccountsDB(args ArgsAccountsDB) (*AccountsDB, error) { return nil, err } - args.AppStatusHandler.SetStringValue(common.MetricTrieSnapshotIsProgress, strconv.FormatBool(false)) + args.AppStatusHandler.SetStringValue(common.MetricAccountsSnapshotIsProgress, strconv.FormatBool(false)) return createAccountsDb(args), nil } @@ -1121,10 +1123,14 @@ func (adb *AccountsDB) SnapshotState(rootHash []byte) { missingNodesChannel := make(chan []byte, missingNodesChannelSize) errChan := make(chan error, 1) stats := newSnapshotStatistics(1, 1) - adb.appStatusHandler.SetInt64Value(common.MetricLastTrieSnapshotDurationSec, 0) + adb.appStatusHandler.SetStringValue(common.MetricAccountsSnapshotIsProgress, "true") + adb.appStatusHandler.SetInt64Value(common.MetricLastAccountsSnapshotDurationSec, 0) go func() { leavesChannel := make(chan core.KeyValueHolder, leavesChannelSize) stats.NewSnapshotStarted() + + time.Sleep(6 * time.Second) + trieStorageManager.TakeSnapshot(nil, rootHash, rootHash, leavesChannel, missingNodesChannel, errChan, stats, epoch) adb.snapshotUserAccountDataTrie(true, rootHash, leavesChannel, missingNodesChannel, errChan, stats, epoch) @@ -1133,7 +1139,7 @@ func (adb *AccountsDB) SnapshotState(rootHash []byte) { go adb.syncMissingNodes(missingNodesChannel, stats, adb.trieSyncer) - go adb.processSnapshotCompletion(stats, trieStorageManager, missingNodesChannel, errChan, rootHash, "snapshotState user trie", epoch) + go adb.processSnapshotCompletion(stats, trieStorageManager, missingNodesChannel, errChan, rootHash, userTrieSnapshotMsg, epoch) adb.waitForCompletionIfAppropriate(stats) } @@ -1157,7 +1163,6 @@ func (adb *AccountsDB) prepareSnapshot(rootHash []byte) (common.StorageManager, } adb.isSnapshotInProgress.SetValue(true) - adb.appStatusHandler.SetStringValue(common.MetricTrieSnapshotIsProgress, strconv.FormatBool(adb.isSnapshotInProgress.IsSet())) adb.lastSnapshot.rootHash = rootHash adb.lastSnapshot.epoch = epoch err = trieStorageManager.Put([]byte(lastSnapshotStarted), rootHash) @@ -1206,6 +1211,18 @@ func (adb *AccountsDB) finishSnapshotOperation( stats.PrintStats(message, rootHash) } +func (adb *AccountsDB) updateMetricsOnSnapshotCompletion(message string, stats *snapshotStatistics) { + if message == peerTrieSnapshotMsg { + adb.appStatusHandler.SetStringValue(common.MetricPeersSnapshotIsProgress, "false") + adb.appStatusHandler.SetInt64Value(common.MetricLastPeersSnapshotDurationSec, stats.GetSnapshotDuration()) + } + + if message == userTrieSnapshotMsg { + adb.appStatusHandler.SetStringValue(common.MetricAccountsSnapshotIsProgress, "false") + adb.appStatusHandler.SetInt64Value(common.MetricLastAccountsSnapshotDurationSec, stats.GetSnapshotDuration()) + } +} + func (adb *AccountsDB) processSnapshotCompletion( stats *snapshotStatistics, trieStorageManager common.StorageManager, @@ -1219,8 +1236,7 @@ func (adb *AccountsDB) processSnapshotCompletion( defer func() { adb.isSnapshotInProgress.Reset() - adb.appStatusHandler.SetStringValue(common.MetricTrieSnapshotIsProgress, strconv.FormatBool(adb.isSnapshotInProgress.IsSet())) - adb.appStatusHandler.SetInt64Value(common.MetricLastTrieSnapshotDurationSec, stats.GetSnapshotDuration()) + adb.updateMetricsOnSnapshotCompletion(message, stats) }() containsErrorDuringSnapshot := emptyErrChanReturningHadContained(errChan) diff --git a/state/peerAccountsDB.go b/state/peerAccountsDB.go index 7d2b0b6f487..f6d3b9bbb8a 100644 --- a/state/peerAccountsDB.go +++ b/state/peerAccountsDB.go @@ -1,6 +1,8 @@ package state import ( + "strconv" + "github.com/ElrondNetwork/elrond-go/common" ) @@ -20,6 +22,8 @@ func NewPeerAccountsDB(args ArgsAccountsDB) (*PeerAccountsDB, error) { AccountsDB: createAccountsDb(args), } + args.AppStatusHandler.SetStringValue(common.MetricPeersSnapshotIsProgress, strconv.FormatBool(false)) + return adb, nil } @@ -55,13 +59,18 @@ func (adb *PeerAccountsDB) SnapshotState(rootHash []byte) { errChan := make(chan error, 1) stats := newSnapshotStatistics(0, 1) stats.NewSnapshotStarted() + adb.appStatusHandler.SetStringValue(common.MetricPeersSnapshotIsProgress, "true") + adb.appStatusHandler.SetInt64Value(common.MetricLastPeersSnapshotDurationSec, 0) + trieStorageManager.TakeSnapshot(nil, rootHash, rootHash, nil, missingNodesChannel, errChan, stats, epoch) go adb.syncMissingNodes(missingNodesChannel, stats, adb.trieSyncer) - go adb.processSnapshotCompletion(stats, trieStorageManager, missingNodesChannel, errChan, rootHash, "snapshotState peer trie", epoch) + go adb.processSnapshotCompletion(stats, trieStorageManager, missingNodesChannel, errChan, rootHash, peerTrieSnapshotMsg, epoch) adb.waitForCompletionIfAppropriate(stats) + adb.appStatusHandler.SetStringValue(common.MetricPeersSnapshotIsProgress, "false") + adb.appStatusHandler.SetInt64Value(common.MetricLastPeersSnapshotDurationSec, stats.GetSnapshotDuration()) } // SetStateCheckpoint triggers the checkpointing process of the state trie From 1563ebf965f8090fc80e89cf037aef468873fd1f Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Tue, 18 Oct 2022 18:05:49 +0300 Subject: [PATCH 032/110] added operation mode cli flag --- cmd/node/flags.go | 72 ++++++++++++++++++++++++++++++------ cmd/node/operationModes.go | 49 ++++++++++++++++++++++++ config/contextFlagsConfig.go | 2 +- 3 files changed, 110 insertions(+), 13 deletions(-) create mode 100644 cmd/node/operationModes.go diff --git a/cmd/node/flags.go b/cmd/node/flags.go index e276d39ac33..07f434a3b2c 100644 --- a/cmd/node/flags.go +++ b/cmd/node/flags.go @@ -5,6 +5,7 @@ import ( "math" "os" "runtime" + "strings" logger "github.com/ElrondNetwork/elrond-go-logger" "github.com/ElrondNetwork/elrond-go/common" @@ -351,6 +352,13 @@ var ( Usage: "The `filepath` for the PEM file which contains the secret keys for the p2p key. If this is not specified a new key will be generated (internally) by default.", Value: "./config/p2pKey.pem", } + + // operationMode defines the flag for specifying how configs should be altered depending on the node's intent + operationMode = cli.StringFlag{ + Name: "operation-mode", + Usage: "String flag for specifying the desired `operation mode`(s) of the node, resulting in altering some configuration values accordingly. Values are: import-db, full-archive, db-lookup-extension, historical-balances or `\"\"` (empty). Multiple values can be separated via ,", + Value: "", + } ) func getFlags() []cli.Flag { @@ -405,6 +413,7 @@ func getFlags() []cli.Flag { serializeSnapshots, noKey, p2pKeyPemFile, + operationMode, } } @@ -431,6 +440,7 @@ func getFlagsConfig(ctx *cli.Context, log logger.Logger) *config.ContextFlagsCon flagsConfig.DisableConsensusWatchdog = ctx.GlobalBool(disableConsensusWatchdog.Name) flagsConfig.SerializeSnapshots = ctx.GlobalBool(serializeSnapshots.Name) flagsConfig.NoKeyProvided = ctx.GlobalBool(noKey.Name) + flagsConfig.OperationMode = ctx.GlobalString(operationMode.Name) return flagsConfig } @@ -507,26 +517,66 @@ func getWorkingDir(workingDir string, log logger.Logger) string { } func applyCompatibleConfigs(log logger.Logger, configs *config.Configs) error { - importDbFlags := configs.ImportDbConfig - importDbFlags.ImportDbNoSigCheckFlag = importDbFlags.ImportDbNoSigCheckFlag && importDbFlags.IsImportDBMode - importDbFlags.ImportDbSaveTrieEpochRootHash = importDbFlags.ImportDbSaveTrieEpochRootHash && importDbFlags.IsImportDBMode + if configs.FlagsConfig.EnablePprof { + runtime.SetMutexProfileFraction(5) + } - if importDbFlags.IsImportDBMode { - return processConfigImportDBMode(log, configs) + operationModes := strings.Split(configs.FlagsConfig.OperationMode, ",") + err := checkOperationModes(operationModes) + if err != nil { + return err + } + + isInImportDBMode := configs.ImportDbConfig.IsImportDBMode || sliceContainsElement(operationModes, operationModeImportDb) + if isInImportDBMode { + err := processConfigImportDBMode(log, configs) + if err != nil { + return err + } } // if FullArchive is enabled, we override the conflicting StoragePruning settings and StartInEpoch as well - if configs.PreferencesConfig.Preferences.FullArchive { - return processConfigFullArchiveMode(log, configs) + isInFullArchiveMode := configs.PreferencesConfig.Preferences.FullArchive || sliceContainsElement(operationModes, operationModeFullArchive) + if isInFullArchiveMode { + processConfigFullArchiveMode(log, configs) } - if configs.FlagsConfig.EnablePprof { - runtime.SetMutexProfileFraction(5) + isInHistoricalBalancesMode := sliceContainsElement(operationModes, operationModeHistoricalBalances) + if isInHistoricalBalancesMode { + processHistoricalBalancesMode(log, configs) + } + + isInDbLookupExtensionMode := sliceContainsElement(operationModes, operationModeDbLookupExtension) + if isInDbLookupExtensionMode { + processDbLookupExtensionMode(log, configs) } return nil } +func processHistoricalBalancesMode(log logger.Logger, configs *config.Configs) { + configs.GeneralConfig.StoragePruning.ObserverCleanOldEpochsData = false + configs.GeneralConfig.StoragePruning.AccountsTrieCleanOldEpochsData = false + configs.GeneralConfig.StateTriesConfig.AccountsStatePruningEnabled = false + configs.GeneralConfig.DbLookupExtensions.Enabled = true + + log.Warn("the node is in historical balances mode! Will auto-set some config values", + "GeneralSettings.StoragePruning.ObserverCleanOldEpochsData", configs.GeneralConfig.StoragePruning.ObserverCleanOldEpochsData, + "GeneralConfig.StoragePruning.AccountsTrieCleanOldEpochsData", configs.GeneralConfig.StoragePruning.AccountsTrieCleanOldEpochsData, + "GeneralConfig.StateTriesConfig.AccountsStatePruningEnabled", configs.GeneralConfig.StateTriesConfig.AccountsStatePruningEnabled, + "GeneralSettings.DbLookupExtensions.Enabled", configs.GeneralConfig.DbLookupExtensions.Enabled, + ) + +} + +func processDbLookupExtensionMode(log logger.Logger, configs *config.Configs) { + configs.GeneralConfig.DbLookupExtensions.Enabled = true + + log.Warn("the node is in DB lookup extension mode! Will auto-set some config values", + "GeneralSettings.DbLookupExtensions.Enabled", configs.GeneralConfig.DbLookupExtensions.Enabled, + ) +} + func processConfigImportDBMode(log logger.Logger, configs *config.Configs) error { importDbFlags := configs.ImportDbConfig generalConfigs := configs.GeneralConfig @@ -569,7 +619,7 @@ func processConfigImportDBMode(log logger.Logger, configs *config.Configs) error return nil } -func processConfigFullArchiveMode(log logger.Logger, configs *config.Configs) error { +func processConfigFullArchiveMode(log logger.Logger, configs *config.Configs) { generalConfigs := configs.GeneralConfig configs.GeneralConfig.GeneralSettings.StartInEpochEnabled = false @@ -583,8 +633,6 @@ func processConfigFullArchiveMode(log logger.Logger, configs *config.Configs) er "StoragePruning.ObserverCleanOldEpochsData", generalConfigs.StoragePruning.ObserverCleanOldEpochsData, "StoragePruning.Enabled", generalConfigs.StoragePruning.Enabled, ) - - return nil } func alterStorageConfigsForDBImport(config *config.Config) { diff --git a/cmd/node/operationModes.go b/cmd/node/operationModes.go new file mode 100644 index 00000000000..47dc46e31c9 --- /dev/null +++ b/cmd/node/operationModes.go @@ -0,0 +1,49 @@ +package main + +import "fmt" + +const ( + operationModeImportDb = "import-db" + operationModeFullArchive = "full-archive" + operationModeDbLookupExtension = "db-lookup-extension" + operationModeHistoricalBalances = "historical-balances" +) + +func checkOperationModes(modes []string) error { + // db lookup extension and historical balances + isInvalid := sliceContainsBothElements(modes, operationModeHistoricalBalances, operationModeDbLookupExtension) + if isInvalid { + return fmt.Errorf("operation-mode flag cannot contain both db-lookup-extension and historical-balances") + } + + return nil +} + +func sliceContainsBothElements(elements []string, first string, second string) bool { + firstFound := false + secondFound := false + for _, element := range elements { + if element == first { + firstFound = true + } + if element == second { + secondFound = true + } + + if firstFound && secondFound { + return true + } + } + + return false +} + +func sliceContainsElement(elements []string, element string) bool { + for _, el := range elements { + if el == element { + return true + } + } + + return false +} diff --git a/config/contextFlagsConfig.go b/config/contextFlagsConfig.go index 7feb0568c7d..50b28b92079 100644 --- a/config/contextFlagsConfig.go +++ b/config/contextFlagsConfig.go @@ -12,7 +12,6 @@ type ContextFlagsConfig struct { CleanupStorage bool UseHealthService bool SessionInfoFileOutput string - EnableTxIndexing bool BootstrapRoundIndex uint64 RestApiInterface string EnablePprof bool @@ -24,6 +23,7 @@ type ContextFlagsConfig struct { DisableConsensusWatchdog bool SerializeSnapshots bool NoKeyProvided bool + OperationMode string } // ImportDbConfig will hold the import-db parameters From 5cc9ce9620d1ce4693a432271ca3fa1b56f8bc49 Mon Sep 17 00:00:00 2001 From: ssd04 Date: Tue, 18 Oct 2022 23:21:22 +0300 Subject: [PATCH 033/110] remove unintended sleep --- state/accountsDB.go | 2 -- state/peerAccountsDB.go | 6 +----- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/state/accountsDB.go b/state/accountsDB.go index 6a617daf3e9..e87240e1138 100644 --- a/state/accountsDB.go +++ b/state/accountsDB.go @@ -1129,8 +1129,6 @@ func (adb *AccountsDB) SnapshotState(rootHash []byte) { leavesChannel := make(chan core.KeyValueHolder, leavesChannelSize) stats.NewSnapshotStarted() - time.Sleep(6 * time.Second) - trieStorageManager.TakeSnapshot(nil, rootHash, rootHash, leavesChannel, missingNodesChannel, errChan, stats, epoch) adb.snapshotUserAccountDataTrie(true, rootHash, leavesChannel, missingNodesChannel, errChan, stats, epoch) diff --git a/state/peerAccountsDB.go b/state/peerAccountsDB.go index f6d3b9bbb8a..6d699a9d9c0 100644 --- a/state/peerAccountsDB.go +++ b/state/peerAccountsDB.go @@ -1,8 +1,6 @@ package state import ( - "strconv" - "github.com/ElrondNetwork/elrond-go/common" ) @@ -22,7 +20,7 @@ func NewPeerAccountsDB(args ArgsAccountsDB) (*PeerAccountsDB, error) { AccountsDB: createAccountsDb(args), } - args.AppStatusHandler.SetStringValue(common.MetricPeersSnapshotIsProgress, strconv.FormatBool(false)) + args.AppStatusHandler.SetStringValue(common.MetricPeersSnapshotIsProgress, "false") return adb, nil } @@ -69,8 +67,6 @@ func (adb *PeerAccountsDB) SnapshotState(rootHash []byte) { go adb.processSnapshotCompletion(stats, trieStorageManager, missingNodesChannel, errChan, rootHash, peerTrieSnapshotMsg, epoch) adb.waitForCompletionIfAppropriate(stats) - adb.appStatusHandler.SetStringValue(common.MetricPeersSnapshotIsProgress, "false") - adb.appStatusHandler.SetInt64Value(common.MetricLastPeersSnapshotDurationSec, stats.GetSnapshotDuration()) } // SetStateCheckpoint triggers the checkpointing process of the state trie From 037d83f3acee50c2f3a7786215a905fb5cd1e45f Mon Sep 17 00:00:00 2001 From: ssd04 Date: Tue, 18 Oct 2022 23:27:34 +0300 Subject: [PATCH 034/110] conflicts fix after merge --- common/constants.go | 4 +--- state/accountsDB.go | 11 +---------- state/peerAccountsDB.go | 10 +--------- 3 files changed, 3 insertions(+), 22 deletions(-) diff --git a/common/constants.go b/common/constants.go index 1d1bfb33f2b..e45cc37e785 100644 --- a/common/constants.go +++ b/common/constants.go @@ -818,7 +818,6 @@ const ( // MaxIndexOfTxInMiniBlock defines the maximum index of a tx inside one mini block const MaxIndexOfTxInMiniBlock = int32(29999) -<<<<<<< HEAD // MetricAccountsSnapshotIsProgress is the metric that outputs the status of the accounts snapshot, if it's in progress or not const MetricAccountsSnapshotIsProgress = "erd_accounts_snapshot_in_progress" @@ -830,7 +829,6 @@ const MetricPeersSnapshotIsProgress = "erd_peers_snapshot_in_progress" // MetricLastPeersSnapshotDurationSec is the metric that outputs the duration in seconds of the last peers db snapshot. If snapshot is in progress it will be set to 0 const MetricLastPeersSnapshotDurationSec = "erd_peers_snapshot_last_duration_in_seconds" -======= + // GenesisStorageSuffix defines the storage suffix used for genesis altered data const GenesisStorageSuffix = "_genesis" ->>>>>>> rc/v1.4.0 diff --git a/state/accountsDB.go b/state/accountsDB.go index a6c728e3525..35daa0a4f18 100644 --- a/state/accountsDB.go +++ b/state/accountsDB.go @@ -1138,25 +1138,16 @@ func (adb *AccountsDB) SnapshotState(rootHash []byte) { adb.appStatusHandler.SetInt64Value(common.MetricLastAccountsSnapshotDurationSec, 0) go func() { stats.NewSnapshotStarted() -<<<<<<< HEAD - trieStorageManager.TakeSnapshot(nil, rootHash, rootHash, leavesChannel, missingNodesChannel, errChan, stats, epoch) - adb.snapshotUserAccountDataTrie(true, rootHash, leavesChannel, missingNodesChannel, errChan, stats, epoch) -======= trieStorageManager.TakeSnapshot(nil, rootHash, rootHash, iteratorChannels, missingNodesChannel, stats, epoch) adb.snapshotUserAccountDataTrie(true, rootHash, iteratorChannels, missingNodesChannel, stats, epoch) ->>>>>>> rc/v1.4.0 stats.SnapshotFinished() }() go adb.syncMissingNodes(missingNodesChannel, stats, adb.trieSyncer) -<<<<<<< HEAD - go adb.processSnapshotCompletion(stats, trieStorageManager, missingNodesChannel, errChan, rootHash, userTrieSnapshotMsg, epoch) -======= - go adb.processSnapshotCompletion(stats, trieStorageManager, missingNodesChannel, iteratorChannels.ErrChan, rootHash, "snapshotState user trie", epoch) ->>>>>>> rc/v1.4.0 + go adb.processSnapshotCompletion(stats, trieStorageManager, missingNodesChannel, iteratorChannels.ErrChan, rootHash, userTrieSnapshotMsg, epoch) adb.waitForCompletionIfAppropriate(stats) } diff --git a/state/peerAccountsDB.go b/state/peerAccountsDB.go index f9bca084446..d5ef6c2b0d3 100644 --- a/state/peerAccountsDB.go +++ b/state/peerAccountsDB.go @@ -60,22 +60,14 @@ func (adb *PeerAccountsDB) SnapshotState(rootHash []byte) { } stats := newSnapshotStatistics(0, 1) stats.NewSnapshotStarted() -<<<<<<< HEAD adb.appStatusHandler.SetStringValue(common.MetricPeersSnapshotIsProgress, "true") adb.appStatusHandler.SetInt64Value(common.MetricLastPeersSnapshotDurationSec, 0) - trieStorageManager.TakeSnapshot(nil, rootHash, rootHash, nil, missingNodesChannel, errChan, stats, epoch) - - go adb.syncMissingNodes(missingNodesChannel, stats, adb.trieSyncer) - - go adb.processSnapshotCompletion(stats, trieStorageManager, missingNodesChannel, errChan, rootHash, peerTrieSnapshotMsg, epoch) -======= trieStorageManager.TakeSnapshot(nil, rootHash, rootHash, iteratorChannels, missingNodesChannel, stats, epoch) go adb.syncMissingNodes(missingNodesChannel, stats, adb.trieSyncer) - go adb.processSnapshotCompletion(stats, trieStorageManager, missingNodesChannel, iteratorChannels.ErrChan, rootHash, "snapshotState peer trie", epoch) ->>>>>>> rc/v1.4.0 + go adb.processSnapshotCompletion(stats, trieStorageManager, missingNodesChannel, iteratorChannels.ErrChan, rootHash, peerTrieSnapshotMsg, epoch) adb.waitForCompletionIfAppropriate(stats) } From 769f01d2cccd4c5d4bae343fbf39b6c8770dd76a Mon Sep 17 00:00:00 2001 From: ssd04 Date: Wed, 19 Oct 2022 09:34:15 +0300 Subject: [PATCH 035/110] fixes after review: metric variable renaming --- common/constants.go | 8 ++++---- node/metrics/metrics.go | 4 ++-- node/metrics/metrics_test.go | 4 ++-- state/accountsDB.go | 8 ++++---- state/peerAccountsDB.go | 4 ++-- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/common/constants.go b/common/constants.go index e45cc37e785..25dcf2344d8 100644 --- a/common/constants.go +++ b/common/constants.go @@ -818,14 +818,14 @@ const ( // MaxIndexOfTxInMiniBlock defines the maximum index of a tx inside one mini block const MaxIndexOfTxInMiniBlock = int32(29999) -// MetricAccountsSnapshotIsProgress is the metric that outputs the status of the accounts snapshot, if it's in progress or not -const MetricAccountsSnapshotIsProgress = "erd_accounts_snapshot_in_progress" +// MetricAccountsSnapshotInProgress is the metric that outputs the status of the accounts snapshot, if it's in progress or not +const MetricAccountsSnapshotInProgress = "erd_accounts_snapshot_in_progress" // MetricLastAccountsSnapshotDurationSec is the metric that outputs the duration in seconds of the last accounts db snapshot. If snapshot is in progress it will be set to 0 const MetricLastAccountsSnapshotDurationSec = "erd_accounts_snapshot_last_duration_in_seconds" -// MetricPeersSnapshotIsProgress is the metric that outputs the status of the peers snapshot, if it's in progress or not -const MetricPeersSnapshotIsProgress = "erd_peers_snapshot_in_progress" +// MetricPeersSnapshotInProgress is the metric that outputs the status of the peers snapshot, if it's in progress or not +const MetricPeersSnapshotInProgress = "erd_peers_snapshot_in_progress" // MetricLastPeersSnapshotDurationSec is the metric that outputs the duration in seconds of the last peers db snapshot. If snapshot is in progress it will be set to 0 const MetricLastPeersSnapshotDurationSec = "erd_peers_snapshot_last_duration_in_seconds" diff --git a/node/metrics/metrics.go b/node/metrics/metrics.go index ba26c7c9dcb..78aae64db03 100644 --- a/node/metrics/metrics.go +++ b/node/metrics/metrics.go @@ -69,8 +69,8 @@ func InitBaseMetrics(statusHandlerUtils StatusHandlersUtils) error { appStatusHandler.SetStringValue(common.MetricP2PCrossShardObservers, initString) appStatusHandler.SetStringValue(common.MetricP2PFullHistoryObservers, initString) appStatusHandler.SetStringValue(common.MetricP2PUnknownPeers, initString) - appStatusHandler.SetStringValue(common.MetricAccountsSnapshotIsProgress, initString) - appStatusHandler.SetStringValue(common.MetricPeersSnapshotIsProgress, initString) + appStatusHandler.SetStringValue(common.MetricAccountsSnapshotInProgress, initString) + appStatusHandler.SetStringValue(common.MetricPeersSnapshotInProgress, initString) appStatusHandler.SetStringValue(common.MetricInflation, initZeroString) appStatusHandler.SetStringValue(common.MetricDevRewardsInEpoch, initZeroString) diff --git a/node/metrics/metrics_test.go b/node/metrics/metrics_test.go index 5c2d8a27d0f..577367fbd4f 100644 --- a/node/metrics/metrics_test.go +++ b/node/metrics/metrics_test.go @@ -54,9 +54,9 @@ func TestInitBaseMetrics(t *testing.T) { common.MetricInflation, common.MetricDevRewardsInEpoch, common.MetricTotalFees, - common.MetricAccountsSnapshotIsProgress, + common.MetricAccountsSnapshotInProgress, common.MetricLastAccountsSnapshotDurationSec, - common.MetricPeersSnapshotIsProgress, + common.MetricPeersSnapshotInProgress, common.MetricLastPeersSnapshotDurationSec, } diff --git a/state/accountsDB.go b/state/accountsDB.go index 35daa0a4f18..a4fac5b5321 100644 --- a/state/accountsDB.go +++ b/state/accountsDB.go @@ -121,7 +121,7 @@ func NewAccountsDB(args ArgsAccountsDB) (*AccountsDB, error) { return nil, err } - args.AppStatusHandler.SetStringValue(common.MetricAccountsSnapshotIsProgress, strconv.FormatBool(false)) + args.AppStatusHandler.SetStringValue(common.MetricAccountsSnapshotInProgress, strconv.FormatBool(false)) return createAccountsDb(args), nil } @@ -1134,7 +1134,7 @@ func (adb *AccountsDB) SnapshotState(rootHash []byte) { ErrChan: make(chan error, 1), } stats := newSnapshotStatistics(1, 1) - adb.appStatusHandler.SetStringValue(common.MetricAccountsSnapshotIsProgress, "true") + adb.appStatusHandler.SetStringValue(common.MetricAccountsSnapshotInProgress, "true") adb.appStatusHandler.SetInt64Value(common.MetricLastAccountsSnapshotDurationSec, 0) go func() { stats.NewSnapshotStarted() @@ -1221,12 +1221,12 @@ func (adb *AccountsDB) finishSnapshotOperation( func (adb *AccountsDB) updateMetricsOnSnapshotCompletion(message string, stats *snapshotStatistics) { if message == peerTrieSnapshotMsg { - adb.appStatusHandler.SetStringValue(common.MetricPeersSnapshotIsProgress, "false") + adb.appStatusHandler.SetStringValue(common.MetricPeersSnapshotInProgress, "false") adb.appStatusHandler.SetInt64Value(common.MetricLastPeersSnapshotDurationSec, stats.GetSnapshotDuration()) } if message == userTrieSnapshotMsg { - adb.appStatusHandler.SetStringValue(common.MetricAccountsSnapshotIsProgress, "false") + adb.appStatusHandler.SetStringValue(common.MetricAccountsSnapshotInProgress, "false") adb.appStatusHandler.SetInt64Value(common.MetricLastAccountsSnapshotDurationSec, stats.GetSnapshotDuration()) } } diff --git a/state/peerAccountsDB.go b/state/peerAccountsDB.go index d5ef6c2b0d3..12eaee230fe 100644 --- a/state/peerAccountsDB.go +++ b/state/peerAccountsDB.go @@ -20,7 +20,7 @@ func NewPeerAccountsDB(args ArgsAccountsDB) (*PeerAccountsDB, error) { AccountsDB: createAccountsDb(args), } - args.AppStatusHandler.SetStringValue(common.MetricPeersSnapshotIsProgress, "false") + args.AppStatusHandler.SetStringValue(common.MetricPeersSnapshotInProgress, "false") return adb, nil } @@ -60,7 +60,7 @@ func (adb *PeerAccountsDB) SnapshotState(rootHash []byte) { } stats := newSnapshotStatistics(0, 1) stats.NewSnapshotStarted() - adb.appStatusHandler.SetStringValue(common.MetricPeersSnapshotIsProgress, "true") + adb.appStatusHandler.SetStringValue(common.MetricPeersSnapshotInProgress, "true") adb.appStatusHandler.SetInt64Value(common.MetricLastPeersSnapshotDurationSec, 0) trieStorageManager.TakeSnapshot(nil, rootHash, rootHash, iteratorChannels, missingNodesChannel, stats, epoch) From 0598ba8fb018611ada0ccde951574ed94fb528fb Mon Sep 17 00:00:00 2001 From: ssd04 Date: Wed, 19 Oct 2022 10:24:58 +0300 Subject: [PATCH 036/110] refactor to use a struct for account metrics --- state/accountsDB.go | 40 +++++++++++++++++++++++++--------------- state/peerAccountsDB.go | 9 ++++++++- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/state/accountsDB.go b/state/accountsDB.go index a4fac5b5321..f0aa815d94b 100644 --- a/state/accountsDB.go +++ b/state/accountsDB.go @@ -68,6 +68,12 @@ func (lm *loadingMeasurements) resetAndPrint() { ) } +type accountMetrics struct { + snapshotInProgressKey string + lastSnapshotDurationKey string + snapshotMessage string +} + type snapshotInfo struct { rootHash []byte epoch uint32 @@ -1134,8 +1140,14 @@ func (adb *AccountsDB) SnapshotState(rootHash []byte) { ErrChan: make(chan error, 1), } stats := newSnapshotStatistics(1, 1) - adb.appStatusHandler.SetStringValue(common.MetricAccountsSnapshotInProgress, "true") - adb.appStatusHandler.SetInt64Value(common.MetricLastAccountsSnapshotDurationSec, 0) + + accountMetrics := &accountMetrics{ + snapshotInProgressKey: common.MetricAccountsSnapshotInProgress, + lastSnapshotDurationKey: common.MetricLastAccountsSnapshotDurationSec, + snapshotMessage: userTrieSnapshotMsg, + } + adb.updateMetricsOnSnapshotStart(accountMetrics) + go func() { stats.NewSnapshotStarted() @@ -1147,7 +1159,7 @@ func (adb *AccountsDB) SnapshotState(rootHash []byte) { go adb.syncMissingNodes(missingNodesChannel, stats, adb.trieSyncer) - go adb.processSnapshotCompletion(stats, trieStorageManager, missingNodesChannel, iteratorChannels.ErrChan, rootHash, userTrieSnapshotMsg, epoch) + go adb.processSnapshotCompletion(stats, trieStorageManager, missingNodesChannel, iteratorChannels.ErrChan, rootHash, accountMetrics, epoch) adb.waitForCompletionIfAppropriate(stats) } @@ -1219,16 +1231,14 @@ func (adb *AccountsDB) finishSnapshotOperation( stats.PrintStats(message, rootHash) } -func (adb *AccountsDB) updateMetricsOnSnapshotCompletion(message string, stats *snapshotStatistics) { - if message == peerTrieSnapshotMsg { - adb.appStatusHandler.SetStringValue(common.MetricPeersSnapshotInProgress, "false") - adb.appStatusHandler.SetInt64Value(common.MetricLastPeersSnapshotDurationSec, stats.GetSnapshotDuration()) - } +func (adb *AccountsDB) updateMetricsOnSnapshotStart(metrics *accountMetrics) { + adb.appStatusHandler.SetStringValue(metrics.snapshotInProgressKey, "true") + adb.appStatusHandler.SetInt64Value(metrics.lastSnapshotDurationKey, 0) +} - if message == userTrieSnapshotMsg { - adb.appStatusHandler.SetStringValue(common.MetricAccountsSnapshotInProgress, "false") - adb.appStatusHandler.SetInt64Value(common.MetricLastAccountsSnapshotDurationSec, stats.GetSnapshotDuration()) - } +func (adb *AccountsDB) updateMetricsOnSnapshotCompletion(metrics *accountMetrics, stats *snapshotStatistics) { + adb.appStatusHandler.SetStringValue(metrics.snapshotInProgressKey, "false") + adb.appStatusHandler.SetInt64Value(metrics.lastSnapshotDurationKey, stats.GetSnapshotDuration()) } func (adb *AccountsDB) processSnapshotCompletion( @@ -1237,14 +1247,14 @@ func (adb *AccountsDB) processSnapshotCompletion( missingNodesCh chan []byte, errChan chan error, rootHash []byte, - message string, + metrics *accountMetrics, epoch uint32, ) { - adb.finishSnapshotOperation(rootHash, stats, missingNodesCh, message, trieStorageManager) + adb.finishSnapshotOperation(rootHash, stats, missingNodesCh, metrics.snapshotMessage, trieStorageManager) defer func() { adb.isSnapshotInProgress.Reset() - adb.updateMetricsOnSnapshotCompletion(message, stats) + adb.updateMetricsOnSnapshotCompletion(metrics, stats) }() containsErrorDuringSnapshot := emptyErrChanReturningHadContained(errChan) diff --git a/state/peerAccountsDB.go b/state/peerAccountsDB.go index 12eaee230fe..38adf141f9a 100644 --- a/state/peerAccountsDB.go +++ b/state/peerAccountsDB.go @@ -63,11 +63,18 @@ func (adb *PeerAccountsDB) SnapshotState(rootHash []byte) { adb.appStatusHandler.SetStringValue(common.MetricPeersSnapshotInProgress, "true") adb.appStatusHandler.SetInt64Value(common.MetricLastPeersSnapshotDurationSec, 0) + peerAccountsMetrics := &accountMetrics{ + snapshotInProgressKey: common.MetricPeersSnapshotInProgress, + lastSnapshotDurationKey: common.MetricLastPeersSnapshotDurationSec, + snapshotMessage: peerTrieSnapshotMsg, + } + adb.updateMetricsOnSnapshotStart(peerAccountsMetrics) + trieStorageManager.TakeSnapshot(nil, rootHash, rootHash, iteratorChannels, missingNodesChannel, stats, epoch) go adb.syncMissingNodes(missingNodesChannel, stats, adb.trieSyncer) - go adb.processSnapshotCompletion(stats, trieStorageManager, missingNodesChannel, iteratorChannels.ErrChan, rootHash, peerTrieSnapshotMsg, epoch) + go adb.processSnapshotCompletion(stats, trieStorageManager, missingNodesChannel, iteratorChannels.ErrChan, rootHash, peerAccountsMetrics, epoch) adb.waitForCompletionIfAppropriate(stats) } From 81c757e331f12a0d14154a8bd1751da2df5dfb2f Mon Sep 17 00:00:00 2001 From: ssd04 Date: Wed, 19 Oct 2022 10:29:13 +0300 Subject: [PATCH 037/110] remove duplicated metrics set in peer accouts db --- state/peerAccountsDB.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/state/peerAccountsDB.go b/state/peerAccountsDB.go index 38adf141f9a..c752898c131 100644 --- a/state/peerAccountsDB.go +++ b/state/peerAccountsDB.go @@ -60,8 +60,6 @@ func (adb *PeerAccountsDB) SnapshotState(rootHash []byte) { } stats := newSnapshotStatistics(0, 1) stats.NewSnapshotStarted() - adb.appStatusHandler.SetStringValue(common.MetricPeersSnapshotInProgress, "true") - adb.appStatusHandler.SetInt64Value(common.MetricLastPeersSnapshotDurationSec, 0) peerAccountsMetrics := &accountMetrics{ snapshotInProgressKey: common.MetricPeersSnapshotInProgress, From c4c917f58690568b70b5dfe3d284b537aed8eca6 Mon Sep 17 00:00:00 2001 From: jules01 Date: Wed, 19 Oct 2022 11:07:42 +0300 Subject: [PATCH 038/110] - added a new gas schedule + backward compatibility fix --- cmd/node/config/enableEpochs.toml | 1 + .../config/gasSchedules/gasScheduleV7.toml | 689 ++++++++++++++++++ process/smartContract/process.go | 6 +- 3 files changed, 692 insertions(+), 4 deletions(-) create mode 100644 cmd/node/config/gasSchedules/gasScheduleV7.toml diff --git a/cmd/node/config/enableEpochs.toml b/cmd/node/config/enableEpochs.toml index f9494a2ccd5..f126cd1e84e 100644 --- a/cmd/node/config/enableEpochs.toml +++ b/cmd/node/config/enableEpochs.toml @@ -247,4 +247,5 @@ GasScheduleByEpochs = [ { StartEpoch = 0, FileName = "gasScheduleV1.toml" }, { StartEpoch = 1, FileName = "gasScheduleV6.toml" }, + { StartEpoch = 5, FileName = "gasScheduleV7.toml" }, ] diff --git a/cmd/node/config/gasSchedules/gasScheduleV7.toml b/cmd/node/config/gasSchedules/gasScheduleV7.toml new file mode 100644 index 00000000000..07aa0aec0eb --- /dev/null +++ b/cmd/node/config/gasSchedules/gasScheduleV7.toml @@ -0,0 +1,689 @@ +[BuiltInCost] + ChangeOwnerAddress = 5000000 + ClaimDeveloperRewards = 5000000 + SaveUserName = 1000000 + SaveKeyValue = 100000 + ESDTTransfer = 200000 + ESDTBurn = 100000 + ESDTLocalMint = 50000 + ESDTLocalBurn = 50000 + ESDTNFTCreate = 150000 + ESDTNFTAddQuantity = 50000 + ESDTNFTBurn = 50000 + ESDTNFTTransfer = 200000 + ESDTNFTChangeCreateOwner = 1000000 + ESDTNFTAddUri = 50000 + ESDTNFTUpdateAttributes = 50000 + ESDTNFTMultiTransfer = 200000 + MultiESDTNFTTransfer = 200000 # should be the same value with the ESDTNFTMultiTransfer + +[MetaChainSystemSCsCost] + Stake = 5000000 + UnStake = 5000000 + UnBond = 5000000 + Claim = 5000000 + Get = 5000000 + ChangeRewardAddress = 5000000 + ChangeValidatorKeys = 5000000 + UnJail = 5000000 + DelegationOps = 1000000 + DelegationMgrOps = 50000000 + ValidatorToDelegation = 500000000 + ESDTIssue = 50000000 + ESDTOperations = 50000000 + Proposal = 50000000 + Vote = 50000000 + DelegateVote = 50000000 + RevokeVote = 50000000 + CloseProposal = 50000000 + GetAllNodeStates = 20000000 + UnstakeTokens = 5000000 + UnbondTokens = 5000000 + FixWaitingListSize = 500000000 + +[BaseOperationCost] + StorePerByte = 10000 + ReleasePerByte = 1000 + DataCopyPerByte = 50 + PersistPerByte = 1000 + CompilePerByte = 300 + AoTPreparePerByte = 100 + GetCode = 1000000 + +[ElrondAPICost] + GetSCAddress = 100 + GetOwnerAddress = 5000 + IsSmartContract = 5000 + GetShardOfAddress = 5000 + GetExternalBalance = 7000 + GetBlockHash = 10000 + TransferValue = 100000 + GetArgument = 100 + GetFunction = 100 + GetNumArguments = 100 + StorageStore = 75000 + StorageLoad = 50000 + CachedStorageLoad = 1000 + GetCaller = 100 + GetCallValue = 100 + Log = 3750 + Finish = 1 + SignalError = 1 + GetBlockTimeStamp = 10000 + GetGasLeft = 100 + Int64GetArgument = 100 + Int64StorageStore = 75000 + Int64StorageLoad = 50000 + Int64Finish = 1000 + GetStateRootHash = 10000 + GetBlockNonce = 10000 + GetBlockEpoch = 10000 + GetBlockRound = 10000 + GetBlockRandomSeed = 10000 + ExecuteOnSameContext = 100000 + ExecuteOnDestContext = 100000 + DelegateExecution = 100000 + AsyncCallStep = 100000 + AsyncCallbackGasLock = 4000000 + ExecuteReadOnly = 160000 + CreateContract = 300000 + GetReturnData = 100 + GetNumReturnData = 100 + GetReturnDataSize = 100 + GetOriginalTxHash = 10000 + CleanReturnData = 100 + DeleteFromReturnData = 100 + +[EthAPICost] + UseGas = 100 + GetAddress = 100000 + GetExternalBalance = 70000 + GetBlockHash = 100000 + Call = 160000 + CallDataCopy = 200 + GetCallDataSize = 100 + CallCode = 160000 + CallDelegate = 160000 + CallStatic = 160000 + StorageStore = 250000 + StorageLoad = 100000 + GetCaller = 100 + GetCallValue = 100 + CodeCopy = 1000 + GetCodeSize = 100 + GetBlockCoinbase = 100 + Create = 320000 + GetBlockDifficulty = 100 + ExternalCodeCopy = 3000 + GetExternalCodeSize = 2500 + GetGasLeft = 100 + GetBlockGasLimit = 100000 + GetTxGasPrice = 1000 + Log = 3750 + GetBlockNumber = 100000 + GetTxOrigin = 100000 + Finish = 1 + Revert = 1 + GetReturnDataSize = 200 + ReturnDataCopy = 500 + SelfDestruct = 5000000 + GetBlockTimeStamp = 100000 + +[BigIntAPICost] + BigIntNew = 2000 + BigIntByteLength = 2000 + BigIntUnsignedByteLength = 2000 + BigIntSignedByteLength = 2000 + BigIntGetBytes = 2000 + BigIntGetUnsignedBytes = 2000 + BigIntGetSignedBytes = 2000 + BigIntSetBytes = 2000 + BigIntSetUnsignedBytes = 2000 + BigIntSetSignedBytes = 2000 + BigIntIsInt64 = 2000 + BigIntGetInt64 = 2000 + BigIntSetInt64 = 2000 + BigIntAdd = 2000 + BigIntSub = 2000 + BigIntMul = 6000 + BigIntSqrt = 6000 + BigIntPow = 6000 + BigIntLog = 6000 + BigIntTDiv = 6000 + BigIntTMod = 6000 + BigIntEDiv = 6000 + BigIntEMod = 6000 + BigIntAbs = 2000 + BigIntNeg = 2000 + BigIntSign = 2000 + BigIntCmp = 2000 + BigIntNot = 2000 + BigIntAnd = 2000 + BigIntOr = 2000 + BigIntXor = 2000 + BigIntShr = 2000 + BigIntShl = 2000 + BigIntFinishUnsigned = 1000 + BigIntFinishSigned = 1000 + BigIntStorageLoadUnsigned = 50000 + BigIntStorageStoreUnsigned = 75000 + BigIntGetArgument = 1000 + BigIntGetUnsignedArgument = 1000 + BigIntGetSignedArgument = 1000 + BigIntGetCallValue = 1000 + BigIntGetExternalBalance = 10000 + CopyPerByteForTooBig = 1000 + +[CryptoAPICost] + SHA256 = 1000000 + Keccak256 = 1000000 + Ripemd160 = 1000000 + VerifyBLS = 5000000 + VerifyEd25519 = 2000000 + VerifySecp256k1 = 2000000 + EllipticCurveNew = 10000 + AddECC = 75000 + DoubleECC = 65000 + IsOnCurveECC = 10000 + ScalarMultECC = 400000 + MarshalECC = 13000 + MarshalCompressedECC = 15000 + UnmarshalECC = 20000 + UnmarshalCompressedECC = 270000 + GenerateKeyECC = 7000000 + EncodeDERSig = 10000000 + +[ManagedBufferAPICost] + MBufferNew = 2000 + MBufferNewFromBytes = 2000 + MBufferGetLength = 2000 + MBufferGetBytes = 2000 + MBufferGetByteSlice = 2000 + MBufferCopyByteSlice = 2000 + MBufferSetBytes = 2000 + MBufferAppend = 2000 + MBufferAppendBytes = 2000 + MBufferToBigIntUnsigned = 2000 + MBufferToBigIntSigned = 5000 + MBufferFromBigIntUnsigned = 2000 + MBufferFromBigIntSigned = 5000 + MBufferStorageStore = 75000 + MBufferStorageLoad = 50000 + MBufferGetArgument = 1000 + MBufferFinish = 1000 + MBufferSetRandom = 6000 + MBufferToBigFloat = 2000 + MBufferFromBigFloat = 2000 + +[BigFloatAPICost] + BigFloatNewFromParts = 3000 + BigFloatAdd = 7000 + BigFloatSub = 7000 + BigFloatMul = 7000 + BigFloatDiv = 7000 + BigFloatTruncate = 5000 + BigFloatNeg = 5000 + BigFloatClone = 5000 + BigFloatCmp = 4000 + BigFloatAbs = 5000 + BigFloatSqrt = 7000 + BigFloatPow = 10000 + BigFloatFloor = 5000 + BigFloatCeil = 5000 + BigFloatIsInt = 3000 + BigFloatSetBigInt = 3000 + BigFloatSetInt64 = 1000 + BigFloatGetConst = 1000 + +[WASMOpcodeCost] + Unreachable = 5 + Nop = 5 + Block = 5 + Loop = 5 + If = 5 + Else = 5 + End = 5 + Br = 5 + BrIf = 5 + BrTable = 5 + Return = 5 + Call = 5 + CallIndirect = 5 + Drop = 5 + Select = 5 + TypedSelect = 5 + LocalGet = 5 + LocalSet = 5 + LocalTee = 5 + GlobalGet = 5 + GlobalSet = 5 + I32Load = 5 + I64Load = 5 + F32Load = 6 + F64Load = 6 + I32Load8S = 5 + I32Load8U = 5 + I32Load16S = 5 + I32Load16U = 5 + I64Load8S = 5 + I64Load8U = 5 + I64Load16S = 5 + I64Load16U = 5 + I64Load32S = 5 + I64Load32U = 5 + I32Store = 5 + I64Store = 5 + F32Store = 12 + F64Store = 12 + I32Store8 = 5 + I32Store16 = 5 + I64Store8 = 5 + I64Store16 = 5 + I64Store32 = 5 + MemorySize = 5 + MemoryGrow = 1000000 + I32Const = 5 + I64Const = 5 + F32Const = 5 + F64Const = 5 + RefNull = 5 + RefIsNull = 5 + RefFunc = 5 + I32Eqz = 5 + I32Eq = 5 + I32Ne = 5 + I32LtS = 5 + I32LtU = 5 + I32GtS = 5 + I32GtU = 5 + I32LeS = 5 + I32LeU = 5 + I32GeS = 5 + I32GeU = 5 + I64Eqz = 5 + I64Eq = 5 + I64Ne = 5 + I64LtS = 5 + I64LtU = 5 + I64GtS = 5 + I64GtU = 5 + I64LeS = 5 + I64LeU = 5 + I64GeS = 5 + I64GeU = 5 + F32Eq = 6 + F32Ne = 6 + F32Lt = 6 + F32Gt = 6 + F32Le = 6 + F32Ge = 6 + F64Eq = 6 + F64Ne = 6 + F64Lt = 6 + F64Gt = 6 + F64Le = 6 + F64Ge = 6 + I32Clz = 100 + I32Ctz = 100 + I32Popcnt = 100 + I32Add = 5 + I32Sub = 5 + I32Mul = 5 + I32DivS = 18 + I32DivU = 18 + I32RemS = 18 + I32RemU = 18 + I32And = 5 + I32Or = 5 + I32Xor = 5 + I32Shl = 5 + I32ShrS = 5 + I32ShrU = 5 + I32Rotl = 5 + I32Rotr = 5 + I64Clz = 100 + I64Ctz = 100 + I64Popcnt = 100 + I64Add = 5 + I64Sub = 5 + I64Mul = 5 + I64DivS = 18 + I64DivU = 18 + I64RemS = 18 + I64RemU = 18 + I64And = 5 + I64Or = 5 + I64Xor = 5 + I64Shl = 5 + I64ShrS = 5 + I64ShrU = 5 + I64Rotl = 5 + I64Rotr = 5 + F32Abs = 5 + F32Neg = 5 + F32Ceil = 100 + F32Floor = 100 + F32Trunc = 100 + F32Nearest = 100 + F32Sqrt = 100 + F32Add = 5 + F32Sub = 5 + F32Mul = 15 + F32Div = 100 + F32Min = 15 + F32Max = 15 + F32Copysign = 5 + F64Abs = 5 + F64Neg = 5 + F64Ceil = 100 + F64Floor = 100 + F64Trunc = 100 + F64Nearest = 100 + F64Sqrt = 100 + F64Add = 5 + F64Sub = 5 + F64Mul = 15 + F64Div = 100 + F64Min = 15 + F64Max = 15 + F64Copysign = 5 + I32WrapI64 = 9 + I32TruncF32S = 100 + I32TruncF32U = 100 + I32TruncF64S = 100 + I32TruncF64U = 100 + I64ExtendI32S = 9 + I64ExtendI32U = 9 + I64TruncF32S = 100 + I64TruncF32U = 100 + I64TruncF64S = 100 + I64TruncF64U = 100 + F32ConvertI32S = 100 + F32ConvertI32U = 100 + F32ConvertI64S = 100 + F32ConvertI64U = 100 + F32DemoteF64 = 100 + F64ConvertI32S = 100 + F64ConvertI32U = 100 + F64ConvertI64S = 100 + F64ConvertI64U = 100 + F64PromoteF32 = 100 + I32ReinterpretF32 = 100 + I64ReinterpretF64 = 100 + F32ReinterpretI32 = 100 + F64ReinterpretI64 = 100 + I32Extend8S = 9 + I32Extend16S = 9 + I64Extend8S = 9 + I64Extend16S = 9 + I64Extend32S = 9 + I32TruncSatF32S = 100 + I32TruncSatF32U = 100 + I32TruncSatF64S = 100 + I32TruncSatF64U = 100 + I64TruncSatF32S = 100 + I64TruncSatF32U = 100 + I64TruncSatF64S = 100 + I64TruncSatF64U = 100 + MemoryInit = 5 + DataDrop = 5 + MemoryCopy = 5 + MemoryFill = 5 + TableInit = 10 + ElemDrop = 10 + TableCopy = 10 + TableFill = 10 + TableGet = 10 + TableSet = 10 + TableGrow = 10 + TableSize = 10 + AtomicNotify = 1000000 + I32AtomicWait = 1000000 + I64AtomicWait = 1000000 + AtomicFence = 1000000 + I32AtomicLoad = 1000000 + I64AtomicLoad = 1000000 + I32AtomicLoad8U = 1000000 + I32AtomicLoad16U = 1000000 + I64AtomicLoad8U = 1000000 + I64AtomicLoad16U = 1000000 + I64AtomicLoad32U = 1000000 + I32AtomicStore = 1000000 + I64AtomicStore = 1000000 + I32AtomicStore8 = 1000000 + I32AtomicStore16 = 1000000 + I64AtomicStore8 = 1000000 + I64AtomicStore16 = 1000000 + I64AtomicStore32 = 1000000 + I32AtomicRmwAdd = 1000000 + I64AtomicRmwAdd = 1000000 + I32AtomicRmw8AddU = 1000000 + I32AtomicRmw16AddU = 1000000 + I64AtomicRmw8AddU = 1000000 + I64AtomicRmw16AddU = 1000000 + I64AtomicRmw32AddU = 1000000 + I32AtomicRmwSub = 1000000 + I64AtomicRmwSub = 1000000 + I32AtomicRmw8SubU = 1000000 + I32AtomicRmw16SubU = 1000000 + I64AtomicRmw8SubU = 1000000 + I64AtomicRmw16SubU = 1000000 + I64AtomicRmw32SubU = 1000000 + I32AtomicRmwAnd = 1000000 + I64AtomicRmwAnd = 1000000 + I32AtomicRmw8AndU = 1000000 + I32AtomicRmw16AndU = 1000000 + I64AtomicRmw8AndU = 1000000 + I64AtomicRmw16AndU = 1000000 + I64AtomicRmw32AndU = 1000000 + I32AtomicRmwOr = 1000000 + I64AtomicRmwOr = 1000000 + I32AtomicRmw8OrU = 1000000 + I32AtomicRmw16OrU = 1000000 + I64AtomicRmw8OrU = 1000000 + I64AtomicRmw16OrU = 1000000 + I64AtomicRmw32OrU = 1000000 + I32AtomicRmwXor = 1000000 + I64AtomicRmwXor = 1000000 + I32AtomicRmw8XorU = 1000000 + I32AtomicRmw16XorU = 1000000 + I64AtomicRmw8XorU = 1000000 + I64AtomicRmw16XorU = 1000000 + I64AtomicRmw32XorU = 1000000 + I32AtomicRmwXchg = 1000000 + I64AtomicRmwXchg = 1000000 + I32AtomicRmw8XchgU = 1000000 + I32AtomicRmw16XchgU = 1000000 + I64AtomicRmw8XchgU = 1000000 + I64AtomicRmw16XchgU = 1000000 + I64AtomicRmw32XchgU = 1000000 + I32AtomicRmwCmpxchg = 1000000 + I64AtomicRmwCmpxchg = 1000000 + I32AtomicRmw8CmpxchgU = 1000000 + I32AtomicRmw16CmpxchgU = 1000000 + I64AtomicRmw8CmpxchgU = 1000000 + I64AtomicRmw16CmpxchgU = 1000000 + I64AtomicRmw32CmpxchgU = 1000000 + V128Load = 1000000 + V128Store = 1000000 + V128Const = 1000000 + I8x16Splat = 1000000 + I8x16ExtractLaneS = 1000000 + I8x16ExtractLaneU = 1000000 + I8x16ReplaceLane = 1000000 + I16x8Splat = 1000000 + I16x8ExtractLaneS = 1000000 + I16x8ExtractLaneU = 1000000 + I16x8ReplaceLane = 1000000 + I32x4Splat = 1000000 + I32x4ExtractLane = 1000000 + I32x4ReplaceLane = 1000000 + I64x2Splat = 1000000 + I64x2ExtractLane = 1000000 + I64x2ReplaceLane = 1000000 + F32x4Splat = 1000000 + F32x4ExtractLane = 1000000 + F32x4ReplaceLane = 1000000 + F64x2Splat = 1000000 + F64x2ExtractLane = 1000000 + F64x2ReplaceLane = 1000000 + I8x16Eq = 1000000 + I8x16Ne = 1000000 + I8x16LtS = 1000000 + I8x16LtU = 1000000 + I8x16GtS = 1000000 + I8x16GtU = 1000000 + I8x16LeS = 1000000 + I8x16LeU = 1000000 + I8x16GeS = 1000000 + I8x16GeU = 1000000 + I16x8Eq = 1000000 + I16x8Ne = 1000000 + I16x8LtS = 1000000 + I16x8LtU = 1000000 + I16x8GtS = 1000000 + I16x8GtU = 1000000 + I16x8LeS = 1000000 + I16x8LeU = 1000000 + I16x8GeS = 1000000 + I16x8GeU = 1000000 + I32x4Eq = 1000000 + I32x4Ne = 1000000 + I32x4LtS = 1000000 + I32x4LtU = 1000000 + I32x4GtS = 1000000 + I32x4GtU = 1000000 + I32x4LeS = 1000000 + I32x4LeU = 1000000 + I32x4GeS = 1000000 + I32x4GeU = 1000000 + F32x4Eq = 1000000 + F32x4Ne = 1000000 + F32x4Lt = 1000000 + F32x4Gt = 1000000 + F32x4Le = 1000000 + F32x4Ge = 1000000 + F64x2Eq = 1000000 + F64x2Ne = 1000000 + F64x2Lt = 1000000 + F64x2Gt = 1000000 + F64x2Le = 1000000 + F64x2Ge = 1000000 + V128Not = 1000000 + V128And = 1000000 + V128AndNot = 1000000 + V128Or = 1000000 + V128Xor = 1000000 + V128Bitselect = 1000000 + I8x16Neg = 1000000 + I8x16AnyTrue = 1000000 + I8x16AllTrue = 1000000 + I8x16Shl = 1000000 + I8x16ShrS = 1000000 + I8x16ShrU = 1000000 + I8x16Add = 1000000 + I8x16AddSaturateS = 1000000 + I8x16AddSaturateU = 1000000 + I8x16Sub = 1000000 + I8x16SubSaturateS = 1000000 + I8x16SubSaturateU = 1000000 + I8x16MinS = 1000000 + I8x16MinU = 1000000 + I8x16MaxS = 1000000 + I8x16MaxU = 1000000 + I8x16Mul = 1000000 + I16x8Neg = 1000000 + I16x8AnyTrue = 1000000 + I16x8AllTrue = 1000000 + I16x8Shl = 1000000 + I16x8ShrS = 1000000 + I16x8ShrU = 1000000 + I16x8Add = 1000000 + I16x8AddSaturateS = 1000000 + I16x8AddSaturateU = 1000000 + I16x8Sub = 1000000 + I16x8SubSaturateS = 1000000 + I16x8SubSaturateU = 1000000 + I16x8Mul = 1000000 + I16x8MinS = 1000000 + I16x8MinU = 1000000 + I16x8MaxS = 1000000 + I16x8MaxU = 1000000 + I32x4Neg = 1000000 + I32x4AnyTrue = 1000000 + I32x4AllTrue = 1000000 + I32x4Shl = 1000000 + I32x4ShrS = 1000000 + I32x4ShrU = 1000000 + I32x4Add = 1000000 + I32x4Sub = 1000000 + I32x4Mul = 1000000 + I32x4MinS = 1000000 + I32x4MinU = 1000000 + I32x4MaxS = 1000000 + I32x4MaxU = 1000000 + I64x2Neg = 1000000 + I64x2AnyTrue = 1000000 + I64x2AllTrue = 1000000 + I64x2Shl = 1000000 + I64x2ShrS = 1000000 + I64x2ShrU = 1000000 + I64x2Add = 1000000 + I64x2Sub = 1000000 + I64x2Mul = 1000000 + F32x4Abs = 1000000 + F32x4Neg = 1000000 + F32x4Sqrt = 1000000 + F32x4Add = 1000000 + F32x4Sub = 1000000 + F32x4Mul = 1000000 + F32x4Div = 1000000 + F32x4Min = 1000000 + F32x4Max = 1000000 + F64x2Abs = 1000000 + F64x2Neg = 1000000 + F64x2Sqrt = 1000000 + F64x2Add = 1000000 + F64x2Sub = 1000000 + F64x2Mul = 1000000 + F64x2Div = 1000000 + F64x2Min = 1000000 + F64x2Max = 1000000 + I32x4TruncSatF32x4S = 1000000 + I32x4TruncSatF32x4U = 1000000 + I64x2TruncSatF64x2S = 1000000 + I64x2TruncSatF64x2U = 1000000 + F32x4ConvertI32x4S = 1000000 + F32x4ConvertI32x4U = 1000000 + F64x2ConvertI64x2S = 1000000 + F64x2ConvertI64x2U = 1000000 + V8x16Swizzle = 1000000 + V8x16Shuffle = 1000000 + V8x16LoadSplat = 1000000 + V16x8LoadSplat = 1000000 + V32x4LoadSplat = 1000000 + V64x2LoadSplat = 1000000 + I8x16NarrowI16x8S = 1000000 + I8x16NarrowI16x8U = 1000000 + I16x8NarrowI32x4S = 1000000 + I16x8NarrowI32x4U = 1000000 + I16x8WidenLowI8x16S = 1000000 + I16x8WidenHighI8x16S = 1000000 + I16x8WidenLowI8x16U = 1000000 + I16x8WidenHighI8x16U = 1000000 + I32x4WidenLowI16x8S = 1000000 + I32x4WidenHighI16x8S = 1000000 + I32x4WidenLowI16x8U = 1000000 + I32x4WidenHighI16x8U = 1000000 + I16x8Load8x8S = 1000000 + I16x8Load8x8U = 1000000 + I32x4Load16x4S = 1000000 + I32x4Load16x4U = 1000000 + I64x2Load32x2S = 1000000 + I64x2Load32x2U = 1000000 + I8x16RoundingAverageU = 1000000 + I16x8RoundingAverageU = 1000000 + LocalAllocate = 5 + LocalsUnmetered = 100 + MaxMemoryGrowDelta = 1 + MaxMemoryGrow = 10 diff --git a/process/smartContract/process.go b/process/smartContract/process.go index 7599493bbcf..3fd970fccfe 100644 --- a/process/smartContract/process.go +++ b/process/smartContract/process.go @@ -210,6 +210,8 @@ func NewSmartContractProcessor(args ArgsNewSmartContractProcessor) (*scProcessor } // GasScheduleChange sets the new gas schedule where it is needed +// Warning: do not use flags in this function as it will raise backward compatibility issues because the GasScheduleChange +// is not called on each epoch change func (sc *scProcessor) GasScheduleChange(gasSchedule map[string]map[string]uint64) { sc.mutGasLock.Lock() defer sc.mutGasLock.Unlock() @@ -220,10 +222,6 @@ func (sc *scProcessor) GasScheduleChange(gasSchedule map[string]map[string]uint6 } sc.builtInGasCosts = builtInFuncCost - isFixAsyncCallBackArgumentsParserFlagSet := sc.enableEpochsHandler.IsESDTMetadataContinuousCleanupFlagEnabled() - if isFixAsyncCallBackArgumentsParserFlagSet { - sc.builtInGasCosts[core.BuiltInFunctionMultiESDTNFTTransfer] = builtInFuncCost["ESDTNFTMultiTransfer"] - } sc.storePerByte = gasSchedule[common.BaseOperationCost]["StorePerByte"] sc.persistPerByte = gasSchedule[common.BaseOperationCost]["PersistPerByte"] } From 1abd9a244729f937f0a19ea0f81d6995ced45b35 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Wed, 19 Oct 2022 11:21:57 +0300 Subject: [PATCH 039/110] fixes after merge --- common/logging/errors.go | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 common/logging/errors.go diff --git a/common/logging/errors.go b/common/logging/errors.go deleted file mode 100644 index b5987551634..00000000000 --- a/common/logging/errors.go +++ /dev/null @@ -1,5 +0,0 @@ -package logging - -import "errors" - -var errInvalidParameter = errors.New("invalid parameter provided") From 7b5898a5519b3cdda876dc14fcb038e998e3177d Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Wed, 19 Oct 2022 11:47:52 +0300 Subject: [PATCH 040/110] fix after merge --- .../factory/heartbeatComponents/heartbeatComponents_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrationTests/factory/heartbeatComponents/heartbeatComponents_test.go b/integrationTests/factory/heartbeatComponents/heartbeatComponents_test.go index 9f8e945b2fc..3b75867c6a3 100644 --- a/integrationTests/factory/heartbeatComponents/heartbeatComponents_test.go +++ b/integrationTests/factory/heartbeatComponents/heartbeatComponents_test.go @@ -40,7 +40,7 @@ func TestHeartbeatComponents_Close_ShouldWork(t *testing.T) { require.Nil(t, err) managedNetworkComponents, err := nr.CreateManagedNetworkComponents(managedCoreComponents) require.Nil(t, err) - managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedCoreComponents, managedCryptoComponents, managedNetworkComponents) + managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedStatusCoreComponents, managedCoreComponents, managedCryptoComponents, managedNetworkComponents) require.Nil(t, err) managedDataComponents, err := nr.CreateManagedDataComponents(managedCoreComponents, managedBootstrapComponents) require.Nil(t, err) From bc9c7b567dba3670e4d07d2fb437ca5f37ff1f85 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Wed, 19 Oct 2022 12:47:33 +0300 Subject: [PATCH 041/110] fixes after review --- epochStart/bootstrap/process.go | 48 +++++----- factory/bootstrap/bootstrapComponents.go | 7 +- factory/consensus/consensusComponents.go | 24 ++--- heartbeat/sender/peerAuthenticationSender.go | 5 +- .../state/stateTrieSync/stateTrieSync_test.go | 22 ++--- node/nodeRunner.go | 24 ++--- state/syncer/baseAccountsSyncer.go | 94 +++++++++---------- state/syncer/userAccountsSyncer.go | 36 +++---- state/syncer/validatorAccountsSyncer.go | 32 +++---- .../accountDBSyncerContainerFactory.go | 24 ++--- 10 files changed, 161 insertions(+), 155 deletions(-) diff --git a/epochStart/bootstrap/process.go b/epochStart/bootstrap/process.go index 914bc634670..00ac3a71710 100644 --- a/epochStart/bootstrap/process.go +++ b/epochStart/bootstrap/process.go @@ -1050,18 +1050,18 @@ func (e *epochStartBootstrap) syncUserAccountsState(rootHash []byte) error { argsUserAccountsSyncer := syncer.ArgsNewUserAccountsSyncer{ ArgsNewBaseAccountsSyncer: syncer.ArgsNewBaseAccountsSyncer{ - Hasher: e.coreComponentsHolder.Hasher(), - Marshalizer: e.coreComponentsHolder.InternalMarshalizer(), - TrieStorageManager: trieStorageManager, - RequestHandler: e.requestHandler, - Timeout: common.TimeoutGettingTrieNodes, - Cacher: e.dataPool.TrieNodes(), - MaxTrieLevelInMemory: e.generalConfig.StateTriesConfig.MaxStateTrieLevelInMemory, - MaxHardCapForMissingNodes: e.maxHardCapForMissingNodes, - TrieSyncerVersion: e.trieSyncerVersion, - CheckNodesOnDisk: e.checkNodesOnDisk, - StorageMarker: storageMarker.NewTrieStorageMarker(), - SyncStatisticsHandler: e.trieSyncStatisticsProvider, + Hasher: e.coreComponentsHolder.Hasher(), + Marshalizer: e.coreComponentsHolder.InternalMarshalizer(), + TrieStorageManager: trieStorageManager, + RequestHandler: e.requestHandler, + Timeout: common.TimeoutGettingTrieNodes, + Cacher: e.dataPool.TrieNodes(), + MaxTrieLevelInMemory: e.generalConfig.StateTriesConfig.MaxStateTrieLevelInMemory, + MaxHardCapForMissingNodes: e.maxHardCapForMissingNodes, + TrieSyncerVersion: e.trieSyncerVersion, + CheckNodesOnDisk: e.checkNodesOnDisk, + StorageMarker: storageMarker.NewTrieStorageMarker(), + UserAccountsSyncStatisticsHandler: e.trieSyncStatisticsProvider, }, ShardId: e.shardCoordinator.SelfId(), Throttler: thr, @@ -1118,18 +1118,18 @@ func (e *epochStartBootstrap) syncValidatorAccountsState(rootHash []byte) error argsValidatorAccountsSyncer := syncer.ArgsNewValidatorAccountsSyncer{ ArgsNewBaseAccountsSyncer: syncer.ArgsNewBaseAccountsSyncer{ - Hasher: e.coreComponentsHolder.Hasher(), - Marshalizer: e.coreComponentsHolder.InternalMarshalizer(), - TrieStorageManager: peerTrieStorageManager, - RequestHandler: e.requestHandler, - Timeout: common.TimeoutGettingTrieNodes, - Cacher: e.dataPool.TrieNodes(), - MaxTrieLevelInMemory: e.generalConfig.StateTriesConfig.MaxPeerTrieLevelInMemory, - MaxHardCapForMissingNodes: e.maxHardCapForMissingNodes, - TrieSyncerVersion: e.trieSyncerVersion, - CheckNodesOnDisk: e.checkNodesOnDisk, - StorageMarker: storageMarker.NewTrieStorageMarker(), - SyncStatisticsHandler: statistics.NewTrieSyncStatistics(), + Hasher: e.coreComponentsHolder.Hasher(), + Marshalizer: e.coreComponentsHolder.InternalMarshalizer(), + TrieStorageManager: peerTrieStorageManager, + RequestHandler: e.requestHandler, + Timeout: common.TimeoutGettingTrieNodes, + Cacher: e.dataPool.TrieNodes(), + MaxTrieLevelInMemory: e.generalConfig.StateTriesConfig.MaxPeerTrieLevelInMemory, + MaxHardCapForMissingNodes: e.maxHardCapForMissingNodes, + TrieSyncerVersion: e.trieSyncerVersion, + CheckNodesOnDisk: e.checkNodesOnDisk, + StorageMarker: storageMarker.NewTrieStorageMarker(), + UserAccountsSyncStatisticsHandler: statistics.NewTrieSyncStatistics(), }, } accountsDBSyncer, err := syncer.NewValidatorAccountsSyncer(argsValidatorAccountsSyncer) diff --git a/factory/bootstrap/bootstrapComponents.go b/factory/bootstrap/bootstrapComponents.go index 2a9f1db97fd..4cba3114aae 100644 --- a/factory/bootstrap/bootstrapComponents.go +++ b/factory/bootstrap/bootstrapComponents.go @@ -168,6 +168,11 @@ func (bcf *bootstrapComponentsFactory) Create() (*bootstrapComponents, error) { dataSyncerFactory := bootstrap.NewScheduledDataSyncerFactory() + // increment num received to make sure that first heartbeat message + // will have value 1, thus explorer will display status in progress + tss := bcf.statusCoreComponents.TrieSyncStatistics() + tss.AddNumReceived(1) + epochStartBootstrapArgs := bootstrap.ArgsEpochStartBootstrap{ CoreComponentsHolder: bcf.coreComponents, CryptoComponentsHolder: bcf.cryptoComponents, @@ -189,7 +194,7 @@ func (bcf *bootstrapComponentsFactory) Create() (*bootstrapComponents, error) { HeaderIntegrityVerifier: headerIntegrityVerifier, DataSyncerCreator: dataSyncerFactory, ScheduledSCRsStorer: nil, // will be updated after sync from network - TrieSyncStatisticsProvider: bcf.statusCoreComponents.TrieSyncStatistics(), + TrieSyncStatisticsProvider: tss, } var epochStartBootstrapper factory.EpochStartBootstrapper diff --git a/factory/consensus/consensusComponents.go b/factory/consensus/consensusComponents.go index 9ad73da6db7..2a044dd5413 100644 --- a/factory/consensus/consensusComponents.go +++ b/factory/consensus/consensusComponents.go @@ -492,18 +492,18 @@ func (ccf *consensusComponentsFactory) createShardBootstrapper() (process.Bootst func (ccf *consensusComponentsFactory) createArgsBaseAccountsSyncer(trieStorageManager common.StorageManager) syncer.ArgsNewBaseAccountsSyncer { return syncer.ArgsNewBaseAccountsSyncer{ - Hasher: ccf.coreComponents.Hasher(), - Marshalizer: ccf.coreComponents.InternalMarshalizer(), - TrieStorageManager: trieStorageManager, - RequestHandler: ccf.processComponents.RequestHandler(), - Timeout: common.TimeoutGettingTrieNodes, - Cacher: ccf.dataComponents.Datapool().TrieNodes(), - MaxTrieLevelInMemory: ccf.config.StateTriesConfig.MaxStateTrieLevelInMemory, - MaxHardCapForMissingNodes: ccf.config.TrieSync.MaxHardCapForMissingNodes, - TrieSyncerVersion: ccf.config.TrieSync.TrieSyncerVersion, - CheckNodesOnDisk: ccf.config.TrieSync.CheckNodesOnDisk, - StorageMarker: storageMarker.NewTrieStorageMarker(), - SyncStatisticsHandler: statistics.NewTrieSyncStatistics(), + Hasher: ccf.coreComponents.Hasher(), + Marshalizer: ccf.coreComponents.InternalMarshalizer(), + TrieStorageManager: trieStorageManager, + RequestHandler: ccf.processComponents.RequestHandler(), + Timeout: common.TimeoutGettingTrieNodes, + Cacher: ccf.dataComponents.Datapool().TrieNodes(), + MaxTrieLevelInMemory: ccf.config.StateTriesConfig.MaxStateTrieLevelInMemory, + MaxHardCapForMissingNodes: ccf.config.TrieSync.MaxHardCapForMissingNodes, + TrieSyncerVersion: ccf.config.TrieSync.TrieSyncerVersion, + CheckNodesOnDisk: ccf.config.TrieSync.CheckNodesOnDisk, + StorageMarker: storageMarker.NewTrieStorageMarker(), + UserAccountsSyncStatisticsHandler: statistics.NewTrieSyncStatistics(), } } diff --git a/heartbeat/sender/peerAuthenticationSender.go b/heartbeat/sender/peerAuthenticationSender.go index 5dcea5d0a3c..c6f1eb4d003 100644 --- a/heartbeat/sender/peerAuthenticationSender.go +++ b/heartbeat/sender/peerAuthenticationSender.go @@ -116,9 +116,8 @@ func (sender *peerAuthenticationSender) execute() (error, bool) { hardforkPayload, isTriggered := sender.getHardforkPayload() payload := &heartbeat.Payload{ - Timestamp: time.Now().Unix(), - HardforkMessage: string(hardforkPayload), - NumTrieNodesSynced: 0, // sent through heartbeat v2 message + Timestamp: time.Now().Unix(), + HardforkMessage: string(hardforkPayload), } payloadBytes, err := sender.marshaller.Marshal(payload) if err != nil { diff --git a/integrationTests/state/stateTrieSync/stateTrieSync_test.go b/integrationTests/state/stateTrieSync/stateTrieSync_test.go index 7d425123a9f..c5d6c8dcea2 100644 --- a/integrationTests/state/stateTrieSync/stateTrieSync_test.go +++ b/integrationTests/state/stateTrieSync/stateTrieSync_test.go @@ -597,17 +597,17 @@ func getUserAccountSyncerArgs(node *integrationTests.TestProcessorNode, version thr, _ := throttler.NewNumGoRoutinesThrottler(50) syncerArgs := syncer.ArgsNewUserAccountsSyncer{ ArgsNewBaseAccountsSyncer: syncer.ArgsNewBaseAccountsSyncer{ - Hasher: integrationTests.TestHasher, - Marshalizer: integrationTests.TestMarshalizer, - TrieStorageManager: node.TrieStorageManagers[trieFactory.UserAccountTrie], - RequestHandler: node.RequestHandler, - Timeout: common.TimeoutGettingTrieNodes, - Cacher: node.DataPool.TrieNodes(), - MaxTrieLevelInMemory: 200, - MaxHardCapForMissingNodes: 5000, - TrieSyncerVersion: version, - StorageMarker: storageMarker.NewTrieStorageMarker(), - SyncStatisticsHandler: statistics.NewTrieSyncStatistics(), + Hasher: integrationTests.TestHasher, + Marshalizer: integrationTests.TestMarshalizer, + TrieStorageManager: node.TrieStorageManagers[trieFactory.UserAccountTrie], + RequestHandler: node.RequestHandler, + Timeout: common.TimeoutGettingTrieNodes, + Cacher: node.DataPool.TrieNodes(), + MaxTrieLevelInMemory: 200, + MaxHardCapForMissingNodes: 5000, + TrieSyncerVersion: version, + StorageMarker: storageMarker.NewTrieStorageMarker(), + UserAccountsSyncStatisticsHandler: statistics.NewTrieSyncStatistics(), }, ShardId: 0, Throttler: thr, diff --git a/node/nodeRunner.go b/node/nodeRunner.go index 0981cb9a959..64cae4c1653 100644 --- a/node/nodeRunner.go +++ b/node/nodeRunner.go @@ -670,18 +670,18 @@ func getBaseAccountSyncerArgs( maxTrieLevelInMemory uint, ) syncer.ArgsNewBaseAccountsSyncer { return syncer.ArgsNewBaseAccountsSyncer{ - Hasher: coreComponents.Hasher(), - Marshalizer: coreComponents.InternalMarshalizer(), - TrieStorageManager: storageManager, - RequestHandler: processComponents.RequestHandler(), - Timeout: common.TimeoutGettingTrieNodes, - Cacher: dataComponents.Datapool().TrieNodes(), - MaxTrieLevelInMemory: maxTrieLevelInMemory, - MaxHardCapForMissingNodes: config.TrieSync.MaxHardCapForMissingNodes, - TrieSyncerVersion: config.TrieSync.TrieSyncerVersion, - StorageMarker: storageMarker.NewDisabledStorageMarker(), - CheckNodesOnDisk: true, - SyncStatisticsHandler: trieStatistics.NewTrieSyncStatistics(), + Hasher: coreComponents.Hasher(), + Marshalizer: coreComponents.InternalMarshalizer(), + TrieStorageManager: storageManager, + RequestHandler: processComponents.RequestHandler(), + Timeout: common.TimeoutGettingTrieNodes, + Cacher: dataComponents.Datapool().TrieNodes(), + MaxTrieLevelInMemory: maxTrieLevelInMemory, + MaxHardCapForMissingNodes: config.TrieSync.MaxHardCapForMissingNodes, + TrieSyncerVersion: config.TrieSync.TrieSyncerVersion, + StorageMarker: storageMarker.NewDisabledStorageMarker(), + CheckNodesOnDisk: true, + UserAccountsSyncStatisticsHandler: trieStatistics.NewTrieSyncStatistics(), } } diff --git a/state/syncer/baseAccountsSyncer.go b/state/syncer/baseAccountsSyncer.go index 7300e70ffd9..6d7f540a47c 100644 --- a/state/syncer/baseAccountsSyncer.go +++ b/state/syncer/baseAccountsSyncer.go @@ -18,22 +18,22 @@ import ( ) type baseAccountsSyncer struct { - hasher hashing.Hasher - marshalizer marshal.Marshalizer - dataTries map[string]struct{} - mutex sync.Mutex - trieStorageManager common.StorageManager - requestHandler trie.RequestHandler - timeoutHandler trie.TimeoutHandler - shardId uint32 - cacher storage.Cacher - rootHash []byte - maxTrieLevelInMemory uint - name string - maxHardCapForMissingNodes int - checkNodesOnDisk bool - storageMarker trie.StorageMarker - syncStatisticsHandler common.SizeSyncStatisticsHandler + hasher hashing.Hasher + marshalizer marshal.Marshalizer + dataTries map[string]struct{} + mutex sync.Mutex + trieStorageManager common.StorageManager + requestHandler trie.RequestHandler + timeoutHandler trie.TimeoutHandler + shardId uint32 + cacher storage.Cacher + rootHash []byte + maxTrieLevelInMemory uint + name string + maxHardCapForMissingNodes int + checkNodesOnDisk bool + storageMarker trie.StorageMarker + userAccountsSyncStatisticsHandler common.SizeSyncStatisticsHandler trieSyncerVersion int numTriesSynced int32 @@ -44,18 +44,18 @@ const timeBetweenStatisticsPrints = time.Second * 2 // ArgsNewBaseAccountsSyncer defines the arguments needed for the new account syncer type ArgsNewBaseAccountsSyncer struct { - Hasher hashing.Hasher - Marshalizer marshal.Marshalizer - TrieStorageManager common.StorageManager - StorageMarker trie.StorageMarker - RequestHandler trie.RequestHandler - Timeout time.Duration - Cacher storage.Cacher - SyncStatisticsHandler common.SizeSyncStatisticsHandler - MaxTrieLevelInMemory uint - MaxHardCapForMissingNodes int - TrieSyncerVersion int - CheckNodesOnDisk bool + Hasher hashing.Hasher + Marshalizer marshal.Marshalizer + TrieStorageManager common.StorageManager + StorageMarker trie.StorageMarker + RequestHandler trie.RequestHandler + Timeout time.Duration + Cacher storage.Cacher + UserAccountsSyncStatisticsHandler common.SizeSyncStatisticsHandler + MaxTrieLevelInMemory uint + MaxHardCapForMissingNodes int + TrieSyncerVersion int + CheckNodesOnDisk bool } func checkArgs(args ArgsNewBaseAccountsSyncer) error { @@ -74,7 +74,7 @@ func checkArgs(args ArgsNewBaseAccountsSyncer) error { if check.IfNil(args.Cacher) { return state.ErrNilCacher } - if check.IfNil(args.SyncStatisticsHandler) { + if check.IfNil(args.UserAccountsSyncStatisticsHandler) { return state.ErrNilSyncStatisticsHandler } if args.MaxHardCapForMissingNodes < 1 { @@ -107,7 +107,7 @@ func (b *baseAccountsSyncer) syncMainTrie( Hasher: b.hasher, ShardId: b.shardId, Topic: trieTopic, - TrieSyncStatistics: b.syncStatisticsHandler, + TrieSyncStatistics: b.userAccountsSyncStatisticsHandler, TimeoutHandler: b.timeoutHandler, MaxHardCapForMissingNodes: b.maxHardCapForMissingNodes, CheckNodesOnDisk: b.checkNodesOnDisk, @@ -139,27 +139,27 @@ func (b *baseAccountsSyncer) printStatistics(ctx context.Context) { peakSpeed := convertBytesPerIntervalToSpeed(peakDataReceived, timeBetweenStatisticsPrints) finishedSync := time.Now() totalSyncDuration := finishedSync.Sub(startedSync) - averageSpeed := convertBytesPerIntervalToSpeed(b.syncStatisticsHandler.NumBytesReceived(), totalSyncDuration) + averageSpeed := convertBytesPerIntervalToSpeed(b.userAccountsSyncStatisticsHandler.NumBytesReceived(), totalSyncDuration) log.Info("finished trie sync", "name", b.name, "time elapsed", totalSyncDuration.Truncate(time.Second), - "num processed", b.syncStatisticsHandler.NumReceived(), - "num large nodes", b.syncStatisticsHandler.NumLarge(), - "num missing", b.syncStatisticsHandler.NumMissing(), - "state data size", core.ConvertBytes(b.syncStatisticsHandler.NumBytesReceived()), - "total iterations", b.syncStatisticsHandler.NumIterations(), - "total CPU time", b.syncStatisticsHandler.ProcessingTime(), + "num processed", b.userAccountsSyncStatisticsHandler.NumReceived(), + "num large nodes", b.userAccountsSyncStatisticsHandler.NumLarge(), + "num missing", b.userAccountsSyncStatisticsHandler.NumMissing(), + "state data size", core.ConvertBytes(b.userAccountsSyncStatisticsHandler.NumBytesReceived()), + "total iterations", b.userAccountsSyncStatisticsHandler.NumIterations(), + "total CPU time", b.userAccountsSyncStatisticsHandler.ProcessingTime(), "peak processing speed", peakSpeed, "average processing speed", averageSpeed, ) return case <-time.After(timeBetweenStatisticsPrints): - bytesReceivedDelta := b.syncStatisticsHandler.NumBytesReceived() - lastDataReceived - if b.syncStatisticsHandler.NumBytesReceived() < lastDataReceived { + bytesReceivedDelta := b.userAccountsSyncStatisticsHandler.NumBytesReceived() - lastDataReceived + if b.userAccountsSyncStatisticsHandler.NumBytesReceived() < lastDataReceived { bytesReceivedDelta = 0 } - lastDataReceived = b.syncStatisticsHandler.NumBytesReceived() + lastDataReceived = b.userAccountsSyncStatisticsHandler.NumBytesReceived() speed := convertBytesPerIntervalToSpeed(bytesReceivedDelta, timeBetweenStatisticsPrints) if peakDataReceived < bytesReceivedDelta { @@ -169,16 +169,16 @@ func (b *baseAccountsSyncer) printStatistics(ctx context.Context) { log.Info("trie sync in progress", "name", b.name, "time elapsed", time.Since(startedSync).Truncate(time.Second), - "num tries currently syncing", b.syncStatisticsHandler.NumTries(), - "num processed", b.syncStatisticsHandler.NumReceived(), - "num large nodes", b.syncStatisticsHandler.NumLarge(), - "num missing", b.syncStatisticsHandler.NumMissing(), + "num tries currently syncing", b.userAccountsSyncStatisticsHandler.NumTries(), + "num processed", b.userAccountsSyncStatisticsHandler.NumReceived(), + "num large nodes", b.userAccountsSyncStatisticsHandler.NumLarge(), + "num missing", b.userAccountsSyncStatisticsHandler.NumMissing(), "num tries synced", fmt.Sprintf("%d/%d", atomic.LoadInt32(&b.numTriesSynced), atomic.LoadInt32(&b.numMaxTries)), "intercepted trie nodes cache size", core.ConvertBytes(b.cacher.SizeInBytesContained()), "num of intercepted trie nodes", b.cacher.Len(), - "state data size", core.ConvertBytes(b.syncStatisticsHandler.NumBytesReceived()), - "iterations", b.syncStatisticsHandler.NumIterations(), - "CPU time", b.syncStatisticsHandler.ProcessingTime(), + "state data size", core.ConvertBytes(b.userAccountsSyncStatisticsHandler.NumBytesReceived()), + "iterations", b.userAccountsSyncStatisticsHandler.NumIterations(), + "CPU time", b.userAccountsSyncStatisticsHandler.ProcessingTime(), "processing speed", speed) } } diff --git a/state/syncer/userAccountsSyncer.go b/state/syncer/userAccountsSyncer.go index da2752c10d0..a170fac847a 100644 --- a/state/syncer/userAccountsSyncer.go +++ b/state/syncer/userAccountsSyncer.go @@ -74,22 +74,22 @@ func NewUserAccountsSyncer(args ArgsNewUserAccountsSyncer) (*userAccountsSyncer, } b := &baseAccountsSyncer{ - hasher: args.Hasher, - marshalizer: args.Marshalizer, - dataTries: make(map[string]struct{}), - trieStorageManager: args.TrieStorageManager, - requestHandler: args.RequestHandler, - timeoutHandler: timeoutHandler, - shardId: args.ShardId, - cacher: args.Cacher, - rootHash: nil, - maxTrieLevelInMemory: args.MaxTrieLevelInMemory, - name: fmt.Sprintf("user accounts for shard %s", core.GetShardIDString(args.ShardId)), - maxHardCapForMissingNodes: args.MaxHardCapForMissingNodes, - trieSyncerVersion: args.TrieSyncerVersion, - checkNodesOnDisk: args.CheckNodesOnDisk, - storageMarker: args.StorageMarker, - syncStatisticsHandler: args.SyncStatisticsHandler, + hasher: args.Hasher, + marshalizer: args.Marshalizer, + dataTries: make(map[string]struct{}), + trieStorageManager: args.TrieStorageManager, + requestHandler: args.RequestHandler, + timeoutHandler: timeoutHandler, + shardId: args.ShardId, + cacher: args.Cacher, + rootHash: nil, + maxTrieLevelInMemory: args.MaxTrieLevelInMemory, + name: fmt.Sprintf("user accounts for shard %s", core.GetShardIDString(args.ShardId)), + maxHardCapForMissingNodes: args.MaxHardCapForMissingNodes, + trieSyncerVersion: args.TrieSyncerVersion, + checkNodesOnDisk: args.CheckNodesOnDisk, + storageMarker: args.StorageMarker, + userAccountsSyncStatisticsHandler: args.UserAccountsSyncStatisticsHandler, } u := &userAccountsSyncer{ @@ -135,6 +135,8 @@ func (u *userAccountsSyncer) SyncAccounts(rootHash []byte) error { u.storageMarker.MarkStorerAsSyncedAndActive(mainTrie.GetStorageManager()) + u.userAccountsSyncStatisticsHandler.Reset() + return nil } @@ -157,7 +159,7 @@ func (u *userAccountsSyncer) syncDataTrie(rootHash []byte, address []byte, ctx c Hasher: u.hasher, ShardId: u.shardId, Topic: factory.AccountTrieNodesTopic, - TrieSyncStatistics: u.syncStatisticsHandler, + TrieSyncStatistics: u.userAccountsSyncStatisticsHandler, TimeoutHandler: u.timeoutHandler, MaxHardCapForMissingNodes: u.maxHardCapForMissingNodes, CheckNodesOnDisk: u.checkNodesOnDisk, diff --git a/state/syncer/validatorAccountsSyncer.go b/state/syncer/validatorAccountsSyncer.go index 831db84fcce..c32d3f5c159 100644 --- a/state/syncer/validatorAccountsSyncer.go +++ b/state/syncer/validatorAccountsSyncer.go @@ -34,22 +34,22 @@ func NewValidatorAccountsSyncer(args ArgsNewValidatorAccountsSyncer) (*validator } b := &baseAccountsSyncer{ - hasher: args.Hasher, - marshalizer: args.Marshalizer, - dataTries: make(map[string]struct{}), - trieStorageManager: args.TrieStorageManager, - requestHandler: args.RequestHandler, - timeoutHandler: timeoutHandler, - shardId: core.MetachainShardId, - cacher: args.Cacher, - rootHash: nil, - maxTrieLevelInMemory: args.MaxTrieLevelInMemory, - name: "peer accounts", - maxHardCapForMissingNodes: args.MaxHardCapForMissingNodes, - trieSyncerVersion: args.TrieSyncerVersion, - checkNodesOnDisk: args.CheckNodesOnDisk, - storageMarker: args.StorageMarker, - syncStatisticsHandler: statistics.NewTrieSyncStatistics(), + hasher: args.Hasher, + marshalizer: args.Marshalizer, + dataTries: make(map[string]struct{}), + trieStorageManager: args.TrieStorageManager, + requestHandler: args.RequestHandler, + timeoutHandler: timeoutHandler, + shardId: core.MetachainShardId, + cacher: args.Cacher, + rootHash: nil, + maxTrieLevelInMemory: args.MaxTrieLevelInMemory, + name: "peer accounts", + maxHardCapForMissingNodes: args.MaxHardCapForMissingNodes, + trieSyncerVersion: args.TrieSyncerVersion, + checkNodesOnDisk: args.CheckNodesOnDisk, + storageMarker: args.StorageMarker, + userAccountsSyncStatisticsHandler: statistics.NewTrieSyncStatistics(), } u := &validatorAccountsSyncer{ diff --git a/update/factory/accountDBSyncerContainerFactory.go b/update/factory/accountDBSyncerContainerFactory.go index 666f7b53995..a62e9b1327e 100644 --- a/update/factory/accountDBSyncerContainerFactory.go +++ b/update/factory/accountDBSyncerContainerFactory.go @@ -139,18 +139,18 @@ func (a *accountDBSyncersContainerFactory) createUserAccountsSyncer(shardId uint args := syncer.ArgsNewUserAccountsSyncer{ ArgsNewBaseAccountsSyncer: syncer.ArgsNewBaseAccountsSyncer{ - Hasher: a.hasher, - Marshalizer: a.marshalizer, - TrieStorageManager: a.trieStorageManager, - RequestHandler: a.requestHandler, - Timeout: a.timeoutGettingTrieNode, - Cacher: a.trieCacher, - MaxTrieLevelInMemory: a.maxTrieLevelinMemory, - MaxHardCapForMissingNodes: a.maxHardCapForMissingNodes, - TrieSyncerVersion: a.trieSyncerVersion, - CheckNodesOnDisk: a.checkNodesOnDisk, - StorageMarker: storageMarker.NewTrieStorageMarker(), - SyncStatisticsHandler: statistics.NewTrieSyncStatistics(), + Hasher: a.hasher, + Marshalizer: a.marshalizer, + TrieStorageManager: a.trieStorageManager, + RequestHandler: a.requestHandler, + Timeout: a.timeoutGettingTrieNode, + Cacher: a.trieCacher, + MaxTrieLevelInMemory: a.maxTrieLevelinMemory, + MaxHardCapForMissingNodes: a.maxHardCapForMissingNodes, + TrieSyncerVersion: a.trieSyncerVersion, + CheckNodesOnDisk: a.checkNodesOnDisk, + StorageMarker: storageMarker.NewTrieStorageMarker(), + UserAccountsSyncStatisticsHandler: statistics.NewTrieSyncStatistics(), }, ShardId: shardId, Throttler: thr, From 0d867ac44ca9ae48ddf4f554c39bf07409808820 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Wed, 19 Oct 2022 14:45:58 +0300 Subject: [PATCH 042/110] move the reset of the user accounts sync statistics component just after last print --- state/syncer/baseAccountsSyncer.go | 1 + state/syncer/userAccountsSyncer.go | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/state/syncer/baseAccountsSyncer.go b/state/syncer/baseAccountsSyncer.go index 6d7f540a47c..6478d559af2 100644 --- a/state/syncer/baseAccountsSyncer.go +++ b/state/syncer/baseAccountsSyncer.go @@ -153,6 +153,7 @@ func (b *baseAccountsSyncer) printStatistics(ctx context.Context) { "peak processing speed", peakSpeed, "average processing speed", averageSpeed, ) + b.userAccountsSyncStatisticsHandler.Reset() return case <-time.After(timeBetweenStatisticsPrints): bytesReceivedDelta := b.userAccountsSyncStatisticsHandler.NumBytesReceived() - lastDataReceived diff --git a/state/syncer/userAccountsSyncer.go b/state/syncer/userAccountsSyncer.go index a170fac847a..c9818e08c3f 100644 --- a/state/syncer/userAccountsSyncer.go +++ b/state/syncer/userAccountsSyncer.go @@ -135,8 +135,6 @@ func (u *userAccountsSyncer) SyncAccounts(rootHash []byte) error { u.storageMarker.MarkStorerAsSyncedAndActive(mainTrie.GetStorageManager()) - u.userAccountsSyncStatisticsHandler.Reset() - return nil } From 57d663129ed19fa8ee912f5c9515b3e7232d1a9b Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Wed, 19 Oct 2022 15:50:56 +0300 Subject: [PATCH 043/110] moved NumTrieNodesSynced on HeartbeatV2 message instead of Payload for future compatibility --- epochStart/bootstrap/process.go | 7 ++ heartbeat/heartbeat.pb.go | 154 +++++++++++------------ heartbeat/monitor/monitor.go | 2 +- heartbeat/monitor/monitor_test.go | 35 +++--- heartbeat/proto/heartbeat.proto | 20 +-- heartbeat/sender/heartbeatSender.go | 22 ++-- heartbeat/sender/heartbeatSender_test.go | 5 +- 7 files changed, 122 insertions(+), 123 deletions(-) diff --git a/epochStart/bootstrap/process.go b/epochStart/bootstrap/process.go index 00ac3a71710..fd242d26eff 100644 --- a/epochStart/bootstrap/process.go +++ b/epochStart/bootstrap/process.go @@ -1242,6 +1242,13 @@ func (e *epochStartBootstrap) createHeartbeatSender() error { } heartbeatTopic := common.HeartbeatV2Topic + e.shardCoordinator.CommunicationIdentifier(e.shardCoordinator.SelfId()) + if !e.messenger.HasTopic(heartbeatTopic) { + err = e.messenger.CreateTopic(heartbeatTopic, true) + if err != nil { + return err + } + } + peerSubType := core.RegularPeer if e.prefsConfig.FullArchive { peerSubType = core.FullHistoryObserver diff --git a/heartbeat/heartbeat.pb.go b/heartbeat/heartbeat.pb.go index f201d913139..95f37860135 100644 --- a/heartbeat/heartbeat.pb.go +++ b/heartbeat/heartbeat.pb.go @@ -28,13 +28,14 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // HeartbeatV2 represents the heartbeat message that is sent between peers from the same shard containing // current node status type HeartbeatV2 struct { - Payload []byte `protobuf:"bytes,1,opt,name=Payload,proto3" json:"Payload,omitempty"` - VersionNumber string `protobuf:"bytes,2,opt,name=VersionNumber,proto3" json:"VersionNumber,omitempty"` - NodeDisplayName string `protobuf:"bytes,3,opt,name=NodeDisplayName,proto3" json:"NodeDisplayName,omitempty"` - Identity string `protobuf:"bytes,4,opt,name=Identity,proto3" json:"Identity,omitempty"` - Nonce uint64 `protobuf:"varint,5,opt,name=Nonce,proto3" json:"Nonce,omitempty"` - PeerSubType uint32 `protobuf:"varint,6,opt,name=PeerSubType,proto3" json:"PeerSubType,omitempty"` - Pubkey []byte `protobuf:"bytes,7,opt,name=Pubkey,proto3" json:"Pubkey,omitempty"` + Payload []byte `protobuf:"bytes,1,opt,name=Payload,proto3" json:"Payload,omitempty"` + VersionNumber string `protobuf:"bytes,2,opt,name=VersionNumber,proto3" json:"VersionNumber,omitempty"` + NodeDisplayName string `protobuf:"bytes,3,opt,name=NodeDisplayName,proto3" json:"NodeDisplayName,omitempty"` + Identity string `protobuf:"bytes,4,opt,name=Identity,proto3" json:"Identity,omitempty"` + Nonce uint64 `protobuf:"varint,5,opt,name=Nonce,proto3" json:"Nonce,omitempty"` + PeerSubType uint32 `protobuf:"varint,6,opt,name=PeerSubType,proto3" json:"PeerSubType,omitempty"` + Pubkey []byte `protobuf:"bytes,7,opt,name=Pubkey,proto3" json:"Pubkey,omitempty"` + NumTrieNodesSynced uint64 `protobuf:"varint,8,opt,name=NumTrieNodesSynced,proto3" json:"NumTrieNodesSynced,omitempty"` } func (m *HeartbeatV2) Reset() { *m = HeartbeatV2{} } @@ -118,6 +119,13 @@ func (m *HeartbeatV2) GetPubkey() []byte { return nil } +func (m *HeartbeatV2) GetNumTrieNodesSynced() uint64 { + if m != nil { + return m.NumTrieNodesSynced + } + return 0 +} + // PeerAuthentication represents the DTO used to pass peer authentication information such as public key, peer id, // signature, payload and the signature. This message is used to link the peerID with the associated public key type PeerAuthentication struct { @@ -197,9 +205,8 @@ func (m *PeerAuthentication) GetPayloadSignature() []byte { // Payload represents the DTO used as payload for both HeartbeatV2 and PeerAuthentication messages type Payload struct { - Timestamp int64 `protobuf:"varint,1,opt,name=Timestamp,proto3" json:"Timestamp,omitempty"` - HardforkMessage string `protobuf:"bytes,2,opt,name=HardforkMessage,proto3" json:"HardforkMessage,omitempty"` - NumTrieNodesSynced uint64 `protobuf:"varint,3,opt,name=NumTrieNodesSynced,proto3" json:"NumTrieNodesSynced,omitempty"` + Timestamp int64 `protobuf:"varint,1,opt,name=Timestamp,proto3" json:"Timestamp,omitempty"` + HardforkMessage string `protobuf:"bytes,2,opt,name=HardforkMessage,proto3" json:"HardforkMessage,omitempty"` } func (m *Payload) Reset() { *m = Payload{} } @@ -248,13 +255,6 @@ func (m *Payload) GetHardforkMessage() string { return "" } -func (m *Payload) GetNumTrieNodesSynced() uint64 { - if m != nil { - return m.NumTrieNodesSynced - } - return 0 -} - func init() { proto.RegisterType((*HeartbeatV2)(nil), "proto.HeartbeatV2") proto.RegisterType((*PeerAuthentication)(nil), "proto.PeerAuthentication") @@ -264,32 +264,32 @@ func init() { func init() { proto.RegisterFile("heartbeat.proto", fileDescriptor_3c667767fb9826a9) } var fileDescriptor_3c667767fb9826a9 = []byte{ - // 398 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x52, 0xb1, 0x6e, 0xd4, 0x40, - 0x10, 0xf5, 0x70, 0xf6, 0x85, 0xdb, 0x5c, 0x94, 0x68, 0x85, 0xd0, 0x0a, 0xa1, 0x95, 0x75, 0xa2, - 0xb0, 0x28, 0x52, 0xc0, 0x07, 0x20, 0x10, 0x45, 0x28, 0xb0, 0xac, 0xbd, 0x53, 0x0a, 0xba, 0xf5, - 0x79, 0x48, 0x56, 0x89, 0xbd, 0xd6, 0x7a, 0x5d, 0xb8, 0x83, 0x3f, 0xe0, 0x1b, 0xa8, 0xf8, 0x14, - 0xca, 0x2b, 0x53, 0x72, 0x76, 0x43, 0x99, 0x4f, 0x40, 0xde, 0x5c, 0xee, 0x9c, 0x23, 0x95, 0xe7, - 0xbd, 0x79, 0x1a, 0xbf, 0x79, 0x3b, 0xe4, 0xf8, 0x12, 0xa5, 0xb1, 0x29, 0x4a, 0x7b, 0x5a, 0x1a, - 0x6d, 0x35, 0x0d, 0xdc, 0x67, 0xd6, 0x01, 0x39, 0x3c, 0xbb, 0x6f, 0x9d, 0xbf, 0xa1, 0x8c, 0x1c, - 0x24, 0xb2, 0xb9, 0xd6, 0x32, 0x63, 0x10, 0x42, 0x34, 0x15, 0xf7, 0x90, 0xbe, 0x22, 0x47, 0xe7, - 0x68, 0x2a, 0xa5, 0x8b, 0xb8, 0xce, 0x53, 0x34, 0xec, 0x49, 0x08, 0xd1, 0x44, 0x3c, 0x24, 0x69, - 0x44, 0x8e, 0x63, 0x9d, 0xe1, 0x47, 0x55, 0x95, 0xd7, 0xb2, 0x89, 0x65, 0x8e, 0x6c, 0xe4, 0x74, - 0xfb, 0x34, 0x7d, 0x41, 0x9e, 0x7e, 0xca, 0xb0, 0xb0, 0xca, 0x36, 0xcc, 0x77, 0x92, 0x2d, 0xa6, - 0xcf, 0x48, 0x10, 0xeb, 0x62, 0x89, 0x2c, 0x08, 0x21, 0xf2, 0xc5, 0x1d, 0xa0, 0x21, 0x39, 0x4c, - 0x10, 0xcd, 0xbc, 0x4e, 0x17, 0x4d, 0x89, 0x6c, 0x1c, 0x42, 0x74, 0x24, 0x86, 0x14, 0x7d, 0x4e, - 0xc6, 0x49, 0x9d, 0x5e, 0x61, 0xc3, 0x0e, 0x9c, 0xf9, 0x0d, 0x9a, 0xfd, 0x04, 0x42, 0x7b, 0xdd, - 0xfb, 0xda, 0x5e, 0xf6, 0xbf, 0x58, 0x4a, 0xab, 0x74, 0x31, 0x90, 0xc3, 0x50, 0x4e, 0x5f, 0x92, - 0xc9, 0x5c, 0x5d, 0x14, 0xd2, 0xd6, 0x06, 0xdd, 0x9a, 0x53, 0xb1, 0x23, 0xe8, 0x09, 0x19, 0x25, - 0x2a, 0x73, 0x6b, 0x4d, 0x45, 0x5f, 0x0e, 0x43, 0xf3, 0x1f, 0x86, 0xf6, 0x9a, 0x9c, 0x6c, 0xca, - 0xdd, 0xc0, 0xc0, 0x49, 0xfe, 0xe3, 0x67, 0xdf, 0x61, 0x3b, 0xa6, 0x77, 0xb0, 0x50, 0x39, 0x56, - 0x56, 0xe6, 0xa5, 0x33, 0x37, 0x12, 0x3b, 0xa2, 0x0f, 0xf9, 0x4c, 0x9a, 0xec, 0xab, 0x36, 0x57, - 0x9f, 0xb1, 0xaa, 0xe4, 0x05, 0x6e, 0x1e, 0x63, 0x9f, 0xa6, 0xa7, 0x84, 0xc6, 0x75, 0xbe, 0x30, - 0x0a, 0xfb, 0xf8, 0xab, 0x79, 0x53, 0x2c, 0xf1, 0xce, 0xba, 0x2f, 0x1e, 0xe9, 0x7c, 0x78, 0xb7, - 0x5a, 0x73, 0xef, 0x66, 0xcd, 0xbd, 0xdb, 0x35, 0x87, 0x6f, 0x2d, 0x87, 0x5f, 0x2d, 0x87, 0xdf, - 0x2d, 0x87, 0x55, 0xcb, 0xe1, 0x4f, 0xcb, 0xe1, 0x6f, 0xcb, 0xbd, 0xdb, 0x96, 0xc3, 0x8f, 0x8e, - 0x7b, 0xab, 0x8e, 0x7b, 0x37, 0x1d, 0xf7, 0xbe, 0x4c, 0xb6, 0xc7, 0x95, 0x8e, 0xdd, 0x59, 0xbd, - 0xfd, 0x17, 0x00, 0x00, 0xff, 0xff, 0xc1, 0x96, 0x8d, 0x30, 0x70, 0x02, 0x00, 0x00, + // 396 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x92, 0xbd, 0xee, 0xd3, 0x30, + 0x14, 0xc5, 0xe3, 0x7f, 0x9b, 0x7e, 0xb8, 0xad, 0x5a, 0x59, 0x08, 0x59, 0x08, 0x59, 0x51, 0xc5, + 0x10, 0x31, 0x74, 0x80, 0x07, 0x40, 0x20, 0x86, 0x32, 0x10, 0x85, 0xb4, 0xea, 0xc0, 0xe6, 0x34, + 0x97, 0xd6, 0x6a, 0x13, 0x47, 0x8e, 0x33, 0x64, 0xe3, 0x11, 0x90, 0x78, 0x03, 0x26, 0x1e, 0x85, + 0xb1, 0x63, 0x47, 0x9a, 0x2e, 0x8c, 0x7d, 0x04, 0x14, 0xd3, 0x6f, 0xfe, 0x93, 0x7d, 0x7e, 0xbe, + 0x3a, 0x3a, 0x3a, 0xbe, 0xb8, 0xbf, 0x04, 0xae, 0x74, 0x08, 0x5c, 0x8f, 0x52, 0x25, 0xb5, 0x24, + 0xb6, 0x39, 0x86, 0xdf, 0x1f, 0x70, 0x67, 0x7c, 0x7a, 0x9a, 0xbd, 0x22, 0x14, 0x37, 0x7d, 0x5e, + 0xac, 0x25, 0x8f, 0x28, 0x72, 0x90, 0xdb, 0x0d, 0x4e, 0x92, 0xbc, 0xc0, 0xbd, 0x19, 0xa8, 0x4c, + 0xc8, 0xc4, 0xcb, 0xe3, 0x10, 0x14, 0x7d, 0x70, 0x90, 0xdb, 0x0e, 0x6e, 0x21, 0x71, 0x71, 0xdf, + 0x93, 0x11, 0xbc, 0x17, 0x59, 0xba, 0xe6, 0x85, 0xc7, 0x63, 0xa0, 0x35, 0x33, 0x77, 0x8f, 0xc9, + 0x33, 0xdc, 0xfa, 0x10, 0x41, 0xa2, 0x85, 0x2e, 0x68, 0xdd, 0x8c, 0x9c, 0x35, 0x79, 0x82, 0x6d, + 0x4f, 0x26, 0x73, 0xa0, 0xb6, 0x83, 0xdc, 0x7a, 0xf0, 0x4f, 0x10, 0x07, 0x77, 0x7c, 0x00, 0x35, + 0xc9, 0xc3, 0x69, 0x91, 0x02, 0x6d, 0x38, 0xc8, 0xed, 0x05, 0xd7, 0x88, 0x3c, 0xc5, 0x0d, 0x3f, + 0x0f, 0x57, 0x50, 0xd0, 0xa6, 0x09, 0x7f, 0x54, 0x64, 0x84, 0x89, 0x97, 0xc7, 0x53, 0x25, 0xa0, + 0x4a, 0x91, 0x4d, 0x8a, 0x64, 0x0e, 0x11, 0x6d, 0x19, 0xf3, 0x47, 0x5e, 0x86, 0x3f, 0x10, 0x26, + 0x95, 0xef, 0xdb, 0x5c, 0x2f, 0xab, 0x48, 0x73, 0xae, 0x85, 0x4c, 0xae, 0xec, 0xd1, 0x8d, 0xfd, + 0x73, 0xdc, 0x9e, 0x88, 0x45, 0xc2, 0x75, 0xae, 0xc0, 0xd4, 0xd2, 0x0d, 0x2e, 0x80, 0x0c, 0x70, + 0xcd, 0x17, 0x91, 0xa9, 0xa1, 0x1b, 0x54, 0xd7, 0xeb, 0x92, 0xeb, 0xb7, 0x25, 0xbf, 0xc4, 0x83, + 0xe3, 0xf5, 0x62, 0x68, 0x9b, 0x91, 0xff, 0xf8, 0xf0, 0xd3, 0xd9, 0xa5, 0x0a, 0x30, 0x15, 0x31, + 0x64, 0x9a, 0xc7, 0xa9, 0xc9, 0x56, 0x0b, 0x2e, 0xa0, 0xfa, 0x93, 0x31, 0x57, 0xd1, 0x17, 0xa9, + 0x56, 0x1f, 0x21, 0xcb, 0xf8, 0x02, 0x8e, 0x7f, 0x77, 0x8f, 0xdf, 0xbd, 0xd9, 0xec, 0x98, 0xb5, + 0xdd, 0x31, 0xeb, 0xb0, 0x63, 0xe8, 0x6b, 0xc9, 0xd0, 0xcf, 0x92, 0xa1, 0x5f, 0x25, 0x43, 0x9b, + 0x92, 0xa1, 0xdf, 0x25, 0x43, 0x7f, 0x4a, 0x66, 0x1d, 0x4a, 0x86, 0xbe, 0xed, 0x99, 0xb5, 0xd9, + 0x33, 0x6b, 0xbb, 0x67, 0xd6, 0xe7, 0xf6, 0x79, 0xb7, 0xc2, 0x86, 0xd9, 0xaa, 0xd7, 0x7f, 0x03, + 0x00, 0x00, 0xff, 0xff, 0x02, 0x93, 0x86, 0x1d, 0x6f, 0x02, 0x00, 0x00, } func (this *HeartbeatV2) Equal(that interface{}) bool { @@ -332,6 +332,9 @@ func (this *HeartbeatV2) Equal(that interface{}) bool { if !bytes.Equal(this.Pubkey, that1.Pubkey) { return false } + if this.NumTrieNodesSynced != that1.NumTrieNodesSynced { + return false + } return true } func (this *PeerAuthentication) Equal(that interface{}) bool { @@ -395,16 +398,13 @@ func (this *Payload) Equal(that interface{}) bool { if this.HardforkMessage != that1.HardforkMessage { return false } - if this.NumTrieNodesSynced != that1.NumTrieNodesSynced { - return false - } return true } func (this *HeartbeatV2) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 11) + s := make([]string, 0, 12) s = append(s, "&heartbeat.HeartbeatV2{") s = append(s, "Payload: "+fmt.Sprintf("%#v", this.Payload)+",\n") s = append(s, "VersionNumber: "+fmt.Sprintf("%#v", this.VersionNumber)+",\n") @@ -413,6 +413,7 @@ func (this *HeartbeatV2) GoString() string { s = append(s, "Nonce: "+fmt.Sprintf("%#v", this.Nonce)+",\n") s = append(s, "PeerSubType: "+fmt.Sprintf("%#v", this.PeerSubType)+",\n") s = append(s, "Pubkey: "+fmt.Sprintf("%#v", this.Pubkey)+",\n") + s = append(s, "NumTrieNodesSynced: "+fmt.Sprintf("%#v", this.NumTrieNodesSynced)+",\n") s = append(s, "}") return strings.Join(s, "") } @@ -434,11 +435,10 @@ func (this *Payload) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 7) + s := make([]string, 0, 6) s = append(s, "&heartbeat.Payload{") s = append(s, "Timestamp: "+fmt.Sprintf("%#v", this.Timestamp)+",\n") s = append(s, "HardforkMessage: "+fmt.Sprintf("%#v", this.HardforkMessage)+",\n") - s = append(s, "NumTrieNodesSynced: "+fmt.Sprintf("%#v", this.NumTrieNodesSynced)+",\n") s = append(s, "}") return strings.Join(s, "") } @@ -470,6 +470,11 @@ func (m *HeartbeatV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.NumTrieNodesSynced != 0 { + i = encodeVarintHeartbeat(dAtA, i, uint64(m.NumTrieNodesSynced)) + i-- + dAtA[i] = 0x40 + } if len(m.Pubkey) > 0 { i -= len(m.Pubkey) copy(dAtA[i:], m.Pubkey) @@ -596,11 +601,6 @@ func (m *Payload) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if m.NumTrieNodesSynced != 0 { - i = encodeVarintHeartbeat(dAtA, i, uint64(m.NumTrieNodesSynced)) - i-- - dAtA[i] = 0x18 - } if len(m.HardforkMessage) > 0 { i -= len(m.HardforkMessage) copy(dAtA[i:], m.HardforkMessage) @@ -659,6 +659,9 @@ func (m *HeartbeatV2) Size() (n int) { if l > 0 { n += 1 + l + sovHeartbeat(uint64(l)) } + if m.NumTrieNodesSynced != 0 { + n += 1 + sovHeartbeat(uint64(m.NumTrieNodesSynced)) + } return n } @@ -704,9 +707,6 @@ func (m *Payload) Size() (n int) { if l > 0 { n += 1 + l + sovHeartbeat(uint64(l)) } - if m.NumTrieNodesSynced != 0 { - n += 1 + sovHeartbeat(uint64(m.NumTrieNodesSynced)) - } return n } @@ -728,6 +728,7 @@ func (this *HeartbeatV2) String() string { `Nonce:` + fmt.Sprintf("%v", this.Nonce) + `,`, `PeerSubType:` + fmt.Sprintf("%v", this.PeerSubType) + `,`, `Pubkey:` + fmt.Sprintf("%v", this.Pubkey) + `,`, + `NumTrieNodesSynced:` + fmt.Sprintf("%v", this.NumTrieNodesSynced) + `,`, `}`, }, "") return s @@ -753,7 +754,6 @@ func (this *Payload) String() string { s := strings.Join([]string{`&Payload{`, `Timestamp:` + fmt.Sprintf("%v", this.Timestamp) + `,`, `HardforkMessage:` + fmt.Sprintf("%v", this.HardforkMessage) + `,`, - `NumTrieNodesSynced:` + fmt.Sprintf("%v", this.NumTrieNodesSynced) + `,`, `}`, }, "") return s @@ -997,6 +997,25 @@ func (m *HeartbeatV2) Unmarshal(dAtA []byte) error { m.Pubkey = []byte{} } iNdEx = postIndex + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NumTrieNodesSynced", wireType) + } + m.NumTrieNodesSynced = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowHeartbeat + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.NumTrieNodesSynced |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipHeartbeat(dAtA[iNdEx:]) @@ -1324,25 +1343,6 @@ func (m *Payload) Unmarshal(dAtA []byte) error { } m.HardforkMessage = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field NumTrieNodesSynced", wireType) - } - m.NumTrieNodesSynced = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowHeartbeat - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.NumTrieNodesSynced |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } default: iNdEx = preIndex skippy, err := skipHeartbeat(dAtA[iNdEx:]) diff --git a/heartbeat/monitor/monitor.go b/heartbeat/monitor/monitor.go index 30b6bc72a4e..90a92207aec 100644 --- a/heartbeat/monitor/monitor.go +++ b/heartbeat/monitor/monitor.go @@ -163,7 +163,7 @@ func (monitor *heartbeatV2Monitor) parseMessage(pid core.PeerID, message interfa Nonce: heartbeatV2.GetNonce(), PeerSubType: heartbeatV2.GetPeerSubType(), PidString: pid.Pretty(), - NumTrieNodesReceived: payload.NumTrieNodesSynced, + NumTrieNodesReceived: heartbeatV2.NumTrieNodesSynced, } return pubKeyHeartbeat, nil diff --git a/heartbeat/monitor/monitor_test.go b/heartbeat/monitor/monitor_test.go index 809c557ebed..cd238a3a5a5 100644 --- a/heartbeat/monitor/monitor_test.go +++ b/heartbeat/monitor/monitor_test.go @@ -9,7 +9,6 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" - "github.com/ElrondNetwork/elrond-go-core/marshal" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/heartbeat" "github.com/ElrondNetwork/elrond-go/heartbeat/data" @@ -41,20 +40,20 @@ func createHeartbeatMessage(active bool, publicKeyBytes []byte) *heartbeat.Heart } payload := heartbeat.Payload{ - Timestamp: messageTimestamp, - NumTrieNodesSynced: 150, + Timestamp: messageTimestamp, } marshaller := testscommon.MarshalizerMock{} payloadBytes, _ := marshaller.Marshal(payload) return &heartbeat.HeartbeatV2{ - Payload: payloadBytes, - VersionNumber: "v01", - NodeDisplayName: "node name", - Identity: "identity", - Nonce: 0, - PeerSubType: 0, - Pubkey: publicKeyBytes, + Payload: payloadBytes, + VersionNumber: "v01", + NodeDisplayName: "node name", + Identity: "identity", + Nonce: 0, + PeerSubType: 0, + Pubkey: publicKeyBytes, + NumTrieNodesSynced: 150, } } @@ -195,7 +194,7 @@ func TestHeartbeatV2Monitor_parseMessage(t *testing.T) { } hb, err := monitor.parseMessage(providedPid, message, numInstances) assert.Nil(t, err) - checkResults(t, args.Marshaller, *message, hb, true, providedMap, 0) + checkResults(t, *message, hb, true, providedMap, 0) assert.Equal(t, 0, len(providedMap)) pkFromMsg := args.PubKeyConverter.Encode(providedPkBytesFromMessage) entries, ok := numInstances[pkFromMsg] @@ -229,7 +228,7 @@ func TestHeartbeatV2Monitor_parseMessage(t *testing.T) { } hb, err := monitor.parseMessage(providedPid, message, numInstances) assert.Nil(t, err) - checkResults(t, args.Marshaller, *message, hb, true, providedMap, 0) + checkResults(t, *message, hb, true, providedMap, 0) assert.Equal(t, 0, len(providedMap)) pk := args.PubKeyConverter.Encode(providedPkBytes) entries, ok := numInstances[pk] @@ -313,7 +312,7 @@ func TestHeartbeatV2Monitor_GetHeartbeats(t *testing.T) { assert.Equal(t, len(providedStatuses)-1, len(heartbeats)) assert.Equal(t, len(providedStatuses)-1, args.Cache.Len()) // faulty message was removed from cache for i := 0; i < len(heartbeats); i++ { - checkResults(t, args.Marshaller, *providedMessages[i], heartbeats[i], providedStatuses[i], providedPids, 1) + checkResults(t, *providedMessages[i], heartbeats[i], providedStatuses[i], providedPids, 1) } assert.Equal(t, 1, len(providedPids)) // one message is skipped }) @@ -348,13 +347,13 @@ func TestHeartbeatV2Monitor_GetHeartbeats(t *testing.T) { if i > 0 { numInstances = 2 } - checkResults(t, args.Marshaller, *providedMessages[i], heartbeats[i], providedStatuses[i], providedPids, numInstances) + checkResults(t, *providedMessages[i], heartbeats[i], providedStatuses[i], providedPids, numInstances) } assert.Equal(t, 0, len(providedPids)) }) } -func checkResults(t *testing.T, marshaller marshal.Marshalizer, message heartbeat.HeartbeatV2, hb data.PubKeyHeartbeat, isActive bool, providedPids map[string]struct{}, numInstances uint64) { +func checkResults(t *testing.T, message heartbeat.HeartbeatV2, hb data.PubKeyHeartbeat, isActive bool, providedPids map[string]struct{}, numInstances uint64) { assert.Equal(t, isActive, hb.IsActive) assert.Equal(t, message.VersionNumber, hb.VersionNumber) assert.Equal(t, message.NodeDisplayName, hb.NodeDisplayName) @@ -365,9 +364,5 @@ func checkResults(t *testing.T, marshaller marshal.Marshalizer, message heartbea _, ok := providedPids[hb.PidString] assert.True(t, ok) delete(providedPids, hb.PidString) - - payload := &heartbeat.Payload{} - err := marshaller.Unmarshal(payload, message.Payload) - assert.Nil(t, err) - assert.Equal(t, payload.NumTrieNodesSynced, hb.NumTrieNodesReceived) + assert.Equal(t, message.NumTrieNodesSynced, hb.NumTrieNodesReceived) } diff --git a/heartbeat/proto/heartbeat.proto b/heartbeat/proto/heartbeat.proto index 2228cd46915..8dc547557aa 100644 --- a/heartbeat/proto/heartbeat.proto +++ b/heartbeat/proto/heartbeat.proto @@ -7,13 +7,14 @@ option go_package = "heartbeat"; // HeartbeatV2 represents the heartbeat message that is sent between peers from the same shard containing // current node status message HeartbeatV2 { - bytes Payload = 1; - string VersionNumber = 2; - string NodeDisplayName = 3; - string Identity = 4; - uint64 Nonce = 5; - uint32 PeerSubType = 6; - bytes Pubkey = 7; + bytes Payload = 1; + string VersionNumber = 2; + string NodeDisplayName = 3; + string Identity = 4; + uint64 Nonce = 5; + uint32 PeerSubType = 6; + bytes Pubkey = 7; + uint64 NumTrieNodesSynced = 8; } // PeerAuthentication represents the DTO used to pass peer authentication information such as public key, peer id, @@ -28,7 +29,6 @@ message PeerAuthentication { // Payload represents the DTO used as payload for both HeartbeatV2 and PeerAuthentication messages message Payload { - int64 Timestamp = 1; - string HardforkMessage = 2; - uint64 NumTrieNodesSynced = 3; + int64 Timestamp = 1; + string HardforkMessage = 2; } diff --git a/heartbeat/sender/heartbeatSender.go b/heartbeat/sender/heartbeatSender.go index fc833c2aee0..5415c25b65f 100644 --- a/heartbeat/sender/heartbeatSender.go +++ b/heartbeat/sender/heartbeatSender.go @@ -99,11 +99,9 @@ func (sender *heartbeatSender) Execute() { } func (sender *heartbeatSender) execute() error { - trieNodesReceived := sender.trieSyncStatisticsProvider.NumReceived() payload := &heartbeat.Payload{ - Timestamp: time.Now().Unix(), - HardforkMessage: "", // sent through peer authentication message - NumTrieNodesSynced: uint64(trieNodesReceived), + Timestamp: time.Now().Unix(), + HardforkMessage: "", // sent through peer authentication message } payloadBytes, err := sender.marshaller.Marshal(payload) if err != nil { @@ -122,14 +120,16 @@ func (sender *heartbeatSender) execute() error { return err } + trieNodesReceived := sender.trieSyncStatisticsProvider.NumReceived() msg := &heartbeat.HeartbeatV2{ - Payload: payloadBytes, - VersionNumber: sender.versionNumber, - NodeDisplayName: sender.nodeDisplayName, - Identity: sender.identity, - Nonce: nonce, - PeerSubType: uint32(sender.peerSubType), - Pubkey: pkBytes, + Payload: payloadBytes, + VersionNumber: sender.versionNumber, + NodeDisplayName: sender.nodeDisplayName, + Identity: sender.identity, + Nonce: nonce, + PeerSubType: uint32(sender.peerSubType), + Pubkey: pkBytes, + NumTrieNodesSynced: uint64(trieNodesReceived), } msgBytes, err := sender.marshaller.Marshal(msg) diff --git a/heartbeat/sender/heartbeatSender_test.go b/heartbeat/sender/heartbeatSender_test.go index c13c75e15ef..b9d028f63d4 100644 --- a/heartbeat/sender/heartbeatSender_test.go +++ b/heartbeat/sender/heartbeatSender_test.go @@ -320,10 +320,7 @@ func TestHeartbeatSender_execute(t *testing.T) { pk := argsBase.privKey.GeneratePublic() pkBytes, _ := pk.ToByteArray() assert.Equal(t, pkBytes, recoveredMessage.Pubkey) - recoveredPayload := &heartbeat.Payload{} - err = argsBase.marshaller.Unmarshal(recoveredPayload, recoveredMessage.Payload) - assert.Nil(t, err) - assert.Equal(t, uint64(providedNumTrieNodesSynced), recoveredPayload.NumTrieNodesSynced) + assert.Equal(t, uint64(providedNumTrieNodesSynced), recoveredMessage.NumTrieNodesSynced) broadcastCalled = true }, } From 8ea1c3d5c202cdb2f21cdf8645c83417a26ae55b Mon Sep 17 00:00:00 2001 From: BeniaminDrasovean Date: Wed, 19 Oct 2022 16:25:54 +0300 Subject: [PATCH 044/110] GetStorageData returns trie depth --- go.mod | 8 +- go.sum | 17 +- integrationTests/mock/oneSCExecutorMockVM.go | 4 +- process/interface.go | 2 +- process/smartContract/hooks/blockChainHook.go | 10 +- .../hooks/blockChainHook_test.go | 8 +- testscommon/blockChainHookStub.go | 6 +- vm/interface.go | 2 +- vm/mock/blockChainHookStub.go | 6 +- vm/systemSmartContracts/eei.go | 2 +- vm/systemSmartContracts/staking_test.go | 164 +++++++++--------- 11 files changed, 118 insertions(+), 111 deletions(-) diff --git a/go.mod b/go.mod index 2b83dd02d7c..05e20fdf319 100644 --- a/go.mod +++ b/go.mod @@ -10,10 +10,10 @@ require ( github.com/ElrondNetwork/elrond-go-logger v1.0.7 github.com/ElrondNetwork/elrond-go-p2p v1.0.2 github.com/ElrondNetwork/elrond-go-storage v1.0.1 - github.com/ElrondNetwork/elrond-vm-common v1.3.23-0.20221018122023-fbefc7c2a3e0 - github.com/ElrondNetwork/wasm-vm v1.4.59 - github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.43-0.20221018130126-9ac872793535 - github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.42 + github.com/ElrondNetwork/elrond-vm-common v1.3.23-0.20221019113258-ca9342453fa4 + github.com/ElrondNetwork/wasm-vm v1.4.60-0.20221019123810-007e47943329 + github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.43-0.20221019114848-90e637a3fb5c + github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.43-0.20221019120649-0b89b33dbe84 github.com/beevik/ntp v0.3.0 github.com/davecgh/go-spew v1.1.1 github.com/elastic/go-elasticsearch/v7 v7.12.0 diff --git a/go.sum b/go.sum index 75d1f6727b3..456333cecaf 100644 --- a/go.sum +++ b/go.sum @@ -72,19 +72,18 @@ github.com/ElrondNetwork/elrond-go-storage v1.0.1/go.mod h1:Dht8Vt0BJvyUrr+mDSjY github.com/ElrondNetwork/elrond-vm-common v1.1.0/go.mod h1:w3i6f8uiuRkE68Ie/gebRcLgTuHqvruJSYrFyZWuLrE= github.com/ElrondNetwork/elrond-vm-common v1.2.9/go.mod h1:B/Y8WiqHyDd7xsjNYsaYbVMp1jQgQ+z4jTJkFvj/EWI= github.com/ElrondNetwork/elrond-vm-common v1.3.7/go.mod h1:seROQuR7RJCoCS7mgRXVAlvjztltY1c+UroAgWr/USE= -github.com/ElrondNetwork/elrond-vm-common v1.3.16/go.mod h1:seROQuR7RJCoCS7mgRXVAlvjztltY1c+UroAgWr/USE= -github.com/ElrondNetwork/elrond-vm-common v1.3.23-0.20221018122023-fbefc7c2a3e0 h1:7xzoOtRLUVRF8QEkC2Uzb6iA7zseABBZ2RtBQncYpDc= -github.com/ElrondNetwork/elrond-vm-common v1.3.23-0.20221018122023-fbefc7c2a3e0/go.mod h1:seROQuR7RJCoCS7mgRXVAlvjztltY1c+UroAgWr/USE= +github.com/ElrondNetwork/elrond-vm-common v1.3.23-0.20221019113258-ca9342453fa4 h1:Lx/Ud7V6GT2qtv3HnszQfAUMQbf40Nw9IU5OMh7+jDg= +github.com/ElrondNetwork/elrond-vm-common v1.3.23-0.20221019113258-ca9342453fa4/go.mod h1:seROQuR7RJCoCS7mgRXVAlvjztltY1c+UroAgWr/USE= github.com/ElrondNetwork/go-libp2p-pubsub v0.6.1-rc1 h1:Nu/uwYQg/QbfoQ0uD6GahYTwgtAkAwtzsB0HVfSP58I= github.com/ElrondNetwork/go-libp2p-pubsub v0.6.1-rc1/go.mod h1:pJfaShe+i5aWZx8NhSkQjvOYQYLoqPztmFUlKjToOzM= github.com/ElrondNetwork/protobuf v1.3.2 h1:qoCSYiO+8GtXBEZWEjw0WPcZfM3g7QuuJrwpN+y6Mvg= github.com/ElrondNetwork/protobuf v1.3.2/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/ElrondNetwork/wasm-vm v1.4.59 h1:7TO0R+kpkCU375Pwtw0jBlkcSoakmGSyh2U6+Aob9L0= -github.com/ElrondNetwork/wasm-vm v1.4.59/go.mod h1:NopwtkceMs1N5esbLzhMU49487XdEMAqaRnVIlQ72QY= -github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.43-0.20221018130126-9ac872793535 h1:bR3N7fPmXykBJle2ApxVTCZ4l8iYF+SPsUvm7oTIFn8= -github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.43-0.20221018130126-9ac872793535/go.mod h1:QH1ob8K5Z7GZ2pYJ5QvOoYw/ybz16URY9T4SM3kO/xs= -github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.42 h1:EhLjiR/MnWSuLW3xtWh69oBZ4zAsym/QrhGKsVWwJjw= -github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.42/go.mod h1:7JeSIgpcCxKiD67iSjnlBQt7qIQf+oSuehtBQp0QgVM= +github.com/ElrondNetwork/wasm-vm v1.4.60-0.20221019123810-007e47943329 h1:l4SpUrHWvqGBc4+UEFzj/sz00x8lmqUwTzdZT8D5N4I= +github.com/ElrondNetwork/wasm-vm v1.4.60-0.20221019123810-007e47943329/go.mod h1:2kn5wXDkqN/XOdmK5ah/C8vK3s49ZUHH5dBIQyLf5+0= +github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.43-0.20221019114848-90e637a3fb5c h1:6PEFTy130z5Atm2+tgYaph5mbeZmp2rCvC398F8mVWQ= +github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.43-0.20221019114848-90e637a3fb5c/go.mod h1:AZlDSyifV2Zd7vK2Z5tD4W/sYRyVIBi9c9sM2pxBsv4= +github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.43-0.20221019120649-0b89b33dbe84 h1:voH0C7ZKGGOlYhHluPvJtUmImk+G4bntUQRoIAFwElU= +github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.43-0.20221019120649-0b89b33dbe84/go.mod h1:Bo3RZvS519Nmajut1Vqbl/T3eb9Of2UbFbF196kXwds= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= diff --git a/integrationTests/mock/oneSCExecutorMockVM.go b/integrationTests/mock/oneSCExecutorMockVM.go index ab6077b6fdd..c70bead1153 100644 --- a/integrationTests/mock/oneSCExecutorMockVM.go +++ b/integrationTests/mock/oneSCExecutorMockVM.go @@ -169,7 +169,7 @@ func (vm *OneSCExecutorMockVM) GasScheduleChange(_ map[string]map[string]uint64) } func (vm *OneSCExecutorMockVM) processAddFunc(input *vmcommon.ContractCallInput, value *big.Int) (*vmcommon.VMOutput, error) { - currentValueBuff, err := vm.blockchainHook.GetStorageData(input.RecipientAddr, variableA) + currentValueBuff, _, err := vm.blockchainHook.GetStorageData(input.RecipientAddr, variableA) if err != nil { return nil, err } @@ -263,7 +263,7 @@ func (vm *OneSCExecutorMockVM) processWithdrawFunc(input *vmcommon.ContractCallI } func (vm *OneSCExecutorMockVM) processGetFunc(input *vmcommon.ContractCallInput) (*vmcommon.VMOutput, error) { - currentValueBuff, err := vm.blockchainHook.GetStorageData(input.RecipientAddr, variableA) + currentValueBuff, _, err := vm.blockchainHook.GetStorageData(input.RecipientAddr, variableA) if err != nil { return nil, err } diff --git a/process/interface.go b/process/interface.go index ec847e18209..122d3790665 100644 --- a/process/interface.go +++ b/process/interface.go @@ -468,7 +468,7 @@ type PendingMiniBlocksHandler interface { type BlockChainHookHandler interface { GetCode(account vmcommon.UserAccountHandler) []byte GetUserAccount(address []byte) (vmcommon.UserAccountHandler, error) - GetStorageData(accountAddress []byte, index []byte) ([]byte, error) + GetStorageData(accountAddress []byte, index []byte) ([]byte, uint32, error) GetBlockhash(nonce uint64) ([]byte, error) LastNonce() uint64 LastRound() uint64 diff --git a/process/smartContract/hooks/blockChainHook.go b/process/smartContract/hooks/blockChainHook.go index d42bf419247..b29d7651a4a 100644 --- a/process/smartContract/hooks/blockChainHook.go +++ b/process/smartContract/hooks/blockChainHook.go @@ -223,18 +223,18 @@ func (bh *BlockChainHookImpl) GetUserAccount(address []byte) (vmcommon.UserAccou } // GetStorageData returns the storage value of a variable held in account's data trie -func (bh *BlockChainHookImpl) GetStorageData(accountAddress []byte, index []byte) ([]byte, error) { +func (bh *BlockChainHookImpl) GetStorageData(accountAddress []byte, index []byte) ([]byte, uint32, error) { defer stopMeasure(startMeasure("GetStorageData")) userAcc, err := bh.GetUserAccount(accountAddress) if err == state.ErrAccNotFound { - return make([]byte, 0), nil + return make([]byte, 0), 0, nil } if err != nil { - return nil, err + return nil, 0, err } - value, _, err := userAcc.AccountDataHandler().RetrieveValue(index) + value, trieDepth, err := userAcc.AccountDataHandler().RetrieveValue(index) messages := []interface{}{ "address", accountAddress, "rootHash", userAcc.GetRootHash(), @@ -246,7 +246,7 @@ func (bh *BlockChainHookImpl) GetStorageData(accountAddress []byte, index []byte messages = append(messages, err) } log.Trace("GetStorageData ", messages...) - return value, err + return value, trieDepth, err } // GetBlockhash returns the header hash for a requested nonce delta diff --git a/process/smartContract/hooks/blockChainHook_test.go b/process/smartContract/hooks/blockChainHook_test.go index ca7f5c92a08..484b3cbef34 100644 --- a/process/smartContract/hooks/blockChainHook_test.go +++ b/process/smartContract/hooks/blockChainHook_test.go @@ -337,7 +337,7 @@ func TestBlockChainHookImpl_GetStorageDataAccountNotFoundExpectEmptyStorage(t *t } bh, _ := hooks.NewBlockChainHookImpl(args) - storageData, err := bh.GetStorageData(address, []byte("index")) + storageData, _, err := bh.GetStorageData(address, []byte("index")) require.Equal(t, []byte{}, storageData) require.Nil(t, err) } @@ -369,7 +369,7 @@ func TestBlockChainHookImpl_GetStorageDataCannotRetrieveAccountValueExpectError( } bh, _ := hooks.NewBlockChainHookImpl(args) - storageData, err := bh.GetStorageData(address, index) + storageData, _, err := bh.GetStorageData(address, index) require.Nil(t, storageData) require.Equal(t, expectedErr, err) } @@ -387,7 +387,7 @@ func TestBlockChainHookImpl_GetStorageDataErrorsShouldErr(t *testing.T) { } bh, _ := hooks.NewBlockChainHookImpl(args) - value, err := bh.GetStorageData(make([]byte, 0), make([]byte, 0)) + value, _, err := bh.GetStorageData(make([]byte, 0), make([]byte, 0)) assert.Equal(t, errExpected, err) assert.Nil(t, value) @@ -409,7 +409,7 @@ func TestBlockChainHookImpl_GetStorageDataShouldWork(t *testing.T) { } bh, _ := hooks.NewBlockChainHookImpl(args) - value, err := bh.GetStorageData(make([]byte, 0), variableIdentifier) + value, _, err := bh.GetStorageData(make([]byte, 0), variableIdentifier) assert.Nil(t, err) assert.Equal(t, variableValue, value) diff --git a/testscommon/blockChainHookStub.go b/testscommon/blockChainHookStub.go index c1fd31cdc66..e73f6757708 100644 --- a/testscommon/blockChainHookStub.go +++ b/testscommon/blockChainHookStub.go @@ -9,7 +9,7 @@ import ( // BlockChainHookStub - type BlockChainHookStub struct { NewAddressCalled func(creatorAddress []byte, creatorNonce uint64, vmType []byte) ([]byte, error) - GetStorageDataCalled func(accountsAddress []byte, index []byte) ([]byte, error) + GetStorageDataCalled func(accountsAddress []byte, index []byte) ([]byte, uint32, error) GetBlockHashCalled func(nonce uint64) ([]byte, error) LastNonceCalled func() uint64 LastRoundCalled func() uint64 @@ -65,12 +65,12 @@ func (stub *BlockChainHookStub) GetUserAccount(address []byte) (vmcommon.UserAcc } // GetStorageData - -func (stub *BlockChainHookStub) GetStorageData(accountAddress []byte, index []byte) ([]byte, error) { +func (stub *BlockChainHookStub) GetStorageData(accountAddress []byte, index []byte) ([]byte, uint32, error) { if stub.GetStorageDataCalled != nil { return stub.GetStorageDataCalled(accountAddress, index) } - return make([]byte, 0), nil + return make([]byte, 0), 0, nil } // GetBlockhash - diff --git a/vm/interface.go b/vm/interface.go index 7265b02f875..66196ccc22e 100644 --- a/vm/interface.go +++ b/vm/interface.go @@ -110,7 +110,7 @@ type EpochNotifier interface { // BlockchainHook is the interface for VM blockchain callbacks type BlockchainHook interface { - GetStorageData(accountAddress []byte, index []byte) ([]byte, error) + GetStorageData(accountAddress []byte, index []byte) ([]byte, uint32, error) CurrentNonce() uint64 CurrentRound() uint64 CurrentEpoch() uint32 diff --git a/vm/mock/blockChainHookStub.go b/vm/mock/blockChainHookStub.go index 7c663e5e860..ec700de5883 100644 --- a/vm/mock/blockChainHookStub.go +++ b/vm/mock/blockChainHookStub.go @@ -9,7 +9,7 @@ import ( type BlockChainHookStub struct { AccountExtistsCalled func(address []byte) (bool, error) NewAddressCalled func(creatorAddress []byte, creatorNonce uint64, vmType []byte) ([]byte, error) - GetStorageDataCalled func(accountsAddress []byte, index []byte) ([]byte, error) + GetStorageDataCalled func(accountsAddress []byte, index []byte) ([]byte, uint32, error) GetUserAccountCalled func(address []byte) (vmcommon.UserAccountHandler, error) GetShardOfAddressCalled func(address []byte) uint32 IsSmartContractCalled func(address []byte) bool @@ -61,11 +61,11 @@ func (b *BlockChainHookStub) GetCode(account vmcommon.UserAccountHandler) []byte } // GetStorageData - -func (b *BlockChainHookStub) GetStorageData(accountAddress []byte, index []byte) ([]byte, error) { +func (b *BlockChainHookStub) GetStorageData(accountAddress []byte, index []byte) ([]byte, uint32, error) { if b.GetStorageDataCalled != nil { return b.GetStorageDataCalled(accountAddress, index) } - return nil, nil + return nil, 0, nil } // GetUserAccount - diff --git a/vm/systemSmartContracts/eei.go b/vm/systemSmartContracts/eei.go index 969a91bec81..306f9ee48de 100644 --- a/vm/systemSmartContracts/eei.go +++ b/vm/systemSmartContracts/eei.go @@ -127,7 +127,7 @@ func (host *vmContext) GetStorageFromAddress(address []byte, key []byte) []byte } } - data, err := host.blockChainHook.GetStorageData(address, key) + data, _, err := host.blockChainHook.GetStorageData(address, key) if err != nil { return nil } diff --git a/vm/systemSmartContracts/staking_test.go b/vm/systemSmartContracts/staking_test.go index 0f8e998510e..c35f993aedb 100644 --- a/vm/systemSmartContracts/staking_test.go +++ b/vm/systemSmartContracts/staking_test.go @@ -301,8 +301,8 @@ func TestStakingSC_ExecuteStake(t *testing.T) { } blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { - return nil, nil + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { + return nil, 0, nil } eei := createDefaultEei() @@ -951,8 +951,8 @@ func TestStakingSc_ExecuteIsStaked(t *testing.T) { stakeValue := big.NewInt(100) blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { - return nil, nil + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { + return nil, 0, nil } eei := createDefaultEei() @@ -990,8 +990,8 @@ func TestStakingSc_StakeWithV1ShouldWork(t *testing.T) { stakeValue := big.NewInt(100) blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { - return nil, nil + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { + return nil, 0, nil } jailAccessAddr := []byte("jailAccessAddr") @@ -1040,8 +1040,8 @@ func TestStakingSc_StakeJailAndUnJail(t *testing.T) { stakeValue := big.NewInt(100) blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { - return nil, nil + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { + return nil, 0, nil } jailAccessAddr := []byte("jailAccessAddr") @@ -1094,8 +1094,8 @@ func TestStakingSc_ExecuteStakeStakeJailAndSwitch(t *testing.T) { stakeValue := big.NewInt(100) blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { - return nil, nil + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { + return nil, 0, nil } eei := createDefaultEei() @@ -1242,8 +1242,8 @@ func TestStakingSc_ExecuteStakeStakeJailAndSwitchWithBoundaries(t *testing.T) { var stakedResult vmcommon.ReturnCode blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { - return nil, nil + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { + return nil, 0, nil } eei := createDefaultEei() @@ -1318,8 +1318,8 @@ func TestStakingSc_ExecuteStakeStakeStakeJailJailUnJailTwice(t *testing.T) { stakeValue := big.NewInt(100) blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { - return nil, nil + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { + return nil, 0, nil } eei := createDefaultEei() @@ -1445,8 +1445,8 @@ func TestStakingSc_ExecuteStakeUnStakeJailCombinations(t *testing.T) { stakeValue := big.NewInt(100) blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { - return nil, nil + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { + return nil, 0, nil } eei := createDefaultEei() @@ -1536,8 +1536,8 @@ func TestStakingSc_UnBondFromWaitingNotPossible(t *testing.T) { stakeValue := big.NewInt(100) blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { - return nil, nil + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { + return nil, 0, nil } eei := createDefaultEei() @@ -1595,8 +1595,8 @@ func Test_NoActionAllowedForBadRatingOrJailed(t *testing.T) { stakeValue := big.NewInt(100) blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { - return nil, nil + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { + return nil, 0, nil } accountsStub := &stateMock.AccountsStub{} @@ -1651,8 +1651,8 @@ func Test_UnJailNotAllowedIfJailed(t *testing.T) { stakeValue := big.NewInt(100) blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { - return nil, nil + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { + return nil, 0, nil } accountsStub := &stateMock.AccountsStub{} @@ -1700,8 +1700,8 @@ func TestStakingSc_updateConfigMinNodesOK(t *testing.T) { stakeValue := big.NewInt(100) blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { - return nil, nil + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { + return nil, 0, nil } eei := createDefaultEei() @@ -1759,8 +1759,8 @@ func TestStakingSc_updateConfigMaxNodesOK(t *testing.T) { stakeValue := big.NewInt(100) blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { - return nil, nil + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { + return nil, 0, nil } eei := createDefaultEei() @@ -1820,8 +1820,8 @@ func TestStakingSC_SetOwnersOnAddressesNotEnabledShouldErr(t *testing.T) { args := createMockStakingScArguments() blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { - return nil, nil + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { + return nil, 0, nil } eei := createDefaultEei() eei.blockChainHook = blockChainHook @@ -1844,8 +1844,8 @@ func TestStakingSC_SetOwnersOnAddressesWrongCallerShouldErr(t *testing.T) { enableEpochsHandler, _ := args.EnableEpochsHandler.(*testscommon.EnableEpochsHandlerStub) enableEpochsHandler.IsStakingV2FlagEnabledField = true blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { - return nil, nil + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { + return nil, 0, nil } eei := createDefaultEei() eei.blockChainHook = blockChainHook @@ -1868,8 +1868,8 @@ func TestStakingSC_SetOwnersOnAddressesWrongArgumentsShouldErr(t *testing.T) { enableEpochsHandler, _ := args.EnableEpochsHandler.(*testscommon.EnableEpochsHandlerStub) enableEpochsHandler.IsStakingV2FlagEnabledField = true blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { - return nil, nil + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { + return nil, 0, nil } eei := createDefaultEei() eei.blockChainHook = blockChainHook @@ -1893,8 +1893,8 @@ func TestStakingSC_SetOwnersOnAddressesShouldWork(t *testing.T) { enableEpochsHandler, _ := args.EnableEpochsHandler.(*testscommon.EnableEpochsHandlerStub) enableEpochsHandler.IsStakingV2FlagEnabledField = true blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { - return nil, nil + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { + return nil, 0, nil } eei := createDefaultEei() eei.blockChainHook = blockChainHook @@ -1932,8 +1932,8 @@ func TestStakingSC_SetOwnersOnAddressesEmptyArgsShouldWork(t *testing.T) { enableEpochsHandler, _ := args.EnableEpochsHandler.(*testscommon.EnableEpochsHandlerStub) enableEpochsHandler.IsStakingV2FlagEnabledField = true blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { - return nil, nil + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { + return nil, 0, nil } eei := createDefaultEei() eei.blockChainHook = blockChainHook @@ -1953,8 +1953,8 @@ func TestStakingSC_GetOwnerStakingV2NotEnabledShouldErr(t *testing.T) { args := createMockStakingScArguments() blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { - return nil, nil + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { + return nil, 0, nil } eei := createDefaultEei() eei.blockChainHook = blockChainHook @@ -1977,8 +1977,8 @@ func TestStakingSC_GetOwnerWrongCallerShouldErr(t *testing.T) { enableEpochsHandler, _ := args.EnableEpochsHandler.(*testscommon.EnableEpochsHandlerStub) enableEpochsHandler.IsStakingV2FlagEnabledField = true blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { - return nil, nil + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { + return nil, 0, nil } eei := createDefaultEei() eei.blockChainHook = blockChainHook @@ -2001,8 +2001,8 @@ func TestStakingSC_GetOwnerWrongArgumentsShouldErr(t *testing.T) { enableEpochsHandler, _ := args.EnableEpochsHandler.(*testscommon.EnableEpochsHandlerStub) enableEpochsHandler.IsStakingV2FlagEnabledField = true blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { - return nil, nil + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { + return nil, 0, nil } eei := createDefaultEei() eei.blockChainHook = blockChainHook @@ -2025,8 +2025,8 @@ func TestStakingSC_GetOwnerShouldWork(t *testing.T) { enableEpochsHandler, _ := args.EnableEpochsHandler.(*testscommon.EnableEpochsHandlerStub) enableEpochsHandler.IsStakingV2FlagEnabledField = true blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { - return nil, nil + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { + return nil, 0, nil } eei := createDefaultEei() eei.blockChainHook = blockChainHook @@ -2060,8 +2060,8 @@ func TestStakingSc_StakeFromQueue(t *testing.T) { t.Parallel() blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { - return nil, nil + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { + return nil, 0, nil } eei := createDefaultEei() @@ -2175,8 +2175,8 @@ func TestStakingSC_UnstakeAtEndOfEpoch(t *testing.T) { stakeValue := big.NewInt(100) blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { - return nil, nil + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { + return nil, 0, nil } eei := createDefaultEei() @@ -2207,8 +2207,8 @@ func TestStakingSC_ResetWaitingListUnJailed(t *testing.T) { stakeValue := big.NewInt(100) blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { - return nil, nil + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { + return nil, 0, nil } eei := createDefaultEei() @@ -2268,8 +2268,8 @@ func TestStakingSc_UnStakeNodeWhenMaxNumIsMoreShouldNotStakeFromWaiting(t *testi stakeValue := big.NewInt(100) blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { - return nil, nil + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { + return nil, 0, nil } eei := createDefaultEei() @@ -2305,8 +2305,8 @@ func TestStakingSc_ChangeRewardAndOwnerAddress(t *testing.T) { t.Parallel() blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { - return nil, nil + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { + return nil, 0, nil } eei := createDefaultEei() @@ -2414,12 +2414,13 @@ func TestStakingSc_RemoveFromWaitingListFirst(t *testing.T) { marshalizer := &marshal.JsonMarshalizer{} blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { obj, ok := m[string(index)] if ok { - return marshalizer.Marshal(obj) + serializedObj, err := marshalizer.Marshal(obj) + return serializedObj, 0, err } - return nil, nil + return nil, 0, nil } eei := createDefaultEei() @@ -2463,12 +2464,13 @@ func TestStakingSc_RemoveFromWaitingListSecondThatLooksLikeFirstBeforeFix(t *tes marshalizer := &marshal.JsonMarshalizer{} blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { obj, ok := m[string(index)] if ok { - return marshalizer.Marshal(obj) + serializedObj, err := marshalizer.Marshal(obj) + return serializedObj, 0, err } - return nil, nil + return nil, 0, nil } eei := createDefaultEei() @@ -2516,12 +2518,13 @@ func TestStakingSc_RemoveFromWaitingListSecondThatLooksLikeFirstAfterFix(t *test marshalizer := &marshal.JsonMarshalizer{} blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { obj, ok := m[string(index)] if ok { - return marshalizer.Marshal(obj) + serializedObj, err := marshalizer.Marshal(obj) + return serializedObj, 0, err } - return nil, nil + return nil, 0, nil } eei := createDefaultEei() @@ -2572,12 +2575,13 @@ func TestStakingSc_RemoveFromWaitingListNotFoundPreviousShouldErrAndFinish(t *te marshalizer := &marshal.JsonMarshalizer{} blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { obj, ok := m[string(index)] if ok { - return marshalizer.Marshal(obj) + serializedObj, err := marshalizer.Marshal(obj) + return serializedObj, 0, err } - return nil, nil + return nil, 0, nil } eei := createDefaultEei() @@ -2608,13 +2612,14 @@ func TestStakingSc_InsertAfterLastJailedBeforeFix(t *testing.T) { marshalizer := &marshal.JsonMarshalizer{} blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { obj, ok := m[string(index)] if ok { - return marshalizer.Marshal(obj) + serializedObj, err := marshalizer.Marshal(obj) + return serializedObj, 0, err } - return nil, nil + return nil, 0, nil } eei := createDefaultEei() @@ -2668,13 +2673,14 @@ func TestStakingSc_InsertAfterLastJailedAfterFix(t *testing.T) { marshalizer := &marshal.JsonMarshalizer{} blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { obj, ok := m[string(index)] if ok { - return marshalizer.Marshal(obj) + serializedObj, err := marshalizer.Marshal(obj) + return serializedObj, 0, err } - return nil, nil + return nil, 0, nil } eei := createDefaultEei() @@ -2723,13 +2729,14 @@ func TestStakingSc_InsertAfterLastJailedAfterFixWithEmptyQueue(t *testing.T) { marshalizer := &marshal.JsonMarshalizer{} blockChainHook := &mock.BlockChainHookStub{} - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { obj, ok := m[string(index)] if ok { - return marshalizer.Marshal(obj) + serializedObj, err := marshalizer.Marshal(obj) + return serializedObj, 0, err } - return nil, nil + return nil, 0, nil } eei := createDefaultEei() @@ -3028,13 +3035,14 @@ func makeWrongConfigForWaitingBlsKeysListWithLastJailed(t *testing.T, waitingBls waitingListHead := &WaitingList{nil, nil, 0, lastJailedKey} m[waitingListHeadKey] = waitingListHead - blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) (i []byte, e error) { + blockChainHook.GetStorageDataCalled = func(accountsAddress []byte, index []byte) ([]byte, uint32, error) { obj, found := m[string(index)] if found { - return marshalizer.Marshal(obj) + serializedObj, err := marshalizer.Marshal(obj) + return serializedObj, 0, err } - return nil, nil + return nil, 0, nil } args := createMockStakingScArguments() From d7e1daaa424ffa1e5ef63c6b2dd0c45ef3d6b8cc Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Wed, 19 Oct 2022 17:11:40 +0300 Subject: [PATCH 045/110] fixes after review --- cmd/node/flags.go | 44 ++++++++++++----- cmd/node/operationModes.go | 49 ------------------ common/operationmodes/operationmodes.go | 52 ++++++++++++++++++++ common/operationmodes/operationmodes_test.go | 46 +++++++++++++++++ 4 files changed, 131 insertions(+), 60 deletions(-) delete mode 100644 cmd/node/operationModes.go create mode 100644 common/operationmodes/operationmodes.go create mode 100644 common/operationmodes/operationmodes_test.go diff --git a/cmd/node/flags.go b/cmd/node/flags.go index 07f434a3b2c..4bcfe9923ca 100644 --- a/cmd/node/flags.go +++ b/cmd/node/flags.go @@ -9,6 +9,7 @@ import ( logger "github.com/ElrondNetwork/elrond-go-logger" "github.com/ElrondNetwork/elrond-go/common" + "github.com/ElrondNetwork/elrond-go/common/operationmodes" "github.com/ElrondNetwork/elrond-go/config" "github.com/ElrondNetwork/elrond-go/facade" "github.com/urfave/cli" @@ -522,12 +523,12 @@ func applyCompatibleConfigs(log logger.Logger, configs *config.Configs) error { } operationModes := strings.Split(configs.FlagsConfig.OperationMode, ",") - err := checkOperationModes(operationModes) + err := operationmodes.CheckOperationModes(operationModes) if err != nil { return err } - isInImportDBMode := configs.ImportDbConfig.IsImportDBMode || sliceContainsElement(operationModes, operationModeImportDb) + isInImportDBMode := configs.ImportDbConfig.IsImportDBMode || operationmodes.SliceContainsElement(operationModes, operationmodes.OperationModeImportDb) if isInImportDBMode { err := processConfigImportDBMode(log, configs) if err != nil { @@ -536,44 +537,65 @@ func applyCompatibleConfigs(log logger.Logger, configs *config.Configs) error { } // if FullArchive is enabled, we override the conflicting StoragePruning settings and StartInEpoch as well - isInFullArchiveMode := configs.PreferencesConfig.Preferences.FullArchive || sliceContainsElement(operationModes, operationModeFullArchive) + isInFullArchiveMode := configs.PreferencesConfig.Preferences.FullArchive || operationmodes.SliceContainsElement(operationModes, operationmodes.OperationModeFullArchive) if isInFullArchiveMode { processConfigFullArchiveMode(log, configs) } + if !isInImportDBMode && configs.ImportDbConfig.ImportDbNoSigCheckFlag { + return fmt.Errorf("import-db-no-sig-check can only be used with the import-db flag") + } - isInHistoricalBalancesMode := sliceContainsElement(operationModes, operationModeHistoricalBalances) + isInHistoricalBalancesMode := operationmodes.SliceContainsElement(operationModes, operationmodes.OperationModeHistoricalBalances) if isInHistoricalBalancesMode { processHistoricalBalancesMode(log, configs) } - isInDbLookupExtensionMode := sliceContainsElement(operationModes, operationModeDbLookupExtension) + isInDbLookupExtensionMode := operationmodes.SliceContainsElement(operationModes, operationmodes.OperationModeDbLookupExtension) if isInDbLookupExtensionMode { processDbLookupExtensionMode(log, configs) } + isInLiteObserverMode := operationmodes.SliceContainsElement(operationModes, operationmodes.OperationModeLiteObserver) + if isInLiteObserverMode { + processLiteObserverMode(log, configs) + } + return nil } func processHistoricalBalancesMode(log logger.Logger, configs *config.Configs) { + configs.GeneralConfig.StoragePruning.ValidatorCleanOldEpochsData = false configs.GeneralConfig.StoragePruning.ObserverCleanOldEpochsData = false + configs.GeneralConfig.GeneralSettings.StartInEpochEnabled = false configs.GeneralConfig.StoragePruning.AccountsTrieCleanOldEpochsData = false configs.GeneralConfig.StateTriesConfig.AccountsStatePruningEnabled = false configs.GeneralConfig.DbLookupExtensions.Enabled = true log.Warn("the node is in historical balances mode! Will auto-set some config values", - "GeneralSettings.StoragePruning.ObserverCleanOldEpochsData", configs.GeneralConfig.StoragePruning.ObserverCleanOldEpochsData, - "GeneralConfig.StoragePruning.AccountsTrieCleanOldEpochsData", configs.GeneralConfig.StoragePruning.AccountsTrieCleanOldEpochsData, - "GeneralConfig.StateTriesConfig.AccountsStatePruningEnabled", configs.GeneralConfig.StateTriesConfig.AccountsStatePruningEnabled, - "GeneralSettings.DbLookupExtensions.Enabled", configs.GeneralConfig.DbLookupExtensions.Enabled, + "StoragePruning.ValidatorCleanOldEpochsData", configs.GeneralConfig.StoragePruning.ValidatorCleanOldEpochsData, + "StoragePruning.ObserverCleanOldEpochsData", configs.GeneralConfig.StoragePruning.ObserverCleanOldEpochsData, + "StoragePruning.AccountsTrieCleanOldEpochsData", configs.GeneralConfig.StoragePruning.AccountsTrieCleanOldEpochsData, + "GeneralSettings.StartInEpochEnabled", configs.GeneralConfig.GeneralSettings.StartInEpochEnabled, + "StateTriesConfig.AccountsStatePruningEnabled", configs.GeneralConfig.StateTriesConfig.AccountsStatePruningEnabled, + "DbLookupExtensions.Enabled", configs.GeneralConfig.DbLookupExtensions.Enabled, ) - } func processDbLookupExtensionMode(log logger.Logger, configs *config.Configs) { configs.GeneralConfig.DbLookupExtensions.Enabled = true log.Warn("the node is in DB lookup extension mode! Will auto-set some config values", - "GeneralSettings.DbLookupExtensions.Enabled", configs.GeneralConfig.DbLookupExtensions.Enabled, + "DbLookupExtensions.Enabled", configs.GeneralConfig.DbLookupExtensions.Enabled, + ) +} + +func processLiteObserverMode(log logger.Logger, configs *config.Configs) { + configs.GeneralConfig.StoragePruning.ObserverCleanOldEpochsData = true + configs.GeneralConfig.StateTriesConfig.SnapshotsEnabled = false + + log.Warn("the node is in lite observer mode! Will auto-set some config values", + "StoragePruning.ObserverCleanOldEpochsData", configs.GeneralConfig.StoragePruning.ObserverCleanOldEpochsData, + "StateTriesConfig.SnapshotsEnabled", configs.GeneralConfig.StateTriesConfig.SnapshotsEnabled, ) } diff --git a/cmd/node/operationModes.go b/cmd/node/operationModes.go deleted file mode 100644 index 47dc46e31c9..00000000000 --- a/cmd/node/operationModes.go +++ /dev/null @@ -1,49 +0,0 @@ -package main - -import "fmt" - -const ( - operationModeImportDb = "import-db" - operationModeFullArchive = "full-archive" - operationModeDbLookupExtension = "db-lookup-extension" - operationModeHistoricalBalances = "historical-balances" -) - -func checkOperationModes(modes []string) error { - // db lookup extension and historical balances - isInvalid := sliceContainsBothElements(modes, operationModeHistoricalBalances, operationModeDbLookupExtension) - if isInvalid { - return fmt.Errorf("operation-mode flag cannot contain both db-lookup-extension and historical-balances") - } - - return nil -} - -func sliceContainsBothElements(elements []string, first string, second string) bool { - firstFound := false - secondFound := false - for _, element := range elements { - if element == first { - firstFound = true - } - if element == second { - secondFound = true - } - - if firstFound && secondFound { - return true - } - } - - return false -} - -func sliceContainsElement(elements []string, element string) bool { - for _, el := range elements { - if el == element { - return true - } - } - - return false -} diff --git a/common/operationmodes/operationmodes.go b/common/operationmodes/operationmodes.go new file mode 100644 index 00000000000..1a2ccb455d7 --- /dev/null +++ b/common/operationmodes/operationmodes.go @@ -0,0 +1,52 @@ +package operationmodes + +import "fmt" + +const ( + OperationModeImportDb = "import-db" + OperationModeFullArchive = "full-archive" + OperationModeDbLookupExtension = "db-lookup-extension" + OperationModeHistoricalBalances = "historical-balances" + OperationModeLiteObserver = "lite-observer" +) + +// CheckOperationModes will check the compatibility of the provided operation modes and return an error if any +func CheckOperationModes(modes []string) error { + // db lookup extension and historical balances + isInvalid := sliceContainsBothElements(modes, OperationModeHistoricalBalances, OperationModeDbLookupExtension) + if isInvalid { + return fmt.Errorf("operation-mode flag cannot contain both db-lookup-extension and historical-balances") + } + + // lite observer and historical balances + isInvalid = sliceContainsBothElements(modes, OperationModeLiteObserver, OperationModeHistoricalBalances) + if isInvalid { + return fmt.Errorf("operation-mode flag cannot contain both lite-observer and historical-balances") + } + + // lite observer and full archive + isInvalid = sliceContainsBothElements(modes, OperationModeLiteObserver, OperationModeFullArchive) + if isInvalid { + return fmt.Errorf("operation-mode flag cannot contain both lite-observer and full-archive") + } + + return nil +} + +func sliceContainsBothElements(elements []string, first string, second string) bool { + containsFirstElement := SliceContainsElement(elements, first) + containsSecondElement := SliceContainsElement(elements, second) + + return containsFirstElement && containsSecondElement +} + +// SliceContainsElement will return true if the provided slice contains the provided element +func SliceContainsElement(elements []string, element string) bool { + for _, el := range elements { + if el == element { + return true + } + } + + return false +} diff --git a/common/operationmodes/operationmodes_test.go b/common/operationmodes/operationmodes_test.go new file mode 100644 index 00000000000..9621c651697 --- /dev/null +++ b/common/operationmodes/operationmodes_test.go @@ -0,0 +1,46 @@ +package operationmodes + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestCheckOperationModes(t *testing.T) { + t.Parallel() + + t.Run("bad config", func(t *testing.T) { + t.Parallel() + + require.Equal(t, + "operation-mode flag cannot contain both db-lookup-extension and historical-balances", + CheckOperationModes([]string{OperationModeDbLookupExtension, OperationModeHistoricalBalances}).Error(), + ) + + require.Equal(t, + "operation-mode flag cannot contain both lite-observer and historical-balances", + CheckOperationModes([]string{OperationModeLiteObserver, OperationModeHistoricalBalances}).Error(), + ) + + require.Equal(t, + "operation-mode flag cannot contain both lite-observer and full-archive", + CheckOperationModes([]string{OperationModeLiteObserver, OperationModeFullArchive}).Error(), + ) + + require.Equal(t, + "operation-mode flag cannot contain both lite-observer and full-archive", + CheckOperationModes([]string{OperationModeFullArchive, OperationModeLiteObserver}).Error(), + ) + }) + + t.Run("ok config", func(t *testing.T) { + t.Parallel() + + require.NoError(t, + CheckOperationModes([]string{OperationModeDbLookupExtension}), + ) + require.NoError(t, + CheckOperationModes([]string{OperationModeDbLookupExtension, OperationModeImportDb}), + ) + }) +} From 5809d920c4be1155d1cdb27545dbedc3e7eff0d4 Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Wed, 19 Oct 2022 17:38:30 +0300 Subject: [PATCH 046/110] fixes after second review --- cmd/node/flags.go | 22 +++++++++++--------- common/operationmodes/operationmodes.go | 5 ++++- common/operationmodes/operationmodes_test.go | 5 ++++- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/cmd/node/flags.go b/cmd/node/flags.go index 4bcfe9923ca..49a2be7714e 100644 --- a/cmd/node/flags.go +++ b/cmd/node/flags.go @@ -522,28 +522,30 @@ func applyCompatibleConfigs(log logger.Logger, configs *config.Configs) error { runtime.SetMutexProfileFraction(5) } - operationModes := strings.Split(configs.FlagsConfig.OperationMode, ",") - err := operationmodes.CheckOperationModes(operationModes) - if err != nil { - return err - } - - isInImportDBMode := configs.ImportDbConfig.IsImportDBMode || operationmodes.SliceContainsElement(operationModes, operationmodes.OperationModeImportDb) + // import-db is not an operation mode because it needs the path to the DB to be imported from. Making it an operation mode + // would bring confusion + isInImportDBMode := configs.ImportDbConfig.IsImportDBMode if isInImportDBMode { err := processConfigImportDBMode(log, configs) if err != nil { return err } } + if !isInImportDBMode && configs.ImportDbConfig.ImportDbNoSigCheckFlag { + return fmt.Errorf("import-db-no-sig-check can only be used with the import-db flag") + } + + operationModes := strings.Split(configs.FlagsConfig.OperationMode, ",") + err := operationmodes.CheckOperationModes(operationModes) + if err != nil { + return err + } // if FullArchive is enabled, we override the conflicting StoragePruning settings and StartInEpoch as well isInFullArchiveMode := configs.PreferencesConfig.Preferences.FullArchive || operationmodes.SliceContainsElement(operationModes, operationmodes.OperationModeFullArchive) if isInFullArchiveMode { processConfigFullArchiveMode(log, configs) } - if !isInImportDBMode && configs.ImportDbConfig.ImportDbNoSigCheckFlag { - return fmt.Errorf("import-db-no-sig-check can only be used with the import-db flag") - } isInHistoricalBalancesMode := operationmodes.SliceContainsElement(operationModes, operationmodes.OperationModeHistoricalBalances) if isInHistoricalBalancesMode { diff --git a/common/operationmodes/operationmodes.go b/common/operationmodes/operationmodes.go index 1a2ccb455d7..ae55238f36c 100644 --- a/common/operationmodes/operationmodes.go +++ b/common/operationmodes/operationmodes.go @@ -3,7 +3,6 @@ package operationmodes import "fmt" const ( - OperationModeImportDb = "import-db" OperationModeFullArchive = "full-archive" OperationModeDbLookupExtension = "db-lookup-extension" OperationModeHistoricalBalances = "historical-balances" @@ -12,6 +11,10 @@ const ( // CheckOperationModes will check the compatibility of the provided operation modes and return an error if any func CheckOperationModes(modes []string) error { + if len(modes) == 0 { + return nil + } + // db lookup extension and historical balances isInvalid := sliceContainsBothElements(modes, OperationModeHistoricalBalances, OperationModeDbLookupExtension) if isInvalid { diff --git a/common/operationmodes/operationmodes_test.go b/common/operationmodes/operationmodes_test.go index 9621c651697..f9da4634383 100644 --- a/common/operationmodes/operationmodes_test.go +++ b/common/operationmodes/operationmodes_test.go @@ -40,7 +40,10 @@ func TestCheckOperationModes(t *testing.T) { CheckOperationModes([]string{OperationModeDbLookupExtension}), ) require.NoError(t, - CheckOperationModes([]string{OperationModeDbLookupExtension, OperationModeImportDb}), + CheckOperationModes([]string{OperationModeDbLookupExtension, OperationModeFullArchive}), + ) + require.NoError(t, + CheckOperationModes([]string{}), ) }) } From 6ee6780d9a0cab2ae2fc44a110bc8022ecb88e00 Mon Sep 17 00:00:00 2001 From: BeniaminDrasovean Date: Wed, 19 Oct 2022 17:51:15 +0300 Subject: [PATCH 047/110] update go mod --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e5a5c5fcbcb..df7ed72b510 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.15 require ( github.com/ElrondNetwork/covalent-indexer-go v1.0.6 - github.com/ElrondNetwork/elastic-indexer-go v1.2.45-0.20221018133345-4162960cd397 + github.com/ElrondNetwork/elastic-indexer-go v1.2.45-0.20221019144818-5b4fe7b3e724 github.com/ElrondNetwork/elrond-go-core v1.1.21-0.20221018132248-0621ead5b6d3 github.com/ElrondNetwork/elrond-go-crypto v1.2.1 github.com/ElrondNetwork/elrond-go-logger v1.0.9 diff --git a/go.sum b/go.sum index 357ff8651fd..1ab46e00fe4 100644 --- a/go.sum +++ b/go.sum @@ -49,8 +49,8 @@ github.com/ElrondNetwork/concurrent-map v0.1.3 h1:j2LtPrNJuerannC1cQDE79STvi/P04 github.com/ElrondNetwork/concurrent-map v0.1.3/go.mod h1:3XwSwn4JHI0lrKxWLZvtp53Emr8BXYTmNQGwcukHJEE= github.com/ElrondNetwork/covalent-indexer-go v1.0.6 h1:+LNKItUc+Pb7WuTbil3VuiLMmdQ1AY7lBJM476PtVNE= github.com/ElrondNetwork/covalent-indexer-go v1.0.6/go.mod h1:j3h2g96vqhJAuj3aEX2PWhomae2/o7YfXGEfweNXEeQ= -github.com/ElrondNetwork/elastic-indexer-go v1.2.45-0.20221018133345-4162960cd397 h1:Mhl5CZtdPRlurvmq4s21aYWcwbUDXIrUg6gzYMC15Vk= -github.com/ElrondNetwork/elastic-indexer-go v1.2.45-0.20221018133345-4162960cd397/go.mod h1:UImkSOg50yVUIHNQqFcwlOV2IgqL93cWtlMuSGhxVik= +github.com/ElrondNetwork/elastic-indexer-go v1.2.45-0.20221019144818-5b4fe7b3e724 h1:o5lUBBR+B6MBxOBEcGgs+25qPFH908bLFN0RK3vj+3g= +github.com/ElrondNetwork/elastic-indexer-go v1.2.45-0.20221019144818-5b4fe7b3e724/go.mod h1:UImkSOg50yVUIHNQqFcwlOV2IgqL93cWtlMuSGhxVik= github.com/ElrondNetwork/elrond-go-core v1.0.0/go.mod h1:FQMem7fFF4+8pQ6lVsBZq6yO+smD0nV23P4bJpmPjTo= github.com/ElrondNetwork/elrond-go-core v1.1.7/go.mod h1:O9FkkTT2H9kxCzfn40TbhoCDXzGmUrRVusMomhK/Y3g= github.com/ElrondNetwork/elrond-go-core v1.1.13/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= From 8db622939dc60a107a8546e63ce528f0314e07c9 Mon Sep 17 00:00:00 2001 From: jules01 Date: Thu, 20 Oct 2022 10:24:07 +0300 Subject: [PATCH 048/110] - compressed configs --- cmd/node/config/enableEpochs.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/node/config/enableEpochs.toml b/cmd/node/config/enableEpochs.toml index 62950084e1c..9bce7c66afb 100644 --- a/cmd/node/config/enableEpochs.toml +++ b/cmd/node/config/enableEpochs.toml @@ -222,7 +222,7 @@ FixAsyncCallBackArgsListEnableEpoch = 1 # FixOldTokenLiquidityEnableEpoch represents the epoch when the fix for old token liquidity is enabled - FixOldTokenLiquidityEnableEpoch = 2 + FixOldTokenLiquidityEnableEpoch = 1 # MaxNodesChangeEnableEpoch holds configuration for changing the maximum number of nodes and the enabling epoch MaxNodesChangeEnableEpoch = [ From 91836d62ab500de4cc5ee6df718e8a71eb55aa51 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Thu, 20 Oct 2022 11:40:28 +0300 Subject: [PATCH 049/110] renamed *Received* to *Processed* into sizeSyncStatistics interface --- factory/bootstrap/bootstrapComponents.go | 2 +- go.mod | 2 +- go.sum | 3 ++- heartbeat/interface.go | 2 +- .../disabled/trieSyncStatisticsProvider.go | 4 ++-- heartbeat/sender/heartbeatSender.go | 2 +- heartbeat/sender/heartbeatSender_test.go | 2 +- .../state/stateTrieSync/stateTrieSync_test.go | 4 ++-- state/syncer/baseAccountsSyncer.go | 4 ++-- testscommon/sizeSyncStatisticsHandlerStub.go | 18 ++++++++--------- trie/depthFirstSync.go | 2 +- trie/doubleListSync.go | 2 +- trie/statistics/trieSyncStatistics.go | 20 +++++++++---------- trie/statistics/trieSyncStatistics_test.go | 18 ++++++++--------- trie/sync.go | 2 +- 15 files changed, 44 insertions(+), 43 deletions(-) diff --git a/factory/bootstrap/bootstrapComponents.go b/factory/bootstrap/bootstrapComponents.go index 4cba3114aae..832f6cfddbb 100644 --- a/factory/bootstrap/bootstrapComponents.go +++ b/factory/bootstrap/bootstrapComponents.go @@ -171,7 +171,7 @@ func (bcf *bootstrapComponentsFactory) Create() (*bootstrapComponents, error) { // increment num received to make sure that first heartbeat message // will have value 1, thus explorer will display status in progress tss := bcf.statusCoreComponents.TrieSyncStatistics() - tss.AddNumReceived(1) + tss.AddNumProcessed(1) epochStartBootstrapArgs := bootstrap.ArgsEpochStartBootstrap{ CoreComponentsHolder: bcf.coreComponents, diff --git a/go.mod b/go.mod index 6fea0901383..0851644ab1a 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.15 require ( github.com/ElrondNetwork/covalent-indexer-go v1.0.6 github.com/ElrondNetwork/elastic-indexer-go v1.2.44 - github.com/ElrondNetwork/elrond-go-core v1.1.20 + github.com/ElrondNetwork/elrond-go-core v1.1.21-0.20221020082925-3facd9ef36a3 github.com/ElrondNetwork/elrond-go-crypto v1.2.1 github.com/ElrondNetwork/elrond-go-logger v1.0.9 github.com/ElrondNetwork/elrond-go-p2p v1.0.3 diff --git a/go.sum b/go.sum index 2bc873d1b97..5f1ce98588b 100644 --- a/go.sum +++ b/go.sum @@ -56,8 +56,9 @@ github.com/ElrondNetwork/elrond-go-core v1.1.7/go.mod h1:O9FkkTT2H9kxCzfn40TbhoC github.com/ElrondNetwork/elrond-go-core v1.1.13/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.18/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.19/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= -github.com/ElrondNetwork/elrond-go-core v1.1.20 h1:2JbXK7BrgbMm+q9xgyW80H8Ljn+HcGfbdXZp8YuFPXc= github.com/ElrondNetwork/elrond-go-core v1.1.20/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= +github.com/ElrondNetwork/elrond-go-core v1.1.21-0.20221020082925-3facd9ef36a3 h1:aBtB9X4sKKgrK+bxusmk1+kZKY33faoMitv2sHA/zm8= +github.com/ElrondNetwork/elrond-go-core v1.1.21-0.20221020082925-3facd9ef36a3/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-crypto v1.0.0/go.mod h1:DGiR7/j1xv729Xg8SsjYaUzWXL5svMd44REXjWS/gAc= github.com/ElrondNetwork/elrond-go-crypto v1.2.1 h1:5wWCBEZp5SMFO2+Nal8UaJNJcG9G9J4PHNNZvQpEeUE= github.com/ElrondNetwork/elrond-go-crypto v1.2.1/go.mod h1:UNmpDaJjLTKxfzUcwua2R7Mh9bicw/L3ICJt5V7zqMo= diff --git a/heartbeat/interface.go b/heartbeat/interface.go index 673c8be16e0..948a22bae77 100644 --- a/heartbeat/interface.go +++ b/heartbeat/interface.go @@ -132,6 +132,6 @@ type PeerShardMapper interface { // TrieSyncStatisticsProvider is able to provide trie sync statistics type TrieSyncStatisticsProvider interface { - NumReceived() int + NumProcessed() int IsInterfaceNil() bool } diff --git a/heartbeat/sender/disabled/trieSyncStatisticsProvider.go b/heartbeat/sender/disabled/trieSyncStatisticsProvider.go index fca73659025..fe75cd56de7 100644 --- a/heartbeat/sender/disabled/trieSyncStatisticsProvider.go +++ b/heartbeat/sender/disabled/trieSyncStatisticsProvider.go @@ -8,8 +8,8 @@ func NewTrieSyncStatisticsProvider() *trieSyncStatisticsProvider { return &trieSyncStatisticsProvider{} } -// NumReceived returns 0 always -func (tssp *trieSyncStatisticsProvider) NumReceived() int { +// NumProcessed returns 0 always +func (tssp *trieSyncStatisticsProvider) NumProcessed() int { return 0 } diff --git a/heartbeat/sender/heartbeatSender.go b/heartbeat/sender/heartbeatSender.go index 5415c25b65f..07749afb1d5 100644 --- a/heartbeat/sender/heartbeatSender.go +++ b/heartbeat/sender/heartbeatSender.go @@ -120,7 +120,7 @@ func (sender *heartbeatSender) execute() error { return err } - trieNodesReceived := sender.trieSyncStatisticsProvider.NumReceived() + trieNodesReceived := sender.trieSyncStatisticsProvider.NumProcessed() msg := &heartbeat.HeartbeatV2{ Payload: payloadBytes, VersionNumber: sender.versionNumber, diff --git a/heartbeat/sender/heartbeatSender_test.go b/heartbeat/sender/heartbeatSender_test.go index b9d028f63d4..0dfd8aa28be 100644 --- a/heartbeat/sender/heartbeatSender_test.go +++ b/heartbeat/sender/heartbeatSender_test.go @@ -338,7 +338,7 @@ func TestHeartbeatSender_execute(t *testing.T) { }, } args.trieSyncStatisticsProvider = &testscommon.SizeSyncStatisticsHandlerStub{ - NumReceivedField: providedNumTrieNodesSynced, + NumProcessedField: providedNumTrieNodesSynced, } senderInstance, _ := newHeartbeatSender(args) diff --git a/integrationTests/state/stateTrieSync/stateTrieSync_test.go b/integrationTests/state/stateTrieSync/stateTrieSync_test.go index c5d6c8dcea2..d652ef6e1fd 100644 --- a/integrationTests/state/stateTrieSync/stateTrieSync_test.go +++ b/integrationTests/state/stateTrieSync/stateTrieSync_test.go @@ -160,7 +160,7 @@ func printStatistics(ctx context.Context, stats common.SizeSyncStatisticsHandler select { case <-ctx.Done(): log.Info("finished trie sync", - "num received", stats.NumReceived(), + "num processed", stats.NumProcessed(), "num large nodes", stats.NumLarge(), "num missing", stats.NumMissing(), "data size received", core.ConvertBytes(stats.NumBytesReceived()), @@ -177,7 +177,7 @@ func printStatistics(ctx context.Context, stats common.SizeSyncStatisticsHandler speed := fmt.Sprintf("%s/s", core.ConvertBytes(uint64(bytesReceivedPerSec))) log.Info("trie sync in progress", - "num received", stats.NumReceived(), + "num processed", stats.NumProcessed(), "num large nodes", stats.NumLarge(), "num missing", stats.NumMissing(), "data size received", core.ConvertBytes(stats.NumBytesReceived()), diff --git a/state/syncer/baseAccountsSyncer.go b/state/syncer/baseAccountsSyncer.go index 6478d559af2..5cfd8c0c473 100644 --- a/state/syncer/baseAccountsSyncer.go +++ b/state/syncer/baseAccountsSyncer.go @@ -144,7 +144,7 @@ func (b *baseAccountsSyncer) printStatistics(ctx context.Context) { log.Info("finished trie sync", "name", b.name, "time elapsed", totalSyncDuration.Truncate(time.Second), - "num processed", b.userAccountsSyncStatisticsHandler.NumReceived(), + "num processed", b.userAccountsSyncStatisticsHandler.NumProcessed(), "num large nodes", b.userAccountsSyncStatisticsHandler.NumLarge(), "num missing", b.userAccountsSyncStatisticsHandler.NumMissing(), "state data size", core.ConvertBytes(b.userAccountsSyncStatisticsHandler.NumBytesReceived()), @@ -171,7 +171,7 @@ func (b *baseAccountsSyncer) printStatistics(ctx context.Context) { "name", b.name, "time elapsed", time.Since(startedSync).Truncate(time.Second), "num tries currently syncing", b.userAccountsSyncStatisticsHandler.NumTries(), - "num processed", b.userAccountsSyncStatisticsHandler.NumReceived(), + "num processed", b.userAccountsSyncStatisticsHandler.NumProcessed(), "num large nodes", b.userAccountsSyncStatisticsHandler.NumLarge(), "num missing", b.userAccountsSyncStatisticsHandler.NumMissing(), "num tries synced", fmt.Sprintf("%d/%d", atomic.LoadInt32(&b.numTriesSynced), atomic.LoadInt32(&b.numMaxTries)), diff --git a/testscommon/sizeSyncStatisticsHandlerStub.go b/testscommon/sizeSyncStatisticsHandlerStub.go index 30359fa2fae..128d5f1d436 100644 --- a/testscommon/sizeSyncStatisticsHandlerStub.go +++ b/testscommon/sizeSyncStatisticsHandlerStub.go @@ -9,13 +9,13 @@ type SizeSyncStatisticsHandlerStub struct { IncrementIterationCalled func() ProcessingTimeCalled func() time.Duration ResetCalled func() - AddNumReceivedCalled func(value int) + AddNumProcessedCalled func(value int) AddNumLargeCalled func(value int) SetNumMissingCalled func(rootHash []byte, value int) NumBytesReceivedField uint64 NumTriesField int NumIterationsField int - NumReceivedField int + NumProcessedField int NumLargeField int NumMissingField int } @@ -27,10 +27,10 @@ func (stub *SizeSyncStatisticsHandlerStub) Reset() { } } -// AddNumReceived - -func (stub *SizeSyncStatisticsHandlerStub) AddNumReceived(value int) { - if stub.AddNumReceivedCalled != nil { - stub.AddNumReceivedCalled(value) +// AddNumProcessed - +func (stub *SizeSyncStatisticsHandlerStub) AddNumProcessed(value int) { + if stub.AddNumProcessedCalled != nil { + stub.AddNumProcessedCalled(value) } } @@ -48,9 +48,9 @@ func (stub *SizeSyncStatisticsHandlerStub) SetNumMissing(rootHash []byte, value } } -// NumReceived - -func (stub *SizeSyncStatisticsHandlerStub) NumReceived() int { - return stub.NumReceivedField +// NumProcessed - +func (stub *SizeSyncStatisticsHandlerStub) NumProcessed() int { + return stub.NumProcessedField } // NumLarge - diff --git a/trie/depthFirstSync.go b/trie/depthFirstSync.go index 38112afe792..5df2c92d54c 100644 --- a/trie/depthFirstSync.go +++ b/trie/depthFirstSync.go @@ -246,7 +246,7 @@ func (d *depthFirstTrieSyncer) storeTrieNode(element node) error { } d.timeoutHandler.ResetWatchdog() - d.trieSyncStatistics.AddNumReceived(1) + d.trieSyncStatistics.AddNumProcessed(1) if numBytes > core.MaxBufferSizeToSendTrieNodes { d.trieSyncStatistics.AddNumLarge(1) } diff --git a/trie/doubleListSync.go b/trie/doubleListSync.go index 759db92780d..fb6ad594b95 100644 --- a/trie/doubleListSync.go +++ b/trie/doubleListSync.go @@ -218,7 +218,7 @@ func (d *doubleListTrieSyncer) processExistingNodes() error { return err } - d.trieSyncStatistics.AddNumReceived(1) + d.trieSyncStatistics.AddNumProcessed(1) if numBytes > core.MaxBufferSizeToSendTrieNodes { d.trieSyncStatistics.AddNumLarge(1) } diff --git a/trie/statistics/trieSyncStatistics.go b/trie/statistics/trieSyncStatistics.go index fa780159b81..d63ddd5ad04 100644 --- a/trie/statistics/trieSyncStatistics.go +++ b/trie/statistics/trieSyncStatistics.go @@ -7,7 +7,7 @@ import ( type trieSyncStatistics struct { sync.RWMutex - numReceived int + numProcessed int numMissing int numLarge int missingMap map[string]int @@ -26,7 +26,7 @@ func NewTrieSyncStatistics() *trieSyncStatistics { // Reset will reset the contained values to 0 func (tss *trieSyncStatistics) Reset() { tss.Lock() - tss.numReceived = 0 + tss.numProcessed = 0 tss.numMissing = 0 tss.numLarge = 0 tss.numBytesReceived = 0 @@ -36,10 +36,10 @@ func (tss *trieSyncStatistics) Reset() { tss.Unlock() } -// AddNumReceived will add the provided value to the existing numReceived -func (tss *trieSyncStatistics) AddNumReceived(value int) { +// AddNumProcessed will add the provided value to the existing numProcessed +func (tss *trieSyncStatistics) AddNumProcessed(value int) { tss.Lock() - tss.numReceived += value + tss.numProcessed += value tss.Unlock() } @@ -91,15 +91,15 @@ func (tss *trieSyncStatistics) IncrementIteration() { tss.Unlock() } -// NumReceived returns the received nodes -func (tss *trieSyncStatistics) NumReceived() int { +// NumProcessed returns the number of processed nodes +func (tss *trieSyncStatistics) NumProcessed() int { tss.RLock() defer tss.RUnlock() - return tss.numReceived + return tss.numProcessed } -// NumLarge returns the received large nodes +// NumLarge returns the number of processed large nodes func (tss *trieSyncStatistics) NumLarge() int { tss.RLock() defer tss.RUnlock() @@ -107,7 +107,7 @@ func (tss *trieSyncStatistics) NumLarge() int { return tss.numLarge } -// NumMissing returns the missing nodes +// NumMissing returns the number of missing nodes func (tss *trieSyncStatistics) NumMissing() int { tss.RLock() defer tss.RUnlock() diff --git a/trie/statistics/trieSyncStatistics_test.go b/trie/statistics/trieSyncStatistics_test.go index 5d8b39e8701..9b3307107e5 100644 --- a/trie/statistics/trieSyncStatistics_test.go +++ b/trie/statistics/trieSyncStatistics_test.go @@ -18,21 +18,21 @@ func TestNewTrieSyncStatistics_ShouldWork(t *testing.T) { assert.False(t, check.IfNil(tss)) } -func TestTrieSyncStatistics_Received(t *testing.T) { +func TestTrieSyncStatistics_Processed(t *testing.T) { t.Parallel() tss := NewTrieSyncStatistics() - assert.Equal(t, 0, tss.NumReceived()) + assert.Equal(t, 0, tss.NumProcessed()) - tss.AddNumReceived(2) - assert.Equal(t, 2, tss.NumReceived()) + tss.AddNumProcessed(2) + assert.Equal(t, 2, tss.NumProcessed()) - tss.AddNumReceived(4) - assert.Equal(t, 6, tss.NumReceived()) + tss.AddNumProcessed(4) + assert.Equal(t, 6, tss.NumProcessed()) tss.Reset() - assert.Equal(t, 0, tss.NumReceived()) + assert.Equal(t, 0, tss.NumProcessed()) } func TestTrieSyncStatistics_Missing(t *testing.T) { @@ -186,7 +186,7 @@ func TestParallelOperationsShouldNotPanic(t *testing.T) { case 0: tss.Reset() case 1: - tss.AddNumReceived(1) + tss.AddNumProcessed(1) case 2: tss.AddNumBytesReceived(2) case 3: @@ -198,7 +198,7 @@ func TestParallelOperationsShouldNotPanic(t *testing.T) { case 6: tss.IncrementIteration() case 7: - _ = tss.NumReceived() + _ = tss.NumProcessed() case 8: _ = tss.NumLarge() case 9: diff --git a/trie/sync.go b/trie/sync.go index e0bac17c858..7fdebb098e6 100644 --- a/trie/sync.go +++ b/trie/sync.go @@ -275,7 +275,7 @@ func (ts *trieSyncer) addNew(nextNodes []node) bool { nodeInfo, ok := ts.nodesForTrie[nextHash] if !ok || !nodeInfo.received { newElement = true - ts.trieSyncStatistics.AddNumReceived(1) + ts.trieSyncStatistics.AddNumProcessed(1) ts.nodesForTrie[nextHash] = trieNodeInfo{ trieNode: nextNode, received: true, From d7c5152d2e0fd9cac737c4ba7898b6a1b88bb5eb Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Thu, 20 Oct 2022 15:27:14 +0300 Subject: [PATCH 050/110] added logs for change owner --- vm/systemSmartContracts/delegation.go | 26 +++++++++++++++++++--- vm/systemSmartContracts/delegation_test.go | 17 ++++++++++++++ vm/systemSmartContracts/logs.go | 16 ++++++++----- vm/systemSmartContracts/logs_test.go | 10 +++------ 4 files changed, 54 insertions(+), 15 deletions(-) diff --git a/vm/systemSmartContracts/delegation.go b/vm/systemSmartContracts/delegation.go index 845db4a5042..e9b9be49d66 100644 --- a/vm/systemSmartContracts/delegation.go +++ b/vm/systemSmartContracts/delegation.go @@ -32,6 +32,8 @@ const initFromValidatorData = "initFromValidatorData" const mergeValidatorDataToDelegation = "mergeValidatorDataToDelegation" const deleteWhitelistForMerge = "deleteWhitelistForMerge" const whitelistedAddress = "whitelistedAddress" +const changeOwner = "changeOwner" +const withdraw = "withdraw" const ( active = uint32(0) @@ -238,7 +240,7 @@ func (d *delegation) Execute(args *vmcommon.ContractCallInput) vmcommon.ReturnCo return d.delegate(args) case "unDelegate": return d.unDelegate(args) - case "withdraw": + case withdraw: return d.withdraw(args) case "changeServiceFee": return d.changeServiceFee(args) @@ -298,7 +300,7 @@ func (d *delegation) Execute(args *vmcommon.ContractCallInput) vmcommon.ReturnCo return d.addTokens(args) case "correctNodesStatus": return d.correctNodesStatus(args) - case "changeOwner": + case changeOwner: return d.changeOwner(args) } @@ -991,6 +993,24 @@ func (d *delegation) changeOwner(args *vmcommon.ContractCallInput) vmcommon.Retu d.eei.SetStorageForAddress(d.delegationMgrSCAddress, args.CallerAddr, []byte{}) d.eei.SetStorage([]byte(ownerKey), args.Arguments[0]) + globalFund, err := d.getGlobalFundData() + if err != nil { + globalFund = &GlobalFundData{ + TotalActive: big.NewInt(0), + } + + log.Warn("d.changeOwner cannot get global fund data", "error", err) + } + dStatus, err := d.getDelegationStatus() + if err != nil { + dStatus = &DelegationContractStatus{} + + log.Warn("d.changeOwner cannot get delegation status", "error", err) + } + + d.createAndAddLogEntryForDelegate(args, big.NewInt(0), globalFund, ownerDelegatorData, dStatus, isNew) + d.createAndAddLogEntryForWithdraw(withdraw, args.CallerAddr, big.NewInt(0), globalFund, ownerDelegatorData, d.numUsers(), true) + return vmcommon.Ok } @@ -2191,7 +2211,7 @@ func (d *delegation) withdraw(args *vmcommon.ContractCallInput) vmcommon.ReturnC return vmcommon.UserError } - d.createAndAddLogEntryForWithdraw(args, actualUserUnBond, globalFund, delegator, d.numUsers(), wasDeleted) + d.createAndAddLogEntryForWithdraw(args.Function, args.CallerAddr, actualUserUnBond, globalFund, delegator, d.numUsers(), wasDeleted) return vmcommon.Ok } diff --git a/vm/systemSmartContracts/delegation_test.go b/vm/systemSmartContracts/delegation_test.go index ab68e096c99..3c36ebb5bec 100644 --- a/vm/systemSmartContracts/delegation_test.go +++ b/vm/systemSmartContracts/delegation_test.go @@ -5419,6 +5419,15 @@ func TestDelegationSystemSC_ExecuteChangeOwner(t *testing.T) { returnCode = d.Execute(vmInput) assert.Equal(t, returnCode, vmcommon.UserError) + assert.Len(t, eei.logs, 2) + assert.Equal(t, []byte("delegate"), eei.logs[0].Identifier) + assert.Equal(t, []byte("second123"), eei.logs[0].Address) + assert.Len(t, eei.logs, 2) + assert.Equal(t, []byte(withdraw), eei.logs[1].Identifier) + assert.Equal(t, []byte("ownerAddr"), eei.logs[1].Address) + assert.Equal(t, boolToSlice(true), eei.logs[1].Topics[4]) + + eei.logs = nil vmInput.CallerAddr = []byte("second123") vmInput.Arguments[0] = []byte("ownerAddr") returnCode = d.Execute(vmInput) @@ -5427,4 +5436,12 @@ func TestDelegationSystemSC_ExecuteChangeOwner(t *testing.T) { assert.Equal(t, eei.storageUpdate[string(d.delegationMgrSCAddress)]["ownerAddr"], vmInput.RecipientAddr) assert.Equal(t, eei.storageUpdate[string(d.delegationMgrSCAddress)]["second123"], []byte{}) + + assert.Len(t, eei.logs, 2) + assert.Equal(t, []byte("delegate"), eei.logs[0].Identifier) + assert.Equal(t, []byte("ownerAddr"), eei.logs[0].Address) + assert.Len(t, eei.logs, 2) + assert.Equal(t, []byte(withdraw), eei.logs[1].Identifier) + assert.Equal(t, []byte("second123"), eei.logs[1].Address) + assert.Equal(t, boolToSlice(true), eei.logs[1].Topics[4]) } diff --git a/vm/systemSmartContracts/logs.go b/vm/systemSmartContracts/logs.go index 44a492f46da..840963b5b04 100644 --- a/vm/systemSmartContracts/logs.go +++ b/vm/systemSmartContracts/logs.go @@ -8,9 +8,13 @@ import ( ) func (d *delegation) createAndAddLogEntry(contractCallInput *vmcommon.ContractCallInput, topics ...[]byte) { + d.createAndAddLogEntryCustom(contractCallInput.Function, contractCallInput.CallerAddr, topics...) +} + +func (d *delegation) createAndAddLogEntryCustom(identifier string, address []byte, topics ...[]byte) { entry := &vmcommon.LogEntry{ - Identifier: []byte(contractCallInput.Function), - Address: contractCallInput.CallerAddr, + Identifier: []byte(identifier), + Address: address, Topics: topics, } @@ -18,7 +22,8 @@ func (d *delegation) createAndAddLogEntry(contractCallInput *vmcommon.ContractCa } func (d *delegation) createAndAddLogEntryForWithdraw( - contractCallInput *vmcommon.ContractCallInput, + function string, + address []byte, actualUserUnBond *big.Int, globalFund *GlobalFundData, delegator *DelegatorData, @@ -26,7 +31,7 @@ func (d *delegation) createAndAddLogEntryForWithdraw( wasDeleted bool, ) { activeFund := d.getFundForLogEntry(delegator.ActiveFund) - d.createAndAddLogEntry(contractCallInput, actualUserUnBond.Bytes(), activeFund.Bytes(), big.NewInt(0).SetUint64(numUsers).Bytes(), globalFund.TotalActive.Bytes(), boolToSlice(wasDeleted)) + d.createAndAddLogEntryCustom(function, address, actualUserUnBond.Bytes(), activeFund.Bytes(), big.NewInt(0).SetUint64(numUsers).Bytes(), globalFund.TotalActive.Bytes(), boolToSlice(wasDeleted)) } func (d *delegation) createAndAddLogEntryForDelegate( @@ -52,7 +57,8 @@ func (d *delegation) createAndAddLogEntryForDelegate( address := contractCallInput.CallerAddr function := contractCallInput.Function if function == initFromValidatorData || - function == mergeValidatorDataToDelegation { + function == mergeValidatorDataToDelegation || + function == changeOwner { address = contractCallInput.Arguments[0] topics = append(topics, contractCallInput.RecipientAddr) diff --git a/vm/systemSmartContracts/logs_test.go b/vm/systemSmartContracts/logs_test.go index 4074260284d..9104d5bad77 100644 --- a/vm/systemSmartContracts/logs_test.go +++ b/vm/systemSmartContracts/logs_test.go @@ -78,12 +78,8 @@ func TestCreateAndAddLogEntryForWithdraw(t *testing.T) { }, marshalizer: marshalizer, }).createAndAddLogEntryForWithdraw( - &vmcommon.ContractCallInput{ - Function: "withdrawal", - VMInput: vmcommon.VMInput{ - CallerAddr: []byte("caller"), - }, - }, + "withdraw", + []byte("caller"), actualUserUnBond, &GlobalFundData{ TotalActive: big.NewInt(1000000), @@ -96,7 +92,7 @@ func TestCreateAndAddLogEntryForWithdraw(t *testing.T) { ) require.Equal(t, &vmcommon.LogEntry{ - Identifier: []byte("withdrawal"), + Identifier: []byte("withdraw"), Address: []byte("caller"), Topics: [][]byte{actualUserUnBond.Bytes(), big.NewInt(5000).Bytes(), big.NewInt(1).Bytes(), big.NewInt(1000000).Bytes(), []byte(strconv.FormatBool(false))}, }, res) From 0cf9cfba6688595627fe7fb327bc743f338235da Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Thu, 20 Oct 2022 16:59:35 +0300 Subject: [PATCH 051/110] fix init --- vm/systemSmartContracts/logs.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/vm/systemSmartContracts/logs.go b/vm/systemSmartContracts/logs.go index 840963b5b04..71dfdbf399b 100644 --- a/vm/systemSmartContracts/logs.go +++ b/vm/systemSmartContracts/logs.go @@ -4,6 +4,7 @@ import ( "math/big" "strconv" + "github.com/ElrondNetwork/elrond-go-core/core" vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) @@ -63,6 +64,9 @@ func (d *delegation) createAndAddLogEntryForDelegate( topics = append(topics, contractCallInput.RecipientAddr) } + if function == core.SCDeployInitFunctionName { + topics = append(topics, contractCallInput.RecipientAddr) + } entry := &vmcommon.LogEntry{ Identifier: []byte("delegate"), From 65fe004e12f96e0428f887839ae5e50b65161f66 Mon Sep 17 00:00:00 2001 From: Elrond/ Date: Thu, 20 Oct 2022 17:09:57 +0300 Subject: [PATCH 052/110] FIX: seed node could not connect to peers --- cmd/node/config/p2p.toml | 2 +- cmd/seednode/config/p2pKey.pem | 4 ++++ scripts/testnet/include/config.sh | 2 +- scripts/testnet/variables.sh | 6 +++--- 4 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 cmd/seednode/config/p2pKey.pem diff --git a/cmd/node/config/p2p.toml b/cmd/node/config/p2p.toml index 2ce99da3ba0..bc79c09b151 100644 --- a/cmd/node/config/p2p.toml +++ b/cmd/node/config/p2p.toml @@ -47,7 +47,7 @@ # #If the initial peers list is left empty, the node will not try to connect to other peers during initial bootstrap #phase but will accept connections and will do the network discovery if another peer connects to it - InitialPeerList = ["/ip4/127.0.0.1/tcp/9999/p2p/16Uiu2HAkw5SNNtSvH1zJiQ6Gc3WoGNSxiyNueRKe6fuAuh57G3Bk"] + InitialPeerList = ["/ip4/127.0.0.1/tcp/9999/p2p/16Uiu2HAmKBCtAqnmawCJ5nxd9AccU3fj4sjA8WA3oksqeZgcsJJv"] #kademlia's routing table bucket size BucketSize = 100 diff --git a/cmd/seednode/config/p2pKey.pem b/cmd/seednode/config/p2pKey.pem new file mode 100644 index 00000000000..590c4f9290d --- /dev/null +++ b/cmd/seednode/config/p2pKey.pem @@ -0,0 +1,4 @@ +-----BEGIN PRIVATE KEY for 16Uiu2HAmKBCtAqnmawCJ5nxd9AccU3fj4sjA8WA3oksqeZgcsJJv----- +NjBmNzVjYTE2NDMyMDdiZTFkMTQzZDg0ODBmZjRjZmYyMjc4NGRjMjFiZGUwNjE4 +YzNkMGU0OTU0YTRmYzk3MA== +-----END PRIVATE KEY for 16Uiu2HAmKBCtAqnmawCJ5nxd9AccU3fj4sjA8WA3oksqeZgcsJJv----- diff --git a/scripts/testnet/include/config.sh b/scripts/testnet/include/config.sh index c662f6cfa1f..aec225b48cc 100644 --- a/scripts/testnet/include/config.sh +++ b/scripts/testnet/include/config.sh @@ -28,7 +28,7 @@ copyConfig() { copySeednodeConfig() { pushd $TESTNETDIR - cp $SEEDNODEDIR/config/*.toml ./seednode/config + cp $SEEDNODEDIR/config/* ./seednode/config popd } diff --git a/scripts/testnet/variables.sh b/scripts/testnet/variables.sh index f9d836c2afa..e90c5dcdc1d 100644 --- a/scripts/testnet/variables.sh +++ b/scripts/testnet/variables.sh @@ -12,7 +12,7 @@ export USE_PROXY=1 # Enable the Elrond Transaction Generator. Note that this is a private # repository (elrond-txgen-go). -export USE_TXGEN=0 +export USE_TXGEN=1 # Path where the testnet will be instantiated. This folder is assumed to not # exist, but it doesn't matter if it already does. It will be created if not, @@ -44,7 +44,7 @@ export NODE_WATCHER=0 export SEEDNODE_DELAY=5 export GENESIS_DELAY=30 export HARDFORK_DELAY=900 #15 minutes enough to take export and gracefully close -export NODE_DELAY=60 +export NODE_DELAY=20 export GENESIS_STAKE_TYPE="direct" #'delegated' or 'direct' as in direct stake @@ -87,7 +87,7 @@ export PORT_ORIGIN_VALIDATOR="21500" export PORT_ORIGIN_VALIDATOR_REST="9500" # Address of the Seednode. Will be written to the p2p.toml file of the Nodes -export P2P_SEEDNODE_ADDRESS="/ip4/127.0.0.1/tcp/$PORT_SEEDNODE/p2p/16Uiu2HAkw5SNNtSvH1zJiQ6Gc3WoGNSxiyNueRKe6fuAuh57G3Bk" +export P2P_SEEDNODE_ADDRESS="/ip4/127.0.0.1/tcp/$PORT_SEEDNODE/p2p/16Uiu2HAmKBCtAqnmawCJ5nxd9AccU3fj4sjA8WA3oksqeZgcsJJv" # UI configuration profiles From ee4e692add77c6607424ef1ec436744e6d13b2f6 Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Thu, 20 Oct 2022 17:11:35 +0300 Subject: [PATCH 053/110] fixes --- vm/systemSmartContracts/delegation.go | 18 +----------------- vm/systemSmartContracts/logs.go | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/vm/systemSmartContracts/delegation.go b/vm/systemSmartContracts/delegation.go index e9b9be49d66..ebbde3eeefc 100644 --- a/vm/systemSmartContracts/delegation.go +++ b/vm/systemSmartContracts/delegation.go @@ -993,23 +993,7 @@ func (d *delegation) changeOwner(args *vmcommon.ContractCallInput) vmcommon.Retu d.eei.SetStorageForAddress(d.delegationMgrSCAddress, args.CallerAddr, []byte{}) d.eei.SetStorage([]byte(ownerKey), args.Arguments[0]) - globalFund, err := d.getGlobalFundData() - if err != nil { - globalFund = &GlobalFundData{ - TotalActive: big.NewInt(0), - } - - log.Warn("d.changeOwner cannot get global fund data", "error", err) - } - dStatus, err := d.getDelegationStatus() - if err != nil { - dStatus = &DelegationContractStatus{} - - log.Warn("d.changeOwner cannot get delegation status", "error", err) - } - - d.createAndAddLogEntryForDelegate(args, big.NewInt(0), globalFund, ownerDelegatorData, dStatus, isNew) - d.createAndAddLogEntryForWithdraw(withdraw, args.CallerAddr, big.NewInt(0), globalFund, ownerDelegatorData, d.numUsers(), true) + d.createLogEventsForChangeOwner(args, ownerDelegatorData) return vmcommon.Ok } diff --git a/vm/systemSmartContracts/logs.go b/vm/systemSmartContracts/logs.go index 71dfdbf399b..b0adcb2dcc4 100644 --- a/vm/systemSmartContracts/logs.go +++ b/vm/systemSmartContracts/logs.go @@ -92,6 +92,29 @@ func (d *delegation) getFundForLogEntry(activeFund []byte) *big.Int { return fund.Value } +func (d *delegation) createLogEventsForChangeOwner( + args *vmcommon.ContractCallInput, + ownerDelegatorData *DelegatorData, +) { + globalFund, err := d.getGlobalFundData() + if err != nil { + globalFund = &GlobalFundData{ + TotalActive: big.NewInt(0), + } + + log.Warn("d.changeOwner cannot get global fund data", "error", err) + } + dStatus, err := d.getDelegationStatus() + if err != nil { + dStatus = &DelegationContractStatus{} + + log.Warn("d.changeOwner cannot get delegation status", "error", err) + } + + d.createAndAddLogEntryForDelegate(args, big.NewInt(0), globalFund, ownerDelegatorData, dStatus, false) + d.createAndAddLogEntryForWithdraw(withdraw, args.CallerAddr, big.NewInt(0), globalFund, ownerDelegatorData, d.numUsers(), true) +} + func boolToSlice(b bool) []byte { return []byte(strconv.FormatBool(b)) } From 8a6a2ef9dc15f83a604b496a9ec18ad5f150249d Mon Sep 17 00:00:00 2001 From: Elrond/ Date: Thu, 20 Oct 2022 17:11:46 +0300 Subject: [PATCH 054/110] FIX: variables.sh --- scripts/testnet/variables.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/testnet/variables.sh b/scripts/testnet/variables.sh index e90c5dcdc1d..762df841f45 100644 --- a/scripts/testnet/variables.sh +++ b/scripts/testnet/variables.sh @@ -12,7 +12,7 @@ export USE_PROXY=1 # Enable the Elrond Transaction Generator. Note that this is a private # repository (elrond-txgen-go). -export USE_TXGEN=1 +export USE_TXGEN=0 # Path where the testnet will be instantiated. This folder is assumed to not # exist, but it doesn't matter if it already does. It will be created if not, @@ -44,7 +44,7 @@ export NODE_WATCHER=0 export SEEDNODE_DELAY=5 export GENESIS_DELAY=30 export HARDFORK_DELAY=900 #15 minutes enough to take export and gracefully close -export NODE_DELAY=20 +export NODE_DELAY=60 export GENESIS_STAKE_TYPE="direct" #'delegated' or 'direct' as in direct stake From f706aac9039684a6c4ee9c4c091c8d532ba9030b Mon Sep 17 00:00:00 2001 From: BeniaminDrasovean Date: Thu, 20 Oct 2022 17:55:07 +0300 Subject: [PATCH 055/110] fix empty trie check when collecting stats --- common/trie.go | 17 +++++++++++++++++ state/accountsDB.go | 2 +- trie/depthFirstSync.go | 2 +- trie/depthFirstSync_test.go | 5 +++-- trie/doubleListSync.go | 2 +- trie/doubleListSync_test.go | 4 ++-- trie/patriciaMerkleTrie.go | 17 ++--------------- trie/sync.go | 2 +- trie/trieStorageManager.go | 4 ++-- update/genesis/import.go | 4 ++-- 10 files changed, 32 insertions(+), 27 deletions(-) create mode 100644 common/trie.go diff --git a/common/trie.go b/common/trie.go new file mode 100644 index 00000000000..eeda9925561 --- /dev/null +++ b/common/trie.go @@ -0,0 +1,17 @@ +package common + +import "bytes" + +// EmptyTrieHash returns the value with empty trie hash +var EmptyTrieHash = make([]byte, 32) + +// IsEmptyTrie returns true if the given root is for an empty trie +func IsEmptyTrie(root []byte) bool { + if len(root) == 0 { + return true + } + if bytes.Equal(root, EmptyTrieHash) { + return true + } + return false +} diff --git a/state/accountsDB.go b/state/accountsDB.go index 98ab129f123..3e31df37dba 100644 --- a/state/accountsDB.go +++ b/state/accountsDB.go @@ -1401,7 +1401,7 @@ func (adb *AccountsDB) GetStatsForRootHash(rootHash []byte) (common.TriesStatist continue } - if len(account.RootHash) == 0 { + if common.IsEmptyTrie(account.RootHash) { continue } diff --git a/trie/depthFirstSync.go b/trie/depthFirstSync.go index 38112afe792..1152116f70e 100644 --- a/trie/depthFirstSync.go +++ b/trie/depthFirstSync.go @@ -69,7 +69,7 @@ func NewDepthFirstTrieSyncer(arg ArgTrieSyncer) (*depthFirstTrieSyncer, error) { // so this function is treated as a large critical section. This was done so the inner processing can be done without using // other mutexes. func (d *depthFirstTrieSyncer) StartSyncing(rootHash []byte, ctx context.Context) error { - if len(rootHash) == 0 || bytes.Equal(rootHash, EmptyTrieHash) { + if len(rootHash) == 0 || bytes.Equal(rootHash, common.EmptyTrieHash) { return nil } if ctx == nil { diff --git a/trie/depthFirstSync_test.go b/trie/depthFirstSync_test.go index b1aca5ba98b..b68be1b9a29 100644 --- a/trie/depthFirstSync_test.go +++ b/trie/depthFirstSync_test.go @@ -9,6 +9,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" + "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/errors" "github.com/ElrondNetwork/elrond-go/storage" "github.com/stretchr/testify/assert" @@ -49,7 +50,7 @@ func TestDepthFirstTrieSyncer_StartSyncingEmptyRootHashShouldReturnNil(t *testin arg := createMockArgument(time.Minute) d, _ := NewDepthFirstTrieSyncer(arg) - err := d.StartSyncing(EmptyTrieHash, context.Background()) + err := d.StartSyncing(common.EmptyTrieHash, context.Background()) assert.Nil(t, err) } @@ -59,7 +60,7 @@ func TestDepthFirstTrieSyncer_StartSyncingNilContextShouldErr(t *testing.T) { arg := createMockArgument(time.Minute) d, _ := NewDepthFirstTrieSyncer(arg) - err := d.StartSyncing(bytes.Repeat([]byte{1}, len(EmptyTrieHash)), nil) + err := d.StartSyncing(bytes.Repeat([]byte{1}, len(common.EmptyTrieHash)), nil) assert.Equal(t, ErrNilContext, err) } diff --git a/trie/doubleListSync.go b/trie/doubleListSync.go index 759db92780d..952db9c0b73 100644 --- a/trie/doubleListSync.go +++ b/trie/doubleListSync.go @@ -84,7 +84,7 @@ func NewDoubleListTrieSyncer(arg ArgTrieSyncer) (*doubleListTrieSyncer, error) { // so this function is treated as a large critical section. This was done so the inner processing can be done without using // other mutexes. func (d *doubleListTrieSyncer) StartSyncing(rootHash []byte, ctx context.Context) error { - if len(rootHash) == 0 || bytes.Equal(rootHash, EmptyTrieHash) { + if len(rootHash) == 0 || bytes.Equal(rootHash, common.EmptyTrieHash) { return nil } if ctx == nil { diff --git a/trie/doubleListSync_test.go b/trie/doubleListSync_test.go index ee56a9b85c1..cf69048802c 100644 --- a/trie/doubleListSync_test.go +++ b/trie/doubleListSync_test.go @@ -155,7 +155,7 @@ func TestDoubleListTrieSyncer_StartSyncingEmptyRootHashShouldReturnNil(t *testin arg := createMockArgument(time.Minute) d, _ := NewDoubleListTrieSyncer(arg) - err := d.StartSyncing(EmptyTrieHash, context.Background()) + err := d.StartSyncing(common.EmptyTrieHash, context.Background()) assert.Nil(t, err) } @@ -165,7 +165,7 @@ func TestDoubleListTrieSyncer_StartSyncingNilContextShouldErr(t *testing.T) { arg := createMockArgument(time.Minute) d, _ := NewDoubleListTrieSyncer(arg) - err := d.StartSyncing(bytes.Repeat([]byte{1}, len(EmptyTrieHash)), nil) + err := d.StartSyncing(bytes.Repeat([]byte{1}, len(common.EmptyTrieHash)), nil) assert.Equal(t, ErrNilContext, err) } diff --git a/trie/patriciaMerkleTrie.go b/trie/patriciaMerkleTrie.go index dad20bccf9d..091e1da9342 100644 --- a/trie/patriciaMerkleTrie.go +++ b/trie/patriciaMerkleTrie.go @@ -29,9 +29,6 @@ const ( const rootDepthLevel = 0 -// EmptyTrieHash returns the value with empty trie hash -var EmptyTrieHash = make([]byte, 32) - type patriciaMerkleTrie struct { root node @@ -199,7 +196,7 @@ func (tr *patriciaMerkleTrie) RootHash() ([]byte, error) { func (tr *patriciaMerkleTrie) getRootHash() ([]byte, error) { if tr.root == nil { - return EmptyTrieHash, nil + return common.EmptyTrieHash, nil } hash := tr.root.getHash() @@ -274,7 +271,7 @@ func (tr *patriciaMerkleTrie) RecreateFromEpoch(options common.RootHashHolder) ( } func (tr *patriciaMerkleTrie) recreate(root []byte, tsm common.StorageManager) (*patriciaMerkleTrie, error) { - if emptyTrie(root) { + if common.IsEmptyTrie(root) { return NewTrie( tr.trieStorage, tr.marshalizer, @@ -320,16 +317,6 @@ func (tr *patriciaMerkleTrie) IsInterfaceNil() bool { return tr == nil } -func emptyTrie(root []byte) bool { - if len(root) == 0 { - return true - } - if bytes.Equal(root, EmptyTrieHash) { - return true - } - return false -} - // GetObsoleteHashes resets the oldHashes and oldRoot variables and returns the old hashes func (tr *patriciaMerkleTrie) GetObsoleteHashes() [][]byte { tr.mutOperation.Lock() diff --git a/trie/sync.go b/trie/sync.go index e0bac17c858..4ca37a75901 100644 --- a/trie/sync.go +++ b/trie/sync.go @@ -125,7 +125,7 @@ func checkArguments(arg ArgTrieSyncer) error { // StartSyncing completes the trie, asking for missing trie nodes on the network func (ts *trieSyncer) StartSyncing(rootHash []byte, ctx context.Context) error { - if len(rootHash) == 0 || bytes.Equal(rootHash, EmptyTrieHash) { + if len(rootHash) == 0 || bytes.Equal(rootHash, common.EmptyTrieHash) { return nil } if ctx == nil { diff --git a/trie/trieStorageManager.go b/trie/trieStorageManager.go index c78267a8311..58d39f66064 100644 --- a/trie/trieStorageManager.go +++ b/trie/trieStorageManager.go @@ -340,7 +340,7 @@ func (tsm *trieStorageManager) TakeSnapshot( return } - if bytes.Equal(rootHash, EmptyTrieHash) { + if bytes.Equal(rootHash, common.EmptyTrieHash) { log.Trace("should not snapshot an empty trie") safelyCloseChan(iteratorChannels.LeavesChan) stats.SnapshotFinished() @@ -390,7 +390,7 @@ func (tsm *trieStorageManager) SetCheckpoint( return } - if bytes.Equal(rootHash, EmptyTrieHash) { + if bytes.Equal(rootHash, common.EmptyTrieHash) { log.Trace("should not set checkpoint for empty trie") safelyCloseChan(iteratorChannels.LeavesChan) stats.SnapshotFinished() diff --git a/update/genesis/import.go b/update/genesis/import.go index 18a2147b744..3bb55a1fc54 100644 --- a/update/genesis/import.go +++ b/update/genesis/import.go @@ -328,7 +328,7 @@ func (si *stateImport) importDataTrie(identifier string, shID uint32, keys [][]b return err } - if len(originalRootHash) == 0 || bytes.Equal(originalRootHash, trie.EmptyTrieHash) { + if len(originalRootHash) == 0 || bytes.Equal(originalRootHash, common.EmptyTrieHash) { err = dataTrie.Commit() if err != nil { return err @@ -472,7 +472,7 @@ func (si *stateImport) importState(identifier string, keys [][]byte) error { log.Debug("importing state", "shard ID", shId, "root hash", rootHash) - if len(rootHash) == 0 || bytes.Equal(rootHash, trie.EmptyTrieHash) { + if len(rootHash) == 0 || bytes.Equal(rootHash, common.EmptyTrieHash) { return si.saveRootHash(accountsDB, accType, shId, rootHash) } From 68e8eb7658af664cadb2a83a7bf501b64e8b0985 Mon Sep 17 00:00:00 2001 From: BeniaminDrasovean Date: Thu, 20 Oct 2022 18:08:57 +0300 Subject: [PATCH 056/110] fix after review --- common/trie_test.go | 27 +++++++++++++++++++++++++++ trie/depthFirstSync.go | 3 +-- 2 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 common/trie_test.go diff --git a/common/trie_test.go b/common/trie_test.go new file mode 100644 index 00000000000..3ae5a3bceb9 --- /dev/null +++ b/common/trie_test.go @@ -0,0 +1,27 @@ +package common + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestIsEmptyTrie(t *testing.T) { + t.Parallel() + + t.Run("test nil root", func(t *testing.T) { + t.Parallel() + + assert.True(t, IsEmptyTrie(nil)) + }) + t.Run("test empty root", func(t *testing.T) { + t.Parallel() + + assert.True(t, IsEmptyTrie([]byte{})) + }) + t.Run("test empty root hash", func(t *testing.T) { + t.Parallel() + + assert.True(t, IsEmptyTrie(EmptyTrieHash)) + }) +} diff --git a/trie/depthFirstSync.go b/trie/depthFirstSync.go index 1152116f70e..5a69a638489 100644 --- a/trie/depthFirstSync.go +++ b/trie/depthFirstSync.go @@ -1,7 +1,6 @@ package trie import ( - "bytes" "context" "sync" "time" @@ -69,7 +68,7 @@ func NewDepthFirstTrieSyncer(arg ArgTrieSyncer) (*depthFirstTrieSyncer, error) { // so this function is treated as a large critical section. This was done so the inner processing can be done without using // other mutexes. func (d *depthFirstTrieSyncer) StartSyncing(rootHash []byte, ctx context.Context) error { - if len(rootHash) == 0 || bytes.Equal(rootHash, common.EmptyTrieHash) { + if common.IsEmptyTrie(rootHash) { return nil } if ctx == nil { From dffc3beef0824f044151a422eb62d7a63e952405 Mon Sep 17 00:00:00 2001 From: BeniaminDrasovean Date: Thu, 20 Oct 2022 19:35:57 +0300 Subject: [PATCH 057/110] fix after review --- trie/doubleListSync.go | 3 +-- trie/sync.go | 2 +- update/genesis/import.go | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/trie/doubleListSync.go b/trie/doubleListSync.go index 952db9c0b73..b8899575150 100644 --- a/trie/doubleListSync.go +++ b/trie/doubleListSync.go @@ -1,7 +1,6 @@ package trie import ( - "bytes" "context" "sync" "time" @@ -84,7 +83,7 @@ func NewDoubleListTrieSyncer(arg ArgTrieSyncer) (*doubleListTrieSyncer, error) { // so this function is treated as a large critical section. This was done so the inner processing can be done without using // other mutexes. func (d *doubleListTrieSyncer) StartSyncing(rootHash []byte, ctx context.Context) error { - if len(rootHash) == 0 || bytes.Equal(rootHash, common.EmptyTrieHash) { + if common.IsEmptyTrie(rootHash) { return nil } if ctx == nil { diff --git a/trie/sync.go b/trie/sync.go index 4ca37a75901..e8d45ae12a5 100644 --- a/trie/sync.go +++ b/trie/sync.go @@ -125,7 +125,7 @@ func checkArguments(arg ArgTrieSyncer) error { // StartSyncing completes the trie, asking for missing trie nodes on the network func (ts *trieSyncer) StartSyncing(rootHash []byte, ctx context.Context) error { - if len(rootHash) == 0 || bytes.Equal(rootHash, common.EmptyTrieHash) { + if common.IsEmptyTrie(rootHash) { return nil } if ctx == nil { diff --git a/update/genesis/import.go b/update/genesis/import.go index 3bb55a1fc54..bf85ca1b4ea 100644 --- a/update/genesis/import.go +++ b/update/genesis/import.go @@ -328,7 +328,7 @@ func (si *stateImport) importDataTrie(identifier string, shID uint32, keys [][]b return err } - if len(originalRootHash) == 0 || bytes.Equal(originalRootHash, common.EmptyTrieHash) { + if common.IsEmptyTrie(originalRootHash) { err = dataTrie.Commit() if err != nil { return err @@ -472,7 +472,7 @@ func (si *stateImport) importState(identifier string, keys [][]byte) error { log.Debug("importing state", "shard ID", shId, "root hash", rootHash) - if len(rootHash) == 0 || bytes.Equal(rootHash, common.EmptyTrieHash) { + if common.IsEmptyTrie(rootHash) { return si.saveRootHash(accountsDB, accType, shId, rootHash) } From 7764fc4d5de8f8367752164ae5c0766fb3e13b73 Mon Sep 17 00:00:00 2001 From: BeniaminDrasovean Date: Fri, 21 Oct 2022 09:21:34 +0300 Subject: [PATCH 058/110] fix after review --- go.mod | 2 +- go.sum | 4 ++-- state/trackableDataTrie.go | 8 ++++---- trie/patriciaMerkleTrie.go | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index df7ed72b510..d302dbad3cd 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/ElrondNetwork/elrond-go-p2p v1.0.3 github.com/ElrondNetwork/elrond-go-storage v1.0.1 github.com/ElrondNetwork/elrond-vm-common v1.3.23-0.20221019113258-ca9342453fa4 - github.com/ElrondNetwork/wasm-vm v1.4.60-0.20221019123810-007e47943329 + github.com/ElrondNetwork/wasm-vm v1.4.60-0.20221021061752-4438e7e05aad github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.43-0.20221019114848-90e637a3fb5c github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.43-0.20221019120649-0b89b33dbe84 github.com/beevik/ntp v0.3.0 diff --git a/go.sum b/go.sum index 1ab46e00fe4..d9b1b3a5241 100644 --- a/go.sum +++ b/go.sum @@ -79,8 +79,8 @@ github.com/ElrondNetwork/go-libp2p-pubsub v0.6.1-rc1 h1:Nu/uwYQg/QbfoQ0uD6GahYTw github.com/ElrondNetwork/go-libp2p-pubsub v0.6.1-rc1/go.mod h1:pJfaShe+i5aWZx8NhSkQjvOYQYLoqPztmFUlKjToOzM= github.com/ElrondNetwork/protobuf v1.3.2 h1:qoCSYiO+8GtXBEZWEjw0WPcZfM3g7QuuJrwpN+y6Mvg= github.com/ElrondNetwork/protobuf v1.3.2/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/ElrondNetwork/wasm-vm v1.4.60-0.20221019123810-007e47943329 h1:l4SpUrHWvqGBc4+UEFzj/sz00x8lmqUwTzdZT8D5N4I= -github.com/ElrondNetwork/wasm-vm v1.4.60-0.20221019123810-007e47943329/go.mod h1:2kn5wXDkqN/XOdmK5ah/C8vK3s49ZUHH5dBIQyLf5+0= +github.com/ElrondNetwork/wasm-vm v1.4.60-0.20221021061752-4438e7e05aad h1:X2lims7EichDHbj7hvVUJ3AV1MFaSEj9pGxDxfAXOWA= +github.com/ElrondNetwork/wasm-vm v1.4.60-0.20221021061752-4438e7e05aad/go.mod h1:2kn5wXDkqN/XOdmK5ah/C8vK3s49ZUHH5dBIQyLf5+0= github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.43-0.20221019114848-90e637a3fb5c h1:6PEFTy130z5Atm2+tgYaph5mbeZmp2rCvC398F8mVWQ= github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.43-0.20221019114848-90e637a3fb5c/go.mod h1:AZlDSyifV2Zd7vK2Z5tD4W/sYRyVIBi9c9sM2pxBsv4= github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.43-0.20221019120649-0b89b33dbe84 h1:voH0C7ZKGGOlYhHluPvJtUmImk+G4bntUQRoIAFwElU= diff --git a/state/trackableDataTrie.go b/state/trackableDataTrie.go index a3e23e7a570..3a38fab27d5 100644 --- a/state/trackableDataTrie.go +++ b/state/trackableDataTrie.go @@ -40,14 +40,14 @@ func (tdaw *trackableDataTrie) RetrieveValue(key []byte) ([]byte, uint32, error) if tdaw.tr == nil { return nil, 0, ErrNilTrie } - value, maxDepth, err := tdaw.tr.Get(key) + value, depth, err := tdaw.tr.Get(key) if err != nil { - return nil, maxDepth, err + return nil, depth, err } - log.Trace("retrieve value from trie", "key", key, "value", value) + log.Trace("retrieve value from trie", "key", key, "value", value, "depth", depth) value, _ = trimValue(value, tailLength) - return value, maxDepth, nil + return value, depth, nil } func trimValue(value []byte, tailLength int) ([]byte, error) { diff --git a/trie/patriciaMerkleTrie.go b/trie/patriciaMerkleTrie.go index 2eb1d77dfe9..7ca77beec0c 100644 --- a/trie/patriciaMerkleTrie.go +++ b/trie/patriciaMerkleTrie.go @@ -89,13 +89,13 @@ func (tr *patriciaMerkleTrie) Get(key []byte) ([]byte, uint32, error) { } hexKey := keyBytesToHex(key) - val, maxDepth, err := tr.root.tryGet(hexKey, rootDepthLevel, tr.trieStorage) + val, depth, err := tr.root.tryGet(hexKey, rootDepthLevel, tr.trieStorage) if err != nil { err = fmt.Errorf("trie get error: %w, for key %v", err, hex.EncodeToString(key)) - return nil, maxDepth, err + return nil, depth, err } - return val, maxDepth, nil + return val, depth, nil } // Update updates the value at the given key. From 3f60e8ff60179cea14d5fd0d65c46f59e7f06fa9 Mon Sep 17 00:00:00 2001 From: jules01 Date: Fri, 21 Oct 2022 11:55:27 +0300 Subject: [PATCH 059/110] - backwards compatibility fixes + added new log prints in the genesis processing --- cmd/node/config/enableEpochs.toml | 4 ++-- genesis/process/metaGenesisBlockCreator.go | 5 +++++ genesis/process/shardGenesisBlockCreator.go | 16 +++++++++++++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/cmd/node/config/enableEpochs.toml b/cmd/node/config/enableEpochs.toml index b65109bb423..d840d39faba 100644 --- a/cmd/node/config/enableEpochs.toml +++ b/cmd/node/config/enableEpochs.toml @@ -118,8 +118,8 @@ # BackwardCompSaveKeyValueEnableEpoch represents the epoch when the backward compatibility for save key value error is enabled BackwardCompSaveKeyValueEnableEpoch = 1 - # ESDTNFTCreateOnMultiShard represents the epoch when esdt nft creation is enabled on multiple shards - ESDTNFTCreateOnMultiShard = 1 + # ESDTNFTCreateOnMultiShardEnableEpoch represents the epoch when esdt nft creation is enabled on multiple shards + ESDTNFTCreateOnMultiShardEnableEpoch = 1 # MetaESDTSetEnableEpoch represents the epoch when the backward compatibility for save key value error is enabled MetaESDTSetEnableEpoch = 1 diff --git a/genesis/process/metaGenesisBlockCreator.go b/genesis/process/metaGenesisBlockCreator.go index 5bf5de04c93..7d8886c755f 100644 --- a/genesis/process/metaGenesisBlockCreator.go +++ b/genesis/process/metaGenesisBlockCreator.go @@ -127,6 +127,11 @@ func CreateMetaGenesisBlock( return nil, nil, nil, err } + log.Debug("meta block genesis", + "resulted user accounts roothash", rootHash, + "resulted validator roothash", validatorRootHash, + ) + err = header.SetValidatorStatsRootHash(validatorRootHash) if err != nil { return nil, nil, nil, err diff --git a/genesis/process/shardGenesisBlockCreator.go b/genesis/process/shardGenesisBlockCreator.go index f44f547e31a..535c50df3eb 100644 --- a/genesis/process/shardGenesisBlockCreator.go +++ b/genesis/process/shardGenesisBlockCreator.go @@ -47,6 +47,13 @@ type deployedScMetrics struct { } func createGenesisConfig() config.EnableEpochs { + blsMultiSignerEnableEpoch := []config.MultiSignerConfig{ + { + EnableEpoch: 0, + Type: "no-KOSK", + }, + } + return config.EnableEpochs{ SCDeployEnableEpoch: unreachableEpoch, BuiltInFunctionsEnableEpoch: 0, @@ -69,7 +76,7 @@ func createGenesisConfig() config.EnableEpochs { }, BlockGasAndFeesReCheckEnableEpoch: unreachableEpoch, StakingV2EnableEpoch: unreachableEpoch, - StakeEnableEpoch: 0, + StakeEnableEpoch: unreachableEpoch, // no need to enable this, we have builtin exceptions in staking system SC DoubleKeyProtectionEnableEpoch: 0, ESDTEnableEpoch: unreachableEpoch, GovernanceEnableEpoch: unreachableEpoch, @@ -120,10 +127,16 @@ func createGenesisConfig() config.EnableEpochs { CheckCorrectTokenIDForTransferRoleEnableEpoch: unreachableEpoch, DisableExecByCallerEnableEpoch: unreachableEpoch, RefactorContextEnableEpoch: unreachableEpoch, + CheckFunctionArgumentEnableEpoch: unreachableEpoch, + CheckExecuteOnReadOnlyEnableEpoch: unreachableEpoch, MiniBlockPartialExecutionEnableEpoch: unreachableEpoch, ESDTMetadataContinuousCleanupEnableEpoch: unreachableEpoch, + FixAsyncCallBackArgsListEnableEpoch: unreachableEpoch, FixOldTokenLiquidityEnableEpoch: unreachableEpoch, + SetSenderInEeiOutputTransferEnableEpoch: unreachableEpoch, RefactorPeersMiniBlocksEnableEpoch: unreachableEpoch, + DoNotReturnOldBlockInBlockchainHookEnableEpoch: unreachableEpoch, + BLSMultiSignerEnableEpoch: blsMultiSignerEnableEpoch, } } @@ -202,6 +215,7 @@ func CreateShardGenesisBlock( "total staked on a delegation SC", delegationResult.NumTotalStaked, "total delegation nodes", delegationResult.NumTotalDelegated, "cross shard delegation calls", numCrossShardDelegations, + "resulted roothash", rootHash, ) round, nonce, epoch := getGenesisBlocksRoundNonceEpoch(arg) From c94893af9575332e7301afddf260910edde49cff Mon Sep 17 00:00:00 2001 From: jules01 Date: Fri, 21 Oct 2022 13:07:23 +0300 Subject: [PATCH 060/110] - integrate new elrond-go-core v1.1.21 --- go.mod | 2 +- go.sum | 3 ++- .../state/stateTrieSync/stateTrieSync_test.go | 6 +++--- state/syncer/baseAccountsSyncer.go | 4 ++-- trie/depthFirstSync.go | 2 +- trie/doubleListSync.go | 2 +- trie/statistics/trieSyncStatistics.go | 16 ++++++++-------- trie/statistics/trieSyncStatistics_test.go | 18 +++++++++--------- trie/sync.go | 2 +- 9 files changed, 28 insertions(+), 27 deletions(-) diff --git a/go.mod b/go.mod index 6fea0901383..78bd4f4d9c7 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.15 require ( github.com/ElrondNetwork/covalent-indexer-go v1.0.6 github.com/ElrondNetwork/elastic-indexer-go v1.2.44 - github.com/ElrondNetwork/elrond-go-core v1.1.20 + github.com/ElrondNetwork/elrond-go-core v1.1.21 github.com/ElrondNetwork/elrond-go-crypto v1.2.1 github.com/ElrondNetwork/elrond-go-logger v1.0.9 github.com/ElrondNetwork/elrond-go-p2p v1.0.3 diff --git a/go.sum b/go.sum index 2bc873d1b97..129d2c1cdbc 100644 --- a/go.sum +++ b/go.sum @@ -56,8 +56,9 @@ github.com/ElrondNetwork/elrond-go-core v1.1.7/go.mod h1:O9FkkTT2H9kxCzfn40TbhoC github.com/ElrondNetwork/elrond-go-core v1.1.13/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.18/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.19/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= -github.com/ElrondNetwork/elrond-go-core v1.1.20 h1:2JbXK7BrgbMm+q9xgyW80H8Ljn+HcGfbdXZp8YuFPXc= github.com/ElrondNetwork/elrond-go-core v1.1.20/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= +github.com/ElrondNetwork/elrond-go-core v1.1.21 h1:3qDj93rET6g1PjEVzo1yCCtkJyLGfZC0eXGoXm2b0hw= +github.com/ElrondNetwork/elrond-go-core v1.1.21/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-crypto v1.0.0/go.mod h1:DGiR7/j1xv729Xg8SsjYaUzWXL5svMd44REXjWS/gAc= github.com/ElrondNetwork/elrond-go-crypto v1.2.1 h1:5wWCBEZp5SMFO2+Nal8UaJNJcG9G9J4PHNNZvQpEeUE= github.com/ElrondNetwork/elrond-go-crypto v1.2.1/go.mod h1:UNmpDaJjLTKxfzUcwua2R7Mh9bicw/L3ICJt5V7zqMo= diff --git a/integrationTests/state/stateTrieSync/stateTrieSync_test.go b/integrationTests/state/stateTrieSync/stateTrieSync_test.go index a136ee545b0..10aebc4e5bc 100644 --- a/integrationTests/state/stateTrieSync/stateTrieSync_test.go +++ b/integrationTests/state/stateTrieSync/stateTrieSync_test.go @@ -8,7 +8,6 @@ import ( "testing" "time" - arwenConfig "github.com/ElrondNetwork/wasm-vm/config" "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/throttler" logger "github.com/ElrondNetwork/elrond-go-logger" @@ -27,6 +26,7 @@ import ( "github.com/ElrondNetwork/elrond-go/trie/statistics" "github.com/ElrondNetwork/elrond-go/trie/storageMarker" "github.com/ElrondNetwork/elrond-go/vm/systemSmartContracts/defaults" + arwenConfig "github.com/ElrondNetwork/wasm-vm/config" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -160,7 +160,7 @@ func printStatistics(ctx context.Context, stats common.SizeSyncStatisticsHandler select { case <-ctx.Done(): log.Info("finished trie sync", - "num received", stats.NumReceived(), + "num processed", stats.NumProcessed(), "num large nodes", stats.NumLarge(), "num missing", stats.NumMissing(), "data size received", core.ConvertBytes(stats.NumBytesReceived()), @@ -177,7 +177,7 @@ func printStatistics(ctx context.Context, stats common.SizeSyncStatisticsHandler speed := fmt.Sprintf("%s/s", core.ConvertBytes(uint64(bytesReceivedPerSec))) log.Info("trie sync in progress", - "num received", stats.NumReceived(), + "num processed", stats.NumProcessed(), "num large nodes", stats.NumLarge(), "num missing", stats.NumMissing(), "data size received", core.ConvertBytes(stats.NumBytesReceived()), diff --git a/state/syncer/baseAccountsSyncer.go b/state/syncer/baseAccountsSyncer.go index c581a345a11..7bc42bd44cc 100644 --- a/state/syncer/baseAccountsSyncer.go +++ b/state/syncer/baseAccountsSyncer.go @@ -140,7 +140,7 @@ func (b *baseAccountsSyncer) printStatistics(ssh common.SizeSyncStatisticsHandle log.Info("finished trie sync", "name", b.name, "time elapsed", totalSyncDuration.Truncate(time.Second), - "num processed", ssh.NumReceived(), + "num processed", ssh.NumProcessed(), "num large nodes", ssh.NumLarge(), "num missing", ssh.NumMissing(), "state data size", core.ConvertBytes(ssh.NumBytesReceived()), @@ -166,7 +166,7 @@ func (b *baseAccountsSyncer) printStatistics(ssh common.SizeSyncStatisticsHandle "name", b.name, "time elapsed", time.Since(startedSync).Truncate(time.Second), "num tries currently syncing", ssh.NumTries(), - "num processed", ssh.NumReceived(), + "num processed", ssh.NumProcessed(), "num large nodes", ssh.NumLarge(), "num missing", ssh.NumMissing(), "num tries synced", fmt.Sprintf("%d/%d", atomic.LoadInt32(&b.numTriesSynced), atomic.LoadInt32(&b.numMaxTries)), diff --git a/trie/depthFirstSync.go b/trie/depthFirstSync.go index 38112afe792..5df2c92d54c 100644 --- a/trie/depthFirstSync.go +++ b/trie/depthFirstSync.go @@ -246,7 +246,7 @@ func (d *depthFirstTrieSyncer) storeTrieNode(element node) error { } d.timeoutHandler.ResetWatchdog() - d.trieSyncStatistics.AddNumReceived(1) + d.trieSyncStatistics.AddNumProcessed(1) if numBytes > core.MaxBufferSizeToSendTrieNodes { d.trieSyncStatistics.AddNumLarge(1) } diff --git a/trie/doubleListSync.go b/trie/doubleListSync.go index 759db92780d..fb6ad594b95 100644 --- a/trie/doubleListSync.go +++ b/trie/doubleListSync.go @@ -218,7 +218,7 @@ func (d *doubleListTrieSyncer) processExistingNodes() error { return err } - d.trieSyncStatistics.AddNumReceived(1) + d.trieSyncStatistics.AddNumProcessed(1) if numBytes > core.MaxBufferSizeToSendTrieNodes { d.trieSyncStatistics.AddNumLarge(1) } diff --git a/trie/statistics/trieSyncStatistics.go b/trie/statistics/trieSyncStatistics.go index fa780159b81..5c66e481571 100644 --- a/trie/statistics/trieSyncStatistics.go +++ b/trie/statistics/trieSyncStatistics.go @@ -7,7 +7,7 @@ import ( type trieSyncStatistics struct { sync.RWMutex - numReceived int + numProcessed int numMissing int numLarge int missingMap map[string]int @@ -26,7 +26,7 @@ func NewTrieSyncStatistics() *trieSyncStatistics { // Reset will reset the contained values to 0 func (tss *trieSyncStatistics) Reset() { tss.Lock() - tss.numReceived = 0 + tss.numProcessed = 0 tss.numMissing = 0 tss.numLarge = 0 tss.numBytesReceived = 0 @@ -36,10 +36,10 @@ func (tss *trieSyncStatistics) Reset() { tss.Unlock() } -// AddNumReceived will add the provided value to the existing numReceived -func (tss *trieSyncStatistics) AddNumReceived(value int) { +// AddNumProcessed will add the provided value to the existing numProcessed +func (tss *trieSyncStatistics) AddNumProcessed(value int) { tss.Lock() - tss.numReceived += value + tss.numProcessed += value tss.Unlock() } @@ -91,12 +91,12 @@ func (tss *trieSyncStatistics) IncrementIteration() { tss.Unlock() } -// NumReceived returns the received nodes -func (tss *trieSyncStatistics) NumReceived() int { +// NumProcessed returns the number of processed trie nodes +func (tss *trieSyncStatistics) NumProcessed() int { tss.RLock() defer tss.RUnlock() - return tss.numReceived + return tss.numProcessed } // NumLarge returns the received large nodes diff --git a/trie/statistics/trieSyncStatistics_test.go b/trie/statistics/trieSyncStatistics_test.go index 5d8b39e8701..9b3307107e5 100644 --- a/trie/statistics/trieSyncStatistics_test.go +++ b/trie/statistics/trieSyncStatistics_test.go @@ -18,21 +18,21 @@ func TestNewTrieSyncStatistics_ShouldWork(t *testing.T) { assert.False(t, check.IfNil(tss)) } -func TestTrieSyncStatistics_Received(t *testing.T) { +func TestTrieSyncStatistics_Processed(t *testing.T) { t.Parallel() tss := NewTrieSyncStatistics() - assert.Equal(t, 0, tss.NumReceived()) + assert.Equal(t, 0, tss.NumProcessed()) - tss.AddNumReceived(2) - assert.Equal(t, 2, tss.NumReceived()) + tss.AddNumProcessed(2) + assert.Equal(t, 2, tss.NumProcessed()) - tss.AddNumReceived(4) - assert.Equal(t, 6, tss.NumReceived()) + tss.AddNumProcessed(4) + assert.Equal(t, 6, tss.NumProcessed()) tss.Reset() - assert.Equal(t, 0, tss.NumReceived()) + assert.Equal(t, 0, tss.NumProcessed()) } func TestTrieSyncStatistics_Missing(t *testing.T) { @@ -186,7 +186,7 @@ func TestParallelOperationsShouldNotPanic(t *testing.T) { case 0: tss.Reset() case 1: - tss.AddNumReceived(1) + tss.AddNumProcessed(1) case 2: tss.AddNumBytesReceived(2) case 3: @@ -198,7 +198,7 @@ func TestParallelOperationsShouldNotPanic(t *testing.T) { case 6: tss.IncrementIteration() case 7: - _ = tss.NumReceived() + _ = tss.NumProcessed() case 8: _ = tss.NumLarge() case 9: diff --git a/trie/sync.go b/trie/sync.go index e0bac17c858..7fdebb098e6 100644 --- a/trie/sync.go +++ b/trie/sync.go @@ -275,7 +275,7 @@ func (ts *trieSyncer) addNew(nextNodes []node) bool { nodeInfo, ok := ts.nodesForTrie[nextHash] if !ok || !nodeInfo.received { newElement = true - ts.trieSyncStatistics.AddNumReceived(1) + ts.trieSyncStatistics.AddNumProcessed(1) ts.nodesForTrie[nextHash] = trieNodeInfo{ trieNode: nextNode, received: true, From 05c0cbada83f1fe43284fc800e4be4ac5b1723ab Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Fri, 21 Oct 2022 14:48:19 +0300 Subject: [PATCH 061/110] EN-13328: overridable config fields --- common/reflectcommon/errors.go | 10 + common/reflectcommon/structFieldsUpdate.go | 69 +++++ .../reflectcommon/structFieldsUpdate_test.go | 241 ++++++++++++++++++ 3 files changed, 320 insertions(+) create mode 100644 common/reflectcommon/errors.go create mode 100644 common/reflectcommon/structFieldsUpdate.go create mode 100644 common/reflectcommon/structFieldsUpdate_test.go diff --git a/common/reflectcommon/errors.go b/common/reflectcommon/errors.go new file mode 100644 index 00000000000..c166b3f1188 --- /dev/null +++ b/common/reflectcommon/errors.go @@ -0,0 +1,10 @@ +package reflectcommon + +import "errors" + +var ( + errNilStructure = errors.New("nil structure to update") + errCannotUpdateValueStructure = errors.New("cannot update structures that are not passed by pointer") + errCannotSetValue = errors.New("cannot set value for field. it or it's structure might be unexported") + errInvalidNestedStructure = errors.New("invalid structure name") +) diff --git a/common/reflectcommon/structFieldsUpdate.go b/common/reflectcommon/structFieldsUpdate.go new file mode 100644 index 00000000000..c11ac1f0910 --- /dev/null +++ b/common/reflectcommon/structFieldsUpdate.go @@ -0,0 +1,69 @@ +package reflectcommon + +import ( + "fmt" + "reflect" + "strings" +) + +func getReflectValue(original reflect.Value, fieldName string) (value reflect.Value, err error) { + defer func() { + // should never panic because of the validity check, but can remain for extra safety + r := recover() + if r != nil { + err = fmt.Errorf("%v", r) + return + } + }() + + value = original.FieldByName(fieldName) + if !value.IsValid() { + value = reflect.Value{} + err = fmt.Errorf("%w: %s", errInvalidNestedStructure, fieldName) + return + } + + return +} + +// AdaptStructureValueBasedOnPath will try to update the value specified at the given path in any structure +// the structure must be of type pointer, otherwise an error will be returned. All the fields or inner structures MUST be exported +// the path must be in the form of InnerStruct.InnerStruct2.Field +// newValue must have the same type as the old value, otherwise an error will be returned. Currently, this function does not support slices or maps +func AdaptStructureValueBasedOnPath(structure interface{}, path string, newValue interface{}) (err error) { + defer func() { + r := recover() + if r != nil { + err = fmt.Errorf("%v", r) + } + }() + + if structure == nil { + return errNilStructure + } + + splitStr := strings.Split(path, ".") + + value := reflect.ValueOf(structure) + if value.Kind() != reflect.Ptr { + return errCannotUpdateValueStructure + } + + value = value.Elem().FieldByName(splitStr[0]) + + for i := 1; i < len(splitStr); i++ { + + value, err = getReflectValue(value, splitStr[i]) + if err != nil { + return err + } + } + + if !value.CanSet() { + err = fmt.Errorf("%w. field name=%s", errCannotSetValue, splitStr[len(splitStr)-1]) + return + } + + value.Set(reflect.ValueOf(newValue)) + return nil +} diff --git a/common/reflectcommon/structFieldsUpdate_test.go b/common/reflectcommon/structFieldsUpdate_test.go new file mode 100644 index 00000000000..bc0c0d8e9ad --- /dev/null +++ b/common/reflectcommon/structFieldsUpdate_test.go @@ -0,0 +1,241 @@ +package reflectcommon + +import ( + "testing" + + "github.com/ElrondNetwork/elrond-go/config" + "github.com/stretchr/testify/require" +) + +func TestAdaptStructureValueBasedOnPath(t *testing.T) { + t.Parallel() + + t.Run("nil object to change, should err", func(t *testing.T) { + t.Parallel() + + err := AdaptStructureValueBasedOnPath(nil, "path", "n/a") + + require.Equal(t, "nil structure to update", err.Error()) + }) + + t.Run("wrong path, should not panic, but catch the error", func(t *testing.T) { + t.Parallel() + + path := "StoragePruning.InvalidFieldName" + expectedNewValue := "%5050" + cfg := &config.Config{} + + err := AdaptStructureValueBasedOnPath(cfg, path, expectedNewValue) + + require.Equal(t, "invalid structure name: InvalidFieldName", err.Error()) + }) + + t.Run("should error when trying to set int as string", func(t *testing.T) { + t.Parallel() + + path := "StoragePruning.AccountsTrieSkipRemovalCustomPattern" + expectedNewValue := 37 + cfg := &config.Config{} + cfg.StoragePruning.AccountsTrieSkipRemovalCustomPattern = "%50" + + err := AdaptStructureValueBasedOnPath(cfg, path, expectedNewValue) + + require.Equal(t, "reflect.Set: value of type int is not assignable to type string", err.Error()) + }) + + t.Run("should error when trying to set uint64 as uint32", func(t *testing.T) { + t.Parallel() + + path := "StoragePruning.FullArchiveNumActivePersisters" + expectedNewValue := uint64(37) + cfg := &config.Config{} + cfg.StoragePruning.FullArchiveNumActivePersisters = uint32(50) + + err := AdaptStructureValueBasedOnPath(cfg, path, expectedNewValue) + + require.Equal(t, "reflect.Set: value of type uint64 is not assignable to type uint32", err.Error()) + }) + + t.Run("should error when invalid field during multiple levels depth", func(t *testing.T) { + t.Parallel() + + path := "Hardfork.ExportKeysStorageConfig.DB2.FilePath" // DB2 instead of DB + expectedNewValue := "new file path" + cfg := &config.Config{} + cfg.Hardfork.ExportKeysStorageConfig.DB.FilePath = "original file path" + + err := AdaptStructureValueBasedOnPath(cfg, path, expectedNewValue) + + require.Equal(t, "invalid structure name: DB2", err.Error()) + }) + + t.Run("should error when the final value is invalid", func(t *testing.T) { + t.Parallel() + + path := "Hardfork.ExportKeysStorageConfig.DB.FilePath2" // FilePath2 instead of FilePath + expectedNewValue := "new file path" + cfg := &config.Config{} + cfg.Hardfork.ExportKeysStorageConfig.DB.FilePath = "original file path" + + err := AdaptStructureValueBasedOnPath(cfg, path, expectedNewValue) + + require.Equal(t, "invalid structure name: FilePath2", err.Error()) + }) + + t.Run("should error if the field is un-settable / unexported", func(t *testing.T) { + t.Parallel() + + type simpleStruct struct { + a string + } + obj := &simpleStruct{a: "original"} + path := "a" + expectedNewValue := "new" + + err := AdaptStructureValueBasedOnPath(obj, path, expectedNewValue) + + require.Equal(t, "cannot set value for field. it or it's structure might be unexported. field name=a", err.Error()) + }) + + t.Run("should error if the field in the middle of the path is un-settable / unexported", func(t *testing.T) { + t.Parallel() + + type innerStruct2 struct { + C int + } + type innerStruct1 struct { + b innerStruct2 + } + type simpleStruct struct { + A innerStruct1 + } + obj := &simpleStruct{ + A: innerStruct1{ + b: innerStruct2{ + C: 5, + }, + }, + } + path := "A.b.C" + expectedNewValue := 37 + + err := AdaptStructureValueBasedOnPath(obj, path, expectedNewValue) + + require.Equal(t, "cannot set value for field. it or it's structure might be unexported. field name=C", err.Error()) + }) + + t.Run("should work for single level structures", func(t *testing.T) { + t.Parallel() + + type simpleStruct struct { + A string + } + obj := &simpleStruct{A: "original"} + path := "A" + expectedNewValue := "new" + + err := AdaptStructureValueBasedOnPath(obj, path, expectedNewValue) + + require.NoError(t, err) + require.Equal(t, expectedNewValue, obj.A) + }) + + t.Run("should error if the structure is passed as value", func(t *testing.T) { + t.Parallel() + + type simpleStruct struct { + A string + } + obj := simpleStruct{A: "original"} + path := "A" + expectedNewValue := "new" + + err := AdaptStructureValueBasedOnPath(obj, path, expectedNewValue) + + require.Equal(t, "cannot update structures that are not passed by pointer", err.Error()) + }) + + t.Run("should work and override string value", func(t *testing.T) { + t.Parallel() + + path := "StoragePruning.AccountsTrieSkipRemovalCustomPattern" + expectedNewValue := "%5050" + cfg := &config.Config{} + cfg.StoragePruning.AccountsTrieSkipRemovalCustomPattern = "%50" + + err := AdaptStructureValueBasedOnPath(cfg, path, expectedNewValue) + require.NoError(t, err) + + require.Equal(t, expectedNewValue, cfg.StoragePruning.AccountsTrieSkipRemovalCustomPattern) + }) + + t.Run("should work and override bool value", func(t *testing.T) { + t.Parallel() + + path := "StoragePruning.AccountsTrieCleanOldEpochsData" + cfg := &config.Config{} + cfg.StoragePruning.AccountsTrieCleanOldEpochsData = false + + err := AdaptStructureValueBasedOnPath(cfg, path, true) + require.NoError(t, err) + + require.True(t, cfg.StoragePruning.AccountsTrieCleanOldEpochsData) + }) + + t.Run("should work and override uint32 value", func(t *testing.T) { + t.Parallel() + + path := "StoragePruning.FullArchiveNumActivePersisters" + cfg := &config.Config{} + cfg.StoragePruning.FullArchiveNumActivePersisters = uint32(50) + expectedNewValue := uint32(37) + + err := AdaptStructureValueBasedOnPath(cfg, path, expectedNewValue) + require.NoError(t, err) + + require.Equal(t, expectedNewValue, cfg.StoragePruning.FullArchiveNumActivePersisters) + }) + + t.Run("should work and override string value on multiple levels depth", func(t *testing.T) { + t.Parallel() + + path := "Hardfork.ExportKeysStorageConfig.DB.FilePath" + expectedNewValue := "new file path" + cfg := &config.Config{} + cfg.Hardfork.ExportKeysStorageConfig.DB.FilePath = "original file path" + + err := AdaptStructureValueBasedOnPath(cfg, path, expectedNewValue) + require.NoError(t, err) + + require.Equal(t, expectedNewValue, cfg.Hardfork.ExportKeysStorageConfig.DB.FilePath) + }) + + t.Run("should work and override int value on multiple levels depth", func(t *testing.T) { + t.Parallel() + + path := "Hardfork.ExportKeysStorageConfig.DB.MaxBatchSize" + cfg := &config.Config{} + cfg.Hardfork.ExportKeysStorageConfig.DB.MaxBatchSize = 10 + expectedNewValue := 37 + + err := AdaptStructureValueBasedOnPath(cfg, path, expectedNewValue) + require.NoError(t, err) + + require.Equal(t, expectedNewValue, cfg.Hardfork.ExportKeysStorageConfig.DB.MaxBatchSize) + }) +} + +func BenchmarkAdaptStructureValueBasedOnPath(b *testing.B) { + type testStruct struct { + InnerStruct struct { + YetAnotherInnerStruct struct { + Value string + } + } + } + + testObject := &testStruct{} + for i := 0; i < b.N; i++ { + _ = AdaptStructureValueBasedOnPath(testObject, "InnerStruct.YetAnotherInnerStruct.Value", "new") + } +} From 1b7095097b1ff5f4ffd3e1518b6c57a59f2fd4bd Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Fri, 21 Oct 2022 15:18:17 +0300 Subject: [PATCH 062/110] fix scripts --- cmd/seednode/config/p2pKey.pem | 4 ---- scripts/testnet/include/config.sh | 11 +++++++++++ 2 files changed, 11 insertions(+), 4 deletions(-) delete mode 100644 cmd/seednode/config/p2pKey.pem diff --git a/cmd/seednode/config/p2pKey.pem b/cmd/seednode/config/p2pKey.pem deleted file mode 100644 index 590c4f9290d..00000000000 --- a/cmd/seednode/config/p2pKey.pem +++ /dev/null @@ -1,4 +0,0 @@ ------BEGIN PRIVATE KEY for 16Uiu2HAmKBCtAqnmawCJ5nxd9AccU3fj4sjA8WA3oksqeZgcsJJv----- -NjBmNzVjYTE2NDMyMDdiZTFkMTQzZDg0ODBmZjRjZmYyMjc4NGRjMjFiZGUwNjE4 -YzNkMGU0OTU0YTRmYzk3MA== ------END PRIVATE KEY for 16Uiu2HAmKBCtAqnmawCJ5nxd9AccU3fj4sjA8WA3oksqeZgcsJJv----- diff --git a/scripts/testnet/include/config.sh b/scripts/testnet/include/config.sh index aec225b48cc..162e190aa12 100644 --- a/scripts/testnet/include/config.sh +++ b/scripts/testnet/include/config.sh @@ -30,6 +30,17 @@ copySeednodeConfig() { pushd $TESTNETDIR cp $SEEDNODEDIR/config/* ./seednode/config popd + + pushd $ELRONDDIR/cmd/keygenerator + + go build + ./keygenerator --key-type p2p + cp p2pKey.pem $TESTNETDIR/seednode/config + GENERATED_P2P_PUB_KEY=$(grep for ./p2pKey.pem | head -1 | grep -oP '[^[:blank:]-]*' | tail -1) + export P2P_SEEDNODE_ADDRESS="/ip4/127.0.0.1/tcp/$PORT_SEEDNODE/p2p/$GENERATED_P2P_PUB_KEY" + rm p2pKey.pem + + popd } updateSeednodeConfig() { From b841fb6cb0025baeeae852724b1a226b19879c3a Mon Sep 17 00:00:00 2001 From: ssd04 Date: Fri, 21 Oct 2022 15:19:56 +0300 Subject: [PATCH 063/110] add disabled app status handler in update import --- update/genesis/import.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/update/genesis/import.go b/update/genesis/import.go index bf85ca1b4ea..ab74f41070d 100644 --- a/update/genesis/import.go +++ b/update/genesis/import.go @@ -402,6 +402,7 @@ func (si *stateImport) getAccountsDB(accType Type, shardID uint32) (state.Accoun StoragePruningManager: disabled.NewDisabledStoragePruningManager(), ProcessingMode: common.Normal, ProcessStatusHandler: commonDisabled.NewProcessStatusHandler(), + AppStatusHandler: commonDisabled.NewAppStatusHandler(), } accountsDB, errCreate := state.NewAccountsDB(argsAccountDB) if errCreate != nil { @@ -425,6 +426,7 @@ func (si *stateImport) getAccountsDB(accType Type, shardID uint32) (state.Accoun StoragePruningManager: disabled.NewDisabledStoragePruningManager(), ProcessingMode: common.Normal, ProcessStatusHandler: commonDisabled.NewProcessStatusHandler(), + AppStatusHandler: commonDisabled.NewAppStatusHandler(), } accountsDB, err = state.NewAccountsDB(argsAccountDB) si.accountDBsMap[shardID] = accountsDB From d25ea5240423cec1aa3f27efacc22d6a2b6c1987 Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Fri, 21 Oct 2022 15:22:01 +0300 Subject: [PATCH 064/110] revert --- cmd/node/config/p2p.toml | 2 +- scripts/testnet/variables.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/node/config/p2p.toml b/cmd/node/config/p2p.toml index bc79c09b151..2ce99da3ba0 100644 --- a/cmd/node/config/p2p.toml +++ b/cmd/node/config/p2p.toml @@ -47,7 +47,7 @@ # #If the initial peers list is left empty, the node will not try to connect to other peers during initial bootstrap #phase but will accept connections and will do the network discovery if another peer connects to it - InitialPeerList = ["/ip4/127.0.0.1/tcp/9999/p2p/16Uiu2HAmKBCtAqnmawCJ5nxd9AccU3fj4sjA8WA3oksqeZgcsJJv"] + InitialPeerList = ["/ip4/127.0.0.1/tcp/9999/p2p/16Uiu2HAkw5SNNtSvH1zJiQ6Gc3WoGNSxiyNueRKe6fuAuh57G3Bk"] #kademlia's routing table bucket size BucketSize = 100 diff --git a/scripts/testnet/variables.sh b/scripts/testnet/variables.sh index 762df841f45..f9d836c2afa 100644 --- a/scripts/testnet/variables.sh +++ b/scripts/testnet/variables.sh @@ -87,7 +87,7 @@ export PORT_ORIGIN_VALIDATOR="21500" export PORT_ORIGIN_VALIDATOR_REST="9500" # Address of the Seednode. Will be written to the p2p.toml file of the Nodes -export P2P_SEEDNODE_ADDRESS="/ip4/127.0.0.1/tcp/$PORT_SEEDNODE/p2p/16Uiu2HAmKBCtAqnmawCJ5nxd9AccU3fj4sjA8WA3oksqeZgcsJJv" +export P2P_SEEDNODE_ADDRESS="/ip4/127.0.0.1/tcp/$PORT_SEEDNODE/p2p/16Uiu2HAkw5SNNtSvH1zJiQ6Gc3WoGNSxiyNueRKe6fuAuh57G3Bk" # UI configuration profiles From 2d3c82141bbbd6c56d1da2e02454dbd15034a51d Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Fri, 21 Oct 2022 15:56:09 +0300 Subject: [PATCH 065/110] change contributing and pr template --- .github/CONTRIBUTING.md | 35 +++++++++++++++++++++++++++----- .github/PULL_REQUEST_TEMPLATE.md | 9 +++++++- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index c431b8b8c35..f53fdbbcbeb 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -3,15 +3,20 @@ If you are unfamiliar with the workflow of contributing to github, you can refer to this [this article](https://github.com/firstcontributions/first-contributions/blob/master/README.md) -## Fork & clone this repository +## External contributions -The development should happen in a personal fork, cloned on the local machine. +If you are not part of the team and want to contribute to this repository, you must fork & clone this repository -## Use development branch +The development should happen in a personal fork, cloned on the local machine. Make sure you use signed commits before opening +a pull request. -External contributions should happen against the `development` branch. +For external contributors, the PRs should be targeted towards the `master` branch. A team responsible will instruct +the PR owner to re-target it against another branch, in accordance to internal branches management. -Other branches may be used by the team members in accordance to internal decisions. +tl;dr: +- fork `elrond-go` and use `master` branch +- use signed commits +- open a PR against `ElrondNetwork/elrond-go`'s `master` branch ## Use linter @@ -44,3 +49,23 @@ Although the nominal use case looks good, the linter runs without issues, as wel Depending on the PR type, there are multiple ways of manual testing the new code: - if it only affects an API, a log, or something not critical, one could sync a node with new code on Testnet or Devnet and see if everything works good. - if the changes would affect the entire network (consensus, processing, and so on), a local testnet should be started. Also, make sure backwards compatibility is maintained. + +## Branches management + +Internal Branches/Releases Management (to be checked by both the code owner and the reviewers) + +### `elrond-go` +If the PR is: +1. a hotfix: it will be targeted towards `master` branch. +2. a feature: + 2.1. a small feature (a single PR is needed): targeted towards an `rc` branch. + 2.2. a big feature (more than one PR is needed): create a feature branch (`feat/...`) that is targeted towards an `rc` branch. + +### Satellite projects (`elrond-vm-common`, `elrond-go-core`, and so on) +If the PR is: +1. a hotfix: it will be targeted towards `master`/`main` branch. +2. a feature: + 2.1. a small feature (a single PR is needed): targeted towards an `rc` branch and create a new tag&release after merging, and reference it in `elrond-go` (if needed). + 2.2. a big feature: + 2.2.1. a small satellite PR: targeted towards an `rc` branch. For each change, reference just the commit hash on `elrond-go` and create a tag&pre-release when the `elrond-go` PR is to be merged. + 2.2.2. a big satellite PR: create a feature branch (`feat/...`) targeted towards an `rc` branch. For each change, reference just the commit hash on `elrond-go` and create a tag&pre-release when the `feat` branch is merged diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 2bad3c860d5..112c1dc3f96 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,4 +1,4 @@ -## Description of the reasoning behind the pull request (what feature was missing / how the problem was manifesting itself / what was the motive behind the refactoring) +## Reasoning behind the pull request - - - @@ -12,3 +12,10 @@ - - - + +## Pre-requisites + +Based on the [Contributing Guidelines](https://github.com/ElrondNetwork/elrond-go/blob/master/.github/CONTRIBUTING.md#branches-management) the PR author and the reviewers must check the following requirements are met: +- was the PR targeted to the correct branch? +- if this is a larger feature that probably needs more than one PR, is there a `feat` branch created? +- if this is a `feat` branch merging, do all sattelites projects have a proper tag inside `go.mod`? From 58b9e55ede62c4d71bc53be2ede654eba36d7e0f Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Fri, 21 Oct 2022 16:00:06 +0300 Subject: [PATCH 066/110] fixes and extra check --- scripts/testnet/include/config.sh | 11 +++++++---- scripts/testnet/variables.sh | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/scripts/testnet/include/config.sh b/scripts/testnet/include/config.sh index 162e190aa12..1cc6eda08ae 100644 --- a/scripts/testnet/include/config.sh +++ b/scripts/testnet/include/config.sh @@ -33,12 +33,15 @@ copySeednodeConfig() { pushd $ELRONDDIR/cmd/keygenerator - go build - ./keygenerator --key-type p2p + if [[ ! -f "p2pKey.pem" ]]; then + go build + ./keygenerator --key-type p2p + fi + cp p2pKey.pem $TESTNETDIR/seednode/config GENERATED_P2P_PUB_KEY=$(grep for ./p2pKey.pem | head -1 | grep -oP '[^[:blank:]-]*' | tail -1) - export P2P_SEEDNODE_ADDRESS="/ip4/127.0.0.1/tcp/$PORT_SEEDNODE/p2p/$GENERATED_P2P_PUB_KEY" - rm p2pKey.pem + P2P_SEEDNODE_ADDRESS=$P2P_SEEDNODE_ADDRESS$GENERATED_P2P_PUB_KEY + export P2P_SEEDNODE_ADDRESS popd } diff --git a/scripts/testnet/variables.sh b/scripts/testnet/variables.sh index f9d836c2afa..c57ac49b44d 100644 --- a/scripts/testnet/variables.sh +++ b/scripts/testnet/variables.sh @@ -87,7 +87,7 @@ export PORT_ORIGIN_VALIDATOR="21500" export PORT_ORIGIN_VALIDATOR_REST="9500" # Address of the Seednode. Will be written to the p2p.toml file of the Nodes -export P2P_SEEDNODE_ADDRESS="/ip4/127.0.0.1/tcp/$PORT_SEEDNODE/p2p/16Uiu2HAkw5SNNtSvH1zJiQ6Gc3WoGNSxiyNueRKe6fuAuh57G3Bk" +export P2P_SEEDNODE_ADDRESS="/ip4/127.0.0.1/tcp/$PORT_SEEDNODE/p2p/" # UI configuration profiles From 557b57cf54063ee4269353619d092892684dc9f1 Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Fri, 21 Oct 2022 16:26:55 +0300 Subject: [PATCH 067/110] fixes after review --- .github/CONTRIBUTING.md | 11 +++++------ .github/PULL_REQUEST_TEMPLATE.md | 6 +++--- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index f53fdbbcbeb..0323f2a4d9b 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -7,16 +7,15 @@ If you are unfamiliar with the workflow of contributing to github, you can refer If you are not part of the team and want to contribute to this repository, you must fork & clone this repository -The development should happen in a personal fork, cloned on the local machine. Make sure you use signed commits before opening -a pull request. +The development should happen in a personal fork, cloned on the local machine. **Make sure you use signed commits before opening** a pull request. For external contributors, the PRs should be targeted towards the `master` branch. A team responsible will instruct the PR owner to re-target it against another branch, in accordance to internal branches management. -tl;dr: -- fork `elrond-go` and use `master` branch -- use signed commits -- open a PR against `ElrondNetwork/elrond-go`'s `master` branch +**tl;dr**: +- fork `elrond-go` and use `master` branch. +- use signed commits. [docs](https://docs.github.com/en/authentication/managing-commit-signature-verification/signing-commits). +- open a PR against the `master` branch of `ElrondNetwork/elrond-go`. ## Use linter diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 112c1dc3f96..f499a858e4d 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -3,7 +3,7 @@ - - -## Proposed Changes +## Proposed changes - - - @@ -15,7 +15,7 @@ ## Pre-requisites -Based on the [Contributing Guidelines](https://github.com/ElrondNetwork/elrond-go/blob/master/.github/CONTRIBUTING.md#branches-management) the PR author and the reviewers must check the following requirements are met: +Based on the [Contributing Guidelines](CONTRIBUTING.md#branches-management) the PR author and the reviewers must check the following requirements are met: - was the PR targeted to the correct branch? - if this is a larger feature that probably needs more than one PR, is there a `feat` branch created? -- if this is a `feat` branch merging, do all sattelites projects have a proper tag inside `go.mod`? +- if this is a `feat` branch merging, do all satellites projects have a proper tag inside `go.mod`? From 255707dd997233fa197d5e57a2450491af3013a3 Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Fri, 21 Oct 2022 16:36:37 +0300 Subject: [PATCH 068/110] small fix --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index f499a858e4d..38d32618601 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -18,4 +18,4 @@ Based on the [Contributing Guidelines](CONTRIBUTING.md#branches-management) the PR author and the reviewers must check the following requirements are met: - was the PR targeted to the correct branch? - if this is a larger feature that probably needs more than one PR, is there a `feat` branch created? -- if this is a `feat` branch merging, do all satellites projects have a proper tag inside `go.mod`? +- if this is a `feat` branch merging, do all satellite projects have a proper tag inside `go.mod`? From 557574573d895f5055e0a52a3f5b4020d337745d Mon Sep 17 00:00:00 2001 From: jules01 Date: Fri, 21 Oct 2022 17:20:48 +0300 Subject: [PATCH 069/110] - made the heartbeat v2 monitor struct better filter-out inactive messages --- heartbeat/monitor/errors.go | 9 ++ heartbeat/monitor/heartbeatMessage.go | 62 +++++++++++++ heartbeat/monitor/monitor.go | 96 +++++++++++++++----- heartbeat/monitor/monitor_test.go | 122 ++++++++++++++++++++------ 4 files changed, 241 insertions(+), 48 deletions(-) create mode 100644 heartbeat/monitor/errors.go create mode 100644 heartbeat/monitor/heartbeatMessage.go diff --git a/heartbeat/monitor/errors.go b/heartbeat/monitor/errors.go new file mode 100644 index 00000000000..f88f18f373e --- /dev/null +++ b/heartbeat/monitor/errors.go @@ -0,0 +1,9 @@ +package monitor + +import "errors" + +var ( + errEmptyHeartbeatMessagesInstance = errors.New("programming error: empty heartbeatMessages instance") + errInconsistentActivePidsList = errors.New("programming error: inconsistent active pids list") + errInconsistentActiveMap = errors.New("programming error: inconsistent active map") +) diff --git a/heartbeat/monitor/heartbeatMessage.go b/heartbeat/monitor/heartbeatMessage.go new file mode 100644 index 00000000000..a7c05bd6af4 --- /dev/null +++ b/heartbeat/monitor/heartbeatMessage.go @@ -0,0 +1,62 @@ +package monitor + +import ( + "sort" + + "github.com/ElrondNetwork/elrond-go-core/core" + "github.com/ElrondNetwork/elrond-go/heartbeat/data" +) + +type heartbeatMessages struct { + activePids []core.PeerID + activeHeartbeats map[core.PeerID]*data.PubKeyHeartbeat + inactiveHeartbeats map[core.PeerID]*data.PubKeyHeartbeat +} + +func newHeartbeatMessages() *heartbeatMessages { + return &heartbeatMessages{ + activePids: make([]core.PeerID, 0), + activeHeartbeats: make(map[core.PeerID]*data.PubKeyHeartbeat), + inactiveHeartbeats: make(map[core.PeerID]*data.PubKeyHeartbeat), + } +} + +func (instance *heartbeatMessages) addMessage(pid core.PeerID, message *data.PubKeyHeartbeat) { + if message.IsActive { + instance.activePids = append(instance.activePids, pid) + instance.activeHeartbeats[pid] = message + + return + } + + instance.inactiveHeartbeats[pid] = message +} + +func (instance *heartbeatMessages) getHeartbeat() (*data.PubKeyHeartbeat, error) { + if len(instance.activeHeartbeats) > 0 { + return instance.getFirstActive() + } + if len(instance.inactiveHeartbeats) > 0 { + for _, inactive := range instance.inactiveHeartbeats { + return inactive, nil + } + } + return nil, errEmptyHeartbeatMessagesInstance +} + +func (instance *heartbeatMessages) getFirstActive() (*data.PubKeyHeartbeat, error) { + sort.Slice(instance.activePids, func(i, j int) bool { + return string(instance.activePids[i]) < string(instance.activePids[j]) + }) + + if len(instance.activePids) == 0 { + return nil, errInconsistentActivePidsList + } + + message, found := instance.activeHeartbeats[instance.activePids[0]] + if !found { + return nil, errInconsistentActiveMap + } + + return message, nil +} diff --git a/heartbeat/monitor/monitor.go b/heartbeat/monitor/monitor.go index 6db49ce35c2..8bdee9230f8 100644 --- a/heartbeat/monitor/monitor.go +++ b/heartbeat/monitor/monitor.go @@ -89,11 +89,32 @@ func checkArgs(args ArgHeartbeatV2Monitor) error { // GetHeartbeats returns the heartbeat status func (monitor *heartbeatV2Monitor) GetHeartbeats() []data.PubKeyHeartbeat { - numInstances := make(map[string]uint64) + heartbeatMessagesMap := monitor.processRAWDataFromCache() + monitor.removeFromInactiveNodes(heartbeatMessagesMap) + heartbeatsV2 := make([]data.PubKeyHeartbeat, 0) + for _, heartbeatMessagesInstance := range heartbeatMessagesMap { + message, err := heartbeatMessagesInstance.getHeartbeat() + if err != nil { + log.Warn("heartbeatV2Monitor.GetHeartbeats", "error", err) + continue + } + + message.NumInstances = uint64(len(heartbeatMessagesInstance.activeHeartbeats)) + heartbeatsV2 = append(heartbeatsV2, *message) + } + + sort.Slice(heartbeatsV2, func(i, j int) bool { + return strings.Compare(heartbeatsV2[i].PublicKey, heartbeatsV2[j].PublicKey) < 0 + }) + + return heartbeatsV2 +} + +func (monitor *heartbeatV2Monitor) processRAWDataFromCache() map[string]*heartbeatMessages { pids := monitor.cache.Keys() - heartbeatsV2 := make([]data.PubKeyHeartbeat, 0) + heartbeatsV2 := make(map[string]*heartbeatMessages) for idx := 0; idx < len(pids); idx++ { pid := pids[idx] hb, ok := monitor.cache.Get(pid) @@ -102,41 +123,75 @@ func (monitor *heartbeatV2Monitor) GetHeartbeats() []data.PubKeyHeartbeat { } peerId := core.PeerID(pid) - heartbeatData, err := monitor.parseMessage(peerId, hb, numInstances) + heartbeatData, err := monitor.parseMessage(peerId, hb) if err != nil { monitor.cache.Remove(pid) log.Trace("could not parse message for pid, removed message", "pid", peerId.Pretty(), "error", err.Error()) continue } - heartbeatsV2 = append(heartbeatsV2, heartbeatData) + heartbeatMessagesInstance, found := heartbeatsV2[heartbeatData.PublicKey] + if !found { + heartbeatMessagesInstance = newHeartbeatMessages() + heartbeatsV2[heartbeatData.PublicKey] = heartbeatMessagesInstance + } + + heartbeatMessagesInstance.addMessage(peerId, heartbeatData) } - for idx := range heartbeatsV2 { - hbData := &heartbeatsV2[idx] - pk := hbData.PublicKey - hbData.NumInstances = numInstances[pk] + return heartbeatsV2 +} + +func (monitor *heartbeatV2Monitor) removeFromInactiveNodes(heartbeatsV2 map[string]*heartbeatMessages) { + for _, heartbeatMessagesInstance := range heartbeatsV2 { + if len(heartbeatMessagesInstance.activeHeartbeats) > 0 { + // at least one active heartbeat message found, old inactive messages should be discarded + monitor.removeAllInactiveMessages(heartbeatMessagesInstance) + continue + } + + monitor.removeInactiveMessagesExceptLatest(heartbeatMessagesInstance) } +} - sort.Slice(heartbeatsV2, func(i, j int) bool { - return strings.Compare(heartbeatsV2[i].PublicKey, heartbeatsV2[j].PublicKey) < 0 - }) +func (monitor *heartbeatV2Monitor) removeAllInactiveMessages(heartbeatMessagesInstance *heartbeatMessages) { + for pid := range heartbeatMessagesInstance.inactiveHeartbeats { + monitor.cache.Remove([]byte(pid)) + } - return heartbeatsV2 + heartbeatMessagesInstance.inactiveHeartbeats = make(map[core.PeerID]*data.PubKeyHeartbeat) } -func (monitor *heartbeatV2Monitor) parseMessage(pid core.PeerID, message interface{}, numInstances map[string]uint64) (data.PubKeyHeartbeat, error) { - pubKeyHeartbeat := data.PubKeyHeartbeat{} +func (monitor *heartbeatV2Monitor) removeInactiveMessagesExceptLatest(heartbeatMessagesInstance *heartbeatMessages) { + latestPid := core.PeerID("") + latestTimeStamp := int64(0) + for pid, heartbeatMessage := range heartbeatMessagesInstance.inactiveHeartbeats { + if heartbeatMessage.TimeStamp.Unix() > latestTimeStamp { + latestTimeStamp = heartbeatMessage.TimeStamp.Unix() + latestPid = pid + } + } + + for pid := range heartbeatMessagesInstance.inactiveHeartbeats { + if pid == latestPid { + continue + } + monitor.cache.Remove([]byte(pid)) + delete(heartbeatMessagesInstance.inactiveHeartbeats, pid) + } +} + +func (monitor *heartbeatV2Monitor) parseMessage(pid core.PeerID, message interface{}) (*data.PubKeyHeartbeat, error) { heartbeatV2, ok := message.(*heartbeat.HeartbeatV2) if !ok { - return pubKeyHeartbeat, process.ErrWrongTypeAssertion + return nil, process.ErrWrongTypeAssertion } - payload := heartbeat.Payload{} - err := monitor.marshaller.Unmarshal(&payload, heartbeatV2.Payload) + payload := &heartbeat.Payload{} + err := monitor.marshaller.Unmarshal(payload, heartbeatV2.Payload) if err != nil { - return pubKeyHeartbeat, err + return nil, err } crtTime := time.Now() @@ -144,13 +199,12 @@ func (monitor *heartbeatV2Monitor) parseMessage(pid core.PeerID, message interfa messageAge := monitor.getMessageAge(crtTime, messageTime) computedShardID, stringType := monitor.computePeerTypeAndShardID(heartbeatV2) if monitor.shouldSkipMessage(messageAge) { - return pubKeyHeartbeat, fmt.Errorf("%w, messageAge %v", heartbeat.ErrShouldSkipValidator, messageAge) + return nil, fmt.Errorf("%w, messageAge %v", heartbeat.ErrShouldSkipValidator, messageAge) } pkHexString := monitor.pubKeyConverter.Encode(heartbeatV2.GetPubkey()) - numInstances[pkHexString]++ - pubKeyHeartbeat = data.PubKeyHeartbeat{ + pubKeyHeartbeat := &data.PubKeyHeartbeat{ PublicKey: pkHexString, TimeStamp: messageTime, IsActive: monitor.isActive(messageAge), diff --git a/heartbeat/monitor/monitor_test.go b/heartbeat/monitor/monitor_test.go index 0a601fc5f90..2a856ba83e3 100644 --- a/heartbeat/monitor/monitor_test.go +++ b/heartbeat/monitor/monitor_test.go @@ -144,7 +144,7 @@ func TestHeartbeatV2Monitor_parseMessage(t *testing.T) { monitor, _ := NewHeartbeatV2Monitor(args) assert.False(t, check.IfNil(monitor)) - _, err := monitor.parseMessage("pid", "dummy msg", nil) + _, err := monitor.parseMessage("pid", "dummy msg") assert.Equal(t, process.ErrWrongTypeAssertion, err) }) t.Run("unmarshal returns error", func(t *testing.T) { @@ -156,7 +156,7 @@ func TestHeartbeatV2Monitor_parseMessage(t *testing.T) { message := createHeartbeatMessage(true, []byte("public key")) message.Payload = []byte("dummy payload") - _, err := monitor.parseMessage("pid", message, nil) + _, err := monitor.parseMessage("pid", message) assert.NotNil(t, err) }) t.Run("skippable message should return error", func(t *testing.T) { @@ -167,7 +167,7 @@ func TestHeartbeatV2Monitor_parseMessage(t *testing.T) { assert.False(t, check.IfNil(monitor)) message := createHeartbeatMessage(false, []byte("public key")) - _, err := monitor.parseMessage("pid", message, nil) + _, err := monitor.parseMessage("pid", message) assert.True(t, errors.Is(err, heartbeat.ErrShouldSkipValidator)) }) t.Run("should work, peer type provider returns error", func(t *testing.T) { @@ -184,26 +184,17 @@ func TestHeartbeatV2Monitor_parseMessage(t *testing.T) { monitor, _ := NewHeartbeatV2Monitor(args) assert.False(t, check.IfNil(monitor)) - numInstances := make(map[string]uint64) message := createHeartbeatMessage(true, providedPkBytes) message.Pubkey = providedPkBytesFromMessage providedPid := core.PeerID("pid") providedMap := map[string]struct{}{ providedPid.Pretty(): {}, } - hb, err := monitor.parseMessage(providedPid, message, numInstances) + hb, err := monitor.parseMessage(providedPid, message) assert.Nil(t, err) - checkResults(t, *message, hb, true, providedMap, 0) + checkResults(t, message, *hb, true, providedMap, 0) assert.Equal(t, 0, len(providedMap)) - pkFromMsg := args.PubKeyConverter.Encode(providedPkBytesFromMessage) - entries, ok := numInstances[pkFromMsg] - assert.True(t, ok) - assert.Equal(t, uint64(1), entries) assert.Equal(t, string(common.ObserverList), hb.PeerType) - - pkFromPSM := args.PubKeyConverter.Encode(providedPkBytes) - _, ok = numInstances[pkFromPSM] - assert.False(t, ok) }) t.Run("should work", func(t *testing.T) { t.Parallel() @@ -219,20 +210,15 @@ func TestHeartbeatV2Monitor_parseMessage(t *testing.T) { monitor, _ := NewHeartbeatV2Monitor(args) assert.False(t, check.IfNil(monitor)) - numInstances := make(map[string]uint64) message := createHeartbeatMessage(true, providedPkBytes) providedPid := core.PeerID("pid") providedMap := map[string]struct{}{ providedPid.Pretty(): {}, } - hb, err := monitor.parseMessage(providedPid, message, numInstances) + hb, err := monitor.parseMessage(providedPid, message) assert.Nil(t, err) - checkResults(t, *message, hb, true, providedMap, 0) + checkResults(t, message, *hb, true, providedMap, 0) assert.Equal(t, 0, len(providedMap)) - pk := args.PubKeyConverter.Encode(providedPkBytes) - entries, ok := numInstances[pk] - assert.True(t, ok) - assert.Equal(t, uint64(1), entries) assert.Equal(t, string(expectedPeerType), hb.PeerType) }) } @@ -311,10 +297,92 @@ func TestHeartbeatV2Monitor_GetHeartbeats(t *testing.T) { assert.Equal(t, len(providedStatuses)-1, len(heartbeats)) assert.Equal(t, len(providedStatuses)-1, args.Cache.Len()) // faulty message was removed from cache for i := 0; i < len(heartbeats); i++ { - checkResults(t, *providedMessages[i], heartbeats[i], providedStatuses[i], providedPids, 1) + checkResults(t, providedMessages[i], heartbeats[i], providedStatuses[i], providedPids, 1) } assert.Equal(t, 1, len(providedPids)) // one message is skipped }) + t.Run("should remove all inactive messages except from the latest message", func(t *testing.T) { + t.Parallel() + args := createMockHeartbeatV2MonitorArgs() + args.HideInactiveValidatorInterval = time.Minute + providedStatuses := []bool{false, false, false} + numOfMessages := len(providedStatuses) + providedPids := make(map[string]struct{}, numOfMessages) + providedMessages := make([]*heartbeat.HeartbeatV2, numOfMessages) + for i := 0; i < numOfMessages; i++ { + pid := core.PeerID(fmt.Sprintf("%s%d", "pid", i)) + providedPids[pid.Pretty()] = struct{}{} + pkBytes := []byte("same pk") + + providedMessages[i] = createHeartbeatMessage(providedStatuses[i], pkBytes) + payload := heartbeat.Payload{ + Timestamp: time.Now().Unix() - 30 + int64(i), // the last message will be the latest, so it will be returned + } + + marshaller := testscommon.MarshalizerMock{} + payloadBytes, _ := marshaller.Marshal(payload) + providedMessages[i].Payload = payloadBytes + + args.Cache.Put(pid.Bytes(), providedMessages[i], providedMessages[i].Size()) + } + + monitor, _ := NewHeartbeatV2Monitor(args) + assert.False(t, check.IfNil(monitor)) + + heartbeats := monitor.GetHeartbeats() + assert.Equal(t, 1, len(heartbeats)) + checkResults(t, providedMessages[2], heartbeats[0], providedStatuses[2], providedPids, 0) + assert.Equal(t, 2, len(providedPids)) // 1 inactive was removed from the heartbeat list + }) + t.Run("should remove all inactive messages if one is active", func(t *testing.T) { + t.Parallel() + args := createMockHeartbeatV2MonitorArgs() + args.HideInactiveValidatorInterval = time.Minute + providedStatuses := []bool{true, false, false} + numOfMessages := len(providedStatuses) + providedPids := make(map[string]struct{}, numOfMessages) + providedMessages := make([]*heartbeat.HeartbeatV2, numOfMessages) + for i := 0; i < numOfMessages; i++ { + pid := core.PeerID(fmt.Sprintf("%s%d", "pid", i)) + providedPids[pid.Pretty()] = struct{}{} + pkBytes := []byte("same pk") + + providedMessages[i] = createHeartbeatMessage(providedStatuses[i], pkBytes) + if i != 0 { + // 1, 2 ... are inactive messages + payload := heartbeat.Payload{ + Timestamp: time.Now().Unix() - 30 + int64(i), // the last message will be the latest, so it will be returned + } + + marshaller := testscommon.MarshalizerMock{} + payloadBytes, _ := marshaller.Marshal(payload) + providedMessages[i].Payload = payloadBytes + } + + args.Cache.Put(pid.Bytes(), providedMessages[i], providedMessages[i].Size()) + } + + monitor, _ := NewHeartbeatV2Monitor(args) + assert.False(t, check.IfNil(monitor)) + + heartbeats := monitor.GetHeartbeats() + assert.Equal(t, 1, len(heartbeats)) + checkResults(t, providedMessages[0], heartbeats[0], providedStatuses[0], providedPids, 1) + assert.Equal(t, 2, len(providedPids)) // 1 inactive was removed from the heartbeat list + }) + t.Run("nil message in cache should remove", func(t *testing.T) { + t.Parallel() + args := createMockHeartbeatV2MonitorArgs() + args.HideInactiveValidatorInterval = time.Minute + args.Cache.Put([]byte("pid"), nil, 0) + + monitor, _ := NewHeartbeatV2Monitor(args) + assert.False(t, check.IfNil(monitor)) + + heartbeats := monitor.GetHeartbeats() + assert.Equal(t, 0, len(heartbeats)) + assert.Equal(t, 0, args.Cache.Len()) + }) t.Run("should work", func(t *testing.T) { t.Parallel() args := createMockHeartbeatV2MonitorArgs() @@ -340,19 +408,19 @@ func TestHeartbeatV2Monitor_GetHeartbeats(t *testing.T) { assert.False(t, check.IfNil(monitor)) heartbeats := monitor.GetHeartbeats() - assert.Equal(t, args.Cache.Len(), len(heartbeats)) - for i := 0; i < numOfMessages; i++ { + assert.Equal(t, 2, len(heartbeats)) // 2 have the same pk + for i := 0; i < 2; i++ { numInstances := uint64(1) if i > 0 { numInstances = 2 } - checkResults(t, *providedMessages[i], heartbeats[i], providedStatuses[i], providedPids, numInstances) + checkResults(t, providedMessages[i], heartbeats[i], providedStatuses[i], providedPids, numInstances) } - assert.Equal(t, 0, len(providedPids)) + assert.Equal(t, 1, len(providedPids)) // 1 inactive was removed from the heartbeat list }) } -func checkResults(t *testing.T, message heartbeat.HeartbeatV2, hb data.PubKeyHeartbeat, isActive bool, providedPids map[string]struct{}, numInstances uint64) { +func checkResults(t *testing.T, message *heartbeat.HeartbeatV2, hb data.PubKeyHeartbeat, isActive bool, providedPids map[string]struct{}, numInstances uint64) { assert.Equal(t, isActive, hb.IsActive) assert.Equal(t, message.VersionNumber, hb.VersionNumber) assert.Equal(t, message.NodeDisplayName, hb.NodeDisplayName) From c40caeeb0a914a18addc0291dc7d6be98440fb35 Mon Sep 17 00:00:00 2001 From: BeniaminDrasovean Date: Fri, 21 Oct 2022 17:22:29 +0300 Subject: [PATCH 070/110] update go mod --- go.mod | 12 ++++++------ go.sum | 24 ++++++++++++------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index d302dbad3cd..1f4bccb4caf 100644 --- a/go.mod +++ b/go.mod @@ -4,16 +4,16 @@ go 1.15 require ( github.com/ElrondNetwork/covalent-indexer-go v1.0.6 - github.com/ElrondNetwork/elastic-indexer-go v1.2.45-0.20221019144818-5b4fe7b3e724 - github.com/ElrondNetwork/elrond-go-core v1.1.21-0.20221018132248-0621ead5b6d3 + github.com/ElrondNetwork/elastic-indexer-go v1.2.45 + github.com/ElrondNetwork/elrond-go-core v1.1.23 github.com/ElrondNetwork/elrond-go-crypto v1.2.1 github.com/ElrondNetwork/elrond-go-logger v1.0.9 github.com/ElrondNetwork/elrond-go-p2p v1.0.3 github.com/ElrondNetwork/elrond-go-storage v1.0.1 - github.com/ElrondNetwork/elrond-vm-common v1.3.23-0.20221019113258-ca9342453fa4 - github.com/ElrondNetwork/wasm-vm v1.4.60-0.20221021061752-4438e7e05aad - github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.43-0.20221019114848-90e637a3fb5c - github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.43-0.20221019120649-0b89b33dbe84 + github.com/ElrondNetwork/elrond-vm-common v1.3.24 + github.com/ElrondNetwork/wasm-vm v1.5.2 + github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.43 + github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.43 github.com/beevik/ntp v0.3.0 github.com/davecgh/go-spew v1.1.1 github.com/elastic/go-elasticsearch/v7 v7.12.0 diff --git a/go.sum b/go.sum index d9b1b3a5241..8d22e70bd17 100644 --- a/go.sum +++ b/go.sum @@ -49,15 +49,15 @@ github.com/ElrondNetwork/concurrent-map v0.1.3 h1:j2LtPrNJuerannC1cQDE79STvi/P04 github.com/ElrondNetwork/concurrent-map v0.1.3/go.mod h1:3XwSwn4JHI0lrKxWLZvtp53Emr8BXYTmNQGwcukHJEE= github.com/ElrondNetwork/covalent-indexer-go v1.0.6 h1:+LNKItUc+Pb7WuTbil3VuiLMmdQ1AY7lBJM476PtVNE= github.com/ElrondNetwork/covalent-indexer-go v1.0.6/go.mod h1:j3h2g96vqhJAuj3aEX2PWhomae2/o7YfXGEfweNXEeQ= -github.com/ElrondNetwork/elastic-indexer-go v1.2.45-0.20221019144818-5b4fe7b3e724 h1:o5lUBBR+B6MBxOBEcGgs+25qPFH908bLFN0RK3vj+3g= -github.com/ElrondNetwork/elastic-indexer-go v1.2.45-0.20221019144818-5b4fe7b3e724/go.mod h1:UImkSOg50yVUIHNQqFcwlOV2IgqL93cWtlMuSGhxVik= +github.com/ElrondNetwork/elastic-indexer-go v1.2.45 h1:Yqwe4Ysn/VVypo4/2ohS994BHr59ZLsJXioTgjKND3w= +github.com/ElrondNetwork/elastic-indexer-go v1.2.45/go.mod h1:lGTJNWWcAz5gcA6Wue435ncnI6PhXtKJ5iwSfp5//8c= github.com/ElrondNetwork/elrond-go-core v1.0.0/go.mod h1:FQMem7fFF4+8pQ6lVsBZq6yO+smD0nV23P4bJpmPjTo= github.com/ElrondNetwork/elrond-go-core v1.1.7/go.mod h1:O9FkkTT2H9kxCzfn40TbhoCDXzGmUrRVusMomhK/Y3g= github.com/ElrondNetwork/elrond-go-core v1.1.13/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.18/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.19/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= -github.com/ElrondNetwork/elrond-go-core v1.1.21-0.20221018132248-0621ead5b6d3 h1:vsklPgwbT+Wym96veRHyMD4hnskZfQrYUtZBVNlOUy4= -github.com/ElrondNetwork/elrond-go-core v1.1.21-0.20221018132248-0621ead5b6d3/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= +github.com/ElrondNetwork/elrond-go-core v1.1.23 h1:IJ+D/6PAFn36fjI84tyM/3rvZroiUjNGtyY2u/5CoO4= +github.com/ElrondNetwork/elrond-go-core v1.1.23/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-crypto v1.0.0/go.mod h1:DGiR7/j1xv729Xg8SsjYaUzWXL5svMd44REXjWS/gAc= github.com/ElrondNetwork/elrond-go-crypto v1.2.1 h1:5wWCBEZp5SMFO2+Nal8UaJNJcG9G9J4PHNNZvQpEeUE= github.com/ElrondNetwork/elrond-go-crypto v1.2.1/go.mod h1:UNmpDaJjLTKxfzUcwua2R7Mh9bicw/L3ICJt5V7zqMo= @@ -73,18 +73,18 @@ github.com/ElrondNetwork/elrond-go-storage v1.0.1/go.mod h1:Dht8Vt0BJvyUrr+mDSjY github.com/ElrondNetwork/elrond-vm-common v1.1.0/go.mod h1:w3i6f8uiuRkE68Ie/gebRcLgTuHqvruJSYrFyZWuLrE= github.com/ElrondNetwork/elrond-vm-common v1.2.9/go.mod h1:B/Y8WiqHyDd7xsjNYsaYbVMp1jQgQ+z4jTJkFvj/EWI= github.com/ElrondNetwork/elrond-vm-common v1.3.7/go.mod h1:seROQuR7RJCoCS7mgRXVAlvjztltY1c+UroAgWr/USE= -github.com/ElrondNetwork/elrond-vm-common v1.3.23-0.20221019113258-ca9342453fa4 h1:Lx/Ud7V6GT2qtv3HnszQfAUMQbf40Nw9IU5OMh7+jDg= -github.com/ElrondNetwork/elrond-vm-common v1.3.23-0.20221019113258-ca9342453fa4/go.mod h1:seROQuR7RJCoCS7mgRXVAlvjztltY1c+UroAgWr/USE= +github.com/ElrondNetwork/elrond-vm-common v1.3.24 h1:KK3Oa9mznnMhXJ0JrObO4ulka1grEKxzbxVD1+iTnAo= +github.com/ElrondNetwork/elrond-vm-common v1.3.24/go.mod h1:seROQuR7RJCoCS7mgRXVAlvjztltY1c+UroAgWr/USE= github.com/ElrondNetwork/go-libp2p-pubsub v0.6.1-rc1 h1:Nu/uwYQg/QbfoQ0uD6GahYTwgtAkAwtzsB0HVfSP58I= github.com/ElrondNetwork/go-libp2p-pubsub v0.6.1-rc1/go.mod h1:pJfaShe+i5aWZx8NhSkQjvOYQYLoqPztmFUlKjToOzM= github.com/ElrondNetwork/protobuf v1.3.2 h1:qoCSYiO+8GtXBEZWEjw0WPcZfM3g7QuuJrwpN+y6Mvg= github.com/ElrondNetwork/protobuf v1.3.2/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/ElrondNetwork/wasm-vm v1.4.60-0.20221021061752-4438e7e05aad h1:X2lims7EichDHbj7hvVUJ3AV1MFaSEj9pGxDxfAXOWA= -github.com/ElrondNetwork/wasm-vm v1.4.60-0.20221021061752-4438e7e05aad/go.mod h1:2kn5wXDkqN/XOdmK5ah/C8vK3s49ZUHH5dBIQyLf5+0= -github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.43-0.20221019114848-90e637a3fb5c h1:6PEFTy130z5Atm2+tgYaph5mbeZmp2rCvC398F8mVWQ= -github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.43-0.20221019114848-90e637a3fb5c/go.mod h1:AZlDSyifV2Zd7vK2Z5tD4W/sYRyVIBi9c9sM2pxBsv4= -github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.43-0.20221019120649-0b89b33dbe84 h1:voH0C7ZKGGOlYhHluPvJtUmImk+G4bntUQRoIAFwElU= -github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.43-0.20221019120649-0b89b33dbe84/go.mod h1:Bo3RZvS519Nmajut1Vqbl/T3eb9Of2UbFbF196kXwds= +github.com/ElrondNetwork/wasm-vm v1.5.2 h1:qtRoF/SnXtlkq+lqafgRBhTZ1+vrwUGTTSmXu//FceE= +github.com/ElrondNetwork/wasm-vm v1.5.2/go.mod h1:9SyUhIkrp+wWqGciIpiBLs7TanqslkO7flCw4GCWGas= +github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.43 h1:WaN3Z4hsA4XtS8821kEbLlTXXTG/EBdtD4vrgOcsfBY= +github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.43/go.mod h1:i1TIkkBwx3ss3C4balJCKQDiRpG6WOI4blhlfSf56uI= +github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.43 h1:Mo9dqzSZSbyCMvLhCxqFNigFIC7wLKPEjNVMgAQmxrw= +github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.43/go.mod h1:6m4U8OM0C6Jaa6UBilPx1OJqECoz4MfyKw0pV1eAnxs= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= From d8a073084e523adf45d2c757aeea5c3609013110 Mon Sep 17 00:00:00 2001 From: jules01 Date: Fri, 21 Oct 2022 17:30:59 +0300 Subject: [PATCH 071/110] - added extra cache checks --- heartbeat/monitor/monitor_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/heartbeat/monitor/monitor_test.go b/heartbeat/monitor/monitor_test.go index 2a856ba83e3..9b8ecdd8e87 100644 --- a/heartbeat/monitor/monitor_test.go +++ b/heartbeat/monitor/monitor_test.go @@ -331,6 +331,7 @@ func TestHeartbeatV2Monitor_GetHeartbeats(t *testing.T) { heartbeats := monitor.GetHeartbeats() assert.Equal(t, 1, len(heartbeats)) + assert.Equal(t, 1, args.Cache.Len()) checkResults(t, providedMessages[2], heartbeats[0], providedStatuses[2], providedPids, 0) assert.Equal(t, 2, len(providedPids)) // 1 inactive was removed from the heartbeat list }) @@ -367,6 +368,7 @@ func TestHeartbeatV2Monitor_GetHeartbeats(t *testing.T) { heartbeats := monitor.GetHeartbeats() assert.Equal(t, 1, len(heartbeats)) + assert.Equal(t, 1, args.Cache.Len()) checkResults(t, providedMessages[0], heartbeats[0], providedStatuses[0], providedPids, 1) assert.Equal(t, 2, len(providedPids)) // 1 inactive was removed from the heartbeat list }) From fa871fc5a6242d6e92211e7c447a44d2f19bb5ee Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Fri, 21 Oct 2022 17:34:29 +0300 Subject: [PATCH 072/110] update comment --- cmd/node/flags.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/node/flags.go b/cmd/node/flags.go index 49a2be7714e..10959a01fc6 100644 --- a/cmd/node/flags.go +++ b/cmd/node/flags.go @@ -357,7 +357,7 @@ var ( // operationMode defines the flag for specifying how configs should be altered depending on the node's intent operationMode = cli.StringFlag{ Name: "operation-mode", - Usage: "String flag for specifying the desired `operation mode`(s) of the node, resulting in altering some configuration values accordingly. Values are: import-db, full-archive, db-lookup-extension, historical-balances or `\"\"` (empty). Multiple values can be separated via ,", + Usage: "String flag for specifying the desired `operation mode`(s) of the node, resulting in altering some configuration values accordingly. Possible values are: lite-observer, full-archive, db-lookup-extension, historical-balances or `\"\"` (empty). Multiple values can be separated via ,", Value: "", } ) From d583bf758e02bac01563daeebd16fde126c2bed2 Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Fri, 21 Oct 2022 17:47:49 +0300 Subject: [PATCH 073/110] refactor --- scripts/testnet/include/config.sh | 3 +-- scripts/testnet/variables.sh | 3 +++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/scripts/testnet/include/config.sh b/scripts/testnet/include/config.sh index 1cc6eda08ae..d3fc1da5b6e 100644 --- a/scripts/testnet/include/config.sh +++ b/scripts/testnet/include/config.sh @@ -40,8 +40,7 @@ copySeednodeConfig() { cp p2pKey.pem $TESTNETDIR/seednode/config GENERATED_P2P_PUB_KEY=$(grep for ./p2pKey.pem | head -1 | grep -oP '[^[:blank:]-]*' | tail -1) - P2P_SEEDNODE_ADDRESS=$P2P_SEEDNODE_ADDRESS$GENERATED_P2P_PUB_KEY - export P2P_SEEDNODE_ADDRESS + export P2P_SEEDNODE_ADDRESS="/ip4/$SEEDNODE_IP/tcp/$PORT_SEEDNODE/p2p/$GENERATED_P2P_PUB_KEY" popd } diff --git a/scripts/testnet/variables.sh b/scripts/testnet/variables.sh index c57ac49b44d..186025799e0 100644 --- a/scripts/testnet/variables.sh +++ b/scripts/testnet/variables.sh @@ -79,6 +79,9 @@ export ALWAYS_UPDATE_CONFIGS=1 # Always rebuild Arwen from its sources and copy the executable to the testnet folder. export ALWAYS_BUILD_ARWEN=1 +# IP of the seednode +export SEEDNODE_IP="127.0.0.1" + # Ports used by the Nodes export PORT_SEEDNODE="9999" export PORT_ORIGIN_OBSERVER="21100" From 30affc22fa1294f9245227ed89db22f5e6ce318c Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Fri, 21 Oct 2022 17:50:31 +0300 Subject: [PATCH 074/110] small fix --- scripts/testnet/variables.sh | 4 ---- 1 file changed, 4 deletions(-) diff --git a/scripts/testnet/variables.sh b/scripts/testnet/variables.sh index 186025799e0..c368ea0e310 100644 --- a/scripts/testnet/variables.sh +++ b/scripts/testnet/variables.sh @@ -89,10 +89,6 @@ export PORT_ORIGIN_OBSERVER_REST="10000" export PORT_ORIGIN_VALIDATOR="21500" export PORT_ORIGIN_VALIDATOR_REST="9500" -# Address of the Seednode. Will be written to the p2p.toml file of the Nodes -export P2P_SEEDNODE_ADDRESS="/ip4/127.0.0.1/tcp/$PORT_SEEDNODE/p2p/" - - # UI configuration profiles # Use tmux or not. If set to 1, only 2 terminal windows will be opened, and From 4fe2d196cc125082b5ad735c0fa2ca453903e210 Mon Sep 17 00:00:00 2001 From: jules01 Date: Fri, 21 Oct 2022 20:19:48 +0300 Subject: [PATCH 075/110] - fix after review: code optimization --- heartbeat/monitor/errors.go | 2 - heartbeat/monitor/heartbeatMessage.go | 84 +++++++++++++++++---------- heartbeat/monitor/monitor.go | 51 +++------------- heartbeat/monitor/monitor_test.go | 28 ++++++++- 4 files changed, 89 insertions(+), 76 deletions(-) diff --git a/heartbeat/monitor/errors.go b/heartbeat/monitor/errors.go index f88f18f373e..30aef5e971b 100644 --- a/heartbeat/monitor/errors.go +++ b/heartbeat/monitor/errors.go @@ -4,6 +4,4 @@ import "errors" var ( errEmptyHeartbeatMessagesInstance = errors.New("programming error: empty heartbeatMessages instance") - errInconsistentActivePidsList = errors.New("programming error: inconsistent active pids list") - errInconsistentActiveMap = errors.New("programming error: inconsistent active map") ) diff --git a/heartbeat/monitor/heartbeatMessage.go b/heartbeat/monitor/heartbeatMessage.go index a7c05bd6af4..aa376ab3da2 100644 --- a/heartbeat/monitor/heartbeatMessage.go +++ b/heartbeat/monitor/heartbeatMessage.go @@ -1,62 +1,86 @@ package monitor import ( - "sort" - "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go/heartbeat/data" ) type heartbeatMessages struct { - activePids []core.PeerID - activeHeartbeats map[core.PeerID]*data.PubKeyHeartbeat - inactiveHeartbeats map[core.PeerID]*data.PubKeyHeartbeat + firstActivePid core.PeerID + firstActiveHeartbeat *data.PubKeyHeartbeat + numActivePids uint64 + latestInactivePid core.PeerID + latestInactiveHeartbeat *data.PubKeyHeartbeat + inactivePids []core.PeerID } func newHeartbeatMessages() *heartbeatMessages { - return &heartbeatMessages{ - activePids: make([]core.PeerID, 0), - activeHeartbeats: make(map[core.PeerID]*data.PubKeyHeartbeat), - inactiveHeartbeats: make(map[core.PeerID]*data.PubKeyHeartbeat), - } + return &heartbeatMessages{} } func (instance *heartbeatMessages) addMessage(pid core.PeerID, message *data.PubKeyHeartbeat) { if message.IsActive { - instance.activePids = append(instance.activePids, pid) - instance.activeHeartbeats[pid] = message + instance.handleActiveMessage(pid, message) + return + } + + instance.handleInactiveMessage(pid, message) +} + +func (instance *heartbeatMessages) handleActiveMessage(pid core.PeerID, message *data.PubKeyHeartbeat) { + instance.numActivePids++ + if len(instance.firstActivePid) == 0 { + instance.firstActivePid = pid + instance.firstActiveHeartbeat = message return } - instance.inactiveHeartbeats[pid] = message + if string(instance.firstActivePid) > string(pid) { + instance.firstActivePid = pid + instance.firstActiveHeartbeat = message + } +} + +func (instance *heartbeatMessages) handleInactiveMessage(pid core.PeerID, message *data.PubKeyHeartbeat) { + instance.inactivePids = append(instance.inactivePids, pid) + + if instance.latestInactiveHeartbeat == nil { + instance.latestInactivePid = pid + instance.latestInactiveHeartbeat = message + return + } + + if message.TimeStamp.Unix() > instance.latestInactiveHeartbeat.TimeStamp.Unix() { + instance.latestInactivePid = pid + instance.latestInactiveHeartbeat = message + } } func (instance *heartbeatMessages) getHeartbeat() (*data.PubKeyHeartbeat, error) { - if len(instance.activeHeartbeats) > 0 { - return instance.getFirstActive() + if instance.firstActiveHeartbeat != nil { + return instance.firstActiveHeartbeat, nil } - if len(instance.inactiveHeartbeats) > 0 { - for _, inactive := range instance.inactiveHeartbeats { - return inactive, nil - } + if instance.latestInactiveHeartbeat != nil { + return instance.latestInactiveHeartbeat, nil } return nil, errEmptyHeartbeatMessagesInstance } -func (instance *heartbeatMessages) getFirstActive() (*data.PubKeyHeartbeat, error) { - sort.Slice(instance.activePids, func(i, j int) bool { - return string(instance.activePids[i]) < string(instance.activePids[j]) - }) - - if len(instance.activePids) == 0 { - return nil, errInconsistentActivePidsList +func (instance *heartbeatMessages) getInactivePids() []core.PeerID { + if instance.firstActiveHeartbeat != nil { + // at least one active heartbeat, return all pids containing inactive messages + return instance.inactivePids } - message, found := instance.activeHeartbeats[instance.activePids[0]] - if !found { - return nil, errInconsistentActiveMap + result := make([]core.PeerID, 0, len(instance.inactivePids)) + for _, pid := range instance.inactivePids { + if pid == instance.latestInactivePid { + continue + } + + result = append(result, pid) } - return message, nil + return result } diff --git a/heartbeat/monitor/monitor.go b/heartbeat/monitor/monitor.go index 8bdee9230f8..bb6af9ba559 100644 --- a/heartbeat/monitor/monitor.go +++ b/heartbeat/monitor/monitor.go @@ -90,7 +90,6 @@ func checkArgs(args ArgHeartbeatV2Monitor) error { // GetHeartbeats returns the heartbeat status func (monitor *heartbeatV2Monitor) GetHeartbeats() []data.PubKeyHeartbeat { heartbeatMessagesMap := monitor.processRAWDataFromCache() - monitor.removeFromInactiveNodes(heartbeatMessagesMap) heartbeatsV2 := make([]data.PubKeyHeartbeat, 0) for _, heartbeatMessagesInstance := range heartbeatMessagesMap { @@ -100,8 +99,10 @@ func (monitor *heartbeatV2Monitor) GetHeartbeats() []data.PubKeyHeartbeat { continue } - message.NumInstances = uint64(len(heartbeatMessagesInstance.activeHeartbeats)) + message.NumInstances = heartbeatMessagesInstance.numActivePids heartbeatsV2 = append(heartbeatsV2, *message) + + monitor.removeInactive(heartbeatMessagesInstance.getInactivePids()) } sort.Slice(heartbeatsV2, func(i, j int) bool { @@ -111,6 +112,12 @@ func (monitor *heartbeatV2Monitor) GetHeartbeats() []data.PubKeyHeartbeat { return heartbeatsV2 } +func (monitor *heartbeatV2Monitor) removeInactive(pids []core.PeerID) { + for _, pid := range pids { + monitor.cache.Remove([]byte(pid)) + } +} + func (monitor *heartbeatV2Monitor) processRAWDataFromCache() map[string]*heartbeatMessages { pids := monitor.cache.Keys() @@ -142,46 +149,6 @@ func (monitor *heartbeatV2Monitor) processRAWDataFromCache() map[string]*heartbe return heartbeatsV2 } -func (monitor *heartbeatV2Monitor) removeFromInactiveNodes(heartbeatsV2 map[string]*heartbeatMessages) { - for _, heartbeatMessagesInstance := range heartbeatsV2 { - if len(heartbeatMessagesInstance.activeHeartbeats) > 0 { - // at least one active heartbeat message found, old inactive messages should be discarded - monitor.removeAllInactiveMessages(heartbeatMessagesInstance) - continue - } - - monitor.removeInactiveMessagesExceptLatest(heartbeatMessagesInstance) - } -} - -func (monitor *heartbeatV2Monitor) removeAllInactiveMessages(heartbeatMessagesInstance *heartbeatMessages) { - for pid := range heartbeatMessagesInstance.inactiveHeartbeats { - monitor.cache.Remove([]byte(pid)) - } - - heartbeatMessagesInstance.inactiveHeartbeats = make(map[core.PeerID]*data.PubKeyHeartbeat) -} - -func (monitor *heartbeatV2Monitor) removeInactiveMessagesExceptLatest(heartbeatMessagesInstance *heartbeatMessages) { - latestPid := core.PeerID("") - latestTimeStamp := int64(0) - for pid, heartbeatMessage := range heartbeatMessagesInstance.inactiveHeartbeats { - if heartbeatMessage.TimeStamp.Unix() > latestTimeStamp { - latestTimeStamp = heartbeatMessage.TimeStamp.Unix() - latestPid = pid - } - } - - for pid := range heartbeatMessagesInstance.inactiveHeartbeats { - if pid == latestPid { - continue - } - - monitor.cache.Remove([]byte(pid)) - delete(heartbeatMessagesInstance.inactiveHeartbeats, pid) - } -} - func (monitor *heartbeatV2Monitor) parseMessage(pid core.PeerID, message interface{}) (*data.PubKeyHeartbeat, error) { heartbeatV2, ok := message.(*heartbeat.HeartbeatV2) if !ok { diff --git a/heartbeat/monitor/monitor_test.go b/heartbeat/monitor/monitor_test.go index 9b8ecdd8e87..424919bfdc5 100644 --- a/heartbeat/monitor/monitor_test.go +++ b/heartbeat/monitor/monitor_test.go @@ -385,7 +385,7 @@ func TestHeartbeatV2Monitor_GetHeartbeats(t *testing.T) { assert.Equal(t, 0, len(heartbeats)) assert.Equal(t, 0, args.Cache.Len()) }) - t.Run("should work", func(t *testing.T) { + t.Run("should work with 2 public keys on different pids and one public key", func(t *testing.T) { t.Parallel() args := createMockHeartbeatV2MonitorArgs() providedStatuses := []bool{true, true, true} @@ -418,7 +418,31 @@ func TestHeartbeatV2Monitor_GetHeartbeats(t *testing.T) { } checkResults(t, providedMessages[i], heartbeats[i], providedStatuses[i], providedPids, numInstances) } - assert.Equal(t, 1, len(providedPids)) // 1 inactive was removed from the heartbeat list + assert.Equal(t, 1, len(providedPids)) // 1 active was removed from the heartbeat list + }) + t.Run("should choose the 'smaller' pid if multiple active messages are found (sort should work)", func(t *testing.T) { + t.Parallel() + args := createMockHeartbeatV2MonitorArgs() + providedStatuses := []bool{true, true, true} + numOfMessages := len(providedStatuses) + providedPids := make(map[string]struct{}, numOfMessages) + providedMessages := make([]*heartbeat.HeartbeatV2, numOfMessages) + for i := numOfMessages - 1; i >= 0; i-- { + pid := core.PeerID(fmt.Sprintf("%s%d", "pid", i)) + providedPids[pid.Pretty()] = struct{}{} + + pkBytes := []byte("same pk") + providedMessages[i] = createHeartbeatMessage(providedStatuses[i], pkBytes) + + args.Cache.Put(pid.Bytes(), providedMessages[i], providedMessages[i].Size()) + } + + monitor, _ := NewHeartbeatV2Monitor(args) + assert.False(t, check.IfNil(monitor)) + + heartbeats := monitor.GetHeartbeats() + assert.Equal(t, 1, len(heartbeats)) + checkResults(t, providedMessages[0], heartbeats[0], providedStatuses[0], providedPids, 3) }) } From b5b7814359347880f5876ade3d9037052378cc15 Mon Sep 17 00:00:00 2001 From: BeniaminDrasovean Date: Mon, 24 Oct 2022 10:43:33 +0300 Subject: [PATCH 076/110] update go mod --- go.mod | 4 +- go.sum | 1759 -------------------------------------------------------- 2 files changed, 3 insertions(+), 1760 deletions(-) delete mode 100644 go.sum diff --git a/go.mod b/go.mod index 1f4bccb4caf..369989336e5 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/ElrondNetwork/elrond-go-p2p v1.0.3 github.com/ElrondNetwork/elrond-go-storage v1.0.1 github.com/ElrondNetwork/elrond-vm-common v1.3.24 - github.com/ElrondNetwork/wasm-vm v1.5.2 + github.com/ElrondNetwork/wasm-vm v1.4.59 github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.43 github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.43 github.com/beevik/ntp v0.3.0 @@ -39,3 +39,5 @@ require ( ) replace github.com/gogo/protobuf => github.com/ElrondNetwork/protobuf v1.3.2 + +replace github.com/ElrondNetwork/wasm-vm v1.4.59 => github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.63 diff --git a/go.sum b/go.sum deleted file mode 100644 index 8d22e70bd17..00000000000 --- a/go.sum +++ /dev/null @@ -1,1759 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= -dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= -dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= -git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= -github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/ElrondNetwork/big-int-util v0.1.0 h1:vTMoJ5azhVmr7jhpSD3JUjQdkdyXoEPVkOvhdw1RjV4= -github.com/ElrondNetwork/big-int-util v0.1.0/go.mod h1:96viBvoTXLjZOhEvE0D+QnAwg1IJLPAK6GVHMbC7Aw4= -github.com/ElrondNetwork/concurrent-map v0.1.3 h1:j2LtPrNJuerannC1cQDE79STvi/P04gd61sNYo04Zf0= -github.com/ElrondNetwork/concurrent-map v0.1.3/go.mod h1:3XwSwn4JHI0lrKxWLZvtp53Emr8BXYTmNQGwcukHJEE= -github.com/ElrondNetwork/covalent-indexer-go v1.0.6 h1:+LNKItUc+Pb7WuTbil3VuiLMmdQ1AY7lBJM476PtVNE= -github.com/ElrondNetwork/covalent-indexer-go v1.0.6/go.mod h1:j3h2g96vqhJAuj3aEX2PWhomae2/o7YfXGEfweNXEeQ= -github.com/ElrondNetwork/elastic-indexer-go v1.2.45 h1:Yqwe4Ysn/VVypo4/2ohS994BHr59ZLsJXioTgjKND3w= -github.com/ElrondNetwork/elastic-indexer-go v1.2.45/go.mod h1:lGTJNWWcAz5gcA6Wue435ncnI6PhXtKJ5iwSfp5//8c= -github.com/ElrondNetwork/elrond-go-core v1.0.0/go.mod h1:FQMem7fFF4+8pQ6lVsBZq6yO+smD0nV23P4bJpmPjTo= -github.com/ElrondNetwork/elrond-go-core v1.1.7/go.mod h1:O9FkkTT2H9kxCzfn40TbhoCDXzGmUrRVusMomhK/Y3g= -github.com/ElrondNetwork/elrond-go-core v1.1.13/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= -github.com/ElrondNetwork/elrond-go-core v1.1.18/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= -github.com/ElrondNetwork/elrond-go-core v1.1.19/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= -github.com/ElrondNetwork/elrond-go-core v1.1.23 h1:IJ+D/6PAFn36fjI84tyM/3rvZroiUjNGtyY2u/5CoO4= -github.com/ElrondNetwork/elrond-go-core v1.1.23/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= -github.com/ElrondNetwork/elrond-go-crypto v1.0.0/go.mod h1:DGiR7/j1xv729Xg8SsjYaUzWXL5svMd44REXjWS/gAc= -github.com/ElrondNetwork/elrond-go-crypto v1.2.1 h1:5wWCBEZp5SMFO2+Nal8UaJNJcG9G9J4PHNNZvQpEeUE= -github.com/ElrondNetwork/elrond-go-crypto v1.2.1/go.mod h1:UNmpDaJjLTKxfzUcwua2R7Mh9bicw/L3ICJt5V7zqMo= -github.com/ElrondNetwork/elrond-go-logger v1.0.4/go.mod h1:e5D+c97lKUfFdAzFX7rrI2Igl/z4Y0RkKYKWyzprTGk= -github.com/ElrondNetwork/elrond-go-logger v1.0.5/go.mod h1:cBfgx0ST/CJx8jrxJSC5aiSrvkGzcnF7sK06RD8mFxQ= -github.com/ElrondNetwork/elrond-go-logger v1.0.7/go.mod h1:cBfgx0ST/CJx8jrxJSC5aiSrvkGzcnF7sK06RD8mFxQ= -github.com/ElrondNetwork/elrond-go-logger v1.0.9 h1:RByDnVHgSN4zy3bwmvQarsnCd/gDmZ+zwVI+b6i4Plc= -github.com/ElrondNetwork/elrond-go-logger v1.0.9/go.mod h1:86lz/Y9D1sMAZiukCYxCsETLl1zuI23qj37ct3KUT6A= -github.com/ElrondNetwork/elrond-go-p2p v1.0.3 h1:IabTaHR027tbb2A5PZsqX9RotpYudOByoKiBVEIMgLw= -github.com/ElrondNetwork/elrond-go-p2p v1.0.3/go.mod h1:KPAQxqKd+h1H55S4E7vXFjpKWFzCITBG3ErrDZvsDEc= -github.com/ElrondNetwork/elrond-go-storage v1.0.1 h1:T5pmTAu97aFNbUPpqxJprBEOs+uWsTaJSbCwY9xWPRA= -github.com/ElrondNetwork/elrond-go-storage v1.0.1/go.mod h1:Dht8Vt0BJvyUrr+mDSjYo2pu2fIMZfmUa0yznPG9zGw= -github.com/ElrondNetwork/elrond-vm-common v1.1.0/go.mod h1:w3i6f8uiuRkE68Ie/gebRcLgTuHqvruJSYrFyZWuLrE= -github.com/ElrondNetwork/elrond-vm-common v1.2.9/go.mod h1:B/Y8WiqHyDd7xsjNYsaYbVMp1jQgQ+z4jTJkFvj/EWI= -github.com/ElrondNetwork/elrond-vm-common v1.3.7/go.mod h1:seROQuR7RJCoCS7mgRXVAlvjztltY1c+UroAgWr/USE= -github.com/ElrondNetwork/elrond-vm-common v1.3.24 h1:KK3Oa9mznnMhXJ0JrObO4ulka1grEKxzbxVD1+iTnAo= -github.com/ElrondNetwork/elrond-vm-common v1.3.24/go.mod h1:seROQuR7RJCoCS7mgRXVAlvjztltY1c+UroAgWr/USE= -github.com/ElrondNetwork/go-libp2p-pubsub v0.6.1-rc1 h1:Nu/uwYQg/QbfoQ0uD6GahYTwgtAkAwtzsB0HVfSP58I= -github.com/ElrondNetwork/go-libp2p-pubsub v0.6.1-rc1/go.mod h1:pJfaShe+i5aWZx8NhSkQjvOYQYLoqPztmFUlKjToOzM= -github.com/ElrondNetwork/protobuf v1.3.2 h1:qoCSYiO+8GtXBEZWEjw0WPcZfM3g7QuuJrwpN+y6Mvg= -github.com/ElrondNetwork/protobuf v1.3.2/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/ElrondNetwork/wasm-vm v1.5.2 h1:qtRoF/SnXtlkq+lqafgRBhTZ1+vrwUGTTSmXu//FceE= -github.com/ElrondNetwork/wasm-vm v1.5.2/go.mod h1:9SyUhIkrp+wWqGciIpiBLs7TanqslkO7flCw4GCWGas= -github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.43 h1:WaN3Z4hsA4XtS8821kEbLlTXXTG/EBdtD4vrgOcsfBY= -github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.43/go.mod h1:i1TIkkBwx3ss3C4balJCKQDiRpG6WOI4blhlfSf56uI= -github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.43 h1:Mo9dqzSZSbyCMvLhCxqFNigFIC7wLKPEjNVMgAQmxrw= -github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.43/go.mod h1:6m4U8OM0C6Jaa6UBilPx1OJqECoz4MfyKw0pV1eAnxs= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= -github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/beevik/ntp v0.3.0 h1:xzVrPrE4ziasFXgBVBZJDP0Wg/KpMwk2KHJ4Ba8GrDw= -github.com/beevik/ntp v0.3.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= -github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= -github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= -github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= -github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= -github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= -github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= -github.com/btcsuite/btcd v0.22.0-beta h1:LTDpDKUM5EeOFBPM8IXpinEcmZ6FWfNZbE3lfrfdnWo= -github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= -github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce h1:YtWJF7RHm2pYCvA5t0RPmAaLUhREsKuKd+SLhxFbFeQ= -github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= -github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= -github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.0.3 h1:ADZftAkglvCiD44c77s5YmMqaP2pzVCFZvBmAlBdAP4= -github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d h1:t5Wuyh53qYyg9eqn4BbnlIT+vmhyww0TatL+zT3uWgI= -github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4= -github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= -github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= -github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= -github.com/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMSRhl4D7AQ= -github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI= -github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= -github.com/dgraph-io/badger v1.6.0-rc1/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU= -github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= -github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/elastic/go-elasticsearch/v7 v7.12.0 h1:j4tvcMrZJLp39L2NYvBb7f+lHKPqPHSL3nvB8+/DV+s= -github.com/elastic/go-elasticsearch/v7 v7.12.0/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4= -github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= -github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4= -github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= -github.com/elodina/go-avro v0.0.0-20160406082632-0c8185d9a3ba h1:QkK2L3uvEaZJ40iFZbiMKz/yQF/MI2uaNO2iyV/ve6w= -github.com/elodina/go-avro v0.0.0-20160406082632-0c8185d9a3ba/go.mod h1:3A7SOsr8WBIpkWUsqzMpR3tIQbanKqxZcis2GSl12Nk= -github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= -github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= -github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= -github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= -github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/cors v0.0.0-20190301062745-f9e10995c85a h1:zBycVvXa03SIX+jdMv8wGu9TMDMWdN8EhaR1FoeKHNo= -github.com/gin-contrib/cors v0.0.0-20190301062745-f9e10995c85a/go.mod h1:pL2kNE+DgDU+eQ+dary5bX0Z6LPP8nR6Mqs1iejILw4= -github.com/gin-contrib/pprof v1.4.0 h1:XxiBSf5jWZ5i16lNOPbMTVdgHBdhfGRD5PZ1LWazzvg= -github.com/gin-contrib/pprof v1.4.0/go.mod h1:RrehPJasUVBPK6yTUwOl8/NP6i0vbUgmxtis+Z5KE90= -github.com/gin-contrib/sse v0.0.0-20170109093832-22d885f9ecc7/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.3.0/go.mod h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6mUr7Y= -github.com/gin-gonic/gin v1.7.1/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= -github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= -github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= -github.com/gizak/termui/v3 v3.1.0 h1:ZZmVDgwHl7gR7elfKf1xc4IudXZ5qqfDh4wExk4Iajc= -github.com/gizak/termui/v3 v3.1.0/go.mod h1:bXQEBkJpzxUAKf0+xq9MSWAvWZlE7c+aidmyFlkYTrY= -github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= -github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= -github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= -github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-playground/validator/v10 v10.10.0 h1:I7mrTYv78z8k8VXa/qJlOlEXn/nBh+BF8dHX5nt/dr0= -github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/goccy/go-json v0.9.7 h1:IcB+Aqpx/iMHu5Yooh7jEzJk1JZ7Pjtmys2ukPr7EeM= -github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= -github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= -github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= -github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= -github.com/google/gops v0.3.18 h1:my259V+172PVFmduS2RAsq4FKH+HjKqdh7pLr17Ot8c= -github.com/google/gops v0.3.18/go.mod h1:Pfp8hWGIFdV/7rY9/O/U5WgdjYQXf/GiEK4NVuVd2ZE= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= -github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= -github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/herumi/bls-go-binary v1.0.0 h1:PRPF6vPd35zyDy+tp86HwNnGdufCH2lZL0wZGxYvkRs= -github.com/herumi/bls-go-binary v1.0.0/go.mod h1:O4Vp1AfR4raRGwFeQpr9X/PQtncEicMoOe6BQt1oX0Y= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= -github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= -github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= -github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= -github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= -github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= -github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M= -github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= -github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-cid v0.1.0 h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0= -github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= -github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= -github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs= -github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= -github.com/ipfs/go-datastore v0.5.1 h1:WkRhLuISI+XPD0uk3OskB0fYFSyqK8Ob5ZYew9Qa1nQ= -github.com/ipfs/go-datastore v0.5.1/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= -github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= -github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= -github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= -github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaHzfGTzuE3s= -github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk= -github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= -github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= -github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= -github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= -github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= -github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8= -github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= -github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= -github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= -github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= -github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= -github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= -github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= -github.com/ipfs/go-ipns v0.1.2 h1:O/s/0ht+4Jl9+VoxoUo0zaHjnZUS+aBQIKTuzdZ/ucI= -github.com/ipfs/go-ipns v0.1.2/go.mod h1:ioQ0j02o6jdIVW+bmi18f4k2gRf0AV3kZ9KeHYHICnQ= -github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= -github.com/ipfs/go-log v1.0.2/go.mod h1:1MNjMxe0u6xvJZgeqbJ8vdo2TKaGwZ1a0Bpza+sr2Sk= -github.com/ipfs/go-log v1.0.3/go.mod h1:OsLySYkwIbiSUR/yBTdv1qPtcE4FW3WPWk/ewz9Ru+A= -github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs= -github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= -github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= -github.com/ipfs/go-log/v2 v2.0.2/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= -github.com/ipfs/go-log/v2 v2.0.3/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= -github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= -github.com/ipfs/go-log/v2 v2.1.1/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= -github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= -github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= -github.com/ipfs/go-log/v2 v2.5.0/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= -github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= -github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= -github.com/ipld/go-ipld-prime v0.9.0 h1:N2OjJMb+fhyFPwPnVvJcWU/NsumP8etal+d2v3G4eww= -github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= -github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= -github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= -github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= -github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= -github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= -github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= -github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= -github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= -github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= -github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= -github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0= -github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19/go.mod h1:hY+WOq6m2FpbvyrI93sMaypsttvaIL5nhVR92dTMUcQ= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.1 h1:y9FcTHGyrebwfP0ZZqFiaxTaiDnUrGkJkI+f583BL1A= -github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.12 h1:p9dKCg8i4gmOxtv35DvrYoWqYzQrvEVdjQ762Y0OqZE= -github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= -github.com/koron/go-ssdp v0.0.2 h1:fL3wAoyT6hXHQlORyXUW4Q23kkQpJRgEAYcZB5BR71o= -github.com/koron/go-ssdp v0.0.2/go.mod h1:XoLfkAiA2KeZsYh4DbHxD7h3nR2AZNqVQOa+LJuqPYs= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= -github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= -github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= -github.com/libp2p/go-addr-util v0.1.0/go.mod h1:6I3ZYuFr2O/9D+SoyM0zEw0EF3YkldtTX406BpdQMqw= -github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= -github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= -github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= -github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= -github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= -github.com/libp2p/go-conn-security-multistream v0.2.0/go.mod h1:hZN4MjlNetKD3Rq5Jb/P5ohUnFLNzEAR4DLSzpn2QLU= -github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6NhaTpFhJZrjSYuNmhpT2r25zYR70= -github.com/libp2p/go-conn-security-multistream v0.3.0 h1:9UCIKlBL1hC9u7nkMXpD1nkc/T53PKMAn3/k9ivBAVc= -github.com/libp2p/go-conn-security-multistream v0.3.0/go.mod h1:EEP47t4fw/bTelVmEzIDqSe69hO/ip52xBEhZMLWAHM= -github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= -github.com/libp2p/go-eventbus v0.2.1 h1:VanAdErQnpTioN2TowqNcOijf6YwhuODe4pPKSDpxGc= -github.com/libp2p/go-eventbus v0.2.1/go.mod h1:jc2S4SoEVPP48H9Wpzm5aiGwUCBMfGhVhhBjyhhCJs8= -github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-flow-metrics v0.0.2/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= -github.com/libp2p/go-flow-metrics v0.0.3 h1:8tAs/hSdNvUiLgtlSy3mxwxWP4I9y/jlkPFT7epKdeM= -github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= -github.com/libp2p/go-libp2p v0.6.1/go.mod h1:CTFnWXogryAHjXAKEbOf1OWY+VeAP3lDMZkfEI5sT54= -github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xSU1ivxn0k= -github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw= -github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= -github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= -github.com/libp2p/go-libp2p v0.19.3 h1:LqjvuBWdyYSqvkH4VVYxA78Fkphzg2Pq86VMnilqgkw= -github.com/libp2p/go-libp2p v0.19.3/go.mod h1:AGlPVLjh0+6jvEtf+a2gZEux7yHJrYXnG9IC7wcQ2NY= -github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= -github.com/libp2p/go-libp2p-asn-util v0.1.0 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= -github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= -github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE= -github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQdNbfzE1C718tcViI= -github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI= -github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= -github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= -github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= -github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= -github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ= -github.com/libp2p/go-libp2p-blankhost v0.3.0 h1:kTnLArltMabZlzY63pgGDA4kkUcLkBFSM98zBssn/IY= -github.com/libp2p/go-libp2p-blankhost v0.3.0/go.mod h1:urPC+7U01nCGgJ3ZsV8jdwTp6Ji9ID0dMTvq+aJ+nZU= -github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= -github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= -github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= -github.com/libp2p/go-libp2p-circuit v0.6.0 h1:rw/HlhmUB3OktS/Ygz6+2XABOmHKzZpPUuMNUMosj8w= -github.com/libp2p/go-libp2p-circuit v0.6.0/go.mod h1:kB8hY+zCpMeScyvFrKrGicRdid6vNXbunKE4rXATZ0M= -github.com/libp2p/go-libp2p-connmgr v0.2.4 h1:TMS0vc0TCBomtQJyWr7fYxcVYYhx+q/2gF++G5Jkl/w= -github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= -github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= -github.com/libp2p/go-libp2p-core v0.0.4/go.mod h1:jyuCQP356gzfCFtRKyvAbNkyeuxb7OlyhWZ3nls5d2I= -github.com/libp2p/go-libp2p-core v0.2.0/go.mod h1:X0eyB0Gy93v0DZtSYbEM7RnMChm9Uv3j7yRXjO77xSI= -github.com/libp2p/go-libp2p-core v0.2.2/go.mod h1:8fcwTbsG2B+lTgRJ1ICZtiM5GWCWZVoVrLaDRvIRng0= -github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g= -github.com/libp2p/go-libp2p-core v0.2.5/go.mod h1:6+5zJmKhsf7yHn1RbmYDu08qDUpIUxGdqHuEZckmZOA= -github.com/libp2p/go-libp2p-core v0.3.0/go.mod h1:ACp3DmS3/N64c2jDzcV429ukDpicbL6+TrrxANBjPGw= -github.com/libp2p/go-libp2p-core v0.3.1/go.mod h1:thvWy0hvaSBhnVBaW37BvzgVV68OUhgJJLAa6almrII= -github.com/libp2p/go-libp2p-core v0.4.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0= -github.com/libp2p/go-libp2p-core v0.5.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0= -github.com/libp2p/go-libp2p-core v0.5.1/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= -github.com/libp2p/go-libp2p-core v0.5.3/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= -github.com/libp2p/go-libp2p-core v0.5.4/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= -github.com/libp2p/go-libp2p-core v0.5.5/go.mod h1:vj3awlOr9+GMZJFH9s4mpt9RHHgGqeHCopzbYKZdRjM= -github.com/libp2p/go-libp2p-core v0.5.6/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= -github.com/libp2p/go-libp2p-core v0.5.7/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= -github.com/libp2p/go-libp2p-core v0.6.0/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= -github.com/libp2p/go-libp2p-core v0.6.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-core v0.7.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-core v0.8.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-core v0.8.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-core v0.8.2/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-core v0.8.6/go.mod h1:dgHr0l0hIKfWpGpqAMbpo19pen9wJfdCGv51mTmdpmM= -github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= -github.com/libp2p/go-libp2p-core v0.11.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= -github.com/libp2p/go-libp2p-core v0.12.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= -github.com/libp2p/go-libp2p-core v0.14.0/go.mod h1:tLasfcVdTXnixsLB0QYaT1syJOhsbrhG7q6pGrHtBg8= -github.com/libp2p/go-libp2p-core v0.15.1 h1:0RY+Mi/ARK9DgG1g9xVQLb8dDaaU8tCePMtGALEfBnM= -github.com/libp2p/go-libp2p-core v0.15.1/go.mod h1:agSaboYM4hzB1cWekgVReqV5M4g5M+2eNNejV+1EEhs= -github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= -github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfxg97AEdo4GYBt6BadWg= -github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw= -github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= -github.com/libp2p/go-libp2p-discovery v0.6.0 h1:1XdPmhMJr8Tmj/yUfkJMIi8mgwWrLUsCB3bMxdT+DSo= -github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= -github.com/libp2p/go-libp2p-kad-dht v0.15.0 h1:Ke+Oj78gX5UDXnA6HBdrgvi+fStJxgYTDa51U0TsCLo= -github.com/libp2p/go-libp2p-kad-dht v0.15.0/go.mod h1:rZtPxYu1TnHHz6n1RggdGrxUX/tA1C2/Wiw3ZMUDrU0= -github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio= -github.com/libp2p/go-libp2p-kbucket v0.4.7 h1:spZAcgxifvFZHBD8tErvppbnNiKA5uokDu3CV7axu70= -github.com/libp2p/go-libp2p-kbucket v0.4.7/go.mod h1:XyVo99AfQH0foSf176k4jY1xUJ2+jUJIZCSDm7r2YKk= -github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= -github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= -github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= -github.com/libp2p/go-libp2p-mplex v0.2.2/go.mod h1:74S9eum0tVQdAfFiKxAyKzNdSuLqw5oadDq7+L/FELo= -github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxWDkm+dVvjfuG3ek= -github.com/libp2p/go-libp2p-mplex v0.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= -github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= -github.com/libp2p/go-libp2p-mplex v0.5.0 h1:vt3k4E4HSND9XH4Z8rUpacPJFSAgLOv6HDvG8W9Ks9E= -github.com/libp2p/go-libp2p-mplex v0.5.0/go.mod h1:eLImPJLkj3iG5t5lq68w3Vm5NAQ5BcKwrrb2VmOYb3M= -github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE= -github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw= -github.com/libp2p/go-libp2p-nat v0.1.0 h1:vigUi2MEN+fwghe5ijpScxtbbDz+L/6y8XwlzYOJgSY= -github.com/libp2p/go-libp2p-nat v0.1.0/go.mod h1:DQzAG+QbDYjN1/C3B6vXucLtz3u9rEonLVPtZVzQqks= -github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= -github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= -github.com/libp2p/go-libp2p-noise v0.4.0 h1:khcMsGhHNdGqKE5LDLrnHwZvdGVMsrnD4GTkTWkwmLU= -github.com/libp2p/go-libp2p-noise v0.4.0/go.mod h1:BzzY5pyzCYSyJbQy9oD8z5oP2idsafjt4/X42h9DjZU= -github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= -github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= -github.com/libp2p/go-libp2p-peerstore v0.1.3/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI= -github.com/libp2p/go-libp2p-peerstore v0.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVdLxvqh7hXOujessqdzs= -github.com/libp2p/go-libp2p-peerstore v0.2.0/go.mod h1:N2l3eVIeAitSg3Pi2ipSrJYnqhVnMNQZo9nkSCuAbnQ= -github.com/libp2p/go-libp2p-peerstore v0.2.1/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= -github.com/libp2p/go-libp2p-peerstore v0.2.2/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= -github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= -github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= -github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= -github.com/libp2p/go-libp2p-peerstore v0.4.0/go.mod h1:rDJUFyzEWPpXpEwywkcTYYzDHlwza8riYMaUzaN6hX0= -github.com/libp2p/go-libp2p-peerstore v0.6.0 h1:HJminhQSGISBIRb93N6WK3t6Fa8OOTnHd/VBjL4mY5A= -github.com/libp2p/go-libp2p-peerstore v0.6.0/go.mod h1:DGEmKdXrcYpK9Jha3sS7MhqYdInxJy84bIPtSu65bKc= -github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= -github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= -github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= -github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= -github.com/libp2p/go-libp2p-quic-transport v0.13.0/go.mod h1:39/ZWJ1TW/jx1iFkKzzUg00W6tDJh73FC0xYudjr7Hc= -github.com/libp2p/go-libp2p-quic-transport v0.16.0/go.mod h1:1BXjVMzr+w7EkPfiHkKnwsWjPjtfaNT0q8RS3tGDvEQ= -github.com/libp2p/go-libp2p-quic-transport v0.17.0 h1:yFh4Gf5MlToAYLuw/dRvuzYd1EnE2pX3Lq1N6KDiWRQ= -github.com/libp2p/go-libp2p-quic-transport v0.17.0/go.mod h1:x4pw61P3/GRCcSLypcQJE/Q2+E9f4X+5aRcZLXf20LM= -github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGdsU/9W//C8dqjQDk= -github.com/libp2p/go-libp2p-record v0.1.3 h1:R27hoScIhQf/A8XJZ8lYpnqh9LatJ5YbHs28kCIfql0= -github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ6EMg7+/vv2+9pY4= -github.com/libp2p/go-libp2p-resource-manager v0.2.1 h1:/0yqQQ4oT+3fEhUGGP2PhuIhdv10+pu5jLhvFNfUx/w= -github.com/libp2p/go-libp2p-resource-manager v0.2.1/go.mod h1:K+eCkiapf+ey/LADO4TaMpMTP9/Qde/uLlrnRqV4PLQ= -github.com/libp2p/go-libp2p-routing-helpers v0.2.3/go.mod h1:795bh+9YeoFl99rMASoiVgHdi5bjack0N1+AFAdbvBw= -github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= -github.com/libp2p/go-libp2p-secio v0.2.0/go.mod h1:2JdZepB8J5V9mBp79BmwsaPQhRPNN2NrnB2lKQcdy6g= -github.com/libp2p/go-libp2p-secio v0.2.1/go.mod h1:cWtZpILJqkqrSkiYcDBh5lA3wbT2Q+hz3rJQq3iftD8= -github.com/libp2p/go-libp2p-secio v0.2.2/go.mod h1:wP3bS+m5AUnFA+OFO7Er03uO1mncHG0uVwGrwvjYlNY= -github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= -github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU= -github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM= -github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM= -github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= -github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= -github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= -github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= -github.com/libp2p/go-libp2p-swarm v0.10.0/go.mod h1:71ceMcV6Rg/0rIQ97rsZWMzto1l9LnNquef+efcRbmA= -github.com/libp2p/go-libp2p-swarm v0.10.2 h1:UaXf+CTq6Ns1N2V1EgqJ9Q3xaRsiN7ImVlDMpirMAWw= -github.com/libp2p/go-libp2p-swarm v0.10.2/go.mod h1:Pdkq0QU5a+qu+oyqIV3bknMsnzk9lnNyKvB9acJ5aZs= -github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= -github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= -github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= -github.com/libp2p/go-libp2p-testing v0.1.0/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0= -github.com/libp2p/go-libp2p-testing v0.1.1/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0= -github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8/go.mod h1:Qy8sAncLKpwXtS2dSnDOP8ktexIAHKu+J+pnZOFZLTc= -github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehtsBXMrXnCfJIgDti5g= -github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= -github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= -github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= -github.com/libp2p/go-libp2p-testing v0.7.0/go.mod h1:OLbdn9DbgdMwv00v+tlp1l3oe2Cl+FAjoWIA2pa0X6E= -github.com/libp2p/go-libp2p-testing v0.9.0/go.mod h1:Td7kbdkWqYTJYQGTwzlgXwaqldraIanyjuRiAbK/XQU= -github.com/libp2p/go-libp2p-testing v0.9.2 h1:dCpODRtRaDZKF8HXT9qqqgON+OMEB423Knrgeod8j84= -github.com/libp2p/go-libp2p-testing v0.9.2/go.mod h1:Td7kbdkWqYTJYQGTwzlgXwaqldraIanyjuRiAbK/XQU= -github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= -github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= -github.com/libp2p/go-libp2p-tls v0.4.1 h1:1ByJUbyoMXvYXDoW6lLsMxqMViQNXmt+CfQqlnCpY+M= -github.com/libp2p/go-libp2p-tls v0.4.1/go.mod h1:EKCixHEysLNDlLUoKxv+3f/Lp90O2EXNjTr0UQDnrIw= -github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= -github.com/libp2p/go-libp2p-transport-upgrader v0.2.0/go.mod h1:mQcrHj4asu6ArfSoMuyojOdjx73Q47cYD7s5+gZOlns= -github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D1dwydnTmKRPXiAR/fyvi1dXuL4o= -github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIWIU62Agt/J18ekORFU/j1i2y8zvk= -github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= -github.com/libp2p/go-libp2p-transport-upgrader v0.5.0/go.mod h1:Rc+XODlB3yce7dvFV4q/RmyJGsFcCZRkeZMu/Zdg0mo= -github.com/libp2p/go-libp2p-transport-upgrader v0.7.0/go.mod h1:GIR2aTRp1J5yjVlkUoFqMkdobfob6RnAwYg/RZPhrzg= -github.com/libp2p/go-libp2p-transport-upgrader v0.7.1 h1:MSMe+tUfxpC9GArTz7a4G5zQKQgGh00Vio87d3j3xIg= -github.com/libp2p/go-libp2p-transport-upgrader v0.7.1/go.mod h1:GIR2aTRp1J5yjVlkUoFqMkdobfob6RnAwYg/RZPhrzg= -github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= -github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= -github.com/libp2p/go-libp2p-yamux v0.2.2/go.mod h1:lIohaR0pT6mOt0AZ0L2dFze9hds9Req3OfS+B+dv4qw= -github.com/libp2p/go-libp2p-yamux v0.2.5/go.mod h1:Zpgj6arbyQrmZ3wxSZxfBmbdnWtbZ48OpsfmQVTErwA= -github.com/libp2p/go-libp2p-yamux v0.2.7/go.mod h1:X28ENrBMU/nm4I3Nx4sZ4dgjZ6VhLEn0XhIoZ5viCwU= -github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2EzI2h7HbFm9eAKI4= -github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelNoy5nm3tZ3/Zw30= -github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= -github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= -github.com/libp2p/go-libp2p-yamux v0.8.0/go.mod h1:yTkPgN2ib8FHyU1ZcVD7aelzyAqXXwEPbyx+aSKm9h8= -github.com/libp2p/go-libp2p-yamux v0.8.1/go.mod h1:rUozF8Jah2dL9LLGyBaBeTQeARdwhefMCTQVQt6QobE= -github.com/libp2p/go-libp2p-yamux v0.9.1 h1:oplewiRix8s45SOrI30rCPZG5mM087YZp+VYhXAh4+c= -github.com/libp2p/go-libp2p-yamux v0.9.1/go.mod h1:wRc6wvyxQINFcKe7daL4BeQ02Iyp+wxyC8WCNfngBrA= -github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= -github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= -github.com/libp2p/go-maddr-filter v0.1.0/go.mod h1:VzZhTXkMucEGGEOSKddrwGiOv0tUhgnKqNEmIAz/bPU= -github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= -github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= -github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= -github.com/libp2p/go-mplex v0.1.2/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= -github.com/libp2p/go-mplex v0.2.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= -github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= -github.com/libp2p/go-mplex v0.4.0 h1:Ukkez9/4EOX5rTw4sHefNJp10dksftAA05ZgyjplUbM= -github.com/libp2p/go-mplex v0.4.0/go.mod h1:y26Lx+wNVtMYMaPu300Cbot5LkEZ4tJaNYeHeT9dh6E= -github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= -github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= -github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= -github.com/libp2p/go-msgio v0.2.0 h1:W6shmB+FeynDrUVl2dgFQvzfBZcXiyqY4VmpQLu9FqU= -github.com/libp2p/go-msgio v0.2.0/go.mod h1:dBVM1gW3Jk9XqHkU4eKdGvVHdLa51hoGfll6jMJMSlY= -github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo= -github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU= -github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= -github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= -github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= -github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= -github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= -github.com/libp2p/go-netroute v0.1.6/go.mod h1:AqhkMh0VuWmfgtxKPp3Oc1LdU5QSWS7wl0QLhSZqXxQ= -github.com/libp2p/go-netroute v0.2.0 h1:0FpsbsvuSnAhXFnCY0VLFbJOzaK0VnP0r1QT/o4nWRE= -github.com/libp2p/go-netroute v0.2.0/go.mod h1:Vio7LTzZ+6hoT4CMZi5/6CpY3Snzh2vgZhWgxMNwlQI= -github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0= -github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGNsw= -github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport v0.0.2/go.mod h1:SPD+5RwGC7rcnzngoYC86GjPzjSywuQyMVAheVBD9nQ= -github.com/libp2p/go-reuseport v0.1.0 h1:0ooKOx2iwyIkf339WCZ2HN3ujTDbkK0PjC7JVoP1AiM= -github.com/libp2p/go-reuseport v0.1.0/go.mod h1:bQVn9hmfcTaoo0c9v5pBhOarsU1eNOBZdaAd2hzXRKU= -github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= -github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= -github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw= -github.com/libp2p/go-reuseport-transport v0.0.5/go.mod h1:TC62hhPc8qs5c/RoXDZG6YmjK+/YWUPC0yYmeUecbjc= -github.com/libp2p/go-reuseport-transport v0.1.0 h1:C3PHeHjmnz8m6f0uydObj02tMEoi7CyD1zuN7xQT8gc= -github.com/libp2p/go-reuseport-transport v0.1.0/go.mod h1:vev0C0uMkzriDY59yFHD9v+ujJvYmDQVLowvAjEOmfw= -github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= -github.com/libp2p/go-sockaddr v0.1.0/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= -github.com/libp2p/go-sockaddr v0.1.1/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= -github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= -github.com/libp2p/go-stream-muxer-multistream v0.3.0/go.mod h1:yDh8abSIzmZtqtOt64gFJUXEryejzNb0lisTt+fAMJA= -github.com/libp2p/go-stream-muxer-multistream v0.4.0 h1:HsM/9OdtqnIzjVXcxTXjmqKrj3gJ8kacaOJwJS1ipaY= -github.com/libp2p/go-stream-muxer-multistream v0.4.0/go.mod h1:nb+dGViZleRP4XcyHuZSVrJCBl55nRBOMmiSL/dyziw= -github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= -github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= -github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcroCGYw28kh94oLe0= -github.com/libp2p/go-tcp-transport v0.2.4/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= -github.com/libp2p/go-tcp-transport v0.2.7/go.mod h1:lue9p1b3VmZj1MhhEGB/etmvF/nBQ0X9CW2DutBT3MM= -github.com/libp2p/go-tcp-transport v0.4.0/go.mod h1:0y52Rwrn4076xdJYu/51/qJIdxz+EWDAOG2S45sV3VI= -github.com/libp2p/go-tcp-transport v0.5.0/go.mod h1:UPPL0DIjQqiWRwVAb+CEQlaAG0rp/mCqJfIhFcLHc4Y= -github.com/libp2p/go-tcp-transport v0.5.1 h1:edOOs688VLZAozWC7Kj5/6HHXKNwi9M6wgRmmLa8M6Q= -github.com/libp2p/go-tcp-transport v0.5.1/go.mod h1:UPPL0DIjQqiWRwVAb+CEQlaAG0rp/mCqJfIhFcLHc4Y= -github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzlHoKzu0yY9p/klM= -github.com/libp2p/go-ws-transport v0.3.0/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= -github.com/libp2p/go-ws-transport v0.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA= -github.com/libp2p/go-ws-transport v0.6.0 h1:326XBL6Q+5CQ2KtjXz32+eGu02W/Kz2+Fm4SpXdr0q4= -github.com/libp2p/go-ws-transport v0.6.0/go.mod h1:dXqtI9e2JV9FtF1NOtWVZSKXh5zXvnuwPXfj8GPBbYU= -github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.0/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= -github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= -github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI= -github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= -github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= -github.com/libp2p/go-yamux/v3 v3.0.1/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= -github.com/libp2p/go-yamux/v3 v3.0.2/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= -github.com/libp2p/go-yamux/v3 v3.1.1 h1:X0qSVodCZciOu/f4KTp9V+O0LAqcqP2tdaUGB0+0lng= -github.com/libp2p/go-yamux/v3 v3.1.1/go.mod h1:jeLEQgLXqE2YqX1ilAClIfCMDY+0uXQUKmmb/qp0gT4= -github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= -github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= -github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= -github.com/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0T3FQhz/uyOUS38Q= -github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= -github.com/lucas-clemente/quic-go v0.25.0/go.mod h1:YtzP8bxRVCBlO77yRanE264+fY/T2U9ZlW1AaHOsMOg= -github.com/lucas-clemente/quic-go v0.27.0/go.mod h1:AzgQoPda7N+3IqMMMkywBKggIFo2KT6pfnlrQ2QieeI= -github.com/lucas-clemente/quic-go v0.27.1 h1:sOw+4kFSVrdWOYmUjufQ9GBVPqZ+tu+jMtXxXNmRJyk= -github.com/lucas-clemente/quic-go v0.27.1/go.mod h1:AzgQoPda7N+3IqMMMkywBKggIFo2KT6pfnlrQ2QieeI= -github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= -github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= -github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= -github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= -github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= -github.com/marten-seemann/qtls-go1-15 v0.1.5/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= -github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= -github.com/marten-seemann/qtls-go1-16 v0.1.5 h1:o9JrYPPco/Nukd/HpOHMHZoBDXQqoNtUCmny98/1uqQ= -github.com/marten-seemann/qtls-go1-16 v0.1.5/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= -github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= -github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= -github.com/marten-seemann/qtls-go1-17 v0.1.1 h1:DQjHPq+aOzUeh9/lixAGunn6rIOQyWChPSI4+hgW7jc= -github.com/marten-seemann/qtls-go1-17 v0.1.1/go.mod h1:C2ekUKcDdz9SDWxec1N/MvcXBpaX9l3Nx67XaR84L5s= -github.com/marten-seemann/qtls-go1-18 v0.1.0-beta.1/go.mod h1:PUhIQk19LoFt2174H4+an8TYvWOGjb/hHwphBeaDHwI= -github.com/marten-seemann/qtls-go1-18 v0.1.1 h1:qp7p7XXUFL7fpBvSS1sWD+uSqPvzNQK43DH+/qEkj0Y= -github.com/marten-seemann/qtls-go1-18 v0.1.1/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4= -github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= -github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-runewidth v0.0.2 h1:UnlwIPBGaTZfPQ6T1IGzPI0EkYAQmT9fAEJ/poFC63o= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= -github.com/miekg/dns v1.1.48 h1:Ucfr7IIVyMBz4lRE8qmGUuZ4Wt3/ZGu9hmcMT3Uu4tQ= -github.com/miekg/dns v1.1.48/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= -github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= -github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= -github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= -github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU= -github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc= -github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= -github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= -github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= -github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= -github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= -github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-base32 v0.0.4 h1:+qMh4a2f37b4xTNs6mqitDinryCI+tfO2dRVMN9mjSE= -github.com/multiformats/go-base32 v0.0.4/go.mod h1:jNLFzjPZtp3aIARHbJRZIaPuspdH0J6q39uUM5pnABM= -github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= -github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= -github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.1.0/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= -github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= -github.com/multiformats/go-multiaddr v0.2.1/go.mod h1:s/Apk6IyxfvMjDafnhJgJ3/46z7tZ04iMk5wP4QMGGE= -github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u0xW5UouOmQQrn6a3Y= -github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4fJxp6ggJGteB8HQTI= -github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc= -github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= -github.com/multiformats/go-multiaddr v0.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/oCXAT8Z4mzFpyoPyRc= -github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM= -github.com/multiformats/go-multiaddr v0.5.0 h1:i/JuOoVg4szYQ4YEzDGtb2h0o8M7CG/Yq6cGlcjWZpM= -github.com/multiformats/go-multiaddr v0.5.0/go.mod h1:3KAxNkUqLTJ20AAwN4XVX4kZar+bR+gh4zgbfr3SNug= -github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0= -github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= -github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= -github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= -github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= -github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= -github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= -github.com/multiformats/go-multiaddr-net v0.1.0/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ= -github.com/multiformats/go-multiaddr-net v0.1.1/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ= -github.com/multiformats/go-multiaddr-net v0.1.2/go.mod h1:QsWt3XK/3hwvNxZJp92iMQKME1qHfpYmyIjFVsSOY6Y= -github.com/multiformats/go-multiaddr-net v0.1.3/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= -github.com/multiformats/go-multiaddr-net v0.1.4/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= -github.com/multiformats/go-multiaddr-net v0.1.5/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= -github.com/multiformats/go-multiaddr-net v0.2.0/go.mod h1:gGdH3UXny6U3cKKYCvpXI5rnK7YaOIEOPVDI9tsJbEA= -github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= -github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= -github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= -github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= -github.com/multiformats/go-multicodec v0.4.1 h1:BSJbf+zpghcZMZrwTYBGwy0CPcVZGWiC72Cp8bBd4R4= -github.com/multiformats/go-multicodec v0.4.1/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= -github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= -github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= -github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= -github.com/multiformats/go-multihash v0.0.9/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= -github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= -github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= -github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= -github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= -github.com/multiformats/go-multihash v0.1.0 h1:CgAgwqk3//SVEw3T+6DqI4mWMyRuDwZtOWcJT0q9+EA= -github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= -github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= -github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9JFk2/9UktWZAF54Du38= -github.com/multiformats/go-multistream v0.2.1/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= -github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= -github.com/multiformats/go-multistream v0.3.0 h1:yX1v4IWseLPmr0rmnDo148wWJbNx40JxBZGmQb5fUP4= -github.com/multiformats/go-multistream v0.3.0/go.mod h1:ODRoqamLUsETKS9BNcII4gcRsJBU5VAwRIv7O39cEXg= -github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/multiformats/go-varint v0.0.2/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= -github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= -github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= -github.com/nsf/termbox-go v0.0.0-20190121233118-02980233997d h1:x3S6kxmy49zXVVyhcnrFqxvNVCBPb2KZ9hV2RBdS840= -github.com/nsf/termbox-go v0.0.0-20190121233118-02980233997d/go.mod h1:IuKpRQcYE1Tfu+oAQqaLisqDeXgjyyltCfsaoYN18NQ= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= -github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= -github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= -github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU= -github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= -github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1 h1:CskT+S6Ay54OwxBGB0R3Rsx4Muto6UnEYTyKJbyRIAI= -github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= -github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.33.0 h1:rHgav/0a6+uYgGdNt3jwz8FNSesO/Hsang3O0T9A5SE= -github.com/prometheus/common v0.33.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= -github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= -github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmOeY0= -github.com/raulk/go-watchdog v1.2.0 h1:konN75pw2BMmZ+AfuAm5rtFsWcJpKF3m02rKituuXNo= -github.com/raulk/go-watchdog v1.2.0/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6RcA1i4mlqI= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc= -github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= -github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/gopsutil/v3 v3.21.2/go.mod h1:ghfMypLDrFSWN2c9cDYFLHyynQ+QUht0cv/18ZqVczw= -github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= -github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= -github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= -github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw= -github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI= -github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= -github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= -github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg= -github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw= -github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y= -github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= -github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= -github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ= -github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I= -github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0= -github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= -github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= -github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= -github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= -github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= -github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= -github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= -github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc= -github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -github.com/syndtr/goleveldb v1.0.1-0.20190318030020-c3a204f8e965 h1:1oFLiOyVl+W7bnBzGhf7BbIv9loSFQcieWWYIjLqcAw= -github.com/syndtr/goleveldb v1.0.1-0.20190318030020-c3a204f8e965/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA= -github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= -github.com/tidwall/gjson v1.14.0 h1:6aeJ0bzojgWLa82gDQHcx3S0Lr/O51I9bJ5nv6JFx5w= -github.com/tidwall/gjson v1.14.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tklauser/go-sysconf v0.3.4 h1:HT8SVixZd3IzLdfs/xlpq0jeSfTX57g1v6wB1EuzV7M= -github.com/tklauser/go-sysconf v0.3.4/go.mod h1:Cl2c8ZRWfHD5IrfHo9VN+FX9kCFjIOyVklgXycLB6ek= -github.com/tklauser/numcpus v0.2.1 h1:ct88eFm+Q7m2ZfXJdan1xYoXKlmwsfP+k88q05KvlZc= -github.com/tklauser/numcpus v0.2.1/go.mod h1:9aU+wOc6WjUIZEwWMP62PL/41d65P+iks1gBkr4QyP8= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo= -github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v0.0.0-20181209151446-772ced7fd4c2/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= -github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.10 h1:p8Fspmz3iTctJstry1PYS3HVdllxnEzTEsgIgtxTrCk= -github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= -github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= -github.com/wangjia184/sortedset v0.0.0-20160527075905-f5d03557ba30/go.mod h1:YkocrP2K2tcw938x9gCOmT5G5eCD6jsTz0SZuyAqwIE= -github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a h1:G++j5e0OC488te356JvdhaM8YS6nMsjLAYF7JxCv07w= -github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= -github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k= -github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= -github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= -github.com/whyrusleeping/go-logging v0.0.1/go.mod h1:lDPYj54zutzG1XYfHAhcc7oNXEburHQBn+Iqd4yS4vE= -github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= -github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= -github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= -github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= -github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow= -github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= -github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v1.0.0/go.mod h1:IoImgRak9i3zJyuxOKUP1v4UZd1tMoKkq/Cimt1uhCg= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= -github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= -go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= -golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220418201149-a630d4f3e7a2 h1:6mzvA99KwZxbOrxww4EvWVQUnN1+xEu9tafK5ZxkYeA= -golang.org/x/net v0.0.0-20220418201149-a630d4f3e7a2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190526052359-791d8a0f4d09/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191206220618-eeba5f6aabab/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210217105451-b926d437f341/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210317225723-c4fcb01b228e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181130052023-1c3d964395ce/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= -google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.28.1/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.45.0 h1:NEpgUqV3Z+ZjkqMsxMg11IaDrXY4RY6CQukSGK0uI1M= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2 h1:lFB4DoMU6B626w8ny76MV7VX6W2VHct2GVOI3xgiMrQ= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8= -gopkg.in/src-d/go-log.v1 v1.0.1/go.mod h1:GN34hKP0g305ysm2/hctJ0Y8nWP3zxXXJ8GFabTyABE= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= -lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= -lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/goversion v1.2.0/go.mod h1:Eih9y/uIBS3ulggl7KNJ09xGSLcuNaLgmvvqa07sgfo= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= -sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= -sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= From 842442000a95fac845b22f6267e0e4cf8013561c Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 24 Oct 2022 15:38:11 +0300 Subject: [PATCH 077/110] added new persistent metric erd_num_snapshot_nodes --- api/groups/networkGroup.go | 4 +- api/groups/networkGroup_test.go | 23 +++++------ api/groups/nodeGroup.go | 4 +- api/groups/nodeGroup_test.go | 13 +++--- api/mock/facadeStub.go | 6 +-- api/shared/interface.go | 4 +- cmd/node/factory/interface.go | 4 +- cmd/node/factory/structsStatusHandlers.go | 5 +-- common/constants.go | 3 ++ common/interface.go | 2 +- facade/initial/initialNodeFacade.go | 6 +-- facade/interface.go | 4 +- facade/mock/apiResolverStub.go | 6 +-- facade/nodeFacade.go | 4 +- facade/nodeFacade_test.go | 4 +- integrationTests/interface.go | 4 +- .../startInEpoch/startInEpoch_test.go | 1 + node/external/interface.go | 13 ------ node/external/nodeApiResolver.go | 7 ++-- node/metrics/metrics.go | 1 + node/metrics/metrics_test.go | 1 + .../metricsLoader/loadPersistentMetrics.go | 1 + state/accountsDB.go | 16 ++++++-- state/accountsDB_test.go | 2 +- state/peerAccountsDB.go | 5 ++- state/snapshotStatistics.go | 16 ++++++-- state/snapshotStatistics_test.go | 6 ++- statusHandler/interface.go | 14 +++++++ statusHandler/persister/persistentHandler.go | 3 +- .../statusHandler/statusHandlersUtilsMock.go | 6 +-- testscommon/statusMetricsStub.go | 41 +++++++++++++++---- .../disabled/trieStatisticsCollector.go | 19 +++++++++ trie/statistics/trieStatisticsCollector.go | 37 ++++++++++------- .../trieStatisticsCollector_test.go | 5 ++- .../accountDBSyncerContainerFactory.go | 23 ++++++----- 35 files changed, 200 insertions(+), 113 deletions(-) create mode 100644 statusHandler/interface.go create mode 100644 trie/statistics/disabled/trieStatisticsCollector.go diff --git a/api/groups/networkGroup.go b/api/groups/networkGroup.go index 8b64e90f558..888c56a2f32 100644 --- a/api/groups/networkGroup.go +++ b/api/groups/networkGroup.go @@ -13,7 +13,7 @@ import ( "github.com/ElrondNetwork/elrond-go/api/shared" "github.com/ElrondNetwork/elrond-go/api/shared/logging" "github.com/ElrondNetwork/elrond-go/common" - "github.com/ElrondNetwork/elrond-go/node/external" + "github.com/ElrondNetwork/elrond-go/statusHandler" "github.com/gin-gonic/gin" ) @@ -40,7 +40,7 @@ type networkFacadeHandler interface { GetTotalStakedValue() (*api.StakeValues, error) GetDirectStakedList() ([]*api.DirectStakedValue, error) GetDelegatorsList() ([]*api.Delegator, error) - StatusMetrics() external.StatusMetricsHandler + StatusMetrics() statusHandler.StatusMetricsHandler GetAllIssuedESDTs(tokenType string) ([]string, error) GetTokenSupply(token string) (*api.ESDTSupply, error) GetGenesisNodesPubKeys() (map[uint32][]string, map[uint32][]string, error) diff --git a/api/groups/networkGroup_test.go b/api/groups/networkGroup_test.go index 38ab043d29f..9ac24746424 100644 --- a/api/groups/networkGroup_test.go +++ b/api/groups/networkGroup_test.go @@ -19,7 +19,6 @@ import ( "github.com/ElrondNetwork/elrond-go/api/shared" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/config" - "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/statusHandler" "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/stretchr/testify/assert" @@ -99,7 +98,7 @@ func TestNetworkConfigMetrics_ShouldWork(t *testing.T) { statusMetricsProvider.SetUInt64Value(key, value) facade := mock.FacadeStub{} - facade.StatusMetricsHandler = func() external.StatusMetricsHandler { + facade.StatusMetricsHandler = func() statusHandler.StatusMetricsHandler { return statusMetricsProvider } @@ -124,7 +123,7 @@ func TestGetNetworkConfig_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { expectedErr := errors.New("i am an error") facade := mock.FacadeStub{ - StatusMetricsHandler: func() external.StatusMetricsHandler { + StatusMetricsHandler: func() statusHandler.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ ConfigMetricsCalled: func() (map[string]interface{}, error) { return nil, expectedErr @@ -154,7 +153,7 @@ func TestGetNetworkStatus_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { expectedErr := errors.New("i am an error") facade := mock.FacadeStub{ - StatusMetricsHandler: func() external.StatusMetricsHandler { + StatusMetricsHandler: func() statusHandler.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ NetworkMetricsCalled: func() (map[string]interface{}, error) { return nil, expectedErr @@ -189,7 +188,7 @@ func TestNetworkStatusMetrics_ShouldWork(t *testing.T) { statusMetricsProvider.SetUInt64Value(key, value) facade := mock.FacadeStub{} - facade.StatusMetricsHandler = func() external.StatusMetricsHandler { + facade.StatusMetricsHandler = func() statusHandler.StatusMetricsHandler { return statusMetricsProvider } @@ -224,7 +223,7 @@ func TestEconomicsMetrics_ShouldWork(t *testing.T) { }, nil }, } - facade.StatusMetricsHandler = func() external.StatusMetricsHandler { + facade.StatusMetricsHandler = func() statusHandler.StatusMetricsHandler { return statusMetricsProvider } @@ -249,7 +248,7 @@ func TestGetEconomicValues_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { expectedErr := errors.New("i am an error") facade := mock.FacadeStub{ - StatusMetricsHandler: func() external.StatusMetricsHandler { + StatusMetricsHandler: func() statusHandler.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ EconomicsMetricsCalled: func() (map[string]interface{}, error) { return nil, expectedErr @@ -290,7 +289,7 @@ func TestEconomicsMetrics_CannotGetStakeValues(t *testing.T) { return nil, localErr }, } - facade.StatusMetricsHandler = func() external.StatusMetricsHandler { + facade.StatusMetricsHandler = func() statusHandler.StatusMetricsHandler { return statusMetricsProvider } @@ -514,7 +513,7 @@ func TestGetEnableEpochs_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { expectedErr := errors.New("i am an error") facade := mock.FacadeStub{ - StatusMetricsHandler: func() external.StatusMetricsHandler { + StatusMetricsHandler: func() statusHandler.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ EnableEpochsMetricsCalled: func() (map[string]interface{}, error) { return nil, expectedErr @@ -549,7 +548,7 @@ func TestGetEnableEpochs_ShouldWork(t *testing.T) { statusMetrics.SetUInt64Value(key, value) facade := mock.FacadeStub{} - facade.StatusMetricsHandler = func() external.StatusMetricsHandler { + facade.StatusMetricsHandler = func() statusHandler.StatusMetricsHandler { return statusMetrics } @@ -601,7 +600,7 @@ func TestGetNetworkRatings_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { expectedErr := errors.New("i am an error") facade := mock.FacadeStub{ - StatusMetricsHandler: func() external.StatusMetricsHandler { + StatusMetricsHandler: func() statusHandler.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ RatingsMetricsCalled: func() (map[string]interface{}, error) { return nil, expectedErr @@ -633,7 +632,7 @@ func TestGetNetworkRatings_ShouldWork(t *testing.T) { } facade := mock.FacadeStub{ - StatusMetricsHandler: func() external.StatusMetricsHandler { + StatusMetricsHandler: func() statusHandler.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ RatingsMetricsCalled: func() (map[string]interface{}, error) { return expectedMap, nil diff --git a/api/groups/nodeGroup.go b/api/groups/nodeGroup.go index 0987a2db0e0..b3914ae57bd 100644 --- a/api/groups/nodeGroup.go +++ b/api/groups/nodeGroup.go @@ -12,7 +12,7 @@ import ( "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/debug" "github.com/ElrondNetwork/elrond-go/heartbeat/data" - "github.com/ElrondNetwork/elrond-go/node/external" + "github.com/ElrondNetwork/elrond-go/statusHandler" "github.com/gin-gonic/gin" ) @@ -30,7 +30,7 @@ const ( // nodeFacadeHandler defines the methods to be implemented by a facade for node requests type nodeFacadeHandler interface { GetHeartbeats() ([]data.PubKeyHeartbeat, error) - StatusMetrics() external.StatusMetricsHandler + StatusMetrics() statusHandler.StatusMetricsHandler GetQueryHandler(name string) (debug.QueryHandler, error) GetEpochStartDataAPI(epoch uint32) (*common.EpochStartDataAPI, error) GetPeerInfo(pid string) ([]core.QueryP2PPeerInfo, error) diff --git a/api/groups/nodeGroup_test.go b/api/groups/nodeGroup_test.go index d2cae7d2928..26fceefaa55 100644 --- a/api/groups/nodeGroup_test.go +++ b/api/groups/nodeGroup_test.go @@ -22,7 +22,6 @@ import ( "github.com/ElrondNetwork/elrond-go/config" "github.com/ElrondNetwork/elrond-go/debug" "github.com/ElrondNetwork/elrond-go/heartbeat/data" - "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/statusHandler" "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/gin-gonic/gin" @@ -137,7 +136,7 @@ func TestP2PMetrics_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { expectedErr := errors.New("i am an error") facade := mock.FacadeStub{ - StatusMetricsHandler: func() external.StatusMetricsHandler { + StatusMetricsHandler: func() statusHandler.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ StatusP2pMetricsMapCalled: func() (map[string]interface{}, error) { return nil, expectedErr @@ -167,7 +166,7 @@ func TestNodeStatus_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { expectedErr := errors.New("i am an error") facade := mock.FacadeStub{ - StatusMetricsHandler: func() external.StatusMetricsHandler { + StatusMetricsHandler: func() statusHandler.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ StatusMetricsMapWithoutP2PCalled: func() (map[string]interface{}, error) { return nil, expectedErr @@ -203,7 +202,7 @@ func TestStatusMetrics_ShouldDisplayNonP2pMetrics(t *testing.T) { statusMetricsProvider.SetStringValue(p2pKey, "p2p value") facade := mock.FacadeStub{} - facade.StatusMetricsHandler = func() external.StatusMetricsHandler { + facade.StatusMetricsHandler = func() statusHandler.StatusMetricsHandler { return statusMetricsProvider } @@ -236,7 +235,7 @@ func TestP2PStatusMetrics_ShouldDisplayNonP2pMetrics(t *testing.T) { statusMetricsProvider.SetStringValue(p2pKey, p2pValue) facade := mock.FacadeStub{} - facade.StatusMetricsHandler = func() external.StatusMetricsHandler { + facade.StatusMetricsHandler = func() statusHandler.StatusMetricsHandler { return statusMetricsProvider } @@ -459,7 +458,7 @@ func TestPrometheusMetrics_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { expectedErr := errors.New("i am an error") facade := mock.FacadeStub{ - StatusMetricsHandler: func() external.StatusMetricsHandler { + StatusMetricsHandler: func() statusHandler.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ StatusMetricsWithoutP2PPrometheusStringCalled: func() (string, error) { return "", expectedErr @@ -492,7 +491,7 @@ func TestPrometheusMetrics_ShouldWork(t *testing.T) { statusMetricsProvider.SetUInt64Value(key, value) facade := mock.FacadeStub{} - facade.StatusMetricsHandler = func() external.StatusMetricsHandler { + facade.StatusMetricsHandler = func() statusHandler.StatusMetricsHandler { return statusMetricsProvider } diff --git a/api/mock/facadeStub.go b/api/mock/facadeStub.go index 55310a21306..e615ad112ed 100644 --- a/api/mock/facadeStub.go +++ b/api/mock/facadeStub.go @@ -12,10 +12,10 @@ import ( "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/debug" "github.com/ElrondNetwork/elrond-go/heartbeat/data" - "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/process" txSimData "github.com/ElrondNetwork/elrond-go/process/txsimulator/data" "github.com/ElrondNetwork/elrond-go/state" + "github.com/ElrondNetwork/elrond-go/statusHandler" ) // FacadeStub is the mock implementation of a node router handler @@ -33,7 +33,7 @@ type FacadeStub struct { ValidateTransactionForSimulationHandler func(tx *transaction.Transaction, bypassSignature bool) error SendBulkTransactionsHandler func(txs []*transaction.Transaction) (uint64, error) ExecuteSCQueryHandler func(query *process.SCQuery) (*vm.VMOutputApi, error) - StatusMetricsHandler func() external.StatusMetricsHandler + StatusMetricsHandler func() statusHandler.StatusMetricsHandler ValidatorStatisticsHandler func() (map[string]*state.ValidatorApiResponse, error) ComputeTransactionGasLimitHandler func(tx *transaction.Transaction) (*transaction.CostResponse, error) NodeConfigCalled func() map[string]interface{} @@ -309,7 +309,7 @@ func (f *FacadeStub) ExecuteSCQuery(query *process.SCQuery) (*vm.VMOutputApi, er } // StatusMetrics is the mock implementation for the StatusMetrics -func (f *FacadeStub) StatusMetrics() external.StatusMetricsHandler { +func (f *FacadeStub) StatusMetrics() statusHandler.StatusMetricsHandler { return f.StatusMetricsHandler() } diff --git a/api/shared/interface.go b/api/shared/interface.go index 50ed40c1504..287e21b06cd 100644 --- a/api/shared/interface.go +++ b/api/shared/interface.go @@ -12,10 +12,10 @@ import ( "github.com/ElrondNetwork/elrond-go/config" "github.com/ElrondNetwork/elrond-go/debug" "github.com/ElrondNetwork/elrond-go/heartbeat/data" - "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/process" txSimData "github.com/ElrondNetwork/elrond-go/process/txsimulator/data" "github.com/ElrondNetwork/elrond-go/state" + "github.com/ElrondNetwork/elrond-go/statusHandler" "github.com/gin-gonic/gin" ) @@ -87,7 +87,7 @@ type FacadeHandler interface { GetTotalStakedValue() (*api.StakeValues, error) GetDirectStakedList() ([]*api.DirectStakedValue, error) GetDelegatorsList() ([]*api.Delegator, error) - StatusMetrics() external.StatusMetricsHandler + StatusMetrics() statusHandler.StatusMetricsHandler GetTokenSupply(token string) (*api.ESDTSupply, error) GetAllIssuedESDTs(tokenType string) ([]string, error) GetHeartbeats() ([]data.PubKeyHeartbeat, error) diff --git a/cmd/node/factory/interface.go b/cmd/node/factory/interface.go index 0d6c293c68c..c6eacfee610 100644 --- a/cmd/node/factory/interface.go +++ b/cmd/node/factory/interface.go @@ -7,8 +7,8 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data" "github.com/ElrondNetwork/elrond-go-core/data/typeConverters" "github.com/ElrondNetwork/elrond-go-core/marshal" - "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/p2p" + "github.com/ElrondNetwork/elrond-go/statusHandler" "github.com/ElrondNetwork/elrond-go/storage" ) @@ -62,7 +62,7 @@ type FileLoggingHandler interface { // TODO: find a better naming type StatusHandlersUtils interface { StatusHandler() core.AppStatusHandler - Metrics() external.StatusMetricsHandler + Metrics() statusHandler.StatusMetricsHandler UpdateStorerAndMetricsForPersistentHandler(store storage.Storer) error IsInterfaceNil() bool } diff --git a/cmd/node/factory/structsStatusHandlers.go b/cmd/node/factory/structsStatusHandlers.go index b0702d600c4..52975386f9e 100644 --- a/cmd/node/factory/structsStatusHandlers.go +++ b/cmd/node/factory/structsStatusHandlers.go @@ -8,7 +8,6 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/typeConverters" "github.com/ElrondNetwork/elrond-go-core/marshal" logger "github.com/ElrondNetwork/elrond-go-logger" - "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/statusHandler" "github.com/ElrondNetwork/elrond-go/statusHandler/persister" "github.com/ElrondNetwork/elrond-go/storage" @@ -19,7 +18,7 @@ var log = logger.GetOrCreate("main") // StatusHandlersInfo is struct that stores all components that are returned when status handlers are created type statusHandlersInfo struct { AppStatusHandler core.AppStatusHandler - StatusMetrics external.StatusMetricsHandler + StatusMetrics statusHandler.StatusMetricsHandler PersistentHandler *persister.PersistentStatusHandler } @@ -91,7 +90,7 @@ func (shi *statusHandlersInfo) StatusHandler() core.AppStatusHandler { } // Metrics returns the status metrics -func (shi *statusHandlersInfo) Metrics() external.StatusMetricsHandler { +func (shi *statusHandlersInfo) Metrics() statusHandler.StatusMetricsHandler { return shi.StatusMetrics } diff --git a/common/constants.go b/common/constants.go index 4dd5080b17a..4f8d7310941 100644 --- a/common/constants.go +++ b/common/constants.go @@ -825,3 +825,6 @@ const MetricLastPeersSnapshotDurationSec = "erd_peers_snapshot_last_duration_in_ // GenesisStorageSuffix defines the storage suffix used for genesis altered data const GenesisStorageSuffix = "_genesis" + +// MetricNumSnapshotNodes is the metric that outputs the number of trie nodes written after snapshot +const MetricNumSnapshotNodes = "erd_num_snapshot_nodes" diff --git a/common/interface.go b/common/interface.go index bbc8008ae53..ba278f307a8 100644 --- a/common/interface.go +++ b/common/interface.go @@ -168,7 +168,7 @@ type TrieStatisticsHandler interface { // TriesStatisticsCollector is used to merge the statistics for multiple tries type TriesStatisticsCollector interface { Add(trieStats *statistics.TrieStatsDTO) - Print() + UpdateMetricAndPrintStatistics(metric string) } // ProcessStatusHandler defines the behavior of a component able to hold the current status of the node and diff --git a/facade/initial/initialNodeFacade.go b/facade/initial/initialNodeFacade.go index 4fb02a5ce44..308547eb952 100644 --- a/facade/initial/initialNodeFacade.go +++ b/facade/initial/initialNodeFacade.go @@ -12,11 +12,11 @@ import ( "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/debug" "github.com/ElrondNetwork/elrond-go/heartbeat/data" - "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/ntp" "github.com/ElrondNetwork/elrond-go/process" txSimData "github.com/ElrondNetwork/elrond-go/process/txsimulator/data" "github.com/ElrondNetwork/elrond-go/state" + "github.com/ElrondNetwork/elrond-go/statusHandler" ) var errNodeStarting = errors.New("node is starting") @@ -25,7 +25,7 @@ var emptyString = "" // initialNodeFacade represents a facade with no functionality type initialNodeFacade struct { apiInterface string - statusMetricsHandler external.StatusMetricsHandler + statusMetricsHandler statusHandler.StatusMetricsHandler pprofEnabled bool } @@ -187,7 +187,7 @@ func (inf *initialNodeFacade) GetHeartbeats() ([]data.PubKeyHeartbeat, error) { } // StatusMetrics will returns nil -func (inf *initialNodeFacade) StatusMetrics() external.StatusMetricsHandler { +func (inf *initialNodeFacade) StatusMetrics() statusHandler.StatusMetricsHandler { return inf.statusMetricsHandler } diff --git a/facade/interface.go b/facade/interface.go index 7a40d748d46..be71b651466 100644 --- a/facade/interface.go +++ b/facade/interface.go @@ -11,10 +11,10 @@ import ( "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/debug" "github.com/ElrondNetwork/elrond-go/heartbeat/data" - "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/process" txSimData "github.com/ElrondNetwork/elrond-go/process/txsimulator/data" "github.com/ElrondNetwork/elrond-go/state" + "github.com/ElrondNetwork/elrond-go/statusHandler" vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) @@ -108,7 +108,7 @@ type TransactionSimulatorProcessor interface { type ApiResolver interface { ExecuteSCQuery(query *process.SCQuery) (*vmcommon.VMOutput, error) ComputeTransactionGasLimit(tx *transaction.Transaction) (*transaction.CostResponse, error) - StatusMetrics() external.StatusMetricsHandler + StatusMetrics() statusHandler.StatusMetricsHandler GetTotalStakedValue(ctx context.Context) (*api.StakeValues, error) GetDirectStakedList(ctx context.Context) ([]*api.DirectStakedValue, error) GetDelegatorsList(ctx context.Context) ([]*api.Delegator, error) diff --git a/facade/mock/apiResolverStub.go b/facade/mock/apiResolverStub.go index eb07b880ed3..d097a86bed6 100644 --- a/facade/mock/apiResolverStub.go +++ b/facade/mock/apiResolverStub.go @@ -6,15 +6,15 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/api" "github.com/ElrondNetwork/elrond-go-core/data/transaction" "github.com/ElrondNetwork/elrond-go/common" - "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/process" + "github.com/ElrondNetwork/elrond-go/statusHandler" vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) // ApiResolverStub - type ApiResolverStub struct { ExecuteSCQueryHandler func(query *process.SCQuery) (*vmcommon.VMOutput, error) - StatusMetricsHandler func() external.StatusMetricsHandler + StatusMetricsHandler func() statusHandler.StatusMetricsHandler ComputeTransactionGasLimitHandler func(tx *transaction.Transaction) (*transaction.CostResponse, error) GetTotalStakedValueHandler func(ctx context.Context) (*api.StakeValues, error) GetDirectStakedListHandler func(ctx context.Context) ([]*api.DirectStakedValue, error) @@ -86,7 +86,7 @@ func (ars *ApiResolverStub) ExecuteSCQuery(query *process.SCQuery) (*vmcommon.VM } // StatusMetrics - -func (ars *ApiResolverStub) StatusMetrics() external.StatusMetricsHandler { +func (ars *ApiResolverStub) StatusMetrics() statusHandler.StatusMetricsHandler { if ars.StatusMetricsHandler != nil { return ars.StatusMetricsHandler() } diff --git a/facade/nodeFacade.go b/facade/nodeFacade.go index 43c5f4c9b04..c8818e0f45a 100644 --- a/facade/nodeFacade.go +++ b/facade/nodeFacade.go @@ -22,11 +22,11 @@ import ( "github.com/ElrondNetwork/elrond-go/debug" "github.com/ElrondNetwork/elrond-go/epochStart/bootstrap/disabled" "github.com/ElrondNetwork/elrond-go/heartbeat/data" - "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/ntp" "github.com/ElrondNetwork/elrond-go/process" txSimData "github.com/ElrondNetwork/elrond-go/process/txsimulator/data" "github.com/ElrondNetwork/elrond-go/state" + "github.com/ElrondNetwork/elrond-go/statusHandler" vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) @@ -365,7 +365,7 @@ func (nf *nodeFacade) GetHeartbeats() ([]data.PubKeyHeartbeat, error) { } // StatusMetrics will return the node's status metrics -func (nf *nodeFacade) StatusMetrics() external.StatusMetricsHandler { +func (nf *nodeFacade) StatusMetrics() statusHandler.StatusMetricsHandler { return nf.apiResolver.StatusMetrics() } diff --git a/facade/nodeFacade_test.go b/facade/nodeFacade_test.go index 0c9b7c30708..d83c03fec1e 100644 --- a/facade/nodeFacade_test.go +++ b/facade/nodeFacade_test.go @@ -24,9 +24,9 @@ import ( "github.com/ElrondNetwork/elrond-go/debug" "github.com/ElrondNetwork/elrond-go/facade/mock" "github.com/ElrondNetwork/elrond-go/heartbeat/data" - "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/state" + "github.com/ElrondNetwork/elrond-go/statusHandler" "github.com/ElrondNetwork/elrond-go/testscommon" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" vmcommon "github.com/ElrondNetwork/elrond-vm-common" @@ -473,7 +473,7 @@ func TestNodeFacade_StatusMetrics(t *testing.T) { apiResolverMetricsRequested := false apiResStub := &mock.ApiResolverStub{ - StatusMetricsHandler: func() external.StatusMetricsHandler { + StatusMetricsHandler: func() statusHandler.StatusMetricsHandler { apiResolverMetricsRequested = true return nil }, diff --git a/integrationTests/interface.go b/integrationTests/interface.go index 21f1d16255f..157a5291661 100644 --- a/integrationTests/interface.go +++ b/integrationTests/interface.go @@ -13,11 +13,11 @@ import ( "github.com/ElrondNetwork/elrond-go/debug" "github.com/ElrondNetwork/elrond-go/epochStart" "github.com/ElrondNetwork/elrond-go/heartbeat/data" - "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/process" txSimData "github.com/ElrondNetwork/elrond-go/process/txsimulator/data" "github.com/ElrondNetwork/elrond-go/sharding/nodesCoordinator" "github.com/ElrondNetwork/elrond-go/state" + "github.com/ElrondNetwork/elrond-go/statusHandler" ) // TestBootstrapper extends the Bootstrapper interface with some functions intended to be used only in tests @@ -78,7 +78,7 @@ type Facade interface { GetAllIssuedESDTs(tokenType string) ([]string, error) GetTokenSupply(token string) (*dataApi.ESDTSupply, error) GetHeartbeats() ([]data.PubKeyHeartbeat, error) - StatusMetrics() external.StatusMetricsHandler + StatusMetrics() statusHandler.StatusMetricsHandler GetQueryHandler(name string) (debug.QueryHandler, error) GetEpochStartDataAPI(epoch uint32) (*common.EpochStartDataAPI, error) GetPeerInfo(pid string) ([]core.QueryP2PPeerInfo, error) diff --git a/integrationTests/multiShard/endOfEpoch/startInEpoch/startInEpoch_test.go b/integrationTests/multiShard/endOfEpoch/startInEpoch/startInEpoch_test.go index 46412193c65..f11e3caa7b3 100644 --- a/integrationTests/multiShard/endOfEpoch/startInEpoch/startInEpoch_test.go +++ b/integrationTests/multiShard/endOfEpoch/startInEpoch/startInEpoch_test.go @@ -258,6 +258,7 @@ func testNodeStartsInEpoch(t *testing.T, shardID uint32, expectedHighestRound ui FlagsConfig: config.ContextFlagsConfig{ ForceStartFromNetwork: false, }, + TrieSyncStatisticsProvider: &testscommon.SizeSyncStatisticsHandlerStub{}, } epochStartBootstrap, err := bootstrap.NewEpochStartBootstrap(argsBootstrapHandler) diff --git a/node/external/interface.go b/node/external/interface.go index 6e12a7ea167..d84f1eb64dc 100644 --- a/node/external/interface.go +++ b/node/external/interface.go @@ -18,19 +18,6 @@ type SCQueryService interface { IsInterfaceNil() bool } -// StatusMetricsHandler is the interface that defines what a node details handler/provider should do -type StatusMetricsHandler interface { - StatusMetricsMapWithoutP2P() (map[string]interface{}, error) - StatusP2pMetricsMap() (map[string]interface{}, error) - StatusMetricsWithoutP2PPrometheusString() (string, error) - EconomicsMetrics() (map[string]interface{}, error) - ConfigMetrics() (map[string]interface{}, error) - EnableEpochsMetrics() (map[string]interface{}, error) - NetworkMetrics() (map[string]interface{}, error) - RatingsMetrics() (map[string]interface{}, error) - IsInterfaceNil() bool -} - // TransactionCostHandler defines the actions which should be handler by a transaction cost estimator type TransactionCostHandler interface { ComputeTransactionGasLimit(tx *transaction.Transaction) (*transaction.CostResponse, error) diff --git a/node/external/nodeApiResolver.go b/node/external/nodeApiResolver.go index fb636e33aac..122d6c48e33 100644 --- a/node/external/nodeApiResolver.go +++ b/node/external/nodeApiResolver.go @@ -15,13 +15,14 @@ import ( "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/sharding" "github.com/ElrondNetwork/elrond-go/sharding/nodesCoordinator" + "github.com/ElrondNetwork/elrond-go/statusHandler" vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) // ArgNodeApiResolver represents the DTO structure used in the NewNodeApiResolver constructor type ArgNodeApiResolver struct { SCQueryService SCQueryService - StatusMetricsHandler StatusMetricsHandler + StatusMetricsHandler statusHandler.StatusMetricsHandler TxCostHandler TransactionCostHandler TotalStakedValueHandler TotalStakedValueHandler DirectStakedListHandler DirectStakedListHandler @@ -38,7 +39,7 @@ type ArgNodeApiResolver struct { // nodeApiResolver can resolve API requests type nodeApiResolver struct { scQueryService SCQueryService - statusMetricsHandler StatusMetricsHandler + statusMetricsHandler statusHandler.StatusMetricsHandler txCostHandler TransactionCostHandler totalStakedValueHandler TotalStakedValueHandler directStakedListHandler DirectStakedListHandler @@ -117,7 +118,7 @@ func (nar *nodeApiResolver) ExecuteSCQuery(query *process.SCQuery) (*vmcommon.VM } // StatusMetrics returns an implementation of the StatusMetricsHandler interface -func (nar *nodeApiResolver) StatusMetrics() StatusMetricsHandler { +func (nar *nodeApiResolver) StatusMetrics() statusHandler.StatusMetricsHandler { return nar.statusMetricsHandler } diff --git a/node/metrics/metrics.go b/node/metrics/metrics.go index 7cf06c43e58..44ddc9f88b7 100644 --- a/node/metrics/metrics.go +++ b/node/metrics/metrics.go @@ -51,6 +51,7 @@ func InitBaseMetrics(statusHandlerUtils StatusHandlersUtils) error { appStatusHandler.SetUInt64Value(common.MetricNoncesPassedInCurrentEpoch, initUint) appStatusHandler.SetUInt64Value(common.MetricNumConnectedPeers, initUint) appStatusHandler.SetUInt64Value(common.MetricEpochForEconomicsData, initUint) + appStatusHandler.SetUInt64Value(common.MetricNumSnapshotNodes, initUint) appStatusHandler.SetInt64Value(common.MetricLastAccountsSnapshotDurationSec, initInt) appStatusHandler.SetInt64Value(common.MetricLastPeersSnapshotDurationSec, initInt) diff --git a/node/metrics/metrics_test.go b/node/metrics/metrics_test.go index 855e1d9029d..accc7c6460a 100644 --- a/node/metrics/metrics_test.go +++ b/node/metrics/metrics_test.go @@ -58,6 +58,7 @@ func TestInitBaseMetrics(t *testing.T) { common.MetricLastAccountsSnapshotDurationSec, common.MetricPeersSnapshotInProgress, common.MetricLastPeersSnapshotDurationSec, + common.MetricNumSnapshotNodes, } keys := make(map[string]struct{}) diff --git a/process/sync/storageBootstrap/metricsLoader/loadPersistentMetrics.go b/process/sync/storageBootstrap/metricsLoader/loadPersistentMetrics.go index 1cf62f3bceb..9a089261ba4 100644 --- a/process/sync/storageBootstrap/metricsLoader/loadPersistentMetrics.go +++ b/process/sync/storageBootstrap/metricsLoader/loadPersistentMetrics.go @@ -110,6 +110,7 @@ func prepareMetricMaps(metricsMap map[string]interface{}) (map[string]uint64, ma stringMap[common.MetricTotalFees] = persister.GetString(metricsMap[common.MetricTotalFees]) stringMap[common.MetricDevRewardsInEpoch] = persister.GetString(metricsMap[common.MetricDevRewardsInEpoch]) stringMap[common.MetricInflation] = persister.GetString(metricsMap[common.MetricInflation]) + uint64Map[common.MetricNumSnapshotNodes] = persister.GetUint64(metricsMap[common.MetricNumSnapshotNodes]) return uint64Map, stringMap } diff --git a/state/accountsDB.go b/state/accountsDB.go index 76108cb22ca..97d9e226ea3 100644 --- a/state/accountsDB.go +++ b/state/accountsDB.go @@ -22,6 +22,7 @@ import ( "github.com/ElrondNetwork/elrond-go/errors" "github.com/ElrondNetwork/elrond-go/trie/keyBuilder" "github.com/ElrondNetwork/elrond-go/trie/statistics" + "github.com/ElrondNetwork/elrond-go/trie/statistics/disabled" vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) @@ -1139,7 +1140,7 @@ func (adb *AccountsDB) SnapshotState(rootHash []byte) { LeavesChan: make(chan core.KeyValueHolder, leavesChannelSize), ErrChan: make(chan error, 1), } - stats := newSnapshotStatistics(1, 1) + stats := newSnapshotStatistics(1, 1, adb.appStatusHandler) accountMetrics := &accountMetrics{ snapshotInProgressKey: common.MetricAccountsSnapshotInProgress, @@ -1362,7 +1363,8 @@ func (adb *AccountsDB) setStateCheckpoint(rootHash []byte) { ErrChan: make(chan error, 1), } missingNodesChannel := make(chan []byte, missingNodesChannelSize) - stats := newSnapshotStatistics(1, 1) + stats := newSnapshotStatistics(1, 1, adb.appStatusHandler) + go func() { stats.NewSnapshotStarted() trieStorageManager.SetCheckpoint(rootHash, rootHash, iteratorChannels, missingNodesChannel, stats) @@ -1413,7 +1415,13 @@ func (adb *AccountsDB) Close() error { // GetStatsForRootHash will get trie statistics for the given rootHash func (adb *AccountsDB) GetStatsForRootHash(rootHash []byte) (common.TriesStatisticsCollector, error) { - stats := statistics.NewTrieStatisticsCollector() + var stats common.TriesStatisticsCollector + stats, err := statistics.NewTrieStatisticsCollector(adb.appStatusHandler) + if err != nil { + stats = disabled.NewTrieStatisticsCollector() + log.Error("could not create trie statistics collector, using a disabled one...", "error", err) + } + mainTrie := adb.getMainTrie() tr, ok := mainTrie.(common.TrieStats) @@ -1427,7 +1435,7 @@ func (adb *AccountsDB) GetStatsForRootHash(rootHash []byte) (common.TriesStatist LeavesChan: make(chan core.KeyValueHolder, leavesChannelSize), ErrChan: make(chan error, 1), } - err := mainTrie.GetAllLeavesOnChannel(iteratorChannels, context.Background(), rootHash, keyBuilder.NewDisabledKeyBuilder()) + err = mainTrie.GetAllLeavesOnChannel(iteratorChannels, context.Background(), rootHash, keyBuilder.NewDisabledKeyBuilder()) if err != nil { return nil, err } diff --git a/state/accountsDB_test.go b/state/accountsDB_test.go index a091883c1fd..300948f150f 100644 --- a/state/accountsDB_test.go +++ b/state/accountsDB_test.go @@ -2767,7 +2767,7 @@ func TestAccountsDB_PrintStatsForRootHash(t *testing.T) { assert.Nil(t, err) assert.NotNil(t, stats) - stats.Print() + stats.UpdateMetricAndPrintStatistics("") } func addDataTries(accountsAddresses [][]byte, adb *state.AccountsDB) { diff --git a/state/peerAccountsDB.go b/state/peerAccountsDB.go index c752898c131..692d0b21650 100644 --- a/state/peerAccountsDB.go +++ b/state/peerAccountsDB.go @@ -2,6 +2,7 @@ package state import ( "github.com/ElrondNetwork/elrond-go/common" + "github.com/ElrondNetwork/elrond-go/common/disabled" ) // PeerAccountsDB will save and synchronize data from peer processor, plus will synchronize with nodesCoordinator @@ -58,7 +59,7 @@ func (adb *PeerAccountsDB) SnapshotState(rootHash []byte) { LeavesChan: nil, ErrChan: make(chan error, 1), } - stats := newSnapshotStatistics(0, 1) + stats := newSnapshotStatistics(0, 1, disabled.NewAppStatusHandler()) stats.NewSnapshotStarted() peerAccountsMetrics := &accountMetrics{ @@ -86,7 +87,7 @@ func (adb *PeerAccountsDB) SetStateCheckpoint(rootHash []byte) { trieStorageManager := adb.mainTrie.GetStorageManager() missingNodesChannel := make(chan []byte, missingNodesChannelSize) - stats := newSnapshotStatistics(0, 1) + stats := newSnapshotStatistics(0, 1, disabled.NewAppStatusHandler()) trieStorageManager.EnterPruningBufferingMode() stats.NewSnapshotStarted() diff --git a/state/snapshotStatistics.go b/state/snapshotStatistics.go index 71f5c9a529c..b1aa26f95f6 100644 --- a/state/snapshotStatistics.go +++ b/state/snapshotStatistics.go @@ -4,8 +4,10 @@ import ( "sync" "time" + "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/trie/statistics" + "github.com/ElrondNetwork/elrond-go/trie/statistics/disabled" ) type snapshotStatistics struct { @@ -18,17 +20,25 @@ type snapshotStatistics struct { mutex sync.RWMutex } -func newSnapshotStatistics(snapshotDelta int, syncDelta int) *snapshotStatistics { +func newSnapshotStatistics(snapshotDelta int, syncDelta int, appStatusHandler core.AppStatusHandler) *snapshotStatistics { wgSnapshot := &sync.WaitGroup{} wgSnapshot.Add(snapshotDelta) wgSync := &sync.WaitGroup{} wgSync.Add(syncDelta) + + var statisticsCollector common.TriesStatisticsCollector + statisticsCollector, err := statistics.NewTrieStatisticsCollector(appStatusHandler) + if err != nil { + statisticsCollector = disabled.NewTrieStatisticsCollector() + log.Error("could not create trie statistics collector, using a disabled one...", "error", err) + } + return &snapshotStatistics{ wgSnapshot: wgSnapshot, wgSync: wgSync, startTime: time.Now(), - trieStatisticsCollector: statistics.NewTrieStatisticsCollector(), + trieStatisticsCollector: statisticsCollector, } } @@ -81,5 +91,5 @@ func (ss *snapshotStatistics) PrintStats(identifier string, rootHash []byte) { "duration", time.Since(ss.startTime).Truncate(time.Second), "rootHash", rootHash, ) - ss.trieStatisticsCollector.Print() + ss.trieStatisticsCollector.UpdateMetricAndPrintStatistics(common.MetricNumSnapshotNodes) } diff --git a/state/snapshotStatistics_test.go b/state/snapshotStatistics_test.go index 7602d0b8537..f35641f61bd 100644 --- a/state/snapshotStatistics_test.go +++ b/state/snapshotStatistics_test.go @@ -5,16 +5,20 @@ import ( "testing" "github.com/ElrondNetwork/elrond-go/common" + "github.com/ElrondNetwork/elrond-go/testscommon/statusHandler" "github.com/ElrondNetwork/elrond-go/trie/statistics" + "github.com/stretchr/testify/require" ) func TestSnapshotStatistics_Concurrency(t *testing.T) { t.Parallel() wg := &sync.WaitGroup{} + stats, err := statistics.NewTrieStatisticsCollector(&statusHandler.AppStatusHandlerStub{}) + require.Nil(t, err) ss := &snapshotStatistics{ wgSnapshot: wg, - trieStatisticsCollector: statistics.NewTrieStatisticsCollector(), + trieStatisticsCollector: stats, } numRuns := 100 diff --git a/statusHandler/interface.go b/statusHandler/interface.go new file mode 100644 index 00000000000..96dda38a115 --- /dev/null +++ b/statusHandler/interface.go @@ -0,0 +1,14 @@ +package statusHandler + +// StatusMetricsHandler is the interface that defines what a node details handler/provider should do +type StatusMetricsHandler interface { + StatusMetricsMapWithoutP2P() (map[string]interface{}, error) + StatusP2pMetricsMap() (map[string]interface{}, error) + StatusMetricsWithoutP2PPrometheusString() (string, error) + EconomicsMetrics() (map[string]interface{}, error) + ConfigMetrics() (map[string]interface{}, error) + EnableEpochsMetrics() (map[string]interface{}, error) + NetworkMetrics() (map[string]interface{}, error) + RatingsMetrics() (map[string]interface{}, error) + IsInterfaceNil() bool +} diff --git a/statusHandler/persister/persistentHandler.go b/statusHandler/persister/persistentHandler.go index 22045c92dde..67ca60a6f34 100644 --- a/statusHandler/persister/persistentHandler.go +++ b/statusHandler/persister/persistentHandler.go @@ -66,6 +66,7 @@ func (psh *PersistentStatusHandler) initMap() { psh.persistentMetrics.Store(common.MetricDevRewardsInEpoch, zeroString) psh.persistentMetrics.Store(common.MetricInflation, zeroString) psh.persistentMetrics.Store(common.MetricEpochForEconomicsData, initUint) + psh.persistentMetrics.Store(common.MetricNumSnapshotNodes, initUint) } // SetStorage will set storage for persistent status handler @@ -129,7 +130,7 @@ func (psh *PersistentStatusHandler) SetUInt64Value(key string, value uint64) { psh.persistentMetrics.Store(key, value) - //metrics will be saved in storage every time when a block is committed successfully + // metrics will be saved in storage every time when a block is committed successfully if key != common.MetricNonce { return } diff --git a/testscommon/statusHandler/statusHandlersUtilsMock.go b/testscommon/statusHandler/statusHandlersUtilsMock.go index ade32053a04..59a82e448a8 100644 --- a/testscommon/statusHandler/statusHandlersUtilsMock.go +++ b/testscommon/statusHandler/statusHandlersUtilsMock.go @@ -2,13 +2,13 @@ package statusHandler import ( "github.com/ElrondNetwork/elrond-go-core/core" - "github.com/ElrondNetwork/elrond-go/node/external" + "github.com/ElrondNetwork/elrond-go/statusHandler" "github.com/ElrondNetwork/elrond-go/storage" ) // StatusHandlersUtilsMock - type StatusHandlersUtilsMock struct { - StatusMetrics external.StatusMetricsHandler + StatusMetrics statusHandler.StatusMetricsHandler AppStatusHandler core.AppStatusHandler } @@ -23,7 +23,7 @@ func (shum *StatusHandlersUtilsMock) StatusHandler() core.AppStatusHandler { } // Metrics - -func (shum *StatusHandlersUtilsMock) Metrics() external.StatusMetricsHandler { +func (shum *StatusHandlersUtilsMock) Metrics() statusHandler.StatusMetricsHandler { return shum.StatusMetrics } diff --git a/testscommon/statusMetricsStub.go b/testscommon/statusMetricsStub.go index e951d5c5f44..43a15cde6c2 100644 --- a/testscommon/statusMetricsStub.go +++ b/testscommon/statusMetricsStub.go @@ -23,37 +23,62 @@ func (sms *StatusMetricsStub) StatusMetricsWithoutP2PPrometheusString() (string, // ConfigMetrics - func (sms *StatusMetricsStub) ConfigMetrics() (map[string]interface{}, error) { - return sms.ConfigMetricsCalled() + if sms.ConfigMetricsCalled != nil { + return sms.ConfigMetricsCalled() + } + return baseReturnValues() } // NetworkMetrics - func (sms *StatusMetricsStub) NetworkMetrics() (map[string]interface{}, error) { - return sms.NetworkMetricsCalled() + if sms.NetworkMetricsCalled != nil { + return sms.NetworkMetricsCalled() + } + return baseReturnValues() } // EconomicsMetrics - func (sms *StatusMetricsStub) EconomicsMetrics() (map[string]interface{}, error) { - return sms.EconomicsMetricsCalled() + if sms.EconomicsMetricsCalled != nil { + return sms.EconomicsMetricsCalled() + } + return baseReturnValues() } // StatusMetricsMapWithoutP2P - func (sms *StatusMetricsStub) StatusMetricsMapWithoutP2P() (map[string]interface{}, error) { - return sms.StatusMetricsMapWithoutP2PCalled() + if sms.StatusMetricsMapWithoutP2PCalled != nil { + return sms.StatusMetricsMapWithoutP2PCalled() + } + return baseReturnValues() } // StatusP2pMetricsMap - func (sms *StatusMetricsStub) StatusP2pMetricsMap() (map[string]interface{}, error) { - return sms.StatusP2pMetricsMapCalled() + if sms.StatusP2pMetricsMapCalled != nil { + return sms.StatusP2pMetricsMapCalled() + } + return baseReturnValues() } // EnableEpochsMetrics - func (sms *StatusMetricsStub) EnableEpochsMetrics() (map[string]interface{}, error) { - return sms.EnableEpochsMetricsCalled() + if sms.EnableEpochsMetricsCalled != nil { + return sms.EnableEpochsMetricsCalled() + } + return baseReturnValues() } -// RatingsConfig - +// RatingsMetrics - func (sms *StatusMetricsStub) RatingsMetrics() (map[string]interface{}, error) { - return sms.RatingsMetricsCalled() + if sms.RatingsMetricsCalled != nil { + return sms.RatingsMetricsCalled() + } + return baseReturnValues() +} + +func baseReturnValues() (map[string]interface{}, error) { + return make(map[string]interface{}), nil } // IsInterfaceNil - diff --git a/trie/statistics/disabled/trieStatisticsCollector.go b/trie/statistics/disabled/trieStatisticsCollector.go new file mode 100644 index 00000000000..ccce0718d37 --- /dev/null +++ b/trie/statistics/disabled/trieStatisticsCollector.go @@ -0,0 +1,19 @@ +package disabled + +import "github.com/ElrondNetwork/elrond-go/trie/statistics" + +type trieStatisticsCollector struct { +} + +// NewTrieStatisticsCollector returns a new instance of the disabled trieStatisticsCollector +func NewTrieStatisticsCollector() *trieStatisticsCollector { + return &trieStatisticsCollector{} +} + +// Add does nothing as it is disabled +func (t trieStatisticsCollector) Add(_ *statistics.TrieStatsDTO) { +} + +// UpdateMetricAndPrintStatistics does nothing as it is disabled +func (t trieStatisticsCollector) UpdateMetricAndPrintStatistics(_ string) { +} diff --git a/trie/statistics/trieStatisticsCollector.go b/trie/statistics/trieStatisticsCollector.go index ff45d044214..a1e1d996f03 100644 --- a/trie/statistics/trieStatisticsCollector.go +++ b/trie/statistics/trieStatisticsCollector.go @@ -5,6 +5,7 @@ import ( "strings" "github.com/ElrondNetwork/elrond-go-core/core" + "github.com/ElrondNetwork/elrond-go-core/core/check" logger "github.com/ElrondNetwork/elrond-go-logger" ) @@ -13,22 +14,28 @@ var log = logger.GetOrCreate("trieStatistics") const numTriesToPrint = 10 type trieStatisticsCollector struct { - numNodes uint64 - numDataTries uint64 - triesSize uint64 - triesBySize []*TrieStatsDTO - triesByDepth []*TrieStatsDTO + numNodes uint64 + numDataTries uint64 + triesSize uint64 + triesBySize []*TrieStatsDTO + triesByDepth []*TrieStatsDTO + appStatusHandler core.AppStatusHandler } // NewTrieStatisticsCollector creates a new instance of trieStatisticsCollector -func NewTrieStatisticsCollector() *trieStatisticsCollector { - return &trieStatisticsCollector{ - numNodes: 0, - numDataTries: 0, - triesSize: 0, - triesBySize: make([]*TrieStatsDTO, numTriesToPrint), - triesByDepth: make([]*TrieStatsDTO, numTriesToPrint), +func NewTrieStatisticsCollector(appStatusHandler core.AppStatusHandler) (*trieStatisticsCollector, error) { + if check.IfNil(appStatusHandler) { + return nil, core.ErrNilAppStatusHandler } + + return &trieStatisticsCollector{ + numNodes: 0, + numDataTries: 0, + triesSize: 0, + triesBySize: make([]*TrieStatsDTO, numTriesToPrint), + triesByDepth: make([]*TrieStatsDTO, numTriesToPrint), + appStatusHandler: appStatusHandler, + }, nil } // Add adds the given trie statistics to the statistics collector @@ -41,8 +48,10 @@ func (tsc *trieStatisticsCollector) Add(trieStats *TrieStatsDTO) { insertInSortedArray(tsc.triesByDepth, trieStats, isLessDeep) } -// Print will print all the collected statistics -func (tsc *trieStatisticsCollector) Print() { +// UpdateMetricAndPrintStatistics will update metric and print all the collected statistics +func (tsc *trieStatisticsCollector) UpdateMetricAndPrintStatistics(metric string) { + tsc.appStatusHandler.SetUInt64Value(metric, tsc.numNodes) + triesBySize := " \n top " + strconv.Itoa(numTriesToPrint) + " tries by size \n" triesByDepth := " \n top " + strconv.Itoa(numTriesToPrint) + " tries by depth \n" diff --git a/trie/statistics/trieStatisticsCollector_test.go b/trie/statistics/trieStatisticsCollector_test.go index 448e2430cd4..a0e0bfd0a48 100644 --- a/trie/statistics/trieStatisticsCollector_test.go +++ b/trie/statistics/trieStatisticsCollector_test.go @@ -5,13 +5,16 @@ import ( "sort" "testing" + "github.com/ElrondNetwork/elrond-go/common/disabled" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestSnapshotStatistics_AddTrieStats(t *testing.T) { t.Parallel() - tsc := NewTrieStatisticsCollector() + tsc, err := NewTrieStatisticsCollector(disabled.NewAppStatusHandler()) + require.Nil(t, err) numInserts := 100 for i := 0; i < numInserts; i++ { diff --git a/update/factory/accountDBSyncerContainerFactory.go b/update/factory/accountDBSyncerContainerFactory.go index a62e9b1327e..358b80c91db 100644 --- a/update/factory/accountDBSyncerContainerFactory.go +++ b/update/factory/accountDBSyncerContainerFactory.go @@ -168,17 +168,18 @@ func (a *accountDBSyncersContainerFactory) createUserAccountsSyncer(shardId uint func (a *accountDBSyncersContainerFactory) createValidatorAccountsSyncer(shardId uint32) error { args := syncer.ArgsNewValidatorAccountsSyncer{ ArgsNewBaseAccountsSyncer: syncer.ArgsNewBaseAccountsSyncer{ - Hasher: a.hasher, - Marshalizer: a.marshalizer, - TrieStorageManager: a.trieStorageManager, - RequestHandler: a.requestHandler, - Timeout: a.timeoutGettingTrieNode, - Cacher: a.trieCacher, - MaxTrieLevelInMemory: a.maxTrieLevelinMemory, - MaxHardCapForMissingNodes: a.maxHardCapForMissingNodes, - TrieSyncerVersion: a.trieSyncerVersion, - CheckNodesOnDisk: a.checkNodesOnDisk, - StorageMarker: storageMarker.NewTrieStorageMarker(), + Hasher: a.hasher, + Marshalizer: a.marshalizer, + TrieStorageManager: a.trieStorageManager, + RequestHandler: a.requestHandler, + Timeout: a.timeoutGettingTrieNode, + Cacher: a.trieCacher, + MaxTrieLevelInMemory: a.maxTrieLevelinMemory, + MaxHardCapForMissingNodes: a.maxHardCapForMissingNodes, + TrieSyncerVersion: a.trieSyncerVersion, + CheckNodesOnDisk: a.checkNodesOnDisk, + StorageMarker: storageMarker.NewTrieStorageMarker(), + UserAccountsSyncStatisticsHandler: statistics.NewTrieSyncStatistics(), }, } accountSyncer, err := syncer.NewValidatorAccountsSyncer(args) From a55e36fb0c514f9c831977c404a60f54ab6ec618 Mon Sep 17 00:00:00 2001 From: jules01 Date: Mon, 24 Oct 2022 15:48:28 +0300 Subject: [PATCH 078/110] - fixed concurrency issues on transaction simulator --- process/txsimulator/txSimulator.go | 5 ++++ process/txsimulator/txSimulator_test.go | 34 +++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/process/txsimulator/txSimulator.go b/process/txsimulator/txSimulator.go index 851ffea5e3d..cdf18b31b10 100644 --- a/process/txsimulator/txSimulator.go +++ b/process/txsimulator/txSimulator.go @@ -2,6 +2,7 @@ package txsimulator import ( "encoding/hex" + "sync" "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" @@ -30,6 +31,7 @@ type ArgsTxSimulator struct { } type transactionSimulator struct { + mutCriticalSection sync.Mutex txProcessor TransactionProcessor intermProcContainer process.IntermediateProcessorContainer addressPubKeyConverter core.PubkeyConverter @@ -76,6 +78,9 @@ func NewTransactionSimulator(args ArgsTxSimulator) (*transactionSimulator, error // ProcessTx will process the transaction in a special environment, where state-writing is not allowed func (ts *transactionSimulator) ProcessTx(tx *transaction.Transaction) (*txSimData.SimulationResults, error) { + ts.mutCriticalSection.Lock() + defer ts.mutCriticalSection.Unlock() + txStatus := transaction.TxStatusPending failReason := "" diff --git a/process/txsimulator/txSimulator_test.go b/process/txsimulator/txSimulator_test.go index 031093ecbe1..a79bdcfd56b 100644 --- a/process/txsimulator/txSimulator_test.go +++ b/process/txsimulator/txSimulator_test.go @@ -3,7 +3,9 @@ package txsimulator import ( "encoding/hex" "errors" + "sync" "testing" + "time" "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/data" @@ -18,6 +20,7 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" vmcommon "github.com/ElrondNetwork/elrond-vm-common" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -228,3 +231,34 @@ func getTxSimulatorArgs() ArgsTxSimulator { Hasher: &hashingMocks.HasherMock{}, } } + +func TestTransactionSimulator_ProcessTxConcurrentCalls(t *testing.T) { + t.Parallel() + + numTransactionProcessorCalls := 0 + args := getTxSimulatorArgs() + args.TransactionProcessor = &testscommon.TxProcessorStub{ + ProcessTransactionCalled: func(transaction *transaction.Transaction) (vmcommon.ReturnCode, error) { + // deliberately not used a mutex here as to catch race conditions + numTransactionProcessorCalls++ + + return vmcommon.Ok, nil + }, + } + txSimulator, _ := NewTransactionSimulator(args) + tx := &transaction.Transaction{Nonce: 37} + + numCalls := 100 + wg := sync.WaitGroup{} + wg.Add(numCalls) + for i := 0; i < numCalls; i++ { + go func(idx int) { + time.Sleep(time.Millisecond * 10) + _, _ = txSimulator.ProcessTx(tx) + wg.Done() + }(i) + } + + wg.Wait() + assert.Equal(t, numCalls, numTransactionProcessorCalls) +} From 755cf88314ee94717b47c8e2c1537568b260ffba Mon Sep 17 00:00:00 2001 From: jules01 Date: Mon, 24 Oct 2022 15:56:00 +0300 Subject: [PATCH 079/110] - renamed mutex --- process/txsimulator/txSimulator.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/process/txsimulator/txSimulator.go b/process/txsimulator/txSimulator.go index cdf18b31b10..7ada4477f6e 100644 --- a/process/txsimulator/txSimulator.go +++ b/process/txsimulator/txSimulator.go @@ -31,7 +31,7 @@ type ArgsTxSimulator struct { } type transactionSimulator struct { - mutCriticalSection sync.Mutex + mutOperation sync.Mutex txProcessor TransactionProcessor intermProcContainer process.IntermediateProcessorContainer addressPubKeyConverter core.PubkeyConverter @@ -78,8 +78,8 @@ func NewTransactionSimulator(args ArgsTxSimulator) (*transactionSimulator, error // ProcessTx will process the transaction in a special environment, where state-writing is not allowed func (ts *transactionSimulator) ProcessTx(tx *transaction.Transaction) (*txSimData.SimulationResults, error) { - ts.mutCriticalSection.Lock() - defer ts.mutCriticalSection.Unlock() + ts.mutOperation.Lock() + defer ts.mutOperation.Unlock() txStatus := transaction.TxStatusPending failReason := "" From 4110afef946e92945e8b831ac1516ca1b9abffca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Camil=20B=C4=83ncioiu?= Date: Mon, 24 Oct 2022 20:45:36 +0300 Subject: [PATCH 080/110] Replace wasm-vm with wasm-vm-v1_4 everywhere --- cmd/assessment/benchmarks/arwenBenchmark.go | 2 +- epochStart/metachain/systemSCs_test.go | 2 +- genesis/process/genesisBlockCreator_test.go | 2 +- go.mod | 2 +- go.sum | 4 ++-- .../multiShard/hardFork/hardFork_test.go | 2 +- .../state/stateTrieSync/stateTrieSync_test.go | 2 +- integrationTests/testInitializer.go | 2 +- integrationTests/testProcessorNode.go | 2 +- .../testProcessorNodeWithTestWebServer.go | 2 +- .../arwenvm/mandosConverter/mandosConverter.go | 4 ++-- .../mandosConverter/mandosConverterUtils.go | 4 ++-- integrationTests/vm/testInitializer.go | 2 +- integrationTests/vm/txsFee/scCalls_test.go | 2 +- .../factory/metachain/vmContainerFactory_test.go | 2 +- process/factory/shard/vmContainerFactory.go | 4 ++-- process/factory/shard/vmContainerFactory_test.go | 2 +- .../builtInFunctions/factory_test.go | 16 ++++++++-------- testscommon/components/components.go | 2 +- vm/factory/systemSCFactory_test.go | 2 +- 20 files changed, 31 insertions(+), 31 deletions(-) diff --git a/cmd/assessment/benchmarks/arwenBenchmark.go b/cmd/assessment/benchmarks/arwenBenchmark.go index 2762d48c854..4fdc1ba16d8 100644 --- a/cmd/assessment/benchmarks/arwenBenchmark.go +++ b/cmd/assessment/benchmarks/arwenBenchmark.go @@ -4,10 +4,10 @@ import ( "fmt" "time" - arwenConfig "github.com/ElrondNetwork/wasm-vm/config" "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go/integrationTests/vm/arwen/arwenvm" "github.com/ElrondNetwork/elrond-go/vm/systemSmartContracts/defaults" + arwenConfig "github.com/ElrondNetwork/wasm-vm-v1_4/config" ) // ArgArwenBenchmark is the Arwen type benchmark argument used in constructor diff --git a/epochStart/metachain/systemSCs_test.go b/epochStart/metachain/systemSCs_test.go index 13839c36f7f..65ba3df6deb 100644 --- a/epochStart/metachain/systemSCs_test.go +++ b/epochStart/metachain/systemSCs_test.go @@ -11,7 +11,6 @@ import ( "strconv" "testing" - arwenConfig "github.com/ElrondNetwork/wasm-vm/config" "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-core/data/block" @@ -56,6 +55,7 @@ import ( "github.com/ElrondNetwork/elrond-go/vm/systemSmartContracts/defaults" vmcommon "github.com/ElrondNetwork/elrond-vm-common" vmcommonBuiltInFunctions "github.com/ElrondNetwork/elrond-vm-common/builtInFunctions" + arwenConfig "github.com/ElrondNetwork/wasm-vm-v1_4/config" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/genesis/process/genesisBlockCreator_test.go b/genesis/process/genesisBlockCreator_test.go index cb9d3b19e98..b5df301bfcb 100644 --- a/genesis/process/genesisBlockCreator_test.go +++ b/genesis/process/genesisBlockCreator_test.go @@ -8,7 +8,6 @@ import ( "math/big" "testing" - arwenConfig "github.com/ElrondNetwork/wasm-vm/config" "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/config" @@ -34,6 +33,7 @@ import ( updateMock "github.com/ElrondNetwork/elrond-go/update/mock" "github.com/ElrondNetwork/elrond-go/vm/systemSmartContracts/defaults" vmcommon "github.com/ElrondNetwork/elrond-vm-common" + arwenConfig "github.com/ElrondNetwork/wasm-vm-v1_4/config" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/go.mod b/go.mod index 78bd4f4d9c7..81ec4d6a9b2 100644 --- a/go.mod +++ b/go.mod @@ -11,9 +11,9 @@ require ( github.com/ElrondNetwork/elrond-go-p2p v1.0.3 github.com/ElrondNetwork/elrond-go-storage v1.0.1 github.com/ElrondNetwork/elrond-vm-common v1.3.22 - github.com/ElrondNetwork/wasm-vm v1.4.59 github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.42 github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.42 + github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.62 github.com/beevik/ntp v0.3.0 github.com/davecgh/go-spew v1.1.1 github.com/elastic/go-elasticsearch/v7 v7.12.0 diff --git a/go.sum b/go.sum index 129d2c1cdbc..afedd06f7f5 100644 --- a/go.sum +++ b/go.sum @@ -81,12 +81,12 @@ github.com/ElrondNetwork/go-libp2p-pubsub v0.6.1-rc1 h1:Nu/uwYQg/QbfoQ0uD6GahYTw github.com/ElrondNetwork/go-libp2p-pubsub v0.6.1-rc1/go.mod h1:pJfaShe+i5aWZx8NhSkQjvOYQYLoqPztmFUlKjToOzM= github.com/ElrondNetwork/protobuf v1.3.2 h1:qoCSYiO+8GtXBEZWEjw0WPcZfM3g7QuuJrwpN+y6Mvg= github.com/ElrondNetwork/protobuf v1.3.2/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/ElrondNetwork/wasm-vm v1.4.59 h1:7TO0R+kpkCU375Pwtw0jBlkcSoakmGSyh2U6+Aob9L0= -github.com/ElrondNetwork/wasm-vm v1.4.59/go.mod h1:NopwtkceMs1N5esbLzhMU49487XdEMAqaRnVIlQ72QY= github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.42 h1:szZcuaxPElmLvYRezR4YayPDqRxDMCWspknhtSHJQyo= github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.42/go.mod h1:d1Pirw0GnD4Eh5lhBvX9Bn+N1AHb/FzRVKZSHwWwJLg= github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.42 h1:EhLjiR/MnWSuLW3xtWh69oBZ4zAsym/QrhGKsVWwJjw= github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.42/go.mod h1:7JeSIgpcCxKiD67iSjnlBQt7qIQf+oSuehtBQp0QgVM= +github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.62 h1:XZAF3CEMfs9Ct+aXV2IKBtxg7DGl5PMqp8yaBk6NriU= +github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.62/go.mod h1:BtjngiK7DLyACe/hNM6aHIStmQtYi9eBnvZiFxrys2o= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= diff --git a/integrationTests/multiShard/hardFork/hardFork_test.go b/integrationTests/multiShard/hardFork/hardFork_test.go index f8b7e64c84f..5495ce75e24 100644 --- a/integrationTests/multiShard/hardFork/hardFork_test.go +++ b/integrationTests/multiShard/hardFork/hardFork_test.go @@ -10,7 +10,6 @@ import ( "testing" "time" - arwenConfig "github.com/ElrondNetwork/wasm-vm/config" "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/data/block" logger "github.com/ElrondNetwork/elrond-go-logger" @@ -26,6 +25,7 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon/genesisMocks" "github.com/ElrondNetwork/elrond-go/update/factory" "github.com/ElrondNetwork/elrond-go/vm/systemSmartContracts/defaults" + arwenConfig "github.com/ElrondNetwork/wasm-vm-v1_4/config" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/integrationTests/state/stateTrieSync/stateTrieSync_test.go b/integrationTests/state/stateTrieSync/stateTrieSync_test.go index 10aebc4e5bc..4322f205304 100644 --- a/integrationTests/state/stateTrieSync/stateTrieSync_test.go +++ b/integrationTests/state/stateTrieSync/stateTrieSync_test.go @@ -26,7 +26,7 @@ import ( "github.com/ElrondNetwork/elrond-go/trie/statistics" "github.com/ElrondNetwork/elrond-go/trie/storageMarker" "github.com/ElrondNetwork/elrond-go/vm/systemSmartContracts/defaults" - arwenConfig "github.com/ElrondNetwork/wasm-vm/config" + arwenConfig "github.com/ElrondNetwork/wasm-vm-v1_4/config" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/integrationTests/testInitializer.go b/integrationTests/testInitializer.go index 54500bf6ff8..6ee0c2c2fd8 100644 --- a/integrationTests/testInitializer.go +++ b/integrationTests/testInitializer.go @@ -13,7 +13,6 @@ import ( "testing" "time" - arwenConfig "github.com/ElrondNetwork/wasm-vm/config" "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-core/data" @@ -66,6 +65,7 @@ import ( "github.com/ElrondNetwork/elrond-go/vm" "github.com/ElrondNetwork/elrond-go/vm/systemSmartContracts" "github.com/ElrondNetwork/elrond-go/vm/systemSmartContracts/defaults" + arwenConfig "github.com/ElrondNetwork/wasm-vm-v1_4/config" "github.com/pkg/errors" "github.com/stretchr/testify/assert" ) diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index 1c445039979..e10e6a5ce99 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -117,7 +117,7 @@ import ( "github.com/ElrondNetwork/elrond-go/vm/systemSmartContracts/defaults" vmcommon "github.com/ElrondNetwork/elrond-vm-common" "github.com/ElrondNetwork/elrond-vm-common/parsers" - arwenConfig "github.com/ElrondNetwork/wasm-vm/config" + arwenConfig "github.com/ElrondNetwork/wasm-vm-v1_4/config" ) var zero = big.NewInt(0) diff --git a/integrationTests/testProcessorNodeWithTestWebServer.go b/integrationTests/testProcessorNodeWithTestWebServer.go index 7ee1a800eb5..555c096a172 100644 --- a/integrationTests/testProcessorNodeWithTestWebServer.go +++ b/integrationTests/testProcessorNodeWithTestWebServer.go @@ -5,7 +5,6 @@ import ( "net/http/httptest" "sync" - arwenConfig "github.com/ElrondNetwork/wasm-vm/config" dataTransaction "github.com/ElrondNetwork/elrond-go-core/data/transaction" "github.com/ElrondNetwork/elrond-go/api/groups" "github.com/ElrondNetwork/elrond-go/api/shared" @@ -28,6 +27,7 @@ import ( "github.com/ElrondNetwork/elrond-go/vm/systemSmartContracts/defaults" "github.com/ElrondNetwork/elrond-vm-common/parsers" datafield "github.com/ElrondNetwork/elrond-vm-common/parsers/dataField" + arwenConfig "github.com/ElrondNetwork/wasm-vm-v1_4/config" "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" ) diff --git a/integrationTests/vm/arwen/arwenvm/mandosConverter/mandosConverter.go b/integrationTests/vm/arwen/arwenvm/mandosConverter/mandosConverter.go index 92dfeb745bc..e0aab5d0491 100644 --- a/integrationTests/vm/arwen/arwenvm/mandosConverter/mandosConverter.go +++ b/integrationTests/vm/arwen/arwenvm/mandosConverter/mandosConverter.go @@ -5,14 +5,14 @@ import ( "errors" "math/big" - mge "github.com/ElrondNetwork/wasm-vm/mandos-go/elrondgo-exporter" - mgutil "github.com/ElrondNetwork/wasm-vm/mandos-go/util" "github.com/ElrondNetwork/elrond-go-core/data/transaction" "github.com/ElrondNetwork/elrond-go/integrationTests/vm" "github.com/ElrondNetwork/elrond-go/process/factory" "github.com/ElrondNetwork/elrond-go/state" "github.com/ElrondNetwork/elrond-go/testscommon/txDataBuilder" vmcommon "github.com/ElrondNetwork/elrond-vm-common" + mge "github.com/ElrondNetwork/wasm-vm-v1_4/mandos-go/elrondgo-exporter" + mgutil "github.com/ElrondNetwork/wasm-vm-v1_4/mandos-go/util" ) var errReturnCodeNotOk = errors.New("returnCode is not 0(Ok)") diff --git a/integrationTests/vm/arwen/arwenvm/mandosConverter/mandosConverterUtils.go b/integrationTests/vm/arwen/arwenvm/mandosConverter/mandosConverterUtils.go index b7a7c21a06f..b34d7375761 100644 --- a/integrationTests/vm/arwen/arwenvm/mandosConverter/mandosConverterUtils.go +++ b/integrationTests/vm/arwen/arwenvm/mandosConverter/mandosConverterUtils.go @@ -3,9 +3,9 @@ package mandosConverter import ( "testing" - mge "github.com/ElrondNetwork/wasm-vm/mandos-go/elrondgo-exporter" - mgutil "github.com/ElrondNetwork/wasm-vm/mandos-go/util" "github.com/ElrondNetwork/elrond-go/config" + mge "github.com/ElrondNetwork/wasm-vm-v1_4/mandos-go/elrondgo-exporter" + mgutil "github.com/ElrondNetwork/wasm-vm-v1_4/mandos-go/util" "github.com/ElrondNetwork/elrond-go-core/data/transaction" logger "github.com/ElrondNetwork/elrond-go-logger" diff --git a/integrationTests/vm/testInitializer.go b/integrationTests/vm/testInitializer.go index dd00ffea71c..329c8649eca 100644 --- a/integrationTests/vm/testInitializer.go +++ b/integrationTests/vm/testInitializer.go @@ -10,7 +10,6 @@ import ( "sync" "testing" - arwenConfig "github.com/ElrondNetwork/wasm-vm/config" "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-core/core/pubkeyConverter" @@ -67,6 +66,7 @@ import ( vmcommon "github.com/ElrondNetwork/elrond-vm-common" vmcommonBuiltInFunctions "github.com/ElrondNetwork/elrond-vm-common/builtInFunctions" "github.com/ElrondNetwork/elrond-vm-common/parsers" + arwenConfig "github.com/ElrondNetwork/wasm-vm-v1_4/config" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/integrationTests/vm/txsFee/scCalls_test.go b/integrationTests/vm/txsFee/scCalls_test.go index c399efd7c27..eae2e900728 100644 --- a/integrationTests/vm/txsFee/scCalls_test.go +++ b/integrationTests/vm/txsFee/scCalls_test.go @@ -10,7 +10,6 @@ import ( "math/big" "testing" - arwenConfig "github.com/ElrondNetwork/wasm-vm/config" "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/data/block" "github.com/ElrondNetwork/elrond-go/config" @@ -21,6 +20,7 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon/txDataBuilder" "github.com/ElrondNetwork/elrond-go/vm/systemSmartContracts/defaults" vmcommon "github.com/ElrondNetwork/elrond-vm-common" + arwenConfig "github.com/ElrondNetwork/wasm-vm-v1_4/config" "github.com/stretchr/testify/require" ) diff --git a/process/factory/metachain/vmContainerFactory_test.go b/process/factory/metachain/vmContainerFactory_test.go index a3700530d4f..581337a787a 100644 --- a/process/factory/metachain/vmContainerFactory_test.go +++ b/process/factory/metachain/vmContainerFactory_test.go @@ -4,7 +4,6 @@ import ( "errors" "testing" - arwenConfig "github.com/ElrondNetwork/wasm-vm/config" "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go/common" @@ -19,6 +18,7 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" "github.com/ElrondNetwork/elrond-go/vm" + arwenConfig "github.com/ElrondNetwork/wasm-vm-v1_4/config" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/process/factory/shard/vmContainerFactory.go b/process/factory/shard/vmContainerFactory.go index a245a5901ca..1e7e77678e7 100644 --- a/process/factory/shard/vmContainerFactory.go +++ b/process/factory/shard/vmContainerFactory.go @@ -5,8 +5,6 @@ import ( "io" "sort" - arwen14 "github.com/ElrondNetwork/wasm-vm/arwen" - arwenHost14 "github.com/ElrondNetwork/wasm-vm/arwen/host" "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" logger "github.com/ElrondNetwork/elrond-go-logger" @@ -21,6 +19,8 @@ import ( arwenHost12 "github.com/ElrondNetwork/wasm-vm-v1_2/arwen/host" arwen13 "github.com/ElrondNetwork/wasm-vm-v1_3/arwen" arwenHost13 "github.com/ElrondNetwork/wasm-vm-v1_3/arwen/host" + arwen14 "github.com/ElrondNetwork/wasm-vm-v1_4/arwen" + arwenHost14 "github.com/ElrondNetwork/wasm-vm-v1_4/arwen/host" ) var _ process.VirtualMachinesContainerFactory = (*vmContainerFactory)(nil) diff --git a/process/factory/shard/vmContainerFactory_test.go b/process/factory/shard/vmContainerFactory_test.go index c97b07f925f..394169a7037 100644 --- a/process/factory/shard/vmContainerFactory_test.go +++ b/process/factory/shard/vmContainerFactory_test.go @@ -4,7 +4,6 @@ import ( "sync" "testing" - arwenConfig "github.com/ElrondNetwork/wasm-vm/config" "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/data" "github.com/ElrondNetwork/elrond-go/common/forking" @@ -17,6 +16,7 @@ import ( vmcommonBuiltInFunctions "github.com/ElrondNetwork/elrond-vm-common/builtInFunctions" "github.com/ElrondNetwork/elrond-vm-common/parsers" ipcNodePart1p2 "github.com/ElrondNetwork/wasm-vm-v1_2/ipc/nodepart" + arwenConfig "github.com/ElrondNetwork/wasm-vm-v1_4/config" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/process/smartContract/builtInFunctions/factory_test.go b/process/smartContract/builtInFunctions/factory_test.go index ab991d0bb4b..05cd5cb7128 100644 --- a/process/smartContract/builtInFunctions/factory_test.go +++ b/process/smartContract/builtInFunctions/factory_test.go @@ -24,14 +24,14 @@ func createMockArguments() ArgsCreateBuiltInFunctionContainer { gasScheduleNotifier := testscommon.NewGasScheduleNotifierMock(gasMap) args := ArgsCreateBuiltInFunctionContainer{ - GasSchedule: gasScheduleNotifier, - MapDNSAddresses: make(map[string]struct{}), - EnableUserNameChange: false, - Marshalizer: &mock.MarshalizerMock{}, - Accounts: &stateMock.AccountsStub{}, - ShardCoordinator: mock.NewMultiShardsCoordinatorMock(1), - EpochNotifier: &epochNotifier.EpochNotifierStub{}, - EnableEpochsHandler: &testscommon.EnableEpochsHandlerStub{}, + GasSchedule: gasScheduleNotifier, + MapDNSAddresses: make(map[string]struct{}), + EnableUserNameChange: false, + Marshalizer: &mock.MarshalizerMock{}, + Accounts: &stateMock.AccountsStub{}, + ShardCoordinator: mock.NewMultiShardsCoordinatorMock(1), + EpochNotifier: &epochNotifier.EpochNotifierStub{}, + EnableEpochsHandler: &testscommon.EnableEpochsHandlerStub{}, AutomaticCrawlerAddresses: [][]byte{ bytes.Repeat([]byte{1}, 32), }, diff --git a/testscommon/components/components.go b/testscommon/components/components.go index 2b73d50d6d6..66016b918fb 100644 --- a/testscommon/components/components.go +++ b/testscommon/components/components.go @@ -42,7 +42,7 @@ import ( "github.com/ElrondNetwork/elrond-go/trie" trieFactory "github.com/ElrondNetwork/elrond-go/trie/factory" "github.com/ElrondNetwork/elrond-go/trie/hashesHolder" - arwenConfig "github.com/ElrondNetwork/wasm-vm/config" + arwenConfig "github.com/ElrondNetwork/wasm-vm-v1_4/config" "github.com/stretchr/testify/require" ) diff --git a/vm/factory/systemSCFactory_test.go b/vm/factory/systemSCFactory_test.go index e41b61e3985..c9c009b730e 100644 --- a/vm/factory/systemSCFactory_test.go +++ b/vm/factory/systemSCFactory_test.go @@ -5,7 +5,6 @@ import ( "fmt" "testing" - arwenConfig "github.com/ElrondNetwork/wasm-vm/config" "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/config" @@ -14,6 +13,7 @@ import ( "github.com/ElrondNetwork/elrond-go/vm" "github.com/ElrondNetwork/elrond-go/vm/mock" "github.com/ElrondNetwork/elrond-go/vm/systemSmartContracts/defaults" + arwenConfig "github.com/ElrondNetwork/wasm-vm-v1_4/config" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) From fe928576392a8f988ee6611c7495c6a67668c162 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Camil=20B=C4=83ncioiu?= Date: Mon, 24 Oct 2022 20:46:33 +0300 Subject: [PATCH 081/110] Add go build race flags --- .../vm/arwen/delegation/delegationSimulation_test.go | 1 + integrationTests/vm/arwen/erc20/erc20_test.go | 1 + integrationTests/vm/arwen/upgrades/upgrades_test.go | 1 + 3 files changed, 3 insertions(+) diff --git a/integrationTests/vm/arwen/delegation/delegationSimulation_test.go b/integrationTests/vm/arwen/delegation/delegationSimulation_test.go index 9b88e97be5e..642a4c21d25 100644 --- a/integrationTests/vm/arwen/delegation/delegationSimulation_test.go +++ b/integrationTests/vm/arwen/delegation/delegationSimulation_test.go @@ -1,3 +1,4 @@ +//go:build !race // +build !race package delegation diff --git a/integrationTests/vm/arwen/erc20/erc20_test.go b/integrationTests/vm/arwen/erc20/erc20_test.go index ba286a679ee..acc9fbf0863 100644 --- a/integrationTests/vm/arwen/erc20/erc20_test.go +++ b/integrationTests/vm/arwen/erc20/erc20_test.go @@ -1,3 +1,4 @@ +//go:build !race // +build !race package erc20 diff --git a/integrationTests/vm/arwen/upgrades/upgrades_test.go b/integrationTests/vm/arwen/upgrades/upgrades_test.go index 1b17b7a9ed8..b1c5b5e6889 100644 --- a/integrationTests/vm/arwen/upgrades/upgrades_test.go +++ b/integrationTests/vm/arwen/upgrades/upgrades_test.go @@ -1,3 +1,4 @@ +//go:build !race // +build !race // TODO remove build condition above to allow -race -short, after Arwen fix From e665b2ddac918ab44a1a3fb202df882d808c38b4 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 24 Oct 2022 20:50:14 +0300 Subject: [PATCH 082/110] fixes after testing - set metric only when snapshot is done --- common/constants.go | 4 +- common/interface.go | 3 +- node/metrics/metrics.go | 2 +- node/metrics/metrics_test.go | 2 +- .../metricsLoader/loadPersistentMetrics.go | 2 +- state/accountsDB.go | 17 ++++---- state/accountsDB_test.go | 2 +- state/peerAccountsDB.go | 5 +-- state/snapshotStatistics.go | 20 ++++----- state/snapshotStatistics_test.go | 5 +-- statusHandler/persister/persistentHandler.go | 2 +- .../disabled/trieStatisticsCollector.go | 19 --------- trie/statistics/trieStatisticsCollector.go | 42 +++++++++---------- .../trieStatisticsCollector_test.go | 6 +-- 14 files changed, 48 insertions(+), 83 deletions(-) delete mode 100644 trie/statistics/disabled/trieStatisticsCollector.go diff --git a/common/constants.go b/common/constants.go index 4f8d7310941..2c6f7c512fe 100644 --- a/common/constants.go +++ b/common/constants.go @@ -826,5 +826,5 @@ const MetricLastPeersSnapshotDurationSec = "erd_peers_snapshot_last_duration_in_ // GenesisStorageSuffix defines the storage suffix used for genesis altered data const GenesisStorageSuffix = "_genesis" -// MetricNumSnapshotNodes is the metric that outputs the number of trie nodes written after snapshot -const MetricNumSnapshotNodes = "erd_num_snapshot_nodes" +// MetricAccountsSnapshotNumNodes is the metric that outputs the number of trie nodes written for accounts after snapshot +const MetricAccountsSnapshotNumNodes = "erd_accounts_snapshot_num_nodes" diff --git a/common/interface.go b/common/interface.go index ba278f307a8..ce11bbe1177 100644 --- a/common/interface.go +++ b/common/interface.go @@ -168,7 +168,8 @@ type TrieStatisticsHandler interface { // TriesStatisticsCollector is used to merge the statistics for multiple tries type TriesStatisticsCollector interface { Add(trieStats *statistics.TrieStatsDTO) - UpdateMetricAndPrintStatistics(metric string) + Print() + GetNumNodes() uint64 } // ProcessStatusHandler defines the behavior of a component able to hold the current status of the node and diff --git a/node/metrics/metrics.go b/node/metrics/metrics.go index 44ddc9f88b7..7514630be87 100644 --- a/node/metrics/metrics.go +++ b/node/metrics/metrics.go @@ -51,7 +51,7 @@ func InitBaseMetrics(statusHandlerUtils StatusHandlersUtils) error { appStatusHandler.SetUInt64Value(common.MetricNoncesPassedInCurrentEpoch, initUint) appStatusHandler.SetUInt64Value(common.MetricNumConnectedPeers, initUint) appStatusHandler.SetUInt64Value(common.MetricEpochForEconomicsData, initUint) - appStatusHandler.SetUInt64Value(common.MetricNumSnapshotNodes, initUint) + appStatusHandler.SetUInt64Value(common.MetricAccountsSnapshotNumNodes, initUint) appStatusHandler.SetInt64Value(common.MetricLastAccountsSnapshotDurationSec, initInt) appStatusHandler.SetInt64Value(common.MetricLastPeersSnapshotDurationSec, initInt) diff --git a/node/metrics/metrics_test.go b/node/metrics/metrics_test.go index accc7c6460a..7d9d5487711 100644 --- a/node/metrics/metrics_test.go +++ b/node/metrics/metrics_test.go @@ -58,7 +58,7 @@ func TestInitBaseMetrics(t *testing.T) { common.MetricLastAccountsSnapshotDurationSec, common.MetricPeersSnapshotInProgress, common.MetricLastPeersSnapshotDurationSec, - common.MetricNumSnapshotNodes, + common.MetricAccountsSnapshotNumNodes, } keys := make(map[string]struct{}) diff --git a/process/sync/storageBootstrap/metricsLoader/loadPersistentMetrics.go b/process/sync/storageBootstrap/metricsLoader/loadPersistentMetrics.go index 9a089261ba4..d8cf57bb947 100644 --- a/process/sync/storageBootstrap/metricsLoader/loadPersistentMetrics.go +++ b/process/sync/storageBootstrap/metricsLoader/loadPersistentMetrics.go @@ -110,7 +110,7 @@ func prepareMetricMaps(metricsMap map[string]interface{}) (map[string]uint64, ma stringMap[common.MetricTotalFees] = persister.GetString(metricsMap[common.MetricTotalFees]) stringMap[common.MetricDevRewardsInEpoch] = persister.GetString(metricsMap[common.MetricDevRewardsInEpoch]) stringMap[common.MetricInflation] = persister.GetString(metricsMap[common.MetricInflation]) - uint64Map[common.MetricNumSnapshotNodes] = persister.GetUint64(metricsMap[common.MetricNumSnapshotNodes]) + uint64Map[common.MetricAccountsSnapshotNumNodes] = persister.GetUint64(metricsMap[common.MetricAccountsSnapshotNumNodes]) return uint64Map, stringMap } diff --git a/state/accountsDB.go b/state/accountsDB.go index 97d9e226ea3..2596b3a4248 100644 --- a/state/accountsDB.go +++ b/state/accountsDB.go @@ -22,7 +22,6 @@ import ( "github.com/ElrondNetwork/elrond-go/errors" "github.com/ElrondNetwork/elrond-go/trie/keyBuilder" "github.com/ElrondNetwork/elrond-go/trie/statistics" - "github.com/ElrondNetwork/elrond-go/trie/statistics/disabled" vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) @@ -1140,7 +1139,7 @@ func (adb *AccountsDB) SnapshotState(rootHash []byte) { LeavesChan: make(chan core.KeyValueHolder, leavesChannelSize), ErrChan: make(chan error, 1), } - stats := newSnapshotStatistics(1, 1, adb.appStatusHandler) + stats := newSnapshotStatistics(1, 1) accountMetrics := &accountMetrics{ snapshotInProgressKey: common.MetricAccountsSnapshotInProgress, @@ -1240,6 +1239,9 @@ func (adb *AccountsDB) updateMetricsOnSnapshotStart(metrics *accountMetrics) { func (adb *AccountsDB) updateMetricsOnSnapshotCompletion(metrics *accountMetrics, stats *snapshotStatistics) { adb.appStatusHandler.SetStringValue(metrics.snapshotInProgressKey, "false") adb.appStatusHandler.SetInt64Value(metrics.lastSnapshotDurationKey, stats.GetSnapshotDuration()) + if metrics.snapshotMessage == userTrieSnapshotMsg { + adb.appStatusHandler.SetUInt64Value(common.MetricAccountsSnapshotNumNodes, stats.GetSnapshotNumNodes()) + } } func (adb *AccountsDB) processSnapshotCompletion( @@ -1363,7 +1365,7 @@ func (adb *AccountsDB) setStateCheckpoint(rootHash []byte) { ErrChan: make(chan error, 1), } missingNodesChannel := make(chan []byte, missingNodesChannelSize) - stats := newSnapshotStatistics(1, 1, adb.appStatusHandler) + stats := newSnapshotStatistics(1, 1) go func() { stats.NewSnapshotStarted() @@ -1415,12 +1417,7 @@ func (adb *AccountsDB) Close() error { // GetStatsForRootHash will get trie statistics for the given rootHash func (adb *AccountsDB) GetStatsForRootHash(rootHash []byte) (common.TriesStatisticsCollector, error) { - var stats common.TriesStatisticsCollector - stats, err := statistics.NewTrieStatisticsCollector(adb.appStatusHandler) - if err != nil { - stats = disabled.NewTrieStatisticsCollector() - log.Error("could not create trie statistics collector, using a disabled one...", "error", err) - } + stats := statistics.NewTrieStatisticsCollector() mainTrie := adb.getMainTrie() @@ -1435,7 +1432,7 @@ func (adb *AccountsDB) GetStatsForRootHash(rootHash []byte) (common.TriesStatist LeavesChan: make(chan core.KeyValueHolder, leavesChannelSize), ErrChan: make(chan error, 1), } - err = mainTrie.GetAllLeavesOnChannel(iteratorChannels, context.Background(), rootHash, keyBuilder.NewDisabledKeyBuilder()) + err := mainTrie.GetAllLeavesOnChannel(iteratorChannels, context.Background(), rootHash, keyBuilder.NewDisabledKeyBuilder()) if err != nil { return nil, err } diff --git a/state/accountsDB_test.go b/state/accountsDB_test.go index 300948f150f..a091883c1fd 100644 --- a/state/accountsDB_test.go +++ b/state/accountsDB_test.go @@ -2767,7 +2767,7 @@ func TestAccountsDB_PrintStatsForRootHash(t *testing.T) { assert.Nil(t, err) assert.NotNil(t, stats) - stats.UpdateMetricAndPrintStatistics("") + stats.Print() } func addDataTries(accountsAddresses [][]byte, adb *state.AccountsDB) { diff --git a/state/peerAccountsDB.go b/state/peerAccountsDB.go index 692d0b21650..c752898c131 100644 --- a/state/peerAccountsDB.go +++ b/state/peerAccountsDB.go @@ -2,7 +2,6 @@ package state import ( "github.com/ElrondNetwork/elrond-go/common" - "github.com/ElrondNetwork/elrond-go/common/disabled" ) // PeerAccountsDB will save and synchronize data from peer processor, plus will synchronize with nodesCoordinator @@ -59,7 +58,7 @@ func (adb *PeerAccountsDB) SnapshotState(rootHash []byte) { LeavesChan: nil, ErrChan: make(chan error, 1), } - stats := newSnapshotStatistics(0, 1, disabled.NewAppStatusHandler()) + stats := newSnapshotStatistics(0, 1) stats.NewSnapshotStarted() peerAccountsMetrics := &accountMetrics{ @@ -87,7 +86,7 @@ func (adb *PeerAccountsDB) SetStateCheckpoint(rootHash []byte) { trieStorageManager := adb.mainTrie.GetStorageManager() missingNodesChannel := make(chan []byte, missingNodesChannelSize) - stats := newSnapshotStatistics(0, 1, disabled.NewAppStatusHandler()) + stats := newSnapshotStatistics(0, 1) trieStorageManager.EnterPruningBufferingMode() stats.NewSnapshotStarted() diff --git a/state/snapshotStatistics.go b/state/snapshotStatistics.go index b1aa26f95f6..eb5c44d5e2f 100644 --- a/state/snapshotStatistics.go +++ b/state/snapshotStatistics.go @@ -4,10 +4,8 @@ import ( "sync" "time" - "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/trie/statistics" - "github.com/ElrondNetwork/elrond-go/trie/statistics/disabled" ) type snapshotStatistics struct { @@ -20,25 +18,18 @@ type snapshotStatistics struct { mutex sync.RWMutex } -func newSnapshotStatistics(snapshotDelta int, syncDelta int, appStatusHandler core.AppStatusHandler) *snapshotStatistics { +func newSnapshotStatistics(snapshotDelta int, syncDelta int) *snapshotStatistics { wgSnapshot := &sync.WaitGroup{} wgSnapshot.Add(snapshotDelta) wgSync := &sync.WaitGroup{} wgSync.Add(syncDelta) - var statisticsCollector common.TriesStatisticsCollector - statisticsCollector, err := statistics.NewTrieStatisticsCollector(appStatusHandler) - if err != nil { - statisticsCollector = disabled.NewTrieStatisticsCollector() - log.Error("could not create trie statistics collector, using a disabled one...", "error", err) - } - return &snapshotStatistics{ wgSnapshot: wgSnapshot, wgSync: wgSync, startTime: time.Now(), - trieStatisticsCollector: statisticsCollector, + trieStatisticsCollector: statistics.NewTrieStatisticsCollector(), } } @@ -91,5 +82,10 @@ func (ss *snapshotStatistics) PrintStats(identifier string, rootHash []byte) { "duration", time.Since(ss.startTime).Truncate(time.Second), "rootHash", rootHash, ) - ss.trieStatisticsCollector.UpdateMetricAndPrintStatistics(common.MetricNumSnapshotNodes) + ss.trieStatisticsCollector.Print() +} + +// GetSnapshotNumNodes returns the number of nodes from the snapshot +func (ss *snapshotStatistics) GetSnapshotNumNodes() uint64 { + return ss.trieStatisticsCollector.GetNumNodes() } diff --git a/state/snapshotStatistics_test.go b/state/snapshotStatistics_test.go index f35641f61bd..3ff7a9da4dd 100644 --- a/state/snapshotStatistics_test.go +++ b/state/snapshotStatistics_test.go @@ -5,17 +5,14 @@ import ( "testing" "github.com/ElrondNetwork/elrond-go/common" - "github.com/ElrondNetwork/elrond-go/testscommon/statusHandler" "github.com/ElrondNetwork/elrond-go/trie/statistics" - "github.com/stretchr/testify/require" ) func TestSnapshotStatistics_Concurrency(t *testing.T) { t.Parallel() wg := &sync.WaitGroup{} - stats, err := statistics.NewTrieStatisticsCollector(&statusHandler.AppStatusHandlerStub{}) - require.Nil(t, err) + stats := statistics.NewTrieStatisticsCollector() ss := &snapshotStatistics{ wgSnapshot: wg, trieStatisticsCollector: stats, diff --git a/statusHandler/persister/persistentHandler.go b/statusHandler/persister/persistentHandler.go index 67ca60a6f34..25b98b32f06 100644 --- a/statusHandler/persister/persistentHandler.go +++ b/statusHandler/persister/persistentHandler.go @@ -66,7 +66,7 @@ func (psh *PersistentStatusHandler) initMap() { psh.persistentMetrics.Store(common.MetricDevRewardsInEpoch, zeroString) psh.persistentMetrics.Store(common.MetricInflation, zeroString) psh.persistentMetrics.Store(common.MetricEpochForEconomicsData, initUint) - psh.persistentMetrics.Store(common.MetricNumSnapshotNodes, initUint) + psh.persistentMetrics.Store(common.MetricAccountsSnapshotNumNodes, initUint) } // SetStorage will set storage for persistent status handler diff --git a/trie/statistics/disabled/trieStatisticsCollector.go b/trie/statistics/disabled/trieStatisticsCollector.go deleted file mode 100644 index ccce0718d37..00000000000 --- a/trie/statistics/disabled/trieStatisticsCollector.go +++ /dev/null @@ -1,19 +0,0 @@ -package disabled - -import "github.com/ElrondNetwork/elrond-go/trie/statistics" - -type trieStatisticsCollector struct { -} - -// NewTrieStatisticsCollector returns a new instance of the disabled trieStatisticsCollector -func NewTrieStatisticsCollector() *trieStatisticsCollector { - return &trieStatisticsCollector{} -} - -// Add does nothing as it is disabled -func (t trieStatisticsCollector) Add(_ *statistics.TrieStatsDTO) { -} - -// UpdateMetricAndPrintStatistics does nothing as it is disabled -func (t trieStatisticsCollector) UpdateMetricAndPrintStatistics(_ string) { -} diff --git a/trie/statistics/trieStatisticsCollector.go b/trie/statistics/trieStatisticsCollector.go index a1e1d996f03..8be036e37e4 100644 --- a/trie/statistics/trieStatisticsCollector.go +++ b/trie/statistics/trieStatisticsCollector.go @@ -5,7 +5,6 @@ import ( "strings" "github.com/ElrondNetwork/elrond-go-core/core" - "github.com/ElrondNetwork/elrond-go-core/core/check" logger "github.com/ElrondNetwork/elrond-go-logger" ) @@ -14,28 +13,22 @@ var log = logger.GetOrCreate("trieStatistics") const numTriesToPrint = 10 type trieStatisticsCollector struct { - numNodes uint64 - numDataTries uint64 - triesSize uint64 - triesBySize []*TrieStatsDTO - triesByDepth []*TrieStatsDTO - appStatusHandler core.AppStatusHandler + numNodes uint64 + numDataTries uint64 + triesSize uint64 + triesBySize []*TrieStatsDTO + triesByDepth []*TrieStatsDTO } // NewTrieStatisticsCollector creates a new instance of trieStatisticsCollector -func NewTrieStatisticsCollector(appStatusHandler core.AppStatusHandler) (*trieStatisticsCollector, error) { - if check.IfNil(appStatusHandler) { - return nil, core.ErrNilAppStatusHandler - } - +func NewTrieStatisticsCollector() *trieStatisticsCollector { return &trieStatisticsCollector{ - numNodes: 0, - numDataTries: 0, - triesSize: 0, - triesBySize: make([]*TrieStatsDTO, numTriesToPrint), - triesByDepth: make([]*TrieStatsDTO, numTriesToPrint), - appStatusHandler: appStatusHandler, - }, nil + numNodes: 0, + numDataTries: 0, + triesSize: 0, + triesBySize: make([]*TrieStatsDTO, numTriesToPrint), + triesByDepth: make([]*TrieStatsDTO, numTriesToPrint), + } } // Add adds the given trie statistics to the statistics collector @@ -48,10 +41,8 @@ func (tsc *trieStatisticsCollector) Add(trieStats *TrieStatsDTO) { insertInSortedArray(tsc.triesByDepth, trieStats, isLessDeep) } -// UpdateMetricAndPrintStatistics will update metric and print all the collected statistics -func (tsc *trieStatisticsCollector) UpdateMetricAndPrintStatistics(metric string) { - tsc.appStatusHandler.SetUInt64Value(metric, tsc.numNodes) - +// Print will print all the collected statistics +func (tsc *trieStatisticsCollector) Print() { triesBySize := " \n top " + strconv.Itoa(numTriesToPrint) + " tries by size \n" triesByDepth := " \n top " + strconv.Itoa(numTriesToPrint) + " tries by depth \n" @@ -64,6 +55,11 @@ func (tsc *trieStatisticsCollector) UpdateMetricAndPrintStatistics(metric string ) } +// GetNumNodes returns the number of nodes +func (tsc *trieStatisticsCollector) GetNumNodes() uint64 { + return tsc.numNodes +} + func getOrderedTries(tries []*TrieStatsDTO) string { triesStats := make([]string, 0) for i := 0; i < len(tries); i++ { diff --git a/trie/statistics/trieStatisticsCollector_test.go b/trie/statistics/trieStatisticsCollector_test.go index a0e0bfd0a48..ce81bc7aecb 100644 --- a/trie/statistics/trieStatisticsCollector_test.go +++ b/trie/statistics/trieStatisticsCollector_test.go @@ -5,16 +5,13 @@ import ( "sort" "testing" - "github.com/ElrondNetwork/elrond-go/common/disabled" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) func TestSnapshotStatistics_AddTrieStats(t *testing.T) { t.Parallel() - tsc, err := NewTrieStatisticsCollector(disabled.NewAppStatusHandler()) - require.Nil(t, err) + tsc := NewTrieStatisticsCollector() numInserts := 100 for i := 0; i < numInserts; i++ { @@ -45,6 +42,7 @@ func TestSnapshotStatistics_AddTrieStats(t *testing.T) { assert.True(t, isSortedByDepth) assert.Equal(t, numTriesToPrint, len(tsc.triesBySize)) assert.Equal(t, numTriesToPrint, len(tsc.triesByDepth)) + assert.Equal(t, uint64(i+1), tsc.GetNumNodes()) } } From 8fceb0095a851ba6f5df1aa39a0f023faf93c744 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 24 Oct 2022 20:56:39 +0300 Subject: [PATCH 083/110] reverted the fix for cyclic imports - not needed anymore --- api/groups/networkGroup.go | 4 ++-- api/groups/networkGroup_test.go | 23 ++++++++++--------- api/groups/nodeGroup.go | 4 ++-- api/groups/nodeGroup_test.go | 13 ++++++----- api/mock/facadeStub.go | 6 ++--- api/shared/interface.go | 4 ++-- cmd/node/factory/interface.go | 4 ++-- cmd/node/factory/structsStatusHandlers.go | 5 ++-- facade/initial/initialNodeFacade.go | 6 ++--- facade/interface.go | 4 ++-- facade/mock/apiResolverStub.go | 6 ++--- facade/nodeFacade.go | 4 ++-- facade/nodeFacade_test.go | 4 ++-- integrationTests/interface.go | 4 ++-- node/external/interface.go | 13 +++++++++++ node/external/nodeApiResolver.go | 7 +++--- state/accountsDB.go | 2 -- state/snapshotStatistics_test.go | 3 +-- statusHandler/interface.go | 14 ----------- .../statusHandler/statusHandlersUtilsMock.go | 6 ++--- 20 files changed, 67 insertions(+), 69 deletions(-) delete mode 100644 statusHandler/interface.go diff --git a/api/groups/networkGroup.go b/api/groups/networkGroup.go index 888c56a2f32..8b64e90f558 100644 --- a/api/groups/networkGroup.go +++ b/api/groups/networkGroup.go @@ -13,7 +13,7 @@ import ( "github.com/ElrondNetwork/elrond-go/api/shared" "github.com/ElrondNetwork/elrond-go/api/shared/logging" "github.com/ElrondNetwork/elrond-go/common" - "github.com/ElrondNetwork/elrond-go/statusHandler" + "github.com/ElrondNetwork/elrond-go/node/external" "github.com/gin-gonic/gin" ) @@ -40,7 +40,7 @@ type networkFacadeHandler interface { GetTotalStakedValue() (*api.StakeValues, error) GetDirectStakedList() ([]*api.DirectStakedValue, error) GetDelegatorsList() ([]*api.Delegator, error) - StatusMetrics() statusHandler.StatusMetricsHandler + StatusMetrics() external.StatusMetricsHandler GetAllIssuedESDTs(tokenType string) ([]string, error) GetTokenSupply(token string) (*api.ESDTSupply, error) GetGenesisNodesPubKeys() (map[uint32][]string, map[uint32][]string, error) diff --git a/api/groups/networkGroup_test.go b/api/groups/networkGroup_test.go index 9ac24746424..38ab043d29f 100644 --- a/api/groups/networkGroup_test.go +++ b/api/groups/networkGroup_test.go @@ -19,6 +19,7 @@ import ( "github.com/ElrondNetwork/elrond-go/api/shared" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/config" + "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/statusHandler" "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/stretchr/testify/assert" @@ -98,7 +99,7 @@ func TestNetworkConfigMetrics_ShouldWork(t *testing.T) { statusMetricsProvider.SetUInt64Value(key, value) facade := mock.FacadeStub{} - facade.StatusMetricsHandler = func() statusHandler.StatusMetricsHandler { + facade.StatusMetricsHandler = func() external.StatusMetricsHandler { return statusMetricsProvider } @@ -123,7 +124,7 @@ func TestGetNetworkConfig_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { expectedErr := errors.New("i am an error") facade := mock.FacadeStub{ - StatusMetricsHandler: func() statusHandler.StatusMetricsHandler { + StatusMetricsHandler: func() external.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ ConfigMetricsCalled: func() (map[string]interface{}, error) { return nil, expectedErr @@ -153,7 +154,7 @@ func TestGetNetworkStatus_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { expectedErr := errors.New("i am an error") facade := mock.FacadeStub{ - StatusMetricsHandler: func() statusHandler.StatusMetricsHandler { + StatusMetricsHandler: func() external.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ NetworkMetricsCalled: func() (map[string]interface{}, error) { return nil, expectedErr @@ -188,7 +189,7 @@ func TestNetworkStatusMetrics_ShouldWork(t *testing.T) { statusMetricsProvider.SetUInt64Value(key, value) facade := mock.FacadeStub{} - facade.StatusMetricsHandler = func() statusHandler.StatusMetricsHandler { + facade.StatusMetricsHandler = func() external.StatusMetricsHandler { return statusMetricsProvider } @@ -223,7 +224,7 @@ func TestEconomicsMetrics_ShouldWork(t *testing.T) { }, nil }, } - facade.StatusMetricsHandler = func() statusHandler.StatusMetricsHandler { + facade.StatusMetricsHandler = func() external.StatusMetricsHandler { return statusMetricsProvider } @@ -248,7 +249,7 @@ func TestGetEconomicValues_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { expectedErr := errors.New("i am an error") facade := mock.FacadeStub{ - StatusMetricsHandler: func() statusHandler.StatusMetricsHandler { + StatusMetricsHandler: func() external.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ EconomicsMetricsCalled: func() (map[string]interface{}, error) { return nil, expectedErr @@ -289,7 +290,7 @@ func TestEconomicsMetrics_CannotGetStakeValues(t *testing.T) { return nil, localErr }, } - facade.StatusMetricsHandler = func() statusHandler.StatusMetricsHandler { + facade.StatusMetricsHandler = func() external.StatusMetricsHandler { return statusMetricsProvider } @@ -513,7 +514,7 @@ func TestGetEnableEpochs_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { expectedErr := errors.New("i am an error") facade := mock.FacadeStub{ - StatusMetricsHandler: func() statusHandler.StatusMetricsHandler { + StatusMetricsHandler: func() external.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ EnableEpochsMetricsCalled: func() (map[string]interface{}, error) { return nil, expectedErr @@ -548,7 +549,7 @@ func TestGetEnableEpochs_ShouldWork(t *testing.T) { statusMetrics.SetUInt64Value(key, value) facade := mock.FacadeStub{} - facade.StatusMetricsHandler = func() statusHandler.StatusMetricsHandler { + facade.StatusMetricsHandler = func() external.StatusMetricsHandler { return statusMetrics } @@ -600,7 +601,7 @@ func TestGetNetworkRatings_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { expectedErr := errors.New("i am an error") facade := mock.FacadeStub{ - StatusMetricsHandler: func() statusHandler.StatusMetricsHandler { + StatusMetricsHandler: func() external.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ RatingsMetricsCalled: func() (map[string]interface{}, error) { return nil, expectedErr @@ -632,7 +633,7 @@ func TestGetNetworkRatings_ShouldWork(t *testing.T) { } facade := mock.FacadeStub{ - StatusMetricsHandler: func() statusHandler.StatusMetricsHandler { + StatusMetricsHandler: func() external.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ RatingsMetricsCalled: func() (map[string]interface{}, error) { return expectedMap, nil diff --git a/api/groups/nodeGroup.go b/api/groups/nodeGroup.go index b3914ae57bd..0987a2db0e0 100644 --- a/api/groups/nodeGroup.go +++ b/api/groups/nodeGroup.go @@ -12,7 +12,7 @@ import ( "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/debug" "github.com/ElrondNetwork/elrond-go/heartbeat/data" - "github.com/ElrondNetwork/elrond-go/statusHandler" + "github.com/ElrondNetwork/elrond-go/node/external" "github.com/gin-gonic/gin" ) @@ -30,7 +30,7 @@ const ( // nodeFacadeHandler defines the methods to be implemented by a facade for node requests type nodeFacadeHandler interface { GetHeartbeats() ([]data.PubKeyHeartbeat, error) - StatusMetrics() statusHandler.StatusMetricsHandler + StatusMetrics() external.StatusMetricsHandler GetQueryHandler(name string) (debug.QueryHandler, error) GetEpochStartDataAPI(epoch uint32) (*common.EpochStartDataAPI, error) GetPeerInfo(pid string) ([]core.QueryP2PPeerInfo, error) diff --git a/api/groups/nodeGroup_test.go b/api/groups/nodeGroup_test.go index 26fceefaa55..d2cae7d2928 100644 --- a/api/groups/nodeGroup_test.go +++ b/api/groups/nodeGroup_test.go @@ -22,6 +22,7 @@ import ( "github.com/ElrondNetwork/elrond-go/config" "github.com/ElrondNetwork/elrond-go/debug" "github.com/ElrondNetwork/elrond-go/heartbeat/data" + "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/statusHandler" "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/gin-gonic/gin" @@ -136,7 +137,7 @@ func TestP2PMetrics_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { expectedErr := errors.New("i am an error") facade := mock.FacadeStub{ - StatusMetricsHandler: func() statusHandler.StatusMetricsHandler { + StatusMetricsHandler: func() external.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ StatusP2pMetricsMapCalled: func() (map[string]interface{}, error) { return nil, expectedErr @@ -166,7 +167,7 @@ func TestNodeStatus_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { expectedErr := errors.New("i am an error") facade := mock.FacadeStub{ - StatusMetricsHandler: func() statusHandler.StatusMetricsHandler { + StatusMetricsHandler: func() external.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ StatusMetricsMapWithoutP2PCalled: func() (map[string]interface{}, error) { return nil, expectedErr @@ -202,7 +203,7 @@ func TestStatusMetrics_ShouldDisplayNonP2pMetrics(t *testing.T) { statusMetricsProvider.SetStringValue(p2pKey, "p2p value") facade := mock.FacadeStub{} - facade.StatusMetricsHandler = func() statusHandler.StatusMetricsHandler { + facade.StatusMetricsHandler = func() external.StatusMetricsHandler { return statusMetricsProvider } @@ -235,7 +236,7 @@ func TestP2PStatusMetrics_ShouldDisplayNonP2pMetrics(t *testing.T) { statusMetricsProvider.SetStringValue(p2pKey, p2pValue) facade := mock.FacadeStub{} - facade.StatusMetricsHandler = func() statusHandler.StatusMetricsHandler { + facade.StatusMetricsHandler = func() external.StatusMetricsHandler { return statusMetricsProvider } @@ -458,7 +459,7 @@ func TestPrometheusMetrics_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { expectedErr := errors.New("i am an error") facade := mock.FacadeStub{ - StatusMetricsHandler: func() statusHandler.StatusMetricsHandler { + StatusMetricsHandler: func() external.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ StatusMetricsWithoutP2PPrometheusStringCalled: func() (string, error) { return "", expectedErr @@ -491,7 +492,7 @@ func TestPrometheusMetrics_ShouldWork(t *testing.T) { statusMetricsProvider.SetUInt64Value(key, value) facade := mock.FacadeStub{} - facade.StatusMetricsHandler = func() statusHandler.StatusMetricsHandler { + facade.StatusMetricsHandler = func() external.StatusMetricsHandler { return statusMetricsProvider } diff --git a/api/mock/facadeStub.go b/api/mock/facadeStub.go index e615ad112ed..55310a21306 100644 --- a/api/mock/facadeStub.go +++ b/api/mock/facadeStub.go @@ -12,10 +12,10 @@ import ( "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/debug" "github.com/ElrondNetwork/elrond-go/heartbeat/data" + "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/process" txSimData "github.com/ElrondNetwork/elrond-go/process/txsimulator/data" "github.com/ElrondNetwork/elrond-go/state" - "github.com/ElrondNetwork/elrond-go/statusHandler" ) // FacadeStub is the mock implementation of a node router handler @@ -33,7 +33,7 @@ type FacadeStub struct { ValidateTransactionForSimulationHandler func(tx *transaction.Transaction, bypassSignature bool) error SendBulkTransactionsHandler func(txs []*transaction.Transaction) (uint64, error) ExecuteSCQueryHandler func(query *process.SCQuery) (*vm.VMOutputApi, error) - StatusMetricsHandler func() statusHandler.StatusMetricsHandler + StatusMetricsHandler func() external.StatusMetricsHandler ValidatorStatisticsHandler func() (map[string]*state.ValidatorApiResponse, error) ComputeTransactionGasLimitHandler func(tx *transaction.Transaction) (*transaction.CostResponse, error) NodeConfigCalled func() map[string]interface{} @@ -309,7 +309,7 @@ func (f *FacadeStub) ExecuteSCQuery(query *process.SCQuery) (*vm.VMOutputApi, er } // StatusMetrics is the mock implementation for the StatusMetrics -func (f *FacadeStub) StatusMetrics() statusHandler.StatusMetricsHandler { +func (f *FacadeStub) StatusMetrics() external.StatusMetricsHandler { return f.StatusMetricsHandler() } diff --git a/api/shared/interface.go b/api/shared/interface.go index 287e21b06cd..50ed40c1504 100644 --- a/api/shared/interface.go +++ b/api/shared/interface.go @@ -12,10 +12,10 @@ import ( "github.com/ElrondNetwork/elrond-go/config" "github.com/ElrondNetwork/elrond-go/debug" "github.com/ElrondNetwork/elrond-go/heartbeat/data" + "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/process" txSimData "github.com/ElrondNetwork/elrond-go/process/txsimulator/data" "github.com/ElrondNetwork/elrond-go/state" - "github.com/ElrondNetwork/elrond-go/statusHandler" "github.com/gin-gonic/gin" ) @@ -87,7 +87,7 @@ type FacadeHandler interface { GetTotalStakedValue() (*api.StakeValues, error) GetDirectStakedList() ([]*api.DirectStakedValue, error) GetDelegatorsList() ([]*api.Delegator, error) - StatusMetrics() statusHandler.StatusMetricsHandler + StatusMetrics() external.StatusMetricsHandler GetTokenSupply(token string) (*api.ESDTSupply, error) GetAllIssuedESDTs(tokenType string) ([]string, error) GetHeartbeats() ([]data.PubKeyHeartbeat, error) diff --git a/cmd/node/factory/interface.go b/cmd/node/factory/interface.go index c6eacfee610..0d6c293c68c 100644 --- a/cmd/node/factory/interface.go +++ b/cmd/node/factory/interface.go @@ -7,8 +7,8 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data" "github.com/ElrondNetwork/elrond-go-core/data/typeConverters" "github.com/ElrondNetwork/elrond-go-core/marshal" + "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/p2p" - "github.com/ElrondNetwork/elrond-go/statusHandler" "github.com/ElrondNetwork/elrond-go/storage" ) @@ -62,7 +62,7 @@ type FileLoggingHandler interface { // TODO: find a better naming type StatusHandlersUtils interface { StatusHandler() core.AppStatusHandler - Metrics() statusHandler.StatusMetricsHandler + Metrics() external.StatusMetricsHandler UpdateStorerAndMetricsForPersistentHandler(store storage.Storer) error IsInterfaceNil() bool } diff --git a/cmd/node/factory/structsStatusHandlers.go b/cmd/node/factory/structsStatusHandlers.go index 52975386f9e..b0702d600c4 100644 --- a/cmd/node/factory/structsStatusHandlers.go +++ b/cmd/node/factory/structsStatusHandlers.go @@ -8,6 +8,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/typeConverters" "github.com/ElrondNetwork/elrond-go-core/marshal" logger "github.com/ElrondNetwork/elrond-go-logger" + "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/statusHandler" "github.com/ElrondNetwork/elrond-go/statusHandler/persister" "github.com/ElrondNetwork/elrond-go/storage" @@ -18,7 +19,7 @@ var log = logger.GetOrCreate("main") // StatusHandlersInfo is struct that stores all components that are returned when status handlers are created type statusHandlersInfo struct { AppStatusHandler core.AppStatusHandler - StatusMetrics statusHandler.StatusMetricsHandler + StatusMetrics external.StatusMetricsHandler PersistentHandler *persister.PersistentStatusHandler } @@ -90,7 +91,7 @@ func (shi *statusHandlersInfo) StatusHandler() core.AppStatusHandler { } // Metrics returns the status metrics -func (shi *statusHandlersInfo) Metrics() statusHandler.StatusMetricsHandler { +func (shi *statusHandlersInfo) Metrics() external.StatusMetricsHandler { return shi.StatusMetrics } diff --git a/facade/initial/initialNodeFacade.go b/facade/initial/initialNodeFacade.go index 308547eb952..4fb02a5ce44 100644 --- a/facade/initial/initialNodeFacade.go +++ b/facade/initial/initialNodeFacade.go @@ -12,11 +12,11 @@ import ( "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/debug" "github.com/ElrondNetwork/elrond-go/heartbeat/data" + "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/ntp" "github.com/ElrondNetwork/elrond-go/process" txSimData "github.com/ElrondNetwork/elrond-go/process/txsimulator/data" "github.com/ElrondNetwork/elrond-go/state" - "github.com/ElrondNetwork/elrond-go/statusHandler" ) var errNodeStarting = errors.New("node is starting") @@ -25,7 +25,7 @@ var emptyString = "" // initialNodeFacade represents a facade with no functionality type initialNodeFacade struct { apiInterface string - statusMetricsHandler statusHandler.StatusMetricsHandler + statusMetricsHandler external.StatusMetricsHandler pprofEnabled bool } @@ -187,7 +187,7 @@ func (inf *initialNodeFacade) GetHeartbeats() ([]data.PubKeyHeartbeat, error) { } // StatusMetrics will returns nil -func (inf *initialNodeFacade) StatusMetrics() statusHandler.StatusMetricsHandler { +func (inf *initialNodeFacade) StatusMetrics() external.StatusMetricsHandler { return inf.statusMetricsHandler } diff --git a/facade/interface.go b/facade/interface.go index be71b651466..7a40d748d46 100644 --- a/facade/interface.go +++ b/facade/interface.go @@ -11,10 +11,10 @@ import ( "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/debug" "github.com/ElrondNetwork/elrond-go/heartbeat/data" + "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/process" txSimData "github.com/ElrondNetwork/elrond-go/process/txsimulator/data" "github.com/ElrondNetwork/elrond-go/state" - "github.com/ElrondNetwork/elrond-go/statusHandler" vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) @@ -108,7 +108,7 @@ type TransactionSimulatorProcessor interface { type ApiResolver interface { ExecuteSCQuery(query *process.SCQuery) (*vmcommon.VMOutput, error) ComputeTransactionGasLimit(tx *transaction.Transaction) (*transaction.CostResponse, error) - StatusMetrics() statusHandler.StatusMetricsHandler + StatusMetrics() external.StatusMetricsHandler GetTotalStakedValue(ctx context.Context) (*api.StakeValues, error) GetDirectStakedList(ctx context.Context) ([]*api.DirectStakedValue, error) GetDelegatorsList(ctx context.Context) ([]*api.Delegator, error) diff --git a/facade/mock/apiResolverStub.go b/facade/mock/apiResolverStub.go index d097a86bed6..eb07b880ed3 100644 --- a/facade/mock/apiResolverStub.go +++ b/facade/mock/apiResolverStub.go @@ -6,15 +6,15 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/api" "github.com/ElrondNetwork/elrond-go-core/data/transaction" "github.com/ElrondNetwork/elrond-go/common" + "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/process" - "github.com/ElrondNetwork/elrond-go/statusHandler" vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) // ApiResolverStub - type ApiResolverStub struct { ExecuteSCQueryHandler func(query *process.SCQuery) (*vmcommon.VMOutput, error) - StatusMetricsHandler func() statusHandler.StatusMetricsHandler + StatusMetricsHandler func() external.StatusMetricsHandler ComputeTransactionGasLimitHandler func(tx *transaction.Transaction) (*transaction.CostResponse, error) GetTotalStakedValueHandler func(ctx context.Context) (*api.StakeValues, error) GetDirectStakedListHandler func(ctx context.Context) ([]*api.DirectStakedValue, error) @@ -86,7 +86,7 @@ func (ars *ApiResolverStub) ExecuteSCQuery(query *process.SCQuery) (*vmcommon.VM } // StatusMetrics - -func (ars *ApiResolverStub) StatusMetrics() statusHandler.StatusMetricsHandler { +func (ars *ApiResolverStub) StatusMetrics() external.StatusMetricsHandler { if ars.StatusMetricsHandler != nil { return ars.StatusMetricsHandler() } diff --git a/facade/nodeFacade.go b/facade/nodeFacade.go index c8818e0f45a..43c5f4c9b04 100644 --- a/facade/nodeFacade.go +++ b/facade/nodeFacade.go @@ -22,11 +22,11 @@ import ( "github.com/ElrondNetwork/elrond-go/debug" "github.com/ElrondNetwork/elrond-go/epochStart/bootstrap/disabled" "github.com/ElrondNetwork/elrond-go/heartbeat/data" + "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/ntp" "github.com/ElrondNetwork/elrond-go/process" txSimData "github.com/ElrondNetwork/elrond-go/process/txsimulator/data" "github.com/ElrondNetwork/elrond-go/state" - "github.com/ElrondNetwork/elrond-go/statusHandler" vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) @@ -365,7 +365,7 @@ func (nf *nodeFacade) GetHeartbeats() ([]data.PubKeyHeartbeat, error) { } // StatusMetrics will return the node's status metrics -func (nf *nodeFacade) StatusMetrics() statusHandler.StatusMetricsHandler { +func (nf *nodeFacade) StatusMetrics() external.StatusMetricsHandler { return nf.apiResolver.StatusMetrics() } diff --git a/facade/nodeFacade_test.go b/facade/nodeFacade_test.go index d83c03fec1e..0c9b7c30708 100644 --- a/facade/nodeFacade_test.go +++ b/facade/nodeFacade_test.go @@ -24,9 +24,9 @@ import ( "github.com/ElrondNetwork/elrond-go/debug" "github.com/ElrondNetwork/elrond-go/facade/mock" "github.com/ElrondNetwork/elrond-go/heartbeat/data" + "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/state" - "github.com/ElrondNetwork/elrond-go/statusHandler" "github.com/ElrondNetwork/elrond-go/testscommon" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" vmcommon "github.com/ElrondNetwork/elrond-vm-common" @@ -473,7 +473,7 @@ func TestNodeFacade_StatusMetrics(t *testing.T) { apiResolverMetricsRequested := false apiResStub := &mock.ApiResolverStub{ - StatusMetricsHandler: func() statusHandler.StatusMetricsHandler { + StatusMetricsHandler: func() external.StatusMetricsHandler { apiResolverMetricsRequested = true return nil }, diff --git a/integrationTests/interface.go b/integrationTests/interface.go index 157a5291661..21f1d16255f 100644 --- a/integrationTests/interface.go +++ b/integrationTests/interface.go @@ -13,11 +13,11 @@ import ( "github.com/ElrondNetwork/elrond-go/debug" "github.com/ElrondNetwork/elrond-go/epochStart" "github.com/ElrondNetwork/elrond-go/heartbeat/data" + "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/process" txSimData "github.com/ElrondNetwork/elrond-go/process/txsimulator/data" "github.com/ElrondNetwork/elrond-go/sharding/nodesCoordinator" "github.com/ElrondNetwork/elrond-go/state" - "github.com/ElrondNetwork/elrond-go/statusHandler" ) // TestBootstrapper extends the Bootstrapper interface with some functions intended to be used only in tests @@ -78,7 +78,7 @@ type Facade interface { GetAllIssuedESDTs(tokenType string) ([]string, error) GetTokenSupply(token string) (*dataApi.ESDTSupply, error) GetHeartbeats() ([]data.PubKeyHeartbeat, error) - StatusMetrics() statusHandler.StatusMetricsHandler + StatusMetrics() external.StatusMetricsHandler GetQueryHandler(name string) (debug.QueryHandler, error) GetEpochStartDataAPI(epoch uint32) (*common.EpochStartDataAPI, error) GetPeerInfo(pid string) ([]core.QueryP2PPeerInfo, error) diff --git a/node/external/interface.go b/node/external/interface.go index d84f1eb64dc..6e12a7ea167 100644 --- a/node/external/interface.go +++ b/node/external/interface.go @@ -18,6 +18,19 @@ type SCQueryService interface { IsInterfaceNil() bool } +// StatusMetricsHandler is the interface that defines what a node details handler/provider should do +type StatusMetricsHandler interface { + StatusMetricsMapWithoutP2P() (map[string]interface{}, error) + StatusP2pMetricsMap() (map[string]interface{}, error) + StatusMetricsWithoutP2PPrometheusString() (string, error) + EconomicsMetrics() (map[string]interface{}, error) + ConfigMetrics() (map[string]interface{}, error) + EnableEpochsMetrics() (map[string]interface{}, error) + NetworkMetrics() (map[string]interface{}, error) + RatingsMetrics() (map[string]interface{}, error) + IsInterfaceNil() bool +} + // TransactionCostHandler defines the actions which should be handler by a transaction cost estimator type TransactionCostHandler interface { ComputeTransactionGasLimit(tx *transaction.Transaction) (*transaction.CostResponse, error) diff --git a/node/external/nodeApiResolver.go b/node/external/nodeApiResolver.go index 122d6c48e33..fb636e33aac 100644 --- a/node/external/nodeApiResolver.go +++ b/node/external/nodeApiResolver.go @@ -15,14 +15,13 @@ import ( "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/sharding" "github.com/ElrondNetwork/elrond-go/sharding/nodesCoordinator" - "github.com/ElrondNetwork/elrond-go/statusHandler" vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) // ArgNodeApiResolver represents the DTO structure used in the NewNodeApiResolver constructor type ArgNodeApiResolver struct { SCQueryService SCQueryService - StatusMetricsHandler statusHandler.StatusMetricsHandler + StatusMetricsHandler StatusMetricsHandler TxCostHandler TransactionCostHandler TotalStakedValueHandler TotalStakedValueHandler DirectStakedListHandler DirectStakedListHandler @@ -39,7 +38,7 @@ type ArgNodeApiResolver struct { // nodeApiResolver can resolve API requests type nodeApiResolver struct { scQueryService SCQueryService - statusMetricsHandler statusHandler.StatusMetricsHandler + statusMetricsHandler StatusMetricsHandler txCostHandler TransactionCostHandler totalStakedValueHandler TotalStakedValueHandler directStakedListHandler DirectStakedListHandler @@ -118,7 +117,7 @@ func (nar *nodeApiResolver) ExecuteSCQuery(query *process.SCQuery) (*vmcommon.VM } // StatusMetrics returns an implementation of the StatusMetricsHandler interface -func (nar *nodeApiResolver) StatusMetrics() statusHandler.StatusMetricsHandler { +func (nar *nodeApiResolver) StatusMetrics() StatusMetricsHandler { return nar.statusMetricsHandler } diff --git a/state/accountsDB.go b/state/accountsDB.go index 2596b3a4248..62377f60dfc 100644 --- a/state/accountsDB.go +++ b/state/accountsDB.go @@ -1140,7 +1140,6 @@ func (adb *AccountsDB) SnapshotState(rootHash []byte) { ErrChan: make(chan error, 1), } stats := newSnapshotStatistics(1, 1) - accountMetrics := &accountMetrics{ snapshotInProgressKey: common.MetricAccountsSnapshotInProgress, lastSnapshotDurationKey: common.MetricLastAccountsSnapshotDurationSec, @@ -1418,7 +1417,6 @@ func (adb *AccountsDB) Close() error { // GetStatsForRootHash will get trie statistics for the given rootHash func (adb *AccountsDB) GetStatsForRootHash(rootHash []byte) (common.TriesStatisticsCollector, error) { stats := statistics.NewTrieStatisticsCollector() - mainTrie := adb.getMainTrie() tr, ok := mainTrie.(common.TrieStats) diff --git a/state/snapshotStatistics_test.go b/state/snapshotStatistics_test.go index 3ff7a9da4dd..7602d0b8537 100644 --- a/state/snapshotStatistics_test.go +++ b/state/snapshotStatistics_test.go @@ -12,10 +12,9 @@ func TestSnapshotStatistics_Concurrency(t *testing.T) { t.Parallel() wg := &sync.WaitGroup{} - stats := statistics.NewTrieStatisticsCollector() ss := &snapshotStatistics{ wgSnapshot: wg, - trieStatisticsCollector: stats, + trieStatisticsCollector: statistics.NewTrieStatisticsCollector(), } numRuns := 100 diff --git a/statusHandler/interface.go b/statusHandler/interface.go deleted file mode 100644 index 96dda38a115..00000000000 --- a/statusHandler/interface.go +++ /dev/null @@ -1,14 +0,0 @@ -package statusHandler - -// StatusMetricsHandler is the interface that defines what a node details handler/provider should do -type StatusMetricsHandler interface { - StatusMetricsMapWithoutP2P() (map[string]interface{}, error) - StatusP2pMetricsMap() (map[string]interface{}, error) - StatusMetricsWithoutP2PPrometheusString() (string, error) - EconomicsMetrics() (map[string]interface{}, error) - ConfigMetrics() (map[string]interface{}, error) - EnableEpochsMetrics() (map[string]interface{}, error) - NetworkMetrics() (map[string]interface{}, error) - RatingsMetrics() (map[string]interface{}, error) - IsInterfaceNil() bool -} diff --git a/testscommon/statusHandler/statusHandlersUtilsMock.go b/testscommon/statusHandler/statusHandlersUtilsMock.go index 59a82e448a8..ade32053a04 100644 --- a/testscommon/statusHandler/statusHandlersUtilsMock.go +++ b/testscommon/statusHandler/statusHandlersUtilsMock.go @@ -2,13 +2,13 @@ package statusHandler import ( "github.com/ElrondNetwork/elrond-go-core/core" - "github.com/ElrondNetwork/elrond-go/statusHandler" + "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/storage" ) // StatusHandlersUtilsMock - type StatusHandlersUtilsMock struct { - StatusMetrics statusHandler.StatusMetricsHandler + StatusMetrics external.StatusMetricsHandler AppStatusHandler core.AppStatusHandler } @@ -23,7 +23,7 @@ func (shum *StatusHandlersUtilsMock) StatusHandler() core.AppStatusHandler { } // Metrics - -func (shum *StatusHandlersUtilsMock) Metrics() statusHandler.StatusMetricsHandler { +func (shum *StatusHandlersUtilsMock) Metrics() external.StatusMetricsHandler { return shum.StatusMetrics } From 99090d884f87610da1c9bd5ccbc649169b61e18d Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 24 Oct 2022 20:58:26 +0300 Subject: [PATCH 084/110] removed extra lines --- state/accountsDB.go | 2 +- state/snapshotStatistics.go | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/state/accountsDB.go b/state/accountsDB.go index 62377f60dfc..530b3434c00 100644 --- a/state/accountsDB.go +++ b/state/accountsDB.go @@ -1140,6 +1140,7 @@ func (adb *AccountsDB) SnapshotState(rootHash []byte) { ErrChan: make(chan error, 1), } stats := newSnapshotStatistics(1, 1) + accountMetrics := &accountMetrics{ snapshotInProgressKey: common.MetricAccountsSnapshotInProgress, lastSnapshotDurationKey: common.MetricLastAccountsSnapshotDurationSec, @@ -1365,7 +1366,6 @@ func (adb *AccountsDB) setStateCheckpoint(rootHash []byte) { } missingNodesChannel := make(chan []byte, missingNodesChannelSize) stats := newSnapshotStatistics(1, 1) - go func() { stats.NewSnapshotStarted() trieStorageManager.SetCheckpoint(rootHash, rootHash, iteratorChannels, missingNodesChannel, stats) diff --git a/state/snapshotStatistics.go b/state/snapshotStatistics.go index eb5c44d5e2f..88289e6a2d7 100644 --- a/state/snapshotStatistics.go +++ b/state/snapshotStatistics.go @@ -24,7 +24,6 @@ func newSnapshotStatistics(snapshotDelta int, syncDelta int) *snapshotStatistics wgSync := &sync.WaitGroup{} wgSync.Add(syncDelta) - return &snapshotStatistics{ wgSnapshot: wgSnapshot, wgSync: wgSync, From f515a0ef427e43e8acc4fff7e31ddf2a1abf94f8 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 24 Oct 2022 21:13:27 +0300 Subject: [PATCH 085/110] added unittest --- state/accountsDB_test.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/state/accountsDB_test.go b/state/accountsDB_test.go index a091883c1fd..4e6ddfdd206 100644 --- a/state/accountsDB_test.go +++ b/state/accountsDB_test.go @@ -1095,7 +1095,15 @@ func TestAccountsDB_SnapshotStateSnapshotSameRootHash(t *testing.T) { } }, } - adb := generateAccountDBFromTrie(trieStub) + args := createMockAccountsDBArgs() + args.Trie = trieStub + args.AppStatusHandler = &statusHandler.AppStatusHandlerStub{ + SetUInt64ValueHandler: func(key string, value uint64) { + assert.Equal(t, common.MetricAccountsSnapshotNumNodes, key) + }, + } + + adb, _ := state.NewAccountsDB(args) waitForOpToFinish := time.Millisecond * 100 // snapshot rootHash1 and epoch 0 From 4f5e988d77123a53f6d618044374e148cd9005dd Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 25 Oct 2022 10:11:29 +0300 Subject: [PATCH 086/110] fix after review --- common/interface.go | 2 +- trie/statistics/trieStatisticsCollector.go | 6 +++--- trie/statistics/trieStatisticsCollector_test.go | 5 +++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/common/interface.go b/common/interface.go index ce11bbe1177..73c4e83d937 100644 --- a/common/interface.go +++ b/common/interface.go @@ -167,7 +167,7 @@ type TrieStatisticsHandler interface { // TriesStatisticsCollector is used to merge the statistics for multiple tries type TriesStatisticsCollector interface { - Add(trieStats *statistics.TrieStatsDTO) + Add(trieStats statistics.TrieStatsDTO) Print() GetNumNodes() uint64 } diff --git a/trie/statistics/trieStatisticsCollector.go b/trie/statistics/trieStatisticsCollector.go index 8be036e37e4..046c3bda31c 100644 --- a/trie/statistics/trieStatisticsCollector.go +++ b/trie/statistics/trieStatisticsCollector.go @@ -32,13 +32,13 @@ func NewTrieStatisticsCollector() *trieStatisticsCollector { } // Add adds the given trie statistics to the statistics collector -func (tsc *trieStatisticsCollector) Add(trieStats *TrieStatsDTO) { +func (tsc *trieStatisticsCollector) Add(trieStats TrieStatsDTO) { tsc.numNodes += trieStats.TotalNumNodes tsc.triesSize += trieStats.TotalNodesSize tsc.numDataTries++ - insertInSortedArray(tsc.triesBySize, trieStats, isLessSize) - insertInSortedArray(tsc.triesByDepth, trieStats, isLessDeep) + insertInSortedArray(tsc.triesBySize, &trieStats, isLessSize) + insertInSortedArray(tsc.triesByDepth, &trieStats, isLessDeep) } // Print will print all the collected statistics diff --git a/trie/statistics/trieStatisticsCollector_test.go b/trie/statistics/trieStatisticsCollector_test.go index ce81bc7aecb..d869819ef7d 100644 --- a/trie/statistics/trieStatisticsCollector_test.go +++ b/trie/statistics/trieStatisticsCollector_test.go @@ -46,8 +46,9 @@ func TestSnapshotStatistics_AddTrieStats(t *testing.T) { } } -func getTrieStatsDTO(maxLevel int, size uint64) *TrieStatsDTO { +func getTrieStatsDTO(maxLevel int, size uint64) TrieStatsDTO { ts := NewTrieStatistics() ts.AddBranchNode(maxLevel, size) - return ts.GetTrieStats() + dto := ts.GetTrieStats() + return *dto } From 8fa0cd59de116f71f5b6c48eb24b654581c2530b Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 25 Oct 2022 10:17:33 +0300 Subject: [PATCH 087/110] fix tests --- state/accountsDB.go | 2 +- state/snapshotStatistics.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/state/accountsDB.go b/state/accountsDB.go index 530b3434c00..ab1f623b7a2 100644 --- a/state/accountsDB.go +++ b/state/accountsDB.go @@ -1464,7 +1464,7 @@ func collectStats(tr common.TrieStats, stats common.TriesStatisticsCollector, ro log.Error(err.Error()) return } - stats.Add(trieStats) + stats.Add(*trieStats) log.Debug(strings.Join(trieStats.ToString(), " ")) } diff --git a/state/snapshotStatistics.go b/state/snapshotStatistics.go index 88289e6a2d7..24a8eba2f4c 100644 --- a/state/snapshotStatistics.go +++ b/state/snapshotStatistics.go @@ -52,7 +52,7 @@ func (ss *snapshotStatistics) AddTrieStats(trieStats *statistics.TrieStatsDTO) { ss.mutex.Lock() defer ss.mutex.Unlock() - ss.trieStatisticsCollector.Add(trieStats) + ss.trieStatisticsCollector.Add(*trieStats) } // WaitForSyncToFinish will wait until the waitGroup counter is zero From f9364918bbf3ea8bfa311e9ac35578895c71919c Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 25 Oct 2022 10:56:05 +0300 Subject: [PATCH 088/110] reverted last commit and added check if nil on trieStats --- common/interface.go | 2 +- state/accountsDB.go | 2 +- state/snapshotStatistics.go | 2 +- trie/statistics/trieStatisticsCollector.go | 11 ++++++++--- trie/statistics/trieStatisticsCollector_test.go | 6 +++--- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/common/interface.go b/common/interface.go index 73c4e83d937..ce11bbe1177 100644 --- a/common/interface.go +++ b/common/interface.go @@ -167,7 +167,7 @@ type TrieStatisticsHandler interface { // TriesStatisticsCollector is used to merge the statistics for multiple tries type TriesStatisticsCollector interface { - Add(trieStats statistics.TrieStatsDTO) + Add(trieStats *statistics.TrieStatsDTO) Print() GetNumNodes() uint64 } diff --git a/state/accountsDB.go b/state/accountsDB.go index ab1f623b7a2..530b3434c00 100644 --- a/state/accountsDB.go +++ b/state/accountsDB.go @@ -1464,7 +1464,7 @@ func collectStats(tr common.TrieStats, stats common.TriesStatisticsCollector, ro log.Error(err.Error()) return } - stats.Add(*trieStats) + stats.Add(trieStats) log.Debug(strings.Join(trieStats.ToString(), " ")) } diff --git a/state/snapshotStatistics.go b/state/snapshotStatistics.go index 24a8eba2f4c..88289e6a2d7 100644 --- a/state/snapshotStatistics.go +++ b/state/snapshotStatistics.go @@ -52,7 +52,7 @@ func (ss *snapshotStatistics) AddTrieStats(trieStats *statistics.TrieStatsDTO) { ss.mutex.Lock() defer ss.mutex.Unlock() - ss.trieStatisticsCollector.Add(*trieStats) + ss.trieStatisticsCollector.Add(trieStats) } // WaitForSyncToFinish will wait until the waitGroup counter is zero diff --git a/trie/statistics/trieStatisticsCollector.go b/trie/statistics/trieStatisticsCollector.go index 046c3bda31c..5b3cf8f8049 100644 --- a/trie/statistics/trieStatisticsCollector.go +++ b/trie/statistics/trieStatisticsCollector.go @@ -32,13 +32,18 @@ func NewTrieStatisticsCollector() *trieStatisticsCollector { } // Add adds the given trie statistics to the statistics collector -func (tsc *trieStatisticsCollector) Add(trieStats TrieStatsDTO) { +func (tsc *trieStatisticsCollector) Add(trieStats *TrieStatsDTO) { + if trieStats == nil { + log.Warn("programming error, nil trie stats received") + return + } + tsc.numNodes += trieStats.TotalNumNodes tsc.triesSize += trieStats.TotalNodesSize tsc.numDataTries++ - insertInSortedArray(tsc.triesBySize, &trieStats, isLessSize) - insertInSortedArray(tsc.triesByDepth, &trieStats, isLessDeep) + insertInSortedArray(tsc.triesBySize, trieStats, isLessSize) + insertInSortedArray(tsc.triesByDepth, trieStats, isLessDeep) } // Print will print all the collected statistics diff --git a/trie/statistics/trieStatisticsCollector_test.go b/trie/statistics/trieStatisticsCollector_test.go index d869819ef7d..c2d6a9ab75d 100644 --- a/trie/statistics/trieStatisticsCollector_test.go +++ b/trie/statistics/trieStatisticsCollector_test.go @@ -46,9 +46,9 @@ func TestSnapshotStatistics_AddTrieStats(t *testing.T) { } } -func getTrieStatsDTO(maxLevel int, size uint64) TrieStatsDTO { +func getTrieStatsDTO(maxLevel int, size uint64) *TrieStatsDTO { ts := NewTrieStatistics() ts.AddBranchNode(maxLevel, size) - dto := ts.GetTrieStats() - return *dto + + return ts.GetTrieStats() } From b7f2e4ee3d57c3d163f7c59f83942d49b366f55d Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Tue, 25 Oct 2022 14:22:57 +0300 Subject: [PATCH 089/110] integrate overridables into prefs.toml --- cmd/node/config/prefs.toml | 12 + cmd/node/main.go | 10 + common/reflectcommon/errors.go | 1 + common/reflectcommon/structFieldsUpdate.go | 76 ++++++- .../reflectcommon/structFieldsUpdate_test.go | 211 ++++++++++++++++-- config/prefsConfig.go | 21 +- 6 files changed, 297 insertions(+), 34 deletions(-) diff --git a/cmd/node/config/prefs.toml b/cmd/node/config/prefs.toml index 11809b5aacd..461c25ca19c 100644 --- a/cmd/node/config/prefs.toml +++ b/cmd/node/config/prefs.toml @@ -31,3 +31,15 @@ # - "disabled" - no connection watching should be made # - "print" - new connection found will be printed in the log file ConnectionWatcherType = "disabled" + + # OverridableConfigTomlValues represents an array of items to be overloaded inside config.toml, which can be helpful + # when performing upgrades that bring a new config toml, and certain flags need to changed. + # The Path indicates what value to change, while Value represents the new value represented as string. The node operator must make sure + # to follow the same type of the original value (ex: uint32: "37", float32: "37.0", bool: "true") + # ------------------------------- + # Un-comment and update the following section in order to enable config values overloading + # ------------------------------- + # OverridableConfigTomlValues = [ + # { Path = "StoragePruning.NumEpochsToKeep", Value = "4" }, + # { Path = "MiniBlocksStorage.Cache.Name", Value = "MiniBlocksStorage" } + #] diff --git a/cmd/node/main.go b/cmd/node/main.go index 0366cb39287..fa87f359ca4 100644 --- a/cmd/node/main.go +++ b/cmd/node/main.go @@ -12,6 +12,7 @@ import ( "github.com/ElrondNetwork/elrond-go-logger/file" "github.com/ElrondNetwork/elrond-go/cmd/node/factory" "github.com/ElrondNetwork/elrond-go/common" + "github.com/ElrondNetwork/elrond-go/common/reflectcommon" "github.com/ElrondNetwork/elrond-go/config" "github.com/ElrondNetwork/elrond-go/node" "github.com/urfave/cli" @@ -186,6 +187,15 @@ func readConfigs(ctx *cli.Context, log logger.Logger) (*config.Configs, error) { } log.Debug("config", "file", configurationPaths.Preferences) + for _, overridable := range preferencesConfig.Preferences.OverridableConfigTomlValues { + err = reflectcommon.AdaptStructureValueBasedOnPath(generalConfig, overridable.Path, overridable.Value) + if err != nil { + return nil, err + } + + log.Info("updated config toml value", "path", overridable.Path, "new value", overridable.Value) + } + configurationPaths.External = ctx.GlobalString(externalConfigFile.Name) externalConfig, err := common.LoadExternalConfig(configurationPaths.External) if err != nil { diff --git a/common/reflectcommon/errors.go b/common/reflectcommon/errors.go index c166b3f1188..9745cd42a9d 100644 --- a/common/reflectcommon/errors.go +++ b/common/reflectcommon/errors.go @@ -4,6 +4,7 @@ import "errors" var ( errNilStructure = errors.New("nil structure to update") + errEmptyPath = errors.New("empty path to update") errCannotUpdateValueStructure = errors.New("cannot update structures that are not passed by pointer") errCannotSetValue = errors.New("cannot set value for field. it or it's structure might be unexported") errInvalidNestedStructure = errors.New("invalid structure name") diff --git a/common/reflectcommon/structFieldsUpdate.go b/common/reflectcommon/structFieldsUpdate.go index c11ac1f0910..e47156eb484 100644 --- a/common/reflectcommon/structFieldsUpdate.go +++ b/common/reflectcommon/structFieldsUpdate.go @@ -3,6 +3,7 @@ package reflectcommon import ( "fmt" "reflect" + "strconv" "strings" ) @@ -30,7 +31,7 @@ func getReflectValue(original reflect.Value, fieldName string) (value reflect.Va // the structure must be of type pointer, otherwise an error will be returned. All the fields or inner structures MUST be exported // the path must be in the form of InnerStruct.InnerStruct2.Field // newValue must have the same type as the old value, otherwise an error will be returned. Currently, this function does not support slices or maps -func AdaptStructureValueBasedOnPath(structure interface{}, path string, newValue interface{}) (err error) { +func AdaptStructureValueBasedOnPath(structure interface{}, path string, newValue string) (err error) { defer func() { r := recover() if r != nil { @@ -41,6 +42,9 @@ func AdaptStructureValueBasedOnPath(structure interface{}, path string, newValue if structure == nil { return errNilStructure } + if len(path) == 0 { + return errEmptyPath + } splitStr := strings.Split(path, ".") @@ -52,7 +56,6 @@ func AdaptStructureValueBasedOnPath(structure interface{}, path string, newValue value = value.Elem().FieldByName(splitStr[0]) for i := 1; i < len(splitStr); i++ { - value, err = getReflectValue(value, splitStr[i]) if err != nil { return err @@ -64,6 +67,73 @@ func AdaptStructureValueBasedOnPath(structure interface{}, path string, newValue return } - value.Set(reflect.ValueOf(newValue)) + return trySetTheNewValue(&value, newValue) +} + +func trySetTheNewValue(value *reflect.Value, newValue string) error { + valueKind := value.Kind() + fmt.Println(valueKind) + + errFunc := func() error { + return fmt.Errorf("cannot cast field <%s> to kind <%s>", newValue, valueKind) + } + + switch valueKind { + case reflect.Invalid: + return errFunc() + case reflect.Bool: + boolVal, err := strconv.ParseBool(newValue) + if err != nil { + return fmt.Errorf("%w: %s", errFunc(), err.Error()) + } + + value.Set(reflect.ValueOf(boolVal)) + case reflect.Int: + intVal, err := strconv.ParseInt(newValue, 10, 64) + if err != nil { + return fmt.Errorf("%w: %s", errFunc(), err.Error()) + } + + value.Set(reflect.ValueOf(int(intVal))) + case reflect.Int64: + int64Val, err := strconv.ParseInt(newValue, 10, 64) + if err != nil { + return fmt.Errorf("%w: %s", errFunc(), err.Error()) + } + + value.Set(reflect.ValueOf(int64Val)) + case reflect.Uint32: + uint32Val, err := strconv.ParseUint(newValue, 10, 32) + if err != nil { + return fmt.Errorf("%w: %s", errFunc(), err.Error()) + } + + value.Set(reflect.ValueOf(uint32(uint32Val))) + case reflect.Uint64: + uint64Val, err := strconv.ParseUint(newValue, 10, 64) + if err != nil { + return fmt.Errorf("%w: %s", errFunc(), err.Error()) + } + + value.Set(reflect.ValueOf(uint64Val)) + case reflect.Float32: + float32Val, err := strconv.ParseFloat(newValue, 32) + if err != nil { + return fmt.Errorf("%w: %s", errFunc(), err.Error()) + } + + value.Set(reflect.ValueOf(float32(float32Val))) + case reflect.Float64: + float64Val, err := strconv.ParseFloat(newValue, 32) + if err != nil { + return fmt.Errorf("%w: %s", errFunc(), err.Error()) + } + + value.Set(reflect.ValueOf(float64Val)) + case reflect.String: + value.Set(reflect.ValueOf(newValue)) + default: + return fmt.Errorf("unsupported type <%s> when trying to set the value <%s>", valueKind, newValue) + } return nil } diff --git a/common/reflectcommon/structFieldsUpdate_test.go b/common/reflectcommon/structFieldsUpdate_test.go index bc0c0d8e9ad..4eae069bd5d 100644 --- a/common/reflectcommon/structFieldsUpdate_test.go +++ b/common/reflectcommon/structFieldsUpdate_test.go @@ -1,6 +1,7 @@ package reflectcommon import ( + "fmt" "testing" "github.com/ElrondNetwork/elrond-go/config" @@ -30,56 +31,134 @@ func TestAdaptStructureValueBasedOnPath(t *testing.T) { require.Equal(t, "invalid structure name: InvalidFieldName", err.Error()) }) - t.Run("should error when trying to set int as string", func(t *testing.T) { + t.Run("should error when invalid field during multiple levels depth", func(t *testing.T) { t.Parallel() - path := "StoragePruning.AccountsTrieSkipRemovalCustomPattern" - expectedNewValue := 37 + path := "Hardfork.ExportKeysStorageConfig.DB2.FilePath" // DB2 instead of DB + expectedNewValue := "new file path" cfg := &config.Config{} - cfg.StoragePruning.AccountsTrieSkipRemovalCustomPattern = "%50" + cfg.Hardfork.ExportKeysStorageConfig.DB.FilePath = "original file path" err := AdaptStructureValueBasedOnPath(cfg, path, expectedNewValue) - require.Equal(t, "reflect.Set: value of type int is not assignable to type string", err.Error()) + require.Equal(t, "invalid structure name: DB2", err.Error()) }) - t.Run("should error when trying to set uint64 as uint32", func(t *testing.T) { + t.Run("should error when the final value is invalid", func(t *testing.T) { t.Parallel() - path := "StoragePruning.FullArchiveNumActivePersisters" - expectedNewValue := uint64(37) + path := "Hardfork.ExportKeysStorageConfig.DB.FilePath2" // FilePath2 instead of FilePath + expectedNewValue := "new file path" cfg := &config.Config{} - cfg.StoragePruning.FullArchiveNumActivePersisters = uint32(50) + cfg.Hardfork.ExportKeysStorageConfig.DB.FilePath = "original file path" err := AdaptStructureValueBasedOnPath(cfg, path, expectedNewValue) - require.Equal(t, "reflect.Set: value of type uint64 is not assignable to type uint32", err.Error()) + require.Equal(t, "invalid structure name: FilePath2", err.Error()) }) - t.Run("should error when invalid field during multiple levels depth", func(t *testing.T) { + t.Run("should error when setting invalid uint32", func(t *testing.T) { t.Parallel() - path := "Hardfork.ExportKeysStorageConfig.DB2.FilePath" // DB2 instead of DB - expectedNewValue := "new file path" + path := "TrieSyncStorage.Capacity" + expectedNewValue := "invalid uint32" cfg := &config.Config{} - cfg.Hardfork.ExportKeysStorageConfig.DB.FilePath = "original file path" + cfg.TrieSyncStorage.Capacity = 37 err := AdaptStructureValueBasedOnPath(cfg, path, expectedNewValue) - require.Equal(t, "invalid structure name: DB2", err.Error()) + require.ErrorContains(t, err, "cannot cast field to kind ") }) - t.Run("should error when the final value is invalid", func(t *testing.T) { + t.Run("should error when setting invalid uint64", func(t *testing.T) { t.Parallel() - path := "Hardfork.ExportKeysStorageConfig.DB.FilePath2" // FilePath2 instead of FilePath - expectedNewValue := "new file path" + path := "TrieSyncStorage.SizeInBytes" + expectedNewValue := "invalid uint64" cfg := &config.Config{} - cfg.Hardfork.ExportKeysStorageConfig.DB.FilePath = "original file path" + cfg.TrieSyncStorage.SizeInBytes = 37 err := AdaptStructureValueBasedOnPath(cfg, path, expectedNewValue) - require.Equal(t, "invalid structure name: FilePath2", err.Error()) + require.ErrorContains(t, err, "cannot cast field to kind ") + }) + + t.Run("should error when setting invalid float32", func(t *testing.T) { + t.Parallel() + + path := "HeartbeatV2.MinPeersThreshold" + expectedNewValue := "invalid float32" + cfg := &config.Config{} + cfg.HeartbeatV2.MinPeersThreshold = 37.0 + + err := AdaptStructureValueBasedOnPath(cfg, path, expectedNewValue) + + require.ErrorContains(t, err, "cannot cast field to kind ") + }) + + t.Run("should error when setting invalid float64", func(t *testing.T) { + t.Parallel() + + path := "HeartbeatV2.PeerShardThresholdBetweenSends" + expectedNewValue := "invalid float64" + cfg := &config.Config{} + cfg.HeartbeatV2.PeerShardThresholdBetweenSends = 37.0 + + err := AdaptStructureValueBasedOnPath(cfg, path, expectedNewValue) + + require.ErrorContains(t, err, "cannot cast field to kind ") + }) + + t.Run("should error when setting invalid int64", func(t *testing.T) { + t.Parallel() + + path := "HeartbeatV2.HeartbeatExpiryTimespanInSec" + expectedNewValue := "invalid int64" + cfg := &config.Config{} + cfg.HeartbeatV2.HeartbeatExpiryTimespanInSec = 37 + + err := AdaptStructureValueBasedOnPath(cfg, path, expectedNewValue) + + require.ErrorContains(t, err, "cannot cast field to kind ") + }) + + t.Run("should error when setting invalid int64", func(t *testing.T) { + t.Parallel() + + path := "HeartbeatV2.HeartbeatExpiryTimespanInSec" + expectedNewValue := "invalid int64" + cfg := &config.Config{} + cfg.HeartbeatV2.HeartbeatExpiryTimespanInSec = 37 + + err := AdaptStructureValueBasedOnPath(cfg, path, expectedNewValue) + + require.ErrorContains(t, err, "cannot cast field to kind ") + }) + + t.Run("should error when setting invalid int", func(t *testing.T) { + t.Parallel() + + path := "Debug.InterceptorResolver.DebugLineExpiration" + expectedNewValue := "invalid int" + cfg := &config.Config{} + cfg.Debug.InterceptorResolver.DebugLineExpiration = 37 + + err := AdaptStructureValueBasedOnPath(cfg, path, expectedNewValue) + + require.ErrorContains(t, err, "cannot cast field to kind ") + }) + + t.Run("should error when setting invalid bool", func(t *testing.T) { + t.Parallel() + + path := "Debug.InterceptorResolver.EnablePrint" + expectedNewValue := "invalid bool" + cfg := &config.Config{} + cfg.Debug.InterceptorResolver.EnablePrint = false + + err := AdaptStructureValueBasedOnPath(cfg, path, expectedNewValue) + + require.ErrorContains(t, err, "cannot cast field to kind ") }) t.Run("should error if the field is un-settable / unexported", func(t *testing.T) { @@ -119,7 +198,7 @@ func TestAdaptStructureValueBasedOnPath(t *testing.T) { path := "A.b.C" expectedNewValue := 37 - err := AdaptStructureValueBasedOnPath(obj, path, expectedNewValue) + err := AdaptStructureValueBasedOnPath(obj, path, fmt.Sprintf("%d", expectedNewValue)) require.Equal(t, "cannot set value for field. it or it's structure might be unexported. field name=C", err.Error()) }) @@ -169,6 +248,90 @@ func TestAdaptStructureValueBasedOnPath(t *testing.T) { require.Equal(t, expectedNewValue, cfg.StoragePruning.AccountsTrieSkipRemovalCustomPattern) }) + t.Run("should work and override uint32 value", func(t *testing.T) { + t.Parallel() + + path := "StoragePruning.FullArchiveNumActivePersisters" + expectedNewValue := uint32(38) + cfg := &config.Config{} + cfg.StoragePruning.FullArchiveNumActivePersisters = 37 + + err := AdaptStructureValueBasedOnPath(cfg, path, fmt.Sprintf("%d", expectedNewValue)) + require.NoError(t, err) + + require.Equal(t, expectedNewValue, cfg.StoragePruning.FullArchiveNumActivePersisters) + }) + + t.Run("should work and override float32 value", func(t *testing.T) { + t.Parallel() + + path := "HeartbeatV2.MinPeersThreshold" + expectedNewValue := float32(38.0) + cfg := &config.Config{} + cfg.HeartbeatV2.MinPeersThreshold = 37.0 + + err := AdaptStructureValueBasedOnPath(cfg, path, fmt.Sprintf("%f", expectedNewValue)) + require.NoError(t, err) + + require.Equal(t, expectedNewValue, cfg.HeartbeatV2.MinPeersThreshold) + }) + + t.Run("should work and override float64 value", func(t *testing.T) { + t.Parallel() + + path := "HeartbeatV2.PeerAuthenticationThresholdBetweenSends" + expectedNewValue := 38.0 + cfg := &config.Config{} + cfg.HeartbeatV2.PeerAuthenticationThresholdBetweenSends = 37.0 + + err := AdaptStructureValueBasedOnPath(cfg, path, fmt.Sprintf("%f", expectedNewValue)) + require.NoError(t, err) + + require.Equal(t, expectedNewValue, cfg.HeartbeatV2.PeerAuthenticationThresholdBetweenSends) + }) + + t.Run("should work and override int value", func(t *testing.T) { + t.Parallel() + + path := "Debug.InterceptorResolver.DebugLineExpiration" + expectedNewValue := 38 + cfg := &config.Config{} + cfg.Debug.InterceptorResolver.DebugLineExpiration = 37 + + err := AdaptStructureValueBasedOnPath(cfg, path, fmt.Sprintf("%d", expectedNewValue)) + require.NoError(t, err) + + require.Equal(t, expectedNewValue, cfg.Debug.InterceptorResolver.DebugLineExpiration) + }) + + t.Run("should work and override int64 value", func(t *testing.T) { + t.Parallel() + + path := "Hardfork.GenesisTime" + expectedNewValue := int64(38) + cfg := &config.Config{} + cfg.Hardfork.GenesisTime = 37 + + err := AdaptStructureValueBasedOnPath(cfg, path, fmt.Sprintf("%d", expectedNewValue)) + require.NoError(t, err) + + require.Equal(t, expectedNewValue, cfg.Hardfork.GenesisTime) + }) + + t.Run("should work and override uint64 value", func(t *testing.T) { + t.Parallel() + + path := "TrieSyncStorage.SizeInBytes" + expectedNewValue := uint64(38) + cfg := &config.Config{} + cfg.TrieSyncStorage.SizeInBytes = 37 + + err := AdaptStructureValueBasedOnPath(cfg, path, fmt.Sprintf("%d", expectedNewValue)) + require.NoError(t, err) + + require.Equal(t, expectedNewValue, cfg.TrieSyncStorage.SizeInBytes) + }) + t.Run("should work and override bool value", func(t *testing.T) { t.Parallel() @@ -176,7 +339,7 @@ func TestAdaptStructureValueBasedOnPath(t *testing.T) { cfg := &config.Config{} cfg.StoragePruning.AccountsTrieCleanOldEpochsData = false - err := AdaptStructureValueBasedOnPath(cfg, path, true) + err := AdaptStructureValueBasedOnPath(cfg, path, fmt.Sprintf("%v", true)) require.NoError(t, err) require.True(t, cfg.StoragePruning.AccountsTrieCleanOldEpochsData) @@ -190,7 +353,7 @@ func TestAdaptStructureValueBasedOnPath(t *testing.T) { cfg.StoragePruning.FullArchiveNumActivePersisters = uint32(50) expectedNewValue := uint32(37) - err := AdaptStructureValueBasedOnPath(cfg, path, expectedNewValue) + err := AdaptStructureValueBasedOnPath(cfg, path, fmt.Sprintf("%d", expectedNewValue)) require.NoError(t, err) require.Equal(t, expectedNewValue, cfg.StoragePruning.FullArchiveNumActivePersisters) @@ -218,7 +381,7 @@ func TestAdaptStructureValueBasedOnPath(t *testing.T) { cfg.Hardfork.ExportKeysStorageConfig.DB.MaxBatchSize = 10 expectedNewValue := 37 - err := AdaptStructureValueBasedOnPath(cfg, path, expectedNewValue) + err := AdaptStructureValueBasedOnPath(cfg, path, fmt.Sprintf("%d", expectedNewValue)) require.NoError(t, err) require.Equal(t, expectedNewValue, cfg.Hardfork.ExportKeysStorageConfig.DB.MaxBatchSize) diff --git a/config/prefsConfig.go b/config/prefsConfig.go index ce9651fe285..4d35730b836 100644 --- a/config/prefsConfig.go +++ b/config/prefsConfig.go @@ -7,11 +7,18 @@ type Preferences struct { // PreferencesConfig will hold the fields which are node specific such as the display name type PreferencesConfig struct { - DestinationShardAsObserver string - NodeDisplayName string - Identity string - RedundancyLevel int64 - PreferredConnections []string - ConnectionWatcherType string - FullArchive bool + DestinationShardAsObserver string + NodeDisplayName string + Identity string + RedundancyLevel int64 + PreferredConnections []string + ConnectionWatcherType string + OverridableConfigTomlValues []OverridableConfig + FullArchive bool +} + +// OverridableConfig holds the path and the new value to be updated in the configuration +type OverridableConfig struct { + Path string + Value string } From d28d9022b417a730129bab69cea2436f99ca32e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Camil=20B=C4=83ncioiu?= Date: Tue, 25 Oct 2022 14:36:46 +0300 Subject: [PATCH 090/110] Update legacy VM versions in go.mod --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 81ec4d6a9b2..3a5e67343ce 100644 --- a/go.mod +++ b/go.mod @@ -11,8 +11,8 @@ require ( github.com/ElrondNetwork/elrond-go-p2p v1.0.3 github.com/ElrondNetwork/elrond-go-storage v1.0.1 github.com/ElrondNetwork/elrond-vm-common v1.3.22 - github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.42 - github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.42 + github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.44 + github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.44 github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.62 github.com/beevik/ntp v0.3.0 github.com/davecgh/go-spew v1.1.1 diff --git a/go.sum b/go.sum index afedd06f7f5..42cfdbdbea8 100644 --- a/go.sum +++ b/go.sum @@ -81,10 +81,10 @@ github.com/ElrondNetwork/go-libp2p-pubsub v0.6.1-rc1 h1:Nu/uwYQg/QbfoQ0uD6GahYTw github.com/ElrondNetwork/go-libp2p-pubsub v0.6.1-rc1/go.mod h1:pJfaShe+i5aWZx8NhSkQjvOYQYLoqPztmFUlKjToOzM= github.com/ElrondNetwork/protobuf v1.3.2 h1:qoCSYiO+8GtXBEZWEjw0WPcZfM3g7QuuJrwpN+y6Mvg= github.com/ElrondNetwork/protobuf v1.3.2/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.42 h1:szZcuaxPElmLvYRezR4YayPDqRxDMCWspknhtSHJQyo= -github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.42/go.mod h1:d1Pirw0GnD4Eh5lhBvX9Bn+N1AHb/FzRVKZSHwWwJLg= -github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.42 h1:EhLjiR/MnWSuLW3xtWh69oBZ4zAsym/QrhGKsVWwJjw= -github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.42/go.mod h1:7JeSIgpcCxKiD67iSjnlBQt7qIQf+oSuehtBQp0QgVM= +github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.44 h1:B1cW2Gvmi88nATPi0kFUGH7Q4AMTiTDcCrdpEZuvPJs= +github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.44/go.mod h1:d1Pirw0GnD4Eh5lhBvX9Bn+N1AHb/FzRVKZSHwWwJLg= +github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.44 h1:YKaXYG7Y+7Hy8Pd190B6ZuzYSnZF9vgzdqINFEGO4+4= +github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.44/go.mod h1:7JeSIgpcCxKiD67iSjnlBQt7qIQf+oSuehtBQp0QgVM= github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.62 h1:XZAF3CEMfs9Ct+aXV2IKBtxg7DGl5PMqp8yaBk6NriU= github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.62/go.mod h1:BtjngiK7DLyACe/hNM6aHIStmQtYi9eBnvZiFxrys2o= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= From d29bfa3f1ef886f0471d3354e05e9aa0cfffbb84 Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Tue, 25 Oct 2022 17:49:28 +0300 Subject: [PATCH 091/110] fix custom meta DB remover --- storage/factory/pruningStorerFactory.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/storage/factory/pruningStorerFactory.go b/storage/factory/pruningStorerFactory.go index 58fb41ffbbd..5c2911fc1c8 100644 --- a/storage/factory/pruningStorerFactory.go +++ b/storage/factory/pruningStorerFactory.go @@ -12,7 +12,6 @@ import ( "github.com/ElrondNetwork/elrond-go/epochStart" "github.com/ElrondNetwork/elrond-go/storage" "github.com/ElrondNetwork/elrond-go/storage/clean" - "github.com/ElrondNetwork/elrond-go/storage/databaseremover" "github.com/ElrondNetwork/elrond-go/storage/databaseremover/disabled" "github.com/ElrondNetwork/elrond-go/storage/databaseremover/factory" storageDisabled "github.com/ElrondNetwork/elrond-go/storage/disabled" @@ -301,6 +300,9 @@ func (psf *StorageServiceFactory) CreateForShard() (dataRetriever.StorageService return store, err } +// TODO: split in 2 components shardStorageServiceCreator and metStorageServiceCreator that have a base which will contain the +// common storers + // CreateForMeta will return the storage service which contains all storers needed for metachain func (psf *StorageServiceFactory) CreateForMeta() (dataRetriever.StorageService, error) { var metaBlockUnit storage.Storer @@ -322,7 +324,7 @@ func (psf *StorageServiceFactory) CreateForMeta() (dataRetriever.StorageService, // in case of a failure while creating (not opening) disabledCustomDatabaseRemover := disabled.NewDisabledCustomDatabaseRemover() - customDatabaseRemover, err := databaseremover.NewCustomDatabaseRemover(psf.generalConfig.StoragePruning) + customDatabaseRemover, err := factory.CreateCustomDatabaseRemover(psf.generalConfig.StoragePruning) if err != nil { return nil, err } From c0157c42640398f1cdf389e70a94dce2e1eb3055 Mon Sep 17 00:00:00 2001 From: jules01 Date: Tue, 25 Oct 2022 20:02:01 +0300 Subject: [PATCH 092/110] - removed duplicated code --- storage/factory/pruningStorerFactory.go | 328 +++++++----------------- 1 file changed, 97 insertions(+), 231 deletions(-) diff --git a/storage/factory/pruningStorerFactory.go b/storage/factory/pruningStorerFactory.go index 5c2911fc1c8..d7551fa954a 100644 --- a/storage/factory/pruningStorerFactory.go +++ b/storage/factory/pruningStorerFactory.go @@ -111,121 +111,113 @@ func checkArgs(args StorageServiceFactoryArgs) error { return nil } -// CreateForShard will return the storage service which contains all storers needed for a shard -func (psf *StorageServiceFactory) CreateForShard() (dataRetriever.StorageService, error) { - var headerUnit storage.Storer - var peerBlockUnit storage.Storer - var miniBlockUnit storage.Storer - var txUnit storage.Storer - var metachainHeaderUnit storage.Storer - var unsignedTxUnit storage.Storer - var rewardTxUnit storage.Storer - var bootstrapUnit storage.Storer - var receiptsUnit storage.Storer - var userAccountsUnit storage.Storer - var peerAccountsUnit storage.Storer - var userAccountsCheckpointsUnit storage.Storer - var peerAccountsCheckpointsUnit storage.Storer - var scheduledSCRsUnit storage.Storer - var err error - - // TODO: if there will be a differentiation between the creation or opening of a DB, the DBs could be destroyed on a defer - // in case of a failure while creating (not opening). - +func (psf *StorageServiceFactory) createAndAddBaseStorageUnits(store dataRetriever.StorageService, shardID string) error { disabledCustomDatabaseRemover := disabled.NewDisabledCustomDatabaseRemover() customDatabaseRemover, err := factory.CreateCustomDatabaseRemover(psf.generalConfig.StoragePruning) if err != nil { - return nil, err + return err } - txUnitStorerArgs := psf.createPruningStorerArgs(psf.generalConfig.TxStorage, disabledCustomDatabaseRemover) - txUnit, err = psf.createPruningPersister(txUnitStorerArgs) + txUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.TxStorage, disabledCustomDatabaseRemover) + txUnit, err := psf.createPruningPersister(txUnitArgs) if err != nil { - return nil, err + return err } + store.AddStorer(dataRetriever.TransactionUnit, txUnit) - unsignedTxUnitStorerArgs := psf.createPruningStorerArgs(psf.generalConfig.UnsignedTransactionStorage, disabledCustomDatabaseRemover) - unsignedTxUnit, err = psf.createPruningPersister(unsignedTxUnitStorerArgs) + unsignedTxUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.UnsignedTransactionStorage, disabledCustomDatabaseRemover) + unsignedTxUnit, err := psf.createPruningPersister(unsignedTxUnitArgs) if err != nil { - return nil, err + return err } + store.AddStorer(dataRetriever.UnsignedTransactionUnit, unsignedTxUnit) rewardTxUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.RewardTxStorage, disabledCustomDatabaseRemover) - rewardTxUnit, err = psf.createPruningPersister(rewardTxUnitArgs) + rewardTxUnit, err := psf.createPruningPersister(rewardTxUnitArgs) if err != nil { - return nil, err + return err } + store.AddStorer(dataRetriever.RewardTransactionUnit, rewardTxUnit) - miniBlockUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.MiniBlocksStorage, disabledCustomDatabaseRemover) - miniBlockUnit, err = psf.createPruningPersister(miniBlockUnitArgs) + receiptsUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.ReceiptsStorage, disabledCustomDatabaseRemover) + receiptsUnit, err := psf.createPruningPersister(receiptsUnitArgs) if err != nil { - return nil, err + return err } + store.AddStorer(dataRetriever.ReceiptsUnit, receiptsUnit) - peerBlockUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.PeerBlockBodyStorage, disabledCustomDatabaseRemover) - peerBlockUnit, err = psf.createPruningPersister(peerBlockUnitArgs) + scheduledSCRsUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.ScheduledSCRsStorage, disabledCustomDatabaseRemover) + scheduledSCRsUnit, err := psf.createPruningPersister(scheduledSCRsUnitArgs) if err != nil { - return nil, err + return err } + store.AddStorer(dataRetriever.ScheduledSCRsUnit, scheduledSCRsUnit) - headerUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.BlockHeaderStorage, disabledCustomDatabaseRemover) - headerUnit, err = psf.createPruningPersister(headerUnitArgs) + bootstrapUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.BootstrapStorage, disabledCustomDatabaseRemover) + bootstrapUnit, err := psf.createPruningPersister(bootstrapUnitArgs) if err != nil { - return nil, err + return err } + store.AddStorer(dataRetriever.BootstrapUnit, bootstrapUnit) - metaChainHeaderUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.MetaBlockStorage, disabledCustomDatabaseRemover) - metachainHeaderUnit, err = psf.createPruningPersister(metaChainHeaderUnitArgs) + miniBlockUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.MiniBlocksStorage, disabledCustomDatabaseRemover) + miniBlockUnit, err := psf.createPruningPersister(miniBlockUnitArgs) if err != nil { - return nil, err + return err } + store.AddStorer(dataRetriever.MiniBlockUnit, miniBlockUnit) - userAccountsUnit, err = psf.createTriePruningStorer(psf.generalConfig.AccountsTrieStorage, customDatabaseRemover) + metaBlockUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.MetaBlockStorage, disabledCustomDatabaseRemover) + metaBlockUnit, err := psf.createPruningPersister(metaBlockUnitArgs) if err != nil { - return nil, err + return err } + store.AddStorer(dataRetriever.MetaBlockUnit, metaBlockUnit) - peerAccountsUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.PeerAccountsTrieStorage, customDatabaseRemover) - peerAccountsUnit, err = psf.createTrieUnit(psf.generalConfig.PeerAccountsTrieStorage, peerAccountsUnitArgs) + // metaHdrHashNonce is static + metaHdrHashNonceUnitConfig := GetDBFromConfig(psf.generalConfig.MetaHdrNonceHashStorage.DB) + dbPath := psf.pathManager.PathForStatic(shardID, psf.generalConfig.MetaHdrNonceHashStorage.DB.FilePath) + metaHdrHashNonceUnitConfig.FilePath = dbPath + metaHdrHashNonceUnit, err := storageunit.NewStorageUnitFromConf( + GetCacherFromConfig(psf.generalConfig.MetaHdrNonceHashStorage.Cache), + metaHdrHashNonceUnitConfig) if err != nil { - return nil, err + return err } + store.AddStorer(dataRetriever.MetaHdrNonceHashDataUnit, metaHdrHashNonceUnit) - userAccountsCheckpointsUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.AccountsTrieCheckpointsStorage, disabledCustomDatabaseRemover) - userAccountsCheckpointsUnit, err = psf.createPruningPersister(userAccountsCheckpointsUnitArgs) + headerUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.BlockHeaderStorage, disabledCustomDatabaseRemover) + headerUnit, err := psf.createPruningPersister(headerUnitArgs) if err != nil { - return nil, err + return err } + store.AddStorer(dataRetriever.BlockHeaderUnit, headerUnit) - peerAccountsCheckpointsUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.PeerAccountsTrieCheckpointsStorage, disabledCustomDatabaseRemover) - peerAccountsCheckpointsUnit, err = psf.createPruningPersister(peerAccountsCheckpointsUnitArgs) + userAccountsUnit, err := psf.createTriePruningStorer(psf.generalConfig.AccountsTrieStorage, customDatabaseRemover) if err != nil { - return nil, err + return err } + store.AddStorer(dataRetriever.UserAccountsUnit, userAccountsUnit) - // metaHdrHashNonce is static - metaHdrHashNonceUnitConfig := GetDBFromConfig(psf.generalConfig.MetaHdrNonceHashStorage.DB) - shardID := core.GetShardIDString(psf.shardCoordinator.SelfId()) - dbPath := psf.pathManager.PathForStatic(shardID, psf.generalConfig.MetaHdrNonceHashStorage.DB.FilePath) - metaHdrHashNonceUnitConfig.FilePath = dbPath - metaHdrHashNonceUnit, err := storageunit.NewStorageUnitFromConf( - GetCacherFromConfig(psf.generalConfig.MetaHdrNonceHashStorage.Cache), - metaHdrHashNonceUnitConfig) + peerAccountsUnit, err := psf.createTriePruningStorer(psf.generalConfig.PeerAccountsTrieStorage, customDatabaseRemover) if err != nil { - return nil, err + return err } + store.AddStorer(dataRetriever.PeerAccountsUnit, peerAccountsUnit) - // shardHdrHashNonce storer is static - shardHdrHashNonceConfig := GetDBFromConfig(psf.generalConfig.ShardHdrNonceHashStorage.DB) - shardID = core.GetShardIDString(psf.shardCoordinator.SelfId()) - dbPath = psf.pathManager.PathForStatic(shardID, psf.generalConfig.ShardHdrNonceHashStorage.DB.FilePath) + shardID - shardHdrHashNonceConfig.FilePath = dbPath - shardHdrHashNonceUnit, err := storageunit.NewStorageUnitFromConf( - GetCacherFromConfig(psf.generalConfig.ShardHdrNonceHashStorage.Cache), - shardHdrHashNonceConfig) + userAccountsCheckpointsUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.AccountsTrieCheckpointsStorage, disabledCustomDatabaseRemover) + userAccountsCheckpointsUnit, err := psf.createPruningPersister(userAccountsCheckpointsUnitArgs) if err != nil { - return nil, err + return err + } + store.AddStorer(dataRetriever.UserAccountsCheckpointsUnit, userAccountsCheckpointsUnit) + + peerAccountsCheckpointsUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.PeerAccountsTrieCheckpointsStorage, disabledCustomDatabaseRemover) + peerAccountsCheckpointsUnit, err := psf.createPruningPersister(peerAccountsCheckpointsUnitArgs) + if err != nil { + return err } + store.AddStorer(dataRetriever.PeerAccountsCheckpointsUnit, peerAccountsCheckpointsUnit) statusMetricsDbConfig := GetDBFromConfig(psf.generalConfig.StatusMetricsStorage.DB) shardId := core.GetShardIDString(psf.shardCoordinator.SelfId()) @@ -235,52 +227,58 @@ func (psf *StorageServiceFactory) CreateForShard() (dataRetriever.StorageService GetCacherFromConfig(psf.generalConfig.StatusMetricsStorage.Cache), statusMetricsDbConfig) if err != nil { - return nil, err + return err } + store.AddStorer(dataRetriever.StatusMetricsUnit, statusMetricsStorageUnit) trieEpochRootHashStorageUnit, err := psf.createTrieEpochRootHashStorerIfNeeded() if err != nil { - return nil, err + return err } + store.AddStorer(dataRetriever.TrieEpochRootHashUnit, trieEpochRootHashStorageUnit) - bootstrapUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.BootstrapStorage, disabledCustomDatabaseRemover) - bootstrapUnit, err = psf.createPruningPersister(bootstrapUnitArgs) + return nil +} + +// CreateForShard will return the storage service which contains all storers needed for a shard +func (psf *StorageServiceFactory) CreateForShard() (dataRetriever.StorageService, error) { + var peerBlockUnit storage.Storer + var err error + + // TODO: if there will be a differentiation between the creation or opening of a DB, the DBs could be destroyed on a defer + // in case of a failure while creating (not opening). + + disabledCustomDatabaseRemover := disabled.NewDisabledCustomDatabaseRemover() + + peerBlockUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.PeerBlockBodyStorage, disabledCustomDatabaseRemover) + peerBlockUnit, err = psf.createPruningPersister(peerBlockUnitArgs) if err != nil { return nil, err } - receiptsUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.ReceiptsStorage, disabledCustomDatabaseRemover) - receiptsUnit, err = psf.createPruningPersister(receiptsUnitArgs) + shardID := core.GetShardIDString(psf.shardCoordinator.SelfId()) + + // shardHdrHashNonce storer is static + shardHdrHashNonceConfig := GetDBFromConfig(psf.generalConfig.ShardHdrNonceHashStorage.DB) + shardID = core.GetShardIDString(psf.shardCoordinator.SelfId()) + dbPath := psf.pathManager.PathForStatic(shardID, psf.generalConfig.ShardHdrNonceHashStorage.DB.FilePath) + shardID + shardHdrHashNonceConfig.FilePath = dbPath + shardHdrHashNonceUnit, err := storageunit.NewStorageUnitFromConf( + GetCacherFromConfig(psf.generalConfig.ShardHdrNonceHashStorage.Cache), + shardHdrHashNonceConfig) if err != nil { return nil, err } - scheduledSCRsUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.ScheduledSCRsStorage, disabledCustomDatabaseRemover) - scheduledSCRsUnit, err = psf.createPruningPersister(scheduledSCRsUnitArgs) + store := dataRetriever.NewChainStorer() + err = psf.createAndAddBaseStorageUnits(store, shardID) if err != nil { return nil, err } - store := dataRetriever.NewChainStorer() - store.AddStorer(dataRetriever.TransactionUnit, txUnit) - store.AddStorer(dataRetriever.MiniBlockUnit, miniBlockUnit) store.AddStorer(dataRetriever.PeerChangesUnit, peerBlockUnit) - store.AddStorer(dataRetriever.BlockHeaderUnit, headerUnit) - store.AddStorer(dataRetriever.MetaBlockUnit, metachainHeaderUnit) - store.AddStorer(dataRetriever.UnsignedTransactionUnit, unsignedTxUnit) - store.AddStorer(dataRetriever.RewardTransactionUnit, rewardTxUnit) - store.AddStorer(dataRetriever.MetaHdrNonceHashDataUnit, metaHdrHashNonceUnit) hdrNonceHashDataUnit := dataRetriever.ShardHdrNonceHashDataUnit + dataRetriever.UnitType(psf.shardCoordinator.SelfId()) store.AddStorer(hdrNonceHashDataUnit, shardHdrHashNonceUnit) - store.AddStorer(dataRetriever.BootstrapUnit, bootstrapUnit) - store.AddStorer(dataRetriever.StatusMetricsUnit, statusMetricsStorageUnit) - store.AddStorer(dataRetriever.ReceiptsUnit, receiptsUnit) - store.AddStorer(dataRetriever.TrieEpochRootHashUnit, trieEpochRootHashStorageUnit) - store.AddStorer(dataRetriever.UserAccountsUnit, userAccountsUnit) - store.AddStorer(dataRetriever.PeerAccountsUnit, peerAccountsUnit) - store.AddStorer(dataRetriever.UserAccountsCheckpointsUnit, userAccountsCheckpointsUnit) - store.AddStorer(dataRetriever.PeerAccountsCheckpointsUnit, peerAccountsCheckpointsUnit) - store.AddStorer(dataRetriever.ScheduledSCRsUnit, scheduledSCRsUnit) err = psf.setupDbLookupExtensions(store) if err != nil { @@ -305,81 +303,18 @@ func (psf *StorageServiceFactory) CreateForShard() (dataRetriever.StorageService // CreateForMeta will return the storage service which contains all storers needed for metachain func (psf *StorageServiceFactory) CreateForMeta() (dataRetriever.StorageService, error) { - var metaBlockUnit storage.Storer - var headerUnit storage.Storer - var txUnit storage.Storer - var miniBlockUnit storage.Storer - var unsignedTxUnit storage.Storer - var rewardTxUnit storage.Storer - var bootstrapUnit storage.Storer - var receiptsUnit storage.Storer - var userAccountsUnit storage.Storer - var peerAccountsUnit storage.Storer - var userAccountsCheckpointsUnit storage.Storer - var peerAccountsCheckpointsUnit storage.Storer - var scheduledSCRsUnit storage.Storer var err error // TODO: if there will be a differentiation between the creation or opening of a DB, the DBs could be destroyed on a defer // in case of a failure while creating (not opening) - disabledCustomDatabaseRemover := disabled.NewDisabledCustomDatabaseRemover() - customDatabaseRemover, err := factory.CreateCustomDatabaseRemover(psf.generalConfig.StoragePruning) - if err != nil { - return nil, err - } - - metaBlockUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.MetaBlockStorage, disabledCustomDatabaseRemover) - metaBlockUnit, err = psf.createPruningPersister(metaBlockUnitArgs) - if err != nil { - return nil, err - } - - headerUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.BlockHeaderStorage, disabledCustomDatabaseRemover) - headerUnit, err = psf.createPruningPersister(headerUnitArgs) - if err != nil { - return nil, err - } - - userAccountsUnit, err = psf.createTriePruningStorer(psf.generalConfig.AccountsTrieStorage, customDatabaseRemover) - if err != nil { - return nil, err - } - - peerAccountsUnit, err = psf.createTriePruningStorer(psf.generalConfig.PeerAccountsTrieStorage, customDatabaseRemover) - if err != nil { - return nil, err - } - - userAccountsCheckpointsUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.AccountsTrieCheckpointsStorage, disabledCustomDatabaseRemover) - userAccountsCheckpointsUnit, err = psf.createPruningPersister(userAccountsCheckpointsUnitArgs) - if err != nil { - return nil, err - } - - peerAccountsCheckpointsUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.PeerAccountsTrieCheckpointsStorage, disabledCustomDatabaseRemover) - peerAccountsCheckpointsUnit, err = psf.createPruningPersister(peerAccountsCheckpointsUnitArgs) - if err != nil { - return nil, err - } - - // metaHdrHashNonce is static - metaHdrHashNonceUnitConfig := GetDBFromConfig(psf.generalConfig.MetaHdrNonceHashStorage.DB) shardID := core.GetShardIDString(core.MetachainShardId) - dbPath := psf.pathManager.PathForStatic(shardID, psf.generalConfig.MetaHdrNonceHashStorage.DB.FilePath) - metaHdrHashNonceUnitConfig.FilePath = dbPath - metaHdrHashNonceUnit, err := storageunit.NewStorageUnitFromConf( - GetCacherFromConfig(psf.generalConfig.MetaHdrNonceHashStorage.Cache), - metaHdrHashNonceUnitConfig) - if err != nil { - return nil, err - } shardHdrHashNonceUnits := make([]*storageunit.Unit, psf.shardCoordinator.NumberOfShards()) for i := uint32(0); i < psf.shardCoordinator.NumberOfShards(); i++ { shardHdrHashNonceConfig := GetDBFromConfig(psf.generalConfig.ShardHdrNonceHashStorage.DB) shardID = core.GetShardIDString(core.MetachainShardId) - dbPath = psf.pathManager.PathForStatic(shardID, psf.generalConfig.ShardHdrNonceHashStorage.DB.FilePath) + fmt.Sprintf("%d", i) + dbPath := psf.pathManager.PathForStatic(shardID, psf.generalConfig.ShardHdrNonceHashStorage.DB.FilePath) + fmt.Sprintf("%d", i) shardHdrHashNonceConfig.FilePath = dbPath shardHdrHashNonceUnits[i], err = storageunit.NewStorageUnitFromConf( GetCacherFromConfig(psf.generalConfig.ShardHdrNonceHashStorage.Cache), @@ -389,85 +324,16 @@ func (psf *StorageServiceFactory) CreateForMeta() (dataRetriever.StorageService, } } - statusMetricsDbConfig := GetDBFromConfig(psf.generalConfig.StatusMetricsStorage.DB) - shardId := core.GetShardIDString(psf.shardCoordinator.SelfId()) - dbPath = psf.pathManager.PathForStatic(shardId, psf.generalConfig.StatusMetricsStorage.DB.FilePath) - statusMetricsDbConfig.FilePath = dbPath - statusMetricsStorageUnit, err := storageunit.NewStorageUnitFromConf( - GetCacherFromConfig(psf.generalConfig.StatusMetricsStorage.Cache), - statusMetricsDbConfig) - if err != nil { - return nil, err - } - - trieEpochRootHashStorageUnit, err := psf.createTrieEpochRootHashStorerIfNeeded() - if err != nil { - return nil, err - } - - txUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.TxStorage, disabledCustomDatabaseRemover) - txUnit, err = psf.createPruningPersister(txUnitArgs) - if err != nil { - return nil, err - } - - unsignedTxUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.UnsignedTransactionStorage, disabledCustomDatabaseRemover) - unsignedTxUnit, err = psf.createPruningPersister(unsignedTxUnitArgs) - if err != nil { - return nil, err - } - - rewardTxUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.RewardTxStorage, disabledCustomDatabaseRemover) - rewardTxUnit, err = psf.createPruningPersister(rewardTxUnitArgs) - if err != nil { - return nil, err - } - - miniBlockUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.MiniBlocksStorage, disabledCustomDatabaseRemover) - miniBlockUnit, err = psf.createPruningPersister(miniBlockUnitArgs) - if err != nil { - return nil, err - } - - bootstrapUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.BootstrapStorage, disabledCustomDatabaseRemover) - bootstrapUnit, err = psf.createPruningPersister(bootstrapUnitArgs) - if err != nil { - return nil, err - } - - receiptsUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.ReceiptsStorage, disabledCustomDatabaseRemover) - receiptsUnit, err = psf.createPruningPersister(receiptsUnitArgs) - if err != nil { - return nil, err - } - - scheduledSCRsUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.ScheduledSCRsStorage, disabledCustomDatabaseRemover) - scheduledSCRsUnit, err = pruning.NewPruningStorer(scheduledSCRsUnitArgs) + store := dataRetriever.NewChainStorer() + err = psf.createAndAddBaseStorageUnits(store, shardID) if err != nil { return nil, err } - store := dataRetriever.NewChainStorer() - store.AddStorer(dataRetriever.MetaBlockUnit, metaBlockUnit) - store.AddStorer(dataRetriever.BlockHeaderUnit, headerUnit) - store.AddStorer(dataRetriever.MetaHdrNonceHashDataUnit, metaHdrHashNonceUnit) - store.AddStorer(dataRetriever.TransactionUnit, txUnit) - store.AddStorer(dataRetriever.UnsignedTransactionUnit, unsignedTxUnit) - store.AddStorer(dataRetriever.MiniBlockUnit, miniBlockUnit) - store.AddStorer(dataRetriever.RewardTransactionUnit, rewardTxUnit) for i := uint32(0); i < psf.shardCoordinator.NumberOfShards(); i++ { hdrNonceHashDataUnit := dataRetriever.ShardHdrNonceHashDataUnit + dataRetriever.UnitType(i) store.AddStorer(hdrNonceHashDataUnit, shardHdrHashNonceUnits[i]) } - store.AddStorer(dataRetriever.BootstrapUnit, bootstrapUnit) - store.AddStorer(dataRetriever.StatusMetricsUnit, statusMetricsStorageUnit) - store.AddStorer(dataRetriever.ReceiptsUnit, receiptsUnit) - store.AddStorer(dataRetriever.TrieEpochRootHashUnit, trieEpochRootHashStorageUnit) - store.AddStorer(dataRetriever.UserAccountsUnit, userAccountsUnit) - store.AddStorer(dataRetriever.PeerAccountsUnit, peerAccountsUnit) - store.AddStorer(dataRetriever.UserAccountsCheckpointsUnit, userAccountsCheckpointsUnit) - store.AddStorer(dataRetriever.PeerAccountsCheckpointsUnit, peerAccountsCheckpointsUnit) - store.AddStorer(dataRetriever.ScheduledSCRsUnit, scheduledSCRsUnit) err = psf.setupDbLookupExtensions(store) if err != nil { From 4ecc9a3d084aa61e74d41442548568f1003edc48 Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Wed, 26 Oct 2022 11:52:38 +0300 Subject: [PATCH 093/110] fixes after review: remove print --- common/reflectcommon/structFieldsUpdate.go | 1 - 1 file changed, 1 deletion(-) diff --git a/common/reflectcommon/structFieldsUpdate.go b/common/reflectcommon/structFieldsUpdate.go index e47156eb484..8f3c18945d0 100644 --- a/common/reflectcommon/structFieldsUpdate.go +++ b/common/reflectcommon/structFieldsUpdate.go @@ -72,7 +72,6 @@ func AdaptStructureValueBasedOnPath(structure interface{}, path string, newValue func trySetTheNewValue(value *reflect.Value, newValue string) error { valueKind := value.Kind() - fmt.Println(valueKind) errFunc := func() error { return fmt.Errorf("cannot cast field <%s> to kind <%s>", newValue, valueKind) From 3fe87b36a7691991f2b02b328ea5cb1e8fdb45ed Mon Sep 17 00:00:00 2001 From: BeniaminDrasovean Date: Wed, 26 Oct 2022 15:56:59 +0300 Subject: [PATCH 094/110] update go mod --- go.mod | 6 +- go.sum | 1759 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1762 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 3a0b86e03a0..d5dcd6690d4 100644 --- a/go.mod +++ b/go.mod @@ -11,9 +11,9 @@ require ( github.com/ElrondNetwork/elrond-go-p2p v1.0.3 github.com/ElrondNetwork/elrond-go-storage v1.0.1 github.com/ElrondNetwork/elrond-vm-common v1.3.24 - github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.44 - github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.44 - github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.62 + github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.45-rc + github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.45-rc + github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.63 github.com/beevik/ntp v0.3.0 github.com/davecgh/go-spew v1.1.1 github.com/elastic/go-elasticsearch/v7 v7.12.0 diff --git a/go.sum b/go.sum index e69de29bb2d..bdf1550cfe3 100644 --- a/go.sum +++ b/go.sum @@ -0,0 +1,1759 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= +dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= +dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= +git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/ElrondNetwork/big-int-util v0.1.0 h1:vTMoJ5azhVmr7jhpSD3JUjQdkdyXoEPVkOvhdw1RjV4= +github.com/ElrondNetwork/big-int-util v0.1.0/go.mod h1:96viBvoTXLjZOhEvE0D+QnAwg1IJLPAK6GVHMbC7Aw4= +github.com/ElrondNetwork/concurrent-map v0.1.3 h1:j2LtPrNJuerannC1cQDE79STvi/P04gd61sNYo04Zf0= +github.com/ElrondNetwork/concurrent-map v0.1.3/go.mod h1:3XwSwn4JHI0lrKxWLZvtp53Emr8BXYTmNQGwcukHJEE= +github.com/ElrondNetwork/covalent-indexer-go v1.0.6 h1:+LNKItUc+Pb7WuTbil3VuiLMmdQ1AY7lBJM476PtVNE= +github.com/ElrondNetwork/covalent-indexer-go v1.0.6/go.mod h1:j3h2g96vqhJAuj3aEX2PWhomae2/o7YfXGEfweNXEeQ= +github.com/ElrondNetwork/elastic-indexer-go v1.2.45 h1:Yqwe4Ysn/VVypo4/2ohS994BHr59ZLsJXioTgjKND3w= +github.com/ElrondNetwork/elastic-indexer-go v1.2.45/go.mod h1:lGTJNWWcAz5gcA6Wue435ncnI6PhXtKJ5iwSfp5//8c= +github.com/ElrondNetwork/elrond-go-core v1.0.0/go.mod h1:FQMem7fFF4+8pQ6lVsBZq6yO+smD0nV23P4bJpmPjTo= +github.com/ElrondNetwork/elrond-go-core v1.1.7/go.mod h1:O9FkkTT2H9kxCzfn40TbhoCDXzGmUrRVusMomhK/Y3g= +github.com/ElrondNetwork/elrond-go-core v1.1.13/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= +github.com/ElrondNetwork/elrond-go-core v1.1.18/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= +github.com/ElrondNetwork/elrond-go-core v1.1.19/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= +github.com/ElrondNetwork/elrond-go-core v1.1.23 h1:IJ+D/6PAFn36fjI84tyM/3rvZroiUjNGtyY2u/5CoO4= +github.com/ElrondNetwork/elrond-go-core v1.1.23/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= +github.com/ElrondNetwork/elrond-go-crypto v1.0.0/go.mod h1:DGiR7/j1xv729Xg8SsjYaUzWXL5svMd44REXjWS/gAc= +github.com/ElrondNetwork/elrond-go-crypto v1.2.1 h1:5wWCBEZp5SMFO2+Nal8UaJNJcG9G9J4PHNNZvQpEeUE= +github.com/ElrondNetwork/elrond-go-crypto v1.2.1/go.mod h1:UNmpDaJjLTKxfzUcwua2R7Mh9bicw/L3ICJt5V7zqMo= +github.com/ElrondNetwork/elrond-go-logger v1.0.4/go.mod h1:e5D+c97lKUfFdAzFX7rrI2Igl/z4Y0RkKYKWyzprTGk= +github.com/ElrondNetwork/elrond-go-logger v1.0.5/go.mod h1:cBfgx0ST/CJx8jrxJSC5aiSrvkGzcnF7sK06RD8mFxQ= +github.com/ElrondNetwork/elrond-go-logger v1.0.7/go.mod h1:cBfgx0ST/CJx8jrxJSC5aiSrvkGzcnF7sK06RD8mFxQ= +github.com/ElrondNetwork/elrond-go-logger v1.0.9 h1:RByDnVHgSN4zy3bwmvQarsnCd/gDmZ+zwVI+b6i4Plc= +github.com/ElrondNetwork/elrond-go-logger v1.0.9/go.mod h1:86lz/Y9D1sMAZiukCYxCsETLl1zuI23qj37ct3KUT6A= +github.com/ElrondNetwork/elrond-go-p2p v1.0.3 h1:IabTaHR027tbb2A5PZsqX9RotpYudOByoKiBVEIMgLw= +github.com/ElrondNetwork/elrond-go-p2p v1.0.3/go.mod h1:KPAQxqKd+h1H55S4E7vXFjpKWFzCITBG3ErrDZvsDEc= +github.com/ElrondNetwork/elrond-go-storage v1.0.1 h1:T5pmTAu97aFNbUPpqxJprBEOs+uWsTaJSbCwY9xWPRA= +github.com/ElrondNetwork/elrond-go-storage v1.0.1/go.mod h1:Dht8Vt0BJvyUrr+mDSjYo2pu2fIMZfmUa0yznPG9zGw= +github.com/ElrondNetwork/elrond-vm-common v1.1.0/go.mod h1:w3i6f8uiuRkE68Ie/gebRcLgTuHqvruJSYrFyZWuLrE= +github.com/ElrondNetwork/elrond-vm-common v1.2.9/go.mod h1:B/Y8WiqHyDd7xsjNYsaYbVMp1jQgQ+z4jTJkFvj/EWI= +github.com/ElrondNetwork/elrond-vm-common v1.3.7/go.mod h1:seROQuR7RJCoCS7mgRXVAlvjztltY1c+UroAgWr/USE= +github.com/ElrondNetwork/elrond-vm-common v1.3.24 h1:KK3Oa9mznnMhXJ0JrObO4ulka1grEKxzbxVD1+iTnAo= +github.com/ElrondNetwork/elrond-vm-common v1.3.24/go.mod h1:seROQuR7RJCoCS7mgRXVAlvjztltY1c+UroAgWr/USE= +github.com/ElrondNetwork/go-libp2p-pubsub v0.6.1-rc1 h1:Nu/uwYQg/QbfoQ0uD6GahYTwgtAkAwtzsB0HVfSP58I= +github.com/ElrondNetwork/go-libp2p-pubsub v0.6.1-rc1/go.mod h1:pJfaShe+i5aWZx8NhSkQjvOYQYLoqPztmFUlKjToOzM= +github.com/ElrondNetwork/protobuf v1.3.2 h1:qoCSYiO+8GtXBEZWEjw0WPcZfM3g7QuuJrwpN+y6Mvg= +github.com/ElrondNetwork/protobuf v1.3.2/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.45-rc h1:+CcDhUEwPNnKsf9AmA+GShut9W+KgCd5Fe6u0scVdL4= +github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.45-rc/go.mod h1:i1TIkkBwx3ss3C4balJCKQDiRpG6WOI4blhlfSf56uI= +github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.45-rc h1:4aCnmAusTmj+qtsQV+jiCpOaM2VP7p3l8SyXk0JIC8s= +github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.45-rc/go.mod h1:6m4U8OM0C6Jaa6UBilPx1OJqECoz4MfyKw0pV1eAnxs= +github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.63 h1:yHvpNnFEpAJZBG8zPgk91SiEccMi5V617unCMnYNg+E= +github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.63/go.mod h1:Euz6pwRi/S9PiM0IL8aDbxhRy3jAXSf46TV9HLfvD+c= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/beevik/ntp v0.3.0 h1:xzVrPrE4ziasFXgBVBZJDP0Wg/KpMwk2KHJ4Ba8GrDw= +github.com/beevik/ntp v0.3.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= +github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= +github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= +github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= +github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= +github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= +github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= +github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= +github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= +github.com/btcsuite/btcd v0.22.0-beta h1:LTDpDKUM5EeOFBPM8IXpinEcmZ6FWfNZbE3lfrfdnWo= +github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= +github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce h1:YtWJF7RHm2pYCvA5t0RPmAaLUhREsKuKd+SLhxFbFeQ= +github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= +github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= +github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= +github.com/containerd/cgroups v1.0.3 h1:ADZftAkglvCiD44c77s5YmMqaP2pzVCFZvBmAlBdAP4= +github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d h1:t5Wuyh53qYyg9eqn4BbnlIT+vmhyww0TatL+zT3uWgI= +github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4= +github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= +github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= +github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= +github.com/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMSRhl4D7AQ= +github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI= +github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= +github.com/dgraph-io/badger v1.6.0-rc1/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= +github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= +github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU= +github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= +github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/elastic/go-elasticsearch/v7 v7.12.0 h1:j4tvcMrZJLp39L2NYvBb7f+lHKPqPHSL3nvB8+/DV+s= +github.com/elastic/go-elasticsearch/v7 v7.12.0/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4= +github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= +github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4= +github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= +github.com/elodina/go-avro v0.0.0-20160406082632-0c8185d9a3ba h1:QkK2L3uvEaZJ40iFZbiMKz/yQF/MI2uaNO2iyV/ve6w= +github.com/elodina/go-avro v0.0.0-20160406082632-0c8185d9a3ba/go.mod h1:3A7SOsr8WBIpkWUsqzMpR3tIQbanKqxZcis2GSl12Nk= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= +github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= +github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= +github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/cors v0.0.0-20190301062745-f9e10995c85a h1:zBycVvXa03SIX+jdMv8wGu9TMDMWdN8EhaR1FoeKHNo= +github.com/gin-contrib/cors v0.0.0-20190301062745-f9e10995c85a/go.mod h1:pL2kNE+DgDU+eQ+dary5bX0Z6LPP8nR6Mqs1iejILw4= +github.com/gin-contrib/pprof v1.4.0 h1:XxiBSf5jWZ5i16lNOPbMTVdgHBdhfGRD5PZ1LWazzvg= +github.com/gin-contrib/pprof v1.4.0/go.mod h1:RrehPJasUVBPK6yTUwOl8/NP6i0vbUgmxtis+Z5KE90= +github.com/gin-contrib/sse v0.0.0-20170109093832-22d885f9ecc7/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.3.0/go.mod h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6mUr7Y= +github.com/gin-gonic/gin v1.7.1/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= +github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= +github.com/gizak/termui/v3 v3.1.0 h1:ZZmVDgwHl7gR7elfKf1xc4IudXZ5qqfDh4wExk4Iajc= +github.com/gizak/termui/v3 v3.1.0/go.mod h1:bXQEBkJpzxUAKf0+xq9MSWAvWZlE7c+aidmyFlkYTrY= +github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= +github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= +github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-playground/validator/v10 v10.10.0 h1:I7mrTYv78z8k8VXa/qJlOlEXn/nBh+BF8dHX5nt/dr0= +github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/goccy/go-json v0.9.7 h1:IcB+Aqpx/iMHu5Yooh7jEzJk1JZ7Pjtmys2ukPr7EeM= +github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= +github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= +github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= +github.com/google/gops v0.3.18 h1:my259V+172PVFmduS2RAsq4FKH+HjKqdh7pLr17Ot8c= +github.com/google/gops v0.3.18/go.mod h1:Pfp8hWGIFdV/7rY9/O/U5WgdjYQXf/GiEK4NVuVd2ZE= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= +github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/herumi/bls-go-binary v1.0.0 h1:PRPF6vPd35zyDy+tp86HwNnGdufCH2lZL0wZGxYvkRs= +github.com/herumi/bls-go-binary v1.0.0/go.mod h1:O4Vp1AfR4raRGwFeQpr9X/PQtncEicMoOe6BQt1oX0Y= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= +github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= +github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= +github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M= +github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= +github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= +github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= +github.com/ipfs/go-cid v0.1.0 h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0= +github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= +github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= +github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= +github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= +github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= +github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= +github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= +github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs= +github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= +github.com/ipfs/go-datastore v0.5.1 h1:WkRhLuISI+XPD0uk3OskB0fYFSyqK8Ob5ZYew9Qa1nQ= +github.com/ipfs/go-datastore v0.5.1/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= +github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= +github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= +github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= +github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaHzfGTzuE3s= +github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk= +github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= +github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= +github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= +github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= +github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= +github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8= +github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= +github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= +github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= +github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= +github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= +github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= +github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= +github.com/ipfs/go-ipns v0.1.2 h1:O/s/0ht+4Jl9+VoxoUo0zaHjnZUS+aBQIKTuzdZ/ucI= +github.com/ipfs/go-ipns v0.1.2/go.mod h1:ioQ0j02o6jdIVW+bmi18f4k2gRf0AV3kZ9KeHYHICnQ= +github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= +github.com/ipfs/go-log v1.0.2/go.mod h1:1MNjMxe0u6xvJZgeqbJ8vdo2TKaGwZ1a0Bpza+sr2Sk= +github.com/ipfs/go-log v1.0.3/go.mod h1:OsLySYkwIbiSUR/yBTdv1qPtcE4FW3WPWk/ewz9Ru+A= +github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs= +github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= +github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= +github.com/ipfs/go-log/v2 v2.0.2/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= +github.com/ipfs/go-log/v2 v2.0.3/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= +github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= +github.com/ipfs/go-log/v2 v2.1.1/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= +github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= +github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= +github.com/ipfs/go-log/v2 v2.5.0/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= +github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= +github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= +github.com/ipld/go-ipld-prime v0.9.0 h1:N2OjJMb+fhyFPwPnVvJcWU/NsumP8etal+d2v3G4eww= +github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= +github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= +github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= +github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= +github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= +github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= +github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= +github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= +github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= +github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= +github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= +github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0= +github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19/go.mod h1:hY+WOq6m2FpbvyrI93sMaypsttvaIL5nhVR92dTMUcQ= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.1 h1:y9FcTHGyrebwfP0ZZqFiaxTaiDnUrGkJkI+f583BL1A= +github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.12 h1:p9dKCg8i4gmOxtv35DvrYoWqYzQrvEVdjQ762Y0OqZE= +github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= +github.com/koron/go-ssdp v0.0.2 h1:fL3wAoyT6hXHQlORyXUW4Q23kkQpJRgEAYcZB5BR71o= +github.com/koron/go-ssdp v0.0.2/go.mod h1:XoLfkAiA2KeZsYh4DbHxD7h3nR2AZNqVQOa+LJuqPYs= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= +github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= +github.com/libp2p/go-addr-util v0.1.0/go.mod h1:6I3ZYuFr2O/9D+SoyM0zEw0EF3YkldtTX406BpdQMqw= +github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= +github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= +github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= +github.com/libp2p/go-conn-security-multistream v0.2.0/go.mod h1:hZN4MjlNetKD3Rq5Jb/P5ohUnFLNzEAR4DLSzpn2QLU= +github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6NhaTpFhJZrjSYuNmhpT2r25zYR70= +github.com/libp2p/go-conn-security-multistream v0.3.0 h1:9UCIKlBL1hC9u7nkMXpD1nkc/T53PKMAn3/k9ivBAVc= +github.com/libp2p/go-conn-security-multistream v0.3.0/go.mod h1:EEP47t4fw/bTelVmEzIDqSe69hO/ip52xBEhZMLWAHM= +github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= +github.com/libp2p/go-eventbus v0.2.1 h1:VanAdErQnpTioN2TowqNcOijf6YwhuODe4pPKSDpxGc= +github.com/libp2p/go-eventbus v0.2.1/go.mod h1:jc2S4SoEVPP48H9Wpzm5aiGwUCBMfGhVhhBjyhhCJs8= +github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-flow-metrics v0.0.2/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= +github.com/libp2p/go-flow-metrics v0.0.3 h1:8tAs/hSdNvUiLgtlSy3mxwxWP4I9y/jlkPFT7epKdeM= +github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= +github.com/libp2p/go-libp2p v0.6.1/go.mod h1:CTFnWXogryAHjXAKEbOf1OWY+VeAP3lDMZkfEI5sT54= +github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xSU1ivxn0k= +github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw= +github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= +github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= +github.com/libp2p/go-libp2p v0.19.3 h1:LqjvuBWdyYSqvkH4VVYxA78Fkphzg2Pq86VMnilqgkw= +github.com/libp2p/go-libp2p v0.19.3/go.mod h1:AGlPVLjh0+6jvEtf+a2gZEux7yHJrYXnG9IC7wcQ2NY= +github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= +github.com/libp2p/go-libp2p-asn-util v0.1.0 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= +github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= +github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE= +github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQdNbfzE1C718tcViI= +github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI= +github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= +github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= +github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= +github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= +github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ= +github.com/libp2p/go-libp2p-blankhost v0.3.0 h1:kTnLArltMabZlzY63pgGDA4kkUcLkBFSM98zBssn/IY= +github.com/libp2p/go-libp2p-blankhost v0.3.0/go.mod h1:urPC+7U01nCGgJ3ZsV8jdwTp6Ji9ID0dMTvq+aJ+nZU= +github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= +github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= +github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= +github.com/libp2p/go-libp2p-circuit v0.6.0 h1:rw/HlhmUB3OktS/Ygz6+2XABOmHKzZpPUuMNUMosj8w= +github.com/libp2p/go-libp2p-circuit v0.6.0/go.mod h1:kB8hY+zCpMeScyvFrKrGicRdid6vNXbunKE4rXATZ0M= +github.com/libp2p/go-libp2p-connmgr v0.2.4 h1:TMS0vc0TCBomtQJyWr7fYxcVYYhx+q/2gF++G5Jkl/w= +github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-core v0.0.4/go.mod h1:jyuCQP356gzfCFtRKyvAbNkyeuxb7OlyhWZ3nls5d2I= +github.com/libp2p/go-libp2p-core v0.2.0/go.mod h1:X0eyB0Gy93v0DZtSYbEM7RnMChm9Uv3j7yRXjO77xSI= +github.com/libp2p/go-libp2p-core v0.2.2/go.mod h1:8fcwTbsG2B+lTgRJ1ICZtiM5GWCWZVoVrLaDRvIRng0= +github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g= +github.com/libp2p/go-libp2p-core v0.2.5/go.mod h1:6+5zJmKhsf7yHn1RbmYDu08qDUpIUxGdqHuEZckmZOA= +github.com/libp2p/go-libp2p-core v0.3.0/go.mod h1:ACp3DmS3/N64c2jDzcV429ukDpicbL6+TrrxANBjPGw= +github.com/libp2p/go-libp2p-core v0.3.1/go.mod h1:thvWy0hvaSBhnVBaW37BvzgVV68OUhgJJLAa6almrII= +github.com/libp2p/go-libp2p-core v0.4.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0= +github.com/libp2p/go-libp2p-core v0.5.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0= +github.com/libp2p/go-libp2p-core v0.5.1/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= +github.com/libp2p/go-libp2p-core v0.5.3/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= +github.com/libp2p/go-libp2p-core v0.5.4/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= +github.com/libp2p/go-libp2p-core v0.5.5/go.mod h1:vj3awlOr9+GMZJFH9s4mpt9RHHgGqeHCopzbYKZdRjM= +github.com/libp2p/go-libp2p-core v0.5.6/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= +github.com/libp2p/go-libp2p-core v0.5.7/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= +github.com/libp2p/go-libp2p-core v0.6.0/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= +github.com/libp2p/go-libp2p-core v0.6.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= +github.com/libp2p/go-libp2p-core v0.7.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= +github.com/libp2p/go-libp2p-core v0.8.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= +github.com/libp2p/go-libp2p-core v0.8.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= +github.com/libp2p/go-libp2p-core v0.8.2/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= +github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= +github.com/libp2p/go-libp2p-core v0.8.6/go.mod h1:dgHr0l0hIKfWpGpqAMbpo19pen9wJfdCGv51mTmdpmM= +github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-core v0.11.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-core v0.12.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-core v0.14.0/go.mod h1:tLasfcVdTXnixsLB0QYaT1syJOhsbrhG7q6pGrHtBg8= +github.com/libp2p/go-libp2p-core v0.15.1 h1:0RY+Mi/ARK9DgG1g9xVQLb8dDaaU8tCePMtGALEfBnM= +github.com/libp2p/go-libp2p-core v0.15.1/go.mod h1:agSaboYM4hzB1cWekgVReqV5M4g5M+2eNNejV+1EEhs= +github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= +github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfxg97AEdo4GYBt6BadWg= +github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw= +github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= +github.com/libp2p/go-libp2p-discovery v0.6.0 h1:1XdPmhMJr8Tmj/yUfkJMIi8mgwWrLUsCB3bMxdT+DSo= +github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= +github.com/libp2p/go-libp2p-kad-dht v0.15.0 h1:Ke+Oj78gX5UDXnA6HBdrgvi+fStJxgYTDa51U0TsCLo= +github.com/libp2p/go-libp2p-kad-dht v0.15.0/go.mod h1:rZtPxYu1TnHHz6n1RggdGrxUX/tA1C2/Wiw3ZMUDrU0= +github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio= +github.com/libp2p/go-libp2p-kbucket v0.4.7 h1:spZAcgxifvFZHBD8tErvppbnNiKA5uokDu3CV7axu70= +github.com/libp2p/go-libp2p-kbucket v0.4.7/go.mod h1:XyVo99AfQH0foSf176k4jY1xUJ2+jUJIZCSDm7r2YKk= +github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= +github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= +github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= +github.com/libp2p/go-libp2p-mplex v0.2.2/go.mod h1:74S9eum0tVQdAfFiKxAyKzNdSuLqw5oadDq7+L/FELo= +github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxWDkm+dVvjfuG3ek= +github.com/libp2p/go-libp2p-mplex v0.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= +github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= +github.com/libp2p/go-libp2p-mplex v0.5.0 h1:vt3k4E4HSND9XH4Z8rUpacPJFSAgLOv6HDvG8W9Ks9E= +github.com/libp2p/go-libp2p-mplex v0.5.0/go.mod h1:eLImPJLkj3iG5t5lq68w3Vm5NAQ5BcKwrrb2VmOYb3M= +github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE= +github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw= +github.com/libp2p/go-libp2p-nat v0.1.0 h1:vigUi2MEN+fwghe5ijpScxtbbDz+L/6y8XwlzYOJgSY= +github.com/libp2p/go-libp2p-nat v0.1.0/go.mod h1:DQzAG+QbDYjN1/C3B6vXucLtz3u9rEonLVPtZVzQqks= +github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= +github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= +github.com/libp2p/go-libp2p-noise v0.4.0 h1:khcMsGhHNdGqKE5LDLrnHwZvdGVMsrnD4GTkTWkwmLU= +github.com/libp2p/go-libp2p-noise v0.4.0/go.mod h1:BzzY5pyzCYSyJbQy9oD8z5oP2idsafjt4/X42h9DjZU= +github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= +github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= +github.com/libp2p/go-libp2p-peerstore v0.1.3/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI= +github.com/libp2p/go-libp2p-peerstore v0.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVdLxvqh7hXOujessqdzs= +github.com/libp2p/go-libp2p-peerstore v0.2.0/go.mod h1:N2l3eVIeAitSg3Pi2ipSrJYnqhVnMNQZo9nkSCuAbnQ= +github.com/libp2p/go-libp2p-peerstore v0.2.1/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= +github.com/libp2p/go-libp2p-peerstore v0.2.2/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= +github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= +github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= +github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= +github.com/libp2p/go-libp2p-peerstore v0.4.0/go.mod h1:rDJUFyzEWPpXpEwywkcTYYzDHlwza8riYMaUzaN6hX0= +github.com/libp2p/go-libp2p-peerstore v0.6.0 h1:HJminhQSGISBIRb93N6WK3t6Fa8OOTnHd/VBjL4mY5A= +github.com/libp2p/go-libp2p-peerstore v0.6.0/go.mod h1:DGEmKdXrcYpK9Jha3sS7MhqYdInxJy84bIPtSu65bKc= +github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= +github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= +github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= +github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= +github.com/libp2p/go-libp2p-quic-transport v0.13.0/go.mod h1:39/ZWJ1TW/jx1iFkKzzUg00W6tDJh73FC0xYudjr7Hc= +github.com/libp2p/go-libp2p-quic-transport v0.16.0/go.mod h1:1BXjVMzr+w7EkPfiHkKnwsWjPjtfaNT0q8RS3tGDvEQ= +github.com/libp2p/go-libp2p-quic-transport v0.17.0 h1:yFh4Gf5MlToAYLuw/dRvuzYd1EnE2pX3Lq1N6KDiWRQ= +github.com/libp2p/go-libp2p-quic-transport v0.17.0/go.mod h1:x4pw61P3/GRCcSLypcQJE/Q2+E9f4X+5aRcZLXf20LM= +github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGdsU/9W//C8dqjQDk= +github.com/libp2p/go-libp2p-record v0.1.3 h1:R27hoScIhQf/A8XJZ8lYpnqh9LatJ5YbHs28kCIfql0= +github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ6EMg7+/vv2+9pY4= +github.com/libp2p/go-libp2p-resource-manager v0.2.1 h1:/0yqQQ4oT+3fEhUGGP2PhuIhdv10+pu5jLhvFNfUx/w= +github.com/libp2p/go-libp2p-resource-manager v0.2.1/go.mod h1:K+eCkiapf+ey/LADO4TaMpMTP9/Qde/uLlrnRqV4PLQ= +github.com/libp2p/go-libp2p-routing-helpers v0.2.3/go.mod h1:795bh+9YeoFl99rMASoiVgHdi5bjack0N1+AFAdbvBw= +github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= +github.com/libp2p/go-libp2p-secio v0.2.0/go.mod h1:2JdZepB8J5V9mBp79BmwsaPQhRPNN2NrnB2lKQcdy6g= +github.com/libp2p/go-libp2p-secio v0.2.1/go.mod h1:cWtZpILJqkqrSkiYcDBh5lA3wbT2Q+hz3rJQq3iftD8= +github.com/libp2p/go-libp2p-secio v0.2.2/go.mod h1:wP3bS+m5AUnFA+OFO7Er03uO1mncHG0uVwGrwvjYlNY= +github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= +github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU= +github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM= +github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM= +github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= +github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= +github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= +github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= +github.com/libp2p/go-libp2p-swarm v0.10.0/go.mod h1:71ceMcV6Rg/0rIQ97rsZWMzto1l9LnNquef+efcRbmA= +github.com/libp2p/go-libp2p-swarm v0.10.2 h1:UaXf+CTq6Ns1N2V1EgqJ9Q3xaRsiN7ImVlDMpirMAWw= +github.com/libp2p/go-libp2p-swarm v0.10.2/go.mod h1:Pdkq0QU5a+qu+oyqIV3bknMsnzk9lnNyKvB9acJ5aZs= +github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.1.0/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0= +github.com/libp2p/go-libp2p-testing v0.1.1/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0= +github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8/go.mod h1:Qy8sAncLKpwXtS2dSnDOP8ktexIAHKu+J+pnZOFZLTc= +github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehtsBXMrXnCfJIgDti5g= +github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= +github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= +github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= +github.com/libp2p/go-libp2p-testing v0.7.0/go.mod h1:OLbdn9DbgdMwv00v+tlp1l3oe2Cl+FAjoWIA2pa0X6E= +github.com/libp2p/go-libp2p-testing v0.9.0/go.mod h1:Td7kbdkWqYTJYQGTwzlgXwaqldraIanyjuRiAbK/XQU= +github.com/libp2p/go-libp2p-testing v0.9.2 h1:dCpODRtRaDZKF8HXT9qqqgON+OMEB423Knrgeod8j84= +github.com/libp2p/go-libp2p-testing v0.9.2/go.mod h1:Td7kbdkWqYTJYQGTwzlgXwaqldraIanyjuRiAbK/XQU= +github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= +github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= +github.com/libp2p/go-libp2p-tls v0.4.1 h1:1ByJUbyoMXvYXDoW6lLsMxqMViQNXmt+CfQqlnCpY+M= +github.com/libp2p/go-libp2p-tls v0.4.1/go.mod h1:EKCixHEysLNDlLUoKxv+3f/Lp90O2EXNjTr0UQDnrIw= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= +github.com/libp2p/go-libp2p-transport-upgrader v0.2.0/go.mod h1:mQcrHj4asu6ArfSoMuyojOdjx73Q47cYD7s5+gZOlns= +github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D1dwydnTmKRPXiAR/fyvi1dXuL4o= +github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIWIU62Agt/J18ekORFU/j1i2y8zvk= +github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= +github.com/libp2p/go-libp2p-transport-upgrader v0.5.0/go.mod h1:Rc+XODlB3yce7dvFV4q/RmyJGsFcCZRkeZMu/Zdg0mo= +github.com/libp2p/go-libp2p-transport-upgrader v0.7.0/go.mod h1:GIR2aTRp1J5yjVlkUoFqMkdobfob6RnAwYg/RZPhrzg= +github.com/libp2p/go-libp2p-transport-upgrader v0.7.1 h1:MSMe+tUfxpC9GArTz7a4G5zQKQgGh00Vio87d3j3xIg= +github.com/libp2p/go-libp2p-transport-upgrader v0.7.1/go.mod h1:GIR2aTRp1J5yjVlkUoFqMkdobfob6RnAwYg/RZPhrzg= +github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= +github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= +github.com/libp2p/go-libp2p-yamux v0.2.2/go.mod h1:lIohaR0pT6mOt0AZ0L2dFze9hds9Req3OfS+B+dv4qw= +github.com/libp2p/go-libp2p-yamux v0.2.5/go.mod h1:Zpgj6arbyQrmZ3wxSZxfBmbdnWtbZ48OpsfmQVTErwA= +github.com/libp2p/go-libp2p-yamux v0.2.7/go.mod h1:X28ENrBMU/nm4I3Nx4sZ4dgjZ6VhLEn0XhIoZ5viCwU= +github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2EzI2h7HbFm9eAKI4= +github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelNoy5nm3tZ3/Zw30= +github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= +github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= +github.com/libp2p/go-libp2p-yamux v0.8.0/go.mod h1:yTkPgN2ib8FHyU1ZcVD7aelzyAqXXwEPbyx+aSKm9h8= +github.com/libp2p/go-libp2p-yamux v0.8.1/go.mod h1:rUozF8Jah2dL9LLGyBaBeTQeARdwhefMCTQVQt6QobE= +github.com/libp2p/go-libp2p-yamux v0.9.1 h1:oplewiRix8s45SOrI30rCPZG5mM087YZp+VYhXAh4+c= +github.com/libp2p/go-libp2p-yamux v0.9.1/go.mod h1:wRc6wvyxQINFcKe7daL4BeQ02Iyp+wxyC8WCNfngBrA= +github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= +github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= +github.com/libp2p/go-maddr-filter v0.1.0/go.mod h1:VzZhTXkMucEGGEOSKddrwGiOv0tUhgnKqNEmIAz/bPU= +github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= +github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= +github.com/libp2p/go-mplex v0.1.2/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= +github.com/libp2p/go-mplex v0.2.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= +github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= +github.com/libp2p/go-mplex v0.4.0 h1:Ukkez9/4EOX5rTw4sHefNJp10dksftAA05ZgyjplUbM= +github.com/libp2p/go-mplex v0.4.0/go.mod h1:y26Lx+wNVtMYMaPu300Cbot5LkEZ4tJaNYeHeT9dh6E= +github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= +github.com/libp2p/go-msgio v0.2.0 h1:W6shmB+FeynDrUVl2dgFQvzfBZcXiyqY4VmpQLu9FqU= +github.com/libp2p/go-msgio v0.2.0/go.mod h1:dBVM1gW3Jk9XqHkU4eKdGvVHdLa51hoGfll6jMJMSlY= +github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo= +github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU= +github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= +github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= +github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= +github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= +github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= +github.com/libp2p/go-netroute v0.1.6/go.mod h1:AqhkMh0VuWmfgtxKPp3Oc1LdU5QSWS7wl0QLhSZqXxQ= +github.com/libp2p/go-netroute v0.2.0 h1:0FpsbsvuSnAhXFnCY0VLFbJOzaK0VnP0r1QT/o4nWRE= +github.com/libp2p/go-netroute v0.2.0/go.mod h1:Vio7LTzZ+6hoT4CMZi5/6CpY3Snzh2vgZhWgxMNwlQI= +github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0= +github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= +github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= +github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= +github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGNsw= +github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= +github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= +github.com/libp2p/go-reuseport v0.0.2/go.mod h1:SPD+5RwGC7rcnzngoYC86GjPzjSywuQyMVAheVBD9nQ= +github.com/libp2p/go-reuseport v0.1.0 h1:0ooKOx2iwyIkf339WCZ2HN3ujTDbkK0PjC7JVoP1AiM= +github.com/libp2p/go-reuseport v0.1.0/go.mod h1:bQVn9hmfcTaoo0c9v5pBhOarsU1eNOBZdaAd2hzXRKU= +github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= +github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= +github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw= +github.com/libp2p/go-reuseport-transport v0.0.5/go.mod h1:TC62hhPc8qs5c/RoXDZG6YmjK+/YWUPC0yYmeUecbjc= +github.com/libp2p/go-reuseport-transport v0.1.0 h1:C3PHeHjmnz8m6f0uydObj02tMEoi7CyD1zuN7xQT8gc= +github.com/libp2p/go-reuseport-transport v0.1.0/go.mod h1:vev0C0uMkzriDY59yFHD9v+ujJvYmDQVLowvAjEOmfw= +github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= +github.com/libp2p/go-sockaddr v0.1.0/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= +github.com/libp2p/go-sockaddr v0.1.1/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= +github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= +github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= +github.com/libp2p/go-stream-muxer-multistream v0.3.0/go.mod h1:yDh8abSIzmZtqtOt64gFJUXEryejzNb0lisTt+fAMJA= +github.com/libp2p/go-stream-muxer-multistream v0.4.0 h1:HsM/9OdtqnIzjVXcxTXjmqKrj3gJ8kacaOJwJS1ipaY= +github.com/libp2p/go-stream-muxer-multistream v0.4.0/go.mod h1:nb+dGViZleRP4XcyHuZSVrJCBl55nRBOMmiSL/dyziw= +github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= +github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= +github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcroCGYw28kh94oLe0= +github.com/libp2p/go-tcp-transport v0.2.4/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= +github.com/libp2p/go-tcp-transport v0.2.7/go.mod h1:lue9p1b3VmZj1MhhEGB/etmvF/nBQ0X9CW2DutBT3MM= +github.com/libp2p/go-tcp-transport v0.4.0/go.mod h1:0y52Rwrn4076xdJYu/51/qJIdxz+EWDAOG2S45sV3VI= +github.com/libp2p/go-tcp-transport v0.5.0/go.mod h1:UPPL0DIjQqiWRwVAb+CEQlaAG0rp/mCqJfIhFcLHc4Y= +github.com/libp2p/go-tcp-transport v0.5.1 h1:edOOs688VLZAozWC7Kj5/6HHXKNwi9M6wgRmmLa8M6Q= +github.com/libp2p/go-tcp-transport v0.5.1/go.mod h1:UPPL0DIjQqiWRwVAb+CEQlaAG0rp/mCqJfIhFcLHc4Y= +github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzlHoKzu0yY9p/klM= +github.com/libp2p/go-ws-transport v0.3.0/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= +github.com/libp2p/go-ws-transport v0.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA= +github.com/libp2p/go-ws-transport v0.6.0 h1:326XBL6Q+5CQ2KtjXz32+eGu02W/Kz2+Fm4SpXdr0q4= +github.com/libp2p/go-ws-transport v0.6.0/go.mod h1:dXqtI9e2JV9FtF1NOtWVZSKXh5zXvnuwPXfj8GPBbYU= +github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.3.0/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= +github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= +github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI= +github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= +github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= +github.com/libp2p/go-yamux/v3 v3.0.1/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= +github.com/libp2p/go-yamux/v3 v3.0.2/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= +github.com/libp2p/go-yamux/v3 v3.1.1 h1:X0qSVodCZciOu/f4KTp9V+O0LAqcqP2tdaUGB0+0lng= +github.com/libp2p/go-yamux/v3 v3.1.1/go.mod h1:jeLEQgLXqE2YqX1ilAClIfCMDY+0uXQUKmmb/qp0gT4= +github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= +github.com/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0T3FQhz/uyOUS38Q= +github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= +github.com/lucas-clemente/quic-go v0.25.0/go.mod h1:YtzP8bxRVCBlO77yRanE264+fY/T2U9ZlW1AaHOsMOg= +github.com/lucas-clemente/quic-go v0.27.0/go.mod h1:AzgQoPda7N+3IqMMMkywBKggIFo2KT6pfnlrQ2QieeI= +github.com/lucas-clemente/quic-go v0.27.1 h1:sOw+4kFSVrdWOYmUjufQ9GBVPqZ+tu+jMtXxXNmRJyk= +github.com/lucas-clemente/quic-go v0.27.1/go.mod h1:AzgQoPda7N+3IqMMMkywBKggIFo2KT6pfnlrQ2QieeI= +github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= +github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= +github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= +github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= +github.com/marten-seemann/qtls-go1-15 v0.1.5/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= +github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= +github.com/marten-seemann/qtls-go1-16 v0.1.5 h1:o9JrYPPco/Nukd/HpOHMHZoBDXQqoNtUCmny98/1uqQ= +github.com/marten-seemann/qtls-go1-16 v0.1.5/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= +github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= +github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= +github.com/marten-seemann/qtls-go1-17 v0.1.1 h1:DQjHPq+aOzUeh9/lixAGunn6rIOQyWChPSI4+hgW7jc= +github.com/marten-seemann/qtls-go1-17 v0.1.1/go.mod h1:C2ekUKcDdz9SDWxec1N/MvcXBpaX9l3Nx67XaR84L5s= +github.com/marten-seemann/qtls-go1-18 v0.1.0-beta.1/go.mod h1:PUhIQk19LoFt2174H4+an8TYvWOGjb/hHwphBeaDHwI= +github.com/marten-seemann/qtls-go1-18 v0.1.1 h1:qp7p7XXUFL7fpBvSS1sWD+uSqPvzNQK43DH+/qEkj0Y= +github.com/marten-seemann/qtls-go1-18 v0.1.1/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4= +github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= +github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-runewidth v0.0.2 h1:UnlwIPBGaTZfPQ6T1IGzPI0EkYAQmT9fAEJ/poFC63o= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= +github.com/miekg/dns v1.1.48 h1:Ucfr7IIVyMBz4lRE8qmGUuZ4Wt3/ZGu9hmcMT3Uu4tQ= +github.com/miekg/dns v1.1.48/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= +github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= +github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= +github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= +github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU= +github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc= +github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= +github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= +github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= +github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= +github.com/multiformats/go-base32 v0.0.4 h1:+qMh4a2f37b4xTNs6mqitDinryCI+tfO2dRVMN9mjSE= +github.com/multiformats/go-base32 v0.0.4/go.mod h1:jNLFzjPZtp3aIARHbJRZIaPuspdH0J6q39uUM5pnABM= +github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= +github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= +github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.1.0/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= +github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= +github.com/multiformats/go-multiaddr v0.2.1/go.mod h1:s/Apk6IyxfvMjDafnhJgJ3/46z7tZ04iMk5wP4QMGGE= +github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u0xW5UouOmQQrn6a3Y= +github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4fJxp6ggJGteB8HQTI= +github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc= +github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= +github.com/multiformats/go-multiaddr v0.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/oCXAT8Z4mzFpyoPyRc= +github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM= +github.com/multiformats/go-multiaddr v0.5.0 h1:i/JuOoVg4szYQ4YEzDGtb2h0o8M7CG/Yq6cGlcjWZpM= +github.com/multiformats/go-multiaddr v0.5.0/go.mod h1:3KAxNkUqLTJ20AAwN4XVX4kZar+bR+gh4zgbfr3SNug= +github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0= +github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= +github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= +github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= +github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= +github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= +github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= +github.com/multiformats/go-multiaddr-net v0.1.0/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ= +github.com/multiformats/go-multiaddr-net v0.1.1/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ= +github.com/multiformats/go-multiaddr-net v0.1.2/go.mod h1:QsWt3XK/3hwvNxZJp92iMQKME1qHfpYmyIjFVsSOY6Y= +github.com/multiformats/go-multiaddr-net v0.1.3/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= +github.com/multiformats/go-multiaddr-net v0.1.4/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= +github.com/multiformats/go-multiaddr-net v0.1.5/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= +github.com/multiformats/go-multiaddr-net v0.2.0/go.mod h1:gGdH3UXny6U3cKKYCvpXI5rnK7YaOIEOPVDI9tsJbEA= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= +github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= +github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= +github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= +github.com/multiformats/go-multicodec v0.4.1 h1:BSJbf+zpghcZMZrwTYBGwy0CPcVZGWiC72Cp8bBd4R4= +github.com/multiformats/go-multicodec v0.4.1/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= +github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= +github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= +github.com/multiformats/go-multihash v0.0.9/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= +github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= +github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= +github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= +github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= +github.com/multiformats/go-multihash v0.1.0 h1:CgAgwqk3//SVEw3T+6DqI4mWMyRuDwZtOWcJT0q9+EA= +github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= +github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9JFk2/9UktWZAF54Du38= +github.com/multiformats/go-multistream v0.2.1/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= +github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= +github.com/multiformats/go-multistream v0.3.0 h1:yX1v4IWseLPmr0rmnDo148wWJbNx40JxBZGmQb5fUP4= +github.com/multiformats/go-multistream v0.3.0/go.mod h1:ODRoqamLUsETKS9BNcII4gcRsJBU5VAwRIv7O39cEXg= +github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/multiformats/go-varint v0.0.2/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= +github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= +github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= +github.com/nsf/termbox-go v0.0.0-20190121233118-02980233997d h1:x3S6kxmy49zXVVyhcnrFqxvNVCBPb2KZ9hV2RBdS840= +github.com/nsf/termbox-go v0.0.0-20190121233118-02980233997d/go.mod h1:IuKpRQcYE1Tfu+oAQqaLisqDeXgjyyltCfsaoYN18NQ= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= +github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= +github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= +github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ= +github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU= +github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1 h1:CskT+S6Ay54OwxBGB0R3Rsx4Muto6UnEYTyKJbyRIAI= +github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= +github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= +github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.33.0 h1:rHgav/0a6+uYgGdNt3jwz8FNSesO/Hsang3O0T9A5SE= +github.com/prometheus/common v0.33.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= +github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= +github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmOeY0= +github.com/raulk/go-watchdog v1.2.0 h1:konN75pw2BMmZ+AfuAm5rtFsWcJpKF3m02rKituuXNo= +github.com/raulk/go-watchdog v1.2.0/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6RcA1i4mlqI= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc= +github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= +github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil/v3 v3.21.2/go.mod h1:ghfMypLDrFSWN2c9cDYFLHyynQ+QUht0cv/18ZqVczw= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= +github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= +github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= +github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw= +github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI= +github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= +github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= +github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg= +github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw= +github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y= +github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= +github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= +github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ= +github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I= +github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0= +github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= +github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= +github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= +github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= +github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= +github.com/syndtr/goleveldb v1.0.1-0.20190318030020-c3a204f8e965 h1:1oFLiOyVl+W7bnBzGhf7BbIv9loSFQcieWWYIjLqcAw= +github.com/syndtr/goleveldb v1.0.1-0.20190318030020-c3a204f8e965/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA= +github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= +github.com/tidwall/gjson v1.14.0 h1:6aeJ0bzojgWLa82gDQHcx3S0Lr/O51I9bJ5nv6JFx5w= +github.com/tidwall/gjson v1.14.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tklauser/go-sysconf v0.3.4 h1:HT8SVixZd3IzLdfs/xlpq0jeSfTX57g1v6wB1EuzV7M= +github.com/tklauser/go-sysconf v0.3.4/go.mod h1:Cl2c8ZRWfHD5IrfHo9VN+FX9kCFjIOyVklgXycLB6ek= +github.com/tklauser/numcpus v0.2.1 h1:ct88eFm+Q7m2ZfXJdan1xYoXKlmwsfP+k88q05KvlZc= +github.com/tklauser/numcpus v0.2.1/go.mod h1:9aU+wOc6WjUIZEwWMP62PL/41d65P+iks1gBkr4QyP8= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo= +github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v0.0.0-20181209151446-772ced7fd4c2/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= +github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.10 h1:p8Fspmz3iTctJstry1PYS3HVdllxnEzTEsgIgtxTrCk= +github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= +github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= +github.com/wangjia184/sortedset v0.0.0-20160527075905-f5d03557ba30/go.mod h1:YkocrP2K2tcw938x9gCOmT5G5eCD6jsTz0SZuyAqwIE= +github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a h1:G++j5e0OC488te356JvdhaM8YS6nMsjLAYF7JxCv07w= +github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= +github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k= +github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= +github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= +github.com/whyrusleeping/go-logging v0.0.1/go.mod h1:lDPYj54zutzG1XYfHAhcc7oNXEburHQBn+Iqd4yS4vE= +github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= +github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= +github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= +github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= +github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow= +github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= +github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xlab/treeprint v1.0.0/go.mod h1:IoImgRak9i3zJyuxOKUP1v4UZd1tMoKkq/Cimt1uhCg= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= +github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= +go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= +go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= +go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= +go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= +go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= +go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= +golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220418201149-a630d4f3e7a2 h1:6mzvA99KwZxbOrxww4EvWVQUnN1+xEu9tafK5ZxkYeA= +golang.org/x/net v0.0.0-20220418201149-a630d4f3e7a2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190526052359-791d8a0f4d09/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191206220618-eeba5f6aabab/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210217105451-b926d437f341/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210317225723-c4fcb01b228e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181130052023-1c3d964395ce/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= +google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.28.1/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.45.0 h1:NEpgUqV3Z+ZjkqMsxMg11IaDrXY4RY6CQukSGK0uI1M= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v8 v8.18.2 h1:lFB4DoMU6B626w8ny76MV7VX6W2VHct2GVOI3xgiMrQ= +gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8= +gopkg.in/src-d/go-log.v1 v1.0.1/go.mod h1:GN34hKP0g305ysm2/hctJ0Y8nWP3zxXXJ8GFabTyABE= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= +lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= +lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/goversion v1.2.0/go.mod h1:Eih9y/uIBS3ulggl7KNJ09xGSLcuNaLgmvvqa07sgfo= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= +sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= From b992f86c18dd490f4548493b9376023164ca5a12 Mon Sep 17 00:00:00 2001 From: jules01 Date: Thu, 27 Oct 2022 10:37:45 +0300 Subject: [PATCH 095/110] - made the peerAccountsUnit creation different between shard and meta --- storage/factory/pruningStorerFactory.go | 52 +++++++++++++++---------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/storage/factory/pruningStorerFactory.go b/storage/factory/pruningStorerFactory.go index d7551fa954a..fd262085e46 100644 --- a/storage/factory/pruningStorerFactory.go +++ b/storage/factory/pruningStorerFactory.go @@ -111,12 +111,12 @@ func checkArgs(args StorageServiceFactoryArgs) error { return nil } -func (psf *StorageServiceFactory) createAndAddBaseStorageUnits(store dataRetriever.StorageService, shardID string) error { +func (psf *StorageServiceFactory) createAndAddBaseStorageUnits( + store dataRetriever.StorageService, + customDatabaseRemover storage.CustomDatabaseRemoverHandler, + shardID string, +) error { disabledCustomDatabaseRemover := disabled.NewDisabledCustomDatabaseRemover() - customDatabaseRemover, err := factory.CreateCustomDatabaseRemover(psf.generalConfig.StoragePruning) - if err != nil { - return err - } txUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.TxStorage, disabledCustomDatabaseRemover) txUnit, err := psf.createPruningPersister(txUnitArgs) @@ -199,12 +199,6 @@ func (psf *StorageServiceFactory) createAndAddBaseStorageUnits(store dataRetriev } store.AddStorer(dataRetriever.UserAccountsUnit, userAccountsUnit) - peerAccountsUnit, err := psf.createTriePruningStorer(psf.generalConfig.PeerAccountsTrieStorage, customDatabaseRemover) - if err != nil { - return err - } - store.AddStorer(dataRetriever.PeerAccountsUnit, peerAccountsUnit) - userAccountsCheckpointsUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.AccountsTrieCheckpointsStorage, disabledCustomDatabaseRemover) userAccountsCheckpointsUnit, err := psf.createPruningPersister(userAccountsCheckpointsUnitArgs) if err != nil { @@ -242,16 +236,11 @@ func (psf *StorageServiceFactory) createAndAddBaseStorageUnits(store dataRetriev // CreateForShard will return the storage service which contains all storers needed for a shard func (psf *StorageServiceFactory) CreateForShard() (dataRetriever.StorageService, error) { - var peerBlockUnit storage.Storer - var err error - // TODO: if there will be a differentiation between the creation or opening of a DB, the DBs could be destroyed on a defer // in case of a failure while creating (not opening). disabledCustomDatabaseRemover := disabled.NewDisabledCustomDatabaseRemover() - - peerBlockUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.PeerBlockBodyStorage, disabledCustomDatabaseRemover) - peerBlockUnit, err = psf.createPruningPersister(peerBlockUnitArgs) + customDatabaseRemover, err := factory.CreateCustomDatabaseRemover(psf.generalConfig.StoragePruning) if err != nil { return nil, err } @@ -271,12 +260,25 @@ func (psf *StorageServiceFactory) CreateForShard() (dataRetriever.StorageService } store := dataRetriever.NewChainStorer() - err = psf.createAndAddBaseStorageUnits(store, shardID) + err = psf.createAndAddBaseStorageUnits(store, customDatabaseRemover, shardID) + if err != nil { + return nil, err + } + + peerAccountsUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.PeerAccountsTrieStorage, customDatabaseRemover) + peerAccountsUnit, err := psf.createTrieUnit(psf.generalConfig.PeerAccountsTrieStorage, peerAccountsUnitArgs) if err != nil { return nil, err } + store.AddStorer(dataRetriever.PeerAccountsUnit, peerAccountsUnit) + peerBlockUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.PeerBlockBodyStorage, disabledCustomDatabaseRemover) + peerBlockUnit, err := psf.createPruningPersister(peerBlockUnitArgs) + if err != nil { + return nil, err + } store.AddStorer(dataRetriever.PeerChangesUnit, peerBlockUnit) + hdrNonceHashDataUnit := dataRetriever.ShardHdrNonceHashDataUnit + dataRetriever.UnitType(psf.shardCoordinator.SelfId()) store.AddStorer(hdrNonceHashDataUnit, shardHdrHashNonceUnit) @@ -303,11 +305,13 @@ func (psf *StorageServiceFactory) CreateForShard() (dataRetriever.StorageService // CreateForMeta will return the storage service which contains all storers needed for metachain func (psf *StorageServiceFactory) CreateForMeta() (dataRetriever.StorageService, error) { - var err error - // TODO: if there will be a differentiation between the creation or opening of a DB, the DBs could be destroyed on a defer // in case of a failure while creating (not opening) + customDatabaseRemover, err := factory.CreateCustomDatabaseRemover(psf.generalConfig.StoragePruning) + if err != nil { + return nil, err + } shardID := core.GetShardIDString(core.MetachainShardId) shardHdrHashNonceUnits := make([]*storageunit.Unit, psf.shardCoordinator.NumberOfShards()) @@ -325,11 +329,17 @@ func (psf *StorageServiceFactory) CreateForMeta() (dataRetriever.StorageService, } store := dataRetriever.NewChainStorer() - err = psf.createAndAddBaseStorageUnits(store, shardID) + err = psf.createAndAddBaseStorageUnits(store, customDatabaseRemover, shardID) if err != nil { return nil, err } + peerAccountsUnit, err := psf.createTriePruningStorer(psf.generalConfig.PeerAccountsTrieStorage, customDatabaseRemover) + if err != nil { + return nil, err + } + store.AddStorer(dataRetriever.PeerAccountsUnit, peerAccountsUnit) + for i := uint32(0); i < psf.shardCoordinator.NumberOfShards(); i++ { hdrNonceHashDataUnit := dataRetriever.ShardHdrNonceHashDataUnit + dataRetriever.UnitType(i) store.AddStorer(hdrNonceHashDataUnit, shardHdrHashNonceUnits[i]) From a85aca1832b396bc3bc62817942f7299c457ad88 Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Thu, 27 Oct 2022 11:00:51 +0300 Subject: [PATCH 096/110] fix golangci lint --- storage/factory/pruningStorerFactory.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/storage/factory/pruningStorerFactory.go b/storage/factory/pruningStorerFactory.go index fd262085e46..f4e84d1f19a 100644 --- a/storage/factory/pruningStorerFactory.go +++ b/storage/factory/pruningStorerFactory.go @@ -249,7 +249,6 @@ func (psf *StorageServiceFactory) CreateForShard() (dataRetriever.StorageService // shardHdrHashNonce storer is static shardHdrHashNonceConfig := GetDBFromConfig(psf.generalConfig.ShardHdrNonceHashStorage.DB) - shardID = core.GetShardIDString(psf.shardCoordinator.SelfId()) dbPath := psf.pathManager.PathForStatic(shardID, psf.generalConfig.ShardHdrNonceHashStorage.DB.FilePath) + shardID shardHdrHashNonceConfig.FilePath = dbPath shardHdrHashNonceUnit, err := storageunit.NewStorageUnitFromConf( @@ -300,9 +299,6 @@ func (psf *StorageServiceFactory) CreateForShard() (dataRetriever.StorageService return store, err } -// TODO: split in 2 components shardStorageServiceCreator and metStorageServiceCreator that have a base which will contain the -// common storers - // CreateForMeta will return the storage service which contains all storers needed for metachain func (psf *StorageServiceFactory) CreateForMeta() (dataRetriever.StorageService, error) { // TODO: if there will be a differentiation between the creation or opening of a DB, the DBs could be destroyed on a defer From 92f487e728c8d303b75dbe6ad1ef2c6308f98860 Mon Sep 17 00:00:00 2001 From: ssd04 Date: Thu, 27 Oct 2022 14:15:39 +0300 Subject: [PATCH 097/110] handle set sender address for genesis minting transactions --- genesis/parsing/accountsParser.go | 48 ++++++-------------------- genesis/parsing/accountsParser_test.go | 8 ++--- 2 files changed, 14 insertions(+), 42 deletions(-) diff --git a/genesis/parsing/accountsParser.go b/genesis/parsing/accountsParser.go index 515d007f645..57df26a6416 100644 --- a/genesis/parsing/accountsParser.go +++ b/genesis/parsing/accountsParser.go @@ -362,33 +362,6 @@ func createMiniBlocks(shardIDs []uint32, blockType block.Type) []*block.MiniBloc return miniBlocks } -func (ap *accountsParser) putMintingTxsInPoolAndCreateMiniBlock( - txs []coreData.TransactionHandler, - txsPoolPerShard map[uint32]*indexer.Pool, -) (*block.MiniBlock, error) { - txHashes := make([][]byte, 0, len(txs)) - mintShardID := core.MetachainShardId - - for _, tx := range txs { - txHash, err := core.CalculateHash(ap.marshalizer, ap.hasher, tx) - if err != nil { - return nil, err - } - txHashes = append(txHashes, txHash) - - txsPoolPerShard[mintShardID].Txs[string(txHash)] = tx - } - - miniBlock := &block.MiniBlock{ - TxHashes: txHashes, - ReceiverShardID: mintShardID, - SenderShardID: mintShardID, - Type: block.TxBlock, - } - - return miniBlock, nil -} - func (ap *accountsParser) getAllTxs( indexingData map[uint32]*genesis.IndexingData, ) []coreData.TransactionHandler { @@ -432,11 +405,16 @@ func (ap *accountsParser) setTxsPoolAndMiniBlocks( txsPoolPerShard map[uint32]*indexer.Pool, miniBlocks []*block.MiniBlock, ) error { - var senderShardID uint32 for _, txHandler := range allTxs { receiverShardID := shardCoordinator.ComputeId(txHandler.GetRcvAddr()) - senderShardID = shardCoordinator.ComputeId(txHandler.GetSndAddr()) + + var senderShardID uint32 + if bytes.Compare(txHandler.GetSndAddr(), ap.minterAddressBytes) == 0 { + senderShardID = core.MetachainShardId + } else { + senderShardID = shardCoordinator.ComputeId(txHandler.GetSndAddr()) + } txHash, err := core.CalculateHash(ap.marshalizer, ap.hasher, txHandler) if err != nil { @@ -473,29 +451,23 @@ func (ap *accountsParser) GenerateInitialTransactions( return nil, nil, genesis.ErrNilShardCoordinator } - allMiniBlocks := make([]*block.MiniBlock, 0) shardIDs := getShardIDs(shardCoordinator) txsPoolPerShard := ap.createIndexerPools(shardIDs) mintTxs := ap.createMintTransactions() - mintMiniBlock, err := ap.putMintingTxsInPoolAndCreateMiniBlock(mintTxs, txsPoolPerShard) - if err != nil { - return nil, nil, err - } - allMiniBlocks = append(allMiniBlocks, mintMiniBlock) allTxs := ap.getAllTxs(indexingData) + allTxs = append(allTxs, mintTxs...) miniBlocks := createMiniBlocks(shardIDs, block.TxBlock) - err = ap.setTxsPoolAndMiniBlocks(shardCoordinator, allTxs, txsPoolPerShard, miniBlocks) + err := ap.setTxsPoolAndMiniBlocks(shardCoordinator, allTxs, txsPoolPerShard, miniBlocks) if err != nil { return nil, nil, err } - allMiniBlocks = append(allMiniBlocks, miniBlocks...) ap.setScrsTxsPool(shardCoordinator, indexingData, txsPoolPerShard) - return allMiniBlocks, txsPoolPerShard, nil + return miniBlocks, txsPoolPerShard, nil } // IsInterfaceNil returns true if the underlying object is nil diff --git a/genesis/parsing/accountsParser_test.go b/genesis/parsing/accountsParser_test.go index fa3020f5bef..c3c5c40113a 100644 --- a/genesis/parsing/accountsParser_test.go +++ b/genesis/parsing/accountsParser_test.go @@ -641,11 +641,11 @@ func TestAccountsParser_GenerateInitialTransactionsTxsPool(t *testing.T) { miniBlocks, txsPoolPerShard, err := ap.GenerateInitialTransactions(sharder, indexingDataMap) require.Nil(t, err) - assert.Equal(t, 10, len(miniBlocks)) + assert.Equal(t, 9, len(miniBlocks)) assert.Equal(t, 3, len(txsPoolPerShard)) - assert.Equal(t, 0, len(txsPoolPerShard[0].Txs)) - assert.Equal(t, 0, len(txsPoolPerShard[1].Txs)) + assert.Equal(t, 1, len(txsPoolPerShard[0].Txs)) + assert.Equal(t, 1, len(txsPoolPerShard[1].Txs)) assert.Equal(t, len(ibs), len(txsPoolPerShard[core.MetachainShardId].Txs)) assert.Equal(t, 0, len(txsPoolPerShard[0].Scrs)) assert.Equal(t, 0, len(txsPoolPerShard[1].Scrs)) @@ -734,7 +734,7 @@ func TestAccountsParser_GenerateInitialTransactionsVerifyTxsHashes(t *testing.T) miniBlocks, txsPoolPerShard, err := ap.GenerateInitialTransactions(sharder, indexingDataMap) require.Nil(t, err) - assert.Equal(t, 5, len(miniBlocks)) + assert.Equal(t, 4, len(miniBlocks)) assert.Equal(t, 2, len(txsPoolPerShard)) assert.Equal(t, 1, len(txsPoolPerShard[0].Txs)) From 415d3fdf32afeab01b6718dc2d43a2e3832ed0f5 Mon Sep 17 00:00:00 2001 From: ssd04 Date: Thu, 27 Oct 2022 14:31:38 +0300 Subject: [PATCH 098/110] use bytes.Equal instead of compare --- genesis/parsing/accountsParser.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/genesis/parsing/accountsParser.go b/genesis/parsing/accountsParser.go index 57df26a6416..2020932cdaa 100644 --- a/genesis/parsing/accountsParser.go +++ b/genesis/parsing/accountsParser.go @@ -410,7 +410,7 @@ func (ap *accountsParser) setTxsPoolAndMiniBlocks( receiverShardID := shardCoordinator.ComputeId(txHandler.GetRcvAddr()) var senderShardID uint32 - if bytes.Compare(txHandler.GetSndAddr(), ap.minterAddressBytes) == 0 { + if bytes.Equal(txHandler.GetSndAddr(), ap.minterAddressBytes) { senderShardID = core.MetachainShardId } else { senderShardID = shardCoordinator.ComputeId(txHandler.GetSndAddr()) From 29ac34df5f792bc15370d7c9619506f932711576 Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Fri, 28 Oct 2022 11:53:13 +0300 Subject: [PATCH 099/110] linter + grammar fixes --- .github/CONTRIBUTING.md | 2 +- README.md | 2 +- api/errors/errors.go | 2 +- api/gin/httpServer.go | 4 +- api/groups/addressGroup_test.go | 2 +- api/groups/baseGroup.go | 2 +- api/groups/transactionGroup.go | 2 +- api/middleware/responseLogger.go | 2 +- api/shared/interface.go | 2 +- cmd/logviewer/testing/main.go | 2 +- cmd/termui/presenter/blockInfoGetters.go | 2 +- cmd/termui/presenter/instanceInfoGetters.go | 2 +- cmd/termui/provider/metricsProvider.go | 4 +- common/constants.go | 10 ++-- .../factory/softwareVersionFactory.go | 2 +- config/config.go | 2 +- config/externalConfig.go | 2 +- consensus/broadcast/delayedBroadcast.go | 2 +- consensus/chronology/chronology.go | 4 +- consensus/interface.go | 2 +- consensus/mock/keyGenMock.go | 4 +- consensus/round/round.go | 2 +- consensus/spos/bls/subroundBlock.go | 2 +- consensus/spos/bls/subroundEndRound_test.go | 2 +- consensus/spos/bls/subroundSignature.go | 2 +- consensus/spos/roundConsensus.go | 2 +- consensus/spos/roundState.go | 2 +- consensus/spos/sposFactory/sposFactory.go | 6 +- consensus/spos/subround.go | 2 +- dataRetriever/chainStorer.go | 16 +++++ dataRetriever/errors.go | 2 +- dataRetriever/mock/hasherStub.go | 4 +- .../requestHandlers/requestHandler_test.go | 2 +- dataRetriever/resolvers/headerResolver.go | 2 +- dblookupext/historyRepository_test.go | 2 +- debug/resolver/interceptorResolver.go | 2 +- docker-compose.yml | 4 +- .../disabled/disabledAntiFloodHandler.go | 2 +- ...abledCurrentNetworkEpochProviderHandler.go | 2 +- .../disabled/disabledHeaderSigVerifier.go | 2 +- .../disabled/disabledNodesCoordinator.go | 2 +- epochStart/bootstrap/metaStorageHandler.go | 2 +- epochStart/bootstrap/shardStorageHandler.go | 2 +- epochStart/bootstrap/startInEpochScheduled.go | 2 +- epochStart/bootstrap/storageProcess.go | 2 +- epochStart/errors.go | 5 +- epochStart/metachain/economics_test.go | 10 ++-- .../notifier/epochStartSubscriptionHandler.go | 2 +- facade/initial/initialNodeFacade.go | 2 +- facade/interface.go | 2 +- facade/nodeFacade.go | 2 +- factory/bootstrap/bootstrapComponents.go | 2 +- factory/consensus/consensusComponents.go | 2 +- factory/core/coreComponents.go | 2 +- factory/mock/blockProcessorStub.go | 2 +- factory/mock/processComponentsStub.go | 2 +- factory/mock/scalarMock.go | 2 +- factory/mock/singlesignerMock.go | 6 +- factory/mock/stateComponentsHolderStub.go | 2 +- genesis/checking/nodesSetupChecker_test.go | 2 +- genesis/interface.go | 2 +- genesis/mock/txExecutionProcessorStub.go | 2 +- genesis/parsing/accountsParser.go | 2 +- genesis/parsing/accountsParser_test.go | 2 +- .../stateComponents/stateComponents_test.go | 2 +- .../antiflooding/antiflooding_test.go | 2 +- .../{rounderMock.go => roundHandlerMock.go} | 24 ++++---- integrationTests/mock/vmContainerMock.go | 2 +- .../interceptedBlocks_test.go | 2 +- .../antiflooding/antiflooding_test.go | 4 +- .../p2p/antiflood/blacklist/blacklist_test.go | 2 +- .../stateExecTransaction_test.go | 2 +- .../state/stateTrie/stateTrie_test.go | 2 +- integrationTests/testWalletAccount.go | 2 +- .../vm/esdt/nft/esdtNFT/esdtNft_test.go | 4 +- .../vmRunContract/vmRunContract_test.go | 2 +- integrationTests/vm/txsFee/dns_test.go | 4 +- node/external/blockAPI/baseBlock_test.go | 4 +- node/external/blockAPI/errors.go | 3 - node/external/blockAPI/metaBlock_test.go | 4 +- node/metrics/metrics.go | 2 +- node/metrics/metrics_test.go | 2 +- node/mock/apiInternalBlockHandlerStub.go | 2 +- node/mock/blockProcessorStub.go | 2 +- node/mock/hasherFake.go | 4 +- node/mock/marshalizerMock.go | 4 +- node/mock/singlesignerMock.go | 6 +- node/mock/vmExecutionHandlerStub.go | 2 +- node/nodeLoadAccounts_test.go | 2 +- .../block/bootstrapStorage/bootstrapStorer.go | 2 +- process/block/displayMetaBlock.go | 2 +- process/block/metablock.go | 2 +- .../block/preprocess/scheduledTxsExecution.go | 8 +-- process/block/shardblock.go | 4 +- process/economics/builtInFunctionsCost.go | 2 +- process/economics/interface.go | 2 +- process/errors.go | 36 +++++------ process/headerCheck/errors.go | 2 +- .../epochStartMetaBlockInterceptor.go | 2 +- process/mock/blockProcessorMock.go | 4 +- process/mock/p2pAntifloodHandlerStub.go | 2 +- process/mock/syncTimerMock.go | 8 +-- process/peer/process.go | 2 +- process/peer/validatorsProvider.go | 4 +- process/peer/validatorsProvider_test.go | 2 +- process/requiredDataPool.go | 2 +- process/smartContract/hooks/blockChainHook.go | 6 +- process/smartContract/process.go | 2 +- process/sync/baseForkDetector.go | 6 +- process/sync/baseSync.go | 8 +-- process/sync/metaForkDetector.go | 4 +- process/sync/metablock.go | 6 +- process/sync/shardblock.go | 4 +- .../floodPreventers/quotaFloodPreventer.go | 2 +- .../topicFloodPreventer_test.go | 6 +- process/txsimulator/interface.go | 2 +- sharding/interface.go | 2 +- sharding/multiShardCoordinator.go | 4 +- sharding/nodesCoordinator/errors.go | 5 +- .../indexHashedNodesCoordinator.go | 2 +- sharding/nodesCoordinator/interface.go | 2 +- .../selectionBasedProvider.go | 2 +- .../evictionWaitingList.go | 2 +- statusHandler/persister/common.go | 2 +- statusHandler/statusMetricsProvider_test.go | 6 +- storage/interface.go | 2 +- storage/mock/extendedStorageServiceStub.go | 6 +- storage/pruning/fullHistoryPruningStorer.go | 2 +- testscommon/chainHandlerMock.go | 2 +- testscommon/chainHandlerStub.go | 2 +- testscommon/cryptoMocks/keyStub.go | 4 +- testscommon/cryptoMocks/scalar.go | 2 +- testscommon/headerHandlerStub.go | 2 +- testscommon/keccakMock.go | 4 +- testscommon/logsFacadeStub.go | 2 +- testscommon/shardStatisticsMock.go | 60 ------------------- testscommon/txcachemocks/txGasHandlerMock.go | 2 +- trie/doubleListSync_test.go | 2 +- vm/errors.go | 4 +- vm/systemSmartContracts/governance.go | 14 ++--- vm/systemSmartContracts/staking_test.go | 4 +- vm/systemSmartContracts/validator_test.go | 2 +- 142 files changed, 247 insertions(+), 300 deletions(-) rename integrationTests/mock/{rounderMock.go => roundHandlerMock.go} (50%) delete mode 100644 testscommon/shardStatisticsMock.go diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 0323f2a4d9b..5286ca7eb15 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,7 +1,7 @@ # Contributing to elrond-go -If you are unfamiliar with the workflow of contributing to github, you can refer to this [this article](https://github.com/firstcontributions/first-contributions/blob/master/README.md) +If you are unfamiliar with the workflow of contributing to GitHub, you can refer to [this article](https://github.com/firstcontributions/first-contributions/blob/master/README.md) ## External contributions diff --git a/README.md b/README.md index edbcc737afd..3994ac9689e 100644 --- a/README.md +++ b/README.md @@ -193,7 +193,7 @@ docker run -d -v /absolute/path/to/config/:/data/ elrondnetwork/elrond-go-node:l ## Contribution Thank you for considering to help out with the source code! We welcome contributions from anyone on the internet, and are grateful for even the smallest of fixes to Elrond! -If you'd like to contribute to Elrond, please fork, fix, commit and send a pull request for the maintainers to review and merge into the main code base. If you wish to submit more complex changes though, please check up with the core developers first here on github, to ensure those changes are in line with the general philosophy of the project and/or get some early feedback which can make both your efforts much lighter as well as our review and merge procedures quick and simple. +If you'd like to contribute to Elrond, please fork, fix, commit and send a pull request for the maintainers to review and merge into the main code base. If you wish to submit more complex changes though, please check up with the core developers first here on GitHub, to ensure those changes are in line with the general philosophy of the project and/or get some early feedback which can make both your efforts much lighter as well as our review and merge procedures quick and simple. Please make sure your contributions adhere to our coding guidelines: diff --git a/api/errors/errors.go b/api/errors/errors.go index 90c91df02b8..fa469ef26fc 100644 --- a/api/errors/errors.go +++ b/api/errors/errors.go @@ -40,7 +40,7 @@ var ErrGetESDTNFTData = errors.New("get esdt nft data for account error") // ErrEmptyAddress signals that an empty address was provided var ErrEmptyAddress = errors.New("address is empty") -// ErrEmptyKey signals an that empty key was provided +// ErrEmptyKey signals that an empty key was provided var ErrEmptyKey = errors.New("key is empty") // ErrEmptyTokenIdentifier signals that an empty token identifier was provided diff --git a/api/gin/httpServer.go b/api/gin/httpServer.go index 3cda4736416..6998dd4edfe 100644 --- a/api/gin/httpServer.go +++ b/api/gin/httpServer.go @@ -23,8 +23,8 @@ func NewHttpServer(server *http.Server) (*httpServer, error) { }, nil } -// Start will handle the starting of the gin web server. This call is blocking and it should be -// called on a go routine (different than the main one) +// Start will handle the starting of the gin web server. This call is blocking, and it should be +// called on a go routine (different from the main one) func (h *httpServer) Start() { err := h.server.ListenAndServe() if err != nil { diff --git a/api/groups/addressGroup_test.go b/api/groups/addressGroup_test.go index 9d0a7a7e89c..c4db6370dbb 100644 --- a/api/groups/addressGroup_test.go +++ b/api/groups/addressGroup_test.go @@ -676,7 +676,7 @@ func TestGetESDTNFTData_ShouldWork(t *testing.T) { GetESDTDataCalled: func(_ string, _ string, _ uint64, _ api.AccountQueryOptions) (*esdt.ESDigitalToken, api.BlockInfo, error) { return &esdt.ESDigitalToken{ Value: big.NewInt(100), - Properties: []byte(testProperties), + Properties: testProperties, TokenMetaData: &esdt.MetaData{Nonce: testNonce, Creator: []byte(testAddress)}}, api.BlockInfo{}, nil }, } diff --git a/api/groups/baseGroup.go b/api/groups/baseGroup.go index 9487e1a4b37..8b5909573a0 100644 --- a/api/groups/baseGroup.go +++ b/api/groups/baseGroup.go @@ -69,7 +69,7 @@ func extractSpecificMiddlewares(middlewares []shared.AdditionalMiddleware) ([]gi func getEndpointProperties(ws *gin.RouterGroup, path string, apiConfig config.ApiRoutesConfig) endpointProperties { basePath := ws.BasePath() - // ws.BasePath will return paths like /group or /v1.0/group so we need the last token after splitting by / + // ws.BasePath will return paths like /group or /v1.0/group, so we need the last token after splitting by / splitPath := strings.Split(basePath, "/") basePath = splitPath[len(splitPath)-1] diff --git a/api/groups/transactionGroup.go b/api/groups/transactionGroup.go index 8d99a32892c..89bcc177187 100644 --- a/api/groups/transactionGroup.go +++ b/api/groups/transactionGroup.go @@ -186,7 +186,7 @@ type TxResponse struct { Timestamp uint64 `json:"timestamp"` } -// simulateTransaction will receive a transaction from the client and will simulate it's execution and return the results +// simulateTransaction will receive a transaction from the client and will simulate its execution and return the results func (tg *transactionGroup) simulateTransaction(c *gin.Context) { var gtx = SendTxRequest{} err := c.ShouldBindJSON(>x) diff --git a/api/middleware/responseLogger.go b/api/middleware/responseLogger.go index 88bf4546743..36ff6261ec7 100644 --- a/api/middleware/responseLogger.go +++ b/api/middleware/responseLogger.go @@ -33,7 +33,7 @@ func NewResponseLoggerMiddleware(thresholdDurationForLoggingRequest time.Duratio return rlm } -// MiddlewareHandlerFunc logs detail about a request if it is not successful or it's duration is higher than a threshold +// MiddlewareHandlerFunc logs detail about a request if it is not successful, or it's duration is higher than a threshold func (rlm *responseLoggerMiddleware) MiddlewareHandlerFunc() gin.HandlerFunc { return func(c *gin.Context) { t := time.Now() diff --git a/api/shared/interface.go b/api/shared/interface.go index 50ed40c1504..46702f127a0 100644 --- a/api/shared/interface.go +++ b/api/shared/interface.go @@ -48,7 +48,7 @@ type UpgradeableHttpServerHandler interface { IsInterfaceNil() bool } -// GroupHandler defines the actions needed to be performed by an gin API group +// GroupHandler defines the actions needed to be performed by a gin API group type GroupHandler interface { UpdateFacade(newFacade interface{}) error RegisterRoutes( diff --git a/cmd/logviewer/testing/main.go b/cmd/logviewer/testing/main.go index 81973c00aa4..70f2557c866 100644 --- a/cmd/logviewer/testing/main.go +++ b/cmd/logviewer/testing/main.go @@ -56,7 +56,7 @@ VERSION: ) // This application starts a test web socket server, initialize it, opens "/log" route and waits for -// clients to connect. After the connection is done, it waits for the pattern message and then it sends continuously +// clients to connect. After the connection is done, it waits for the pattern message, and then it sends continuously // log lines-type of messages func main() { initCliFlags() diff --git a/cmd/termui/presenter/blockInfoGetters.go b/cmd/termui/presenter/blockInfoGetters.go index 4811f20476a..02692182e35 100644 --- a/cmd/termui/presenter/blockInfoGetters.go +++ b/cmd/termui/presenter/blockInfoGetters.go @@ -52,7 +52,7 @@ func (psh *PresenterStatusHandler) GetBlockSize() uint64 { return miniBlocksSize + headerSize } -// GetHighestFinalBlock will return highest nonce block notarized by metachain for current shard +// GetHighestFinalBlock will return the highest nonce block notarized by metachain for current shard func (psh *PresenterStatusHandler) GetHighestFinalBlock() uint64 { return psh.getFromCacheAsUint64(common.MetricHighestFinalBlock) } diff --git a/cmd/termui/presenter/instanceInfoGetters.go b/cmd/termui/presenter/instanceInfoGetters.go index 0a1a535ec67..1ea468347bf 100644 --- a/cmd/termui/presenter/instanceInfoGetters.go +++ b/cmd/termui/presenter/instanceInfoGetters.go @@ -80,7 +80,7 @@ func (psh *PresenterStatusHandler) GetCountAcceptedBlocks() uint64 { return psh.getFromCacheAsUint64(common.MetricCountAcceptedBlocks) } -// CheckSoftwareVersion will check if node is the latest version and will return latest stable version +// CheckSoftwareVersion will check if node is the latest version and will return the latest stable version func (psh *PresenterStatusHandler) CheckSoftwareVersion() (bool, string) { latestStableVersion := psh.getFromCacheAsString(common.MetricLatestTagSoftwareVersion) appVersion := psh.getFromCacheAsString(common.MetricAppVersion) diff --git a/cmd/termui/provider/metricsProvider.go b/cmd/termui/provider/metricsProvider.go index 4fc04ef78dd..2dfcf8391c4 100644 --- a/cmd/termui/provider/metricsProvider.go +++ b/cmd/termui/provider/metricsProvider.go @@ -111,7 +111,7 @@ func (smp *StatusMetricsProvider) applyMetricsToPresenter(metricsMap map[string] func (smp *StatusMetricsProvider) setPresenterValue(key string, value interface{}) error { switch v := value.(type) { case float64: - // json unmarshal treats all the numbers (in a field interface{}) as floats so we need to cast it to uint64 + // json unmarshal treats all the numbers (in a field interface{}) as floats, so we need to cast it to uint64 // because it is the numeric type used by the presenter smp.presenter.SetUInt64Value(key, uint64(v)) case string: @@ -124,7 +124,7 @@ func (smp *StatusMetricsProvider) setPresenterValue(key string, value interface{ } func formatUrlAddress(address string) string { - httpPrefix := "http://" + httpPrefix := "https://" if !strings.HasPrefix(address, httpPrefix) { address = httpPrefix + address } diff --git a/common/constants.go b/common/constants.go index 2c6f7c512fe..59afd45bdb3 100644 --- a/common/constants.go +++ b/common/constants.go @@ -315,7 +315,7 @@ const MetricRewardsTopUpGradientPoint = "erd_rewards_top_up_gradient_point" // MetricGasPriceModifier is the metric that specifies the gas price modifier const MetricGasPriceModifier = "erd_gas_price_modifier" -// MetricTopUpFactor is the metric that specifies the top up factor +// MetricTopUpFactor is the metric that specifies the top-up factor const MetricTopUpFactor = "erd_top_up_factor" // MetricMinTransactionVersion is the metric that specifies the minimum transaction version @@ -363,7 +363,7 @@ const MetachainShardId = uint32(0xFFFFFFFF) // BaseOperationCost represents the field name for base operation costs const BaseOperationCost = "BaseOperationCost" -// BuiltInCost represents the field name for built in operation costs +// BuiltInCost represents the field name for built-in operation costs const BuiltInCost = "BuiltInCost" // MetaChainSystemSCsCost represents the field name for metachain system smart contract operation costs @@ -383,7 +383,7 @@ const ( // MetricScDeployEnableEpoch represents the epoch when the deployment of smart contracts is enabled MetricScDeployEnableEpoch = "erd_smart_contract_deploy_enable_epoch" - // MetricBuiltInFunctionsEnableEpoch represents the epoch when the built in functions is enabled + // MetricBuiltInFunctionsEnableEpoch represents the epoch when the built-in functions is enabled MetricBuiltInFunctionsEnableEpoch = "erd_built_in_functions_enable_epoch" // MetricRelayedTransactionsEnableEpoch represents the epoch when the relayed transactions is enabled @@ -811,13 +811,13 @@ const ( // MaxIndexOfTxInMiniBlock defines the maximum index of a tx inside one mini block const MaxIndexOfTxInMiniBlock = int32(29999) -// MetricAccountsSnapshotInProgress is the metric that outputs the status of the accounts snapshot, if it's in progress or not +// MetricAccountsSnapshotInProgress is the metric that outputs the status of the accounts' snapshot, if it's in progress or not const MetricAccountsSnapshotInProgress = "erd_accounts_snapshot_in_progress" // MetricLastAccountsSnapshotDurationSec is the metric that outputs the duration in seconds of the last accounts db snapshot. If snapshot is in progress it will be set to 0 const MetricLastAccountsSnapshotDurationSec = "erd_accounts_snapshot_last_duration_in_seconds" -// MetricPeersSnapshotInProgress is the metric that outputs the status of the peers snapshot, if it's in progress or not +// MetricPeersSnapshotInProgress is the metric that outputs the status of the peers' snapshot, if it's in progress or not const MetricPeersSnapshotInProgress = "erd_peers_snapshot_in_progress" // MetricLastPeersSnapshotDurationSec is the metric that outputs the duration in seconds of the last peers db snapshot. If snapshot is in progress it will be set to 0 diff --git a/common/statistics/softwareVersion/factory/softwareVersionFactory.go b/common/statistics/softwareVersion/factory/softwareVersionFactory.go index 783d3d4d055..13b571716e4 100644 --- a/common/statistics/softwareVersion/factory/softwareVersionFactory.go +++ b/common/statistics/softwareVersion/factory/softwareVersionFactory.go @@ -29,7 +29,7 @@ func NewSoftwareVersionFactory( return softwareVersionFactoryObject, nil } -// Create returns an software version checker object +// Create returns a software version checker object func (svf *softwareVersionFactory) Create() (*softwareVersion.SoftwareVersionChecker, error) { stableTagProvider := softwareVersion.NewStableTagProvider(svf.config.StableTagLocation) softwareVersionChecker, err := softwareVersion.NewSoftwareVersionChecker(svf.statusHandler, stableTagProvider, svf.config.PollingIntervalInMinutes) diff --git a/config/config.go b/config/config.go index 63de6d1b30a..8d07ed6d68e 100644 --- a/config/config.go +++ b/config/config.go @@ -414,7 +414,7 @@ type VirtualMachineGasConfig struct { MetaMaxGasPerVmQuery uint64 } -// BuiltInFunctionsConfig holds the configuration for the built in functions +// BuiltInFunctionsConfig holds the configuration for the built-in functions type BuiltInFunctionsConfig struct { AutomaticCrawlerAddresses []string MaxNumAddressesInTransferRole uint32 diff --git a/config/externalConfig.go b/config/externalConfig.go index 47f7b8d270c..66d5cb59b35 100644 --- a/config/externalConfig.go +++ b/config/externalConfig.go @@ -1,6 +1,6 @@ package config -// ExternalConfig will hold the configurations for external tools, such as Explorer or Elastic Search +// ExternalConfig will hold the configurations for external tools, such as Explorer or Elasticsearch type ExternalConfig struct { ElasticSearchConnector ElasticSearchConfig EventNotifierConnector EventNotifierConfig diff --git a/consensus/broadcast/delayedBroadcast.go b/consensus/broadcast/delayedBroadcast.go index 27d2512488e..ff4f32753f6 100644 --- a/consensus/broadcast/delayedBroadcast.go +++ b/consensus/broadcast/delayedBroadcast.go @@ -649,7 +649,7 @@ func (dbb *delayedBlockBroadcaster) interceptedHeader(_ string, headerHash []byt if sameHeader { dbb.valHeaderBroadcastData = append(dbb.valHeaderBroadcastData[:i], dbb.valHeaderBroadcastData[i+1:]...) - // leader has broadcast the header so we can cancel the header alarm + // leader has broadcast the header, so we can cancel the header alarm alarmID := prefixHeaderAlarm + hex.EncodeToString(headerHash) alarmsToCancel = append(alarmsToCancel, alarmID) log.Trace("delayedBlockBroadcaster.interceptedHeader: leader has broadcast header, validator cancelling alarm", diff --git a/consensus/chronology/chronology.go b/consensus/chronology/chronology.go index 3a8f44ba3ae..cadd3525e49 100644 --- a/consensus/chronology/chronology.go +++ b/consensus/chronology/chronology.go @@ -157,7 +157,7 @@ func (chr *chronology) startRound(ctx context.Context) { chr.subroundId = sr.Next() } -// updateRound updates rounds and subrounds depending of the current time and the finished tasks +// updateRound updates rounds and subrounds depending on the current time and the finished tasks func (chr *chronology) updateRound() { oldRoundIndex := chr.roundHandler.Index() chr.roundHandler.UpdateRound(chr.genesisTime, chr.syncTimer.CurrentTime()) @@ -172,7 +172,7 @@ func (chr *chronology) updateRound() { } } -// initRound is called when a new round begins and it does the necessary initialization +// initRound is called when a new round begins, and it does the necessary initialization func (chr *chronology) initRound() { chr.subroundId = srBeforeStartRound diff --git a/consensus/interface.go b/consensus/interface.go index e66a2c63a97..ca67c5e5a7c 100644 --- a/consensus/interface.go +++ b/consensus/interface.go @@ -17,7 +17,7 @@ const BlsConsensusType = "bls" type RoundHandler interface { Index() int64 BeforeGenesis() bool - // UpdateRound updates the index and the time stamp of the round depending of the genesis time and the current time given + // UpdateRound updates the index and the time stamp of the round depending on the genesis time and the current time given UpdateRound(time.Time, time.Time) TimeStamp() time.Time TimeDuration() time.Duration diff --git a/consensus/mock/keyGenMock.go b/consensus/mock/keyGenMock.go index 059330b1181..d12ba63f128 100644 --- a/consensus/mock/keyGenMock.go +++ b/consensus/mock/keyGenMock.go @@ -82,12 +82,12 @@ func (keyGen *KeyGenMock) GeneratePair() (crypto.PrivateKey, crypto.PublicKey) { return keyGen.GeneratePairMock() } -// PrivateKeyFromByteArray generates the private key from it's byte array representation +// PrivateKeyFromByteArray generates the private key from its byte array representation func (keyGen *KeyGenMock) PrivateKeyFromByteArray(b []byte) (crypto.PrivateKey, error) { return keyGen.PrivateKeyFromByteArrayMock(b) } -// PublicKeyFromByteArray generates a public key from it's byte array representation +// PublicKeyFromByteArray generates a public key from its byte array representation func (keyGen *KeyGenMock) PublicKeyFromByteArray(b []byte) (crypto.PublicKey, error) { return keyGen.PublicKeyFromByteArrayMock(b) } diff --git a/consensus/round/round.go b/consensus/round/round.go index 46b11172f00..679473dd00f 100644 --- a/consensus/round/round.go +++ b/consensus/round/round.go @@ -47,7 +47,7 @@ func NewRound( return &rnd, nil } -// UpdateRound updates the index and the time stamp of the round depending of the genesis time and the current time given +// UpdateRound updates the index and the time stamp of the round depending on the genesis time and the current time given func (rnd *round) UpdateRound(genesisTimeStamp time.Time, currentTimeStamp time.Time) { delta := currentTimeStamp.Sub(genesisTimeStamp).Nanoseconds() diff --git a/consensus/spos/bls/subroundBlock.go b/consensus/spos/bls/subroundBlock.go index 543ec5d7cb0..649ec28cc37 100644 --- a/consensus/spos/bls/subroundBlock.go +++ b/consensus/spos/bls/subroundBlock.go @@ -447,7 +447,7 @@ func (sr *subroundBlock) receivedBlockBody(ctx context.Context, cnsDta *consensu } // receivedBlockHeader method is called when a block header is received through the block header channel. -// If the block header is valid, than the validatorRoundStates map corresponding to the node which sent it, +// If the block header is valid, then the validatorRoundStates map corresponding to the node which sent it, // is set on true for the subround Block func (sr *subroundBlock) receivedBlockHeader(ctx context.Context, cnsDta *consensus.Message) bool { node := string(cnsDta.PubKey) diff --git a/consensus/spos/bls/subroundEndRound_test.go b/consensus/spos/bls/subroundEndRound_test.go index fb8ce2ed815..26e5bc9d4b1 100644 --- a/consensus/spos/bls/subroundEndRound_test.go +++ b/consensus/spos/bls/subroundEndRound_test.go @@ -857,7 +857,7 @@ func TestSubroundEndRound_IsOutOfTimeShouldReturnFalse(t *testing.T) { func TestSubroundEndRound_IsOutOfTimeShouldReturnTrue(t *testing.T) { t.Parallel() - // update roundHandler's mock so it will calculate for real the duration + // update roundHandler's mock, so it will calculate for real the duration container := mock.InitConsensusCore() roundHandler := mock.RoundHandlerMock{RemainingTimeCalled: func(startTime time.Time, maxTime time.Duration) time.Duration { currentTime := time.Now() diff --git a/consensus/spos/bls/subroundSignature.go b/consensus/spos/bls/subroundSignature.go index 98fe9e8f351..879ee6723c3 100644 --- a/consensus/spos/bls/subroundSignature.go +++ b/consensus/spos/bls/subroundSignature.go @@ -130,7 +130,7 @@ func (sr *subroundSignature) doSignatureJob(_ context.Context) bool { } // receivedSignature method is called when a signature is received through the signature channel. -// If the signature is valid, than the jobDone map corresponding to the node which sent it, +// If the signature is valid, then the jobDone map corresponding to the node which sent it, // is set on true for the subround Signature func (sr *subroundSignature) receivedSignature(_ context.Context, cnsDta *consensus.Message) bool { node := string(cnsDta.PubKey) diff --git a/consensus/spos/roundConsensus.go b/consensus/spos/roundConsensus.go index a74b0bf6ff7..4d9e5363be1 100644 --- a/consensus/spos/roundConsensus.go +++ b/consensus/spos/roundConsensus.go @@ -181,7 +181,7 @@ func (rcns *roundConsensus) ComputeSize(subroundId int) int { return n } -// ResetRoundState method resets the state of each node from the current jobDone group, regarding to the +// ResetRoundState method resets the state of each node from the current jobDone group, regarding the // consensus validatorRoundStates func (rcns *roundConsensus) ResetRoundState() { rcns.mut.Lock() diff --git a/consensus/spos/roundState.go b/consensus/spos/roundState.go index 844554c6787..6de6c9b8f02 100644 --- a/consensus/spos/roundState.go +++ b/consensus/spos/roundState.go @@ -5,7 +5,7 @@ import ( ) // roundState defines the data needed by spos to know the state of each node from the current jobDone group, -// regarding to the consensus validatorRoundStates in each subround of the current round +// regarding the consensus validatorRoundStates in each subround of the current round type roundState struct { jobDone map[int]bool mut sync.RWMutex diff --git a/consensus/spos/sposFactory/sposFactory.go b/consensus/spos/sposFactory/sposFactory.go index 433b9eb7a48..933c53a8590 100644 --- a/consensus/spos/sposFactory/sposFactory.go +++ b/consensus/spos/sposFactory/sposFactory.go @@ -15,7 +15,7 @@ import ( "github.com/ElrondNetwork/elrond-go/sharding" ) -// GetSubroundsFactory returns a subrounds factory depending of the given parameter +// GetSubroundsFactory returns a subrounds factory depending on the given parameter func GetSubroundsFactory( consensusDataContainer spos.ConsensusCoreHandler, consensusState *spos.ConsensusState, @@ -48,7 +48,7 @@ func GetSubroundsFactory( } } -// GetConsensusCoreFactory returns a consensus service depending of the given parameter +// GetConsensusCoreFactory returns a consensus service depending on the given parameter func GetConsensusCoreFactory(consensusType string) (spos.ConsensusService, error) { switch consensusType { case blsConsensusType: @@ -58,7 +58,7 @@ func GetConsensusCoreFactory(consensusType string) (spos.ConsensusService, error } } -// GetBroadcastMessenger returns a consensus service depending of the given parameter +// GetBroadcastMessenger returns a consensus service depending on the given parameter func GetBroadcastMessenger( marshalizer marshal.Marshalizer, hasher hashing.Hasher, diff --git a/consensus/spos/subround.go b/consensus/spos/subround.go index edf423e7c0a..02d8dd4026f 100644 --- a/consensus/spos/subround.go +++ b/consensus/spos/subround.go @@ -12,7 +12,7 @@ import ( var _ consensus.SubroundHandler = (*Subround)(nil) // Subround struct contains the needed data for one Subround and the Subround properties. It defines a Subround -// with it's properties (it's ID, next Subround ID, it's duration, it's name) and also it has some handler functions +// with its properties (its ID, next Subround ID, its duration, its name) and also it has some handler functions // which should be set. Job function will be the main function of this Subround, Extend function will handle the overtime // situation of the Subround and Check function will decide if in this Subround the consensus is achieved type Subround struct { diff --git a/dataRetriever/chainStorer.go b/dataRetriever/chainStorer.go index d77fa35cacd..29e10252839 100644 --- a/dataRetriever/chainStorer.go +++ b/dataRetriever/chainStorer.go @@ -2,13 +2,18 @@ package dataRetriever import ( "fmt" + "sort" + "strings" "sync" + logger "github.com/ElrondNetwork/elrond-go-logger" "github.com/ElrondNetwork/elrond-go/storage" ) var _ StorageService = (*ChainStorer)(nil) +var log = logger.GetOrCreate("chainstorer") + // ChainStorer is a StorageService implementation that can hold multiple storages // grouped by storage unit type type ChainStorer struct { @@ -23,10 +28,21 @@ func NewChainStorer() *ChainStorer { } } +// AddStorer will add a new storer to the chain map // AddStorer will add a new storer to the chain map func (bc *ChainStorer) AddStorer(key UnitType, s storage.Storer) { bc.lock.Lock() bc.chain[key] = s + allStorersArr := make([]string, 0) + for key := range bc.chain { + allStorersArr = append(allStorersArr, key.String()) + } + + sort.SliceStable(allStorersArr, func(i, j int) bool { + return allStorersArr[i] < allStorersArr[j] + }) + + log.Error("adding storer", "type", key.String(), "current num of storers", len(bc.chain), "all storers", "\n"+strings.Join(allStorersArr, "\n")) bc.lock.Unlock() } diff --git a/dataRetriever/errors.go b/dataRetriever/errors.go index d08f70c8584..9031187d26e 100644 --- a/dataRetriever/errors.go +++ b/dataRetriever/errors.go @@ -245,7 +245,7 @@ var ErrNilNodesCoordinator = errors.New("nil nodes coordinator") // ErrNilPayloadValidator signals that a nil payload validator was provided var ErrNilPayloadValidator = errors.New("nil payload validator") -// ErrWrongTypeAssertion signals that an type assertion failed +// ErrWrongTypeAssertion signals that a type assertion failed var ErrWrongTypeAssertion = errors.New("wrong type assertion") // ErrStorerNotFound signals that the storer was not found diff --git a/dataRetriever/mock/hasherStub.go b/dataRetriever/mock/hasherStub.go index 16b77d91288..9c78ea0f1aa 100644 --- a/dataRetriever/mock/hasherStub.go +++ b/dataRetriever/mock/hasherStub.go @@ -28,6 +28,6 @@ func (HasherStub) Size() int { } // IsInterfaceNil returns true if there is no value under the interface -func (hash *HasherStub) IsInterfaceNil() bool { - return hash == nil +func (hash HasherStub) IsInterfaceNil() bool { + return false } diff --git a/dataRetriever/requestHandlers/requestHandler_test.go b/dataRetriever/requestHandlers/requestHandler_test.go index 0be7ed23f99..def42b0a204 100644 --- a/dataRetriever/requestHandlers/requestHandler_test.go +++ b/dataRetriever/requestHandlers/requestHandler_test.go @@ -10,7 +10,7 @@ import ( "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/dataRetriever" "github.com/ElrondNetwork/elrond-go/dataRetriever/mock" - cache "github.com/ElrondNetwork/elrond-go/storage/cache" + "github.com/ElrondNetwork/elrond-go/storage/cache" "github.com/pkg/errors" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/dataRetriever/resolvers/headerResolver.go b/dataRetriever/resolvers/headerResolver.go index eaa93ce3f67..b249d95b20a 100644 --- a/dataRetriever/resolvers/headerResolver.go +++ b/dataRetriever/resolvers/headerResolver.go @@ -164,7 +164,7 @@ func (hdrRes *HeaderResolver) resolveHeaderFromNonce(rd *dataRetriever.RequestDa epoch := rd.Epoch - // header-nonces storer contains un-pruned data so it is safe to search like this + // header-nonces storer contains un-pruned data, so it is safe to search like this hash, err := hdrRes.hdrNoncesStorage.SearchFirst(rd.Value) if err != nil { log.Trace("hdrNoncesStorage.Get from calculated epoch", "error", err.Error()) diff --git a/dblookupext/historyRepository_test.go b/dblookupext/historyRepository_test.go index 2ac03d5ccbc..7d6e4cf69c8 100644 --- a/dblookupext/historyRepository_test.go +++ b/dblookupext/historyRepository_test.go @@ -719,7 +719,7 @@ func TestHistoryRepository_ConcurrentlyRecordAndNotarizeSameBlockMultipleTimes(t }() go func() { - // Receive less notifications (to test more aggressively) + // Receive fewer notifications (to test more aggressively) for i := 0; i < 50; i++ { repo.OnNotarizedBlocks(core.MetachainShardId, []data.HeaderHandler{metablock}, [][]byte{[]byte("metablockFoo")}) } diff --git a/debug/resolver/interceptorResolver.go b/debug/resolver/interceptorResolver.go index 0234b98624b..deff4847ffe 100644 --- a/debug/resolver/interceptorResolver.go +++ b/debug/resolver/interceptorResolver.go @@ -412,7 +412,7 @@ func (ir *interceptorResolver) LogFailedToResolveData(topic string, hash []byte, ev.mutEvent.Unlock() } -// LogSucceededToResolveData removes the recording that the resolver did not resolved a hash in the past +// LogSucceededToResolveData removes the recording that the resolver did not resolve a hash in the past func (ir *interceptorResolver) LogSucceededToResolveData(topic string, hash []byte) { identifier := ir.computeIdentifier(resolveEvent, topic, hash) diff --git a/docker-compose.yml b/docker-compose.yml index ebfd825aef2..f002005ed6a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,7 +8,7 @@ services: command: bash -c "go run cmd/node/main.go -port 4000 -max-allowed-peers 4 -private-key \"ZBis8aK5I66x1hwD+fE8sIw2nwQR5EBlTM8EiAOLZwE=\"" ports: - - 8080:8080 + - "8080:8080" es01: image: docker.elastic.co/elasticsearch/elasticsearch:7.1.0 @@ -28,7 +28,7 @@ services: - ./esdata/node1:/usr/share/elasticsearch/data - ./docker/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml ports: - - 9200:9200 + - "9200:9200" # networks: # - elrond diff --git a/epochStart/bootstrap/disabled/disabledAntiFloodHandler.go b/epochStart/bootstrap/disabled/disabledAntiFloodHandler.go index eeb4f1bf410..926bdb85a17 100644 --- a/epochStart/bootstrap/disabled/disabledAntiFloodHandler.go +++ b/epochStart/bootstrap/disabled/disabledAntiFloodHandler.go @@ -48,7 +48,7 @@ func (a *antiFloodHandler) IsOriginatorEligibleForTopic(_ core.PeerID, _ string) } // Close returns nil -func (af *antiFloodHandler) Close() error { +func (a *antiFloodHandler) Close() error { return nil } diff --git a/epochStart/bootstrap/disabled/disabledCurrentNetworkEpochProviderHandler.go b/epochStart/bootstrap/disabled/disabledCurrentNetworkEpochProviderHandler.go index 37bce78b23f..0d68f733816 100644 --- a/epochStart/bootstrap/disabled/disabledCurrentNetworkEpochProviderHandler.go +++ b/epochStart/bootstrap/disabled/disabledCurrentNetworkEpochProviderHandler.go @@ -10,7 +10,7 @@ func NewCurrentNetworkEpochProviderHandler() *currentNetworkEpochProviderHandler } // EpochConfirmed does nothing -func (ep *currentNetworkEpochProviderHandler) EpochConfirmed(_ uint32, _ uint64) { +func (cneph *currentNetworkEpochProviderHandler) EpochConfirmed(_ uint32, _ uint64) { } // EpochIsActiveInNetwork returns true diff --git a/epochStart/bootstrap/disabled/disabledHeaderSigVerifier.go b/epochStart/bootstrap/disabled/disabledHeaderSigVerifier.go index b3726aed0b2..d92f05e8016 100644 --- a/epochStart/bootstrap/disabled/disabledHeaderSigVerifier.go +++ b/epochStart/bootstrap/disabled/disabledHeaderSigVerifier.go @@ -20,7 +20,7 @@ func (h *headerSigVerifier) VerifyRandSeed(_ data.HeaderHandler) error { return nil } -// VerifyRandSeedAndLeaderSignature - +// VerifyLeaderSignature - func (h *headerSigVerifier) VerifyLeaderSignature(_ data.HeaderHandler) error { return nil } diff --git a/epochStart/bootstrap/disabled/disabledNodesCoordinator.go b/epochStart/bootstrap/disabled/disabledNodesCoordinator.go index 740224bfe6d..6d236f0c8a7 100644 --- a/epochStart/bootstrap/disabled/disabledNodesCoordinator.go +++ b/epochStart/bootstrap/disabled/disabledNodesCoordinator.go @@ -85,7 +85,7 @@ func (n *nodesCoordinator) ShardIdForEpoch(_ uint32) (uint32, error) { } // ShuffleOutForEpoch verifies if the shards changed in the new epoch and calls the shuffleOutHandler -func (ncm *nodesCoordinator) ShuffleOutForEpoch(_ uint32) { +func (n *nodesCoordinator) ShuffleOutForEpoch(_ uint32) { } // GetConsensusWhitelistedNodes - diff --git a/epochStart/bootstrap/metaStorageHandler.go b/epochStart/bootstrap/metaStorageHandler.go index 90caba2b717..519a6ac91ba 100644 --- a/epochStart/bootstrap/metaStorageHandler.go +++ b/epochStart/bootstrap/metaStorageHandler.go @@ -80,7 +80,7 @@ func (msh *metaStorageHandler) CloseStorageService() { } } -// SaveDataToStorage will save the fetched data to storage so it will be used by the storage bootstrap component +// SaveDataToStorage will save the fetched data to storage, so it will be used by the storage bootstrap component func (msh *metaStorageHandler) SaveDataToStorage(components *ComponentsNeededForBootstrap) error { bootStorer, err := msh.storageService.GetStorer(dataRetriever.BootstrapUnit) if err != nil { diff --git a/epochStart/bootstrap/shardStorageHandler.go b/epochStart/bootstrap/shardStorageHandler.go index 3a35f118893..06b793c0f7e 100644 --- a/epochStart/bootstrap/shardStorageHandler.go +++ b/epochStart/bootstrap/shardStorageHandler.go @@ -84,7 +84,7 @@ func (ssh *shardStorageHandler) CloseStorageService() { } } -// SaveDataToStorage will save the fetched data to storage so it will be used by the storage bootstrap component +// SaveDataToStorage will save the fetched data to storage, so it will be used by the storage bootstrap component func (ssh *shardStorageHandler) SaveDataToStorage(components *ComponentsNeededForBootstrap, notarizedShardHeader data.HeaderHandler, withScheduled bool) error { bootStorer, err := ssh.storageService.GetStorer(dataRetriever.BootstrapUnit) if err != nil { diff --git a/epochStart/bootstrap/startInEpochScheduled.go b/epochStart/bootstrap/startInEpochScheduled.go index d6609f5f786..e38958c828f 100644 --- a/epochStart/bootstrap/startInEpochScheduled.go +++ b/epochStart/bootstrap/startInEpochScheduled.go @@ -174,7 +174,7 @@ func getShardIDAndHashesForIncludedMetaBlocks(notarizedShardHeader data.ShardHea shardIDs := make([]uint32, 0) hashesToRequest := make([][]byte, 0) - // if there were processed metaBlocks in the notarized header, these need to be synced so they can get again processed + // if there were processed metaBlocks in the notarized header, these need to be synced, so they can get again processed metaBlockHashes := notarizedShardHeader.GetMetaBlockHashes() for i := range metaBlockHashes { shardIDs = append(shardIDs, core.MetachainShardId) diff --git a/epochStart/bootstrap/storageProcess.go b/epochStart/bootstrap/storageProcess.go index 630a0b68eb1..f10a880c18d 100644 --- a/epochStart/bootstrap/storageProcess.go +++ b/epochStart/bootstrap/storageProcess.go @@ -450,7 +450,7 @@ func (sesb *storageEpochStartBootstrap) processNodesConfig(pubKey []byte) error // applyCurrentShardIDOnMiniblocksCopy will alter the fetched metablocks making the sender shard ID for each miniblock // header to be exactly the shard ID used in the import-db process. This is necessary as to allow the miniblocks to be requested // on the available resolver and should be called only from this storage-base bootstrap instance. -// This method also copies the MiniBlockHeaders slice pointer. Otherwise the node will end up stating +// This method also copies the MiniBlockHeaders slice pointer. Otherwise, the node will end up stating // "start of epoch metablock mismatch" func (sesb *storageEpochStartBootstrap) applyCurrentShardIDOnMiniblocksCopy(metablock data.HeaderHandler) error { originalMiniblocksHeaders := metablock.GetMiniBlockHeaderHandlers() diff --git a/epochStart/errors.go b/epochStart/errors.go index 5488098d6dd..4d30f202d74 100644 --- a/epochStart/errors.go +++ b/epochStart/errors.go @@ -98,9 +98,6 @@ var ErrNilCoreComponentsHolder = errors.New("nil core components holder") // ErrNilCryptoComponentsHolder signals that a nil crypto components holder was provided var ErrNilCryptoComponentsHolder = errors.New("nil crypto components holder") -// ErrNilStatusCoreComponentsHolder signals that a nil status core components holder was provided -var ErrNilStatusCoreComponentsHolder = errors.New("nil status core components holder") - // ErrRewardMiniBlocksNumDoesNotMatch signals that number of created and received rewards miniblocks is not equal var ErrRewardMiniBlocksNumDoesNotMatch = errors.New("number of created and received rewards miniblocks missmatch") @@ -263,7 +260,7 @@ var ErrNilStakingDataProvider = errors.New("nil staking data provider") // ErrNilDataTrie signals that a nil data trie was provided var ErrNilDataTrie = errors.New("nil data trie") -// ErrInvalidMinNodePrice signals that the minimum node price is invalid (e.g negative, not a number, etc) +// ErrInvalidMinNodePrice signals that the minimum node price is invalid (e.g. negative, not a number, etc) var ErrInvalidMinNodePrice = errors.New("minimum node price is invalid") // ErrNilEconomicsDataProvider signals that the economics data provider is nil diff --git a/epochStart/metachain/economics_test.go b/epochStart/metachain/economics_test.go index 78af61e7057..3965794a9e0 100644 --- a/epochStart/metachain/economics_test.go +++ b/epochStart/metachain/economics_test.go @@ -447,7 +447,7 @@ func TestEconomics_VerifyRewardsPerBlock_DifferentHitRates(t *testing.T) { } args.Store = &storageStubs.ChainStorerStub{ GetStorerCalled: func(unitType dataRetriever.UnitType) (storage.Storer, error) { - // this will be the previous epoch meta block. It has initial 0 values so it can be considered at genesis + // this will be the previous epoch meta block. It has initial 0 values, so it can be considered at genesis return &storageStubs.StorerStub{GetCalled: func(key []byte) ([]byte, error) { hdrBytes, _ := json.Marshal(hdrPrevEpochStart) return hdrBytes, nil @@ -565,7 +565,7 @@ func TestEconomics_VerifyRewardsPerBlock_DifferentFees(t *testing.T) { } args.Store = &storageStubs.ChainStorerStub{ GetStorerCalled: func(unitType dataRetriever.UnitType) (storage.Storer, error) { - // this will be the previous epoch meta block. It has initial 0 values so it can be considered at genesis + // this will be the previous epoch meta block. It has initial 0 values, so it can be considered at genesis return &storageStubs.StorerStub{GetCalled: func(key []byte) ([]byte, error) { hdrBytes, _ := json.Marshal(hdrPrevEpochStart) return hdrBytes, nil @@ -782,7 +782,7 @@ func TestEconomics_VerifyRewardsPerBlock_MoreFeesThanInflation(t *testing.T) { } args.Store = &storageStubs.ChainStorerStub{ GetStorerCalled: func(unitType dataRetriever.UnitType) (storage.Storer, error) { - // this will be the previous epoch meta block. It has initial 0 values so it can be considered at genesis + // this will be the previous epoch meta block. It has initial 0 values, so it can be considered at genesis return &storageStubs.StorerStub{GetCalled: func(key []byte) ([]byte, error) { hdrBytes, _ := json.Marshal(hdrPrevEpochStart) return hdrBytes, nil @@ -980,7 +980,7 @@ func TestEconomics_VerifyRewardsPerBlock_InflationZero(t *testing.T) { } args.Store = &storageStubs.ChainStorerStub{ GetStorerCalled: func(unitType dataRetriever.UnitType) (storage.Storer, error) { - // this will be the previous epoch meta block. It has initial 0 values so it can be considered at genesis + // this will be the previous epoch meta block. It has initial 0 values, so it can be considered at genesis return &storageStubs.StorerStub{GetCalled: func(key []byte) ([]byte, error) { hdrBytes, _ := json.Marshal(hdrPrevEpochStart) return hdrBytes, nil @@ -1627,7 +1627,7 @@ func createArgsForComputeEndOfEpochEconomics( } args.Store = &storageStubs.ChainStorerStub{ GetStorerCalled: func(unitType dataRetriever.UnitType) (storage.Storer, error) { - // this will be the previous epoch meta block. It has initial 0 values so it can be considered at genesis + // this will be the previous epoch meta block. It has initial 0 values, so it can be considered at genesis return &storageStubs.StorerStub{GetCalled: func(key []byte) ([]byte, error) { hdrBytes, _ := json.Marshal(hdrPrevEpochStart) return hdrBytes, nil diff --git a/epochStart/notifier/epochStartSubscriptionHandler.go b/epochStart/notifier/epochStartSubscriptionHandler.go index bf87a3b8f95..20fe53c598e 100644 --- a/epochStart/notifier/epochStartSubscriptionHandler.go +++ b/epochStart/notifier/epochStartSubscriptionHandler.go @@ -37,7 +37,7 @@ func NewEpochStartSubscriptionHandler() *epochStartSubscriptionHandler { } } -// RegisterHandler will subscribe a function so it will be called when NotifyAll method is called +// RegisterHandler will subscribe a function, so it will be called when NotifyAll method is called func (essh *epochStartSubscriptionHandler) RegisterHandler(handler epochStart.ActionHandler) { if handler != nil { essh.mutEpochStartHandler.Lock() diff --git a/facade/initial/initialNodeFacade.go b/facade/initial/initialNodeFacade.go index 4fb02a5ce44..e82d5300734 100644 --- a/facade/initial/initialNodeFacade.go +++ b/facade/initial/initialNodeFacade.go @@ -186,7 +186,7 @@ func (inf *initialNodeFacade) GetHeartbeats() ([]data.PubKeyHeartbeat, error) { return nil, errNodeStarting } -// StatusMetrics will returns nil +// StatusMetrics will return nil func (inf *initialNodeFacade) StatusMetrics() external.StatusMetricsHandler { return inf.statusMetricsHandler } diff --git a/facade/interface.go b/facade/interface.go index 7a40d748d46..7aab2012689 100644 --- a/facade/interface.go +++ b/facade/interface.go @@ -41,7 +41,7 @@ type NodeHandler interface { // GetESDTData returns the esdt data from a given account, given key and given nonce GetESDTData(address, tokenID string, nonce uint64, options api.AccountQueryOptions) (*esdt.ESDigitalToken, api.BlockInfo, error) - // GetESDTsRoles returns the the token identifiers and the roles for a given address + // GetESDTsRoles returns the token identifiers and the roles for a given address GetESDTsRoles(address string, options api.AccountQueryOptions, ctx context.Context) (map[string][]string, api.BlockInfo, error) // GetNFTTokenIDsRegisteredByAddress returns all the token identifiers for semi or non fungible tokens registered by the address diff --git a/facade/nodeFacade.go b/facade/nodeFacade.go index 43c5f4c9b04..0228baa928c 100644 --- a/facade/nodeFacade.go +++ b/facade/nodeFacade.go @@ -511,7 +511,7 @@ func (nf *nodeFacade) GetInternalMiniBlockByHash(format common.ApiOutputFormat, return nf.apiResolver.GetInternalMiniBlock(format, txHash, epoch) } -// Close will cleanup started go routines +// Close will clean up started go routines func (nf *nodeFacade) Close() error { log.LogIfError(nf.apiResolver.Close()) diff --git a/factory/bootstrap/bootstrapComponents.go b/factory/bootstrap/bootstrapComponents.go index 832f6cfddbb..5f0fcd050ac 100644 --- a/factory/bootstrap/bootstrapComponents.go +++ b/factory/bootstrap/bootstrapComponents.go @@ -295,7 +295,7 @@ func (bc *bootstrapComponents) HeaderIntegrityVerifier() nodeFactory.HeaderInteg return bc.headerIntegrityVerifier } -// createLatestStorageDataProvider will create a latest storage data provider handler +// createLatestStorageDataProvider will create the latest storage data provider handler func createLatestStorageDataProvider( bootstrapDataProvider storageFactory.BootstrapDataProviderHandler, generalConfig config.Config, diff --git a/factory/consensus/consensusComponents.go b/factory/consensus/consensusComponents.go index 2a044dd5413..d134acb786f 100644 --- a/factory/consensus/consensusComponents.go +++ b/factory/consensus/consensusComponents.go @@ -17,7 +17,7 @@ import ( "github.com/ElrondNetwork/elrond-go/consensus/spos" "github.com/ElrondNetwork/elrond-go/consensus/spos/sposFactory" "github.com/ElrondNetwork/elrond-go/errors" - factory "github.com/ElrondNetwork/elrond-go/factory" + "github.com/ElrondNetwork/elrond-go/factory" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/sync" "github.com/ElrondNetwork/elrond-go/process/sync/storageBootstrap" diff --git a/factory/core/coreComponents.go b/factory/core/coreComponents.go index 0d59bef8077..a8c486d3c23 100644 --- a/factory/core/coreComponents.go +++ b/factory/core/coreComponents.go @@ -30,7 +30,7 @@ import ( "github.com/ElrondNetwork/elrond-go/consensus/round" "github.com/ElrondNetwork/elrond-go/epochStart/notifier" "github.com/ElrondNetwork/elrond-go/errors" - factory "github.com/ElrondNetwork/elrond-go/factory" + "github.com/ElrondNetwork/elrond-go/factory" "github.com/ElrondNetwork/elrond-go/node/metrics" "github.com/ElrondNetwork/elrond-go/ntp" "github.com/ElrondNetwork/elrond-go/process" diff --git a/factory/mock/blockProcessorStub.go b/factory/mock/blockProcessorStub.go index 06ec1706f0e..d8f8995ad32 100644 --- a/factory/mock/blockProcessorStub.go +++ b/factory/mock/blockProcessorStub.go @@ -60,7 +60,7 @@ func (bps *BlockProcessorStub) CreateGenesisBlock(balances map[string]*big.Int) return bps.CreateGenesisBlockCalled(balances) } -// PruneStateOnRollback recreates thee state tries to the root hashes indicated by the provided header +// PruneStateOnRollback recreates the state tries to the root hashes indicated by the provided header func (bps *BlockProcessorStub) PruneStateOnRollback(currHeader data.HeaderHandler, currHeaderHash []byte, prevHeader data.HeaderHandler, prevHeaderHash []byte) { if bps.PruneStateOnRollbackCalled != nil { bps.PruneStateOnRollbackCalled(currHeader, currHeaderHash, prevHeader, prevHeaderHash) diff --git a/factory/mock/processComponentsStub.go b/factory/mock/processComponentsStub.go index 0e56efbe68e..0baf202d461 100644 --- a/factory/mock/processComponentsStub.go +++ b/factory/mock/processComponentsStub.go @@ -218,7 +218,7 @@ func (pcm *ProcessComponentsMock) CurrentEpochProvider() process.CurrentNetworkE return pcm.CurrentEpochProviderInternal } -// GenesisAccounts - +// AccountsParser - func (pcm *ProcessComponentsMock) AccountsParser() genesis.AccountsParser { return pcm.AccountsParserInternal } diff --git a/factory/mock/scalarMock.go b/factory/mock/scalarMock.go index 1454014c5e8..e6ff932d962 100644 --- a/factory/mock/scalarMock.go +++ b/factory/mock/scalarMock.go @@ -34,7 +34,7 @@ func (sm *ScalarMock) SetInt64(_ int64) { panic("implement me") } -// Zero returns the the additive identity (0) +// Zero returns the additive identity (0) func (sm *ScalarMock) Zero() crypto.Scalar { panic("implement me") } diff --git a/factory/mock/singlesignerMock.go b/factory/mock/singlesignerMock.go index c62882b23d6..6760d7e343c 100644 --- a/factory/mock/singlesignerMock.go +++ b/factory/mock/singlesignerMock.go @@ -11,7 +11,7 @@ import ( type SinglesignMock struct { } -// Sign Signs a message with using a single signature schnorr scheme +// Sign signs a message with using a single signature schnorr scheme func (s *SinglesignMock) Sign(_ crypto.PrivateKey, _ []byte) ([]byte, error) { return []byte("signed"), nil } @@ -35,7 +35,7 @@ func (s *SinglesignMock) IsInterfaceNil() bool { type SinglesignFailMock struct { } -// Sign Signs a message with using a single signature schnorr scheme +// Sign signs a message with using a single signature schnorr scheme func (s *SinglesignFailMock) Sign(_ crypto.PrivateKey, _ []byte) ([]byte, error) { return nil, errors.New("signing failure") } @@ -56,7 +56,7 @@ type SinglesignStub struct { VerifyCalled func(public crypto.PublicKey, msg []byte, sig []byte) error } -// Sign Signs a message with using a single signature schnorr scheme +// Sign signs a message with using a single signature schnorr scheme func (s *SinglesignStub) Sign(private crypto.PrivateKey, msg []byte) ([]byte, error) { return s.SignCalled(private, msg) } diff --git a/factory/mock/stateComponentsHolderStub.go b/factory/mock/stateComponentsHolderStub.go index e6c1c8bcb84..1e19a7f676f 100644 --- a/factory/mock/stateComponentsHolderStub.go +++ b/factory/mock/stateComponentsHolderStub.go @@ -42,7 +42,7 @@ func (s *StateComponentsHolderStub) AccountsAdapterAPI() state.AccountsAdapter { return nil } -// AccountRepository - +// AccountsRepository - func (s *StateComponentsHolderStub) AccountsRepository() state.AccountsRepository { if s.AccountsRepositoryCalled != nil { return s.AccountsRepositoryCalled() diff --git a/genesis/checking/nodesSetupChecker_test.go b/genesis/checking/nodesSetupChecker_test.go index f78593d33b0..2460ee49a5d 100644 --- a/genesis/checking/nodesSetupChecker_test.go +++ b/genesis/checking/nodesSetupChecker_test.go @@ -347,7 +347,7 @@ func TestNewNodeSetupChecker_CheckStakedAndDelegatedShouldWork(t *testing.T) { ) assert.Nil(t, err) - //the following 2 asserts assure that the original values did not changed + //the following 2 asserts assure that the original values did not change assert.Equal(t, nodePrice, iaStaked.StakingValue) assert.Equal(t, nodePrice, iaDelegated.Delegation.Value) } diff --git a/genesis/interface.go b/genesis/interface.go index ab48f664635..94b0ca9ca09 100644 --- a/genesis/interface.go +++ b/genesis/interface.go @@ -65,7 +65,7 @@ type DelegationDataHandler interface { IsInterfaceNil() bool } -// InitialSmartContractHandler represents the interface that describes the the initial smart contract +// InitialSmartContractHandler represents the interface that describes the initial smart contract type InitialSmartContractHandler interface { GetOwner() string OwnerBytes() []byte diff --git a/genesis/mock/txExecutionProcessorStub.go b/genesis/mock/txExecutionProcessorStub.go index 6c6ccf438f7..9b20e335af8 100644 --- a/genesis/mock/txExecutionProcessorStub.go +++ b/genesis/mock/txExecutionProcessorStub.go @@ -62,7 +62,7 @@ func (teps *TxExecutionProcessorStub) AddNonce(senderBytes []byte, nonce uint64) } // GetExecutedTransactions - -func (tep *TxExecutionProcessorStub) GetExecutedTransactions() []data.TransactionHandler { +func (teps *TxExecutionProcessorStub) GetExecutedTransactions() []data.TransactionHandler { return nil } diff --git a/genesis/parsing/accountsParser.go b/genesis/parsing/accountsParser.go index 515d007f645..b8c1503eeee 100644 --- a/genesis/parsing/accountsParser.go +++ b/genesis/parsing/accountsParser.go @@ -250,7 +250,7 @@ func (ap *accountsParser) InitialAccounts() []genesis.InitialAccountHandler { return accounts } -// InitialAccountsSplitOnAddressesShards gets the initial accounts of the nodes split on the addresses's shards +// InitialAccountsSplitOnAddressesShards gets the initial accounts of the nodes split on the addresses' shards func (ap *accountsParser) InitialAccountsSplitOnAddressesShards( shardCoordinator sharding.Coordinator, ) (map[uint32][]genesis.InitialAccountHandler, error) { diff --git a/genesis/parsing/accountsParser_test.go b/genesis/parsing/accountsParser_test.go index fa3020f5bef..a86f0ae9ec3 100644 --- a/genesis/parsing/accountsParser_test.go +++ b/genesis/parsing/accountsParser_test.go @@ -702,7 +702,7 @@ func TestAccountsParser_GenerateInitialTransactionsVerifyTxsHashes(t *testing.T) ap := parsing.NewTestAccountsParser(createMockHexPubkeyConverter()) balance := int64(1) - ibs := []*data.InitialAccount{} + var ibs []*data.InitialAccount ap.SetEntireSupply(big.NewInt(int64(len(ibs)) * balance)) ap.SetInitialAccounts(ibs) diff --git a/integrationTests/factory/stateComponents/stateComponents_test.go b/integrationTests/factory/stateComponents/stateComponents_test.go index 6b5865749e6..cd600f7f6b1 100644 --- a/integrationTests/factory/stateComponents/stateComponents_test.go +++ b/integrationTests/factory/stateComponents/stateComponents_test.go @@ -6,7 +6,7 @@ import ( "time" "github.com/ElrondNetwork/elrond-go-core/data/endProcess" - factory "github.com/ElrondNetwork/elrond-go/integrationTests/factory" + "github.com/ElrondNetwork/elrond-go/integrationTests/factory" "github.com/ElrondNetwork/elrond-go/node" "github.com/ElrondNetwork/elrond-go/testscommon/goroutines" "github.com/stretchr/testify/require" diff --git a/integrationTests/longTests/antiflooding/antiflooding_test.go b/integrationTests/longTests/antiflooding/antiflooding_test.go index 17e0c3c5ea1..e54485af65c 100644 --- a/integrationTests/longTests/antiflooding/antiflooding_test.go +++ b/integrationTests/longTests/antiflooding/antiflooding_test.go @@ -100,7 +100,7 @@ func TestAntifloodingForLargerPeriodOfTime(t *testing.T) { }() //the network has 8 peers (check integrationTests.CreateFixedNetworkOf7Peers function) - //nodes 2, 4, 6 decide to flood the network but they will keep their messages/sec under the threshold + //nodes 2, 4, 6 decide to flood the network, but they will keep their messages/sec under the threshold topic := "test_topic" idxGoodPeers := []int{0, 1, 3, 5, 7} idxBadPeers := []int{2, 4, 6} diff --git a/integrationTests/mock/rounderMock.go b/integrationTests/mock/roundHandlerMock.go similarity index 50% rename from integrationTests/mock/rounderMock.go rename to integrationTests/mock/roundHandlerMock.go index 2ee084a8238..6346412577e 100644 --- a/integrationTests/mock/rounderMock.go +++ b/integrationTests/mock/roundHandlerMock.go @@ -20,34 +20,34 @@ func (rndm *RoundHandlerMock) BeforeGenesis() bool { } // Index - -func (rm *RoundHandlerMock) Index() int64 { - return rm.IndexField +func (rndm *RoundHandlerMock) Index() int64 { + return rndm.IndexField } // UpdateRound - -func (rm *RoundHandlerMock) UpdateRound(time.Time, time.Time) { +func (rndm *RoundHandlerMock) UpdateRound(time.Time, time.Time) { } // TimeStamp - -func (rm *RoundHandlerMock) TimeStamp() time.Time { - return rm.TimeStampField +func (rndm *RoundHandlerMock) TimeStamp() time.Time { + return rndm.TimeStampField } // TimeDuration - -func (rm *RoundHandlerMock) TimeDuration() time.Duration { - if rm.TimeDurationField.Seconds() == 0 { +func (rndm *RoundHandlerMock) TimeDuration() time.Duration { + if rndm.TimeDurationField.Seconds() == 0 { return time.Second } - return rm.TimeDurationField + return rndm.TimeDurationField } // RemainingTime - -func (rm *RoundHandlerMock) RemainingTime(_ time.Time, _ time.Duration) time.Duration { - return rm.RemainingTimeField +func (rndm *RoundHandlerMock) RemainingTime(_ time.Time, _ time.Duration) time.Duration { + return rndm.RemainingTimeField } // IsInterfaceNil - -func (rm *RoundHandlerMock) IsInterfaceNil() bool { - return rm == nil +func (rndm *RoundHandlerMock) IsInterfaceNil() bool { + return rndm == nil } diff --git a/integrationTests/mock/vmContainerMock.go b/integrationTests/mock/vmContainerMock.go index e2a63b915a0..075d49a2766 100644 --- a/integrationTests/mock/vmContainerMock.go +++ b/integrationTests/mock/vmContainerMock.go @@ -70,7 +70,7 @@ func (vmc *VMContainerMock) Keys() [][]byte { } // Close - -func (V *VMContainerMock) Close() error { +func (vmc *VMContainerMock) Close() error { return nil } diff --git a/integrationTests/multiShard/block/interceptedBlocks/interceptedBlocks_test.go b/integrationTests/multiShard/block/interceptedBlocks/interceptedBlocks_test.go index 1f1d9af1d6f..82b086b13ee 100644 --- a/integrationTests/multiShard/block/interceptedBlocks/interceptedBlocks_test.go +++ b/integrationTests/multiShard/block/interceptedBlocks/interceptedBlocks_test.go @@ -82,7 +82,7 @@ func TestHeaderAndMiniBlocksAreRoutedCorrectly(t *testing.T) { } // TestMetaHeadersAreRequsted tests the metaheader request to be made towards any peer -// The test will have 2 shards and meta, one shard node will request a metaheader and it should received it only from +// The test will have 2 shards and meta, one shard node will request a metaheader, and it should receive it only from // the meta node func TestMetaHeadersAreRequsted(t *testing.T) { if testing.Short() { diff --git a/integrationTests/p2p/antiflood/antiflooding/antiflooding_test.go b/integrationTests/p2p/antiflood/antiflooding/antiflooding_test.go index a68427e748d..31a3e6d517a 100644 --- a/integrationTests/p2p/antiflood/antiflooding/antiflooding_test.go +++ b/integrationTests/p2p/antiflood/antiflooding/antiflooding_test.go @@ -36,7 +36,7 @@ func TestAntifloodWithNumMessagesFromTheSamePeer(t *testing.T) { }() //node 3 is connected to 0, 2, 4 and 6 (check integrationTests.CreateFixedNetworkOf7Peers function) - //large number of broadcast messages from 3 might flood above mentioned peers but should not flood 5 and 7 + //large number of broadcast messages from 3 might flood above-mentioned peers but should not flood 5 and 7 topic := "test_topic" broadcastMessageDuration := time.Second * 2 @@ -146,7 +146,7 @@ func TestAntifloodWithLargeSizeMessagesFromTheSamePeer(t *testing.T) { }() //node 3 is connected to 0, 2, 4 and 6 (check integrationTests.CreateFixedNetworkOf7Peers function) - //large number of broadcast messages from 3 might flood above mentioned peers but should not flood 5 and 7 + //large number of broadcast messages from 3 might flood above-mentioned peers but should not flood 5 and 7 topic := "test_topic" broadcastMessageDuration := time.Second * 2 diff --git a/integrationTests/p2p/antiflood/blacklist/blacklist_test.go b/integrationTests/p2p/antiflood/blacklist/blacklist_test.go index 9b0ee005689..182e4a82568 100644 --- a/integrationTests/p2p/antiflood/blacklist/blacklist_test.go +++ b/integrationTests/p2p/antiflood/blacklist/blacklist_test.go @@ -43,7 +43,7 @@ func TestAntifloodAndBlacklistWithNumMessages(t *testing.T) { }() // node 3 is connected to 0, 2, 4 and 6 (check integrationTests.CreateFixedNetworkOf7Peers function) - // large number of broadcast messages from 3 might flood above mentioned peers but should not flood 5 and 7 + // large number of broadcast messages from 3 might flood above-mentioned peers but should not flood 5 and 7 topic := "test_topic" broadcastMessageDuration := time.Second * 2 diff --git a/integrationTests/state/stateExecTransaction/stateExecTransaction_test.go b/integrationTests/state/stateExecTransaction/stateExecTransaction_test.go index e3e082876c7..bdca338dbc5 100644 --- a/integrationTests/state/stateExecTransaction/stateExecTransaction_test.go +++ b/integrationTests/state/stateExecTransaction/stateExecTransaction_test.go @@ -126,7 +126,7 @@ func testExecTransactionsMoreTxWithRevert( gasPrice := uint64(2) gasLimit := uint64(2) value := uint64(1) - //Step 1. execute a lot moving transactions from pubKeyBuff to another pubKeyBuff + //Step 1. execute a lot of moving transactions from pubKeyBuff to another pubKeyBuff for i := 0; i < txToGenerate; i++ { tx := &transaction.Transaction{ Nonce: initialNonce + uint64(i), diff --git a/integrationTests/state/stateTrie/stateTrie_test.go b/integrationTests/state/stateTrie/stateTrie_test.go index ebac4406c0a..11a0c8fa88a 100644 --- a/integrationTests/state/stateTrie/stateTrie_test.go +++ b/integrationTests/state/stateTrie/stateTrie_test.go @@ -141,7 +141,7 @@ func TestAccountsDB_GetJournalizedAccountReturnExistingAccntShouldWork(t *testin } func TestAccountsDB_GetJournalizedAccountReturnNotFoundAccntShouldWork(t *testing.T) { - // test when the account does not exists + // test when the account does not exist t.Parallel() adr, _, adb := integrationTests.GenerateAddressJournalAccountAccountsDB() diff --git a/integrationTests/testWalletAccount.go b/integrationTests/testWalletAccount.go index e5cd0257b98..6dd5e978518 100644 --- a/integrationTests/testWalletAccount.go +++ b/integrationTests/testWalletAccount.go @@ -28,7 +28,7 @@ type TestWalletAccount struct { Balance *big.Int } -// CreateTestWalletAccount creates an wallet account in a selected shard +// CreateTestWalletAccount creates a wallet account in a selected shard func CreateTestWalletAccount(coordinator sharding.Coordinator, shardId uint32) *TestWalletAccount { testWalletAccount := &TestWalletAccount{} testWalletAccount.initCrypto(coordinator, shardId) diff --git a/integrationTests/vm/esdt/nft/esdtNFT/esdtNft_test.go b/integrationTests/vm/esdt/nft/esdtNFT/esdtNft_test.go index 16906bcd18c..300bdc13792 100644 --- a/integrationTests/vm/esdt/nft/esdtNFT/esdtNft_test.go +++ b/integrationTests/vm/esdt/nft/esdtNFT/esdtNft_test.go @@ -332,7 +332,7 @@ func TestESDTNonFungibleTokenTransferSelfShard(t *testing.T) { 1, ) - // check that the creator doesn't has the token data in trie anymore + // check that the creator doesn't have the token data in trie anymore nftMetaData.Quantity = 0 nft.CheckNftData( t, @@ -630,7 +630,7 @@ func TestESDTSemiFungibleTokenTransferToSystemScAddressShouldReceiveBack(t *test 1, ) - nftMetaData.Quantity = initialQuantity + quantityToAdd // should have the same quantity like before transferring + nftMetaData.Quantity = initialQuantity + quantityToAdd // should have the same quantity as before transferring nft.CheckNftData( t, nodes[0].OwnAccount.Address, diff --git a/integrationTests/vm/mockVM/vmRunContract/vmRunContract_test.go b/integrationTests/vm/mockVM/vmRunContract/vmRunContract_test.go index ff660c77036..f282dbbb200 100644 --- a/integrationTests/vm/mockVM/vmRunContract/vmRunContract_test.go +++ b/integrationTests/vm/mockVM/vmRunContract/vmRunContract_test.go @@ -298,7 +298,7 @@ func TestRunWithTransferWithInsufficientGasShouldReturnErr(t *testing.T) { t, destinationAddressBytes, accnts, - // transfer did not happened + // transfer did not happen big.NewInt(0), scCode, map[string]*big.Int{"a": expectedValueForVariable}) diff --git a/integrationTests/vm/txsFee/dns_test.go b/integrationTests/vm/txsFee/dns_test.go index 6692af04ee7..20959407eae 100644 --- a/integrationTests/vm/txsFee/dns_test.go +++ b/integrationTests/vm/txsFee/dns_test.go @@ -41,7 +41,7 @@ func TestDeployDNSContract_TestRegisterAndResolveAndSendTxWithSndAndRcvUserName( userName := utils.GenerateUserNameForMyDNSContract() txData := []byte("register@" + hex.EncodeToString(userName)) - // create user name for sender + // create username for sender tx := vm.CreateTransaction(0, big.NewInt(0), sndAddr, scAddress, gasPrice, gasLimit, txData) retCode, err := testContext.TxProcessor.ProcessTransaction(tx) require.Equal(t, vmcommon.Ok, retCode) @@ -65,7 +65,7 @@ func TestDeployDNSContract_TestRegisterAndResolveAndSendTxWithSndAndRcvUserName( utils.CleanAccumulatedIntermediateTransactions(t, testContext) - // create user name for receiver + // create username for receiver rcvUserName := utils.GenerateUserNameForMyDNSContract() txData = []byte("register@" + hex.EncodeToString(rcvUserName)) tx = vm.CreateTransaction(0, big.NewInt(0), rcvAddr, scAddress, gasPrice, gasLimit, txData) diff --git a/node/external/blockAPI/baseBlock_test.go b/node/external/blockAPI/baseBlock_test.go index a3007c838cd..1751af762cc 100644 --- a/node/external/blockAPI/baseBlock_test.go +++ b/node/external/blockAPI/baseBlock_test.go @@ -257,7 +257,7 @@ func TestBaseBlock_getAndAttachTxsToMbShouldIncludeLogsAsSpecified(t *testing.T) processor.marshalizer = marshalizer processor.store = storageService - // Setup a dummy transformer for "txBytes" -> "ApiTransactionResult" (only "Nonce" is handled) + // Set up a dummy transformer for "txBytes" -> "ApiTransactionResult" (only "Nonce" is handled) processor.apiTransactionHandler = &mock.TransactionAPIHandlerStub{ UnmarshalTransactionCalled: func(txBytes []byte, txType transaction.TxType) (*transaction.ApiTransactionResult, error) { tx := &transaction.Transaction{} @@ -270,7 +270,7 @@ func TestBaseBlock_getAndAttachTxsToMbShouldIncludeLogsAsSpecified(t *testing.T) }, } - // Setup a miniblock + // Set up a miniblock miniblockHash := []byte{0xff} miniblock := &block.MiniBlock{ Type: block.TxBlock, diff --git a/node/external/blockAPI/errors.go b/node/external/blockAPI/errors.go index 7644d6c6488..36d7fc4fe65 100644 --- a/node/external/blockAPI/errors.go +++ b/node/external/blockAPI/errors.go @@ -11,9 +11,6 @@ var ErrShardOnlyEndpoint = errors.New("the endpoint is only available on shard n // ErrMetachainOnlyEndpoint signals that an endpoint was called, but it is only available for metachain nodes var ErrMetachainOnlyEndpoint = errors.New("the endpoint is only available on metachain nodes") -// ErrWrongTypeAssertion signals that an type assertion failed -var ErrWrongTypeAssertion = errors.New("wrong type assertion") - var errCannotLoadMiniblocks = errors.New("cannot load miniblock(s)") var errCannotUnmarshalMiniblocks = errors.New("cannot unmarshal miniblock(s)") var errCannotLoadTransactions = errors.New("cannot load transaction(s)") diff --git a/node/external/blockAPI/metaBlock_test.go b/node/external/blockAPI/metaBlock_test.go index 3e2d9b7ae0d..1b5c2de734a 100644 --- a/node/external/blockAPI/metaBlock_test.go +++ b/node/external/blockAPI/metaBlock_test.go @@ -287,14 +287,14 @@ func TestMetaAPIBlockProcessor_GetBlockByNonceFromHistoryNode(t *testing.T) { processor.marshalizer = marshalizer processor.historyRepo = historyRepository - // Setup a miniblock + // Set up a miniblock miniblockHash := []byte{0xff} miniblock := &block.MiniBlock{ Type: block.TxBlock, TxHashes: [][]byte{}, } - // Setup a block containing the miniblock + // Set up a block containing the miniblock metablockHash := []byte{0xaa, 0xbb} metablock := &block.MetaBlock{ Nonce: testNonce, diff --git a/node/metrics/metrics.go b/node/metrics/metrics.go index 7514630be87..c5a1a79efd6 100644 --- a/node/metrics/metrics.go +++ b/node/metrics/metrics.go @@ -275,7 +275,7 @@ func InitMetrics( return nil } -// SaveUint64Metric will save a uint64 metric in status handler +// SaveUint64Metric will save an uint64 metric in status handler func SaveUint64Metric(ash core.AppStatusHandler, key string, value uint64) { ash.SetUInt64Value(key, value) } diff --git a/node/metrics/metrics_test.go b/node/metrics/metrics_test.go index 7d9d5487711..db12ce728bb 100644 --- a/node/metrics/metrics_test.go +++ b/node/metrics/metrics_test.go @@ -317,7 +317,7 @@ func TestInitRatingsMetrics(t *testing.T) { ash := &statusHandler.AppStatusHandlerStub{ SetUInt64ValueHandler: func(key string, value uint64) { - keys[key] = uint64(value) + keys[key] = value }, SetStringValueHandler: func(key string, value string) { keys[key] = value diff --git a/node/mock/apiInternalBlockHandlerStub.go b/node/mock/apiInternalBlockHandlerStub.go index 6466c05384a..27bc105bbc1 100644 --- a/node/mock/apiInternalBlockHandlerStub.go +++ b/node/mock/apiInternalBlockHandlerStub.go @@ -4,7 +4,7 @@ import ( "github.com/ElrondNetwork/elrond-go/common" ) -// InternalBlockProcessorStub - +// InternalBlockApiHandlerStub - type InternalBlockApiHandlerStub struct { GetInternalShardBlockByNonceCalled func(format common.ApiOutputFormat, nonce uint64) (interface{}, error) GetInternalShardBlockByHashCalled func(format common.ApiOutputFormat, hash []byte) (interface{}, error) diff --git a/node/mock/blockProcessorStub.go b/node/mock/blockProcessorStub.go index 39ed9b1c67b..c8846de76b1 100644 --- a/node/mock/blockProcessorStub.go +++ b/node/mock/blockProcessorStub.go @@ -61,7 +61,7 @@ func (bps *BlockProcessorStub) CreateGenesisBlock(balances map[string]*big.Int) return bps.CreateGenesisBlockCalled(balances) } -// PruneStateOnRollback recreates thee state tries to the root hashes indicated by the provided header +// PruneStateOnRollback recreates the state tries to the root hashes indicated by the provided header func (bps *BlockProcessorStub) PruneStateOnRollback(currHeader data.HeaderHandler, currHeaderHash []byte, prevHeader data.HeaderHandler, prevHeaderHash []byte) { if bps.PruneStateOnRollbackCalled != nil { bps.PruneStateOnRollbackCalled(currHeader, currHeaderHash, prevHeader, prevHeaderHash) diff --git a/node/mock/hasherFake.go b/node/mock/hasherFake.go index 100b62c0671..148e51bb9cf 100644 --- a/node/mock/hasherFake.go +++ b/node/mock/hasherFake.go @@ -29,6 +29,6 @@ func (HasherFake) Size() int { } // IsInterfaceNil returns true if there is no value under the interface -func (sha *HasherFake) IsInterfaceNil() bool { - return sha == nil +func (sha HasherFake) IsInterfaceNil() bool { + return false } diff --git a/node/mock/marshalizerMock.go b/node/mock/marshalizerMock.go index 837c2fa678e..87e4763387f 100644 --- a/node/mock/marshalizerMock.go +++ b/node/mock/marshalizerMock.go @@ -7,7 +7,7 @@ type MarshalizerMock struct { } // Marshal - -func (j MarshalizerMock) Marshal(obj interface{}) ([]byte, error) { +func (j *MarshalizerMock) Marshal(obj interface{}) ([]byte, error) { if j.MarshalHandler != nil { return j.MarshalHandler(obj) } @@ -15,7 +15,7 @@ func (j MarshalizerMock) Marshal(obj interface{}) ([]byte, error) { } // Unmarshal - -func (j MarshalizerMock) Unmarshal(obj interface{}, buff []byte) error { +func (j *MarshalizerMock) Unmarshal(obj interface{}, buff []byte) error { if j.UnmarshalHandler != nil { return j.UnmarshalHandler(obj, buff) } diff --git a/node/mock/singlesignerMock.go b/node/mock/singlesignerMock.go index c62882b23d6..6760d7e343c 100644 --- a/node/mock/singlesignerMock.go +++ b/node/mock/singlesignerMock.go @@ -11,7 +11,7 @@ import ( type SinglesignMock struct { } -// Sign Signs a message with using a single signature schnorr scheme +// Sign signs a message with using a single signature schnorr scheme func (s *SinglesignMock) Sign(_ crypto.PrivateKey, _ []byte) ([]byte, error) { return []byte("signed"), nil } @@ -35,7 +35,7 @@ func (s *SinglesignMock) IsInterfaceNil() bool { type SinglesignFailMock struct { } -// Sign Signs a message with using a single signature schnorr scheme +// Sign signs a message with using a single signature schnorr scheme func (s *SinglesignFailMock) Sign(_ crypto.PrivateKey, _ []byte) ([]byte, error) { return nil, errors.New("signing failure") } @@ -56,7 +56,7 @@ type SinglesignStub struct { VerifyCalled func(public crypto.PublicKey, msg []byte, sig []byte) error } -// Sign Signs a message with using a single signature schnorr scheme +// Sign signs a message with using a single signature schnorr scheme func (s *SinglesignStub) Sign(private crypto.PrivateKey, msg []byte) ([]byte, error) { return s.SignCalled(private, msg) } diff --git a/node/mock/vmExecutionHandlerStub.go b/node/mock/vmExecutionHandlerStub.go index b55eb7413e2..c4b6d78ad88 100644 --- a/node/mock/vmExecutionHandlerStub.go +++ b/node/mock/vmExecutionHandlerStub.go @@ -14,7 +14,7 @@ type VMExecutionHandlerStub struct { GetVersionCalled func() string } -// GetVersionCalled - +// GetVersion - func (vm *VMExecutionHandlerStub) GetVersion() string { if vm.GetVersionCalled != nil { return vm.GetVersionCalled() diff --git a/node/nodeLoadAccounts_test.go b/node/nodeLoadAccounts_test.go index b50d29241ea..de20495921c 100644 --- a/node/nodeLoadAccounts_test.go +++ b/node/nodeLoadAccounts_test.go @@ -125,7 +125,7 @@ func TestNode_AddBlockCoordinatesToAccountQueryOptions(t *testing.T) { var headerHashPassedToGetScheduledRootHashForHeaderWithEpoch []byte var epochPassedToGetScheduledRootHashForHeaderWithEpoch uint32 - getScheduledRootHashForHeaderResult := []byte{} + var getScheduledRootHashForHeaderResult []byte getScheduledRootHashForHeaderError := errors.New("missing") scheduledTxsStub := &testscommon.ScheduledTxsExecutionStub{ diff --git a/process/block/bootstrapStorage/bootstrapStorer.go b/process/block/bootstrapStorage/bootstrapStorer.go index 85d30c9e8cf..2173cea1566 100644 --- a/process/block/bootstrapStorage/bootstrapStorer.go +++ b/process/block/bootstrapStorage/bootstrapStorer.go @@ -94,7 +94,7 @@ func (bs *bootstrapStorer) Get(round int64) (BootstrapData, error) { return bootData, nil } -// GetHighestRound will return highest round saved in storage +// GetHighestRound will return the highest round saved in storage func (bs *bootstrapStorer) GetHighestRound() int64 { roundBytes, err := bs.store.Get([]byte(common.HighestRoundFromBootStorage)) if err != nil { diff --git a/process/block/displayMetaBlock.go b/process/block/displayMetaBlock.go index 0e8231079c6..ababc38f571 100644 --- a/process/block/displayMetaBlock.go +++ b/process/block/displayMetaBlock.go @@ -2,9 +2,9 @@ package block import ( "fmt" - "github.com/ElrondNetwork/elrond-go-core/data" "sync" + "github.com/ElrondNetwork/elrond-go-core/data" "github.com/ElrondNetwork/elrond-go-core/data/block" "github.com/ElrondNetwork/elrond-go-core/display" "github.com/ElrondNetwork/elrond-go-logger" diff --git a/process/block/metablock.go b/process/block/metablock.go index e06e9c6242b..00aaebd63d4 100644 --- a/process/block/metablock.go +++ b/process/block/metablock.go @@ -28,7 +28,7 @@ const firstHeaderNonce = uint64(1) var _ process.BlockProcessor = (*metaProcessor)(nil) -// metaProcessor implements metaProcessor interface and actually it tries to execute block +// metaProcessor implements metaProcessor interface, and actually it tries to execute block type metaProcessor struct { *baseProcessor scToProtocol process.SmartContractToProtocolHandler diff --git a/process/block/preprocess/scheduledTxsExecution.go b/process/block/preprocess/scheduledTxsExecution.go index 5d20b8a37a3..deccf191d9e 100644 --- a/process/block/preprocess/scheduledTxsExecution.go +++ b/process/block/preprocess/scheduledTxsExecution.go @@ -596,7 +596,7 @@ func (ste *scheduledTxsExecution) SaveState(headerHash []byte, scheduledInfo *pr // getScheduledInfoForHeader gets scheduled mini blocks, root hash, intermediate txs, gas and fees of the given header from storage func (ste *scheduledTxsExecution) getScheduledInfoForHeader(headerHash []byte, epoch core.OptionalUint32) (*process.ScheduledInfo, error) { - var data []byte + var scheduledData []byte var err error defer func() { @@ -608,16 +608,16 @@ func (ste *scheduledTxsExecution) getScheduledInfoForHeader(headerHash []byte, e }() if epoch.HasValue { - data, err = ste.storer.GetFromEpoch(headerHash, epoch.Value) + scheduledData, err = ste.storer.GetFromEpoch(headerHash, epoch.Value) } else { - data, err = ste.storer.Get(headerHash) + scheduledData, err = ste.storer.Get(headerHash) } if err != nil { return nil, err } scheduledSCRs := &scheduled.ScheduledSCRs{} - err = ste.marshaller.Unmarshal(scheduledSCRs, data) + err = ste.marshaller.Unmarshal(scheduledSCRs, scheduledData) if err != nil { return nil, err } diff --git a/process/block/shardblock.go b/process/block/shardblock.go index 10138272c41..e4e6f378e28 100644 --- a/process/block/shardblock.go +++ b/process/block/shardblock.go @@ -44,7 +44,7 @@ type createAndProcessMiniBlocksDestMeInfo struct { scheduledMode bool } -// shardProcessor implements shardProcessor interface and actually it tries to execute block +// shardProcessor implements shardProcessor interface, and actually it tries to execute block type shardProcessor struct { *baseProcessor metaBlockFinality uint32 @@ -919,7 +919,7 @@ func (sp *shardProcessor) CreateBlock( return shardHdr, finalBody, nil } -// createBlockBody creates a a list of miniblocks by filling them with transactions out of the transactions pools +// createBlockBody creates a list of miniblocks by filling them with transactions out of the transactions pools // as long as the transactions limit for the block has not been reached and there is still time to add transactions func (sp *shardProcessor) createBlockBody(shardHdr data.HeaderHandler, haveTime func() bool) (*block.Body, map[string]*processedMb.ProcessedMiniBlockInfo, error) { sp.blockSizeThrottler.ComputeCurrentMaxSize() diff --git a/process/economics/builtInFunctionsCost.go b/process/economics/builtInFunctionsCost.go index 209fbac4ec4..fc9d0063468 100644 --- a/process/economics/builtInFunctionsCost.go +++ b/process/economics/builtInFunctionsCost.go @@ -76,7 +76,7 @@ func (bc *builtInFunctionsCost) GasScheduleChange(gasSchedule map[string]map[str bc.gasConfig = newGasConfig } -// ComputeBuiltInCost will compute built in function cost +// ComputeBuiltInCost will compute built-in function cost func (bc *builtInFunctionsCost) ComputeBuiltInCost(tx data.TransactionWithFeeHandler) uint64 { function, arguments, err := bc.argsParser.ParseCallData(string(tx.GetData())) if err != nil { diff --git a/process/economics/interface.go b/process/economics/interface.go index aa9bf5afd9f..fdbf4e8c5ed 100644 --- a/process/economics/interface.go +++ b/process/economics/interface.go @@ -5,7 +5,7 @@ import ( vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) -// BuiltInFunctionsCostHandler is able to calculated the cost of a built in function call +// BuiltInFunctionsCostHandler is able to calculate the cost of a built in function call type BuiltInFunctionsCostHandler interface { ComputeBuiltInCost(tx data.TransactionWithFeeHandler) uint64 IsBuiltInFuncCall(tx data.TransactionWithFeeHandler) bool diff --git a/process/errors.go b/process/errors.go index 70b727a63dd..2c011b6d282 100644 --- a/process/errors.go +++ b/process/errors.go @@ -86,13 +86,13 @@ var ErrNilBlockBody = errors.New("nil block body") // ErrNilTxHash signals that an operation has been attempted with a nil hash var ErrNilTxHash = errors.New("nil transaction hash") -// ErrNilPubKeysBitmap signals that a operation has been attempted with a nil public keys bitmap +// ErrNilPubKeysBitmap signals that an operation has been attempted with a nil public keys bitmap var ErrNilPubKeysBitmap = errors.New("nil public keys bitmap") -// ErrNilPreviousBlockHash signals that a operation has been attempted with a nil previous block header hash +// ErrNilPreviousBlockHash signals that an operation has been attempted with a nil previous block header hash var ErrNilPreviousBlockHash = errors.New("nil previous block header hash") -// ErrNilSignature signals that a operation has been attempted with a nil signature +// ErrNilSignature signals that an operation has been attempted with a nil signature var ErrNilSignature = errors.New("nil signature") // ErrNilMiniBlocks signals that an operation has been attempted with a nil mini-block @@ -104,7 +104,7 @@ var ErrNilMiniBlock = errors.New("nil mini block") // ErrNilRootHash signals that an operation has been attempted with a nil root hash var ErrNilRootHash = errors.New("root hash is nil") -// ErrWrongNonceInBlock signals the nonce in block is different than expected nonce +// ErrWrongNonceInBlock signals the nonce in block is different from expected nonce var ErrWrongNonceInBlock = errors.New("wrong nonce in block") // ErrBlockHashDoesNotMatch signals that header hash does not match with the previous one @@ -182,7 +182,7 @@ var ErrNilSndAddr = errors.New("nil sender address") // ErrInvalidSndAddr signals that an invalid sender address was provided var ErrInvalidSndAddr = errors.New("invalid sender address") -// ErrNegativeValue signals that a negative value has been detected and it is not allowed +// ErrNegativeValue signals that a negative value has been detected, and it is not allowed var ErrNegativeValue = errors.New("negative value") // ErrNilShardCoordinator signals that an operation has been attempted to or with a nil shard coordinator @@ -269,7 +269,7 @@ var ErrWrongTypeInContainer = errors.New("wrong type of object inside container" // ErrLenMismatch signals that 2 or more slices have different lengths var ErrLenMismatch = errors.New("lengths mismatch") -// ErrWrongTypeAssertion signals that an type assertion failed +// ErrWrongTypeAssertion signals that a type assertion failed var ErrWrongTypeAssertion = errors.New("wrong type assertion") // ErrHeaderShardDataMismatch signals that shard header does not match created shard info @@ -305,7 +305,7 @@ var ErrHigherNonceInBlock = errors.New("higher nonce in block") // ErrRandSeedDoesNotMatch signals that random seed does not match with the previous one var ErrRandSeedDoesNotMatch = errors.New("random seed does not match") -// ErrHeaderNotFinal signals that header is not final and it should be +// ErrHeaderNotFinal signals that header is not final, and it should be var ErrHeaderNotFinal = errors.New("header in metablock is not final") // ErrShardIdMissmatch signals shard ID does not match expectations @@ -411,7 +411,7 @@ var ErrNilGasHandler = errors.New("nil gas handler") // ErrUnknownBlockType signals that block type is not correct var ErrUnknownBlockType = errors.New("block type is unknown") -// ErrMissingPreProcessor signals that required pre processor is missing +// ErrMissingPreProcessor signals that required pre-processor is missing var ErrMissingPreProcessor = errors.New("pre processor is missing") // ErrNilAppStatusHandler defines the error for setting a nil AppStatusHandler @@ -678,7 +678,7 @@ var ErrEmptyTopic = errors.New("empty topic") // ErrInvalidArguments signals that invalid arguments were given to process built-in function var ErrInvalidArguments = errors.New("invalid arguments to process built-in function") -// ErrNilBuiltInFunction signals that built in function is nil +// ErrNilBuiltInFunction signals that built-in function is nil var ErrNilBuiltInFunction = errors.New("built in function is nil") // ErrRewardMiniBlockNotFromMeta signals that miniblock has a different sender shard than meta @@ -786,10 +786,10 @@ var ErrNilDnsAddresses = errors.New("nil dns addresses map") // ErrNilProtocolSustainabilityAddress signals that a nil protocol sustainability address was provided var ErrNilProtocolSustainabilityAddress = errors.New("nil protocol sustainability address") -// ErrUserNameDoesNotMatch signals that user name does not match +// ErrUserNameDoesNotMatch signals that username does not match var ErrUserNameDoesNotMatch = errors.New("user name does not match") -// ErrUserNameDoesNotMatchInCrossShardTx signals that user name does not match in case of cross shard tx +// ErrUserNameDoesNotMatchInCrossShardTx signals that username does not match in case of cross shard tx var ErrUserNameDoesNotMatchInCrossShardTx = errors.New("mismatch between receiver username and address") // ErrNilBalanceComputationHandler signals that a nil balance computation handler has been provided @@ -822,7 +822,7 @@ var ErrInvalidVMType = errors.New("invalid VM type") // ErrRecursiveRelayedTxIsNotAllowed signals that recursive relayed tx is not allowed var ErrRecursiveRelayedTxIsNotAllowed = errors.New("recursive relayed tx is not allowed") -// ErrRelayedTxValueHigherThenUserTxValue signals that relayed tx value is higher then user tx value +// ErrRelayedTxValueHigherThenUserTxValue signals that relayed tx value is higher than user tx value var ErrRelayedTxValueHigherThenUserTxValue = errors.New("relayed tx value is higher than user tx value") // ErrNilInterceptorContainer signals that nil interceptor container has been provided @@ -834,7 +834,7 @@ var ErrInvalidTransactionVersion = errors.New("invalid transaction version") // ErrTxValueTooBig signals that transaction value is too big var ErrTxValueTooBig = errors.New("tx value is too big") -// ErrInvalidUserNameLength signals that provided user name length is invalid +// ErrInvalidUserNameLength signals that provided username length is invalid var ErrInvalidUserNameLength = errors.New("invalid user name length") // ErrTxValueOutOfBounds signals that transaction value is out of bounds @@ -888,7 +888,7 @@ var ErrSmartContractDeploymentIsDisabled = errors.New("smart Contract deployment // ErrUpgradeNotAllowed signals that upgrade is not allowed var ErrUpgradeNotAllowed = errors.New("upgrade is allowed only for owner") -// ErrBuiltInFunctionsAreDisabled signals that built in functions are disabled +// ErrBuiltInFunctionsAreDisabled signals that built-in functions are disabled var ErrBuiltInFunctionsAreDisabled = errors.New("built in functions are disabled") // ErrRelayedTxDisabled signals that relayed tx are disabled @@ -903,7 +903,7 @@ var ErrRelayedTxV2ZeroVal = errors.New("relayed tx v2 value should be 0") // ErrEmptyConsensusGroup is raised when an operation is attempted with an empty consensus group var ErrEmptyConsensusGroup = errors.New("consensusGroup is empty") -// ErrRelayedTxGasLimitMissmatch signals that relayed tx gas limit is higher then user tx gas limit +// ErrRelayedTxGasLimitMissmatch signals that relayed tx gas limit is higher than user tx gas limit var ErrRelayedTxGasLimitMissmatch = errors.New("relayed tx gas limit higher then user tx gas limit") // ErrRelayedGasPriceMissmatch signals that relayed gas price is not equal with user tx @@ -927,7 +927,7 @@ var ErrTransactionSignedWithHashIsNotEnabled = errors.New("transaction signed wi // ErrNilTransactionVersionChecker signals that provided transaction version checker is nil var ErrNilTransactionVersionChecker = errors.New("nil transaction version checker") -// ErrInvalidRewardsTopUpGradientPoint signals that the top up gradient point is invalid +// ErrInvalidRewardsTopUpGradientPoint signals that the top-up gradient point is invalid var ErrInvalidRewardsTopUpGradientPoint = errors.New("rewards top up gradient point is invalid") // ErrInvalidVMInputGasComputation signals that invalid vm input gas computation was provided @@ -963,10 +963,10 @@ var ErrMaxAccumulatedFeesExceeded = errors.New("max accumulated fees has been ex // ErrMaxDeveloperFeesExceeded signals that max developer fees has been exceeded var ErrMaxDeveloperFeesExceeded = errors.New("max developer fees has been exceeded") -// ErrNilBuiltInFunctionsCostHandler signals that a nil built in functions cost handler has been provided +// ErrNilBuiltInFunctionsCostHandler signals that a nil built-in functions cost handler has been provided var ErrNilBuiltInFunctionsCostHandler = errors.New("nil built in functions cost handler") -// ErrNilArgsBuiltInFunctionsConstHandler signals that a nil arguments struct for built in functions cost handler has been provided +// ErrNilArgsBuiltInFunctionsConstHandler signals that a nil arguments struct for built-in functions cost handler has been provided var ErrNilArgsBuiltInFunctionsConstHandler = errors.New("nil arguments for built in functions cost handler") // ErrInvalidEpochStartMetaBlockConsensusPercentage signals that a small epoch start meta block consensus percentage has been provided diff --git a/process/headerCheck/errors.go b/process/headerCheck/errors.go index 152e5c62dfa..e0d4123ae2b 100644 --- a/process/headerCheck/errors.go +++ b/process/headerCheck/errors.go @@ -18,7 +18,7 @@ var ErrInvalidChainID = errors.New("invalid chain ID") // ErrNilHeaderVersionHandler signals that the provided header version handler is nil var ErrNilHeaderVersionHandler = errors.New("nil header version handler") -// ErrIndexOutOfBounds signals that the given index is outside of expected bounds +// ErrIndexOutOfBounds signals that the given index is outside expected bounds var ErrIndexOutOfBounds = errors.New("index is out of bounds") // ErrIndexNotSelected signals that the given index is not selected diff --git a/process/interceptors/epochStartMetaBlockInterceptor.go b/process/interceptors/epochStartMetaBlockInterceptor.go index c6027b097dd..bce1a2d0099 100644 --- a/process/interceptors/epochStartMetaBlockInterceptor.go +++ b/process/interceptors/epochStartMetaBlockInterceptor.go @@ -135,7 +135,7 @@ func (e *epochStartMetaBlockInterceptor) SetInterceptedDebugHandler(_ process.In return nil } -// RegisterHandler will append the handler to the slice so it will be called when the epoch start meta block is fetched +// RegisterHandler will append the handler to the slice, so it will be called when the epoch start meta block is fetched func (e *epochStartMetaBlockInterceptor) RegisterHandler(handler func(topic string, hash []byte, data interface{})) { if handler == nil { return diff --git a/process/mock/blockProcessorMock.go b/process/mock/blockProcessorMock.go index 904378c7a97..705f0df5f66 100644 --- a/process/mock/blockProcessorMock.go +++ b/process/mock/blockProcessorMock.go @@ -101,7 +101,7 @@ func (bpm *BlockProcessorMock) AddLastNotarizedHdr(shardId uint32, processedHdr bpm.AddLastNotarizedHdrCalled(shardId, processedHdr) } -// RevertStateToBlock recreates thee state tries to the root hashes indicated by the provided header +// RevertStateToBlock recreates the state tries to the root hashes indicated by the provided header func (bpm *BlockProcessorMock) RevertStateToBlock(header data.HeaderHandler, rootHash []byte) error { if bpm.RevertStateToBlockCalled != nil { return bpm.RevertStateToBlockCalled(header, rootHash) @@ -117,7 +117,7 @@ func (bpm *BlockProcessorMock) RevertIndexedBlock(header data.HeaderHandler) { } } -// PruneStateOnRollback recreates thee state tries to the root hashes indicated by the provided header +// PruneStateOnRollback recreates the state tries to the root hashes indicated by the provided header func (bpm *BlockProcessorMock) PruneStateOnRollback(currHeader data.HeaderHandler, currHeaderHash []byte, prevHeader data.HeaderHandler, prevHeaderHash []byte) { if bpm.PruneStateOnRollbackCalled != nil { bpm.PruneStateOnRollbackCalled(currHeader, currHeaderHash, prevHeader, prevHeaderHash) diff --git a/process/mock/p2pAntifloodHandlerStub.go b/process/mock/p2pAntifloodHandlerStub.go index 6dc3d743167..f2a65204ccb 100644 --- a/process/mock/p2pAntifloodHandlerStub.go +++ b/process/mock/p2pAntifloodHandlerStub.go @@ -66,7 +66,7 @@ func (p2pahs *P2PAntifloodHandlerStub) BlacklistPeer(peer core.PeerID, reason st } // Close - -func (af *P2PAntifloodHandlerStub) Close() error { +func (p2pahs *P2PAntifloodHandlerStub) Close() error { return nil } diff --git a/process/mock/syncTimerMock.go b/process/mock/syncTimerMock.go index 778b9fe3fae..2fa41d42341 100644 --- a/process/mock/syncTimerMock.go +++ b/process/mock/syncTimerMock.go @@ -11,12 +11,12 @@ type SyncTimerMock struct { } // StartSyncingTime method does the time synchronization at every syncPeriod time elapsed. This should be started as a go routine -func (stm SyncTimerMock) StartSyncingTime() { +func (stm *SyncTimerMock) StartSyncingTime() { panic("implement me") } // ClockOffset method gets the current time offset -func (stm SyncTimerMock) ClockOffset() time.Duration { +func (stm *SyncTimerMock) ClockOffset() time.Duration { if stm.ClockOffsetCalled != nil { return stm.ClockOffsetCalled() } @@ -25,12 +25,12 @@ func (stm SyncTimerMock) ClockOffset() time.Duration { } // FormattedCurrentTime method gets the formatted current time on which is added a given offset -func (stm SyncTimerMock) FormattedCurrentTime() string { +func (stm *SyncTimerMock) FormattedCurrentTime() string { return time.Unix(0, 0).String() } // CurrentTime method gets the current time on which is added the current offset -func (stm SyncTimerMock) CurrentTime() time.Time { +func (stm *SyncTimerMock) CurrentTime() time.Time { if stm.CurrentTimeCalled != nil { return stm.CurrentTimeCalled() } diff --git a/process/peer/process.go b/process/peer/process.go index 6a818941440..1abc269582a 100644 --- a/process/peer/process.go +++ b/process/peer/process.go @@ -76,7 +76,7 @@ type validatorStatistics struct { enableEpochsHandler common.EnableEpochsHandler } -// NewValidatorStatisticsProcessor instantiates a new validatorStatistics structure responsible of keeping account of +// NewValidatorStatisticsProcessor instantiates a new validatorStatistics structure responsible for keeping account of // each validator actions in the consensus process func NewValidatorStatisticsProcessor(arguments ArgValidatorStatisticsProcessor) (*validatorStatistics, error) { if check.IfNil(arguments.PeerAdapter) { diff --git a/process/peer/validatorsProvider.go b/process/peer/validatorsProvider.go index 04c1bfef373..617f8d7e4fe 100644 --- a/process/peer/validatorsProvider.go +++ b/process/peer/validatorsProvider.go @@ -44,7 +44,7 @@ type ArgValidatorsProvider struct { MaxRating uint32 } -// NewValidatorsProvider instantiates a new validatorsProvider structure responsible of keeping account of +// NewValidatorsProvider instantiates a new validatorsProvider structure responsible for keeping account of // the latest information about the validators func NewValidatorsProvider( args ArgValidatorsProvider, @@ -289,7 +289,7 @@ func (vp *validatorsProvider) IsInterfaceNil() bool { return vp == nil } -// Close - frees up everything, cancels long running methods +// Close - frees up everything, cancels long-running methods func (vp *validatorsProvider) Close() error { vp.cancelFunc() diff --git a/process/peer/validatorsProvider_test.go b/process/peer/validatorsProvider_test.go index ba307e79b8e..1c1bc8091ee 100644 --- a/process/peer/validatorsProvider_test.go +++ b/process/peer/validatorsProvider_test.go @@ -532,7 +532,7 @@ func TestValidatorsProvider_CallsPopulateOnlyAfterTimeout(t *testing.T) { time.Sleep(time.Millisecond) assert.Equal(t, int32(0), atomic.LoadInt32(populateCacheCalled)) - // outside of refreshInterval + // outside refreshInterval time.Sleep(arg.CacheRefreshIntervalDurationInSec) _ = vsp.GetLatestValidators() //allow call to go through diff --git a/process/requiredDataPool.go b/process/requiredDataPool.go index cdc91784763..3c3d2719d0d 100644 --- a/process/requiredDataPool.go +++ b/process/requiredDataPool.go @@ -8,7 +8,7 @@ import ( // RequiredDataPool represents a structure that can hold a list of required data. // Any time one of the expected hash value is received, the associated bit -// in the receivedBitmap property is set to 1. All of the data is +// in the receivedBitmap property is set to 1. All the data is // considered received when the ones count of the received bitmap // is equal to the expected data length type RequiredDataPool struct { diff --git a/process/smartContract/hooks/blockChainHook.go b/process/smartContract/hooks/blockChainHook.go index b29d7651a4a..1100af7dbd7 100644 --- a/process/smartContract/hooks/blockChainHook.go +++ b/process/smartContract/hooks/blockChainHook.go @@ -400,7 +400,7 @@ func (bh *BlockChainHookImpl) NewAddress(creatorAddress []byte, creatorNonce uin return base, nil } -// ProcessBuiltInFunction is the hook through which a smart contract can execute a built in function +// ProcessBuiltInFunction is the hook through which a smart contract can execute a built-in function func (bh *BlockChainHookImpl) ProcessBuiltInFunction(input *vmcommon.ContractCallInput) (*vmcommon.VMOutput, error) { defer stopMeasure(startMeasure("ProcessBuiltInFunction")) @@ -550,12 +550,12 @@ func (bh *BlockChainHookImpl) getUserAccounts( return sndAccount, dstAccount, nil } -// GetBuiltinFunctionNames returns the built in function names +// GetBuiltinFunctionNames returns the built-in function names func (bh *BlockChainHookImpl) GetBuiltinFunctionNames() vmcommon.FunctionNames { return bh.builtInFunctions.Keys() } -// GetBuiltinFunctionsContainer returns the built in functions container +// GetBuiltinFunctionsContainer returns the built-in functions container func (bh *BlockChainHookImpl) GetBuiltinFunctionsContainer() vmcommon.BuiltInFunctionContainer { return bh.builtInFunctions } diff --git a/process/smartContract/process.go b/process/smartContract/process.go index 4cbbab834b4..f3a8db9ec7e 100644 --- a/process/smartContract/process.go +++ b/process/smartContract/process.go @@ -1589,7 +1589,7 @@ func (sc *scProcessor) addBackTxValues( return nil } -// DeploySmartContract processes the transaction, than deploy the smart contract into VM, final code is saved in account +// DeploySmartContract processes the transaction, then deploy the smart contract into VM, final code is saved in account func (sc *scProcessor) DeploySmartContract(tx data.TransactionHandler, acntSnd state.UserAccountHandler) (vmcommon.ReturnCode, error) { err := sc.checkTxValidity(tx) if err != nil { diff --git a/process/sync/baseForkDetector.go b/process/sync/baseForkDetector.go index 9ea792521f9..b952350a9b6 100644 --- a/process/sync/baseForkDetector.go +++ b/process/sync/baseForkDetector.go @@ -296,12 +296,12 @@ func (bfd *baseForkDetector) append(hdrInfo *headerInfo) bool { return true } -// GetHighestFinalBlockNonce gets the highest nonce of the block which is final and it can not be reverted anymore +// GetHighestFinalBlockNonce gets the highest nonce of the block which is final, and it can not be reverted anymore func (bfd *baseForkDetector) GetHighestFinalBlockNonce() uint64 { return bfd.finalCheckpoint().nonce } -// GetHighestFinalBlockHash gets the hash of the block which is final and it can not be reverted anymore +// GetHighestFinalBlockHash gets the hash of the block which is final, and it can not be reverted anymore func (bfd *baseForkDetector) GetHighestFinalBlockHash() []byte { return bfd.finalCheckpoint().hash } @@ -320,7 +320,7 @@ func (bfd *baseForkDetector) ResetFork() { "last round with forced fork", bfd.lastRoundWithForcedFork()) } -// ResetProbableHighestNonce resets the probable highest nonce to the last checkpoint nonce / highest notarized nonce +// ResetProbableHighestNonce resets the probable highest nonce to the last checkpoint nonce / the highest notarized nonce func (bfd *baseForkDetector) ResetProbableHighestNonce() { bfd.cleanupReceivedHeadersHigherThanNonce(bfd.lastCheckpoint().nonce) probableHighestNonce := bfd.computeProbableHighestNonce() diff --git a/process/sync/baseSync.go b/process/sync/baseSync.go index 2109ed17d98..914b722b93c 100644 --- a/process/sync/baseSync.go +++ b/process/sync/baseSync.go @@ -575,7 +575,7 @@ func (boot *baseBootstrap) incrementSyncedWithErrorsForNonce(nonce uint64) uint3 // and if it is not found there it will be requested from the network. After the header is received, // it requests the block body in the same way(pool and then, if it is not found in the pool, from network). // If either header and body are received the ProcessBlock and CommitBlock method will be called successively. -// These methods will execute the block and its transactions. Finally if everything works, the block will be committed +// These methods will execute the block and its transactions. Finally, if everything works, the block will be committed // in the blockchain, and all this mechanism will be reiterated for the next block. func (boot *baseBootstrap) syncBlock() error { boot.computeNodeState() @@ -1054,7 +1054,7 @@ func (boot *baseBootstrap) requestMiniBlocksByHashes(hashes [][]byte) { boot.requestHandler.RequestMiniBlocks(boot.shardCoordinator.SelfId(), hashes) } -// getMiniBlocksRequestingIfMissing method gets the body with given nonce from pool, if it exist there, +// getMiniBlocksRequestingIfMissing method gets the body with given nonce from pool, if it exists there, // and if not it will be requested from network // the func returns interface{} as to match the next implementations for block body fetchers // that will be added. The block executor should decide by parsing the header block body type value @@ -1154,8 +1154,8 @@ func (boot *baseBootstrap) requestHeaders(fromNonce uint64, toNonce uint64) { } // GetNodeState method returns the sync state of the node. If it returns 'NsNotSynchronized', this means that the node -// is not synchronized yet and it has to continue the bootstrapping mechanism. If it returns 'NsSynchronized', this means -// that the node is already synced and it can participate to the consensus. This method could also returns 'NsNotCalculated' +// is not synchronized yet, and it has to continue the bootstrapping mechanism. If it returns 'NsSynchronized', this means +// that the node is already synced, and it can participate in the consensus. This method could also return 'NsNotCalculated' // which means that the state of the node in the current round is not calculated yet. Note that when the node is not // connected to the network, GetNodeState could return 'NsNotSynchronized' but the SyncBlock is not automatically called. func (boot *baseBootstrap) GetNodeState() common.NodeState { diff --git a/process/sync/metaForkDetector.go b/process/sync/metaForkDetector.go index a1360592aac..c6b75e9317d 100644 --- a/process/sync/metaForkDetector.go +++ b/process/sync/metaForkDetector.go @@ -104,6 +104,6 @@ func (mfd *metaForkDetector) computeFinalCheckpoint() { } // IsInterfaceNil returns true if there is no value under the interface -func (mdf *metaForkDetector) IsInterfaceNil() bool { - return mdf == nil +func (mfd *metaForkDetector) IsInterfaceNil() bool { + return mfd == nil } diff --git a/process/sync/metablock.go b/process/sync/metablock.go index 6d978f67176..902731a4a6d 100644 --- a/process/sync/metablock.go +++ b/process/sync/metablock.go @@ -172,9 +172,9 @@ func (boot *MetaBootstrap) setLastEpochStartRound() { // SyncBlock method actually does the synchronization. It requests the next block header from the pool // and if it is not found there it will be requested from the network. After the header is received, -// it requests the block body in the same way(pool and than, if it is not found in the pool, from network). +// it requests the block body in the same way(pool and then, if it is not found in the pool, from network). // If either header and body are received the ProcessBlock and CommitBlock method will be called successively. -// These methods will execute the block and its transactions. Finally if everything works, the block will be committed +// These methods will execute the block and its transactions. Finally, if everything works, the block will be committed // in the blockchain, and all this mechanism will be reiterated for the next block. func (boot *MetaBootstrap) SyncBlock(ctx context.Context) error { err := boot.syncBlock() @@ -392,7 +392,7 @@ func (boot *MetaBootstrap) requestHeaderByNonce(nonce uint64) { boot.requestHandler.RequestMetaHeaderByNonce(nonce) } -// IsInterfaceNil returns true if there no value under the interface +// IsInterfaceNil returns true if there is no value under the interface func (boot *MetaBootstrap) IsInterfaceNil() bool { return boot == nil } diff --git a/process/sync/shardblock.go b/process/sync/shardblock.go index f75cd4974a1..722a1a2a013 100644 --- a/process/sync/shardblock.go +++ b/process/sync/shardblock.go @@ -139,9 +139,9 @@ func (boot *ShardBootstrap) StartSyncingBlocks() { // SyncBlock method actually does the synchronization. It requests the next block header from the pool // and if it is not found there it will be requested from the network. After the header is received, -// it requests the block body in the same way(pool and than, if it is not found in the pool, from network). +// it requests the block body in the same way(pool and then, if it is not found in the pool, from network). // If either header and body are received the ProcessBlock and CommitBlock method will be called successively. -// These methods will execute the block and its transactions. Finally if everything works, the block will be committed +// These methods will execute the block and its transactions. Finally, if everything works, the block will be committed // in the blockchain, and all this mechanism will be reiterated for the next block. func (boot *ShardBootstrap) SyncBlock(ctx context.Context) error { err := boot.syncBlock() diff --git a/process/throttle/antiflood/floodPreventers/quotaFloodPreventer.go b/process/throttle/antiflood/floodPreventers/quotaFloodPreventer.go index 64e9eb3b0bd..7d4754ded5b 100644 --- a/process/throttle/antiflood/floodPreventers/quotaFloodPreventer.go +++ b/process/throttle/antiflood/floodPreventers/quotaFloodPreventer.go @@ -119,7 +119,7 @@ func NewQuotaFloodPreventer(arg ArgQuotaFloodPreventer) (*quotaFloodPreventer, e // IncreaseLoad tries to increment the counter values held at "pid" position // It returns true if it had succeeded incrementing (existing counter value is lower or equal with provided maxOperations) // We need the mutOperation here as the get and put should be done atomically. -// Otherwise we might yield a slightly higher number of false valid increments +// Otherwise, we might yield a slightly higher number of false valid increments // This method also checks the global sum quota but does not increment its values func (qfp *quotaFloodPreventer) IncreaseLoad(pid core.PeerID, size uint64) error { qfp.mutOperation.Lock() diff --git a/process/throttle/antiflood/floodPreventers/topicFloodPreventer_test.go b/process/throttle/antiflood/floodPreventers/topicFloodPreventer_test.go index cb682d9a121..46bb925a952 100644 --- a/process/throttle/antiflood/floodPreventers/topicFloodPreventer_test.go +++ b/process/throttle/antiflood/floodPreventers/topicFloodPreventer_test.go @@ -136,8 +136,8 @@ func TestTopicFloodPreventer_ResetForTopic(t *testing.T) { assert.Equal(t, uint32(2), tfp.CountForTopicAndIdentifier(topic, id)) - // now call Reset so we should be able to call Accumulate again with result nil - // If the Reset wouldn't have been called, then the method would have errored + // now call Reset, so we should be able to call Accumulate again with result nil + // If the Reset hadn't been called, then the method would have errored tfp.ResetForTopic(topic) assert.Equal(t, uint32(0), tfp.CountForTopicAndIdentifier(topic, id)) @@ -216,7 +216,7 @@ func TestTopicFloodPreventer_MaxMessagesOnWildcardTopicWorks(t *testing.T) { headersMaxMessages := uint32(100) tfp.SetMaxMessagesForTopic(headersTopic+floodPreventers.WildcardCharacter, headersMaxMessages) - //testing for the the wildcard topic + //testing for the wildcard topic assert.Equal(t, headersMaxMessages, tfp.MaxMessagesForTopic(headersTopic)) assert.Equal(t, headersMaxMessages, tfp.MaxMessagesForTopic(headersTopic+"suffix")) assert.Equal(t, headersMaxMessages, tfp.MaxMessagesForTopic("prefix"+headersTopic)) diff --git a/process/txsimulator/interface.go b/process/txsimulator/interface.go index 650a50c685c..4d17c359be9 100644 --- a/process/txsimulator/interface.go +++ b/process/txsimulator/interface.go @@ -5,7 +5,7 @@ import ( vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) -// TransactionProcessor defines the operations needed do be done by a transaction processor +// TransactionProcessor defines the operations needed to be done by a transaction processor type TransactionProcessor interface { ProcessTransaction(transaction *transaction.Transaction) (vmcommon.ReturnCode, error) VerifyTransaction(transaction *transaction.Transaction) error diff --git a/sharding/interface.go b/sharding/interface.go index 4452d6ecaa5..2d61cbd966d 100644 --- a/sharding/interface.go +++ b/sharding/interface.go @@ -20,7 +20,7 @@ type EpochHandler interface { //PeerAccountListAndRatingHandler provides Rating Computation Capabilites for the Nodes Coordinator and ValidatorStatistics type PeerAccountListAndRatingHandler interface { - //GetChance returns the chances for the the rating + //GetChance returns the chances for the rating GetChance(uint32) uint32 //GetStartRating gets the start rating values GetStartRating() uint32 diff --git a/sharding/multiShardCoordinator.go b/sharding/multiShardCoordinator.go index 55cf77998ca..e3e6199ec93 100644 --- a/sharding/multiShardCoordinator.go +++ b/sharding/multiShardCoordinator.go @@ -12,7 +12,7 @@ var _ Coordinator = (*multiShardCoordinator)(nil) // multiShardCoordinator struct defines the functionality for handling transaction dispatching to // the corresponding shards. The number of shards is currently passed as a constructor -// parameter and later it should be calculated by this structure +// parameter, and later it should be calculated by this structure type multiShardCoordinator struct { maskHigh uint32 maskLow uint32 @@ -37,7 +37,7 @@ func NewMultiShardCoordinator(numberOfShards, selfId uint32) (*multiShardCoordin return sr, nil } -// calculateMasks will create two numbers who's binary form is composed from as many +// calculateMasks will create two numbers whose binary form is composed of as many // ones needed to be taken into consideration for the shard assignment. The result // of a bitwise AND operation of an address with this mask will result in the // shard id where a transaction from that address will be dispatched diff --git a/sharding/nodesCoordinator/errors.go b/sharding/nodesCoordinator/errors.go index daedcf07f86..7c2bf75f933 100644 --- a/sharding/nodesCoordinator/errors.go +++ b/sharding/nodesCoordinator/errors.go @@ -7,7 +7,7 @@ import ( // ErrInvalidNumberOfShards signals that an invalid number of shards was passed to the sharding registry var ErrInvalidNumberOfShards = errors.New("the number of shards must be greater than zero") -// ErrInvalidShardId signals that an invalid shard is was passed +// ErrInvalidShardId signals that an invalid shard id was passed var ErrInvalidShardId = errors.New("shard id must be smaller than the total number of shards") // ErrNilPubKey signals that the public key is nil @@ -22,9 +22,6 @@ var ErrNilNodesCoordinator = errors.New("nil nodesCoordinator") // ErrNilMarshalizer signals that the marshalizer is nil var ErrNilMarshalizer = errors.New("nil marshalizer") -// ErrNilPubkeyConverter signals that a nil public key converter has been provided -var ErrNilPubkeyConverter = errors.New("trying to set nil pubkey converter") - // ErrNilInputNodesMap signals that a nil nodes map was provided var ErrNilInputNodesMap = errors.New("nil input nodes map") diff --git a/sharding/nodesCoordinator/indexHashedNodesCoordinator.go b/sharding/nodesCoordinator/indexHashedNodesCoordinator.go index b94155958e6..8d1e841ddf2 100644 --- a/sharding/nodesCoordinator/indexHashedNodesCoordinator.go +++ b/sharding/nodesCoordinator/indexHashedNodesCoordinator.go @@ -307,7 +307,7 @@ func (ihnc *indexHashedNodesCoordinator) ComputeAdditionalLeaving(_ []*state.Sha return make(map[uint32][]Validator), nil } -// ComputeConsensusGroup will generate a list of validators based on the the eligible list +// ComputeConsensusGroup will generate a list of validators based on the eligible list // and each eligible validator weight/chance func (ihnc *indexHashedNodesCoordinator) ComputeConsensusGroup( randomness []byte, diff --git a/sharding/nodesCoordinator/interface.go b/sharding/nodesCoordinator/interface.go index b53506fc473..cbe5241bc84 100644 --- a/sharding/nodesCoordinator/interface.go +++ b/sharding/nodesCoordinator/interface.go @@ -65,7 +65,7 @@ type NodesCoordinatorHelper interface { //ChanceComputer provides chance computation capabilities based on a rating type ChanceComputer interface { - //GetChance returns the chances for the the rating + //GetChance returns the chances for the rating GetChance(uint32) uint32 //IsInterfaceNil verifies if the interface is nil IsInterfaceNil() bool diff --git a/sharding/nodesCoordinator/selectionBasedProvider.go b/sharding/nodesCoordinator/selectionBasedProvider.go index f205145b998..69581f1cbb4 100644 --- a/sharding/nodesCoordinator/selectionBasedProvider.go +++ b/sharding/nodesCoordinator/selectionBasedProvider.go @@ -54,7 +54,7 @@ func (sbp *SelectionBasedProvider) add(expElList []uint32, index int64) { } // Get will return the consensus group based on the randomness. -// After an item is chosen, it is added to the slice so it won't be selected again so next time a new item +// After an item is chosen, it is added to the slice, so it won't be selected again so next time a new item // is needed, the index is recalculated until the validator doesn't exist in that slice func (sbp *SelectionBasedProvider) Get(randomness []byte, numValidators int64, expandedEligibleList []uint32) ([]uint32, error) { if len(randomness) == 0 { diff --git a/state/storagePruningManager/evictionWaitingList/evictionWaitingList.go b/state/storagePruningManager/evictionWaitingList/evictionWaitingList.go index 553b7ead622..ba5d5c17ab4 100644 --- a/state/storagePruningManager/evictionWaitingList/evictionWaitingList.go +++ b/state/storagePruningManager/evictionWaitingList/evictionWaitingList.go @@ -124,7 +124,7 @@ func (ewl *evictionWaitingList) IsInterfaceNil() bool { return ewl == nil } -// ShouldKeepHash searches for the given hash in all of the evictionWaitingList's newHashes. +// ShouldKeepHash searches for the given hash in all the evictionWaitingList's newHashes. // If the identifier is equal to oldRoot, then we should also search in oldHashes. func (ewl *evictionWaitingList) ShouldKeepHash(hash string, identifier state.TriePruningIdentifier) (bool, error) { ewl.opMutex.RLock() diff --git a/statusHandler/persister/common.go b/statusHandler/persister/common.go index fbd294881c4..001deef41c2 100644 --- a/statusHandler/persister/common.go +++ b/statusHandler/persister/common.go @@ -1,6 +1,6 @@ package persister -// GetUint64 will try to convert an interface type in a uint64 +// GetUint64 will try to convert an interface type in an uint64 // in case of failure wil return 0 func GetUint64(data interface{}) uint64 { value, ok := data.(uint64) diff --git a/statusHandler/statusMetricsProvider_test.go b/statusHandler/statusMetricsProvider_test.go index b60828b6862..d9fec3c4ff4 100644 --- a/statusHandler/statusMetricsProvider_test.go +++ b/statusHandler/statusMetricsProvider_test.go @@ -284,13 +284,13 @@ func TestStatusMetrics_EnableEpochMetrics(t *testing.T) { } for i, nodesChangeConfig := range maxNodesChangeConfig { epochEnable := fmt.Sprintf("%s%d%s", common.MetricMaxNodesChangeEnableEpoch, i, common.EpochEnableSuffix) - sm.SetUInt64Value(epochEnable, uint64(nodesChangeConfig["EpochEnable"])) + sm.SetUInt64Value(epochEnable, nodesChangeConfig["EpochEnable"]) maxNumNodes := fmt.Sprintf("%s%d%s", common.MetricMaxNodesChangeEnableEpoch, i, common.MaxNumNodesSuffix) - sm.SetUInt64Value(maxNumNodes, uint64(nodesChangeConfig["MaxNumNodes"])) + sm.SetUInt64Value(maxNumNodes, nodesChangeConfig["MaxNumNodes"]) nodesToShufflePerShard := fmt.Sprintf("%s%d%s", common.MetricMaxNodesChangeEnableEpoch, i, common.NodesToShufflePerShardSuffix) - sm.SetUInt64Value(nodesToShufflePerShard, uint64(nodesChangeConfig["NodesToShufflePerShard"])) + sm.SetUInt64Value(nodesToShufflePerShard, nodesChangeConfig["NodesToShufflePerShard"]) } sm.SetUInt64Value(common.MetricMaxNodesChangeEnableEpoch+"_count", uint64(len(maxNodesChangeConfig))) diff --git a/storage/interface.go b/storage/interface.go index 11bbda51caf..e1ead22ff8f 100644 --- a/storage/interface.go +++ b/storage/interface.go @@ -138,7 +138,7 @@ type DirectoryReaderHandler interface { IsInterfaceNil() bool } -// LatestStorageDataProviderHandler defines which actions be done by a component who fetches latest data from storage +// LatestStorageDataProviderHandler defines which actions be done by a component who fetches the latest data from storage type LatestStorageDataProviderHandler interface { GetParentDirectory() string GetParentDirAndLastEpoch() (string, uint32, error) diff --git a/storage/mock/extendedStorageServiceStub.go b/storage/mock/extendedStorageServiceStub.go index 5814e0a4695..de52b5280e1 100644 --- a/storage/mock/extendedStorageServiceStub.go +++ b/storage/mock/extendedStorageServiceStub.go @@ -11,9 +11,9 @@ type StorageListProviderStub struct { } // GetAllStorers - -func (sis *StorageListProviderStub) GetAllStorers() map[dataRetriever.UnitType]storage.Storer { - if sis.GetAllStorersCalled != nil { - return sis.GetAllStorersCalled() +func (slps *StorageListProviderStub) GetAllStorers() map[dataRetriever.UnitType]storage.Storer { + if slps.GetAllStorersCalled != nil { + return slps.GetAllStorersCalled() } return nil diff --git a/storage/pruning/fullHistoryPruningStorer.go b/storage/pruning/fullHistoryPruningStorer.go index 196fa7b6553..8b253de056c 100644 --- a/storage/pruning/fullHistoryPruningStorer.go +++ b/storage/pruning/fullHistoryPruningStorer.go @@ -78,7 +78,7 @@ func (fhps *FullHistoryPruningStorer) GetFromEpoch(key []byte, epoch uint32) ([] return fhps.searchInEpoch(key, epoch+1) } -// GetBulkFromEpoch will search a a bulk of keys in the persister for the given epoch +// GetBulkFromEpoch will search a bulk of keys in the persister for the given epoch // doesn't return an error if a key or any isn't found func (fhps *FullHistoryPruningStorer) GetBulkFromEpoch(keys [][]byte, epoch uint32) ([]storageCore.KeyValuePair, error) { persister, err := fhps.getOrOpenPersister(epoch) diff --git a/testscommon/chainHandlerMock.go b/testscommon/chainHandlerMock.go index 38e9e4a8fbb..9e0cb0c9e08 100644 --- a/testscommon/chainHandlerMock.go +++ b/testscommon/chainHandlerMock.go @@ -66,7 +66,7 @@ func (mock *ChainHandlerMock) GetCurrentBlockRootHash() []byte { return mock.currentBlockRootHash } -// SetFinalBlockInfoCalled - +// SetFinalBlockInfo - func (mock *ChainHandlerMock) SetFinalBlockInfo(nonce uint64, headerHash []byte, rootHash []byte) { mock.finalBlockNonce = nonce mock.finalBlockHash = headerHash diff --git a/testscommon/chainHandlerStub.go b/testscommon/chainHandlerStub.go index 89f077e705d..cb3a4ecf6f2 100644 --- a/testscommon/chainHandlerStub.go +++ b/testscommon/chainHandlerStub.go @@ -90,7 +90,7 @@ func (stub *ChainHandlerStub) GetCurrentBlockRootHash() []byte { return nil } -// SetFinalBlockInfoCalled - +// SetFinalBlockInfo - func (stub *ChainHandlerStub) SetFinalBlockInfo(nonce uint64, headerHash []byte, rootHash []byte) { if stub.SetFinalBlockInfoCalled != nil { stub.SetFinalBlockInfoCalled(nonce, headerHash, rootHash) diff --git a/testscommon/cryptoMocks/keyStub.go b/testscommon/cryptoMocks/keyStub.go index dec671c7d6c..f40f9b3d19c 100644 --- a/testscommon/cryptoMocks/keyStub.go +++ b/testscommon/cryptoMocks/keyStub.go @@ -102,7 +102,7 @@ func (keyGen *KeyGenStub) GeneratePair() (crypto.PrivateKey, crypto.PublicKey) { return &PrivateKeyStub{}, &PublicKeyStub{} } -// PrivateKeyFromByteArray generates the private key from it's byte array representation +// PrivateKeyFromByteArray generates the private key from its byte array representation func (keyGen *KeyGenStub) PrivateKeyFromByteArray(b []byte) (crypto.PrivateKey, error) { if keyGen.PrivateKeyFromByteArrayStub != nil { return keyGen.PrivateKeyFromByteArrayStub(b) @@ -110,7 +110,7 @@ func (keyGen *KeyGenStub) PrivateKeyFromByteArray(b []byte) (crypto.PrivateKey, return &PrivateKeyStub{}, nil } -// PublicKeyFromByteArray generates a public key from it's byte array representation +// PublicKeyFromByteArray generates a public key from its byte array representation func (keyGen *KeyGenStub) PublicKeyFromByteArray(b []byte) (crypto.PublicKey, error) { if keyGen.PublicKeyFromByteArrayStub != nil { return keyGen.PublicKeyFromByteArrayStub(b) diff --git a/testscommon/cryptoMocks/scalar.go b/testscommon/cryptoMocks/scalar.go index 0ced245cea5..f2aba6d2ce9 100644 --- a/testscommon/cryptoMocks/scalar.go +++ b/testscommon/cryptoMocks/scalar.go @@ -34,7 +34,7 @@ func (sm *ScalarMock) SetInt64(_ int64) { panic("implement me") } -// Zero returns the the additive identity (0) +// Zero returns the additive identity (0) func (sm *ScalarMock) Zero() crypto.Scalar { panic("implement me") } diff --git a/testscommon/headerHandlerStub.go b/testscommon/headerHandlerStub.go index 82bc1434a4f..8bc8059215f 100644 --- a/testscommon/headerHandlerStub.go +++ b/testscommon/headerHandlerStub.go @@ -295,7 +295,7 @@ func (hhs *HeaderHandlerStub) SetMetaBlockHashes(_ [][]byte) error { } // SetEpochStartMetaHash - -func (h *HeaderHandlerStub) SetEpochStartMetaHash(_ []byte) error { +func (hhs *HeaderHandlerStub) SetEpochStartMetaHash(_ []byte) error { return nil } diff --git a/testscommon/keccakMock.go b/testscommon/keccakMock.go index 23edfbb133e..ae36a0b8873 100644 --- a/testscommon/keccakMock.go +++ b/testscommon/keccakMock.go @@ -34,6 +34,6 @@ func (KeccakMock) Size() int { } // IsInterfaceNil returns true if there is no value under the interface -func (k *KeccakMock) IsInterfaceNil() bool { - return k == nil +func (k KeccakMock) IsInterfaceNil() bool { + return false } diff --git a/testscommon/logsFacadeStub.go b/testscommon/logsFacadeStub.go index 4ee698566f1..2b242f3542c 100644 --- a/testscommon/logsFacadeStub.go +++ b/testscommon/logsFacadeStub.go @@ -19,7 +19,7 @@ func (stub *LogsFacadeStub) GetLog(logKey []byte, epoch uint32) (*transaction.Ap return nil, nil } -// IncludeLogsInTransactions +// IncludeLogsInTransactions - func (stub *LogsFacadeStub) IncludeLogsInTransactions(txs []*transaction.ApiTransactionResult, logsKeys [][]byte, epoch uint32) error { if stub.IncludeLogsInTransactionsCalled != nil { return stub.IncludeLogsInTransactionsCalled(txs, logsKeys, epoch) diff --git a/testscommon/shardStatisticsMock.go b/testscommon/shardStatisticsMock.go deleted file mode 100644 index 5c20e07ba20..00000000000 --- a/testscommon/shardStatisticsMock.go +++ /dev/null @@ -1,60 +0,0 @@ -package testscommon - -import "math/big" - -// ShardStatisticsMock will hold the tps statistics for each shard -type ShardStatisticsMock struct { - shardID uint32 - roundTime uint64 - averageTPS *big.Int - peakTPS float64 - lastBlockTxCount uint32 - averageBlockTxCount uint32 - currentBlockNonce uint64 - totalProcessedTxCount *big.Int -} - -// ShardID returns the shard id of the current statistic object -func (ss *ShardStatisticsMock) ShardID() uint32 { - return ss.shardID -} - -// AverageTPS returns an average tps for all processed blocks in a shard -func (ss *ShardStatisticsMock) AverageTPS() *big.Int { - return ss.averageTPS -} - -// AverageBlockTxCount returns an average transaction count for -func (ss *ShardStatisticsMock) AverageBlockTxCount() uint32 { - return ss.averageBlockTxCount -} - -// CurrentBlockNonce returns the block nounce of the last processed block in a shard -func (ss *ShardStatisticsMock) CurrentBlockNonce() uint64 { - return ss.currentBlockNonce -} - -// LiveTPS returns tps for the last block -func (ss *ShardStatisticsMock) LiveTPS() float64 { - return float64(uint64(ss.lastBlockTxCount) / ss.roundTime) -} - -// PeakTPS returns peak tps for for all the blocks of the current shard -func (ss *ShardStatisticsMock) PeakTPS() float64 { - return ss.peakTPS -} - -// LastBlockTxCount returns the number of transactions included in the last block -func (ss *ShardStatisticsMock) LastBlockTxCount() uint32 { - return ss.lastBlockTxCount -} - -// TotalProcessedTxCount returns the total number of processed transactions for this shard -func (ss *ShardStatisticsMock) TotalProcessedTxCount() *big.Int { - return ss.totalProcessedTxCount -} - -// IsInterfaceNil returns true if there is no value under the interface -func (ss *ShardStatisticsMock) IsInterfaceNil() bool { - return ss == nil -} diff --git a/testscommon/txcachemocks/txGasHandlerMock.go b/testscommon/txcachemocks/txGasHandlerMock.go index 30be86a7186..4ad5e492b68 100644 --- a/testscommon/txcachemocks/txGasHandlerMock.go +++ b/testscommon/txcachemocks/txGasHandlerMock.go @@ -48,7 +48,7 @@ func (ghm *TxGasHandlerMock) MinGasLimit() uint64 { return ghm.MinimumGasMove } -// MinGasPriceProcessing - +// MinGasPriceForProcessing - func (ghm *TxGasHandlerMock) MinGasPriceForProcessing() uint64 { return ghm.MinimumGasPrice / ghm.GasProcessingDivisor } diff --git a/trie/doubleListSync_test.go b/trie/doubleListSync_test.go index a6b87ffd426..d287b5f6686 100644 --- a/trie/doubleListSync_test.go +++ b/trie/doubleListSync_test.go @@ -260,7 +260,7 @@ func TestDoubleListTrieSyncer_StartSyncingPartiallyFilledTrieShouldWork(t *testi arg := createMockArgument(time.Minute) exceptionHashes := make([][]byte, 0) - // copy half of the nodes from source to destination, add them also to exception list and than try to sync the trie + // copy half of the nodes from source to destination, add them also to exception list and then try to sync the trie numKeysCopied := 0 memUnitSource.RangeKeys(func(key []byte, val []byte) bool { if numKeysCopied >= numKeysValues/2 { diff --git a/vm/errors.go b/vm/errors.go index cc751894d9c..887543eeac9 100644 --- a/vm/errors.go +++ b/vm/errors.go @@ -164,7 +164,7 @@ var ErrNegativeMaximumPercentageToBleed = errors.New("negative maximum percentag // ErrInvalidMaxNumberOfNodes signals that invalid number of max number of nodes has been provided var ErrInvalidMaxNumberOfNodes = errors.New("invalid number of max number of nodes") -// ErrTokenNameNotHumanReadable signals that token name is not human readable +// ErrTokenNameNotHumanReadable signals that token name is not human-readable var ErrTokenNameNotHumanReadable = errors.New("token name is not human readable") // ErrTickerNameNotValid signals that ticker name is not valid @@ -185,7 +185,7 @@ var ErrNilChanceComputer = errors.New("nil chance computer") // ErrNilAddressPubKeyConverter signals that the provided public key converter is nil var ErrNilAddressPubKeyConverter = errors.New("nil address public key converter") -// ErrNoTickerWithGivenName signals that ticker does not exists with given name +// ErrNoTickerWithGivenName signals that ticker does not exist with given name var ErrNoTickerWithGivenName = errors.New("no ticker with given name") // ErrInvalidAddress signals that invalid address has been provided diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index 861b1464036..6feb6e1c6c9 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -274,7 +274,7 @@ func (g *governanceContract) proposal(args *vmcommon.ContractCallInput) vmcommon } // vote casts a vote for a validator/delegation. This function receives 2 parameters and will vote with its full delegation + validator amount -// args.Arguments[0] - proposal reference (github commit) +// args.Arguments[0] - proposal reference (GitHub commit) // args.Arguments[1] - vote option (yes, no, veto) func (g *governanceContract) vote(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { if args.CallValue.Cmp(zero) != 0 { @@ -362,8 +362,8 @@ func isStakeLocked(eei vm.SystemEI, governanceAddress []byte, address []byte) bo return eei.BlockChainHook().CurrentNonce() < lastEndNonce } -// delegateVote casts a vote from a validator run by WASM SC and delegates it to some one else. This function receives 4 parameters: -// args.Arguments[0] - proposal reference (github commit) +// delegateVote casts a vote from a validator run by WASM SC and delegates it to someone else. This function receives 4 parameters: +// args.Arguments[0] - proposal reference (GitHub commit) // args.Arguments[1] - vote option (yes, no, veto) // args.Arguments[2] - delegatedTo // args.Arguments[3] - balance to vote @@ -459,7 +459,7 @@ func (g *governanceContract) getVoteSetKeyForVoteWithFunds(proposalToVote, addre } // voteWithFunds casts a vote taking the transaction value as input for the vote power. It receives 2 arguments: -// args.Arguments[0] - proposal reference (github commit) +// args.Arguments[0] - proposal reference (GitHub commit) // args.Arguments[1] - vote option (yes, no, veto) func (g *governanceContract) voteWithFunds(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { err := g.eei.UseGas(g.gasCost.MetaChainSystemSCsCost.Vote) @@ -543,7 +543,7 @@ func (g *governanceContract) voteWithFunds(args *vmcommon.ContractCallInput) vmc return vmcommon.Ok } -// claimFunds returns back the used funds for a particular proposal if they are unlocked. Accepts a single parameter: +// claimFunds returns the used funds for a particular proposal if they are unlocked. Accepts a single parameter: // args.Arguments[0] - proposal reference func (g *governanceContract) claimFunds(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { if args.CallValue.Cmp(big.NewInt(0)) != 0 { @@ -995,7 +995,7 @@ func (g *governanceContract) proposalExists(reference []byte) bool { return len(marshaledData) > 0 } -// getValidProposal returns a proposal from storage if it exists or it is still valid/in-progress +// getValidProposal returns a proposal from storage if it exists, or it is still valid/in-progress func (g *governanceContract) getValidProposal(reference []byte) (*GeneralProposal, error) { proposal, err := g.getGeneralProposal(reference) if err != nil { @@ -1221,7 +1221,7 @@ func (g *governanceContract) getOrCreateVoteSet(key []byte) (*VoteSet, error) { return voteData, nil } -// getEmptyVoteSet returns a new VoteSet instance with it's members initialised with their 0 value +// getEmptyVoteSet returns a new VoteSet instance with its members initialised with their 0 value func (g *governanceContract) getEmptyVoteSet() *VoteSet { return &VoteSet{ UsedPower: big.NewInt(0), diff --git a/vm/systemSmartContracts/staking_test.go b/vm/systemSmartContracts/staking_test.go index c35f993aedb..a4645712868 100644 --- a/vm/systemSmartContracts/staking_test.go +++ b/vm/systemSmartContracts/staking_test.go @@ -1032,7 +1032,7 @@ func TestStakingSc_StakeWithV1ShouldWork(t *testing.T) { // 2 -- will try to do jail before stake should return user error // 3 -- will stake and stake should work // 4 -- will jail user that stake and should work -// 5 -- will try do to unStake and should not work because cannot do unStake if validator is jail +// 5 -- will try to do to unStake and should not work because cannot do unStake if validator is jail // 6 -- will try to do unJail with wrong access address should not work // 7 -- will do unJail with correct parameters and should work and after that stakeValue should be 999 func TestStakingSc_StakeJailAndUnJail(t *testing.T) { @@ -1080,7 +1080,7 @@ func TestStakingSc_StakeJailAndUnJail(t *testing.T) { // unJail wrong access address should not work doUnJail(t, stakingSmartContract, []byte("addr"), stakerPubKey, vmcommon.UserError) - // cannot do unJail on a address that not stake + // cannot do unJail on an address that not stake doUnJail(t, stakingSmartContract, stakingAccessAddress, []byte("addr"), vmcommon.UserError) // unJail should work blockChainHook.CurrentRoundCalled = func() uint64 { diff --git a/vm/systemSmartContracts/validator_test.go b/vm/systemSmartContracts/validator_test.go index 59774542b5a..67bc8a01087 100644 --- a/vm/systemSmartContracts/validator_test.go +++ b/vm/systemSmartContracts/validator_test.go @@ -2794,7 +2794,7 @@ func TestValidatorStakingSC_ExecuteGetShouldOk(t *testing.T) { } // Test scenario -// 1 -- will call claim from a account that does not stake -> will return error code +// 1 -- will call claim from an account that does not stake -> will return error code // 2 -- will do stake and lock all the stake value and claim should return error code because all the stake value is locked // 3 -- will do stake and stake value will not be locked and after that claim should work func TestValidatorStakingSC_Claim(t *testing.T) { From 117d69363e525b480c97ce9374e6f5fd3d115f62 Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Fri, 28 Oct 2022 11:58:01 +0300 Subject: [PATCH 100/110] revert code --- dataRetriever/chainStorer.go | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/dataRetriever/chainStorer.go b/dataRetriever/chainStorer.go index 29e10252839..d77fa35cacd 100644 --- a/dataRetriever/chainStorer.go +++ b/dataRetriever/chainStorer.go @@ -2,18 +2,13 @@ package dataRetriever import ( "fmt" - "sort" - "strings" "sync" - logger "github.com/ElrondNetwork/elrond-go-logger" "github.com/ElrondNetwork/elrond-go/storage" ) var _ StorageService = (*ChainStorer)(nil) -var log = logger.GetOrCreate("chainstorer") - // ChainStorer is a StorageService implementation that can hold multiple storages // grouped by storage unit type type ChainStorer struct { @@ -28,21 +23,10 @@ func NewChainStorer() *ChainStorer { } } -// AddStorer will add a new storer to the chain map // AddStorer will add a new storer to the chain map func (bc *ChainStorer) AddStorer(key UnitType, s storage.Storer) { bc.lock.Lock() bc.chain[key] = s - allStorersArr := make([]string, 0) - for key := range bc.chain { - allStorersArr = append(allStorersArr, key.String()) - } - - sort.SliceStable(allStorersArr, func(i, j int) bool { - return allStorersArr[i] < allStorersArr[j] - }) - - log.Error("adding storer", "type", key.String(), "current num of storers", len(bc.chain), "all storers", "\n"+strings.Join(allStorersArr, "\n")) bc.lock.Unlock() } From e406bee514dc349c2428e4a2477fd4d44a27d058 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Fri, 28 Oct 2022 14:14:13 +0300 Subject: [PATCH 101/110] moved app status handler to status core components --- cmd/node/factory/interface.go | 18 -- cmd/node/factory/structsStatusHandlers.go | 101 ----------- epochStart/bootstrap/process_test.go | 3 - epochStart/mock/coreComponentsMock.go | 9 - epochStart/mock/economicsHandlerStub.go | 10 ++ errors/errors.go | 12 ++ factory/api/apiResolverFactory.go | 73 ++++---- factory/api/apiResolverFactory_test.go | 14 +- factory/bootstrap/bootstrapComponents.go | 61 ++++--- factory/consensus/consensusComponents.go | 23 ++- .../consensusComponentsHandler_test.go | 10 +- factory/core/coreComponents.go | 97 ++++------ factory/core/coreComponentsHandler.go | 28 --- factory/core/coreComponentsHandler_test.go | 11 +- factory/data/dataComponents.go | 13 +- factory/heartbeat/heartbeatV2Components.go | 71 +++++--- .../heartbeat/heartbeatV2Components_test.go | 16 +- factory/interface.go | 12 +- factory/mock/coreComponentsMock.go | 20 --- factory/processing/blockProcessorCreator.go | 2 + factory/processing/processComponents.go | 44 +++-- factory/state/stateComponents.go | 15 +- factory/status/statusComponents.go | 9 +- factory/status/statusComponentsHandler.go | 4 +- .../status/statusComponentsHandler_test.go | 10 +- factory/statusCore/statusCoreComponents.go | 106 ++++++++++- .../statusCore/statusCoreComponentsHandler.go | 47 +++++ .../statusCoreComponentsHandler_test.go | 15 +- .../statusCore/statusCoreComponents_test.go | 94 ++++++++-- integrationTests/consensus/consensus_test.go | 21 +-- .../bootstrapComponents_test.go | 8 +- .../consensusComponents_test.go | 18 +- .../dataComponents/dataComponents_test.go | 10 +- .../heartbeatComponents_test.go | 26 ++- .../networkComponents_test.go | 6 +- .../processComponents_test.go | 17 +- .../stateComponents/stateComponents_test.go | 12 +- .../statusComponents/statusComponents_test.go | 17 +- .../statusCoreComponents_test.go | 10 +- integrationTests/mock/coreComponentsStub.go | 12 -- .../multiShard/hardFork/hardFork_test.go | 27 +-- integrationTests/testConsensusNode.go | 6 + integrationTests/testProcessorNode.go | 30 ++-- integrationTests/testSyncNode.go | 33 ++-- node/metrics/errors.go | 4 +- node/metrics/metrics.go | 36 ++-- node/metrics/metrics_test.go | 26 +-- node/mock/factory/coreComponentsStub.go | 13 -- node/mock/txFeeHandlerStub.go | 10 ++ node/node.go | 11 +- node/nodeRunner.go | 166 ++++++++++-------- node/node_test.go | 58 +++--- node/options.go | 1 + process/block/argProcessor.go | 15 +- process/block/baseProcess.go | 5 +- process/block/baseProcess_test.go | 53 ++++-- process/block/export_test.go | 31 ++-- process/block/metablock.go | 2 +- process/block/metablock_test.go | 34 ++-- process/block/shardblock.go | 2 +- process/economics/testEconomicsData.go | 11 +- process/errors.go | 3 + process/interface.go | 8 +- process/mock/coreComponentsMock.go | 5 - testscommon/components/components.go | 77 +++++--- testscommon/components/default.go | 2 - .../economicsDataHandlerStub.go | 10 ++ .../economicsmocks/economicsHandlerMock.go | 10 ++ .../factory/statusCoreComponentsStub.go | 66 +++++++ .../statusHandlerUtilsFactoryMock.go | 20 --- .../statusHandler/statusHandlersUtilsMock.go | 33 ---- update/errors.go | 9 +- update/factory/exportHandlerFactory.go | 10 +- 73 files changed, 1106 insertions(+), 826 deletions(-) delete mode 100644 cmd/node/factory/structsStatusHandlers.go create mode 100644 testscommon/factory/statusCoreComponentsStub.go delete mode 100644 testscommon/statusHandler/statusHandlerUtilsFactoryMock.go delete mode 100644 testscommon/statusHandler/statusHandlersUtilsMock.go diff --git a/cmd/node/factory/interface.go b/cmd/node/factory/interface.go index 0d6c293c68c..7834268306d 100644 --- a/cmd/node/factory/interface.go +++ b/cmd/node/factory/interface.go @@ -5,11 +5,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/data" - "github.com/ElrondNetwork/elrond-go-core/data/typeConverters" - "github.com/ElrondNetwork/elrond-go-core/marshal" - "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/p2p" - "github.com/ElrondNetwork/elrond-go/storage" ) // HeaderSigVerifierHandler is the interface needed to check that a header's signature is correct @@ -57,17 +53,3 @@ type FileLoggingHandler interface { Close() error IsInterfaceNil() bool } - -// StatusHandlersUtils provides some functionality for statusHandlers -// TODO: find a better naming -type StatusHandlersUtils interface { - StatusHandler() core.AppStatusHandler - Metrics() external.StatusMetricsHandler - UpdateStorerAndMetricsForPersistentHandler(store storage.Storer) error - IsInterfaceNil() bool -} - -// StatusHandlerUtilsFactory is the factory for statusHandler utils -type StatusHandlerUtilsFactory interface { - Create(marshalizer marshal.Marshalizer, converter typeConverters.Uint64ByteSliceConverter) (StatusHandlersUtils, error) -} diff --git a/cmd/node/factory/structsStatusHandlers.go b/cmd/node/factory/structsStatusHandlers.go deleted file mode 100644 index b0702d600c4..00000000000 --- a/cmd/node/factory/structsStatusHandlers.go +++ /dev/null @@ -1,101 +0,0 @@ -package factory - -import ( - "fmt" - - "github.com/ElrondNetwork/elrond-go-core/core" - "github.com/ElrondNetwork/elrond-go-core/core/check" - "github.com/ElrondNetwork/elrond-go-core/data/typeConverters" - "github.com/ElrondNetwork/elrond-go-core/marshal" - logger "github.com/ElrondNetwork/elrond-go-logger" - "github.com/ElrondNetwork/elrond-go/node/external" - "github.com/ElrondNetwork/elrond-go/statusHandler" - "github.com/ElrondNetwork/elrond-go/statusHandler/persister" - "github.com/ElrondNetwork/elrond-go/storage" -) - -var log = logger.GetOrCreate("main") - -// StatusHandlersInfo is struct that stores all components that are returned when status handlers are created -type statusHandlersInfo struct { - AppStatusHandler core.AppStatusHandler - StatusMetrics external.StatusMetricsHandler - PersistentHandler *persister.PersistentStatusHandler -} - -type statusHandlerUtilsFactory struct { -} - -// NewStatusHandlersFactory will return the status handler factory -func NewStatusHandlersFactory() (*statusHandlerUtilsFactory, error) { - return &statusHandlerUtilsFactory{}, nil -} - -// Create will return a slice of status handlers -func (shuf *statusHandlerUtilsFactory) Create( - marshalizer marshal.Marshalizer, - uint64ByteSliceConverter typeConverters.Uint64ByteSliceConverter, -) (StatusHandlersUtils, error) { - var appStatusHandlers []core.AppStatusHandler - var err error - var handler core.AppStatusHandler - - baseErrMessage := "error creating status handler" - if check.IfNil(marshalizer) { - return nil, fmt.Errorf("%s: nil marshalizer", baseErrMessage) - } - if check.IfNil(uint64ByteSliceConverter) { - return nil, fmt.Errorf("%s: nil uint64 byte slice converter", baseErrMessage) - } - - statusMetrics := statusHandler.NewStatusMetrics() - appStatusHandlers = append(appStatusHandlers, statusMetrics) - - persistentHandler, err := persister.NewPersistentStatusHandler(marshalizer, uint64ByteSliceConverter) - if err != nil { - return nil, err - } - appStatusHandlers = append(appStatusHandlers, persistentHandler) - - if len(appStatusHandlers) > 0 { - handler, err = statusHandler.NewAppStatusFacadeWithHandlers(appStatusHandlers...) - if err != nil { - log.Warn("cannot init AppStatusFacade", "error", err) - } - } else { - handler = statusHandler.NewNilStatusHandler() - log.Debug("no AppStatusHandler used: started with NilStatusHandler") - } - - statusHandlersInfoObject := new(statusHandlersInfo) - statusHandlersInfoObject.AppStatusHandler = handler - statusHandlersInfoObject.StatusMetrics = statusMetrics - statusHandlersInfoObject.PersistentHandler = persistentHandler - - return statusHandlersInfoObject, nil -} - -// UpdateStorerAndMetricsForPersistentHandler will set storer for persistent status handler -func (shi *statusHandlersInfo) UpdateStorerAndMetricsForPersistentHandler(store storage.Storer) error { - err := shi.PersistentHandler.SetStorage(store) - if err != nil { - return err - } - - return nil -} - -// StatusHandler returns the status handler -func (shi *statusHandlersInfo) StatusHandler() core.AppStatusHandler { - return shi.AppStatusHandler -} - -// Metrics returns the status metrics -func (shi *statusHandlersInfo) Metrics() external.StatusMetricsHandler { - return shi.StatusMetrics -} - -// IsInterfaceNil returns true if the interface is nil -func (shi *statusHandlersInfo) IsInterfaceNil() bool { - return shi == nil -} diff --git a/epochStart/bootstrap/process_test.go b/epochStart/bootstrap/process_test.go index 609a9149eca..7a6f13e2471 100644 --- a/epochStart/bootstrap/process_test.go +++ b/epochStart/bootstrap/process_test.go @@ -77,9 +77,6 @@ func createComponentsForEpochStart() (*mock.CoreComponentsMock, *mock.CryptoComp ProcessStatusHandlerInstance: &testscommon.ProcessStatusHandlerStub{}, HardforkTriggerPubKeyField: []byte("provided hardfork pub key"), EnableEpochsHandlerField: &testscommon.EnableEpochsHandlerStub{}, - StatusHandlerCalled: func() core.AppStatusHandler { - return &statusHandlerMock.AppStatusHandlerStub{} - }, }, &mock.CryptoComponentsMock{ PubKey: &cryptoMocks.PublicKeyStub{}, diff --git a/epochStart/mock/coreComponentsMock.go b/epochStart/mock/coreComponentsMock.go index 647bec1678a..5bde64d7f5f 100644 --- a/epochStart/mock/coreComponentsMock.go +++ b/epochStart/mock/coreComponentsMock.go @@ -28,7 +28,6 @@ type CoreComponentsMock struct { PathHdl storage.PathManagerHandler ChainIdCalled func() string MinTransactionVersionCalled func() uint32 - StatusHandlerCalled func() core.AppStatusHandler GenesisNodesSetupCalled func() sharding.GenesisNodesSetupHandler TxVersionCheckField process.TxVersionCheckerHandler ChanStopNode chan endProcess.ArgEndProcess @@ -138,14 +137,6 @@ func (ccm *CoreComponentsMock) EnableEpochsHandler() common.EnableEpochsHandler return ccm.EnableEpochsHandlerField } -// StatusHandler - -func (ccm *CoreComponentsMock) StatusHandler() core.AppStatusHandler { - if ccm.StatusHandlerCalled != nil { - return ccm.StatusHandlerCalled() - } - return nil -} - // GenesisNodesSetup - func (ccm *CoreComponentsMock) GenesisNodesSetup() sharding.GenesisNodesSetupHandler { if ccm.GenesisNodesSetupCalled != nil { diff --git a/epochStart/mock/economicsHandlerStub.go b/epochStart/mock/economicsHandlerStub.go index 1d7818218a6..181e292b9b5 100644 --- a/epochStart/mock/economicsHandlerStub.go +++ b/epochStart/mock/economicsHandlerStub.go @@ -3,6 +3,7 @@ package mock import ( "math/big" + "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/data" ) @@ -37,6 +38,7 @@ type EconomicsHandlerStub struct { RewardsTopUpGradientPointCalled func() *big.Int RewardsTopUpFactorCalled func() float64 ComputeGasLimitBasedOnBalanceCalled func(tx data.TransactionWithFeeHandler, balance *big.Int) (uint64, error) + SetStatusHandlerCalled func(statusHandler core.AppStatusHandler) error } // ComputeGasLimitBasedOnBalance - @@ -260,6 +262,14 @@ func (ehs *EconomicsHandlerStub) RewardsTopUpFactor() float64 { return 0 } +// SetStatusHandler - +func (ehs *EconomicsHandlerStub) SetStatusHandler(statusHandler core.AppStatusHandler) error { + if ehs.SetStatusHandlerCalled != nil { + return ehs.SetStatusHandlerCalled(statusHandler) + } + return nil +} + // IsInterfaceNil returns true if there is no value under the interface func (ehs *EconomicsHandlerStub) IsInterfaceNil() bool { return ehs == nil diff --git a/errors/errors.go b/errors/errors.go index 53ae27d4cc6..cc20d2e0416 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -508,3 +508,15 @@ var ErrNilNetworkStatistics = errors.New("nil network statistics") // ErrNilResourceMonitor signals that a nil resource monitor was provided var ErrNilResourceMonitor = errors.New("nil resource monitor") + +// ErrNilAppStatusHandler signals that a nil app status handler was provided +var ErrNilAppStatusHandler = errors.New("nil app status handler") + +// ErrNilStatusMetrics signals that a nil status metrics was provided +var ErrNilStatusMetrics = errors.New("nil status metrics") + +// ErrNilPersistentHandler signals that a nil persistent handler was provided +var ErrNilPersistentHandler = errors.New("nil persistent handler") + +// ErrNilGenesisNodesSetupHandler signals that a nil genesis nodes setup handler has been provided +var ErrNilGenesisNodesSetupHandler = errors.New("nil genesis nodes setup handler") diff --git a/factory/api/apiResolverFactory.go b/factory/api/apiResolverFactory.go index cfe1f9741a6..e00fca65196 100644 --- a/factory/api/apiResolverFactory.go +++ b/factory/api/apiResolverFactory.go @@ -44,31 +44,33 @@ var log = logger.GetOrCreate("factory") // ApiResolverArgs holds the argument needed to create an API resolver type ApiResolverArgs struct { - Configs *config.Configs - CoreComponents factory.CoreComponentsHolder - DataComponents factory.DataComponentsHolder - StateComponents factory.StateComponentsHolder - BootstrapComponents factory.BootstrapComponentsHolder - CryptoComponents factory.CryptoComponentsHolder - ProcessComponents factory.ProcessComponentsHolder - GasScheduleNotifier common.GasScheduleNotifierAPI - Bootstrapper process.Bootstrapper - AllowVMQueriesChan chan struct{} + Configs *config.Configs + CoreComponents factory.CoreComponentsHolder + DataComponents factory.DataComponentsHolder + StateComponents factory.StateComponentsHolder + BootstrapComponents factory.BootstrapComponentsHolder + CryptoComponents factory.CryptoComponentsHolder + ProcessComponents factory.ProcessComponentsHolder + StatusCoreComponents factory.StatusCoreComponentsHolder + GasScheduleNotifier common.GasScheduleNotifierAPI + Bootstrapper process.Bootstrapper + AllowVMQueriesChan chan struct{} } type scQueryServiceArgs struct { - generalConfig *config.Config - epochConfig *config.EpochConfig - coreComponents factory.CoreComponentsHolder - stateComponents factory.StateComponentsHolder - dataComponents factory.DataComponentsHolder - processComponents factory.ProcessComponentsHolder - gasScheduleNotifier core.GasScheduleNotifier - messageSigVerifier vm.MessageSignVerifier - systemSCConfig *config.SystemSmartContractsConfig - bootstrapper process.Bootstrapper - allowVMQueriesChan chan struct{} - workingDir string + generalConfig *config.Config + epochConfig *config.EpochConfig + coreComponents factory.CoreComponentsHolder + stateComponents factory.StateComponentsHolder + dataComponents factory.DataComponentsHolder + processComponents factory.ProcessComponentsHolder + statusCoreComponents factory.StatusCoreComponentsHolder + gasScheduleNotifier core.GasScheduleNotifier + messageSigVerifier vm.MessageSignVerifier + systemSCConfig *config.SystemSmartContractsConfig + bootstrapper process.Bootstrapper + allowVMQueriesChan chan struct{} + workingDir string } type scQueryElementArgs struct { @@ -92,18 +94,19 @@ type scQueryElementArgs struct { func CreateApiResolver(args *ApiResolverArgs) (facade.ApiResolver, error) { apiWorkingDir := filepath.Join(args.Configs.FlagsConfig.WorkingDir, common.TemporaryPath) argsSCQuery := &scQueryServiceArgs{ - generalConfig: args.Configs.GeneralConfig, - epochConfig: args.Configs.EpochConfig, - coreComponents: args.CoreComponents, - dataComponents: args.DataComponents, - stateComponents: args.StateComponents, - processComponents: args.ProcessComponents, - gasScheduleNotifier: args.GasScheduleNotifier, - messageSigVerifier: args.CryptoComponents.MessageSignVerifier(), - systemSCConfig: args.Configs.SystemSCConfig, - bootstrapper: args.Bootstrapper, - allowVMQueriesChan: args.AllowVMQueriesChan, - workingDir: apiWorkingDir, + generalConfig: args.Configs.GeneralConfig, + epochConfig: args.Configs.EpochConfig, + coreComponents: args.CoreComponents, + dataComponents: args.DataComponents, + stateComponents: args.StateComponents, + processComponents: args.ProcessComponents, + statusCoreComponents: args.StatusCoreComponents, + gasScheduleNotifier: args.GasScheduleNotifier, + messageSigVerifier: args.CryptoComponents.MessageSignVerifier(), + systemSCConfig: args.Configs.SystemSCConfig, + bootstrapper: args.Bootstrapper, + allowVMQueriesChan: args.AllowVMQueriesChan, + workingDir: apiWorkingDir, } scQueryService, err := createScQueryService(argsSCQuery) @@ -252,7 +255,7 @@ func CreateApiResolver(args *ApiResolverArgs) (facade.ApiResolver, error) { argsApiResolver := external.ArgNodeApiResolver{ SCQueryService: scQueryService, - StatusMetricsHandler: args.CoreComponents.StatusHandlerUtils().Metrics(), + StatusMetricsHandler: args.StatusCoreComponents.StatusMetrics(), TxCostHandler: txCostHandler, TotalStakedValueHandler: totalStakedValueHandler, DirectStakedListHandler: directStakedListHandler, diff --git a/factory/api/apiResolverFactory_test.go b/factory/api/apiResolverFactory_test.go index f39e5a68561..931a347be2d 100644 --- a/factory/api/apiResolverFactory_test.go +++ b/factory/api/apiResolverFactory_test.go @@ -21,7 +21,6 @@ func TestCreateApiResolver(t *testing.T) { shardCoordinator := mock.NewMultiShardsCoordinatorMock(1) coreComponents := componentsMock.GetCoreComponents() - coreComponents.StatusHandlerUtils().Metrics() networkComponents := componentsMock.GetNetworkComponents() dataComponents := componentsMock.GetDataComponents(coreComponents, shardCoordinator) cryptoComponents := componentsMock.GetCryptoComponents(coreComponents) @@ -47,12 +46,13 @@ func TestCreateApiResolver(t *testing.T) { EpochConfig: &config.EpochConfig{}, EconomicsConfig: &economicsConfig, }, - CoreComponents: coreComponents, - DataComponents: dataComponents, - StateComponents: stateComponents, - BootstrapComponents: mbc, - CryptoComponents: cryptoComponents, - ProcessComponents: processComponents, + CoreComponents: coreComponents, + DataComponents: dataComponents, + StateComponents: stateComponents, + BootstrapComponents: mbc, + CryptoComponents: cryptoComponents, + ProcessComponents: processComponents, + StatusCoreComponents: componentsMock.GetStatusCoreComponents(), GasScheduleNotifier: &testscommon.GasScheduleNotifierMock{ GasSchedule: gasSchedule, }, diff --git a/factory/bootstrap/bootstrapComponents.go b/factory/bootstrap/bootstrapComponents.go index 2995e46af77..0ff8260fa78 100644 --- a/factory/bootstrap/bootstrapComponents.go +++ b/factory/bootstrap/bootstrapComponents.go @@ -28,26 +28,28 @@ var log = logger.GetOrCreate("factory") // BootstrapComponentsFactoryArgs holds the arguments needed to create a botstrap components factory type BootstrapComponentsFactoryArgs struct { - Config config.Config - RoundConfig config.RoundConfig - PrefConfig config.Preferences - ImportDbConfig config.ImportDbConfig - FlagsConfig config.ContextFlagsConfig - WorkingDir string - CoreComponents factory.CoreComponentsHolder - CryptoComponents factory.CryptoComponentsHolder - NetworkComponents factory.NetworkComponentsHolder + Config config.Config + RoundConfig config.RoundConfig + PrefConfig config.Preferences + ImportDbConfig config.ImportDbConfig + FlagsConfig config.ContextFlagsConfig + WorkingDir string + CoreComponents factory.CoreComponentsHolder + CryptoComponents factory.CryptoComponentsHolder + NetworkComponents factory.NetworkComponentsHolder + StatusCoreComponents factory.StatusCoreComponentsHolder } type bootstrapComponentsFactory struct { - config config.Config - prefConfig config.Preferences - importDbConfig config.ImportDbConfig - flagsConfig config.ContextFlagsConfig - workingDir string - coreComponents factory.CoreComponentsHolder - cryptoComponents factory.CryptoComponentsHolder - networkComponents factory.NetworkComponentsHolder + config config.Config + prefConfig config.Preferences + importDbConfig config.ImportDbConfig + flagsConfig config.ContextFlagsConfig + workingDir string + coreComponents factory.CoreComponentsHolder + cryptoComponents factory.CryptoComponentsHolder + networkComponents factory.NetworkComponentsHolder + statusCoreComponents factory.StatusCoreComponentsHolder } type bootstrapComponents struct { @@ -74,16 +76,23 @@ func NewBootstrapComponentsFactory(args BootstrapComponentsFactoryArgs) (*bootst if args.WorkingDir == "" { return nil, errors.ErrInvalidWorkingDir } + if check.IfNil(args.StatusCoreComponents) { + return nil, errors.ErrNilStatusCoreComponents + } + if check.IfNil(args.StatusCoreComponents.AppStatusHandler()) { + return nil, errors.ErrNilAppStatusHandler + } return &bootstrapComponentsFactory{ - config: args.Config, - prefConfig: args.PrefConfig, - importDbConfig: args.ImportDbConfig, - flagsConfig: args.FlagsConfig, - workingDir: args.WorkingDir, - coreComponents: args.CoreComponents, - cryptoComponents: args.CryptoComponents, - networkComponents: args.NetworkComponents, + config: args.Config, + prefConfig: args.PrefConfig, + importDbConfig: args.ImportDbConfig, + flagsConfig: args.FlagsConfig, + workingDir: args.WorkingDir, + coreComponents: args.CoreComponents, + cryptoComponents: args.CryptoComponents, + networkComponents: args.NetworkComponents, + statusCoreComponents: args.StatusCoreComponents, }, nil } @@ -176,7 +185,7 @@ func (bcf *bootstrapComponentsFactory) Create() (*bootstrapComponents, error) { RoundHandler: bcf.coreComponents.RoundHandler(), LatestStorageDataProvider: latestStorageDataProvider, ArgumentsParser: smartContract.NewArgumentParser(), - StatusHandler: bcf.coreComponents.StatusHandler(), + StatusHandler: bcf.statusCoreComponents.AppStatusHandler(), HeaderIntegrityVerifier: headerIntegrityVerifier, DataSyncerCreator: dataSyncerFactory, ScheduledSCRsStorer: nil, // will be updated after sync from network diff --git a/factory/consensus/consensusComponents.go b/factory/consensus/consensusComponents.go index d3873f4381e..10ac9c1f626 100644 --- a/factory/consensus/consensusComponents.go +++ b/factory/consensus/consensusComponents.go @@ -41,6 +41,7 @@ type ConsensusComponentsFactoryArgs struct { ProcessComponents factory.ProcessComponentsHolder StateComponents factory.StateComponentsHolder StatusComponents factory.StatusComponentsHolder + StatusCoreComponents factory.StatusCoreComponentsHolder ScheduledProcessor consensus.ScheduledProcessor IsInImportMode bool ShouldDisableWatchdog bool @@ -56,6 +57,7 @@ type consensusComponentsFactory struct { processComponents factory.ProcessComponentsHolder stateComponents factory.StateComponentsHolder statusComponents factory.StatusComponentsHolder + statusCoreComponents factory.StatusCoreComponentsHolder scheduledProcessor consensus.ScheduledProcessor isInImportMode bool shouldDisableWatchdog bool @@ -96,6 +98,9 @@ func NewConsensusComponentsFactory(args ConsensusComponentsFactoryArgs) (*consen if check.IfNil(args.ScheduledProcessor) { return nil, errors.ErrNilScheduledProcessor } + if check.IfNil(args.StatusCoreComponents) { + return nil, errors.ErrNilStatusCoreComponents + } return &consensusComponentsFactory{ config: args.Config, @@ -107,6 +112,7 @@ func NewConsensusComponentsFactory(args ConsensusComponentsFactoryArgs) (*consen processComponents: args.ProcessComponents, stateComponents: args.StateComponents, statusComponents: args.StatusComponents, + statusCoreComponents: args.StatusCoreComponents, scheduledProcessor: args.ScheduledProcessor, isInImportMode: args.IsInImportMode, shouldDisableWatchdog: args.ShouldDisableWatchdog, @@ -204,7 +210,7 @@ func (ccf *consensusComponentsFactory) Create() (*consensusComponents, error) { PoolAdder: ccf.dataComponents.Datapool().MiniBlocks(), SignatureSize: ccf.config.ValidatorPubkeyConverter.SignatureLength, PublicKeySize: ccf.config.ValidatorPubkeyConverter.Length, - AppStatusHandler: ccf.coreComponents.StatusHandler(), + AppStatusHandler: ccf.statusCoreComponents.AppStatusHandler(), NodeRedundancyHandler: ccf.processComponents.NodeRedundancyHandler(), } @@ -268,7 +274,7 @@ func (ccf *consensusComponentsFactory) Create() (*consensusComponents, error) { consensusState, cc.worker, ccf.config.Consensus.Type, - ccf.coreComponents.StatusHandler(), + ccf.statusCoreComponents.AppStatusHandler(), ccf.statusComponents.OutportHandler(), []byte(ccf.coreComponents.ChainID()), ccf.networkComponents.NetworkMessenger().ID(), @@ -333,7 +339,7 @@ func (ccf *consensusComponentsFactory) createChronology() (consensus.ChronologyH RoundHandler: ccf.processComponents.RoundHandler(), SyncTimer: ccf.coreComponents.SyncTimer(), Watchdog: wd, - AppStatusHandler: ccf.coreComponents.StatusHandler(), + AppStatusHandler: ccf.statusCoreComponents.AppStatusHandler(), } chronologyHandler, err := chronology.NewChronology(chronologyArg) if err != nil { @@ -430,7 +436,7 @@ func (ccf *consensusComponentsFactory) createShardBootstrapper() (process.Bootst MiniblocksProvider: ccf.dataComponents.MiniBlocksProvider(), EpochNotifier: ccf.coreComponents.EpochNotifier(), ProcessedMiniBlocksTracker: ccf.processComponents.ProcessedMiniBlocksTracker(), - AppStatusHandler: ccf.coreComponents.StatusHandler(), + AppStatusHandler: ccf.statusCoreComponents.AppStatusHandler(), } argsShardStorageBootstrapper := storageBootstrap.ArgsShardStorageBootstrapper{ @@ -467,7 +473,7 @@ func (ccf *consensusComponentsFactory) createShardBootstrapper() (process.Bootst EpochHandler: ccf.processComponents.EpochStartTrigger(), MiniblocksProvider: ccf.dataComponents.MiniBlocksProvider(), Uint64Converter: ccf.coreComponents.Uint64ByteSliceConverter(), - AppStatusHandler: ccf.coreComponents.StatusHandler(), + AppStatusHandler: ccf.statusCoreComponents.AppStatusHandler(), OutportHandler: ccf.statusComponents.OutportHandler(), AccountsDBSyncer: accountsDBSyncer, CurrentEpochProvider: ccf.processComponents.CurrentEpochProvider(), @@ -556,7 +562,7 @@ func (ccf *consensusComponentsFactory) createMetaChainBootstrapper() (process.Bo MiniblocksProvider: ccf.dataComponents.MiniBlocksProvider(), EpochNotifier: ccf.coreComponents.EpochNotifier(), ProcessedMiniBlocksTracker: ccf.processComponents.ProcessedMiniBlocksTracker(), - AppStatusHandler: ccf.coreComponents.StatusHandler(), + AppStatusHandler: ccf.statusCoreComponents.AppStatusHandler(), } argsMetaStorageBootstrapper := storageBootstrap.ArgsMetaStorageBootstrapper{ @@ -599,7 +605,7 @@ func (ccf *consensusComponentsFactory) createMetaChainBootstrapper() (process.Bo EpochHandler: ccf.processComponents.EpochStartTrigger(), MiniblocksProvider: ccf.dataComponents.MiniBlocksProvider(), Uint64Converter: ccf.coreComponents.Uint64ByteSliceConverter(), - AppStatusHandler: ccf.coreComponents.StatusHandler(), + AppStatusHandler: ccf.statusCoreComponents.AppStatusHandler(), OutportHandler: ccf.statusComponents.OutportHandler(), AccountsDBSyncer: accountsDBSyncer, CurrentEpochProvider: ccf.processComponents.CurrentEpochProvider(), @@ -699,6 +705,9 @@ func (ccf *consensusComponentsFactory) checkArgs() error { if check.IfNil(hardforkTrigger) { return errors.ErrNilHardforkTrigger } + if check.IfNil(ccf.statusCoreComponents.AppStatusHandler()) { + return errors.ErrNilAppStatusHandler + } return nil } diff --git a/factory/consensus/consensusComponentsHandler_test.go b/factory/consensus/consensusComponentsHandler_test.go index 3cfaf73b2f8..ff8aae2e0ad 100644 --- a/factory/consensus/consensusComponentsHandler_test.go +++ b/factory/consensus/consensusComponentsHandler_test.go @@ -6,6 +6,8 @@ import ( consensusComp "github.com/ElrondNetwork/elrond-go/factory/consensus" "github.com/ElrondNetwork/elrond-go/factory/mock" componentsMock "github.com/ElrondNetwork/elrond-go/testscommon/components" + "github.com/ElrondNetwork/elrond-go/testscommon/factory" + "github.com/ElrondNetwork/elrond-go/testscommon/statusHandler" "github.com/stretchr/testify/require" ) @@ -18,13 +20,15 @@ func TestManagedConsensusComponents_CreateWithInvalidArgsShouldErr(t *testing.T) shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) args := componentsMock.GetConsensusArgs(shardCoordinator) - coreComponents := componentsMock.GetDefaultCoreComponents() - args.CoreComponents = coreComponents + statusCoreComponents := &factory.StatusCoreComponentsStub{ + AppStatusHandlerField: &statusHandler.AppStatusHandlerStub{}, + } + args.StatusCoreComponents = statusCoreComponents consensusComponentsFactory, _ := consensusComp.NewConsensusComponentsFactory(args) managedConsensusComponents, err := consensusComp.NewManagedConsensusComponents(consensusComponentsFactory) require.NoError(t, err) - coreComponents.AppStatusHdl = nil + statusCoreComponents.AppStatusHandlerField = nil err = managedConsensusComponents.Create() require.Error(t, err) require.NotNil(t, managedConsensusComponents.CheckSubcomponents()) diff --git a/factory/core/coreComponents.go b/factory/core/coreComponents.go index 0d59bef8077..d0c81ef9c33 100644 --- a/factory/core/coreComponents.go +++ b/factory/core/coreComponents.go @@ -20,7 +20,6 @@ import ( "github.com/ElrondNetwork/elrond-go-core/marshal" marshalizerFactory "github.com/ElrondNetwork/elrond-go-core/marshal/factory" logger "github.com/ElrondNetwork/elrond-go-logger" - nodeFactory "github.com/ElrondNetwork/elrond-go/cmd/node/factory" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/common/enablers" commonFactory "github.com/ElrondNetwork/elrond-go/common/factory" @@ -30,8 +29,7 @@ import ( "github.com/ElrondNetwork/elrond-go/consensus/round" "github.com/ElrondNetwork/elrond-go/epochStart/notifier" "github.com/ElrondNetwork/elrond-go/errors" - factory "github.com/ElrondNetwork/elrond-go/factory" - "github.com/ElrondNetwork/elrond-go/node/metrics" + "github.com/ElrondNetwork/elrond-go/factory" "github.com/ElrondNetwork/elrond-go/ntp" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/economics" @@ -48,32 +46,30 @@ var log = logger.GetOrCreate("factory") // CoreComponentsFactoryArgs holds the arguments needed for creating a core components factory type CoreComponentsFactoryArgs struct { - Config config.Config - ConfigPathsHolder config.ConfigurationPathsHolder - EpochConfig config.EpochConfig - RoundConfig config.RoundConfig - RatingsConfig config.RatingsConfig - EconomicsConfig config.EconomicsConfig - ImportDbConfig config.ImportDbConfig - NodesFilename string - WorkingDirectory string - ChanStopNodeProcess chan endProcess.ArgEndProcess - StatusHandlersFactory nodeFactory.StatusHandlerUtilsFactory + Config config.Config + ConfigPathsHolder config.ConfigurationPathsHolder + EpochConfig config.EpochConfig + RoundConfig config.RoundConfig + RatingsConfig config.RatingsConfig + EconomicsConfig config.EconomicsConfig + ImportDbConfig config.ImportDbConfig + NodesFilename string + WorkingDirectory string + ChanStopNodeProcess chan endProcess.ArgEndProcess } // coreComponentsFactory is responsible for creating the core components type coreComponentsFactory struct { - config config.Config - configPathsHolder config.ConfigurationPathsHolder - epochConfig config.EpochConfig - roundConfig config.RoundConfig - ratingsConfig config.RatingsConfig - economicsConfig config.EconomicsConfig - importDbConfig config.ImportDbConfig - nodesFilename string - workingDir string - chanStopNodeProcess chan endProcess.ArgEndProcess - statusHandlersFactory nodeFactory.StatusHandlerUtilsFactory + config config.Config + configPathsHolder config.ConfigurationPathsHolder + epochConfig config.EpochConfig + roundConfig config.RoundConfig + ratingsConfig config.RatingsConfig + economicsConfig config.EconomicsConfig + importDbConfig config.ImportDbConfig + nodesFilename string + workingDir string + chanStopNodeProcess chan endProcess.ArgEndProcess } // coreComponents is the DTO used for core components @@ -86,7 +82,6 @@ type coreComponents struct { uint64ByteSliceConverter typeConverters.Uint64ByteSliceConverter addressPubKeyConverter core.PubkeyConverter validatorPubKeyConverter core.PubkeyConverter - statusHandlersUtils nodeFactory.StatusHandlersUtils pathHandler storage.PathManagerHandler syncTimer ntp.SyncTimer roundHandler consensus.RoundHandler @@ -117,17 +112,16 @@ type coreComponents struct { // NewCoreComponentsFactory initializes the factory which is responsible to creating core components func NewCoreComponentsFactory(args CoreComponentsFactoryArgs) (*coreComponentsFactory, error) { return &coreComponentsFactory{ - config: args.Config, - configPathsHolder: args.ConfigPathsHolder, - epochConfig: args.EpochConfig, - roundConfig: args.RoundConfig, - ratingsConfig: args.RatingsConfig, - importDbConfig: args.ImportDbConfig, - economicsConfig: args.EconomicsConfig, - workingDir: args.WorkingDirectory, - chanStopNodeProcess: args.ChanStopNodeProcess, - nodesFilename: args.NodesFilename, - statusHandlersFactory: args.StatusHandlersFactory, + config: args.Config, + configPathsHolder: args.ConfigPathsHolder, + epochConfig: args.EpochConfig, + roundConfig: args.RoundConfig, + ratingsConfig: args.RatingsConfig, + importDbConfig: args.ImportDbConfig, + economicsConfig: args.EconomicsConfig, + workingDir: args.WorkingDirectory, + chanStopNodeProcess: args.ChanStopNodeProcess, + nodesFilename: args.NodesFilename, }, nil } @@ -303,31 +297,6 @@ func (ccf *coreComponentsFactory) Create() (*coreComponents, error) { return nil, err } - statusHandlersInfo, err := ccf.statusHandlersFactory.Create(internalMarshalizer, uint64ByteSliceConverter) - if err != nil { - return nil, err - } - - err = metrics.InitBaseMetrics(statusHandlersInfo) - if err != nil { - return nil, err - } - - err = metrics.InitConfigMetrics(statusHandlersInfo, ccf.epochConfig, ccf.economicsConfig, genesisNodesConfig) - if err != nil { - return nil, err - } - - err = metrics.InitRatingsMetrics(statusHandlersInfo, ccf.ratingsConfig) - if err != nil { - return nil, err - } - - err = economicsData.SetStatusHandler(statusHandlersInfo.StatusHandler()) - if err != nil { - log.Debug("cannot set status handler to economicsData", "error", err) - } - argsNodesShuffler := &nodesCoordinator.NodesShufflerArgs{ NodesShard: genesisNodesConfig.MinNumberOfShardNodes(), NodesMeta: genesisNodesConfig.MinNumberOfMetaNodes(), @@ -363,7 +332,6 @@ func (ccf *coreComponentsFactory) Create() (*coreComponents, error) { uint64ByteSliceConverter: uint64ByteSliceConverter, addressPubKeyConverter: addressPubkeyConverter, validatorPubKeyConverter: validatorPubkeyConverter, - statusHandlersUtils: statusHandlersInfo, pathHandler: pathHandler, syncTimer: syncer, roundHandler: roundHandler, @@ -394,9 +362,6 @@ func (ccf *coreComponentsFactory) Create() (*coreComponents, error) { // Close closes all underlying components func (cc *coreComponents) Close() error { - if !check.IfNil(cc.statusHandlersUtils) { - cc.statusHandlersUtils.StatusHandler().Close() - } if !check.IfNil(cc.alarmScheduler) { cc.alarmScheduler.Close() } diff --git a/factory/core/coreComponentsHandler.go b/factory/core/coreComponentsHandler.go index 6fabf966407..bd737e17f6e 100644 --- a/factory/core/coreComponentsHandler.go +++ b/factory/core/coreComponentsHandler.go @@ -11,7 +11,6 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/typeConverters" "github.com/ElrondNetwork/elrond-go-core/hashing" "github.com/ElrondNetwork/elrond-go-core/marshal" - nodeFactory "github.com/ElrondNetwork/elrond-go/cmd/node/factory" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/consensus" "github.com/ElrondNetwork/elrond-go/errors" @@ -111,9 +110,6 @@ func (mcc *managedCoreComponents) CheckSubcomponents() error { if check.IfNil(mcc.validatorPubKeyConverter) { return errors.ErrNilValidatorPublicKeyConverter } - if check.IfNil(mcc.statusHandlersUtils) { - return errors.ErrNilStatusHandler - } if check.IfNil(mcc.pathHandler) { return errors.ErrNilPathHandler } @@ -270,30 +266,6 @@ func (mcc *managedCoreComponents) ValidatorPubKeyConverter() core.PubkeyConverte return mcc.coreComponents.validatorPubKeyConverter } -// StatusHandlerUtils returns the core components status handler utils -func (mcc *managedCoreComponents) StatusHandlerUtils() nodeFactory.StatusHandlersUtils { - mcc.mutCoreComponents.RLock() - defer mcc.mutCoreComponents.RUnlock() - - if mcc.coreComponents == nil { - return nil - } - - return mcc.coreComponents.statusHandlersUtils -} - -// StatusHandler returns the application status handler -func (mcc *managedCoreComponents) StatusHandler() core.AppStatusHandler { - mcc.mutCoreComponents.RLock() - defer mcc.mutCoreComponents.RUnlock() - - if mcc.coreComponents == nil { - return nil - } - - return mcc.coreComponents.statusHandlersUtils.StatusHandler() -} - // PathHandler returns the core components path handler func (mcc *managedCoreComponents) PathHandler() storage.PathManagerHandler { mcc.mutCoreComponents.RLock() diff --git a/factory/core/coreComponentsHandler_test.go b/factory/core/coreComponentsHandler_test.go index daa1ddc8dc0..23cc63a7f9b 100644 --- a/factory/core/coreComponentsHandler_test.go +++ b/factory/core/coreComponentsHandler_test.go @@ -26,7 +26,7 @@ func TestManagedCoreComponents_CreateWithInvalidArgsShouldErr(t *testing.T) { require.NoError(t, err) err = managedCoreComponents.Create() require.Error(t, err) - require.Nil(t, managedCoreComponents.StatusHandler()) + require.Nil(t, managedCoreComponents.InternalMarshalizer()) } func TestManagedCoreComponents_CreateShouldWork(t *testing.T) { @@ -46,7 +46,6 @@ func TestManagedCoreComponents_CreateShouldWork(t *testing.T) { require.Nil(t, managedCoreComponents.Uint64ByteSliceConverter()) require.Nil(t, managedCoreComponents.AddressPubKeyConverter()) require.Nil(t, managedCoreComponents.ValidatorPubKeyConverter()) - require.Nil(t, managedCoreComponents.StatusHandler()) require.Nil(t, managedCoreComponents.PathHandler()) require.Equal(t, "", managedCoreComponents.ChainID()) require.Nil(t, managedCoreComponents.AddressPubKeyConverter()) @@ -64,7 +63,6 @@ func TestManagedCoreComponents_CreateShouldWork(t *testing.T) { require.NotNil(t, managedCoreComponents.Uint64ByteSliceConverter()) require.NotNil(t, managedCoreComponents.AddressPubKeyConverter()) require.NotNil(t, managedCoreComponents.ValidatorPubKeyConverter()) - require.NotNil(t, managedCoreComponents.StatusHandler()) require.NotNil(t, managedCoreComponents.PathHandler()) require.NotEqual(t, "", managedCoreComponents.ChainID()) require.NotNil(t, managedCoreComponents.AddressPubKeyConverter()) @@ -84,10 +82,9 @@ func TestManagedCoreComponents_Close(t *testing.T) { coreArgs := componentsMock.GetCoreArgs() coreComponentsFactory, _ := coreComp.NewCoreComponentsFactory(coreArgs) managedCoreComponents, _ := coreComp.NewManagedCoreComponents(coreComponentsFactory) - err := managedCoreComponents.Create() + err := managedCoreComponents.Close() require.NoError(t, err) - - err = managedCoreComponents.Close() + err = managedCoreComponents.Create() require.NoError(t, err) - require.Nil(t, managedCoreComponents.StatusHandler()) + } diff --git a/factory/data/dataComponents.go b/factory/data/dataComponents.go index b3cbedb9313..d739ad7ca81 100644 --- a/factory/data/dataComponents.go +++ b/factory/data/dataComponents.go @@ -24,6 +24,7 @@ type DataComponentsFactoryArgs struct { PrefsConfig config.PreferencesConfig ShardCoordinator sharding.Coordinator Core factory.CoreComponentsHolder + StatusCore factory.StatusCoreComponentsHolder EpochStartNotifier factory.EpochStartNotifier CurrentEpoch uint32 CreateTrieEpochRootHashStorer bool @@ -35,6 +36,7 @@ type dataComponentsFactory struct { shardCoordinator sharding.Coordinator core factory.CoreComponentsHolder epochStartNotifier factory.EpochStartNotifier + statusCore factory.StatusCoreComponentsHolder currentEpoch uint32 createTrieEpochRootHashStorer bool } @@ -66,12 +68,19 @@ func NewDataComponentsFactory(args DataComponentsFactoryArgs) (*dataComponentsFa if check.IfNil(args.Core.EconomicsData()) { return nil, errors.ErrNilEconomicsHandler } + if check.IfNil(args.StatusCore) { + return nil, errors.ErrNilStatusCoreComponents + } + if check.IfNil(args.StatusCore.AppStatusHandler()) { + return nil, errors.ErrNilAppStatusHandler + } return &dataComponentsFactory{ config: args.Config, prefsConfig: args.PrefsConfig, shardCoordinator: args.ShardCoordinator, core: args.Core, + statusCore: args.StatusCore, epochStartNotifier: args.EpochStartNotifier, currentEpoch: args.CurrentEpoch, createTrieEpochRootHashStorer: args.CreateTrieEpochRootHashStorer, @@ -135,14 +144,14 @@ func (dcf *dataComponentsFactory) Create() (*dataComponents, error) { func (dcf *dataComponentsFactory) createBlockChainFromConfig() (data.ChainHandler, error) { if dcf.shardCoordinator.SelfId() < dcf.shardCoordinator.NumberOfShards() { - blockChain, err := blockchain.NewBlockChain(dcf.core.StatusHandler()) + blockChain, err := blockchain.NewBlockChain(dcf.statusCore.AppStatusHandler()) if err != nil { return nil, err } return blockChain, nil } if dcf.shardCoordinator.SelfId() == core.MetachainShardId { - blockChain, err := blockchain.NewMetaChain(dcf.core.StatusHandler()) + blockChain, err := blockchain.NewMetaChain(dcf.statusCore.AppStatusHandler()) if err != nil { return nil, err } diff --git a/factory/heartbeat/heartbeatV2Components.go b/factory/heartbeat/heartbeatV2Components.go index 69cebef8eac..046f19f4629 100644 --- a/factory/heartbeat/heartbeatV2Components.go +++ b/factory/heartbeat/heartbeatV2Components.go @@ -25,27 +25,29 @@ var log = logger.GetOrCreate("factory") // ArgHeartbeatV2ComponentsFactory represents the argument for the heartbeat v2 components factory type ArgHeartbeatV2ComponentsFactory struct { - Config config.Config - Prefs config.Preferences - AppVersion string - BoostrapComponents factory.BootstrapComponentsHolder - CoreComponents factory.CoreComponentsHolder - DataComponents factory.DataComponentsHolder - NetworkComponents factory.NetworkComponentsHolder - CryptoComponents factory.CryptoComponentsHolder - ProcessComponents factory.ProcessComponentsHolder + Config config.Config + Prefs config.Preferences + AppVersion string + BoostrapComponents factory.BootstrapComponentsHolder + CoreComponents factory.CoreComponentsHolder + DataComponents factory.DataComponentsHolder + NetworkComponents factory.NetworkComponentsHolder + CryptoComponents factory.CryptoComponentsHolder + ProcessComponents factory.ProcessComponentsHolder + StatusCoreComponents factory.StatusCoreComponentsHolder } type heartbeatV2ComponentsFactory struct { - config config.Config - prefs config.Preferences - version string - boostrapComponents factory.BootstrapComponentsHolder - coreComponents factory.CoreComponentsHolder - dataComponents factory.DataComponentsHolder - networkComponents factory.NetworkComponentsHolder - cryptoComponents factory.CryptoComponentsHolder - processComponents factory.ProcessComponentsHolder + config config.Config + prefs config.Preferences + version string + boostrapComponents factory.BootstrapComponentsHolder + coreComponents factory.CoreComponentsHolder + dataComponents factory.DataComponentsHolder + networkComponents factory.NetworkComponentsHolder + cryptoComponents factory.CryptoComponentsHolder + processComponents factory.ProcessComponentsHolder + statusCoreComponents factory.StatusCoreComponentsHolder } type heartbeatV2Components struct { @@ -65,15 +67,16 @@ func NewHeartbeatV2ComponentsFactory(args ArgHeartbeatV2ComponentsFactory) (*hea } return &heartbeatV2ComponentsFactory{ - config: args.Config, - prefs: args.Prefs, - version: args.AppVersion, - boostrapComponents: args.BoostrapComponents, - coreComponents: args.CoreComponents, - dataComponents: args.DataComponents, - networkComponents: args.NetworkComponents, - cryptoComponents: args.CryptoComponents, - processComponents: args.ProcessComponents, + config: args.Config, + prefs: args.Prefs, + version: args.AppVersion, + boostrapComponents: args.BoostrapComponents, + coreComponents: args.CoreComponents, + dataComponents: args.DataComponents, + networkComponents: args.NetworkComponents, + cryptoComponents: args.CryptoComponents, + processComponents: args.ProcessComponents, + statusCoreComponents: args.StatusCoreComponents, }, nil } @@ -96,10 +99,22 @@ func checkHeartbeatV2FactoryArgs(args ArgHeartbeatV2ComponentsFactory) error { if check.IfNil(args.ProcessComponents) { return errors.ErrNilProcessComponentsHolder } + if check.IfNil(args.StatusCoreComponents) { + return errors.ErrNilStatusCoreComponents + } + if check.IfNil(args.StatusCoreComponents.AppStatusHandler()) { + return errors.ErrNilAppStatusHandler + } hardforkTrigger := args.ProcessComponents.HardforkTrigger() if check.IfNil(hardforkTrigger) { return errors.ErrNilHardforkTrigger } + if check.IfNil(args.StatusCoreComponents) { + return errors.ErrNilStatusCoreComponents + } + if check.IfNil(args.StatusCoreComponents.AppStatusHandler()) { + return errors.ErrNilAppStatusHandler + } return nil } @@ -221,7 +236,7 @@ func (hcf *heartbeatV2ComponentsFactory) Create() (*heartbeatV2Components, error PeerAuthenticationCacher: hcf.dataComponents.Datapool().PeerAuthentications(), HeartbeatMonitor: heartbeatsMonitor, HeartbeatSenderInfoProvider: heartbeatV2Sender, - AppStatusHandler: hcf.coreComponents.StatusHandler(), + AppStatusHandler: hcf.statusCoreComponents.AppStatusHandler(), TimeBetweenConnectionsMetricsUpdate: time.Second * time.Duration(hcf.config.HeartbeatV2.TimeBetweenConnectionsMetricsUpdateInSec), } statusHandler, err := status.NewMetricsUpdater(argsMetricsUpdater) diff --git a/factory/heartbeat/heartbeatV2Components_test.go b/factory/heartbeat/heartbeatV2Components_test.go index 0dcee604f21..0b55a29fc21 100644 --- a/factory/heartbeat/heartbeatV2Components_test.go +++ b/factory/heartbeat/heartbeatV2Components_test.go @@ -23,6 +23,7 @@ func createMockHeartbeatV2ComponentsFactoryArgs() heartbeatComp.ArgHeartbeatV2Co _ = bootstrapC.SetShardCoordinator(shardCoordinator) + statusCoreC := componentsMock.GetStatusCoreComponents() coreC := componentsMock.GetCoreComponents() networkC := componentsMock.GetNetworkComponents() dataC := componentsMock.GetDataComponents(coreC, shardCoordinator) @@ -66,13 +67,14 @@ func createMockHeartbeatV2ComponentsFactoryArgs() heartbeatComp.ArgHeartbeatV2Co Identity: "identity", }, }, - AppVersion: "test", - BoostrapComponents: bootstrapC, - CoreComponents: coreC, - DataComponents: dataC, - NetworkComponents: networkC, - CryptoComponents: cryptoC, - ProcessComponents: processC, + AppVersion: "test", + BoostrapComponents: bootstrapC, + CoreComponents: coreC, + DataComponents: dataC, + NetworkComponents: networkC, + CryptoComponents: cryptoC, + ProcessComponents: processC, + StatusCoreComponents: statusCoreC, } } diff --git a/factory/interface.go b/factory/interface.go index 73c88dca0a6..f2902f0c85b 100644 --- a/factory/interface.go +++ b/factory/interface.go @@ -25,6 +25,7 @@ import ( "github.com/ElrondNetwork/elrond-go/epochStart/bootstrap" "github.com/ElrondNetwork/elrond-go/genesis" heartbeatData "github.com/ElrondNetwork/elrond-go/heartbeat/data" + "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/ntp" "github.com/ElrondNetwork/elrond-go/outport" "github.com/ElrondNetwork/elrond-go/p2p" @@ -106,8 +107,6 @@ type CoreComponentsHolder interface { Uint64ByteSliceConverter() typeConverters.Uint64ByteSliceConverter AddressPubKeyConverter() core.PubkeyConverter ValidatorPubKeyConverter() core.PubkeyConverter - StatusHandlerUtils() factory.StatusHandlersUtils - StatusHandler() core.AppStatusHandler PathHandler() storage.PathManagerHandler Watchdog() core.WatchdogTimer AlarmScheduler() core.TimersScheduler @@ -146,6 +145,9 @@ type CoreComponentsHandler interface { type StatusCoreComponentsHolder interface { ResourceMonitor() ResourceMonitor NetworkStatistics() NetworkStatisticsProvider + AppStatusHandler() core.AppStatusHandler + StatusMetrics() external.StatusMetricsHandler + PersistentStatusHandler() PersistenStatusHandler IsInterfaceNil() bool } @@ -507,3 +509,9 @@ type NetworkStatisticsProvider interface { Close() error IsInterfaceNil() bool } + +// PersistenStatusHandler defines a persistend status handler +type PersistenStatusHandler interface { + core.AppStatusHandler + SetStorage(store storage.Storer) error +} diff --git a/factory/mock/coreComponentsMock.go b/factory/mock/coreComponentsMock.go index 96dd03ec723..0a118cfde21 100644 --- a/factory/mock/coreComponentsMock.go +++ b/factory/mock/coreComponentsMock.go @@ -9,7 +9,6 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/typeConverters" "github.com/ElrondNetwork/elrond-go-core/hashing" "github.com/ElrondNetwork/elrond-go-core/marshal" - nodeFactory "github.com/ElrondNetwork/elrond-go/cmd/node/factory" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/consensus" "github.com/ElrondNetwork/elrond-go/factory" @@ -30,9 +29,6 @@ type CoreComponentsMock struct { UInt64ByteSliceConv typeConverters.Uint64ByteSliceConverter AddrPubKeyConv core.PubkeyConverter ValPubKeyConv core.PubkeyConverter - StatusHdlUtils nodeFactory.StatusHandlersUtils - AppStatusHdl core.AppStatusHandler - mutStatus sync.RWMutex PathHdl storage.PathManagerHandler WatchdogTimer core.WatchdogTimer AlarmSch core.TimersScheduler @@ -113,22 +109,6 @@ func (ccm *CoreComponentsMock) ValidatorPubKeyConverter() core.PubkeyConverter { return ccm.ValPubKeyConv } -// StatusHandlerUtils - -func (ccm *CoreComponentsMock) StatusHandlerUtils() nodeFactory.StatusHandlersUtils { - ccm.mutStatus.RLock() - defer ccm.mutStatus.RUnlock() - - return ccm.StatusHdlUtils -} - -// StatusHandler - -func (ccm *CoreComponentsMock) StatusHandler() core.AppStatusHandler { - ccm.mutStatus.RLock() - defer ccm.mutStatus.RUnlock() - - return ccm.AppStatusHdl -} - // PathHandler - func (ccm *CoreComponentsMock) PathHandler() storage.PathManagerHandler { return ccm.PathHdl diff --git a/factory/processing/blockProcessorCreator.go b/factory/processing/blockProcessorCreator.go index d81ca45acdd..c6d8ccd0bcc 100644 --- a/factory/processing/blockProcessorCreator.go +++ b/factory/processing/blockProcessorCreator.go @@ -385,6 +385,7 @@ func (pcf *processComponentsFactory) newShardBlockProcessor( DataComponents: pcf.data, BootstrapComponents: pcf.bootstrapComponents, StatusComponents: pcf.statusComponents, + StatusCoreComponents: pcf.statusCoreComponents, Config: pcf.config, Version: pcf.version, AccountsDB: accountsDb, @@ -793,6 +794,7 @@ func (pcf *processComponentsFactory) newMetaBlockProcessor( DataComponents: pcf.data, BootstrapComponents: pcf.bootstrapComponents, StatusComponents: pcf.statusComponents, + StatusCoreComponents: pcf.statusCoreComponents, Config: pcf.config, Version: pcf.version, AccountsDB: accountsDb, diff --git a/factory/processing/processComponents.go b/factory/processing/processComponents.go index 0561ddb02ca..4fd6d8748b8 100644 --- a/factory/processing/processComponents.go +++ b/factory/processing/processComponents.go @@ -138,13 +138,14 @@ type ProcessComponentsFactoryArgs struct { WorkingDir string HistoryRepo dblookupext.HistoryRepository - Data factory.DataComponentsHolder - CoreData factory.CoreComponentsHolder - Crypto factory.CryptoComponentsHolder - State factory.StateComponentsHolder - Network factory.NetworkComponentsHolder - BootstrapComponents factory.BootstrapComponentsHolder - StatusComponents factory.StatusComponentsHolder + Data factory.DataComponentsHolder + CoreData factory.CoreComponentsHolder + Crypto factory.CryptoComponentsHolder + State factory.StateComponentsHolder + Network factory.NetworkComponentsHolder + BootstrapComponents factory.BootstrapComponentsHolder + StatusComponents factory.StatusComponentsHolder + StatusCoreComponents factory.StatusCoreComponentsHolder } type processComponentsFactory struct { @@ -169,13 +170,14 @@ type processComponentsFactory struct { epochNotifier process.EpochNotifier importHandler update.ImportHandler - data factory.DataComponentsHolder - coreData factory.CoreComponentsHolder - crypto factory.CryptoComponentsHolder - state factory.StateComponentsHolder - network factory.NetworkComponentsHolder - bootstrapComponents factory.BootstrapComponentsHolder - statusComponents factory.StatusComponentsHolder + data factory.DataComponentsHolder + coreData factory.CoreComponentsHolder + crypto factory.CryptoComponentsHolder + state factory.StateComponentsHolder + network factory.NetworkComponentsHolder + bootstrapComponents factory.BootstrapComponentsHolder + statusComponents factory.StatusComponentsHolder + statusCoreComponents factory.StatusCoreComponentsHolder } // NewProcessComponentsFactory will return a new instance of processComponentsFactory @@ -211,6 +213,7 @@ func NewProcessComponentsFactory(args ProcessComponentsFactoryArgs) (*processCom workingDir: args.WorkingDir, historyRepo: args.HistoryRepo, epochNotifier: args.CoreData.EpochNotifier(), + statusCoreComponents: args.StatusCoreComponents, }, nil } @@ -758,7 +761,7 @@ func (pcf *processComponentsFactory) newEpochStartTrigger(requestHandler epochSt Finality: process.BlockFinality, PeerMiniBlocksSyncer: peerMiniBlockSyncer, RoundHandler: pcf.coreData.RoundHandler(), - AppStatusHandler: pcf.coreData.StatusHandler(), + AppStatusHandler: pcf.statusCoreComponents.AppStatusHandler(), EnableEpochsHandler: pcf.coreData.EnableEpochsHandler(), } epochStartTrigger, err := shardchain.NewEpochStartTrigger(argEpochStart) @@ -779,7 +782,7 @@ func (pcf *processComponentsFactory) newEpochStartTrigger(requestHandler epochSt Storage: pcf.data.StorageService(), Marshalizer: pcf.coreData.InternalMarshalizer(), Hasher: pcf.coreData.Hasher(), - AppStatusHandler: pcf.coreData.StatusHandler(), + AppStatusHandler: pcf.statusCoreComponents.AppStatusHandler(), DataPool: pcf.data.Datapool(), } epochStartTrigger, err := metachain.NewEpochStartTrigger(argEpochStart) @@ -1121,7 +1124,6 @@ func (pcf *processComponentsFactory) indexGenesisBlocks( err = pcf.saveAlteredGenesisHeaderToStorage( genesisBlockHeader, genesisBlockHash, - miniBlocks, genesisBody, intraShardMiniBlocks, txsPoolPerShard) @@ -1135,7 +1137,6 @@ func (pcf *processComponentsFactory) indexGenesisBlocks( func (pcf *processComponentsFactory) saveAlteredGenesisHeaderToStorage( genesisBlockHeader data.HeaderHandler, genesisBlockHash []byte, - miniBlocks []*dataBlock.MiniBlock, genesisBody *dataBlock.Body, intraShardMiniBlocks []*dataBlock.MiniBlock, txsPoolPerShard map[uint32]*indexer.Pool, @@ -1664,6 +1665,7 @@ func (pcf *processComponentsFactory) createExportFactoryHandler( argsExporter := updateFactory.ArgsExporter{ CoreComponents: pcf.coreData, CryptoComponents: pcf.crypto, + StatusCoreComponents: pcf.statusCoreComponents, HeaderValidator: headerValidator, DataPool: pcf.data.Datapool(), StorageService: pcf.data.StorageService(), @@ -1839,6 +1841,12 @@ func checkProcessComponentsArgs(args ProcessComponentsFactoryArgs) error { if check.IfNil(args.StatusComponents) { return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilStatusComponentsHolder) } + if check.IfNil(args.StatusCoreComponents) { + return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilStatusCoreComponents) + } + if check.IfNil(args.StatusCoreComponents.AppStatusHandler()) { + return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilAppStatusHandler) + } return nil } diff --git a/factory/state/stateComponents.go b/factory/state/stateComponents.go index 0ab3e5b69b7..5f17b621ee4 100644 --- a/factory/state/stateComponents.go +++ b/factory/state/stateComponents.go @@ -25,6 +25,7 @@ type StateComponentsFactoryArgs struct { Config config.Config ShardCoordinator sharding.Coordinator Core factory.CoreComponentsHolder + StatusCore factory.StatusCoreComponentsHolder StorageService dataRetriever.StorageService ProcessingMode common.NodeProcessingMode ShouldSerializeSnapshots bool @@ -35,6 +36,7 @@ type stateComponentsFactory struct { config config.Config shardCoordinator sharding.Coordinator core factory.CoreComponentsHolder + statusCore factory.StatusCoreComponentsHolder storageService dataRetriever.StorageService processingMode common.NodeProcessingMode shouldSerializeSnapshots bool @@ -74,11 +76,18 @@ func NewStateComponentsFactory(args StateComponentsFactoryArgs) (*stateComponent if check.IfNil(args.ChainHandler) { return nil, errors.ErrNilBlockChainHandler } + if check.IfNil(args.StatusCore) { + return nil, errors.ErrNilStatusCoreComponents + } + if check.IfNil(args.StatusCore.AppStatusHandler()) { + return nil, errors.ErrNilAppStatusHandler + } return &stateComponentsFactory{ config: args.Config, shardCoordinator: args.ShardCoordinator, core: args.Core, + statusCore: args.StatusCore, storageService: args.StorageService, processingMode: args.ProcessingMode, shouldSerializeSnapshots: args.ShouldSerializeSnapshots, @@ -134,7 +143,7 @@ func (scf *stateComponentsFactory) createAccountsAdapters(triesContainer common. ProcessingMode: scf.processingMode, ShouldSerializeSnapshots: scf.shouldSerializeSnapshots, ProcessStatusHandler: scf.core.ProcessStatusHandler(), - AppStatusHandler: scf.core.StatusHandler(), + AppStatusHandler: scf.statusCore.AppStatusHandler(), } accountsAdapter, err := state.NewAccountsDB(argsProcessingAccountsDB) if err != nil { @@ -149,7 +158,7 @@ func (scf *stateComponentsFactory) createAccountsAdapters(triesContainer common. StoragePruningManager: storagePruning, ProcessingMode: scf.processingMode, ProcessStatusHandler: scf.core.ProcessStatusHandler(), - AppStatusHandler: scf.core.StatusHandler(), + AppStatusHandler: scf.statusCore.AppStatusHandler(), } accountsAdapterApiOnFinal, err := factoryState.CreateAccountsAdapterAPIOnFinal(argsAPIAccountsDB, scf.chainHandler) @@ -198,7 +207,7 @@ func (scf *stateComponentsFactory) createPeerAdapter(triesContainer common.Tries ProcessingMode: scf.processingMode, ShouldSerializeSnapshots: scf.shouldSerializeSnapshots, ProcessStatusHandler: scf.core.ProcessStatusHandler(), - AppStatusHandler: scf.core.StatusHandler(), + AppStatusHandler: scf.statusCore.AppStatusHandler(), } peerAdapter, err := state.NewPeerAccountsDB(argsProcessingPeerAccountsDB) if err != nil { diff --git a/factory/status/statusComponents.go b/factory/status/statusComponents.go index e7c4f788a2e..6cda34d2d9c 100644 --- a/factory/status/statusComponents.go +++ b/factory/status/statusComponents.go @@ -25,8 +25,6 @@ import ( "github.com/ElrondNetwork/elrond-go/sharding/nodesCoordinator" ) -// TODO: move app status handler initialization here - type statusComponents struct { nodesCoordinator nodesCoordinator.NodesCoordinator statusHandler core.AppStatusHandler @@ -98,6 +96,9 @@ func NewStatusComponentsFactory(args StatusComponentsFactoryArgs) (*statusCompon if check.IfNil(args.StatusCoreComponents) { return nil, errors.ErrNilStatusCoreComponents } + if check.IfNil(args.StatusCoreComponents.AppStatusHandler()) { + return nil, errors.ErrNilAppStatusHandler + } return &statusComponentsFactory{ config: args.Config, @@ -121,7 +122,7 @@ func (scf *statusComponentsFactory) Create() (*statusComponents, error) { log.Trace("creating software checker structure") softwareVersionCheckerFactory, err := swVersionFactory.NewSoftwareVersionFactory( - scf.coreComponents.StatusHandler(), + scf.statusCoreComponents.AppStatusHandler(), scf.config.SoftwareVersionConfig, ) if err != nil { @@ -151,7 +152,7 @@ func (scf *statusComponentsFactory) Create() (*statusComponents, error) { nodesCoordinator: scf.nodesCoordinator, softwareVersion: softwareVersionChecker, outportHandler: outportHandler, - statusHandler: scf.coreComponents.StatusHandler(), + statusHandler: scf.statusCoreComponents.AppStatusHandler(), cancelFunc: cancelFunc, } diff --git a/factory/status/statusComponentsHandler.go b/factory/status/statusComponentsHandler.go index a307370b6f9..e7cca987745 100644 --- a/factory/status/statusComponentsHandler.go +++ b/factory/status/statusComponentsHandler.go @@ -167,7 +167,7 @@ func (msc *managedStatusComponents) IsInterfaceNil() bool { func (msc *managedStatusComponents) startStatusPolling(ctx context.Context) error { // TODO: inject the context to the AppStatusPolling appStatusPollingHandler, err := appStatusPolling.NewAppStatusPolling( - msc.statusComponentsFactory.coreComponents.StatusHandler(), + msc.statusComponentsFactory.statusCoreComponents.AppStatusHandler(), time.Duration(msc.statusComponentsFactory.config.GeneralSettings.StatusPollingIntervalSec)*time.Second, log, ) @@ -328,7 +328,7 @@ func registerPollProbableHighestNonce( } func (msc *managedStatusComponents) startMachineStatisticsPolling(ctx context.Context) error { - appStatusPollingHandler, err := appStatusPolling.NewAppStatusPolling(msc.statusComponentsFactory.coreComponents.StatusHandler(), time.Second, log) + appStatusPollingHandler, err := appStatusPolling.NewAppStatusPolling(msc.statusComponentsFactory.statusCoreComponents.AppStatusHandler(), time.Second, log) if err != nil { return fmt.Errorf("%w, cannot init AppStatusPolling", err) } diff --git a/factory/status/statusComponentsHandler_test.go b/factory/status/statusComponentsHandler_test.go index 844dcce236d..3f1ba92da42 100644 --- a/factory/status/statusComponentsHandler_test.go +++ b/factory/status/statusComponentsHandler_test.go @@ -6,6 +6,8 @@ import ( "github.com/ElrondNetwork/elrond-go/factory/mock" statusComp "github.com/ElrondNetwork/elrond-go/factory/status" componentsMock "github.com/ElrondNetwork/elrond-go/testscommon/components" + "github.com/ElrondNetwork/elrond-go/testscommon/factory" + "github.com/ElrondNetwork/elrond-go/testscommon/statusHandler" "github.com/stretchr/testify/require" ) @@ -18,14 +20,16 @@ func TestManagedStatusComponents_CreateWithInvalidArgsShouldErr(t *testing.T) { shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) statusArgs, _ := componentsMock.GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator) - coreComponents := componentsMock.GetDefaultCoreComponents() - statusArgs.CoreComponents = coreComponents + statusCoreComponents := &factory.StatusCoreComponentsStub{ + AppStatusHandlerField: &statusHandler.AppStatusHandlerStub{}, + } + statusArgs.StatusCoreComponents = statusCoreComponents statusComponentsFactory, _ := statusComp.NewStatusComponentsFactory(statusArgs) managedStatusComponents, err := statusComp.NewManagedStatusComponents(statusComponentsFactory) require.NoError(t, err) - coreComponents.AppStatusHdl = nil + statusCoreComponents.AppStatusHandlerField = nil err = managedStatusComponents.Create() require.Error(t, err) } diff --git a/factory/statusCore/statusCoreComponents.go b/factory/statusCore/statusCoreComponents.go index 8bc50fd12f0..eb815a457ac 100644 --- a/factory/statusCore/statusCoreComponents.go +++ b/factory/statusCore/statusCoreComponents.go @@ -1,34 +1,86 @@ package statusCore import ( + "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" + logger "github.com/ElrondNetwork/elrond-go-logger" "github.com/ElrondNetwork/elrond-go/common/statistics" "github.com/ElrondNetwork/elrond-go/common/statistics/machine" "github.com/ElrondNetwork/elrond-go/config" + errErd "github.com/ElrondNetwork/elrond-go/errors" "github.com/ElrondNetwork/elrond-go/factory" + "github.com/ElrondNetwork/elrond-go/node/external" + "github.com/ElrondNetwork/elrond-go/node/metrics" + "github.com/ElrondNetwork/elrond-go/statusHandler" + "github.com/ElrondNetwork/elrond-go/statusHandler/persister" ) +var log = logger.GetOrCreate("factory") + // StatusCoreComponentsFactoryArgs holds the arguments needed for creating a status core components factory type StatusCoreComponentsFactoryArgs struct { - Config config.Config + Config config.Config + EpochConfig config.EpochConfig + RoundConfig config.RoundConfig + RatingsConfig config.RatingsConfig + EconomicsConfig config.EconomicsConfig + CoreComp factory.CoreComponentsHolder } // statusCoreComponentsFactory is responsible for creating the status core components type statusCoreComponentsFactory struct { - config config.Config + config config.Config + epochConfig config.EpochConfig + roundConfig config.RoundConfig + ratingsConfig config.RatingsConfig + economicsConfig config.EconomicsConfig + coreComp factory.CoreComponentsHolder } // statusCoreComponents is the DTO used for core components type statusCoreComponents struct { resourceMonitor factory.ResourceMonitor networkStatistics factory.NetworkStatisticsProvider + appStatusHandler core.AppStatusHandler + statusMetrics external.StatusMetricsHandler + persistentHandler factory.PersistenStatusHandler } // NewStatusCoreComponentsFactory initializes the factory which is responsible to creating status core components -func NewStatusCoreComponentsFactory(args StatusCoreComponentsFactoryArgs) *statusCoreComponentsFactory { +func NewStatusCoreComponentsFactory(args StatusCoreComponentsFactoryArgs) (*statusCoreComponentsFactory, error) { + err := checkArgs(args) + if err != nil { + return nil, err + } + return &statusCoreComponentsFactory{ - config: args.Config, + config: args.Config, + epochConfig: args.EpochConfig, + roundConfig: args.RoundConfig, + ratingsConfig: args.RatingsConfig, + economicsConfig: args.EconomicsConfig, + coreComp: args.CoreComp, + }, nil +} + +func checkArgs(args StatusCoreComponentsFactoryArgs) error { + if check.IfNil(args.CoreComp) { + return errErd.ErrNilCoreComponents + } + if check.IfNil(args.CoreComp.EconomicsData()) { + return errErd.ErrNilEconomicsData } + if check.IfNil(args.CoreComp.GenesisNodesSetup()) { + return errErd.ErrNilGenesisNodesSetupHandler + } + if check.IfNil(args.CoreComp.InternalMarshalizer()) { + return errErd.ErrNilMarshalizer + } + if check.IfNil(args.CoreComp.Uint64ByteSliceConverter()) { + return errErd.ErrNilUint64ByteSliceConverter + } + + return nil } // Create creates the status core components @@ -44,9 +96,52 @@ func (sccf *statusCoreComponentsFactory) Create() (*statusCoreComponents, error) resourceMonitor.StartMonitoring() } + var appStatusHandlers []core.AppStatusHandler + var handler core.AppStatusHandler + statusMetrics := statusHandler.NewStatusMetrics() + appStatusHandlers = append(appStatusHandlers, statusMetrics) + + persistentHandler, err := persister.NewPersistentStatusHandler(sccf.coreComp.InternalMarshalizer(), sccf.coreComp.Uint64ByteSliceConverter()) + if err != nil { + return nil, err + } + appStatusHandlers = append(appStatusHandlers, persistentHandler) + if len(appStatusHandlers) > 0 { + handler, err = statusHandler.NewAppStatusFacadeWithHandlers(appStatusHandlers...) + if err != nil { + log.Warn("cannot init AppStatusFacade", "error", err) + } + } else { + handler = statusHandler.NewNilStatusHandler() + log.Debug("no AppStatusHandler used: started with NilStatusHandler") + } + + err = metrics.InitBaseMetrics(handler) + if err != nil { + return nil, err + } + + err = metrics.InitConfigMetrics(handler, sccf.epochConfig, sccf.economicsConfig, sccf.coreComp.GenesisNodesSetup()) + if err != nil { + return nil, err + } + + err = metrics.InitRatingsMetrics(handler, sccf.ratingsConfig) + if err != nil { + return nil, err + } + + err = sccf.coreComp.EconomicsData().SetStatusHandler(handler) + if err != nil { + log.Debug("cannot set status handler to economicsData", "error", err) + } + return &statusCoreComponents{ resourceMonitor: resourceMonitor, networkStatistics: netStats, + appStatusHandler: handler, + statusMetrics: statusMetrics, + persistentHandler: persistentHandler, }, nil } @@ -60,6 +155,9 @@ func (scc *statusCoreComponents) Close() error { if !check.IfNil(scc.resourceMonitor) { errResourceMonitor = scc.resourceMonitor.Close() } + if !check.IfNil(scc.appStatusHandler) { + scc.appStatusHandler.Close() + } if errNetStats != nil { return errNetStats diff --git a/factory/statusCore/statusCoreComponentsHandler.go b/factory/statusCore/statusCoreComponentsHandler.go index 96e8344c4c2..00ccb2177e3 100644 --- a/factory/statusCore/statusCoreComponentsHandler.go +++ b/factory/statusCore/statusCoreComponentsHandler.go @@ -4,9 +4,11 @@ import ( "fmt" "sync" + "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go/errors" "github.com/ElrondNetwork/elrond-go/factory" + "github.com/ElrondNetwork/elrond-go/node/external" ) var _ factory.ComponentHandler = (*managedStatusCoreComponents)(nil) @@ -79,6 +81,15 @@ func (mscc *managedStatusCoreComponents) CheckSubcomponents() error { if check.IfNil(mscc.resourceMonitor) { return errors.ErrNilResourceMonitor } + if check.IfNil(mscc.appStatusHandler) { + return errors.ErrNilAppStatusHandler + } + if check.IfNil(mscc.statusMetrics) { + return errors.ErrNilStatusMetrics + } + if check.IfNil(mscc.persistentHandler) { + return errors.ErrNilPersistentHandler + } return nil } @@ -107,6 +118,42 @@ func (mscc *managedStatusCoreComponents) ResourceMonitor() factory.ResourceMonit return mscc.statusCoreComponents.resourceMonitor } +// AppStatusHandler returns the app status handler instance +func (mscc *managedStatusCoreComponents) AppStatusHandler() core.AppStatusHandler { + mscc.mutCoreComponents.RLock() + defer mscc.mutCoreComponents.RUnlock() + + if mscc.statusCoreComponents == nil { + return nil + } + + return mscc.statusCoreComponents.appStatusHandler +} + +// StatusMetrics returns the status metrics instance +func (mscc *managedStatusCoreComponents) StatusMetrics() external.StatusMetricsHandler { + mscc.mutCoreComponents.RLock() + defer mscc.mutCoreComponents.RUnlock() + + if mscc.statusCoreComponents == nil { + return nil + } + + return mscc.statusCoreComponents.statusMetrics +} + +// PersistentStatusHandler returns the persistent handler instance +func (mscc *managedStatusCoreComponents) PersistentStatusHandler() factory.PersistenStatusHandler { + mscc.mutCoreComponents.RLock() + defer mscc.mutCoreComponents.RUnlock() + + if mscc.statusCoreComponents == nil { + return nil + } + + return mscc.statusCoreComponents.persistentHandler +} + // IsInterfaceNil returns true if there is no value under the interface func (mscc *managedStatusCoreComponents) IsInterfaceNil() bool { return mscc == nil diff --git a/factory/statusCore/statusCoreComponentsHandler_test.go b/factory/statusCore/statusCoreComponentsHandler_test.go index 641edebc9e4..8296a3adc4f 100644 --- a/factory/statusCore/statusCoreComponentsHandler_test.go +++ b/factory/statusCore/statusCoreComponentsHandler_test.go @@ -14,10 +14,11 @@ func TestManagedStatusCoreComponents_CreateWithInvalidArgsShouldErr(t *testing.T t.Skip("this is not a short test") } - args := componentsMock.GetStatusCoreArgs() + args := componentsMock.GetStatusCoreArgs(componentsMock.GetDefaultCoreComponents()) args.Config.ResourceStats.RefreshIntervalInSec = 0 - statusCoreComponentsFactory := statusCore.NewStatusCoreComponentsFactory(args) + statusCoreComponentsFactory, err := statusCore.NewStatusCoreComponentsFactory(args) + require.NoError(t, err) managedStatusCoreComponents, err := statusCore.NewManagedStatusCoreComponents(statusCoreComponentsFactory) require.NoError(t, err) @@ -32,8 +33,9 @@ func TestManagedStatusCoreComponents_CreateShouldWork(t *testing.T) { t.Skip("this is not a short test") } - args := componentsMock.GetStatusCoreArgs() - statusCoreComponentsFactory := statusCore.NewStatusCoreComponentsFactory(args) + args := componentsMock.GetStatusCoreArgs(componentsMock.GetCoreComponents()) + statusCoreComponentsFactory, err := statusCore.NewStatusCoreComponentsFactory(args) + require.NoError(t, err) managedStatusCoreComponents, err := statusCore.NewManagedStatusCoreComponents(statusCoreComponentsFactory) require.NoError(t, err) @@ -53,8 +55,9 @@ func TestManagedCoreComponents_Close(t *testing.T) { t.Skip("this is not a short test") } - args := componentsMock.GetStatusCoreArgs() - statusCoreComponentsFactory := statusCore.NewStatusCoreComponentsFactory(args) + args := componentsMock.GetStatusCoreArgs(componentsMock.GetCoreComponents()) + statusCoreComponentsFactory, err := statusCore.NewStatusCoreComponentsFactory(args) + require.NoError(t, err) managedStatusCoreComponents, err := statusCore.NewManagedStatusCoreComponents(statusCoreComponentsFactory) require.NoError(t, err) diff --git a/factory/statusCore/statusCoreComponents_test.go b/factory/statusCore/statusCoreComponents_test.go index a7d27eab044..cb58d54fe98 100644 --- a/factory/statusCore/statusCoreComponents_test.go +++ b/factory/statusCore/statusCoreComponents_test.go @@ -6,21 +6,92 @@ import ( "github.com/ElrondNetwork/elrond-go/common/statistics" "github.com/ElrondNetwork/elrond-go/config" + errErd "github.com/ElrondNetwork/elrond-go/errors" "github.com/ElrondNetwork/elrond-go/factory/statusCore" + "github.com/ElrondNetwork/elrond-go/integrationTests/mock" + "github.com/ElrondNetwork/elrond-go/testscommon" componentsMock "github.com/ElrondNetwork/elrond-go/testscommon/components" + "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) -func TestNewStatusCoreComponentsFactory_OkValuesShouldWork(t *testing.T) { +func TestNewStatusCoreComponentsFactory(t *testing.T) { t.Parallel() if testing.Short() { t.Skip("this is not a short test") } - args := componentsMock.GetStatusCoreArgs() - sccf := statusCore.NewStatusCoreComponentsFactory(args) + t.Run("nil core components should error", func(t *testing.T) { + t.Parallel() - require.NotNil(t, sccf) + args := componentsMock.GetStatusCoreArgs(nil) + sccf, err := statusCore.NewStatusCoreComponentsFactory(args) + assert.Equal(t, errErd.ErrNilCoreComponents, err) + require.Nil(t, sccf) + }) + t.Run("nil economics data should error", func(t *testing.T) { + t.Parallel() + + coreComp := &mock.CoreComponentsStub{ + EconomicsDataField: nil, + } + + args := componentsMock.GetStatusCoreArgs(coreComp) + sccf, err := statusCore.NewStatusCoreComponentsFactory(args) + assert.Equal(t, errErd.ErrNilEconomicsData, err) + require.Nil(t, sccf) + }) + t.Run("nil genesis node setup should error", func(t *testing.T) { + t.Parallel() + + coreComp := &mock.CoreComponentsStub{ + EconomicsDataField: &economicsmocks.EconomicsHandlerStub{}, + GenesisNodesSetupField: nil, + } + + args := componentsMock.GetStatusCoreArgs(coreComp) + sccf, err := statusCore.NewStatusCoreComponentsFactory(args) + assert.Equal(t, errErd.ErrNilGenesisNodesSetupHandler, err) + require.Nil(t, sccf) + }) + t.Run("nil marshaller should error", func(t *testing.T) { + t.Parallel() + + coreComp := &mock.CoreComponentsStub{ + EconomicsDataField: &economicsmocks.EconomicsHandlerStub{}, + GenesisNodesSetupField: &testscommon.NodesSetupStub{}, + InternalMarshalizerField: nil, + } + + args := componentsMock.GetStatusCoreArgs(coreComp) + sccf, err := statusCore.NewStatusCoreComponentsFactory(args) + assert.Equal(t, errErd.ErrNilMarshalizer, err) + require.Nil(t, sccf) + }) + t.Run("nil slice converter should error", func(t *testing.T) { + t.Parallel() + + coreComp := &mock.CoreComponentsStub{ + EconomicsDataField: &economicsmocks.EconomicsHandlerStub{}, + GenesisNodesSetupField: &testscommon.NodesSetupStub{}, + InternalMarshalizerField: &testscommon.MarshalizerStub{}, + Uint64ByteSliceConverterField: nil, + } + + args := componentsMock.GetStatusCoreArgs(coreComp) + sccf, err := statusCore.NewStatusCoreComponentsFactory(args) + assert.Equal(t, errErd.ErrNilUint64ByteSliceConverter, err) + require.Nil(t, sccf) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + args := componentsMock.GetStatusCoreArgs(componentsMock.GetCoreComponents()) + sccf, err := statusCore.NewStatusCoreComponentsFactory(args) + assert.Nil(t, err) + require.NotNil(t, sccf) + }) } func TestStatusCoreComponentsFactory_InvalidValueShouldErr(t *testing.T) { @@ -29,13 +100,14 @@ func TestStatusCoreComponentsFactory_InvalidValueShouldErr(t *testing.T) { t.Skip("this is not a short test") } - args := componentsMock.GetStatusCoreArgs() + args := componentsMock.GetStatusCoreArgs(componentsMock.GetCoreComponents()) args.Config = config.Config{ ResourceStats: config.ResourceStatsConfig{ RefreshIntervalInSec: 0, }, } - sccf := statusCore.NewStatusCoreComponentsFactory(args) + sccf, err := statusCore.NewStatusCoreComponentsFactory(args) + require.Nil(t, err) cc, err := sccf.Create() require.Nil(t, cc) @@ -48,8 +120,9 @@ func TestStatusCoreComponentsFactory_CreateStatusCoreComponentsShouldWork(t *tes t.Skip("this is not a short test") } - args := componentsMock.GetStatusCoreArgs() - sccf := statusCore.NewStatusCoreComponentsFactory(args) + args := componentsMock.GetStatusCoreArgs(componentsMock.GetCoreComponents()) + sccf, err := statusCore.NewStatusCoreComponentsFactory(args) + require.Nil(t, err) cc, err := sccf.Create() require.NoError(t, err) @@ -63,8 +136,9 @@ func TestStatusCoreComponents_CloseShouldWork(t *testing.T) { t.Skip("this is not a short test") } - args := componentsMock.GetStatusCoreArgs() - sccf := statusCore.NewStatusCoreComponentsFactory(args) + args := componentsMock.GetStatusCoreArgs(componentsMock.GetCoreComponents()) + sccf, err := statusCore.NewStatusCoreComponentsFactory(args) + require.Nil(t, err) cc, err := sccf.Create() require.NoError(t, err) diff --git a/integrationTests/consensus/consensus_test.go b/integrationTests/consensus/consensus_test.go index a95acfb73fd..74f734034a8 100644 --- a/integrationTests/consensus/consensus_test.go +++ b/integrationTests/consensus/consensus_test.go @@ -130,16 +130,17 @@ func startNodesWithCommitBlock(nodes []*integrationTests.TestConsensusNode, mute SyncProcessTimeInMillis: 6000, }, }, - BootstrapRoundIndex: 0, - CoreComponents: n.Node.GetCoreComponents(), - NetworkComponents: n.Node.GetNetworkComponents(), - CryptoComponents: n.Node.GetCryptoComponents(), - DataComponents: n.Node.GetDataComponents(), - ProcessComponents: n.Node.GetProcessComponents(), - StateComponents: n.Node.GetStateComponents(), - StatusComponents: statusComponents, - ScheduledProcessor: &consensusMocks.ScheduledProcessorStub{}, - IsInImportMode: n.Node.IsInImportMode(), + BootstrapRoundIndex: 0, + CoreComponents: n.Node.GetCoreComponents(), + NetworkComponents: n.Node.GetNetworkComponents(), + CryptoComponents: n.Node.GetCryptoComponents(), + DataComponents: n.Node.GetDataComponents(), + ProcessComponents: n.Node.GetProcessComponents(), + StateComponents: n.Node.GetStateComponents(), + StatusComponents: statusComponents, + StatusCoreComponents: n.Node.GetStatusCoreComponents(), + ScheduledProcessor: &consensusMocks.ScheduledProcessorStub{}, + IsInImportMode: n.Node.IsInImportMode(), } consensusFactory, err := consensusComp.NewConsensusComponentsFactory(consensusArgs) diff --git a/integrationTests/factory/bootstrapComponents/bootstrapComponents_test.go b/integrationTests/factory/bootstrapComponents/bootstrapComponents_test.go index 3a41ba49585..f10bc8004db 100644 --- a/integrationTests/factory/bootstrapComponents/bootstrapComponents_test.go +++ b/integrationTests/factory/bootstrapComponents/bootstrapComponents_test.go @@ -31,11 +31,13 @@ func TestBootstrapComponents_Create_Close_ShouldWork(t *testing.T) { require.Nil(t, err) managedCoreComponents, err := nr.CreateManagedCoreComponents(chanStopNodeProcess) require.Nil(t, err) + managedStatusCoreComponents, err := nr.CreateManagedStatusCoreComponents(managedCoreComponents) + require.Nil(t, err) managedCryptoComponents, err := nr.CreateManagedCryptoComponents(managedCoreComponents) require.Nil(t, err) - managedNetworkComponents, err := nr.CreateManagedNetworkComponents(managedCoreComponents) + managedNetworkComponents, err := nr.CreateManagedNetworkComponents(managedCoreComponents, managedStatusCoreComponents) require.Nil(t, err) - managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedCoreComponents, managedCryptoComponents, managedNetworkComponents) + managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedCoreComponents, managedCryptoComponents, managedNetworkComponents, managedStatusCoreComponents) require.Nil(t, err) require.NotNil(t, managedBootstrapComponents) @@ -47,6 +49,8 @@ func TestBootstrapComponents_Create_Close_ShouldWork(t *testing.T) { require.Nil(t, err) err = managedCryptoComponents.Close() require.Nil(t, err) + err = managedStatusCoreComponents.Close() + require.Nil(t, err) err = managedCoreComponents.Close() require.Nil(t, err) diff --git a/integrationTests/factory/consensusComponents/consensusComponents_test.go b/integrationTests/factory/consensusComponents/consensusComponents_test.go index e3656372eb1..91dcba934f6 100644 --- a/integrationTests/factory/consensusComponents/consensusComponents_test.go +++ b/integrationTests/factory/consensusComponents/consensusComponents_test.go @@ -32,19 +32,19 @@ func TestConsensusComponents_Close_ShouldWork(t *testing.T) { chanStopNodeProcess := make(chan endProcess.ArgEndProcess) nr, err := node.NewNodeRunner(configs) require.Nil(t, err) - managedStatusCoreComponents, err := nr.CreateManagedStatusCoreComponents() - require.Nil(t, err) managedCoreComponents, err := nr.CreateManagedCoreComponents(chanStopNodeProcess) require.Nil(t, err) + managedStatusCoreComponents, err := nr.CreateManagedStatusCoreComponents(managedCoreComponents) + require.Nil(t, err) managedCryptoComponents, err := nr.CreateManagedCryptoComponents(managedCoreComponents) require.Nil(t, err) - managedNetworkComponents, err := nr.CreateManagedNetworkComponents(managedCoreComponents) + managedNetworkComponents, err := nr.CreateManagedNetworkComponents(managedCoreComponents, managedStatusCoreComponents) require.Nil(t, err) - managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedCoreComponents, managedCryptoComponents, managedNetworkComponents) + managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedCoreComponents, managedCryptoComponents, managedNetworkComponents, managedStatusCoreComponents) require.Nil(t, err) - managedDataComponents, err := nr.CreateManagedDataComponents(managedCoreComponents, managedBootstrapComponents) + managedDataComponents, err := nr.CreateManagedDataComponents(managedStatusCoreComponents, managedCoreComponents, managedBootstrapComponents) require.Nil(t, err) - managedStateComponents, err := nr.CreateManagedStateComponents(managedCoreComponents, managedBootstrapComponents, managedDataComponents) + managedStateComponents, err := nr.CreateManagedStateComponents(managedCoreComponents, managedBootstrapComponents, managedDataComponents, managedStatusCoreComponents) require.Nil(t, err) nodesShufflerOut, err := bootstrapComp.CreateNodesShuffleOut(managedCoreComponents.GenesisNodesSetup(), configs.GeneralConfig.EpochStartConfig, managedCoreComponents.ChanStopNodeProcess()) require.Nil(t, err) @@ -99,6 +99,7 @@ func TestConsensusComponents_Close_ShouldWork(t *testing.T) { managedStateComponents, managedDataComponents, managedStatusComponents, + managedStatusCoreComponents, gasScheduleNotifier, nodesCoordinator, ) @@ -117,6 +118,7 @@ func TestConsensusComponents_Close_ShouldWork(t *testing.T) { managedStateComponents, managedStatusComponents, managedProcessComponents, + managedStatusCoreComponents, ) require.Nil(t, err) require.NotNil(t, managedConsensusComponents) @@ -139,10 +141,10 @@ func TestConsensusComponents_Close_ShouldWork(t *testing.T) { require.Nil(t, err) err = managedCryptoComponents.Close() require.Nil(t, err) - err = managedCoreComponents.Close() - require.Nil(t, err) err = managedStatusCoreComponents.Close() require.Nil(t, err) + err = managedCoreComponents.Close() + require.Nil(t, err) time.Sleep(5 * time.Second) diff --git a/integrationTests/factory/dataComponents/dataComponents_test.go b/integrationTests/factory/dataComponents/dataComponents_test.go index 4db17ae017e..e9cb5bad291 100644 --- a/integrationTests/factory/dataComponents/dataComponents_test.go +++ b/integrationTests/factory/dataComponents/dataComponents_test.go @@ -27,13 +27,15 @@ func TestDataComponents_Create_Close_ShouldWork(t *testing.T) { managedCoreComponents, err := nr.CreateManagedCoreComponents(chanStopNodeProcess) require.Nil(t, err) + managedStatusCoreComponents, err := nr.CreateManagedStatusCoreComponents(managedCoreComponents) + require.Nil(t, err) managedCryptoComponents, err := nr.CreateManagedCryptoComponents(managedCoreComponents) require.Nil(t, err) - managedNetworkComponents, err := nr.CreateManagedNetworkComponents(managedCoreComponents) + managedNetworkComponents, err := nr.CreateManagedNetworkComponents(managedCoreComponents, managedStatusCoreComponents) require.Nil(t, err) - managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedCoreComponents, managedCryptoComponents, managedNetworkComponents) + managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedCoreComponents, managedCryptoComponents, managedNetworkComponents, managedStatusCoreComponents) require.Nil(t, err) - managedDataComponents, err := nr.CreateManagedDataComponents(managedCoreComponents, managedBootstrapComponents) + managedDataComponents, err := nr.CreateManagedDataComponents(managedStatusCoreComponents, managedCoreComponents, managedBootstrapComponents) require.Nil(t, err) require.NotNil(t, managedDataComponents) @@ -47,6 +49,8 @@ func TestDataComponents_Create_Close_ShouldWork(t *testing.T) { require.Nil(t, err) err = managedCryptoComponents.Close() require.Nil(t, err) + err = managedStatusCoreComponents.Close() + require.Nil(t, err) err = managedCoreComponents.Close() require.Nil(t, err) diff --git a/integrationTests/factory/heartbeatComponents/heartbeatComponents_test.go b/integrationTests/factory/heartbeatComponents/heartbeatComponents_test.go index 9f8e945b2fc..89a10793c6c 100644 --- a/integrationTests/factory/heartbeatComponents/heartbeatComponents_test.go +++ b/integrationTests/factory/heartbeatComponents/heartbeatComponents_test.go @@ -32,19 +32,19 @@ func TestHeartbeatComponents_Close_ShouldWork(t *testing.T) { chanStopNodeProcess := make(chan endProcess.ArgEndProcess) nr, err := node.NewNodeRunner(configs) require.Nil(t, err) - managedStatusCoreComponents, err := nr.CreateManagedStatusCoreComponents() - require.Nil(t, err) managedCoreComponents, err := nr.CreateManagedCoreComponents(chanStopNodeProcess) require.Nil(t, err) + managedStatusCoreComponents, err := nr.CreateManagedStatusCoreComponents(managedCoreComponents) + require.Nil(t, err) managedCryptoComponents, err := nr.CreateManagedCryptoComponents(managedCoreComponents) require.Nil(t, err) - managedNetworkComponents, err := nr.CreateManagedNetworkComponents(managedCoreComponents) + managedNetworkComponents, err := nr.CreateManagedNetworkComponents(managedCoreComponents, managedStatusCoreComponents) require.Nil(t, err) - managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedCoreComponents, managedCryptoComponents, managedNetworkComponents) + managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedCoreComponents, managedCryptoComponents, managedNetworkComponents, managedStatusCoreComponents) require.Nil(t, err) - managedDataComponents, err := nr.CreateManagedDataComponents(managedCoreComponents, managedBootstrapComponents) + managedDataComponents, err := nr.CreateManagedDataComponents(managedStatusCoreComponents, managedCoreComponents, managedBootstrapComponents) require.Nil(t, err) - managedStateComponents, err := nr.CreateManagedStateComponents(managedCoreComponents, managedBootstrapComponents, managedDataComponents) + managedStateComponents, err := nr.CreateManagedStateComponents(managedCoreComponents, managedBootstrapComponents, managedDataComponents, managedStatusCoreComponents) require.Nil(t, err) nodesShufflerOut, err := bootstrapComp.CreateNodesShuffleOut(managedCoreComponents.GenesisNodesSetup(), configs.GeneralConfig.EpochStartConfig, managedCoreComponents.ChanStopNodeProcess()) require.Nil(t, err) @@ -99,6 +99,7 @@ func TestHeartbeatComponents_Close_ShouldWork(t *testing.T) { managedStateComponents, managedDataComponents, managedStatusComponents, + managedStatusCoreComponents, gasScheduleNotifier, nodesCoordinator, ) @@ -109,7 +110,14 @@ func TestHeartbeatComponents_Close_ShouldWork(t *testing.T) { err = managedStatusComponents.StartPolling() require.Nil(t, err) - managedHeartbeatComponents, err := nr.CreateManagedHeartbeatV2Components(managedBootstrapComponents, managedCoreComponents, managedNetworkComponents, managedCryptoComponents, managedDataComponents, managedProcessComponents) + managedHeartbeatComponents, err := nr.CreateManagedHeartbeatV2Components( + managedBootstrapComponents, + managedCoreComponents, + managedNetworkComponents, + managedCryptoComponents, + managedDataComponents, + managedProcessComponents, + managedStatusCoreComponents) require.Nil(t, err) require.NotNil(t, managedHeartbeatComponents) @@ -131,10 +139,10 @@ func TestHeartbeatComponents_Close_ShouldWork(t *testing.T) { require.Nil(t, err) err = managedCryptoComponents.Close() require.Nil(t, err) - err = managedCoreComponents.Close() - require.Nil(t, err) err = managedStatusCoreComponents.Close() require.Nil(t, err) + err = managedCoreComponents.Close() + require.Nil(t, err) time.Sleep(5 * time.Second) diff --git a/integrationTests/factory/networkComponents/networkComponents_test.go b/integrationTests/factory/networkComponents/networkComponents_test.go index f62b20b4245..c0d53e6133c 100644 --- a/integrationTests/factory/networkComponents/networkComponents_test.go +++ b/integrationTests/factory/networkComponents/networkComponents_test.go @@ -32,9 +32,11 @@ func TestNetworkComponents_Create_Close_ShouldWork(t *testing.T) { managedCoreComponents, err := nr.CreateManagedCoreComponents(chanStopNodeProcess) require.Nil(t, err) + managedStatusCoreComponents, err := nr.CreateManagedStatusCoreComponents(managedCoreComponents) + require.Nil(t, err) managedCryptoComponents, err := nr.CreateManagedCryptoComponents(managedCoreComponents) require.Nil(t, err) - managedNetworkComponents, err := nr.CreateManagedNetworkComponents(managedCoreComponents) + managedNetworkComponents, err := nr.CreateManagedNetworkComponents(managedCoreComponents, managedStatusCoreComponents) require.Nil(t, err) require.NotNil(t, managedNetworkComponents) @@ -44,6 +46,8 @@ func TestNetworkComponents_Create_Close_ShouldWork(t *testing.T) { require.Nil(t, err) err = managedCryptoComponents.Close() require.Nil(t, err) + err = managedStatusCoreComponents.Close() + require.Nil(t, err) err = managedCoreComponents.Close() require.Nil(t, err) diff --git a/integrationTests/factory/processComponents/processComponents_test.go b/integrationTests/factory/processComponents/processComponents_test.go index 09b6ba923c0..af7b4d295cc 100644 --- a/integrationTests/factory/processComponents/processComponents_test.go +++ b/integrationTests/factory/processComponents/processComponents_test.go @@ -33,19 +33,19 @@ func TestProcessComponents_Close_ShouldWork(t *testing.T) { nr, err := node.NewNodeRunner(configs) require.Nil(t, err) - managedStatusCoreComponents, err := nr.CreateManagedStatusCoreComponents() - require.Nil(t, err) managedCoreComponents, err := nr.CreateManagedCoreComponents(chanStopNodeProcess) require.Nil(t, err) + managedStatusCoreComponents, err := nr.CreateManagedStatusCoreComponents(managedCoreComponents) + require.Nil(t, err) managedCryptoComponents, err := nr.CreateManagedCryptoComponents(managedCoreComponents) require.Nil(t, err) - managedNetworkComponents, err := nr.CreateManagedNetworkComponents(managedCoreComponents) + managedNetworkComponents, err := nr.CreateManagedNetworkComponents(managedCoreComponents, managedStatusCoreComponents) require.Nil(t, err) - managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedCoreComponents, managedCryptoComponents, managedNetworkComponents) + managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedCoreComponents, managedCryptoComponents, managedNetworkComponents, managedStatusCoreComponents) require.Nil(t, err) - managedDataComponents, err := nr.CreateManagedDataComponents(managedCoreComponents, managedBootstrapComponents) + managedDataComponents, err := nr.CreateManagedDataComponents(managedStatusCoreComponents, managedCoreComponents, managedBootstrapComponents) require.Nil(t, err) - managedStateComponents, err := nr.CreateManagedStateComponents(managedCoreComponents, managedBootstrapComponents, managedDataComponents) + managedStateComponents, err := nr.CreateManagedStateComponents(managedCoreComponents, managedBootstrapComponents, managedDataComponents, managedStatusCoreComponents) require.Nil(t, err) nodesShufflerOut, err := bootstrapComp.CreateNodesShuffleOut(managedCoreComponents.GenesisNodesSetup(), configs.GeneralConfig.EpochStartConfig, managedCoreComponents.ChanStopNodeProcess()) require.Nil(t, err) @@ -98,6 +98,7 @@ func TestProcessComponents_Close_ShouldWork(t *testing.T) { managedStateComponents, managedDataComponents, managedStatusComponents, + managedStatusCoreComponents, gasScheduleNotifier, nodesCoordinator, ) @@ -126,10 +127,10 @@ func TestProcessComponents_Close_ShouldWork(t *testing.T) { require.Nil(t, err) err = managedCryptoComponents.Close() require.Nil(t, err) - err = managedCoreComponents.Close() - require.Nil(t, err) err = managedStatusCoreComponents.Close() require.Nil(t, err) + err = managedCoreComponents.Close() + require.Nil(t, err) time.Sleep(5 * time.Second) diff --git a/integrationTests/factory/stateComponents/stateComponents_test.go b/integrationTests/factory/stateComponents/stateComponents_test.go index 5adc8f04ac0..6f129f7913c 100644 --- a/integrationTests/factory/stateComponents/stateComponents_test.go +++ b/integrationTests/factory/stateComponents/stateComponents_test.go @@ -31,15 +31,17 @@ func TestStateComponents_Create_Close_ShouldWork(t *testing.T) { managedCoreComponents, err := nr.CreateManagedCoreComponents(chanStopNodeProcess) require.Nil(t, err) + managedStatusCoreComponents, err := nr.CreateManagedStatusCoreComponents(managedCoreComponents) + require.Nil(t, err) managedCryptoComponents, err := nr.CreateManagedCryptoComponents(managedCoreComponents) require.Nil(t, err) - managedNetworkComponents, err := nr.CreateManagedNetworkComponents(managedCoreComponents) + managedNetworkComponents, err := nr.CreateManagedNetworkComponents(managedCoreComponents, managedStatusCoreComponents) require.Nil(t, err) - managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedCoreComponents, managedCryptoComponents, managedNetworkComponents) + managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedCoreComponents, managedCryptoComponents, managedNetworkComponents, managedStatusCoreComponents) require.Nil(t, err) - managedDataComponents, err := nr.CreateManagedDataComponents(managedCoreComponents, managedBootstrapComponents) + managedDataComponents, err := nr.CreateManagedDataComponents(managedStatusCoreComponents, managedCoreComponents, managedBootstrapComponents) require.Nil(t, err) - managedStateComponents, err := nr.CreateManagedStateComponents(managedCoreComponents, managedBootstrapComponents, managedDataComponents) + managedStateComponents, err := nr.CreateManagedStateComponents(managedCoreComponents, managedBootstrapComponents, managedDataComponents, managedStatusCoreComponents) require.Nil(t, err) require.NotNil(t, managedStateComponents) @@ -55,6 +57,8 @@ func TestStateComponents_Create_Close_ShouldWork(t *testing.T) { require.Nil(t, err) err = managedCryptoComponents.Close() require.Nil(t, err) + err = managedStatusCoreComponents.Close() + require.Nil(t, err) err = managedCoreComponents.Close() require.Nil(t, err) diff --git a/integrationTests/factory/statusComponents/statusComponents_test.go b/integrationTests/factory/statusComponents/statusComponents_test.go index c8e7f4bec5c..a8d6bac460a 100644 --- a/integrationTests/factory/statusComponents/statusComponents_test.go +++ b/integrationTests/factory/statusComponents/statusComponents_test.go @@ -33,19 +33,19 @@ func TestStatusComponents_Create_Close_ShouldWork(t *testing.T) { nr, err := node.NewNodeRunner(configs) require.Nil(t, err) - managedStatusCoreComponents, err := nr.CreateManagedStatusCoreComponents() - require.Nil(t, err) managedCoreComponents, err := nr.CreateManagedCoreComponents(chanStopNodeProcess) require.Nil(t, err) + managedStatusCoreComponents, err := nr.CreateManagedStatusCoreComponents(managedCoreComponents) + require.Nil(t, err) managedCryptoComponents, err := nr.CreateManagedCryptoComponents(managedCoreComponents) require.Nil(t, err) - managedNetworkComponents, err := nr.CreateManagedNetworkComponents(managedCoreComponents) + managedNetworkComponents, err := nr.CreateManagedNetworkComponents(managedCoreComponents, managedStatusCoreComponents) require.Nil(t, err) - managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedCoreComponents, managedCryptoComponents, managedNetworkComponents) + managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedCoreComponents, managedCryptoComponents, managedNetworkComponents, managedStatusCoreComponents) require.Nil(t, err) - managedDataComponents, err := nr.CreateManagedDataComponents(managedCoreComponents, managedBootstrapComponents) + managedDataComponents, err := nr.CreateManagedDataComponents(managedStatusCoreComponents, managedCoreComponents, managedBootstrapComponents) require.Nil(t, err) - managedStateComponents, err := nr.CreateManagedStateComponents(managedCoreComponents, managedBootstrapComponents, managedDataComponents) + managedStateComponents, err := nr.CreateManagedStateComponents(managedCoreComponents, managedBootstrapComponents, managedDataComponents, managedStatusCoreComponents) require.Nil(t, err) nodesShufflerOut, err := bootstrapComp.CreateNodesShuffleOut(managedCoreComponents.GenesisNodesSetup(), configs.GeneralConfig.EpochStartConfig, managedCoreComponents.ChanStopNodeProcess()) require.Nil(t, err) @@ -100,6 +100,7 @@ func TestStatusComponents_Create_Close_ShouldWork(t *testing.T) { managedStateComponents, managedDataComponents, managedStatusComponents, + managedStatusCoreComponents, gasScheduleNotifier, nodesCoordinator, ) @@ -126,10 +127,10 @@ func TestStatusComponents_Create_Close_ShouldWork(t *testing.T) { require.Nil(t, err) err = managedCryptoComponents.Close() require.Nil(t, err) - err = managedCoreComponents.Close() - require.Nil(t, err) err = managedStatusCoreComponents.Close() require.Nil(t, err) + err = managedCoreComponents.Close() + require.Nil(t, err) time.Sleep(5 * time.Second) diff --git a/integrationTests/factory/statusCoreComponents/statusCoreComponents_test.go b/integrationTests/factory/statusCoreComponents/statusCoreComponents_test.go index 94709366d75..be23d134ff7 100644 --- a/integrationTests/factory/statusCoreComponents/statusCoreComponents_test.go +++ b/integrationTests/factory/statusCoreComponents/statusCoreComponents_test.go @@ -5,6 +5,7 @@ import ( "testing" "time" + "github.com/ElrondNetwork/elrond-go-core/data/endProcess" "github.com/ElrondNetwork/elrond-go/integrationTests/factory" "github.com/ElrondNetwork/elrond-go/node" "github.com/ElrondNetwork/elrond-go/testscommon/goroutines" @@ -25,9 +26,14 @@ func TestStatusCoreComponents_CreateCloseShouldWork(t *testing.T) { factory.PrintStack() configs := factory.CreateDefaultConfig() + chanStopNodeProcess := make(chan endProcess.ArgEndProcess) + nr, err := node.NewNodeRunner(configs) require.Nil(t, err) - statusCoreComponents, err := nr.CreateManagedStatusCoreComponents() + + managedCoreComponents, err := nr.CreateManagedCoreComponents(chanStopNodeProcess) + require.Nil(t, err) + statusCoreComponents, err := nr.CreateManagedStatusCoreComponents(managedCoreComponents) require.Nil(t, err) require.NotNil(t, statusCoreComponents) @@ -35,6 +41,8 @@ func TestStatusCoreComponents_CreateCloseShouldWork(t *testing.T) { err = statusCoreComponents.Close() require.Nil(t, err) + err = managedCoreComponents.Close() + require.Nil(t, err) time.Sleep(2 * time.Second) diff --git a/integrationTests/mock/coreComponentsStub.go b/integrationTests/mock/coreComponentsStub.go index 2658da08516..7c119c3189d 100644 --- a/integrationTests/mock/coreComponentsStub.go +++ b/integrationTests/mock/coreComponentsStub.go @@ -8,7 +8,6 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/typeConverters" "github.com/ElrondNetwork/elrond-go-core/hashing" "github.com/ElrondNetwork/elrond-go-core/marshal" - nodeFactory "github.com/ElrondNetwork/elrond-go/cmd/node/factory" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/consensus" "github.com/ElrondNetwork/elrond-go/factory" @@ -32,7 +31,6 @@ type CoreComponentsStub struct { PathHandlerField storage.PathManagerHandler ChainIdCalled func() string MinTransactionVersionCalled func() uint32 - StatusHandlerUtilsField nodeFactory.StatusHandlersUtils StatusHandlerField core.AppStatusHandler WatchdogField core.WatchdogTimer AlarmSchedulerField core.TimersScheduler @@ -77,16 +75,6 @@ func (ccs *CoreComponentsStub) VmMarshalizer() marshal.Marshalizer { return ccs.VmMarshalizerField } -// StatusHandlerUtils - -func (ccs *CoreComponentsStub) StatusHandlerUtils() nodeFactory.StatusHandlersUtils { - return ccs.StatusHandlerUtilsField -} - -// StatusHandler - -func (ccs *CoreComponentsStub) StatusHandler() core.AppStatusHandler { - return ccs.StatusHandlerField -} - // Watchdog - func (ccs *CoreComponentsStub) Watchdog() core.WatchdogTimer { return ccs.WatchdogField diff --git a/integrationTests/multiShard/hardFork/hardFork_test.go b/integrationTests/multiShard/hardFork/hardFork_test.go index 5495ce75e24..2217c2e4521 100644 --- a/integrationTests/multiShard/hardFork/hardFork_test.go +++ b/integrationTests/multiShard/hardFork/hardFork_test.go @@ -22,7 +22,9 @@ import ( vmFactory "github.com/ElrondNetwork/elrond-go/process/factory" "github.com/ElrondNetwork/elrond-go/state" "github.com/ElrondNetwork/elrond-go/testscommon/cryptoMocks" + factoryTests "github.com/ElrondNetwork/elrond-go/testscommon/factory" "github.com/ElrondNetwork/elrond-go/testscommon/genesisMocks" + "github.com/ElrondNetwork/elrond-go/testscommon/statusHandler" "github.com/ElrondNetwork/elrond-go/update/factory" "github.com/ElrondNetwork/elrond-go/vm/systemSmartContracts/defaults" arwenConfig "github.com/ElrondNetwork/wasm-vm-v1_4/config" @@ -569,17 +571,22 @@ func createHardForkExporter( cryptoComponents.BlKeyGen = node.OwnAccount.KeygenBlockSign cryptoComponents.TxKeyGen = node.OwnAccount.KeygenTxSign + statusCoreComponents := &factoryTests.StatusCoreComponentsStub{ + AppStatusHandlerField: &statusHandler.AppStatusHandlerStub{}, + } + argsExportHandler := factory.ArgsExporter{ - CoreComponents: coreComponents, - CryptoComponents: cryptoComponents, - HeaderValidator: node.HeaderValidator, - DataPool: node.DataPool, - StorageService: node.Storage, - RequestHandler: node.RequestHandler, - ShardCoordinator: node.ShardCoordinator, - Messenger: node.Messenger, - ActiveAccountsDBs: accountsDBs, - ExportFolder: node.ExportFolder, + CoreComponents: coreComponents, + CryptoComponents: cryptoComponents, + StatusCoreComponents: statusCoreComponents, + HeaderValidator: node.HeaderValidator, + DataPool: node.DataPool, + StorageService: node.Storage, + RequestHandler: node.RequestHandler, + ShardCoordinator: node.ShardCoordinator, + Messenger: node.Messenger, + ActiveAccountsDBs: accountsDBs, + ExportFolder: node.ExportFolder, ExportTriesStorageConfig: config.StorageConfig{ Cache: config.CacheConfig{ Capacity: 10000, diff --git a/integrationTests/testConsensusNode.go b/integrationTests/testConsensusNode.go index 0c6570100c2..17b727f410b 100644 --- a/integrationTests/testConsensusNode.go +++ b/integrationTests/testConsensusNode.go @@ -35,6 +35,7 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/ElrondNetwork/elrond-go/testscommon/cryptoMocks" dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" + factory2 "github.com/ElrondNetwork/elrond-go/testscommon/factory" "github.com/ElrondNetwork/elrond-go/testscommon/nodeTypeProviderMock" "github.com/ElrondNetwork/elrond-go/testscommon/shardingMocks" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" @@ -247,9 +248,14 @@ func (tcn *TestConsensusNode) initNode( networkComponents.InputAntiFlood = &mock.NilAntifloodHandler{} networkComponents.PeerHonesty = &mock.PeerHonestyHandlerStub{} + statusCoreComponents := &factory2.StatusCoreComponentsStub{ + AppStatusHandlerField: &statusHandlerMock.AppStatusHandlerStub{}, + } + var err error tcn.Node, err = node.NewNode( node.WithCoreComponents(coreComponents), + node.WithStatusCoreComponents(statusCoreComponents), node.WithCryptoComponents(cryptoComponents), node.WithProcessComponents(processComponents), node.WithDataComponents(dataComponents), diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index e10e6a5ce99..05a4cb64533 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -100,6 +100,7 @@ import ( dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" dblookupextMock "github.com/ElrondNetwork/elrond-go/testscommon/dblookupext" "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" + factory2 "github.com/ElrondNetwork/elrond-go/testscommon/factory" "github.com/ElrondNetwork/elrond-go/testscommon/genesisMocks" "github.com/ElrondNetwork/elrond-go/testscommon/mainFactoryMocks" "github.com/ElrondNetwork/elrond-go/testscommon/p2pmocks" @@ -1933,19 +1934,24 @@ func (tpn *TestProcessorNode) initBlockProcessor(stateCheckpointModulus uint) { }, } + statusCoreComponents := &factory2.StatusCoreComponentsStub{ + AppStatusHandlerField: &statusHandlerMock.AppStatusHandlerStub{}, + } + argumentsBase := block.ArgBaseProcessor{ - CoreComponents: coreComponents, - DataComponents: dataComponents, - BootstrapComponents: bootstrapComponents, - StatusComponents: statusComponents, - Config: triesConfig, - AccountsDB: accountsDb, - ForkDetector: tpn.ForkDetector, - NodesCoordinator: tpn.NodesCoordinator, - FeeHandler: tpn.FeeAccumulator, - RequestHandler: tpn.RequestHandler, - BlockChainHook: tpn.BlockchainHook, - HeaderValidator: tpn.HeaderValidator, + CoreComponents: coreComponents, + DataComponents: dataComponents, + BootstrapComponents: bootstrapComponents, + StatusComponents: statusComponents, + StatusCoreComponents: statusCoreComponents, + Config: triesConfig, + AccountsDB: accountsDb, + ForkDetector: tpn.ForkDetector, + NodesCoordinator: tpn.NodesCoordinator, + FeeHandler: tpn.FeeAccumulator, + RequestHandler: tpn.RequestHandler, + BlockChainHook: tpn.BlockchainHook, + HeaderValidator: tpn.HeaderValidator, BootStorer: &mock.BoostrapStorerMock{ PutCalled: func(round int64, bootData bootstrapStorage.BootstrapData) error { return nil diff --git a/integrationTests/testSyncNode.go b/integrationTests/testSyncNode.go index 054d2e4e9a8..5600495dda7 100644 --- a/integrationTests/testSyncNode.go +++ b/integrationTests/testSyncNode.go @@ -14,6 +14,8 @@ import ( "github.com/ElrondNetwork/elrond-go/state" "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/ElrondNetwork/elrond-go/testscommon/dblookupext" + "github.com/ElrondNetwork/elrond-go/testscommon/factory" + statusHandlerMock "github.com/ElrondNetwork/elrond-go/testscommon/statusHandler" ) func (tpn *TestProcessorNode) addGenesisBlocksIntoStorage() { @@ -64,20 +66,25 @@ func (tpn *TestProcessorNode) initBlockProcessorWithSync() { }, } + statusCoreComponents := &factory.StatusCoreComponentsStub{ + AppStatusHandlerField: &statusHandlerMock.AppStatusHandlerStub{}, + } + argumentsBase := block.ArgBaseProcessor{ - CoreComponents: coreComponents, - DataComponents: dataComponents, - BootstrapComponents: bootstrapComponents, - StatusComponents: statusComponents, - Config: triesConfig, - AccountsDB: accountsDb, - ForkDetector: nil, - NodesCoordinator: tpn.NodesCoordinator, - FeeHandler: tpn.FeeAccumulator, - RequestHandler: tpn.RequestHandler, - BlockChainHook: &testscommon.BlockChainHookStub{}, - EpochStartTrigger: &mock.EpochStartTriggerStub{}, - HeaderValidator: tpn.HeaderValidator, + CoreComponents: coreComponents, + DataComponents: dataComponents, + BootstrapComponents: bootstrapComponents, + StatusComponents: statusComponents, + StatusCoreComponents: statusCoreComponents, + Config: triesConfig, + AccountsDB: accountsDb, + ForkDetector: nil, + NodesCoordinator: tpn.NodesCoordinator, + FeeHandler: tpn.FeeAccumulator, + RequestHandler: tpn.RequestHandler, + BlockChainHook: &testscommon.BlockChainHookStub{}, + EpochStartTrigger: &mock.EpochStartTriggerStub{}, + HeaderValidator: tpn.HeaderValidator, BootStorer: &mock.BoostrapStorerMock{ PutCalled: func(round int64, bootData bootstrapStorage.BootstrapData) error { return nil diff --git a/node/metrics/errors.go b/node/metrics/errors.go index b79464ab7c7..dd7169daeeb 100644 --- a/node/metrics/errors.go +++ b/node/metrics/errors.go @@ -2,5 +2,5 @@ package metrics import "fmt" -// ErrNilStatusHandlerUtils signals that a nil status handler utils instance has been provided -var ErrNilStatusHandlerUtils = fmt.Errorf("nil StatusHandlerUtils when initializing metrics") +// ErrNilAppStatusHandler signals that a nil app status handler instance has been provided +var ErrNilAppStatusHandler = fmt.Errorf("nil app status handler when initializing metrics") diff --git a/node/metrics/metrics.go b/node/metrics/metrics.go index 7cf06c43e58..1ff77819840 100644 --- a/node/metrics/metrics.go +++ b/node/metrics/metrics.go @@ -18,19 +18,12 @@ const initInt = int64(0) const initString = "" const initZeroString = "0" -// StatusHandlersUtils provides some functionality for statusHandlers -type StatusHandlersUtils interface { - StatusHandler() core.AppStatusHandler - IsInterfaceNil() bool -} - // InitBaseMetrics will initialize base, default metrics to 0 values -func InitBaseMetrics(statusHandlerUtils StatusHandlersUtils) error { - if check.IfNil(statusHandlerUtils) { - return ErrNilStatusHandlerUtils +func InitBaseMetrics(appStatusHandler core.AppStatusHandler) error { + if check.IfNil(appStatusHandler) { + return ErrNilAppStatusHandler } - appStatusHandler := statusHandlerUtils.StatusHandler() appStatusHandler.SetUInt64Value(common.MetricSynchronizedRound, initUint) appStatusHandler.SetUInt64Value(common.MetricNonce, initUint) appStatusHandler.SetUInt64Value(common.MetricCountConsensus, initUint) @@ -81,17 +74,16 @@ func InitBaseMetrics(statusHandlerUtils StatusHandlersUtils) error { // InitConfigMetrics will init the "enable epochs" configuration metrics from epoch config func InitConfigMetrics( - statusHandlerUtils StatusHandlersUtils, + appStatusHandler core.AppStatusHandler, epochConfig config.EpochConfig, economicsConfig config.EconomicsConfig, genesisNodesConfig sharding.GenesisNodesSetupHandler, ) error { - if check.IfNil(statusHandlerUtils) { - return ErrNilStatusHandlerUtils + if check.IfNil(appStatusHandler) { + return ErrNilAppStatusHandler } enableEpochs := epochConfig.EnableEpochs - appStatusHandler := statusHandlerUtils.StatusHandler() appStatusHandler.SetUInt64Value(common.MetricScDeployEnableEpoch, uint64(enableEpochs.SCDeployEnableEpoch)) appStatusHandler.SetUInt64Value(common.MetricBuiltInFunctionsEnableEpoch, uint64(enableEpochs.BuiltInFunctionsEnableEpoch)) @@ -149,13 +141,11 @@ func InitConfigMetrics( } // InitRatingsMetrics will init the ratings configuration metrics -func InitRatingsMetrics(statusHandlerUtils StatusHandlersUtils, ratingsConfig config.RatingsConfig) error { - if check.IfNil(statusHandlerUtils) { - return ErrNilStatusHandlerUtils +func InitRatingsMetrics(appStatusHandler core.AppStatusHandler, ratingsConfig config.RatingsConfig) error { + if check.IfNil(appStatusHandler) { + return ErrNilAppStatusHandler } - appStatusHandler := statusHandlerUtils.StatusHandler() - appStatusHandler.SetUInt64Value(common.MetricRatingsGeneralStartRating, uint64(ratingsConfig.General.StartRating)) appStatusHandler.SetUInt64Value(common.MetricRatingsGeneralMaxRating, uint64(ratingsConfig.General.MaxRating)) appStatusHandler.SetUInt64Value(common.MetricRatingsGeneralMinRating, uint64(ratingsConfig.General.MinRating)) @@ -192,7 +182,7 @@ func InitRatingsMetrics(statusHandlerUtils StatusHandlersUtils, ratingsConfig co // InitMetrics will init metrics for status handler func InitMetrics( - statusHandlerUtils StatusHandlersUtils, + appStatusHandler core.AppStatusHandler, pubkeyStr string, nodeType core.NodeType, shardCoordinator sharding.Coordinator, @@ -202,8 +192,8 @@ func InitMetrics( roundsPerEpoch int64, minTransactionVersion uint32, ) error { - if check.IfNil(statusHandlerUtils) { - return ErrNilStatusHandlerUtils + if check.IfNil(appStatusHandler) { + return ErrNilAppStatusHandler } if check.IfNil(shardCoordinator) { return fmt.Errorf("nil shard coordinator when initializing metrics") @@ -220,8 +210,6 @@ func InitMetrics( roundDuration := nodesConfig.GetRoundDuration() isSyncing := uint64(1) - appStatusHandler := statusHandlerUtils.StatusHandler() - leaderPercentage := float64(0) rewardsConfigs := make([]config.EpochRewardSettings, len(economicsConfig.RewardsSettings.RewardsConfigByEpoch)) _ = copy(rewardsConfigs, economicsConfig.RewardsSettings.RewardsConfigByEpoch) diff --git a/node/metrics/metrics_test.go b/node/metrics/metrics_test.go index 855e1d9029d..3f1d24ef727 100644 --- a/node/metrics/metrics_test.go +++ b/node/metrics/metrics_test.go @@ -78,14 +78,10 @@ func TestInitBaseMetrics(t *testing.T) { }, } - sm := &statusHandler.StatusHandlersUtilsMock{ - AppStatusHandler: ash, - } - err := InitBaseMetrics(nil) - require.Equal(t, ErrNilStatusHandlerUtils, err) + require.Equal(t, ErrNilAppStatusHandler, err) - err = InitBaseMetrics(sm) + err = InitBaseMetrics(ash) require.Nil(t, err) require.Equal(t, len(expectedKeys), len(keys)) @@ -206,14 +202,10 @@ func TestInitConfigMetrics(t *testing.T) { }, } - sm := &statusHandler.StatusHandlersUtilsMock{ - AppStatusHandler: ash, - } - err := InitConfigMetrics(nil, cfg, economicsConfig, genesisNodesConfig) - require.Equal(t, ErrNilStatusHandlerUtils, err) + require.Equal(t, ErrNilAppStatusHandler, err) - err = InitConfigMetrics(sm, cfg, economicsConfig, genesisNodesConfig) + err = InitConfigMetrics(ash, cfg, economicsConfig, genesisNodesConfig) require.Nil(t, err) assert.Equal(t, len(expectedValues), len(keys)) @@ -232,7 +224,7 @@ func TestInitConfigMetrics(t *testing.T) { expectedValues["erd_adaptivity"] = "false" expectedValues["erd_hysteresis"] = "0.000000" - err = InitConfigMetrics(sm, cfg, economicsConfig, genesisNodesConfig) + err = InitConfigMetrics(ash, cfg, economicsConfig, genesisNodesConfig) require.Nil(t, err) assert.Equal(t, expectedValues["erd_adaptivity"], keys["erd_adaptivity"]) @@ -323,14 +315,10 @@ func TestInitRatingsMetrics(t *testing.T) { }, } - sm := &statusHandler.StatusHandlersUtilsMock{ - AppStatusHandler: ash, - } - err := InitRatingsMetrics(nil, cfg) - require.Equal(t, ErrNilStatusHandlerUtils, err) + require.Equal(t, ErrNilAppStatusHandler, err) - err = InitRatingsMetrics(sm, cfg) + err = InitRatingsMetrics(ash, cfg) require.Nil(t, err) assert.Equal(t, len(expectedValues), len(keys)) diff --git a/node/mock/factory/coreComponentsStub.go b/node/mock/factory/coreComponentsStub.go index d238cafc2a2..66136c26e8c 100644 --- a/node/mock/factory/coreComponentsStub.go +++ b/node/mock/factory/coreComponentsStub.go @@ -8,7 +8,6 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/typeConverters" "github.com/ElrondNetwork/elrond-go-core/hashing" "github.com/ElrondNetwork/elrond-go-core/marshal" - nodeFactory "github.com/ElrondNetwork/elrond-go/cmd/node/factory" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/consensus" "github.com/ElrondNetwork/elrond-go/factory" @@ -32,8 +31,6 @@ type CoreComponentsMock struct { PathHdl storage.PathManagerHandler ChainIdCalled func() string MinTransactionVersionCalled func() uint32 - StatusHdlUtils nodeFactory.StatusHandlersUtils - AppStatusHdl core.AppStatusHandler WDTimer core.WatchdogTimer Alarm core.TimersScheduler NtpTimer ntp.SyncTimer @@ -77,16 +74,6 @@ func (ccm *CoreComponentsMock) VmMarshalizer() marshal.Marshalizer { return ccm.VmMarsh } -// StatusHandlerUtils - -func (ccm *CoreComponentsMock) StatusHandlerUtils() nodeFactory.StatusHandlersUtils { - return ccm.StatusHdlUtils -} - -// StatusHandler - -func (ccm *CoreComponentsMock) StatusHandler() core.AppStatusHandler { - return ccm.AppStatusHdl -} - // Watchdog - func (ccm *CoreComponentsMock) Watchdog() core.WatchdogTimer { return ccm.WDTimer diff --git a/node/mock/txFeeHandlerStub.go b/node/mock/txFeeHandlerStub.go index 9d9c8065445..78741415bab 100644 --- a/node/mock/txFeeHandlerStub.go +++ b/node/mock/txFeeHandlerStub.go @@ -3,6 +3,7 @@ package mock import ( "math/big" + "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/data" ) @@ -38,6 +39,7 @@ type EconomicsHandlerStub struct { ComputeGasUsedAndFeeBasedOnRefundValueCalled func(tx data.TransactionWithFeeHandler, refundValue *big.Int) (uint64, *big.Int) ComputeTxFeeBasedOnGasUsedCalled func(tx data.TransactionWithFeeHandler, gasUsed uint64) *big.Int ComputeGasLimitBasedOnBalanceCalled func(tx data.TransactionWithFeeHandler, balance *big.Int) (uint64, error) + SetStatusHandlerCalled func(statusHandler core.AppStatusHandler) error } // ComputeGasLimitBasedOnBalance - @@ -273,6 +275,14 @@ func (ehs *EconomicsHandlerStub) ComputeTxFeeBasedOnGasUsed(tx data.TransactionW return big.NewInt(0) } +// SetStatusHandler - +func (ehs *EconomicsHandlerStub) SetStatusHandler(statusHandler core.AppStatusHandler) error { + if ehs.SetStatusHandlerCalled != nil { + return ehs.SetStatusHandlerCalled(statusHandler) + } + return nil +} + // IsInterfaceNil returns true if there is no value under the interface func (ehs *EconomicsHandlerStub) IsInterfaceNil() bool { return ehs == nil diff --git a/node/node.go b/node/node.go index 8332e8e9ac0..3540f93bb0f 100644 --- a/node/node.go +++ b/node/node.go @@ -84,6 +84,7 @@ type Node struct { bootstrapComponents mainFactory.BootstrapComponentsHolder consensusComponents mainFactory.ConsensusComponentsHolder coreComponents mainFactory.CoreComponentsHolder + statusCoreComponents mainFactory.StatusCoreComponentsHolder cryptoComponents mainFactory.CryptoComponentsHolder dataComponents mainFactory.DataComponentsHolder heartbeatV2Components mainFactory.HeartbeatV2ComponentsHolder @@ -124,11 +125,6 @@ func NewNode(opts ...Option) (*Node, error) { return node, nil } -// GetAppStatusHandler will return the current status handler -func (n *Node) GetAppStatusHandler() core.AppStatusHandler { - return n.coreComponents.StatusHandler() -} - // CreateShardedStores instantiate sharded cachers for Transactions and Headers func (n *Node) CreateShardedStores() error { if check.IfNil(n.processComponents.ShardCoordinator()) { @@ -1061,6 +1057,11 @@ func (n *Node) GetCoreComponents() mainFactory.CoreComponentsHolder { return n.coreComponents } +// GetStatusCoreComponents returns the status core components +func (n *Node) GetStatusCoreComponents() mainFactory.StatusCoreComponentsHolder { + return n.statusCoreComponents +} + // GetCryptoComponents returns the crypto components func (n *Node) GetCryptoComponents() mainFactory.CryptoComponentsHolder { return n.cryptoComponents diff --git a/node/nodeRunner.go b/node/nodeRunner.go index 9ebe6bb4b80..a1dd7450746 100644 --- a/node/nodeRunner.go +++ b/node/nodeRunner.go @@ -21,7 +21,6 @@ import ( logger "github.com/ElrondNetwork/elrond-go-logger" "github.com/ElrondNetwork/elrond-go/api/gin" "github.com/ElrondNetwork/elrond-go/api/shared" - "github.com/ElrondNetwork/elrond-go/cmd/node/factory" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/common/forking" "github.com/ElrondNetwork/elrond-go/common/goroutines" @@ -269,12 +268,6 @@ func (nr *nodeRunner) executeOneComponentCreationCycle( log.Debug("creating healthService") healthService := nr.createHealthService(flagsConfig) - log.Debug("creating status core components") - managedStatusCoreComponents, err := nr.CreateManagedStatusCoreComponents() - if err != nil { - return true, err - } - log.Debug("creating core components") managedCoreComponents, err := nr.CreateManagedCoreComponents( chanStopNodeProcess, @@ -283,6 +276,12 @@ func (nr *nodeRunner) executeOneComponentCreationCycle( return true, err } + log.Debug("creating status core components") + managedStatusCoreComponents, err := nr.CreateManagedStatusCoreComponents(managedCoreComponents) + if err != nil { + return true, err + } + log.Debug("creating crypto components") managedCryptoComponents, err := nr.CreateManagedCryptoComponents(managedCoreComponents) if err != nil { @@ -290,7 +289,7 @@ func (nr *nodeRunner) executeOneComponentCreationCycle( } log.Debug("creating network components") - managedNetworkComponents, err := nr.CreateManagedNetworkComponents(managedCoreComponents) + managedNetworkComponents, err := nr.CreateManagedNetworkComponents(managedCoreComponents, managedStatusCoreComponents) if err != nil { return true, err } @@ -302,7 +301,7 @@ func (nr *nodeRunner) executeOneComponentCreationCycle( } log.Debug("creating bootstrap components") - managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedCoreComponents, managedCryptoComponents, managedNetworkComponents) + managedBootstrapComponents, err := nr.CreateManagedBootstrapComponents(managedCoreComponents, managedCryptoComponents, managedNetworkComponents, managedStatusCoreComponents) if err != nil { return true, err } @@ -310,7 +309,7 @@ func (nr *nodeRunner) executeOneComponentCreationCycle( nr.logInformation(managedCoreComponents, managedCryptoComponents, managedBootstrapComponents) log.Debug("creating data components") - managedDataComponents, err := nr.CreateManagedDataComponents(managedCoreComponents, managedBootstrapComponents) + managedDataComponents, err := nr.CreateManagedDataComponents(managedStatusCoreComponents, managedCoreComponents, managedBootstrapComponents) if err != nil { return true, err } @@ -320,6 +319,7 @@ func (nr *nodeRunner) executeOneComponentCreationCycle( managedCoreComponents, managedBootstrapComponents, managedDataComponents, + managedStatusCoreComponents, ) if err != nil { return true, err @@ -327,7 +327,7 @@ func (nr *nodeRunner) executeOneComponentCreationCycle( log.Debug("creating metrics") // this should be called before setting the storer (done in the managedDataComponents creation) - err = nr.createMetrics(managedCoreComponents, managedCryptoComponents, managedBootstrapComponents) + err = nr.createMetrics(managedStatusCoreComponents, managedCoreComponents, managedCryptoComponents, managedBootstrapComponents) if err != nil { return true, err } @@ -408,6 +408,7 @@ func (nr *nodeRunner) executeOneComponentCreationCycle( managedStateComponents, managedDataComponents, managedStatusComponents, + managedStatusCoreComponents, gasScheduleNotifier, nodesCoordinatorInstance, ) @@ -449,6 +450,7 @@ func (nr *nodeRunner) executeOneComponentCreationCycle( managedStateComponents, managedStatusComponents, managedProcessComponents, + managedStatusCoreComponents, ) if err != nil { return true, err @@ -461,6 +463,7 @@ func (nr *nodeRunner) executeOneComponentCreationCycle( managedCryptoComponents, managedDataComponents, managedProcessComponents, + managedStatusCoreComponents, ) if err != nil { @@ -513,7 +516,7 @@ func (nr *nodeRunner) executeOneComponentCreationCycle( time.Sleep(delayBeforeScQueriesStart) close(allowExternalVMQueriesChan) statusHandler.SetStringValue(common.MetricAreVMQueriesReady, strconv.FormatBool(true)) - }(managedCoreComponents.StatusHandler()) + }(managedStatusCoreComponents.AppStatusHandler()) sigs := make(chan os.Signal, 1) signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) @@ -678,16 +681,17 @@ func (nr *nodeRunner) createApiFacade( log.Debug("creating api resolver structure") apiResolverArgs := &apiComp.ApiResolverArgs{ - Configs: configs, - CoreComponents: currentNode.coreComponents, - DataComponents: currentNode.dataComponents, - StateComponents: currentNode.stateComponents, - BootstrapComponents: currentNode.bootstrapComponents, - CryptoComponents: currentNode.cryptoComponents, - ProcessComponents: currentNode.processComponents, - GasScheduleNotifier: gasScheduleNotifier, - Bootstrapper: currentNode.consensusComponents.Bootstrapper(), - AllowVMQueriesChan: allowVMQueriesChan, + Configs: configs, + CoreComponents: currentNode.coreComponents, + DataComponents: currentNode.dataComponents, + StateComponents: currentNode.stateComponents, + BootstrapComponents: currentNode.bootstrapComponents, + CryptoComponents: currentNode.cryptoComponents, + ProcessComponents: currentNode.processComponents, + StatusCoreComponents: currentNode.statusCoreComponents, + GasScheduleNotifier: gasScheduleNotifier, + Bootstrapper: currentNode.consensusComponents.Bootstrapper(), + AllowVMQueriesChan: allowVMQueriesChan, } apiResolver, err := apiComp.CreateApiResolver(apiResolverArgs) @@ -755,12 +759,13 @@ func (nr *nodeRunner) createHttpServer() (shared.UpgradeableHttpServerHandler, e } func (nr *nodeRunner) createMetrics( + statusCoreComponents mainFactory.StatusCoreComponentsHolder, coreComponents mainFactory.CoreComponentsHolder, cryptoComponents mainFactory.CryptoComponentsHolder, bootstrapComponents mainFactory.BootstrapComponentsHolder, ) error { err := metrics.InitMetrics( - coreComponents.StatusHandlerUtils(), + statusCoreComponents.AppStatusHandler(), cryptoComponents.PublicKeyString(), bootstrapComponents.NodeType(), bootstrapComponents.ShardCoordinator(), @@ -775,17 +780,17 @@ func (nr *nodeRunner) createMetrics( return err } - metrics.SaveStringMetric(coreComponents.StatusHandler(), common.MetricNodeDisplayName, nr.configs.PreferencesConfig.Preferences.NodeDisplayName) - metrics.SaveStringMetric(coreComponents.StatusHandler(), common.MetricRedundancyLevel, fmt.Sprintf("%d", nr.configs.PreferencesConfig.Preferences.RedundancyLevel)) - metrics.SaveStringMetric(coreComponents.StatusHandler(), common.MetricRedundancyIsMainActive, common.MetricValueNA) - metrics.SaveStringMetric(coreComponents.StatusHandler(), common.MetricChainId, coreComponents.ChainID()) - metrics.SaveUint64Metric(coreComponents.StatusHandler(), common.MetricGasPerDataByte, coreComponents.EconomicsData().GasPerDataByte()) - metrics.SaveUint64Metric(coreComponents.StatusHandler(), common.MetricMinGasPrice, coreComponents.EconomicsData().MinGasPrice()) - metrics.SaveUint64Metric(coreComponents.StatusHandler(), common.MetricMinGasLimit, coreComponents.EconomicsData().MinGasLimit()) - metrics.SaveStringMetric(coreComponents.StatusHandler(), common.MetricRewardsTopUpGradientPoint, coreComponents.EconomicsData().RewardsTopUpGradientPoint().String()) - metrics.SaveStringMetric(coreComponents.StatusHandler(), common.MetricTopUpFactor, fmt.Sprintf("%g", coreComponents.EconomicsData().RewardsTopUpFactor())) - metrics.SaveStringMetric(coreComponents.StatusHandler(), common.MetricGasPriceModifier, fmt.Sprintf("%g", coreComponents.EconomicsData().GasPriceModifier())) - metrics.SaveUint64Metric(coreComponents.StatusHandler(), common.MetricMaxGasPerTransaction, coreComponents.EconomicsData().MaxGasLimitPerTx()) + metrics.SaveStringMetric(statusCoreComponents.AppStatusHandler(), common.MetricNodeDisplayName, nr.configs.PreferencesConfig.Preferences.NodeDisplayName) + metrics.SaveStringMetric(statusCoreComponents.AppStatusHandler(), common.MetricRedundancyLevel, fmt.Sprintf("%d", nr.configs.PreferencesConfig.Preferences.RedundancyLevel)) + metrics.SaveStringMetric(statusCoreComponents.AppStatusHandler(), common.MetricRedundancyIsMainActive, common.MetricValueNA) + metrics.SaveStringMetric(statusCoreComponents.AppStatusHandler(), common.MetricChainId, coreComponents.ChainID()) + metrics.SaveUint64Metric(statusCoreComponents.AppStatusHandler(), common.MetricGasPerDataByte, coreComponents.EconomicsData().GasPerDataByte()) + metrics.SaveUint64Metric(statusCoreComponents.AppStatusHandler(), common.MetricMinGasPrice, coreComponents.EconomicsData().MinGasPrice()) + metrics.SaveUint64Metric(statusCoreComponents.AppStatusHandler(), common.MetricMinGasLimit, coreComponents.EconomicsData().MinGasLimit()) + metrics.SaveStringMetric(statusCoreComponents.AppStatusHandler(), common.MetricRewardsTopUpGradientPoint, coreComponents.EconomicsData().RewardsTopUpGradientPoint().String()) + metrics.SaveStringMetric(statusCoreComponents.AppStatusHandler(), common.MetricTopUpFactor, fmt.Sprintf("%g", coreComponents.EconomicsData().RewardsTopUpFactor())) + metrics.SaveStringMetric(statusCoreComponents.AppStatusHandler(), common.MetricGasPriceModifier, fmt.Sprintf("%g", coreComponents.EconomicsData().GasPriceModifier())) + metrics.SaveUint64Metric(statusCoreComponents.AppStatusHandler(), common.MetricMaxGasPerTransaction, coreComponents.EconomicsData().MaxGasLimitPerTx()) return nil } @@ -813,6 +818,7 @@ func (nr *nodeRunner) CreateManagedConsensusComponents( stateComponents mainFactory.StateComponentsHolder, statusComponents mainFactory.StatusComponentsHolder, processComponents mainFactory.ProcessComponentsHolder, + statusCoreComponents mainFactory.StatusCoreComponentsHolder, ) (mainFactory.ConsensusComponentsHandler, error) { scheduledProcessorArgs := spos.ScheduledProcessorWrapperArgs{ SyncTimer: coreComponents.SyncTimer(), @@ -835,6 +841,7 @@ func (nr *nodeRunner) CreateManagedConsensusComponents( ProcessComponents: processComponents, StateComponents: stateComponents, StatusComponents: statusComponents, + StatusCoreComponents: statusCoreComponents, ScheduledProcessor: scheduledProcessor, IsInImportMode: nr.configs.ImportDbConfig.IsImportDBMode, ShouldDisableWatchdog: nr.configs.FlagsConfig.DisableConsensusWatchdog, @@ -865,17 +872,19 @@ func (nr *nodeRunner) CreateManagedHeartbeatV2Components( cryptoComponents mainFactory.CryptoComponentsHolder, dataComponents mainFactory.DataComponentsHolder, processComponents mainFactory.ProcessComponentsHolder, + statusCoreComponents mainFactory.StatusCoreComponentsHolder, ) (mainFactory.HeartbeatV2ComponentsHandler, error) { heartbeatV2Args := heartbeatComp.ArgHeartbeatV2ComponentsFactory{ - Config: *nr.configs.GeneralConfig, - Prefs: *nr.configs.PreferencesConfig, - AppVersion: nr.configs.FlagsConfig.Version, - BoostrapComponents: bootstrapComponents, - CoreComponents: coreComponents, - DataComponents: dataComponents, - NetworkComponents: networkComponents, - CryptoComponents: cryptoComponents, - ProcessComponents: processComponents, + Config: *nr.configs.GeneralConfig, + Prefs: *nr.configs.PreferencesConfig, + AppVersion: nr.configs.FlagsConfig.Version, + BoostrapComponents: bootstrapComponents, + CoreComponents: coreComponents, + DataComponents: dataComponents, + NetworkComponents: networkComponents, + CryptoComponents: cryptoComponents, + ProcessComponents: processComponents, + StatusCoreComponents: statusCoreComponents, } heartbeatV2ComponentsFactory, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(heartbeatV2Args) @@ -1087,6 +1096,7 @@ func (nr *nodeRunner) CreateManagedProcessComponents( stateComponents mainFactory.StateComponentsHolder, dataComponents mainFactory.DataComponentsHolder, statusComponents mainFactory.StatusComponentsHolder, + statusCoreComponents mainFactory.StatusCoreComponentsHolder, gasScheduleNotifier core.GasScheduleNotifier, nodesCoordinator nodesCoordinator.NodesCoordinator, ) (mainFactory.ProcessComponentsHandler, error) { @@ -1182,6 +1192,7 @@ func (nr *nodeRunner) CreateManagedProcessComponents( Network: networkComponents, BootstrapComponents: bootstrapComponents, StatusComponents: statusComponents, + StatusCoreComponents: statusCoreComponents, RequestedItemsHandler: requestedItemsHandler, WhiteListHandler: whiteListRequest, WhiteListerVerifiedTxs: whiteListerVerifiedTxs, @@ -1212,6 +1223,7 @@ func (nr *nodeRunner) CreateManagedProcessComponents( // CreateManagedDataComponents is the managed data components factory func (nr *nodeRunner) CreateManagedDataComponents( + statusCoreComponents mainFactory.StatusCoreComponentsHolder, coreComponents mainFactory.CoreComponentsHolder, bootstrapComponents mainFactory.BootstrapComponentsHolder, ) (mainFactory.DataComponentsHandler, error) { @@ -1228,6 +1240,7 @@ func (nr *nodeRunner) CreateManagedDataComponents( PrefsConfig: configs.PreferencesConfig.Preferences, ShardCoordinator: bootstrapComponents.ShardCoordinator(), Core: coreComponents, + StatusCore: statusCoreComponents, EpochStartNotifier: coreComponents.EpochStartNotifierWithConfirm(), CurrentEpoch: storerEpoch, CreateTrieEpochRootHashStorer: configs.ImportDbConfig.ImportDbSaveTrieEpochRootHash, @@ -1251,7 +1264,7 @@ func (nr *nodeRunner) CreateManagedDataComponents( return nil, err } - err = coreComponents.StatusHandlerUtils().UpdateStorerAndMetricsForPersistentHandler(statusMetricsStorer) + err = statusCoreComponents.PersistentStatusHandler().SetStorage(statusMetricsStorer) if err != nil { return nil, err @@ -1265,6 +1278,7 @@ func (nr *nodeRunner) CreateManagedStateComponents( coreComponents mainFactory.CoreComponentsHolder, bootstrapComponents mainFactory.BootstrapComponentsHolder, dataComponents mainFactory.DataComponentsHandler, + statusCoreComponents mainFactory.StatusCoreComponentsHolder, ) (mainFactory.StateComponentsHandler, error) { processingMode := common.Normal if nr.configs.ImportDbConfig.IsImportDBMode { @@ -1274,6 +1288,7 @@ func (nr *nodeRunner) CreateManagedStateComponents( Config: *nr.configs.GeneralConfig, ShardCoordinator: bootstrapComponents.ShardCoordinator(), Core: coreComponents, + StatusCore: statusCoreComponents, StorageService: dataComponents.StorageService(), ProcessingMode: processingMode, ShouldSerializeSnapshots: nr.configs.FlagsConfig.SerializeSnapshots, @@ -1302,17 +1317,19 @@ func (nr *nodeRunner) CreateManagedBootstrapComponents( coreComponents mainFactory.CoreComponentsHolder, cryptoComponents mainFactory.CryptoComponentsHolder, networkComponents mainFactory.NetworkComponentsHolder, + statusCoreComponents mainFactory.StatusCoreComponentsHolder, ) (mainFactory.BootstrapComponentsHandler, error) { bootstrapComponentsFactoryArgs := bootstrapComp.BootstrapComponentsFactoryArgs{ - Config: *nr.configs.GeneralConfig, - PrefConfig: *nr.configs.PreferencesConfig, - ImportDbConfig: *nr.configs.ImportDbConfig, - FlagsConfig: *nr.configs.FlagsConfig, - WorkingDir: nr.configs.FlagsConfig.WorkingDir, - CoreComponents: coreComponents, - CryptoComponents: cryptoComponents, - NetworkComponents: networkComponents, + Config: *nr.configs.GeneralConfig, + PrefConfig: *nr.configs.PreferencesConfig, + ImportDbConfig: *nr.configs.ImportDbConfig, + FlagsConfig: *nr.configs.FlagsConfig, + WorkingDir: nr.configs.FlagsConfig.WorkingDir, + CoreComponents: coreComponents, + CryptoComponents: cryptoComponents, + NetworkComponents: networkComponents, + StatusCoreComponents: statusCoreComponents, } bootstrapComponentsFactory, err := bootstrapComp.NewBootstrapComponentsFactory(bootstrapComponentsFactoryArgs) @@ -1336,12 +1353,13 @@ func (nr *nodeRunner) CreateManagedBootstrapComponents( // CreateManagedNetworkComponents is the managed network components factory func (nr *nodeRunner) CreateManagedNetworkComponents( coreComponents mainFactory.CoreComponentsHolder, + statusCoreComponents mainFactory.StatusCoreComponentsHolder, ) (mainFactory.NetworkComponentsHandler, error) { networkComponentsFactoryArgs := networkComp.NetworkComponentsFactoryArgs{ P2pConfig: *nr.configs.P2pConfig, MainConfig: *nr.configs.GeneralConfig, RatingsConfig: *nr.configs.RatingsConfig, - StatusHandler: coreComponents.StatusHandler(), + StatusHandler: statusCoreComponents.AppStatusHandler(), Marshalizer: coreComponents.InternalMarshalizer(), Syncer: coreComponents.SyncTimer(), PreferredPeersSlices: nr.configs.PreferencesConfig.Preferences.PreferredConnections, @@ -1377,23 +1395,17 @@ func (nr *nodeRunner) CreateManagedNetworkComponents( func (nr *nodeRunner) CreateManagedCoreComponents( chanStopNodeProcess chan endProcess.ArgEndProcess, ) (mainFactory.CoreComponentsHandler, error) { - statusHandlersFactory, err := factory.NewStatusHandlersFactory() - if err != nil { - return nil, err - } - coreArgs := coreComp.CoreComponentsFactoryArgs{ - Config: *nr.configs.GeneralConfig, - ConfigPathsHolder: *nr.configs.ConfigurationPathsHolder, - EpochConfig: *nr.configs.EpochConfig, - RoundConfig: *nr.configs.RoundConfig, - ImportDbConfig: *nr.configs.ImportDbConfig, - RatingsConfig: *nr.configs.RatingsConfig, - EconomicsConfig: *nr.configs.EconomicsConfig, - NodesFilename: nr.configs.ConfigurationPathsHolder.Nodes, - WorkingDirectory: nr.configs.FlagsConfig.WorkingDir, - ChanStopNodeProcess: chanStopNodeProcess, - StatusHandlersFactory: statusHandlersFactory, + Config: *nr.configs.GeneralConfig, + ConfigPathsHolder: *nr.configs.ConfigurationPathsHolder, + EpochConfig: *nr.configs.EpochConfig, + RoundConfig: *nr.configs.RoundConfig, + ImportDbConfig: *nr.configs.ImportDbConfig, + RatingsConfig: *nr.configs.RatingsConfig, + EconomicsConfig: *nr.configs.EconomicsConfig, + NodesFilename: nr.configs.ConfigurationPathsHolder.Nodes, + WorkingDirectory: nr.configs.FlagsConfig.WorkingDir, + ChanStopNodeProcess: chanStopNodeProcess, } coreComponentsFactory, err := coreComp.NewCoreComponentsFactory(coreArgs) @@ -1415,12 +1427,22 @@ func (nr *nodeRunner) CreateManagedCoreComponents( } // CreateManagedStatusCoreComponents is the managed status core components factory -func (nr *nodeRunner) CreateManagedStatusCoreComponents() (mainFactory.StatusCoreComponentsHandler, error) { +func (nr *nodeRunner) CreateManagedStatusCoreComponents( + coreComponents mainFactory.CoreComponentsHolder, +) (mainFactory.StatusCoreComponentsHandler, error) { args := statusCore.StatusCoreComponentsFactoryArgs{ - Config: *nr.configs.GeneralConfig, + Config: *nr.configs.GeneralConfig, + EpochConfig: *nr.configs.EpochConfig, + RoundConfig: *nr.configs.RoundConfig, + RatingsConfig: *nr.configs.RatingsConfig, + EconomicsConfig: *nr.configs.EconomicsConfig, + CoreComp: coreComponents, } - statusCoreComponentsFactory := statusCore.NewStatusCoreComponentsFactory(args) + statusCoreComponentsFactory, err := statusCore.NewStatusCoreComponentsFactory(args) + if err != nil { + return nil, err + } managedStatusCoreComponents, err := statusCore.NewManagedStatusCoreComponents(statusCoreComponentsFactory) if err != nil { return nil, err diff --git a/node/node_test.go b/node/node_test.go index 7ea352fbf78..cda8a28675a 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -47,6 +47,7 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon/dblookupext" "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" + factoryTests "github.com/ElrondNetwork/elrond-go/testscommon/factory" "github.com/ElrondNetwork/elrond-go/testscommon/mainFactoryMocks" "github.com/ElrondNetwork/elrond-go/testscommon/p2pmocks" "github.com/ElrondNetwork/elrond-go/testscommon/shardingMocks" @@ -2993,20 +2994,20 @@ func TestNode_AppStatusHandlersShouldIncrement(t *testing.T) { metricKey := common.MetricCurrentRound incrementCalled := make(chan bool, 1) - appStatusHandlerStub := statusHandlerMock.AppStatusHandlerStub{ + appStatusHandlerStub := &statusHandlerMock.AppStatusHandlerStub{ IncrementHandler: func(key string) { incrementCalled <- true }, } - coreComponents := getDefaultCoreComponents() - coreComponents.AppStatusHdl = &appStatusHandlerStub + statusCoreComp := &factoryTests.StatusCoreComponentsStub{ + AppStatusHandlerField: appStatusHandlerStub, + } - n, _ := node.NewNode( - node.WithCoreComponents(coreComponents)) - asf := n.GetAppStatusHandler() + _, _ = node.NewNode( + node.WithStatusCoreComponents(statusCoreComp)) - asf.Increment(metricKey) + appStatusHandlerStub.Increment(metricKey) select { case <-incrementCalled: @@ -3021,20 +3022,20 @@ func TestNode_AppStatusHandlerShouldDecrement(t *testing.T) { metricKey := common.MetricCurrentRound decrementCalled := make(chan bool, 1) - appStatusHandlerStub := statusHandlerMock.AppStatusHandlerStub{ + appStatusHandlerStub := &statusHandlerMock.AppStatusHandlerStub{ DecrementHandler: func(key string) { decrementCalled <- true }, } - coreComponents := getDefaultCoreComponents() - coreComponents.AppStatusHdl = &appStatusHandlerStub + statusCoreComp := &factoryTests.StatusCoreComponentsStub{ + AppStatusHandlerField: appStatusHandlerStub, + } - n, _ := node.NewNode( - node.WithCoreComponents(coreComponents)) - asf := n.GetAppStatusHandler() + _, _ = node.NewNode( + node.WithStatusCoreComponents(statusCoreComp)) - asf.Decrement(metricKey) + appStatusHandlerStub.Decrement(metricKey) select { case <-decrementCalled: @@ -3049,20 +3050,20 @@ func TestNode_AppStatusHandlerShouldSetInt64Value(t *testing.T) { metricKey := common.MetricCurrentRound setInt64ValueCalled := make(chan bool, 1) - appStatusHandlerStub := statusHandlerMock.AppStatusHandlerStub{ + appStatusHandlerStub := &statusHandlerMock.AppStatusHandlerStub{ SetInt64ValueHandler: func(key string, value int64) { setInt64ValueCalled <- true }, } - coreComponents := getDefaultCoreComponents() - coreComponents.AppStatusHdl = &appStatusHandlerStub + statusCoreComp := &factoryTests.StatusCoreComponentsStub{ + AppStatusHandlerField: appStatusHandlerStub, + } - n, _ := node.NewNode( - node.WithCoreComponents(coreComponents)) - asf := n.GetAppStatusHandler() + _, _ = node.NewNode( + node.WithStatusCoreComponents(statusCoreComp)) - asf.SetInt64Value(metricKey, int64(1)) + appStatusHandlerStub.SetInt64Value(metricKey, int64(1)) select { case <-setInt64ValueCalled: @@ -3077,20 +3078,20 @@ func TestNode_AppStatusHandlerShouldSetUInt64Value(t *testing.T) { metricKey := common.MetricCurrentRound setUInt64ValueCalled := make(chan bool, 1) - appStatusHandlerStub := statusHandlerMock.AppStatusHandlerStub{ + appStatusHandlerStub := &statusHandlerMock.AppStatusHandlerStub{ SetUInt64ValueHandler: func(key string, value uint64) { setUInt64ValueCalled <- true }, } - coreComponents := getDefaultCoreComponents() - coreComponents.AppStatusHdl = &appStatusHandlerStub + statusCoreComp := &factoryTests.StatusCoreComponentsStub{ + AppStatusHandlerField: appStatusHandlerStub, + } - n, _ := node.NewNode( - node.WithCoreComponents(coreComponents)) - asf := n.GetAppStatusHandler() + _, _ = node.NewNode( + node.WithStatusCoreComponents(statusCoreComp)) - asf.SetUInt64Value(metricKey, uint64(1)) + appStatusHandlerStub.SetUInt64Value(metricKey, uint64(1)) select { case <-setUInt64ValueCalled: @@ -3932,7 +3933,6 @@ func getDefaultCoreComponents() *nodeMockFactory.CoreComponentsMock { MinTransactionVersionCalled: func() uint32 { return 1 }, - AppStatusHdl: &statusHandlerMock.AppStatusHandlerStub{}, WDTimer: &testscommon.WatchdogMock{}, Alarm: &testscommon.AlarmSchedulerStub{}, NtpTimer: &testscommon.SyncTimerStub{}, diff --git a/node/options.go b/node/options.go index 24af0f311fe..dd39ef245eb 100644 --- a/node/options.go +++ b/node/options.go @@ -57,6 +57,7 @@ func WithStatusCoreComponents(statusCoreComponents factory.StatusCoreComponentsH if err != nil { return err } + n.statusCoreComponents = statusCoreComponents n.closableComponents = append(n.closableComponents, statusCoreComponents) return nil } diff --git a/process/block/argProcessor.go b/process/block/argProcessor.go index bef61f53e0c..0772988ffc7 100644 --- a/process/block/argProcessor.go +++ b/process/block/argProcessor.go @@ -26,7 +26,6 @@ type coreComponentsHolder interface { EpochNotifier() process.EpochNotifier EnableEpochsHandler() common.EnableEpochsHandler RoundHandler() consensus.RoundHandler - StatusHandler() core.AppStatusHandler EconomicsData() process.EconomicsDataHandler ProcessStatusHandler() common.ProcessStatusHandler IsInterfaceNil() bool @@ -51,13 +50,19 @@ type statusComponentsHolder interface { IsInterfaceNil() bool } +type statusCoreComponentsHolder interface { + AppStatusHandler() core.AppStatusHandler + IsInterfaceNil() bool +} + // ArgBaseProcessor holds all dependencies required by the process data factory in order to create // new instances type ArgBaseProcessor struct { - CoreComponents coreComponentsHolder - DataComponents dataComponentsHolder - BootstrapComponents bootstrapComponentsHolder - StatusComponents statusComponentsHolder + CoreComponents coreComponentsHolder + DataComponents dataComponentsHolder + BootstrapComponents bootstrapComponentsHolder + StatusComponents statusComponentsHolder + StatusCoreComponents statusCoreComponentsHolder Config config.Config AccountsDB map[state.AccountsDbIdentifier]state.AccountsAdapter diff --git a/process/block/baseProcess.go b/process/block/baseProcess.go index 96248230bdb..f06b84770be 100644 --- a/process/block/baseProcess.go +++ b/process/block/baseProcess.go @@ -503,7 +503,10 @@ func checkProcessorNilParameters(arguments ArgBaseProcessor) error { if check.IfNil(arguments.EnableRoundsHandler) { return process.ErrNilEnableRoundsHandler } - if check.IfNil(arguments.CoreComponents.StatusHandler()) { + if check.IfNil(arguments.StatusCoreComponents) { + return process.ErrNilStatusCoreComponentsHolder + } + if check.IfNil(arguments.StatusCoreComponents.AppStatusHandler()) { return process.ErrNilAppStatusHandler } if check.IfNil(arguments.GasHandler) { diff --git a/process/block/baseProcess_test.go b/process/block/baseProcess_test.go index d5dc35ac783..5951ac2828d 100644 --- a/process/block/baseProcess_test.go +++ b/process/block/baseProcess_test.go @@ -43,6 +43,7 @@ import ( dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" "github.com/ElrondNetwork/elrond-go/testscommon/dblookupext" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" + "github.com/ElrondNetwork/elrond-go/testscommon/factory" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" "github.com/ElrondNetwork/elrond-go/testscommon/mainFactoryMocks" "github.com/ElrondNetwork/elrond-go/testscommon/shardingMocks" @@ -79,21 +80,26 @@ func createArgBaseProcessor( }, } + statusCoreComponents := &factory.StatusCoreComponentsStub{ + AppStatusHandlerField: &statusHandlerMock.AppStatusHandlerStub{}, + } + return blproc.ArgBaseProcessor{ - CoreComponents: coreComponents, - DataComponents: dataComponents, - BootstrapComponents: bootstrapComponents, - StatusComponents: statusComponents, - Config: config.Config{}, - AccountsDB: accountsDb, - ForkDetector: &mock.ForkDetectorMock{}, - NodesCoordinator: nodesCoordinator, - FeeHandler: &mock.FeeAccumulatorStub{}, - RequestHandler: &testscommon.RequestHandlerStub{}, - BlockChainHook: &testscommon.BlockChainHookStub{}, - TxCoordinator: &mock.TransactionCoordinatorMock{}, - EpochStartTrigger: &mock.EpochStartTriggerStub{}, - HeaderValidator: headerValidator, + CoreComponents: coreComponents, + DataComponents: dataComponents, + BootstrapComponents: bootstrapComponents, + StatusComponents: statusComponents, + StatusCoreComponents: statusCoreComponents, + Config: config.Config{}, + AccountsDB: accountsDb, + ForkDetector: &mock.ForkDetectorMock{}, + NodesCoordinator: nodesCoordinator, + FeeHandler: &mock.FeeAccumulatorStub{}, + RequestHandler: &testscommon.RequestHandlerStub{}, + BlockChainHook: &testscommon.BlockChainHookStub{}, + TxCoordinator: &mock.TransactionCoordinatorMock{}, + EpochStartTrigger: &mock.EpochStartTriggerStub{}, + HeaderValidator: headerValidator, BootStorer: &mock.BoostrapStorerMock{ PutCalled: func(round int64, bootData bootstrapStorage.BootstrapData) error { return nil @@ -666,9 +672,19 @@ func TestCheckProcessorNilParameters(t *testing.T) { }, { args: func() blproc.ArgBaseProcessor { - coreCompCopy := *coreComponents - coreCompCopy.StatusField = nil - return createArgBaseProcessor(&coreCompCopy, dataComponents, bootstrapComponents, statusComponents) + args := createArgBaseProcessor(coreComponents, dataComponents, bootstrapComponents, statusComponents) + args.StatusCoreComponents = nil + return args + }, + expectedErr: process.ErrNilStatusCoreComponentsHolder, + }, + { + args: func() blproc.ArgBaseProcessor { + args := createArgBaseProcessor(coreComponents, dataComponents, bootstrapComponents, statusComponents) + args.StatusCoreComponents = &factory.StatusCoreComponentsStub{ + AppStatusHandlerField: nil, + } + return args }, expectedErr: process.ErrNilAppStatusHandler, }, @@ -2940,6 +2956,9 @@ func TestBaseProcessor_getPruningHandler(t *testing.T) { UserStatePruningQueueSize: 6, }, } + arguments.StatusCoreComponents = &factory.StatusCoreComponentsStub{ + AppStatusHandlerField: &statusHandlerMock.AppStatusHandlerStub{}, + } bp, _ := blproc.NewShardProcessor(arguments) bp.SetLastRestartNonce(1) diff --git a/process/block/export_test.go b/process/block/export_test.go index f1616c4182c..b1d3013b9ba 100644 --- a/process/block/export_test.go +++ b/process/block/export_test.go @@ -20,6 +20,7 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/ElrondNetwork/elrond-go/testscommon/dblookupext" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" + "github.com/ElrondNetwork/elrond-go/testscommon/factory" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" "github.com/ElrondNetwork/elrond-go/testscommon/shardingMocks" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" @@ -126,22 +127,26 @@ func NewShardProcessorEmptyWith3shards( statusComponents := &mock.StatusComponentsMock{ Outport: &testscommon.OutportStub{}, } + statusCoreComponents := &factory.StatusCoreComponentsStub{ + AppStatusHandlerField: &statusHandlerMock.AppStatusHandlerStub{}, + } arguments := ArgShardProcessor{ ArgBaseProcessor: ArgBaseProcessor{ - CoreComponents: coreComponents, - DataComponents: dataComponents, - BootstrapComponents: boostrapComponents, - StatusComponents: statusComponents, - AccountsDB: accountsDb, - ForkDetector: &mock.ForkDetectorMock{}, - NodesCoordinator: nodesCoordinator, - FeeHandler: &mock.FeeAccumulatorStub{}, - RequestHandler: &testscommon.RequestHandlerStub{}, - BlockChainHook: &testscommon.BlockChainHookStub{}, - TxCoordinator: &mock.TransactionCoordinatorMock{}, - EpochStartTrigger: &mock.EpochStartTriggerStub{}, - HeaderValidator: hdrValidator, + CoreComponents: coreComponents, + DataComponents: dataComponents, + BootstrapComponents: boostrapComponents, + StatusComponents: statusComponents, + StatusCoreComponents: statusCoreComponents, + AccountsDB: accountsDb, + ForkDetector: &mock.ForkDetectorMock{}, + NodesCoordinator: nodesCoordinator, + FeeHandler: &mock.FeeAccumulatorStub{}, + RequestHandler: &testscommon.RequestHandlerStub{}, + BlockChainHook: &testscommon.BlockChainHookStub{}, + TxCoordinator: &mock.TransactionCoordinatorMock{}, + EpochStartTrigger: &mock.EpochStartTriggerStub{}, + HeaderValidator: hdrValidator, BootStorer: &mock.BoostrapStorerMock{ PutCalled: func(round int64, bootData bootstrapStorage.BootstrapData) error { return nil diff --git a/process/block/metablock.go b/process/block/metablock.go index e06e9c6242b..33511af71da 100644 --- a/process/block/metablock.go +++ b/process/block/metablock.go @@ -113,7 +113,7 @@ func NewMetaProcessor(arguments ArgMetaProcessor) (*metaProcessor, error) { nodesCoordinator: arguments.NodesCoordinator, uint64Converter: arguments.CoreComponents.Uint64ByteSliceConverter(), requestHandler: arguments.RequestHandler, - appStatusHandler: arguments.CoreComponents.StatusHandler(), + appStatusHandler: arguments.StatusCoreComponents.AppStatusHandler(), blockChainHook: arguments.BlockChainHook, txCoordinator: arguments.TxCoordinator, epochStartTrigger: arguments.EpochStartTrigger, diff --git a/process/block/metablock_test.go b/process/block/metablock_test.go index 1f8d2fbf4bf..4077379209c 100644 --- a/process/block/metablock_test.go +++ b/process/block/metablock_test.go @@ -27,6 +27,7 @@ import ( dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" "github.com/ElrondNetwork/elrond-go/testscommon/dblookupext" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" + "github.com/ElrondNetwork/elrond-go/testscommon/factory" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" "github.com/ElrondNetwork/elrond-go/testscommon/shardingMocks" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" @@ -109,22 +110,27 @@ func createMockMetaArguments( }, } + statusCoreComponents := &factory.StatusCoreComponentsStub{ + AppStatusHandlerField: &statusHandlerMock.AppStatusHandlerStub{}, + } + arguments := blproc.ArgMetaProcessor{ ArgBaseProcessor: blproc.ArgBaseProcessor{ - CoreComponents: coreComponents, - DataComponents: dataComponents, - BootstrapComponents: bootstrapComponents, - StatusComponents: statusComponents, - AccountsDB: accountsDb, - ForkDetector: &mock.ForkDetectorMock{}, - NodesCoordinator: shardingMocks.NewNodesCoordinatorMock(), - FeeHandler: &mock.FeeAccumulatorStub{}, - RequestHandler: &testscommon.RequestHandlerStub{}, - BlockChainHook: &testscommon.BlockChainHookStub{}, - TxCoordinator: &mock.TransactionCoordinatorMock{}, - EpochStartTrigger: &mock.EpochStartTriggerStub{}, - HeaderValidator: headerValidator, - GasHandler: &mock.GasHandlerMock{}, + CoreComponents: coreComponents, + DataComponents: dataComponents, + BootstrapComponents: bootstrapComponents, + StatusComponents: statusComponents, + StatusCoreComponents: statusCoreComponents, + AccountsDB: accountsDb, + ForkDetector: &mock.ForkDetectorMock{}, + NodesCoordinator: shardingMocks.NewNodesCoordinatorMock(), + FeeHandler: &mock.FeeAccumulatorStub{}, + RequestHandler: &testscommon.RequestHandlerStub{}, + BlockChainHook: &testscommon.BlockChainHookStub{}, + TxCoordinator: &mock.TransactionCoordinatorMock{}, + EpochStartTrigger: &mock.EpochStartTriggerStub{}, + HeaderValidator: headerValidator, + GasHandler: &mock.GasHandlerMock{}, BootStorer: &mock.BoostrapStorerMock{ PutCalled: func(round int64, bootData bootstrapStorage.BootstrapData) error { return nil diff --git a/process/block/shardblock.go b/process/block/shardblock.go index 10138272c41..676f943351c 100644 --- a/process/block/shardblock.go +++ b/process/block/shardblock.go @@ -98,7 +98,7 @@ func NewShardProcessor(arguments ArgShardProcessor) (*shardProcessor, error) { nodesCoordinator: arguments.NodesCoordinator, uint64Converter: arguments.CoreComponents.Uint64ByteSliceConverter(), requestHandler: arguments.RequestHandler, - appStatusHandler: arguments.CoreComponents.StatusHandler(), + appStatusHandler: arguments.StatusCoreComponents.AppStatusHandler(), blockChainHook: arguments.BlockChainHook, txCoordinator: arguments.TxCoordinator, roundHandler: arguments.CoreComponents.RoundHandler(), diff --git a/process/economics/testEconomicsData.go b/process/economics/testEconomicsData.go index c9016918463..48253a27c97 100644 --- a/process/economics/testEconomicsData.go +++ b/process/economics/testEconomicsData.go @@ -1,6 +1,10 @@ package economics -import "math/big" +import ( + "math/big" + + "github.com/ElrondNetwork/elrond-go-core/core" +) // TestEconomicsData extends EconomicsData and is used in integration tests as it exposes some functions // that are not supposed to be used in production code @@ -60,3 +64,8 @@ func (ted *TestEconomicsData) SetMaxInflationRate(maximumInflation float64) { ted.yearSettings[0].MaximumInflation = maximumInflation } + +// SetStatusHandler returns nil +func (ted *TestEconomicsData) SetStatusHandler(_ core.AppStatusHandler) error { + return nil +} diff --git a/process/errors.go b/process/errors.go index 70b727a63dd..948f3a76fb2 100644 --- a/process/errors.go +++ b/process/errors.go @@ -19,6 +19,9 @@ var ErrNilBootstrapComponentsHolder = errors.New("nil bootstrap components holde // ErrNilStatusComponentsHolder signals that a nil status components holder was provided var ErrNilStatusComponentsHolder = errors.New("nil status components holder") +// ErrNilStatusCoreComponentsHolder signals that a nil status core components holder was provided +var ErrNilStatusCoreComponentsHolder = errors.New("nil status core components holder") + // ErrNilCryptoComponentsHolder signals that a nil crypto components holder was provided var ErrNilCryptoComponentsHolder = errors.New("nil crypto components holder") diff --git a/process/interface.go b/process/interface.go index ec847e18209..8bfd0c1cd08 100644 --- a/process/interface.go +++ b/process/interface.go @@ -676,6 +676,7 @@ type FeeHandler interface { type EconomicsDataHandler interface { rewardsHandler feeHandler + SetStatusHandler(statusHandler core.AppStatusHandler) error IsInterfaceNil() bool } @@ -1120,7 +1121,6 @@ type CoreComponentsHolder interface { ChainID() string MinTransactionVersion() uint32 TxVersionChecker() TxVersionCheckerHandler - StatusHandler() core.AppStatusHandler GenesisNodesSetup() sharding.GenesisNodesSetupHandler EpochNotifier() EpochNotifier ChanStopNodeProcess() chan endProcess.ArgEndProcess @@ -1146,6 +1146,12 @@ type CryptoComponentsHolder interface { IsInterfaceNil() bool } +// StatusCoreComponentsHolder holds the status core components +type StatusCoreComponentsHolder interface { + AppStatusHandler() core.AppStatusHandler + IsInterfaceNil() bool +} + // NumConnectedPeersProvider defines the actions that a component that provides the number of connected peers should do type NumConnectedPeersProvider interface { ConnectedPeers() []core.PeerID diff --git a/process/mock/coreComponentsMock.go b/process/mock/coreComponentsMock.go index e0a9b844195..9dd70a3e781 100644 --- a/process/mock/coreComponentsMock.go +++ b/process/mock/coreComponentsMock.go @@ -139,11 +139,6 @@ func (ccm *CoreComponentsMock) RoundHandler() consensus.RoundHandler { return ccm.RoundField } -// StatusHandler - -func (ccm *CoreComponentsMock) StatusHandler() core.AppStatusHandler { - return ccm.StatusField -} - // NodeTypeProvider - func (ccm *CoreComponentsMock) NodeTypeProvider() core.NodeTypeProviderHandler { return ccm.NodeTypeProviderField diff --git a/testscommon/components/components.go b/testscommon/components/components.go index 66016b918fb..f15a8b578a4 100644 --- a/testscommon/components/components.go +++ b/testscommon/components/components.go @@ -77,12 +77,11 @@ func GetCoreArgs() coreComp.CoreComponentsFactoryArgs { ConfigPathsHolder: config.ConfigurationPathsHolder{ GasScheduleDirectoryName: "../../cmd/node/config/gasSchedules", }, - RatingsConfig: CreateDummyRatingsConfig(), - EconomicsConfig: CreateDummyEconomicsConfig(), - NodesFilename: "../mock/testdata/nodesSetupMock.json", - WorkingDirectory: "home", - ChanStopNodeProcess: make(chan endProcess.ArgEndProcess), - StatusHandlersFactory: &statusHandlerMock.StatusHandlersFactoryMock{}, + RatingsConfig: CreateDummyRatingsConfig(), + EconomicsConfig: CreateDummyEconomicsConfig(), + NodesFilename: "../mock/testdata/nodesSetupMock.json", + WorkingDirectory: "home", + ChanStopNodeProcess: make(chan endProcess.ArgEndProcess), EpochConfig: config.EpochConfig{ GasSchedule: config.GasScheduleConfig{ GasScheduleByEpochs: []config.GasScheduleByEpochs{ @@ -104,9 +103,29 @@ func GetCoreArgs() coreComp.CoreComponentsFactoryArgs { } // GetStatusCoreArgs - -func GetStatusCoreArgs() statusCore.StatusCoreComponentsFactoryArgs { +func GetStatusCoreArgs(coreComponents factory.CoreComponentsHolder) statusCore.StatusCoreComponentsFactoryArgs { return statusCore.StatusCoreComponentsFactoryArgs{ Config: GetGeneralConfig(), + EpochConfig: config.EpochConfig{ + GasSchedule: config.GasScheduleConfig{ + GasScheduleByEpochs: []config.GasScheduleByEpochs{ + { + StartEpoch: 0, + FileName: "gasScheduleV1.toml", + }, + }, + }, + }, + RoundConfig: config.RoundConfig{ + RoundActivations: map[string]config.ActivationRoundByName{ + "Example": { + Round: "18446744073709551615", + }, + }, + }, + RatingsConfig: CreateDummyRatingsConfig(), + EconomicsConfig: CreateDummyEconomicsConfig(), + CoreComp: coreComponents, } } @@ -142,16 +161,17 @@ func GetConsensusArgs(shardCoordinator sharding.Coordinator) consensusComp.Conse scheduledProcessor, _ := spos.NewScheduledProcessorWrapper(args) return consensusComp.ConsensusComponentsFactoryArgs{ - Config: testscommon.GetGeneralConfig(), - BootstrapRoundIndex: 0, - CoreComponents: coreComponents, - NetworkComponents: networkComponents, - CryptoComponents: cryptoComponents, - DataComponents: dataComponents, - ProcessComponents: processComponents, - StateComponents: stateComponents, - StatusComponents: statusComponents, - ScheduledProcessor: scheduledProcessor, + Config: testscommon.GetGeneralConfig(), + BootstrapRoundIndex: 0, + CoreComponents: coreComponents, + NetworkComponents: networkComponents, + CryptoComponents: cryptoComponents, + DataComponents: dataComponents, + ProcessComponents: processComponents, + StateComponents: stateComponents, + StatusComponents: statusComponents, + StatusCoreComponents: GetStatusCoreComponents(), + ScheduledProcessor: scheduledProcessor, } } @@ -194,6 +214,7 @@ func GetDataArgs(coreComponents factory.CoreComponentsHolder, shardCoordinator s }, ShardCoordinator: shardCoordinator, Core: coreComponents, + StatusCore: GetStatusCoreComponents(), EpochStartNotifier: &mock.EpochStartNotifierStub{}, CurrentEpoch: 0, CreateTrieEpochRootHashStorer: false, @@ -326,6 +347,7 @@ func GetStateFactoryArgs(coreComponents factory.CoreComponentsHolder, shardCoord Config: GetGeneralConfig(), ShardCoordinator: shardCoordinator, Core: coreComponents, + StatusCore: GetStatusCoreComponents(), StorageService: disabled.NewChainStorer(), ProcessingMode: common.Normal, ChainHandler: &testscommon.ChainHandlerStub{}, @@ -357,12 +379,14 @@ func GetBootStrapFactoryArgs() bootstrapComp.BootstrapComponentsFactoryArgs { coreComponents := GetCoreComponents() networkComponents := GetNetworkComponents() cryptoComponents := GetCryptoComponents(coreComponents) + statusCoreComponents := GetStatusCoreComponents() return bootstrapComp.BootstrapComponentsFactoryArgs{ - Config: testscommon.GetGeneralConfig(), - WorkingDir: "home", - CoreComponents: coreComponents, - CryptoComponents: cryptoComponents, - NetworkComponents: networkComponents, + Config: testscommon.GetGeneralConfig(), + WorkingDir: "home", + CoreComponents: coreComponents, + CryptoComponents: cryptoComponents, + NetworkComponents: networkComponents, + StatusCoreComponents: statusCoreComponents, PrefConfig: config.Preferences{ Preferences: config.PreferencesConfig{ DestinationShardAsObserver: "0", @@ -487,6 +511,7 @@ func GetProcessArgs( Network: networkComponents, StatusComponents: statusComponents, BootstrapComponents: bootstrapComponents, + StatusCoreComponents: GetStatusCoreComponents(), RequestedItemsHandler: &testscommon.RequestedItemsHandlerStub{}, WhiteListHandler: &testscommon.WhiteListHandlerStub{}, WhiteListerVerifiedTxs: &testscommon.WhiteListHandlerStub{}, @@ -696,8 +721,12 @@ func GetStateComponents(coreComponents factory.CoreComponentsHolder, shardCoordi // GetStatusCoreComponents - func GetStatusCoreComponents() factory.StatusCoreComponentsHolder { - args := GetStatusCoreArgs() - statusCoreFactory := statusCore.NewStatusCoreComponentsFactory(args) + args := GetStatusCoreArgs(GetCoreComponents()) + statusCoreFactory, err := statusCore.NewStatusCoreComponentsFactory(args) + if err != nil { + log.Error("GetStatusCoreComponents NewStatusCoreComponentsFactory", "error", err.Error()) + return nil + } statusCoreComponents, err := statusCore.NewManagedStatusCoreComponents(statusCoreFactory) if err != nil { diff --git a/testscommon/components/default.go b/testscommon/components/default.go index 25162922da6..c886e257cc8 100644 --- a/testscommon/components/default.go +++ b/testscommon/components/default.go @@ -15,7 +15,6 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon/p2pmocks" "github.com/ElrondNetwork/elrond-go/testscommon/shardingMocks" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" - statusHandlerMock "github.com/ElrondNetwork/elrond-go/testscommon/statusHandler" "github.com/ElrondNetwork/elrond-go/testscommon/storage" trieMock "github.com/ElrondNetwork/elrond-go/testscommon/trie" trieFactory "github.com/ElrondNetwork/elrond-go/trie/factory" @@ -38,7 +37,6 @@ func GetDefaultCoreComponents() *mock.CoreComponentsMock { MinTransactionVersionCalled: func() uint32 { return 1 }, - AppStatusHdl: &statusHandlerMock.AppStatusHandlerStub{}, WatchdogTimer: &testscommon.WatchdogMock{}, AlarmSch: &testscommon.AlarmSchedulerStub{}, NtpSyncTimer: &testscommon.SyncTimerStub{}, diff --git a/testscommon/economicsmocks/economicsDataHandlerStub.go b/testscommon/economicsmocks/economicsDataHandlerStub.go index 4277c3d702f..80e4d41e2c0 100644 --- a/testscommon/economicsmocks/economicsDataHandlerStub.go +++ b/testscommon/economicsmocks/economicsDataHandlerStub.go @@ -3,6 +3,7 @@ package economicsmocks import ( "math/big" + "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/data" ) @@ -38,6 +39,7 @@ type EconomicsHandlerStub struct { ComputeGasUsedAndFeeBasedOnRefundValueCalled func(tx data.TransactionWithFeeHandler, refundValue *big.Int) (uint64, *big.Int) ComputeTxFeeBasedOnGasUsedCalled func(tx data.TransactionWithFeeHandler, gasUsed uint64) *big.Int ComputeGasLimitBasedOnBalanceCalled func(tx data.TransactionWithFeeHandler, balance *big.Int) (uint64, error) + SetStatusHandlerCalled func(statusHandler core.AppStatusHandler) error } // ComputeFeeForProcessing - @@ -292,6 +294,14 @@ func (e *EconomicsHandlerStub) ComputeTxFeeBasedOnGasUsed(tx data.TransactionWit return nil } +// SetStatusHandler - +func (e *EconomicsHandlerStub) SetStatusHandler(statusHandler core.AppStatusHandler) error { + if e.SetStatusHandlerCalled != nil { + return e.SetStatusHandlerCalled(statusHandler) + } + return nil +} + // IsInterfaceNil returns true if there is no value under the interface func (e *EconomicsHandlerStub) IsInterfaceNil() bool { return e == nil diff --git a/testscommon/economicsmocks/economicsHandlerMock.go b/testscommon/economicsmocks/economicsHandlerMock.go index 51218850562..26affa07fad 100644 --- a/testscommon/economicsmocks/economicsHandlerMock.go +++ b/testscommon/economicsmocks/economicsHandlerMock.go @@ -3,6 +3,7 @@ package economicsmocks import ( "math/big" + "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/data" ) @@ -40,6 +41,7 @@ type EconomicsHandlerMock struct { ComputeGasUsedAndFeeBasedOnRefundValueCalled func(tx data.TransactionWithFeeHandler, refundValue *big.Int) (uint64, *big.Int) ComputeTxFeeBasedOnGasUsedCalled func(tx data.TransactionWithFeeHandler, gasUsed uint64) *big.Int ComputeGasLimitBasedOnBalanceCalled func(tx data.TransactionWithFeeHandler, balance *big.Int) (uint64, error) + SetStatusHandlerCalled func(statusHandler core.AppStatusHandler) error } // LeaderPercentage - @@ -279,6 +281,14 @@ func (ehm *EconomicsHandlerMock) ComputeTxFeeBasedOnGasUsed(tx data.TransactionW return big.NewInt(0) } +// SetStatusHandler - +func (ehm *EconomicsHandlerMock) SetStatusHandler(statusHandler core.AppStatusHandler) error { + if ehm.SetStatusHandlerCalled != nil { + return ehm.SetStatusHandlerCalled(statusHandler) + } + return nil +} + // IsInterfaceNil returns true if there is no value under the interface func (ehm *EconomicsHandlerMock) IsInterfaceNil() bool { return ehm == nil diff --git a/testscommon/factory/statusCoreComponentsStub.go b/testscommon/factory/statusCoreComponentsStub.go new file mode 100644 index 00000000000..7105c3e098d --- /dev/null +++ b/testscommon/factory/statusCoreComponentsStub.go @@ -0,0 +1,66 @@ +package factory + +import ( + "github.com/ElrondNetwork/elrond-go-core/core" + "github.com/ElrondNetwork/elrond-go/factory" + "github.com/ElrondNetwork/elrond-go/node/external" +) + +// StatusCoreComponentsStub - +type StatusCoreComponentsStub struct { + ResourceMonitorField factory.ResourceMonitor + NetworkStatisticsField factory.NetworkStatisticsProvider + AppStatusHandlerField core.AppStatusHandler + StatusMetricsField external.StatusMetricsHandler + PersistentStatusHandlerField factory.PersistenStatusHandler +} + +// Create - +func (stub *StatusCoreComponentsStub) Create() error { + return nil +} + +// Close - +func (stub *StatusCoreComponentsStub) Close() error { + return nil +} + +// CheckSubcomponents - +func (stub *StatusCoreComponentsStub) CheckSubcomponents() error { + return nil +} + +// String - +func (stub *StatusCoreComponentsStub) String() string { + return "" +} + +// ResourceMonitor - +func (stub *StatusCoreComponentsStub) ResourceMonitor() factory.ResourceMonitor { + return stub.ResourceMonitorField +} + +// NetworkStatistics - +func (stub *StatusCoreComponentsStub) NetworkStatistics() factory.NetworkStatisticsProvider { + return stub.NetworkStatisticsField +} + +// AppStatusHandler - +func (stub *StatusCoreComponentsStub) AppStatusHandler() core.AppStatusHandler { + return stub.AppStatusHandlerField +} + +// StatusMetrics - +func (stub *StatusCoreComponentsStub) StatusMetrics() external.StatusMetricsHandler { + return stub.StatusMetricsField +} + +// PersistentStatusHandler - +func (stub *StatusCoreComponentsStub) PersistentStatusHandler() factory.PersistenStatusHandler { + return stub.PersistentStatusHandlerField +} + +// IsInterfaceNil - +func (stub *StatusCoreComponentsStub) IsInterfaceNil() bool { + return stub == nil +} diff --git a/testscommon/statusHandler/statusHandlerUtilsFactoryMock.go b/testscommon/statusHandler/statusHandlerUtilsFactoryMock.go deleted file mode 100644 index 5e87dda96aa..00000000000 --- a/testscommon/statusHandler/statusHandlerUtilsFactoryMock.go +++ /dev/null @@ -1,20 +0,0 @@ -package statusHandler - -import ( - "github.com/ElrondNetwork/elrond-go-core/data/typeConverters" - "github.com/ElrondNetwork/elrond-go-core/marshal" - "github.com/ElrondNetwork/elrond-go/cmd/node/factory" - "github.com/ElrondNetwork/elrond-go/statusHandler" -) - -// StatusHandlersFactoryMock - -type StatusHandlersFactoryMock struct { -} - -// Create - -func (shfm *StatusHandlersFactoryMock) Create(_ marshal.Marshalizer, _ typeConverters.Uint64ByteSliceConverter) (factory.StatusHandlersUtils, error) { - return &StatusHandlersUtilsMock{ - AppStatusHandler: NewAppStatusHandlerMock(), - StatusMetrics: statusHandler.NewStatusMetrics(), - }, nil -} diff --git a/testscommon/statusHandler/statusHandlersUtilsMock.go b/testscommon/statusHandler/statusHandlersUtilsMock.go deleted file mode 100644 index ade32053a04..00000000000 --- a/testscommon/statusHandler/statusHandlersUtilsMock.go +++ /dev/null @@ -1,33 +0,0 @@ -package statusHandler - -import ( - "github.com/ElrondNetwork/elrond-go-core/core" - "github.com/ElrondNetwork/elrond-go/node/external" - "github.com/ElrondNetwork/elrond-go/storage" -) - -// StatusHandlersUtilsMock - -type StatusHandlersUtilsMock struct { - StatusMetrics external.StatusMetricsHandler - AppStatusHandler core.AppStatusHandler -} - -// UpdateStorerAndMetricsForPersistentHandler - -func (shum *StatusHandlersUtilsMock) UpdateStorerAndMetricsForPersistentHandler(_ storage.Storer) error { - return nil -} - -// StatusHandler - -func (shum *StatusHandlersUtilsMock) StatusHandler() core.AppStatusHandler { - return shum.AppStatusHandler -} - -// Metrics - -func (shum *StatusHandlersUtilsMock) Metrics() external.StatusMetricsHandler { - return shum.StatusMetrics -} - -// IsInterfaceNil - -func (shum *StatusHandlersUtilsMock) IsInterfaceNil() bool { - return shum == nil -} diff --git a/update/errors.go b/update/errors.go index 0acd9ed16bf..8ffa584a289 100644 --- a/update/errors.go +++ b/update/errors.go @@ -242,9 +242,6 @@ var ErrEmptyExportFolderPath = errors.New("empty export folder path") // ErrNilGenesisNodesSetupHandler signals that a nil genesis nodes setup handler has been provided var ErrNilGenesisNodesSetupHandler = errors.New("nil genesis nodes setup handler") -// ErrNilEpochNotifier signals that the provided EpochNotifier is nil -var ErrNilEpochNotifier = errors.New("nil EpochNotifier") - // ErrWrongImportedMiniBlocksMap signals that wrong imported miniBlocks map was provided var ErrWrongImportedMiniBlocksMap = errors.New("wrong imported miniBlocks map was provided") @@ -283,3 +280,9 @@ var ErrInvalidNumConcurrentTrieSyncers = errors.New("invalid num concurrent trie // ErrNilPeersRatingHandler signals that a nil peers rating handler implementation has been provided var ErrNilPeersRatingHandler = errors.New("nil peers rating handler") + +// ErrNilStatusCoreComponentsHolder signals that a nil status core components holder was provided +var ErrNilStatusCoreComponentsHolder = errors.New("nil status core components holder") + +// ErrNilAppStatusHandler signals that a nil app status handler was provided +var ErrNilAppStatusHandler = errors.New("nil app status handler") diff --git a/update/factory/exportHandlerFactory.go b/update/factory/exportHandlerFactory.go index 8ccaca368ba..eab0978f459 100644 --- a/update/factory/exportHandlerFactory.go +++ b/update/factory/exportHandlerFactory.go @@ -39,6 +39,7 @@ var log = logger.GetOrCreate("update/factory") type ArgsExporter struct { CoreComponents process.CoreComponentsHolder CryptoComponents process.CryptoComponentsHolder + StatusCoreComponents process.StatusCoreComponentsHolder HeaderValidator epochStart.HeaderValidator DataPool dataRetriever.PoolsHolder StorageService dataRetriever.StorageService @@ -73,6 +74,7 @@ type ArgsExporter struct { type exportHandlerFactory struct { CoreComponents process.CoreComponentsHolder CryptoComponents process.CryptoComponentsHolder + statusCoreComponents process.StatusCoreComponentsHolder headerValidator epochStart.HeaderValidator dataPool dataRetriever.PoolsHolder storageService dataRetriever.StorageService @@ -222,6 +224,12 @@ func NewExportHandlerFactory(args ArgsExporter) (*exportHandlerFactory, error) { if err != nil { return nil, err } + if check.IfNil(args.StatusCoreComponents) { + return nil, update.ErrNilStatusCoreComponentsHolder + } + if check.IfNil(args.StatusCoreComponents.AppStatusHandler()) { + return nil, update.ErrNilAppStatusHandler + } e := &exportHandlerFactory{ CoreComponents: args.CoreComponents, @@ -297,7 +305,7 @@ func (e *exportHandlerFactory) Create() (update.ExportHandler, error) { Finality: process.BlockFinality, PeerMiniBlocksSyncer: peerMiniBlocksSyncer, RoundHandler: e.roundHandler, - AppStatusHandler: e.CoreComponents.StatusHandler(), + AppStatusHandler: e.statusCoreComponents.AppStatusHandler(), EnableEpochsHandler: e.CoreComponents.EnableEpochsHandler(), } epochHandler, err := shardchain.NewEpochStartTrigger(&argsEpochTrigger) From aa489761443c32e749200bc7d9d2200bbb071559 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Fri, 28 Oct 2022 14:28:47 +0300 Subject: [PATCH 102/110] fixes after merge --- node/nodeRunner.go | 1 + testscommon/factory/statusCoreComponentsStub.go | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/node/nodeRunner.go b/node/nodeRunner.go index fb0468c7da5..9055d0f090c 100644 --- a/node/nodeRunner.go +++ b/node/nodeRunner.go @@ -820,6 +820,7 @@ func (nr *nodeRunner) CreateManagedConsensusComponents( stateComponents mainFactory.StateComponentsHolder, statusComponents mainFactory.StatusComponentsHolder, processComponents mainFactory.ProcessComponentsHolder, + statusCoreComponents mainFactory.StatusCoreComponentsHolder, ) (mainFactory.ConsensusComponentsHandler, error) { scheduledProcessorArgs := spos.ScheduledProcessorWrapperArgs{ SyncTimer: coreComponents.SyncTimer(), diff --git a/testscommon/factory/statusCoreComponentsStub.go b/testscommon/factory/statusCoreComponentsStub.go index 7105c3e098d..2f2dda1382e 100644 --- a/testscommon/factory/statusCoreComponentsStub.go +++ b/testscommon/factory/statusCoreComponentsStub.go @@ -10,6 +10,7 @@ import ( type StatusCoreComponentsStub struct { ResourceMonitorField factory.ResourceMonitor NetworkStatisticsField factory.NetworkStatisticsProvider + TrieSyncStatisticsField factory.TrieSyncStatisticsProvider AppStatusHandlerField core.AppStatusHandler StatusMetricsField external.StatusMetricsHandler PersistentStatusHandlerField factory.PersistenStatusHandler @@ -45,6 +46,11 @@ func (stub *StatusCoreComponentsStub) NetworkStatistics() factory.NetworkStatist return stub.NetworkStatisticsField } +// TrieSyncStatistics - +func (stub *StatusCoreComponentsStub) TrieSyncStatistics() factory.TrieSyncStatisticsProvider { + return stub.TrieSyncStatisticsField +} + // AppStatusHandler - func (stub *StatusCoreComponentsStub) AppStatusHandler() core.AppStatusHandler { return stub.AppStatusHandlerField From 77ff96553fd752bfbe652bfffa564950c39d6096 Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Fri, 28 Oct 2022 15:24:23 +0300 Subject: [PATCH 103/110] fixes after review --- consensus/broadcast/delayedBroadcast.go | 2 +- factory/mock/singlesignerMock.go | 12 ++++++------ genesis/checking/nodesSetupChecker_test.go | 2 +- node/mock/singlesignerMock.go | 12 ++++++------ process/economics/interface.go | 2 +- sharding/interface.go | 20 ++++++++++---------- vm/systemSmartContracts/staking_test.go | 2 +- 7 files changed, 26 insertions(+), 26 deletions(-) diff --git a/consensus/broadcast/delayedBroadcast.go b/consensus/broadcast/delayedBroadcast.go index ff4f32753f6..4e24b6d5151 100644 --- a/consensus/broadcast/delayedBroadcast.go +++ b/consensus/broadcast/delayedBroadcast.go @@ -649,7 +649,7 @@ func (dbb *delayedBlockBroadcaster) interceptedHeader(_ string, headerHash []byt if sameHeader { dbb.valHeaderBroadcastData = append(dbb.valHeaderBroadcastData[:i], dbb.valHeaderBroadcastData[i+1:]...) - // leader has broadcast the header, so we can cancel the header alarm + // leader has already broadcast the header, so we can cancel the header alarm alarmID := prefixHeaderAlarm + hex.EncodeToString(headerHash) alarmsToCancel = append(alarmsToCancel, alarmID) log.Trace("delayedBlockBroadcaster.interceptedHeader: leader has broadcast header, validator cancelling alarm", diff --git a/factory/mock/singlesignerMock.go b/factory/mock/singlesignerMock.go index 6760d7e343c..c663c9714b5 100644 --- a/factory/mock/singlesignerMock.go +++ b/factory/mock/singlesignerMock.go @@ -11,12 +11,12 @@ import ( type SinglesignMock struct { } -// Sign signs a message with using a single signature schnorr scheme +// Sign signs a message using a single signature Schnorr scheme func (s *SinglesignMock) Sign(_ crypto.PrivateKey, _ []byte) ([]byte, error) { return []byte("signed"), nil } -// Verify verifies a signature using a single signature schnorr scheme +// Verify verifies a signature using a single signature Schnorr scheme func (s *SinglesignMock) Verify(_ crypto.PublicKey, _ []byte, sig []byte) error { verSig := []byte("signed") @@ -35,12 +35,12 @@ func (s *SinglesignMock) IsInterfaceNil() bool { type SinglesignFailMock struct { } -// Sign signs a message with using a single signature schnorr scheme +// Sign signs a message using a single signature Schnorr scheme func (s *SinglesignFailMock) Sign(_ crypto.PrivateKey, _ []byte) ([]byte, error) { return nil, errors.New("signing failure") } -// Verify verifies a signature using a single signature schnorr scheme +// Verify verifies a signature using a single signature Schnorr scheme func (s *SinglesignFailMock) Verify(_ crypto.PublicKey, _ []byte, _ []byte) error { return errors.New("signature verification failure") } @@ -56,12 +56,12 @@ type SinglesignStub struct { VerifyCalled func(public crypto.PublicKey, msg []byte, sig []byte) error } -// Sign signs a message with using a single signature schnorr scheme +// Sign signs a message using a single signature Schnorr scheme func (s *SinglesignStub) Sign(private crypto.PrivateKey, msg []byte) ([]byte, error) { return s.SignCalled(private, msg) } -// Verify verifies a signature using a single signature schnorr scheme +// Verify verifies a signature using a single signature Schnorr scheme func (s *SinglesignStub) Verify(public crypto.PublicKey, msg []byte, sig []byte) error { return s.VerifyCalled(public, msg, sig) } diff --git a/genesis/checking/nodesSetupChecker_test.go b/genesis/checking/nodesSetupChecker_test.go index 2460ee49a5d..18362f494f5 100644 --- a/genesis/checking/nodesSetupChecker_test.go +++ b/genesis/checking/nodesSetupChecker_test.go @@ -347,7 +347,7 @@ func TestNewNodeSetupChecker_CheckStakedAndDelegatedShouldWork(t *testing.T) { ) assert.Nil(t, err) - //the following 2 asserts assure that the original values did not change + // the following 2 asserts assure that the original values did not change assert.Equal(t, nodePrice, iaStaked.StakingValue) assert.Equal(t, nodePrice, iaDelegated.Delegation.Value) } diff --git a/node/mock/singlesignerMock.go b/node/mock/singlesignerMock.go index 6760d7e343c..c663c9714b5 100644 --- a/node/mock/singlesignerMock.go +++ b/node/mock/singlesignerMock.go @@ -11,12 +11,12 @@ import ( type SinglesignMock struct { } -// Sign signs a message with using a single signature schnorr scheme +// Sign signs a message using a single signature Schnorr scheme func (s *SinglesignMock) Sign(_ crypto.PrivateKey, _ []byte) ([]byte, error) { return []byte("signed"), nil } -// Verify verifies a signature using a single signature schnorr scheme +// Verify verifies a signature using a single signature Schnorr scheme func (s *SinglesignMock) Verify(_ crypto.PublicKey, _ []byte, sig []byte) error { verSig := []byte("signed") @@ -35,12 +35,12 @@ func (s *SinglesignMock) IsInterfaceNil() bool { type SinglesignFailMock struct { } -// Sign signs a message with using a single signature schnorr scheme +// Sign signs a message using a single signature Schnorr scheme func (s *SinglesignFailMock) Sign(_ crypto.PrivateKey, _ []byte) ([]byte, error) { return nil, errors.New("signing failure") } -// Verify verifies a signature using a single signature schnorr scheme +// Verify verifies a signature using a single signature Schnorr scheme func (s *SinglesignFailMock) Verify(_ crypto.PublicKey, _ []byte, _ []byte) error { return errors.New("signature verification failure") } @@ -56,12 +56,12 @@ type SinglesignStub struct { VerifyCalled func(public crypto.PublicKey, msg []byte, sig []byte) error } -// Sign signs a message with using a single signature schnorr scheme +// Sign signs a message using a single signature Schnorr scheme func (s *SinglesignStub) Sign(private crypto.PrivateKey, msg []byte) ([]byte, error) { return s.SignCalled(private, msg) } -// Verify verifies a signature using a single signature schnorr scheme +// Verify verifies a signature using a single signature Schnorr scheme func (s *SinglesignStub) Verify(public crypto.PublicKey, msg []byte, sig []byte) error { return s.VerifyCalled(public, msg, sig) } diff --git a/process/economics/interface.go b/process/economics/interface.go index fdbf4e8c5ed..c8e4daa71cf 100644 --- a/process/economics/interface.go +++ b/process/economics/interface.go @@ -5,7 +5,7 @@ import ( vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) -// BuiltInFunctionsCostHandler is able to calculate the cost of a built in function call +// BuiltInFunctionsCostHandler is able to calculate the cost of a built-in function call type BuiltInFunctionsCostHandler interface { ComputeBuiltInCost(tx data.TransactionWithFeeHandler) uint64 IsBuiltInFuncCall(tx data.TransactionWithFeeHandler) bool diff --git a/sharding/interface.go b/sharding/interface.go index 2d61cbd966d..3c5b2540e2b 100644 --- a/sharding/interface.go +++ b/sharding/interface.go @@ -18,25 +18,25 @@ type EpochHandler interface { IsInterfaceNil() bool } -//PeerAccountListAndRatingHandler provides Rating Computation Capabilites for the Nodes Coordinator and ValidatorStatistics +// PeerAccountListAndRatingHandler provides Rating Computation Capabilites for the Nodes Coordinator and ValidatorStatistics type PeerAccountListAndRatingHandler interface { - //GetChance returns the chances for the rating + // GetChance returns the chances for the rating GetChance(uint32) uint32 - //GetStartRating gets the start rating values + // GetStartRating gets the start rating values GetStartRating() uint32 - //GetSignedBlocksThreshold gets the threshold for the minimum signed blocks + // GetSignedBlocksThreshold gets the threshold for the minimum signed blocks GetSignedBlocksThreshold() float32 - //ComputeIncreaseProposer computes the new rating for the increaseLeader + // ComputeIncreaseProposer computes the new rating for the increaseLeader ComputeIncreaseProposer(shardId uint32, currentRating uint32) uint32 - //ComputeDecreaseProposer computes the new rating for the decreaseLeader + // ComputeDecreaseProposer computes the new rating for the decreaseLeader ComputeDecreaseProposer(shardId uint32, currentRating uint32, consecutiveMisses uint32) uint32 - //RevertIncreaseValidator computes the new rating if a revert for increaseProposer should be done + // RevertIncreaseValidator computes the new rating if a revert for increaseProposer should be done RevertIncreaseValidator(shardId uint32, currentRating uint32, nrReverts uint32) uint32 - //ComputeIncreaseValidator computes the new rating for the increaseValidator + // ComputeIncreaseValidator computes the new rating for the increaseValidator ComputeIncreaseValidator(shardId uint32, currentRating uint32) uint32 - //ComputeDecreaseValidator computes the new rating for the decreaseValidator + // ComputeDecreaseValidator computes the new rating for the decreaseValidator ComputeDecreaseValidator(shardId uint32, currentRating uint32) uint32 - //IsInterfaceNil verifies if the interface is nil + // IsInterfaceNil verifies if the interface is nil IsInterfaceNil() bool } diff --git a/vm/systemSmartContracts/staking_test.go b/vm/systemSmartContracts/staking_test.go index a4645712868..0b00b26a6c2 100644 --- a/vm/systemSmartContracts/staking_test.go +++ b/vm/systemSmartContracts/staking_test.go @@ -1032,7 +1032,7 @@ func TestStakingSc_StakeWithV1ShouldWork(t *testing.T) { // 2 -- will try to do jail before stake should return user error // 3 -- will stake and stake should work // 4 -- will jail user that stake and should work -// 5 -- will try to do to unStake and should not work because cannot do unStake if validator is jail +// 5 -- will try to do to unStake and should not work because cannot do unStake if validator is jailed // 6 -- will try to do unJail with wrong access address should not work // 7 -- will do unJail with correct parameters and should work and after that stakeValue should be 999 func TestStakingSc_StakeJailAndUnJail(t *testing.T) { From 1a0456967f9a9c0e813cee486e80d2dc1a450f95 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Fri, 28 Oct 2022 17:27:12 +0300 Subject: [PATCH 104/110] fix after review --- factory/interface.go | 6 +-- factory/statusCore/statusCoreComponents.go | 45 ++++++++++++------- .../statusCore/statusCoreComponentsHandler.go | 2 +- .../factory/statusCoreComponentsStub.go | 4 +- 4 files changed, 35 insertions(+), 22 deletions(-) diff --git a/factory/interface.go b/factory/interface.go index fdb7c9b708e..fa2eeaba569 100644 --- a/factory/interface.go +++ b/factory/interface.go @@ -148,7 +148,7 @@ type StatusCoreComponentsHolder interface { TrieSyncStatistics() TrieSyncStatisticsProvider AppStatusHandler() core.AppStatusHandler StatusMetrics() external.StatusMetricsHandler - PersistentStatusHandler() PersistenStatusHandler + PersistentStatusHandler() PersistentStatusHandler IsInterfaceNil() bool } @@ -523,8 +523,8 @@ type TrieSyncStatisticsProvider interface { NumIterations() int } -// PersistenStatusHandler defines a persistend status handler -type PersistenStatusHandler interface { +// PersistentStatusHandler defines a persistent status handler +type PersistentStatusHandler interface { core.AppStatusHandler SetStorage(store storage.Storer) error } diff --git a/factory/statusCore/statusCoreComponents.go b/factory/statusCore/statusCoreComponents.go index 6f8798e1d89..916900cd5fb 100644 --- a/factory/statusCore/statusCoreComponents.go +++ b/factory/statusCore/statusCoreComponents.go @@ -9,11 +9,11 @@ import ( "github.com/ElrondNetwork/elrond-go/config" errErd "github.com/ElrondNetwork/elrond-go/errors" "github.com/ElrondNetwork/elrond-go/factory" - trieStatistics "github.com/ElrondNetwork/elrond-go/trie/statistics" "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/node/metrics" "github.com/ElrondNetwork/elrond-go/statusHandler" "github.com/ElrondNetwork/elrond-go/statusHandler/persister" + trieStatistics "github.com/ElrondNetwork/elrond-go/trie/statistics" ) var log = logger.GetOrCreate("factory") @@ -45,7 +45,7 @@ type statusCoreComponents struct { trieSyncStatistics factory.TrieSyncStatisticsProvider appStatusHandler core.AppStatusHandler statusMetrics external.StatusMetricsHandler - persistentHandler factory.PersistenStatusHandler + persistentHandler factory.PersistentStatusHandler } // NewStatusCoreComponentsFactory initializes the factory which is responsible to creating status core components @@ -98,6 +98,24 @@ func (sccf *statusCoreComponentsFactory) Create() (*statusCoreComponents, error) resourceMonitor.StartMonitoring() } + appStatusHandler, statusMetrics, persistentStatusHandler, err := sccf.createStatusHandler() + if err != nil { + return nil, err + } + + ssc := &statusCoreComponents{ + resourceMonitor: resourceMonitor, + networkStatistics: netStats, + trieSyncStatistics: trieStatistics.NewTrieSyncStatistics(), + appStatusHandler: appStatusHandler, + statusMetrics: statusMetrics, + persistentHandler: persistentStatusHandler, + } + + return ssc, nil +} + +func (sccf *statusCoreComponentsFactory) createStatusHandler() (core.AppStatusHandler, external.StatusMetricsHandler, factory.PersistentStatusHandler, error) { var appStatusHandlers []core.AppStatusHandler var handler core.AppStatusHandler statusMetrics := statusHandler.NewStatusMetrics() @@ -105,47 +123,42 @@ func (sccf *statusCoreComponentsFactory) Create() (*statusCoreComponents, error) persistentHandler, err := persister.NewPersistentStatusHandler(sccf.coreComp.InternalMarshalizer(), sccf.coreComp.Uint64ByteSliceConverter()) if err != nil { - return nil, err + return nil, nil, nil, err } appStatusHandlers = append(appStatusHandlers, persistentHandler) if len(appStatusHandlers) > 0 { handler, err = statusHandler.NewAppStatusFacadeWithHandlers(appStatusHandlers...) if err != nil { - log.Warn("cannot init AppStatusFacade", "error", err) + log.Warn("cannot init AppStatusFacade, will start with NilStatusHandler", "error", err) + handler = statusHandler.NewNilStatusHandler() } } else { handler = statusHandler.NewNilStatusHandler() - log.Debug("no AppStatusHandler used: started with NilStatusHandler") + log.Debug("no AppStatusHandler used: will start with NilStatusHandler") } err = metrics.InitBaseMetrics(handler) if err != nil { - return nil, err + return nil, nil, nil, err } err = metrics.InitConfigMetrics(handler, sccf.epochConfig, sccf.economicsConfig, sccf.coreComp.GenesisNodesSetup()) if err != nil { - return nil, err + return nil, nil, nil, err } err = metrics.InitRatingsMetrics(handler, sccf.ratingsConfig) if err != nil { - return nil, err + return nil, nil, nil, err } err = sccf.coreComp.EconomicsData().SetStatusHandler(handler) if err != nil { log.Debug("cannot set status handler to economicsData", "error", err) + return nil, nil, nil, err } - return &statusCoreComponents{ - resourceMonitor: resourceMonitor, - networkStatistics: netStats, - trieSyncStatistics: trieStatistics.NewTrieSyncStatistics(), - appStatusHandler: handler, - statusMetrics: statusMetrics, - persistentHandler: persistentHandler, - }, nil + return handler, statusMetrics, persistentHandler, nil } // Close closes all underlying components diff --git a/factory/statusCore/statusCoreComponentsHandler.go b/factory/statusCore/statusCoreComponentsHandler.go index a9803a95435..4d18080adc7 100644 --- a/factory/statusCore/statusCoreComponentsHandler.go +++ b/factory/statusCore/statusCoreComponentsHandler.go @@ -158,7 +158,7 @@ func (mscc *managedStatusCoreComponents) StatusMetrics() external.StatusMetricsH } // PersistentStatusHandler returns the persistent handler instance -func (mscc *managedStatusCoreComponents) PersistentStatusHandler() factory.PersistenStatusHandler { +func (mscc *managedStatusCoreComponents) PersistentStatusHandler() factory.PersistentStatusHandler { mscc.mutCoreComponents.RLock() defer mscc.mutCoreComponents.RUnlock() diff --git a/testscommon/factory/statusCoreComponentsStub.go b/testscommon/factory/statusCoreComponentsStub.go index 2f2dda1382e..3ab59080d35 100644 --- a/testscommon/factory/statusCoreComponentsStub.go +++ b/testscommon/factory/statusCoreComponentsStub.go @@ -13,7 +13,7 @@ type StatusCoreComponentsStub struct { TrieSyncStatisticsField factory.TrieSyncStatisticsProvider AppStatusHandlerField core.AppStatusHandler StatusMetricsField external.StatusMetricsHandler - PersistentStatusHandlerField factory.PersistenStatusHandler + PersistentStatusHandlerField factory.PersistentStatusHandler } // Create - @@ -62,7 +62,7 @@ func (stub *StatusCoreComponentsStub) StatusMetrics() external.StatusMetricsHand } // PersistentStatusHandler - -func (stub *StatusCoreComponentsStub) PersistentStatusHandler() factory.PersistenStatusHandler { +func (stub *StatusCoreComponentsStub) PersistentStatusHandler() factory.PersistentStatusHandler { return stub.PersistentStatusHandlerField } From ea3c20b6b9872bd5761efd080c3aeca8892cb270 Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Mon, 31 Oct 2022 11:02:19 +0200 Subject: [PATCH 105/110] fixes after review --- factory/mock/singlesignerMock.go | 12 ++++---- genesis/parsing/accountsParser_test.go | 2 +- integrationTests/mock/roundHandlerMock.go | 30 ++++++++++---------- node/external/blockAPI/baseBlock_test.go | 2 +- node/mock/hasherFake.go | 34 ----------------------- node/mock/singlesignerMock.go | 12 ++++---- node/nodeLoadAccounts_test.go | 2 +- 7 files changed, 30 insertions(+), 64 deletions(-) delete mode 100644 node/mock/hasherFake.go diff --git a/factory/mock/singlesignerMock.go b/factory/mock/singlesignerMock.go index c663c9714b5..b78242b2391 100644 --- a/factory/mock/singlesignerMock.go +++ b/factory/mock/singlesignerMock.go @@ -11,12 +11,12 @@ import ( type SinglesignMock struct { } -// Sign signs a message using a single signature Schnorr scheme +// Sign signs a message using a single signature func (s *SinglesignMock) Sign(_ crypto.PrivateKey, _ []byte) ([]byte, error) { return []byte("signed"), nil } -// Verify verifies a signature using a single signature Schnorr scheme +// Verify verifies a signature using a single signature func (s *SinglesignMock) Verify(_ crypto.PublicKey, _ []byte, sig []byte) error { verSig := []byte("signed") @@ -35,12 +35,12 @@ func (s *SinglesignMock) IsInterfaceNil() bool { type SinglesignFailMock struct { } -// Sign signs a message using a single signature Schnorr scheme +// Sign signs a message using a single signature func (s *SinglesignFailMock) Sign(_ crypto.PrivateKey, _ []byte) ([]byte, error) { return nil, errors.New("signing failure") } -// Verify verifies a signature using a single signature Schnorr scheme +// Verify verifies a signature using a single signature func (s *SinglesignFailMock) Verify(_ crypto.PublicKey, _ []byte, _ []byte) error { return errors.New("signature verification failure") } @@ -56,12 +56,12 @@ type SinglesignStub struct { VerifyCalled func(public crypto.PublicKey, msg []byte, sig []byte) error } -// Sign signs a message using a single signature Schnorr scheme +// Sign signs a message using a single signature func (s *SinglesignStub) Sign(private crypto.PrivateKey, msg []byte) ([]byte, error) { return s.SignCalled(private, msg) } -// Verify verifies a signature using a single signature Schnorr scheme +// Verify verifies a signature using a single signature func (s *SinglesignStub) Verify(public crypto.PublicKey, msg []byte, sig []byte) error { return s.VerifyCalled(public, msg, sig) } diff --git a/genesis/parsing/accountsParser_test.go b/genesis/parsing/accountsParser_test.go index a86f0ae9ec3..3d53f2a980d 100644 --- a/genesis/parsing/accountsParser_test.go +++ b/genesis/parsing/accountsParser_test.go @@ -702,7 +702,7 @@ func TestAccountsParser_GenerateInitialTransactionsVerifyTxsHashes(t *testing.T) ap := parsing.NewTestAccountsParser(createMockHexPubkeyConverter()) balance := int64(1) - var ibs []*data.InitialAccount + ibs := make([]*data.InitialAccount, 0) ap.SetEntireSupply(big.NewInt(int64(len(ibs)) * balance)) ap.SetInitialAccounts(ibs) diff --git a/integrationTests/mock/roundHandlerMock.go b/integrationTests/mock/roundHandlerMock.go index 6346412577e..65a7ef5cc10 100644 --- a/integrationTests/mock/roundHandlerMock.go +++ b/integrationTests/mock/roundHandlerMock.go @@ -12,42 +12,42 @@ type RoundHandlerMock struct { } // BeforeGenesis - -func (rndm *RoundHandlerMock) BeforeGenesis() bool { - if rndm.BeforeGenesisCalled != nil { - return rndm.BeforeGenesisCalled() +func (mock *RoundHandlerMock) BeforeGenesis() bool { + if mock.BeforeGenesisCalled != nil { + return mock.BeforeGenesisCalled() } return false } // Index - -func (rndm *RoundHandlerMock) Index() int64 { - return rndm.IndexField +func (mock *RoundHandlerMock) Index() int64 { + return mock.IndexField } // UpdateRound - -func (rndm *RoundHandlerMock) UpdateRound(time.Time, time.Time) { +func (mock *RoundHandlerMock) UpdateRound(time.Time, time.Time) { } // TimeStamp - -func (rndm *RoundHandlerMock) TimeStamp() time.Time { - return rndm.TimeStampField +func (mock *RoundHandlerMock) TimeStamp() time.Time { + return mock.TimeStampField } // TimeDuration - -func (rndm *RoundHandlerMock) TimeDuration() time.Duration { - if rndm.TimeDurationField.Seconds() == 0 { +func (mock *RoundHandlerMock) TimeDuration() time.Duration { + if mock.TimeDurationField.Seconds() == 0 { return time.Second } - return rndm.TimeDurationField + return mock.TimeDurationField } // RemainingTime - -func (rndm *RoundHandlerMock) RemainingTime(_ time.Time, _ time.Duration) time.Duration { - return rndm.RemainingTimeField +func (mock *RoundHandlerMock) RemainingTime(_ time.Time, _ time.Duration) time.Duration { + return mock.RemainingTimeField } // IsInterfaceNil - -func (rndm *RoundHandlerMock) IsInterfaceNil() bool { - return rndm == nil +func (mock *RoundHandlerMock) IsInterfaceNil() bool { + return mock == nil } diff --git a/node/external/blockAPI/baseBlock_test.go b/node/external/blockAPI/baseBlock_test.go index 1751af762cc..11031ef3c94 100644 --- a/node/external/blockAPI/baseBlock_test.go +++ b/node/external/blockAPI/baseBlock_test.go @@ -35,7 +35,7 @@ func createBaseBlockProcessor() *baseAPIBlockProcessor { marshalizer: &mock.MarshalizerFake{}, uint64ByteSliceConverter: mock.NewNonceHashConverterMock(), historyRepo: &dblookupext.HistoryRepositoryStub{}, - hasher: &mock.HasherFake{}, + hasher: &mock.HasherMock{}, addressPubKeyConverter: mock.NewPubkeyConverterMock(32), txStatusComputer: &mock.StatusComputerStub{}, apiTransactionHandler: &mock.TransactionAPIHandlerStub{}, diff --git a/node/mock/hasherFake.go b/node/mock/hasherFake.go deleted file mode 100644 index 148e51bb9cf..00000000000 --- a/node/mock/hasherFake.go +++ /dev/null @@ -1,34 +0,0 @@ -package mock - -import "crypto/sha256" - -var sha256EmptyHash []byte - -// HasherFake that will be used for testing -type HasherFake struct { -} - -// Compute will output the SHA's equivalent of the input string -func (sha HasherFake) Compute(s string) []byte { - h := sha256.New() - _, _ = h.Write([]byte(s)) - return h.Sum(nil) -} - -// EmptyHash will return the equivalent of empty string SHA's -func (sha HasherFake) EmptyHash() []byte { - if len(sha256EmptyHash) == 0 { - sha256EmptyHash = sha.Compute("") - } - return sha256EmptyHash -} - -// Size return the required size in bytes -func (HasherFake) Size() int { - return sha256.Size -} - -// IsInterfaceNil returns true if there is no value under the interface -func (sha HasherFake) IsInterfaceNil() bool { - return false -} diff --git a/node/mock/singlesignerMock.go b/node/mock/singlesignerMock.go index c663c9714b5..b78242b2391 100644 --- a/node/mock/singlesignerMock.go +++ b/node/mock/singlesignerMock.go @@ -11,12 +11,12 @@ import ( type SinglesignMock struct { } -// Sign signs a message using a single signature Schnorr scheme +// Sign signs a message using a single signature func (s *SinglesignMock) Sign(_ crypto.PrivateKey, _ []byte) ([]byte, error) { return []byte("signed"), nil } -// Verify verifies a signature using a single signature Schnorr scheme +// Verify verifies a signature using a single signature func (s *SinglesignMock) Verify(_ crypto.PublicKey, _ []byte, sig []byte) error { verSig := []byte("signed") @@ -35,12 +35,12 @@ func (s *SinglesignMock) IsInterfaceNil() bool { type SinglesignFailMock struct { } -// Sign signs a message using a single signature Schnorr scheme +// Sign signs a message using a single signature func (s *SinglesignFailMock) Sign(_ crypto.PrivateKey, _ []byte) ([]byte, error) { return nil, errors.New("signing failure") } -// Verify verifies a signature using a single signature Schnorr scheme +// Verify verifies a signature using a single signature func (s *SinglesignFailMock) Verify(_ crypto.PublicKey, _ []byte, _ []byte) error { return errors.New("signature verification failure") } @@ -56,12 +56,12 @@ type SinglesignStub struct { VerifyCalled func(public crypto.PublicKey, msg []byte, sig []byte) error } -// Sign signs a message using a single signature Schnorr scheme +// Sign signs a message using a single signature func (s *SinglesignStub) Sign(private crypto.PrivateKey, msg []byte) ([]byte, error) { return s.SignCalled(private, msg) } -// Verify verifies a signature using a single signature Schnorr scheme +// Verify verifies a signature using a single signature func (s *SinglesignStub) Verify(public crypto.PublicKey, msg []byte, sig []byte) error { return s.VerifyCalled(public, msg, sig) } diff --git a/node/nodeLoadAccounts_test.go b/node/nodeLoadAccounts_test.go index de20495921c..589289f7f1e 100644 --- a/node/nodeLoadAccounts_test.go +++ b/node/nodeLoadAccounts_test.go @@ -125,7 +125,7 @@ func TestNode_AddBlockCoordinatesToAccountQueryOptions(t *testing.T) { var headerHashPassedToGetScheduledRootHashForHeaderWithEpoch []byte var epochPassedToGetScheduledRootHashForHeaderWithEpoch uint32 - var getScheduledRootHashForHeaderResult []byte + getScheduledRootHashForHeaderResult := make([]byte, 0) getScheduledRootHashForHeaderError := errors.New("missing") scheduledTxsStub := &testscommon.ScheduledTxsExecutionStub{ From 38d128cfe92157dfa08dd0e7d1e5dd0dea50ad95 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 31 Oct 2022 11:09:08 +0200 Subject: [PATCH 106/110] fix after review --- integrationTests/testConsensusNode.go | 4 ++-- integrationTests/testProcessorNode.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/integrationTests/testConsensusNode.go b/integrationTests/testConsensusNode.go index 17b727f410b..8e38075801e 100644 --- a/integrationTests/testConsensusNode.go +++ b/integrationTests/testConsensusNode.go @@ -35,7 +35,7 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/ElrondNetwork/elrond-go/testscommon/cryptoMocks" dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" - factory2 "github.com/ElrondNetwork/elrond-go/testscommon/factory" + testFactory "github.com/ElrondNetwork/elrond-go/testscommon/factory" "github.com/ElrondNetwork/elrond-go/testscommon/nodeTypeProviderMock" "github.com/ElrondNetwork/elrond-go/testscommon/shardingMocks" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" @@ -248,7 +248,7 @@ func (tcn *TestConsensusNode) initNode( networkComponents.InputAntiFlood = &mock.NilAntifloodHandler{} networkComponents.PeerHonesty = &mock.PeerHonestyHandlerStub{} - statusCoreComponents := &factory2.StatusCoreComponentsStub{ + statusCoreComponents := &testFactory.StatusCoreComponentsStub{ AppStatusHandlerField: &statusHandlerMock.AppStatusHandlerStub{}, } diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index 349fab3cbc7..f5533fc4ef0 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -100,7 +100,7 @@ import ( dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" dblookupextMock "github.com/ElrondNetwork/elrond-go/testscommon/dblookupext" "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" - factory2 "github.com/ElrondNetwork/elrond-go/testscommon/factory" + testFactory "github.com/ElrondNetwork/elrond-go/testscommon/factory" "github.com/ElrondNetwork/elrond-go/testscommon/genesisMocks" "github.com/ElrondNetwork/elrond-go/testscommon/mainFactoryMocks" "github.com/ElrondNetwork/elrond-go/testscommon/p2pmocks" @@ -1934,7 +1934,7 @@ func (tpn *TestProcessorNode) initBlockProcessor(stateCheckpointModulus uint) { }, } - statusCoreComponents := &factory2.StatusCoreComponentsStub{ + statusCoreComponents := &testFactory.StatusCoreComponentsStub{ AppStatusHandlerField: &statusHandlerMock.AppStatusHandlerStub{}, } From d6de2c2fe96a229ec10137410b8b384692af954d Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Mon, 31 Oct 2022 11:30:29 +0200 Subject: [PATCH 107/110] fix tests --- node/external/blockAPI/baseBlock_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/node/external/blockAPI/baseBlock_test.go b/node/external/blockAPI/baseBlock_test.go index 11031ef3c94..bfda01f26dc 100644 --- a/node/external/blockAPI/baseBlock_test.go +++ b/node/external/blockAPI/baseBlock_test.go @@ -22,6 +22,7 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/ElrondNetwork/elrond-go/testscommon/dblookupext" "github.com/ElrondNetwork/elrond-go/testscommon/genericMocks" + "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" storageMocks "github.com/ElrondNetwork/elrond-go/testscommon/storage" "github.com/stretchr/testify/require" ) @@ -35,7 +36,7 @@ func createBaseBlockProcessor() *baseAPIBlockProcessor { marshalizer: &mock.MarshalizerFake{}, uint64ByteSliceConverter: mock.NewNonceHashConverterMock(), historyRepo: &dblookupext.HistoryRepositoryStub{}, - hasher: &mock.HasherMock{}, + hasher: &hashingMocks.HasherMock{}, addressPubKeyConverter: mock.NewPubkeyConverterMock(32), txStatusComputer: &mock.StatusComputerStub{}, apiTransactionHandler: &mock.TransactionAPIHandlerStub{}, From 5e4a01e4f9c639271fdab793356b4c120540c69a Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Tue, 1 Nov 2022 15:51:12 +0200 Subject: [PATCH 108/110] fix contributing URL --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 38d32618601..669c9a9444d 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -15,7 +15,7 @@ ## Pre-requisites -Based on the [Contributing Guidelines](CONTRIBUTING.md#branches-management) the PR author and the reviewers must check the following requirements are met: +Based on the [Contributing Guidelines](https://github.com/ElrondNetwork/elrond-go/blob/master/.github/CONTRIBUTING.md#branches-management) the PR author and the reviewers must check the following requirements are met: - was the PR targeted to the correct branch? - if this is a larger feature that probably needs more than one PR, is there a `feat` branch created? - if this is a `feat` branch merging, do all satellite projects have a proper tag inside `go.mod`? From 7640ab62e5763b88b3f637ba2a1cffbfd71b7ad0 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 1 Nov 2022 21:29:43 +0200 Subject: [PATCH 109/110] fixed tests and export handler factory --- integrationTests/testProcessorNode.go | 19 +++++++++++++------ update/factory/exportHandlerFactory.go | 1 + 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index f5533fc4ef0..b71981a662b 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -2802,7 +2802,12 @@ func (tpn *TestProcessorNode) createHeartbeatWithHardforkTrigger() { processComponents.HardforkTriggerField = tpn.HardforkTrigger + statusCoreComponents := &testFactory.StatusCoreComponentsStub{ + AppStatusHandlerField: TestAppStatusHandler, + } + err = tpn.Node.ApplyOptions( + node.WithStatusCoreComponents(statusCoreComponents), node.WithCryptoComponents(cryptoComponents), node.WithProcessComponents(processComponents), ) @@ -2832,6 +2837,7 @@ func (tpn *TestProcessorNode) createHeartbeatWithHardforkTrigger() { Capacity: 1000, Shards: 1, }, + TimeToReadDirectConnectionsInSec: 5, } hbv2FactoryArgs := heartbeatComp.ArgHeartbeatV2ComponentsFactory{ @@ -2841,12 +2847,13 @@ func (tpn *TestProcessorNode) createHeartbeatWithHardforkTrigger() { PublicKeyToListenFrom: hardforkPubKey, }, }, - BootstrapComponents: tpn.Node.GetBootstrapComponents(), - CoreComponents: tpn.Node.GetCoreComponents(), - DataComponents: tpn.Node.GetDataComponents(), - NetworkComponents: tpn.Node.GetNetworkComponents(), - CryptoComponents: tpn.Node.GetCryptoComponents(), - ProcessComponents: tpn.Node.GetProcessComponents(), + BootstrapComponents: tpn.Node.GetBootstrapComponents(), + CoreComponents: tpn.Node.GetCoreComponents(), + DataComponents: tpn.Node.GetDataComponents(), + NetworkComponents: tpn.Node.GetNetworkComponents(), + CryptoComponents: tpn.Node.GetCryptoComponents(), + ProcessComponents: tpn.Node.GetProcessComponents(), + StatusCoreComponents: tpn.Node.GetStatusCoreComponents(), } heartbeatV2Factory, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(hbv2FactoryArgs) diff --git a/update/factory/exportHandlerFactory.go b/update/factory/exportHandlerFactory.go index eab0978f459..b56bcce99a2 100644 --- a/update/factory/exportHandlerFactory.go +++ b/update/factory/exportHandlerFactory.go @@ -264,6 +264,7 @@ func NewExportHandlerFactory(args ArgsExporter) (*exportHandlerFactory, error) { numConcurrentTrieSyncers: args.NumConcurrentTrieSyncers, trieSyncerVersion: args.TrieSyncerVersion, checkNodesOnDisk: args.CheckNodesOnDisk, + statusCoreComponents: args.StatusCoreComponents, } return e, nil From e045c2af71f92e1cd2b5e0e27020dcd449ebe76d Mon Sep 17 00:00:00 2001 From: jules01 Date: Tue, 8 Nov 2022 16:39:43 +0200 Subject: [PATCH 110/110] - fixes after merge --- epochStart/bootstrap/interface.go | 2 + heartbeat/sender/commonHeartbeatSender.go | 16 +++--- heartbeat/sender/heartbeatSender.go | 13 ++++- heartbeat/sender/heartbeatSenderFactory.go | 53 ++++++++++--------- .../sender/heartbeatSenderFactory_test.go | 23 ++++---- heartbeat/sender/multikeyHeartbeatSender.go | 39 ++++++++------ .../sender/multikeyHeartbeatSender_test.go | 9 ++-- heartbeat/sender/sender.go | 19 +++---- heartbeat/sender/sender_test.go | 6 ++- 9 files changed, 105 insertions(+), 75 deletions(-) diff --git a/epochStart/bootstrap/interface.go b/epochStart/bootstrap/interface.go index c6c42878ab4..ae5ffeedc9d 100644 --- a/epochStart/bootstrap/interface.go +++ b/epochStart/bootstrap/interface.go @@ -41,7 +41,9 @@ type Messenger interface { ConnectedPeers() []core.PeerID Verify(payload []byte, pid core.PeerID, signature []byte) error Broadcast(topic string, buff []byte) + BroadcastUsingPrivateKey(topic string, buff []byte, pid core.PeerID, skBytes []byte) Sign(payload []byte) ([]byte, error) + SignUsingPrivateKey(skBytes []byte, payload []byte) ([]byte, error) } // RequestHandler defines which methods a request handler should implement diff --git a/heartbeat/sender/commonHeartbeatSender.go b/heartbeat/sender/commonHeartbeatSender.go index 94a40fbd2b8..2a0ac853561 100644 --- a/heartbeat/sender/commonHeartbeatSender.go +++ b/heartbeat/sender/commonHeartbeatSender.go @@ -25,6 +25,7 @@ func (chs *commonHeartbeatSender) generateMessageBytes( identity string, peerSubType uint32, pkBytes []byte, + numProcessedTrieNodes uint64, ) ([]byte, error) { if len(versionNumber) > maxSizeInBytes { return nil, fmt.Errorf("%w for versionNumber, received %s of size %d, max size allowed %d", @@ -55,13 +56,14 @@ func (chs *commonHeartbeatSender) generateMessageBytes( } msg := &heartbeat.HeartbeatV2{ - Payload: payloadBytes, - VersionNumber: versionNumber, - NodeDisplayName: nodeDisplayName, - Identity: identity, - Nonce: nonce, - PeerSubType: peerSubType, - Pubkey: pkBytes, + Payload: payloadBytes, + VersionNumber: versionNumber, + NodeDisplayName: nodeDisplayName, + Identity: identity, + Nonce: nonce, + PeerSubType: peerSubType, + Pubkey: pkBytes, + NumTrieNodesSynced: numProcessedTrieNodes, } return chs.marshaller.Marshal(msg) diff --git a/heartbeat/sender/heartbeatSender.go b/heartbeat/sender/heartbeatSender.go index 89a23eecc8f..5da063681d1 100644 --- a/heartbeat/sender/heartbeatSender.go +++ b/heartbeat/sender/heartbeatSender.go @@ -24,6 +24,7 @@ type argHeartbeatSender struct { type heartbeatSender struct { commonHeartbeatSender + trieSyncStatisticsProvider heartbeat.TrieSyncStatisticsProvider } // newHeartbeatSender creates a new instance of type heartbeatSender @@ -42,8 +43,8 @@ func newHeartbeatSender(args argHeartbeatSender) (*heartbeatSender, error) { nodeDisplayName: args.nodeDisplayName, identity: args.identity, peerSubType: args.peerSubType, - trieSyncStatisticsProvider: args.trieSyncStatisticsProvider, }, + trieSyncStatisticsProvider: args.trieSyncStatisticsProvider, }, nil } @@ -98,7 +99,15 @@ func (sender *heartbeatSender) execute() error { return err } - msgBytes, err := sender.generateMessageBytes(sender.versionNumber, sender.nodeDisplayName, sender.identity, uint32(sender.peerSubType), pkBytes) + trieNodesReceived := uint64(sender.trieSyncStatisticsProvider.NumProcessed()) + msgBytes, err := sender.generateMessageBytes( + sender.versionNumber, + sender.nodeDisplayName, + sender.identity, + uint32(sender.peerSubType), + pkBytes, + trieNodesReceived, + ) if err != nil { return err } diff --git a/heartbeat/sender/heartbeatSenderFactory.go b/heartbeat/sender/heartbeatSenderFactory.go index 1daab28ceb4..3044e035275 100644 --- a/heartbeat/sender/heartbeatSenderFactory.go +++ b/heartbeat/sender/heartbeatSenderFactory.go @@ -11,16 +11,17 @@ import ( type argHeartbeatSenderFactory struct { argBaseSender - baseVersionNumber string - versionNumber string - nodeDisplayName string - identity string - peerSubType core.P2PPeerSubType - currentBlockProvider heartbeat.CurrentBlockProvider - peerTypeProvider heartbeat.PeerTypeProviderHandler - managedPeersHolder heartbeat.ManagedPeersHolder - shardCoordinator process.ShardCoordinator - nodesCoordinator heartbeat.NodesCoordinator + baseVersionNumber string + versionNumber string + nodeDisplayName string + identity string + peerSubType core.P2PPeerSubType + currentBlockProvider heartbeat.CurrentBlockProvider + peerTypeProvider heartbeat.PeerTypeProviderHandler + managedPeersHolder heartbeat.ManagedPeersHolder + shardCoordinator process.ShardCoordinator + nodesCoordinator heartbeat.NodesCoordinator + trieSyncStatisticsProvider heartbeat.TrieSyncStatisticsProvider } func createHeartbeatSender(args argHeartbeatSenderFactory) (heartbeatSenderHandler, error) { @@ -48,12 +49,13 @@ func createRegularHeartbeatSender(args argHeartbeatSenderFactory) (*heartbeatSen redundancyHandler: args.redundancyHandler, privKey: args.privKey, }, - versionNumber: args.versionNumber, - nodeDisplayName: args.nodeDisplayName, - identity: args.identity, - peerSubType: args.peerSubType, - currentBlockProvider: args.currentBlockProvider, - peerTypeProvider: args.peerTypeProvider, + versionNumber: args.versionNumber, + nodeDisplayName: args.nodeDisplayName, + identity: args.identity, + peerSubType: args.peerSubType, + currentBlockProvider: args.currentBlockProvider, + peerTypeProvider: args.peerTypeProvider, + trieSyncStatisticsProvider: args.trieSyncStatisticsProvider, } return newHeartbeatSender(argsSender) @@ -71,15 +73,16 @@ func createMultikeyHeartbeatSender(args argHeartbeatSenderFactory) (*multikeyHea redundancyHandler: args.redundancyHandler, privKey: args.privKey, }, - peerTypeProvider: args.peerTypeProvider, - versionNumber: args.versionNumber, - baseVersionNumber: args.baseVersionNumber, - nodeDisplayName: args.nodeDisplayName, - identity: args.identity, - peerSubType: args.peerSubType, - currentBlockProvider: args.currentBlockProvider, - managedPeersHolder: args.managedPeersHolder, - shardCoordinator: args.shardCoordinator, + peerTypeProvider: args.peerTypeProvider, + versionNumber: args.versionNumber, + baseVersionNumber: args.baseVersionNumber, + nodeDisplayName: args.nodeDisplayName, + identity: args.identity, + peerSubType: args.peerSubType, + currentBlockProvider: args.currentBlockProvider, + managedPeersHolder: args.managedPeersHolder, + shardCoordinator: args.shardCoordinator, + trieSyncStatisticsProvider: args.trieSyncStatisticsProvider, } return newMultikeyHeartbeatSender(argsSender) diff --git a/heartbeat/sender/heartbeatSenderFactory_test.go b/heartbeat/sender/heartbeatSenderFactory_test.go index 9910094e7f0..d86f791bcbf 100644 --- a/heartbeat/sender/heartbeatSenderFactory_test.go +++ b/heartbeat/sender/heartbeatSenderFactory_test.go @@ -22,17 +22,18 @@ import ( func createMockHeartbeatSenderFactoryArgs() argHeartbeatSenderFactory { return argHeartbeatSenderFactory{ - argBaseSender: createMockBaseArgs(), - baseVersionNumber: "base version number", - versionNumber: "version number", - nodeDisplayName: "node name", - identity: "identity", - peerSubType: core.RegularPeer, - currentBlockProvider: &mock.CurrentBlockProviderStub{}, - peerTypeProvider: &mock.PeerTypeProviderStub{}, - managedPeersHolder: &testscommon.ManagedPeersHolderStub{}, - shardCoordinator: createShardCoordinatorInShard(0), - nodesCoordinator: &shardingMocks.NodesCoordinatorStub{}, + argBaseSender: createMockBaseArgs(), + baseVersionNumber: "base version number", + versionNumber: "version number", + nodeDisplayName: "node name", + identity: "identity", + peerSubType: core.RegularPeer, + currentBlockProvider: &mock.CurrentBlockProviderStub{}, + peerTypeProvider: &mock.PeerTypeProviderStub{}, + managedPeersHolder: &testscommon.ManagedPeersHolderStub{}, + shardCoordinator: createShardCoordinatorInShard(0), + nodesCoordinator: &shardingMocks.NodesCoordinatorStub{}, + trieSyncStatisticsProvider: &testscommon.SizeSyncStatisticsHandlerStub{}, } } diff --git a/heartbeat/sender/multikeyHeartbeatSender.go b/heartbeat/sender/multikeyHeartbeatSender.go index 749da1a0e50..132078d1839 100644 --- a/heartbeat/sender/multikeyHeartbeatSender.go +++ b/heartbeat/sender/multikeyHeartbeatSender.go @@ -13,22 +13,24 @@ import ( // argMultikeyHeartbeatSender represents the arguments for the heartbeat sender type argMultikeyHeartbeatSender struct { argBaseSender - peerTypeProvider heartbeat.PeerTypeProviderHandler - versionNumber string - baseVersionNumber string - nodeDisplayName string - identity string - peerSubType core.P2PPeerSubType - currentBlockProvider heartbeat.CurrentBlockProvider - managedPeersHolder heartbeat.ManagedPeersHolder - shardCoordinator process.ShardCoordinator + peerTypeProvider heartbeat.PeerTypeProviderHandler + versionNumber string + baseVersionNumber string + nodeDisplayName string + identity string + peerSubType core.P2PPeerSubType + currentBlockProvider heartbeat.CurrentBlockProvider + managedPeersHolder heartbeat.ManagedPeersHolder + shardCoordinator process.ShardCoordinator + trieSyncStatisticsProvider heartbeat.TrieSyncStatisticsProvider } type multikeyHeartbeatSender struct { commonHeartbeatSender - baseVersionNumber string - managedPeersHolder heartbeat.ManagedPeersHolder - shardCoordinator process.ShardCoordinator + baseVersionNumber string + managedPeersHolder heartbeat.ManagedPeersHolder + shardCoordinator process.ShardCoordinator + trieSyncStatisticsProvider heartbeat.TrieSyncStatisticsProvider } // newMultikeyHeartbeatSender creates a new instance of type multikeyHeartbeatSender @@ -48,9 +50,10 @@ func newMultikeyHeartbeatSender(args argMultikeyHeartbeatSender) (*multikeyHeart identity: args.identity, peerSubType: args.peerSubType, }, - baseVersionNumber: args.baseVersionNumber, - managedPeersHolder: args.managedPeersHolder, - shardCoordinator: args.shardCoordinator, + baseVersionNumber: args.baseVersionNumber, + managedPeersHolder: args.managedPeersHolder, + shardCoordinator: args.shardCoordinator, + trieSyncStatisticsProvider: args.trieSyncStatisticsProvider, }, nil } @@ -87,6 +90,9 @@ func checkMultikeyHeartbeatSenderArgs(args argMultikeyHeartbeatSender) error { if check.IfNil(args.shardCoordinator) { return heartbeat.ErrNilShardCoordinator } + if check.IfNil(args.trieSyncStatisticsProvider) { + return heartbeat.ErrNilTrieSyncStatisticsProvider + } return nil } @@ -112,12 +118,14 @@ func (sender *multikeyHeartbeatSender) execute() error { return err } + trieNodesReceived := uint64(sender.trieSyncStatisticsProvider.NumProcessed()) buff, err := sender.generateMessageBytes( sender.versionNumber, sender.nodeDisplayName, sender.identity, uint32(sender.peerSubType), pkBytes, + trieNodesReceived, ) if err != nil { return err @@ -166,6 +174,7 @@ func (sender *multikeyHeartbeatSender) sendMessageForKey(pkBytes []byte) error { identity, uint32(core.RegularPeer), // force multi key handled peers to be of type regular peers pkBytes, + 0, // hardcode this to 0, the virtual peers do not handle the trie sync ) if err != nil { return err diff --git a/heartbeat/sender/multikeyHeartbeatSender_test.go b/heartbeat/sender/multikeyHeartbeatSender_test.go index 2342453d493..519fdfeb0da 100644 --- a/heartbeat/sender/multikeyHeartbeatSender_test.go +++ b/heartbeat/sender/multikeyHeartbeatSender_test.go @@ -41,7 +41,8 @@ func createMockMultikeyHeartbeatSenderArgs(argBase argBaseSender) argMultikeyHea return true }, }, - shardCoordinator: createShardCoordinatorInShard(0), + shardCoordinator: createShardCoordinatorInShard(0), + trieSyncStatisticsProvider: &testscommon.SizeSyncStatisticsHandlerStub{}, } } @@ -406,7 +407,7 @@ func TestMultikeyHeartbeatSender_generateMessageBytes(t *testing.T) { versionNumber := strings.Repeat("a", maxSizeInBytes+1) nodeDisplayName := "a" identity := "b" - buff, err := senderInstance.generateMessageBytes(versionNumber, nodeDisplayName, identity, 0, []byte("public key")) + buff, err := senderInstance.generateMessageBytes(versionNumber, nodeDisplayName, identity, 0, []byte("public key"), 0) assert.True(t, errors.Is(err, heartbeat.ErrPropertyTooLong)) assert.True(t, strings.Contains(err.Error(), "versionNumber")) @@ -421,7 +422,7 @@ func TestMultikeyHeartbeatSender_generateMessageBytes(t *testing.T) { versionNumber := "a" nodeDisplayName := strings.Repeat("a", maxSizeInBytes+1) identity := "b" - buff, err := senderInstance.generateMessageBytes(versionNumber, nodeDisplayName, identity, 0, []byte("public key")) + buff, err := senderInstance.generateMessageBytes(versionNumber, nodeDisplayName, identity, 0, []byte("public key"), 0) assert.True(t, errors.Is(err, heartbeat.ErrPropertyTooLong)) assert.True(t, strings.Contains(err.Error(), "nodeDisplayName")) @@ -436,7 +437,7 @@ func TestMultikeyHeartbeatSender_generateMessageBytes(t *testing.T) { versionNumber := "a" nodeDisplayName := "b" identity := strings.Repeat("a", maxSizeInBytes+1) - buff, err := senderInstance.generateMessageBytes(versionNumber, nodeDisplayName, identity, 0, []byte("public key")) + buff, err := senderInstance.generateMessageBytes(versionNumber, nodeDisplayName, identity, 0, []byte("public key"), 0) assert.True(t, errors.Is(err, heartbeat.ErrPropertyTooLong)) assert.True(t, strings.Contains(err.Error(), "identity")) diff --git a/heartbeat/sender/sender.go b/heartbeat/sender/sender.go index 661568641d1..4a8adf2751e 100644 --- a/heartbeat/sender/sender.go +++ b/heartbeat/sender/sender.go @@ -186,15 +186,16 @@ func checkSenderArgs(args ArgSender) error { privKey: args.PrivateKey, redundancyHandler: args.RedundancyHandler, }, - peerTypeProvider: args.PeerTypeProvider, - versionNumber: args.VersionNumber, - baseVersionNumber: args.BaseVersionNumber, - nodeDisplayName: args.NodeDisplayName, - identity: args.Identity, - peerSubType: args.PeerSubType, - currentBlockProvider: args.CurrentBlockProvider, - managedPeersHolder: args.ManagedPeersHolder, - shardCoordinator: args.ShardCoordinator, + peerTypeProvider: args.PeerTypeProvider, + versionNumber: args.VersionNumber, + baseVersionNumber: args.BaseVersionNumber, + nodeDisplayName: args.NodeDisplayName, + identity: args.Identity, + peerSubType: args.PeerSubType, + currentBlockProvider: args.CurrentBlockProvider, + managedPeersHolder: args.ManagedPeersHolder, + shardCoordinator: args.ShardCoordinator, + trieSyncStatisticsProvider: disabled.NewTrieSyncStatisticsProvider(), } return checkMultikeyHeartbeatSenderArgs(mhbsArgs) diff --git a/heartbeat/sender/sender_test.go b/heartbeat/sender/sender_test.go index fab75aadc73..6d6aab1472a 100644 --- a/heartbeat/sender/sender_test.go +++ b/heartbeat/sender/sender_test.go @@ -16,6 +16,7 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon/p2pmocks" "github.com/ElrondNetwork/elrond-go/testscommon/shardingMocks" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func createMockSenderArgs() ArgSender { @@ -333,9 +334,10 @@ func TestSender_GetCurrentNodeTypeShouldNotPanic(t *testing.T) { }() args := createMockSenderArgs() - senderInstance, _ := NewSender(args) + senderInstance, err := NewSender(args) + require.Nil(t, err) - _, _, err := senderInstance.GetCurrentNodeType() + _, _, err = senderInstance.GetCurrentNodeType() assert.Nil(t, err) _ = senderInstance.Close()