From 4c4c005a5d01c03492d8e9becf1987166a677288 Mon Sep 17 00:00:00 2001 From: bylingo <790653865@qq.com> Date: Fri, 24 Mar 2023 09:37:09 +0800 Subject: [PATCH 1/4] CheckStart implementation & invocation modified --- app/app.go | 2 +- app/utils/sanity/start.go | 116 ++++++++++++++++++++++++++++++++- app/utils/sanity/start_test.go | 10 +-- cmd/exchaind/replay.go | 7 +- 4 files changed, 126 insertions(+), 9 deletions(-) diff --git a/app/app.go b/app/app.go index 6281d446ce..7cfa3644b1 100644 --- a/app/app.go +++ b/app/app.go @@ -941,7 +941,7 @@ func NewAccNonceHandler(ak auth.AccountKeeper) sdk.AccNonceHandler { func PreRun(ctx *server.Context, cmd *cobra.Command) error { // check start flag conflicts - err := sanity.CheckStart() + err := sanity.CheckStart(ctx) if err != nil { return err } diff --git a/app/utils/sanity/start.go b/app/utils/sanity/start.go index af95522782..063d229296 100644 --- a/app/utils/sanity/start.go +++ b/app/utils/sanity/start.go @@ -1,6 +1,9 @@ package sanity import ( + "fmt" + "strings" + "github.com/spf13/viper" "github.com/okex/exchain/app/config" @@ -11,6 +14,7 @@ import ( "github.com/okex/exchain/libs/tendermint/consensus" "github.com/okex/exchain/libs/tendermint/state" "github.com/okex/exchain/libs/tendermint/types" + db "github.com/okex/exchain/libs/tm-db" "github.com/okex/exchain/x/evm/watcher" "github.com/okex/exchain/x/infura" ) @@ -108,7 +112,7 @@ var ( ) // CheckStart check start command.If it has conflict pair above. then return the conflict error -func CheckStart() error { +func CheckStart(ctx *server.Context) error { if viper.GetBool(FlagDisableSanity) { return nil } @@ -129,5 +133,115 @@ func CheckStart() error { } } + rocksDBMisspelling(ctx) return nil } + +func rocksDBMisspelling(ctx *server.Context) { + //A copy of all the constant variables indicating rocksDB option parameters + //in exchain/libs/tm-db/rocksdb.go + const editDistanceThreshold = 2 + var minIndex int + rocksDBConst := []string{ + "block_size", + "block_cache", + "statistics", + "max_open_files", + "allow_mmap_reads", + "allow_mmap_writes", + "unordered_write", + "pipelined_write", + } + params := parseOptParams(viper.GetString(db.FlagRocksdbOpts)) + if params == nil { + return + } + for _, str := range rocksDBConst { + delete(params, str) + } + if len(params) != 0 { + for inputOpt, _ := range params { + optEditDistance := make([]int, len(rocksDBConst)) + minDistance := 20 + for i, expectOpt := range rocksDBConst { + optEditDistance[i] = editDistance(inputOpt, expectOpt) + if optEditDistance[i] < minDistance { + minDistance = optEditDistance[i] + minIndex = i + } + } + if minDistance <= editDistanceThreshold { + ctx.Logger.Info(fmt.Sprintf("%s %s failed to set rocksDB parameters, expect %s", db.FlagRocksdbOpts, inputOpt, rocksDBConst[minIndex])) + } else { + ctx.Logger.Info(fmt.Sprintf("%s %s failed to set rocksDB parameters, invalid parameter", db.FlagRocksdbOpts, inputOpt)) + } + } + } + + return +} + +func parseOptParams(params string) map[string]struct{} { + if len(params) == 0 { + return nil + } + + opts := make(map[string]struct{}) + for _, s := range strings.Split(params, ",") { + opt := strings.Split(s, "=") + if len(opt) != 2 { + panic("Invalid options parameter, like this 'block_size=4kb,statistics=true") + } + opts[strings.TrimSpace(opt[0])] = struct{}{} + } + return opts +} + +func editDistance(s, t string) int { + m := len(s) + n := len(t) + + if m == 0 { + return n + } + + if n == 0 { + return m + } + + // 创建二维切片 + d := make([][]int, m+1) + for i := range d { + d[i] = make([]int, n+1) + } + + // 初始化第一行和第一列 + for i := 0; i <= m; i++ { + d[i][0] = i + } + for j := 0; j <= n; j++ { + d[0][j] = j + } + + // 计算编辑距离 + for j := 1; j <= n; j++ { + for i := 1; i <= m; i++ { + if s[i-1] == t[j-1] { + d[i][j] = d[i-1][j-1] + } else { + insert := d[i][j-1] + 1 + delete := d[i-1][j] + 1 + substitute := d[i-1][j-1] + 1 + if insert <= delete && insert <= substitute { + d[i][j] = insert + } else if delete <= insert && delete <= substitute { + d[i][j] = delete + } else { + d[i][j] = substitute + } + } + } + } + + return d[m][n] +} diff --git a/app/utils/sanity/start_test.go b/app/utils/sanity/start_test.go index adea0929eb..07fa2a51e0 100644 --- a/app/utils/sanity/start_test.go +++ b/app/utils/sanity/start_test.go @@ -1,6 +1,10 @@ package sanity import ( + "testing" + + "github.com/spf13/cobra" + apptype "github.com/okex/exchain/app/types" "github.com/okex/exchain/libs/cosmos-sdk/server" "github.com/okex/exchain/libs/cosmos-sdk/store/types" @@ -9,8 +13,6 @@ import ( sm "github.com/okex/exchain/libs/tendermint/state" ttypes "github.com/okex/exchain/libs/tendermint/types" "github.com/okex/exchain/x/evm/watcher" - "github.com/spf13/cobra" - "testing" ) func getCommandNodeModeRpcPruningNothing() *cobra.Command { @@ -93,7 +95,7 @@ func TestCheckStart(t *testing.T) { t.Run(tt.name, func(t *testing.T) { var err error tt.cmdFunc() - if err = CheckStart(); (err != nil) != tt.wantErr { + if err = CheckStart(nil); (err != nil) != tt.wantErr { t.Errorf("CheckStart() error = %v, wantErr %v", err, tt.wantErr) } t.Log(err) @@ -132,7 +134,7 @@ func TestCheckStartArchive(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { var err error - if err = CheckStart(); (err != nil) != tt.wantErr { + if err = CheckStart(nil); (err != nil) != tt.wantErr { t.Errorf("CheckStart() error = %v, wantErr %v", err, tt.wantErr) } t.Log(err) diff --git a/cmd/exchaind/replay.go b/cmd/exchaind/replay.go index e1a2dc191b..84f43a575c 100644 --- a/cmd/exchaind/replay.go +++ b/cmd/exchaind/replay.go @@ -15,6 +15,9 @@ import ( "github.com/okex/exchain/x/evm/watcher" "github.com/gogo/protobuf/jsonpb" + "github.com/spf13/cobra" + "github.com/spf13/viper" + "github.com/okex/exchain/app/config" okexchain "github.com/okex/exchain/app/types" "github.com/okex/exchain/app/utils/appstatus" @@ -36,8 +39,6 @@ import ( "github.com/okex/exchain/libs/tendermint/store" "github.com/okex/exchain/libs/tendermint/types" dbm "github.com/okex/exchain/libs/tm-db" - "github.com/spf13/cobra" - "github.com/spf13/viper" ) const ( @@ -66,7 +67,7 @@ func replayCmd(ctx *server.Context, registerAppFlagFn func(cmd *cobra.Command), PreRunE: func(cmd *cobra.Command, args []string) error { // set external package flags log.Println("--------- replay preRun ---------") - err := sanity.CheckStart() + err := sanity.CheckStart(ctx) if err != nil { fmt.Println(err) return err From 9186f19db8ad8bd38114565e5720e87e42cb042f Mon Sep 17 00:00:00 2001 From: bylingo <790653865@qq.com> Date: Fri, 24 Mar 2023 11:13:51 +0800 Subject: [PATCH 2/4] CheckStart invokation modified --- app/utils/sanity/start.go | 5 +---- libs/ibc-go/testing/simapp/app.go | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/app/utils/sanity/start.go b/app/utils/sanity/start.go index 063d229296..7a0e79a43a 100644 --- a/app/utils/sanity/start.go +++ b/app/utils/sanity/start.go @@ -209,21 +209,18 @@ func editDistance(s, t string) int { return m } - // 创建二维切片 d := make([][]int, m+1) for i := range d { d[i] = make([]int, n+1) } - // 初始化第一行和第一列 for i := 0; i <= m; i++ { d[i][0] = i } for j := 0; j <= n; j++ { d[0][j] = j } - - // 计算编辑距离 + for j := 1; j <= n; j++ { for i := 1; i <= m; i++ { if s[i-1] == t[j-1] { diff --git a/libs/ibc-go/testing/simapp/app.go b/libs/ibc-go/testing/simapp/app.go index 4c3565f429..bc212c4adf 100644 --- a/libs/ibc-go/testing/simapp/app.go +++ b/libs/ibc-go/testing/simapp/app.go @@ -1055,7 +1055,7 @@ func PreRun(ctx *server.Context) error { appconfig.RegisterDynamicConfig(ctx.Logger.With("module", "config")) // check start flag conflicts - err := sanity.CheckStart() + err := sanity.CheckStart(nil) if err != nil { return err } From e52edbb9eb5035608380f6a3a552458c7bd78817 Mon Sep 17 00:00:00 2001 From: bylingo <790653865@qq.com> Date: Fri, 24 Mar 2023 16:16:21 +0800 Subject: [PATCH 3/4] Change Misspelling Check --- app/utils/sanity/start.go | 65 ++++----------------------------------- 1 file changed, 6 insertions(+), 59 deletions(-) diff --git a/app/utils/sanity/start.go b/app/utils/sanity/start.go index 7a0e79a43a..322d3aecda 100644 --- a/app/utils/sanity/start.go +++ b/app/utils/sanity/start.go @@ -140,8 +140,6 @@ func CheckStart(ctx *server.Context) error { func rocksDBMisspelling(ctx *server.Context) { //A copy of all the constant variables indicating rocksDB option parameters //in exchain/libs/tm-db/rocksdb.go - const editDistanceThreshold = 2 - var minIndex int rocksDBConst := []string{ "block_size", "block_cache", @@ -152,6 +150,10 @@ func rocksDBMisspelling(ctx *server.Context) { "unordered_write", "pipelined_write", } + // A map between misspelling option and correct option + misspellingMap := map[string]string{ + "max_open_file": "max_open_files", + } params := parseOptParams(viper.GetString(db.FlagRocksdbOpts)) if params == nil { return @@ -161,17 +163,8 @@ func rocksDBMisspelling(ctx *server.Context) { } if len(params) != 0 { for inputOpt, _ := range params { - optEditDistance := make([]int, len(rocksDBConst)) - minDistance := 20 - for i, expectOpt := range rocksDBConst { - optEditDistance[i] = editDistance(inputOpt, expectOpt) - if optEditDistance[i] < minDistance { - minDistance = optEditDistance[i] - minIndex = i - } - } - if minDistance <= editDistanceThreshold { - ctx.Logger.Info(fmt.Sprintf("%s %s failed to set rocksDB parameters, expect %s", db.FlagRocksdbOpts, inputOpt, rocksDBConst[minIndex])) + if expectOpt, ok := misspellingMap[inputOpt]; ok { + ctx.Logger.Info(fmt.Sprintf("%s %s failed to set rocksDB parameters, expect %s", db.FlagRocksdbOpts, inputOpt, expectOpt)) } else { ctx.Logger.Info(fmt.Sprintf("%s %s failed to set rocksDB parameters, invalid parameter", db.FlagRocksdbOpts, inputOpt)) } @@ -196,49 +189,3 @@ func parseOptParams(params string) map[string]struct{} { } return opts } - -func editDistance(s, t string) int { - m := len(s) - n := len(t) - - if m == 0 { - return n - } - - if n == 0 { - return m - } - - d := make([][]int, m+1) - for i := range d { - d[i] = make([]int, n+1) - } - - for i := 0; i <= m; i++ { - d[i][0] = i - } - for j := 0; j <= n; j++ { - d[0][j] = j - } - - for j := 1; j <= n; j++ { - for i := 1; i <= m; i++ { - if s[i-1] == t[j-1] { - d[i][j] = d[i-1][j-1] - } else { - insert := d[i][j-1] + 1 - delete := d[i-1][j] + 1 - substitute := d[i-1][j-1] + 1 - if insert <= delete && insert <= substitute { - d[i][j] = insert - } else if delete <= insert && delete <= substitute { - d[i][j] = delete - } else { - d[i][j] = substitute - } - } - } - } - - return d[m][n] -} From a1cd4b55edb8b909b9d822b0c030915a9a4a0190 Mon Sep 17 00:00:00 2001 From: bylingo <790653865@qq.com> Date: Fri, 24 Mar 2023 16:52:34 +0800 Subject: [PATCH 4/4] Remove misspelling map --- app/utils/sanity/start.go | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/app/utils/sanity/start.go b/app/utils/sanity/start.go index 322d3aecda..971f23de24 100644 --- a/app/utils/sanity/start.go +++ b/app/utils/sanity/start.go @@ -150,10 +150,6 @@ func rocksDBMisspelling(ctx *server.Context) { "unordered_write", "pipelined_write", } - // A map between misspelling option and correct option - misspellingMap := map[string]string{ - "max_open_file": "max_open_files", - } params := parseOptParams(viper.GetString(db.FlagRocksdbOpts)) if params == nil { return @@ -163,11 +159,7 @@ func rocksDBMisspelling(ctx *server.Context) { } if len(params) != 0 { for inputOpt, _ := range params { - if expectOpt, ok := misspellingMap[inputOpt]; ok { - ctx.Logger.Info(fmt.Sprintf("%s %s failed to set rocksDB parameters, expect %s", db.FlagRocksdbOpts, inputOpt, expectOpt)) - } else { - ctx.Logger.Info(fmt.Sprintf("%s %s failed to set rocksDB parameters, invalid parameter", db.FlagRocksdbOpts, inputOpt)) - } + ctx.Logger.Info(fmt.Sprintf("%s %s failed to set rocksDB parameters, please double-check the spelling", db.FlagRocksdbOpts, inputOpt)) } }