go-ethereum/internal/cli/removedb.go
SHIVAM SHARMA 9aeaf03f05
Merge branch 'qa' and 'master' into develop (#663)
* Adding in Mumbai/Mainnet precursor deb packaging for tests to use during upgrade(iterations to come)

* Added changes per discussion in PR, more changes may be necessary

* Adding prerelease true

* Disabling goreleaser

* Removing README swap file

* change bor_dir and add bor user for v0.3.0 release

* rollback bor user and use root

* metrics: handle equal to separated config flag (#596)

* metrics: handle  based config path

* internal/cli/server: add more context to logs

* use space separated flag and value in bor.service

* fixed static-nodes related buf (os independent) (#598)

* fixed static-nodes related buf (os independent)

* taking static-nodes as input if default not present

* Update default flags (#600)

* internal/cli/server: use geth's default for txpool.pricelimit and add comments

* builder/files: update config.toml for mainnet

* packaging/templates: update defaults for mainnet and mumbai

* internal/cli/server: skip overriding cache

* packaging/templates: update cache value for mainnet

* packaging/templates: update gcmode for archive mumbai node

* metrics: handle nil telemetry config (#601)

* resolve merge conflicts

* update go version in release.yml

* update goversion in makefile

* update Docker login for goreleaser-cross v1.19

* Cleanup for the packager to use git tag in the package profile naming. Added conditional check for directory structure, this is in prep for v0.3.1, as this will create a failure on upgrade path in package due to file exist

* added a toml configuration file with comments describing each flag (#607)

* added a toml configuration file with comments describing each flag

* internal/cli/server: update flag description

* docs/cli: update example config and description of flags

* docs: update new-cli docs

Co-authored-by: Manav Darji <manavdarji.india@gmail.com>

* Adding of 0.3.0 package changes, control file updates, postinst changes, and packager update

* added ancient datadir flag and toml field, need to decide on default value and update the conversion script

* updated toml files with ancient field

* Add support for new flags in new config.toml, which were present in old config.toml (#612)

* added HTTPTimeouts, and TrieTimeout flag in new tol, from old toml

* added RAW fields for these time.Duration flags

* updated the conversion script to support these extra 4 flags

* removed hcl and json config tests as we are only supporting toml config files

* updated toml files with cache.timeout field

* updated toml files with jsonrpc.timeouts field

* tests/bor: expect a call for latest checkpoint

* tests/bor: expect a call for latest checkpoint

* packaging/templates: update cache values for archive nodes

Co-authored-by: Manav Darji <manavdarji.india@gmail.com>

* remove unwanted code

* Fix docker publish authentication issue

In gorelease-cross 1.19+, dockerhub authentication will require docker
logion action followed by mounting docker config file. See
https://github.com/goreleaser/goreleaser-cross#github-actions.

* Revert "update Docker login for goreleaser-cross v1.19"

This reverts commit 4d19cf5342.

* Bump version to stable

* Revert "Merge pull request #435 from maticnetwork/POS-553"

This reverts commit 657d262def, reversing
changes made to 88dbfa1c13.

* revert change for release for go1.19

* Add default values to CLI helper and docs

This commit adds default values to CLI helper and docs. When the default value of a string flag, slice string flag, or map string flag is empty, its helper message won't show any default value.

* Add a summary of new CLI in docs

* Updating packager as binutils changed version so that apt-get installs current versions

* Add state pruning to new CLI

* Minor wording fix in prune state description

* Bumping control file versions

* Mainnet Delhi fork

* Set version to stable

* change delhi hardfork block number

* handle future chain import and skip peer drop (#650)

* handle future chain import and skip peer drop

* add block import metric

* params: bump version to v0.3.3-stable

* Bump bor version in control files for v0.3.3 mainnet release

Co-authored-by: Daniel Jones <djones@polygon.technology>
Co-authored-by: Will Button <wbutton@polygon.technology>
Co-authored-by: Will Button <will@willbutton.com>
Co-authored-by: Manav Darji <manavdarji.india@gmail.com>
Co-authored-by: Daniel Jones <105369507+djpolygon@users.noreply.github.com>
Co-authored-by: Pratik Patil <pratikspatil024@gmail.com>
Co-authored-by: Arpit Temani <temaniarpit27@gmail.com>
Co-authored-by: Jerry <jerrycgh@gmail.com>
2023-01-13 14:47:14 +05:30

155 lines
3.9 KiB
Go

package cli
import (
"fmt"
"os"
"path/filepath"
"strings"
"time"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/internal/cli/flagset"
"github.com/ethereum/go-ethereum/internal/cli/server"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/node"
"github.com/mitchellh/cli"
)
// RemoveDBCommand is for removing blockchain and state databases
type RemoveDBCommand struct {
*Meta2
datadir string
}
const (
chaindataPath string = "chaindata"
ancientPath string = "ancient"
trieCacheJournalPath string = "triecache"
lightchaindataPath string = "lightchaindata"
)
// MarkDown implements cli.MarkDown interface
func (c *RemoveDBCommand) MarkDown() string {
items := []string{
"# RemoveDB",
"The ```bor removedb``` command will remove the blockchain and state databases at the given datadir location",
c.Flags().MarkDown(),
}
return strings.Join(items, "\n\n")
}
// Help implements the cli.Command interface
func (c *RemoveDBCommand) Help() string {
return `Usage: bor removedb <datadir>
This command will remove the blockchain and state databases at the given datadir location`
}
// Synopsis implements the cli.Command interface
func (c *RemoveDBCommand) Synopsis() string {
return "Remove blockchain and state databases"
}
func (c *RemoveDBCommand) Flags() *flagset.Flagset {
flags := c.NewFlagSet("removedb")
flags.StringFlag(&flagset.StringFlag{
Name: "datadir",
Value: &c.datadir,
Usage: "Path of the data directory to store information",
})
return flags
}
// Run implements the cli.Command interface
func (c *RemoveDBCommand) Run(args []string) int {
flags := c.Flags()
// parse datadir
if err := flags.Parse(args); err != nil {
c.UI.Error(err.Error())
return 1
}
datadir := c.datadir
if datadir == "" {
datadir = server.DefaultDataDir()
}
// create ethereum node config with just the datadir
nodeCfg := &node.Config{DataDir: datadir}
// Remove the full node state database
path := nodeCfg.ResolvePath(chaindataPath)
if common.FileExist(path) {
confirmAndRemoveDB(c.UI, path, "full node state database")
} else {
log.Info("Full node state database missing", "path", path)
}
// Remove the full node ancient database
// Note: The old cli used DatabaseFreezer path from config if provided explicitly
// We don't have access to eth config and hence we assume it to be
// under the "chaindata" folder.
path = filepath.Join(nodeCfg.ResolvePath(chaindataPath), ancientPath)
if common.FileExist(path) {
confirmAndRemoveDB(c.UI, path, "full node ancient database")
} else {
log.Info("Full node ancient database missing", "path", path)
}
// Remove the light node database
path = nodeCfg.ResolvePath(lightchaindataPath)
if common.FileExist(path) {
confirmAndRemoveDB(c.UI, path, "light node database")
} else {
log.Info("Light node database missing", "path", path)
}
return 0
}
// confirmAndRemoveDB prompts the user for a last confirmation and removes the
// folder if accepted.
func confirmAndRemoveDB(ui cli.Ui, database string, kind string) {
for {
confirm, err := ui.Ask(fmt.Sprintf("Remove %s (%s)? [y/n]", kind, database))
switch {
case err != nil:
ui.Output(err.Error())
return
case confirm != "":
switch strings.ToLower(confirm) {
case "y":
start := time.Now()
err = filepath.Walk(database, func(path string, info os.FileInfo, err error) error {
// If we're at the top level folder, recurse into
if path == database {
return nil
}
// Delete all the files, but not subfolders
if !info.IsDir() {
return os.Remove(path)
}
return filepath.SkipDir
})
if err != nil && err != filepath.SkipDir {
ui.Output(err.Error())
} else {
log.Info("Database successfully deleted", "path", database, "elapsed", common.PrettyDuration(time.Since(start)))
}
return
case "n":
log.Info("Database deletion skipped", "path", database)
return
}
}
}
}