@ -2,6 +2,7 @@ package commands
import (
"os"
"path/filepath"
"github.com/spf13/cobra"
@ -16,12 +17,22 @@ var ResetAllCmd = &cobra.Command{
Use : "unsafe-reset-all" ,
Aliases : [ ] string { "unsafe_reset_all" } ,
Short : "(unsafe) Remove all the data and WAL, reset this node's validator to genesis state" ,
Run : resetAll ,
RunE : resetAllCmd ,
PreRun : deprecateSnakeCase ,
}
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 {
return resetState ( config . DBDir ( ) , logger )
} ,
PreRun : deprecateSnakeCase ,
}
func init ( ) {
ResetAllCmd . Flags ( ) . BoolVar ( & keepAddrBook , "keep-addr-book" , false , "keep the address book intact" )
}
@ -37,8 +48,8 @@ var ResetPrivValidatorCmd = &cobra.Command{
// XXX: this is totally unsafe.
// it's only suitable for testnets.
func resetAll ( cmd * cobra . Command , args [ ] string ) {
R esetAll( config . DBDir ( ) , config . P2P . AddrBookFile ( ) , config . PrivValidatorKeyFile ( ) ,
func resetAllCmd ( cmd * cobra . Command , args [ ] string ) error {
return r esetAll( config . DBDir ( ) , config . P2P . AddrBookFile ( ) , config . PrivValidatorKeyFile ( ) ,
config . PrivValidatorStateFile ( ) , logger )
}
@ -48,9 +59,8 @@ func resetPrivValidator(cmd *cobra.Command, args []string) {
resetFilePV ( config . PrivValidatorKeyFile ( ) , config . PrivValidatorStateFile ( ) , logger )
}
// ResetAll removes address book files plus all data, and resets the privValdiator data.
// Exported so other CLI tools can use it.
func ResetAll ( dbDir , addrBookFile , privValKeyFile , privValStateFile string , logger log . Logger ) {
// resetAll removes address book files plus all data, and resets the privValdiator data.
func resetAll ( dbDir , addrBookFile , privValKeyFile , privValStateFile string , logger log . Logger ) error {
if keepAddrBook {
logger . Info ( "The address book remains intact" )
} else {
@ -61,11 +71,71 @@ func ResetAll(dbDir, addrBookFile, privValKeyFile, privValStateFile string, logg
} else {
logger . Error ( "Error removing all blockchain history" , "dir" , dbDir , "err" , err )
}
// recreate the dbDir since the privVal state needs to live there
resetFilePV ( privValKeyFile , privValStateFile , logger )
return nil
}
// resetState removes address book files plus all databases.
func resetState ( dbDir string , logger log . Logger ) error {
blockdb := filepath . Join ( dbDir , "blockstore.db" )
state := filepath . Join ( dbDir , "state.db" )
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 {
logger . Info ( "Removed all blockstore.db" , "dir" , blockdb )
} else {
logger . Error ( "error removing all blockstore.db" , "dir" , blockdb , "err" , err )
}
}
if tmos . FileExists ( state ) {
if err := os . RemoveAll ( state ) ; err == nil {
logger . Info ( "Removed all state.db" , "dir" , state )
} else {
logger . Error ( "error removing all state.db" , "dir" , state , "err" , err )
}
}
if tmos . FileExists ( wal ) {
if err := os . RemoveAll ( wal ) ; err == nil {
logger . Info ( "Removed all cs.wal" , "dir" , wal )
} else {
logger . Error ( "error removing all cs.wal" , "dir" , wal , "err" , err )
}
}
if tmos . FileExists ( evidence ) {
if err := os . RemoveAll ( evidence ) ; err == nil {
logger . Info ( "Removed all evidence.db" , "dir" , evidence )
} else {
logger . Error ( "error removing all evidence.db" , "dir" , evidence , "err" , err )
}
}
if tmos . FileExists ( txIndex ) {
if err := os . RemoveAll ( txIndex ) ; err == nil {
logger . Info ( "Removed tx_index.db" , "dir" , txIndex )
} else {
logger . Error ( "error removing tx_index.db" , "dir" , txIndex , "err" , err )
}
}
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 )
}
resetFilePV ( privValKeyFile , privValStateFile , logger )
return nil
}
func resetFilePV ( privValKeyFile , privValStateFile string , logger log . Logger ) {