diff --git a/CHANGELOG_PENDING.md b/CHANGELOG_PENDING.md index 1420b6911..2e59f030a 100644 --- a/CHANGELOG_PENDING.md +++ b/CHANGELOG_PENDING.md @@ -9,6 +9,7 @@ Friendly reminder, we have a [bug bounty program](https://hackerone.com/tendermi ### BREAKING CHANGES - CLI/RPC/Config + - [cli] [\#8258](https://github.com/tendermint/tendermint/pull/8258) Fix a bug in the cli that caused `unsafe-reset-all` to panic - Apps diff --git a/cmd/tendermint/commands/reset_priv_validator.go b/cmd/tendermint/commands/reset.go similarity index 94% rename from cmd/tendermint/commands/reset_priv_validator.go rename to cmd/tendermint/commands/reset.go index e7cbd6166..4f16d964e 100644 --- a/cmd/tendermint/commands/reset_priv_validator.go +++ b/cmd/tendermint/commands/reset.go @@ -72,6 +72,11 @@ func resetAll(dbDir, addrBookFile, privValKeyFile, privValStateFile string, logg logger.Error("Error removing all blockchain history", "dir", dbDir, "err", err) } + 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 resetFilePV(privValKeyFile, privValStateFile, logger) return nil } @@ -83,7 +88,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 { @@ -125,13 +129,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) } diff --git a/cmd/tendermint/commands/reset_test.go b/cmd/tendermint/commands/reset_test.go new file mode 100644 index 000000000..3ee4be635 --- /dev/null +++ b/cmd/tendermint/commands/reset_test.go @@ -0,0 +1,53 @@ +package commands + +import ( + "path/filepath" + "testing" + + "github.com/stretchr/testify/require" + + cfg "github.com/tendermint/tendermint/config" + "github.com/tendermint/tendermint/privval" +) + +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(), 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) +}