Skip to content

Commit

Permalink
Main patch tm-v0.34.18, v0.34.19 (#401)
Browse files Browse the repository at this point in the history
* cli: fix reset command for v0.34 (#8258)

Co-authored-by: Callum Waters <cmwaters19@gmail.com>

* cli: fix reset commands #8270

Some applications use the command-line implementations directly,
rather than through the root command. Because the implentations
obtained config from an unexported global, this would not work.

Instead, have each command that needs the config parse it where
needed.

Co-authored-by: Aleksandr Bezobchuk <alexanderbez@users.noreply.github.com>

* Fix lint: `cli: fix reset commands #8270`

* Fix codecov: `cli: fix reset commands #8270`

Co-authored-by: Callum Waters <cmwaters19@gmail.com>
Co-authored-by: Aleksandr Bezobchuk <alexanderbez@users.noreply.github.com>
  • Loading branch information
3 people authored Apr 15, 2022
1 parent 36dc585 commit d88bf70
Show file tree
Hide file tree
Showing 4 changed files with 128 additions and 68 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,17 @@ var keepAddrBook bool

// ResetStateCmd removes the database of the specified Tendermint core instance.
var ResetStateCmd = &cobra.Command{
Use: "reset-state",
Short: "Remove all the data and WAL",
RunE: func(cmd *cobra.Command, args []string) error {
Use: "reset-state",
Short: "Remove all the data and WAL",
PreRun: deprecateSnakeCase,
RunE: func(cmd *cobra.Command, args []string) (err error) {
config, err = ParseConfig()
if err != nil {
return err
}

return resetState(config.DBDir(), logger)
},
PreRun: deprecateSnakeCase,
}

func init() {
Expand All @@ -46,25 +51,39 @@ var ResetPrivValidatorCmd = &cobra.Command{
Use: "unsafe-reset-priv-validator",
Aliases: []string{"unsafe_reset_priv_validator"},
Short: "(unsafe) Reset this node's validator to genesis state",
Run: resetPrivValidator,
PreRun: deprecateSnakeCase,
RunE: resetPrivValidator,
}

// XXX: this is totally unsafe.
// it's only suitable for testnets.
func resetAllCmd(cmd *cobra.Command, args []string) error {
return resetAll(config.DBDir(), config.P2P.AddrBookFile(), config.PrivValidatorKeyFile(),
config.PrivValidatorStateFile(), config.PrivValidatorKeyType(), logger)
func resetAllCmd(cmd *cobra.Command, args []string) (err error) {
config, err = ParseConfig()
if err != nil {
return err
}

return resetAll(
config.DBDir(),
config.P2P.AddrBookFile(),
config.PrivValidatorKeyFile(),
config.PrivValidatorStateFile(),
config.PrivValidatorKeyType(),
logger,
)
}

// XXX: this is totally unsafe.
// it's only suitable for testnets.
func resetPrivValidator(cmd *cobra.Command, args []string) {
err := resetFilePV(config.PrivValidatorKeyFile(), config.PrivValidatorStateFile(),
config.PrivValidatorKeyType(), logger)
func resetPrivValidator(cmd *cobra.Command, args []string) (err error) {
config, err = ParseConfig()
if err != nil {
panic(err)
return err
}

return resetFilePV(config.PrivValidatorKeyFile(), config.PrivValidatorStateFile(),
config.PrivValidatorKeyType(), logger)

}

// resetAll removes address book files plus all data, and resets the privValdiator data.
Expand All @@ -74,16 +93,18 @@ func resetAll(dbDir, addrBookFile, privValKeyFile, privValStateFile, privKeyType
} else {
removeAddrBook(addrBookFile, logger)
}

if err := os.RemoveAll(dbDir); err == nil {
logger.Info("Removed all blockchain history", "dir", dbDir)
} else {
logger.Error("Error removing all blockchain history", "dir", dbDir, "err", err)
}

// recreate the dbDir since the privVal state needs to live there
if err := tmos.EnsureDir(dbDir, 0700); err != nil {
logger.Error("unable to recreate dbDir", "err", err)
}

// recreate the dbDir since the privVal state needs to live there
return resetFilePV(privValKeyFile, privValStateFile, privKeyType, logger)
}

Expand All @@ -94,7 +115,6 @@ func resetState(dbDir string, logger log.Logger) error {
wal := filepath.Join(dbDir, "cs.wal")
evidence := filepath.Join(dbDir, "evidence.db")
txIndex := filepath.Join(dbDir, "tx_index.db")
peerstore := filepath.Join(dbDir, "peerstore.db")

if tmos.FileExists(blockdb) {
if err := os.RemoveAll(blockdb); err == nil {
Expand Down Expand Up @@ -136,13 +156,6 @@ func resetState(dbDir string, logger log.Logger) error {
}
}

if tmos.FileExists(peerstore) {
if err := os.RemoveAll(peerstore); err == nil {
logger.Info("Removed peerstore.db", "dir", peerstore)
} else {
logger.Error("error removing peerstore.db", "dir", peerstore, "err", err)
}
}
if err := tmos.EnsureDir(dbDir, 0700); err != nil {
logger.Error("unable to recreate dbDir", "err", err)
}
Expand All @@ -153,18 +166,19 @@ func resetFilePV(privValKeyFile, privValStateFile, privKeyType string, logger lo
if _, err := os.Stat(privValKeyFile); err == nil {
pv := privval.LoadFilePVEmptyState(privValKeyFile, privValStateFile)
pv.Reset()
logger.Info("Reset private validator file to genesis state", "keyFile", privValKeyFile,
"stateFile", privValStateFile)
logger.Info(
"Reset private validator file to genesis state",
"keyFile", privValKeyFile,
"stateFile", privValStateFile,
)
} else {
pv, err := privval.GenFilePV(privValKeyFile, privValStateFile, privKeyType)
if err != nil {
return err
}
if pv != nil {
pv.Save()
}
logger.Info("Generated private validator file", "keyFile", privValKeyFile,
"stateFile", privValStateFile)
pv, _ := privval.GenFilePV(privValKeyFile, privValStateFile, privKeyType)
pv.Save()
logger.Info(
"Generated private validator file",
"keyFile", privValKeyFile,
"stateFile", privValStateFile,
)
}
return nil
}
Expand Down
33 changes: 0 additions & 33 deletions cmd/ostracon/commands/reset_priv_validator_test.go

This file was deleted.

80 changes: 80 additions & 0 deletions cmd/ostracon/commands/reset_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package commands

import (
"os"
"path/filepath"
"testing"

"github.com/spf13/viper"

"github.com/stretchr/testify/require"

cfg "github.com/line/ostracon/config"
"github.com/line/ostracon/privval"
)

func setupEnv(t *testing.T) {
rootDir := t.TempDir()
viper.SetEnvPrefix("OC")
require.NoError(t, viper.BindEnv("HOME"))
require.NoError(t, os.Setenv("OC_HOME", rootDir))
}

func TestResetAllCmd(t *testing.T) {
setupEnv(t)
err := ResetAllCmd.RunE(ResetAllCmd, nil)
require.NoError(t, err)
}

func TestResetStateCmd(t *testing.T) {
setupEnv(t)
err := ResetStateCmd.RunE(ResetStateCmd, nil)
require.NoError(t, err)
}

func TestResetPrivValidatorCmd(t *testing.T) {
setupEnv(t)
err := ResetPrivValidatorCmd.RunE(ResetPrivValidatorCmd, nil)
require.NoError(t, err)
}
func Test_ResetAll(t *testing.T) {
config := cfg.TestConfig()
dir := t.TempDir()
config.SetRoot(dir)
cfg.EnsureRoot(dir)
require.NoError(t, initFilesWithConfig(config))
pv := privval.LoadFilePV(config.PrivValidatorKeyFile(), config.PrivValidatorStateFile())
pv.LastSignState.Height = 10
pv.Save()
require.NoError(t, resetAll(config.DBDir(), config.P2P.AddrBookFile(), config.PrivValidatorKeyFile(),
config.PrivValidatorStateFile(), config.PrivKeyType, logger))
require.DirExists(t, config.DBDir())
require.NoFileExists(t, filepath.Join(config.DBDir(), "block.db"))
require.NoFileExists(t, filepath.Join(config.DBDir(), "state.db"))
require.NoFileExists(t, filepath.Join(config.DBDir(), "evidence.db"))
require.NoFileExists(t, filepath.Join(config.DBDir(), "tx_index.db"))
require.FileExists(t, config.PrivValidatorStateFile())
pv = privval.LoadFilePV(config.PrivValidatorKeyFile(), config.PrivValidatorStateFile())
require.Equal(t, int64(0), pv.LastSignState.Height)
}

func Test_ResetState(t *testing.T) {
config := cfg.TestConfig()
dir := t.TempDir()
config.SetRoot(dir)
cfg.EnsureRoot(dir)
require.NoError(t, initFilesWithConfig(config))
pv := privval.LoadFilePV(config.PrivValidatorKeyFile(), config.PrivValidatorStateFile())
pv.LastSignState.Height = 10
pv.Save()
require.NoError(t, resetState(config.DBDir(), logger))
require.DirExists(t, config.DBDir())
require.NoFileExists(t, filepath.Join(config.DBDir(), "block.db"))
require.NoFileExists(t, filepath.Join(config.DBDir(), "state.db"))
require.NoFileExists(t, filepath.Join(config.DBDir(), "evidence.db"))
require.NoFileExists(t, filepath.Join(config.DBDir(), "tx_index.db"))
require.FileExists(t, config.PrivValidatorStateFile())
pv = privval.LoadFilePV(config.PrivValidatorKeyFile(), config.PrivValidatorStateFile())
// private validator state should still be in tact.
require.Equal(t, int64(10), pv.LastSignState.Height)
}
5 changes: 2 additions & 3 deletions privval/file.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,11 +72,10 @@ func (pvKey FilePVKey) Save() {
if err != nil {
panic(err)
}
err = tempfile.WriteFileAtomic(outFile, jsonBytes, 0600)
if err != nil {

if err := tempfile.WriteFileAtomic(outFile, jsonBytes, 0600); err != nil {
panic(err)
}

}

//-------------------------------------------------------------------------------
Expand Down

0 comments on commit d88bf70

Please sign in to comment.