package commands import ( "context" "fmt" "github.com/spf13/cobra" cfg "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/libs/log" "github.com/tendermint/tendermint/scripts/keymigrate" ) func MakeKeyMigrateCommand(conf *cfg.Config, logger log.Logger) *cobra.Command { cmd := &cobra.Command{ Use: "key-migrate", Short: "Run Database key migration", RunE: func(cmd *cobra.Command, args []string) error { ctx, cancel := context.WithCancel(cmd.Context()) defer cancel() contexts := []string{ // this is ordered to put the // (presumably) biggest/most important // subsets first. "blockstore", "state", "peerstore", "tx_index", "evidence", "light", } for idx, dbctx := range contexts { logger.Info("beginning a key migration", "dbctx", dbctx, "num", idx+1, "total", len(contexts), ) db, err := cfg.DefaultDBProvider(&cfg.DBContext{ ID: dbctx, Config: conf, }) if err != nil { return fmt.Errorf("constructing database handle: %w", err) } if err = keymigrate.Migrate(ctx, db); err != nil { return fmt.Errorf("running migration for context %q: %w", dbctx, err) } } logger.Info("completed database migration successfully") return nil }, } // allow database info to be overridden via cli addDBFlags(cmd, conf) return cmd }