aboutsummaryrefslogtreecommitdiffstats
path: root/cmd
diff options
context:
space:
mode:
authorPéter Szilágyi <peterke@gmail.com>2019-05-17 00:10:58 +0800
committerGitHub <noreply@github.com>2019-05-17 00:10:58 +0800
commitf5d89cdb72c1e82e9deb54754bef8dd20bf12591 (patch)
treeb6e2ee16b90cd494eaefec59fb4aaaac71cc6a96 /cmd
parent60386b3545659d99c7488e456c780606db101936 (diff)
parent9eba3a9fff2f47f5e094c36a7c905380b0ac8b1f (diff)
downloadgo-tangerine-f5d89cdb72c1e82e9deb54754bef8dd20bf12591.tar
go-tangerine-f5d89cdb72c1e82e9deb54754bef8dd20bf12591.tar.gz
go-tangerine-f5d89cdb72c1e82e9deb54754bef8dd20bf12591.tar.bz2
go-tangerine-f5d89cdb72c1e82e9deb54754bef8dd20bf12591.tar.lz
go-tangerine-f5d89cdb72c1e82e9deb54754bef8dd20bf12591.tar.xz
go-tangerine-f5d89cdb72c1e82e9deb54754bef8dd20bf12591.tar.zst
go-tangerine-f5d89cdb72c1e82e9deb54754bef8dd20bf12591.zip
Merge pull request #19244 from karalabe/freezer-2
cmd, core, eth, les, node: chain freezer on top of db rework
Diffstat (limited to 'cmd')
-rw-r--r--cmd/geth/chaincmd.go111
-rw-r--r--cmd/geth/main.go2
-rw-r--r--cmd/geth/usage.go1
-rw-r--r--cmd/utils/cmd.go2
-rw-r--r--cmd/utils/flags.go9
5 files changed, 99 insertions, 26 deletions
diff --git a/cmd/geth/chaincmd.go b/cmd/geth/chaincmd.go
index 582f0b768..c91545c7f 100644
--- a/cmd/geth/chaincmd.go
+++ b/cmd/geth/chaincmd.go
@@ -20,6 +20,7 @@ import (
"encoding/json"
"fmt"
"os"
+ "path/filepath"
"runtime"
"strconv"
"sync/atomic"
@@ -167,6 +168,22 @@ Remove blockchain and state databases`,
The arguments are interpreted as block numbers or hashes.
Use "ethereum dump 0" to dump the genesis block.`,
}
+ inspectCommand = cli.Command{
+ Action: utils.MigrateFlags(inspect),
+ Name: "inspect",
+ Usage: "Inspect the storage size for each type of data in the database",
+ ArgsUsage: " ",
+ Flags: []cli.Flag{
+ utils.DataDirFlag,
+ utils.AncientFlag,
+ utils.CacheFlag,
+ utils.TestnetFlag,
+ utils.RinkebyFlag,
+ utils.GoerliFlag,
+ utils.SyncModeFlag,
+ },
+ Category: "BLOCKCHAIN COMMANDS",
+ }
)
// initGenesis will initialise the given JSON format genesis file and writes it as
@@ -368,9 +385,12 @@ func exportPreimages(ctx *cli.Context) error {
func copyDb(ctx *cli.Context) error {
// Ensure we have a source chain directory to copy
- if len(ctx.Args()) != 1 {
+ if len(ctx.Args()) < 1 {
utils.Fatalf("Source chaindata directory path argument missing")
}
+ if len(ctx.Args()) < 2 {
+ utils.Fatalf("Source ancient chain directory path argument missing")
+ }
// Initialize a new chain for the running node to sync into
stack := makeFullNode(ctx)
defer stack.Close()
@@ -385,7 +405,7 @@ func copyDb(ctx *cli.Context) error {
dl := downloader.New(0, chainDb, syncBloom, new(event.TypeMux), chain, nil, nil)
// Create a source peer to satisfy downloader requests from
- db, err := rawdb.NewLevelDBDatabase(ctx.Args().First(), ctx.GlobalInt(utils.CacheFlag.Name)/2, 256, "")
+ db, err := rawdb.NewLevelDBDatabaseWithFreezer(ctx.Args().First(), ctx.GlobalInt(utils.CacheFlag.Name)/2, 256, ctx.Args().Get(1), "")
if err != nil {
return err
}
@@ -420,34 +440,65 @@ func copyDb(ctx *cli.Context) error {
}
func removeDB(ctx *cli.Context) error {
- stack, _ := makeConfigNode(ctx)
+ stack, config := makeConfigNode(ctx)
- for _, name := range []string{"chaindata", "lightchaindata"} {
- // Ensure the database exists in the first place
- logger := log.New("database", name)
-
- dbdir := stack.ResolvePath(name)
- if !common.FileExist(dbdir) {
- logger.Info("Database doesn't exist, skipping", "path", dbdir)
- continue
- }
- // Confirm removal and execute
- fmt.Println(dbdir)
- confirm, err := console.Stdin.PromptConfirm("Remove this database?")
- switch {
- case err != nil:
- utils.Fatalf("%v", err)
- case !confirm:
- logger.Warn("Database deletion aborted")
- default:
- start := time.Now()
- os.RemoveAll(dbdir)
- logger.Info("Database successfully deleted", "elapsed", common.PrettyDuration(time.Since(start)))
- }
+ // Remove the full node state database
+ path := stack.ResolvePath("chaindata")
+ if common.FileExist(path) {
+ confirmAndRemoveDB(path, "full node state database")
+ } else {
+ log.Info("Full node state database missing", "path", path)
+ }
+ // Remove the full node ancient database
+ path = config.Eth.DatabaseFreezer
+ switch {
+ case path == "":
+ path = filepath.Join(stack.ResolvePath("chaindata"), "ancient")
+ case !filepath.IsAbs(path):
+ path = config.Node.ResolvePath(path)
+ }
+ if common.FileExist(path) {
+ confirmAndRemoveDB(path, "full node ancient database")
+ } else {
+ log.Info("Full node ancient database missing", "path", path)
+ }
+ // Remove the light node database
+ path = stack.ResolvePath("lightchaindata")
+ if common.FileExist(path) {
+ confirmAndRemoveDB(path, "light node database")
+ } else {
+ log.Info("Light node database missing", "path", path)
}
return nil
}
+// confirmAndRemoveDB prompts the user for a last confirmation and removes the
+// folder if accepted.
+func confirmAndRemoveDB(database string, kind string) {
+ confirm, err := console.Stdin.PromptConfirm(fmt.Sprintf("Remove %s (%s)?", kind, database))
+ switch {
+ case err != nil:
+ utils.Fatalf("%v", err)
+ case !confirm:
+ log.Info("Database deletion skipped", "path", database)
+ default:
+ start := time.Now()
+ 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() {
+ os.Remove(path)
+ return nil
+ }
+ return filepath.SkipDir
+ })
+ log.Info("Database successfully deleted", "path", database, "elapsed", common.PrettyDuration(time.Since(start)))
+ }
+}
+
func dump(ctx *cli.Context) error {
stack := makeFullNode(ctx)
defer stack.Close()
@@ -476,6 +527,16 @@ func dump(ctx *cli.Context) error {
return nil
}
+func inspect(ctx *cli.Context) error {
+ node, _ := makeConfigNode(ctx)
+ defer node.Close()
+
+ _, chainDb := utils.MakeChain(ctx, node)
+ defer chainDb.Close()
+
+ return rawdb.InspectDatabase(chainDb)
+}
+
// hashish returns true for strings that look like hashes.
func hashish(x string) bool {
_, err := strconv.Atoi(x)
diff --git a/cmd/geth/main.go b/cmd/geth/main.go
index 838029333..1b23cbd9f 100644
--- a/cmd/geth/main.go
+++ b/cmd/geth/main.go
@@ -62,6 +62,7 @@ var (
utils.BootnodesV4Flag,
utils.BootnodesV5Flag,
utils.DataDirFlag,
+ utils.AncientFlag,
utils.KeyStoreDirFlag,
utils.ExternalSignerFlag,
utils.NoUSBFlag,
@@ -203,6 +204,7 @@ func init() {
copydbCommand,
removedbCommand,
dumpCommand,
+ inspectCommand,
// See accountcmd.go:
accountCommand,
walletCommand,
diff --git a/cmd/geth/usage.go b/cmd/geth/usage.go
index 7ec1ab03f..67b0027f2 100644
--- a/cmd/geth/usage.go
+++ b/cmd/geth/usage.go
@@ -69,6 +69,7 @@ var AppHelpFlagGroups = []flagGroup{
Flags: []cli.Flag{
configFileFlag,
utils.DataDirFlag,
+ utils.AncientFlag,
utils.KeyStoreDirFlag,
utils.NoUSBFlag,
utils.NetworkIdFlag,
diff --git a/cmd/utils/cmd.go b/cmd/utils/cmd.go
index 74a8c7f39..a3ee45ba7 100644
--- a/cmd/utils/cmd.go
+++ b/cmd/utils/cmd.go
@@ -302,6 +302,8 @@ func ExportPreimages(db ethdb.Database, fn string) error {
}
// Iterate over the preimages and export them
it := db.NewIteratorWithPrefix([]byte("secure-key-"))
+ defer it.Release()
+
for it.Next() {
if err := rlp.Encode(writer, it.Value()); err != nil {
return err
diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go
index 2dc45cbba..ddeb44f34 100644
--- a/cmd/utils/flags.go
+++ b/cmd/utils/flags.go
@@ -117,6 +117,10 @@ var (
Usage: "Data directory for the databases and keystore",
Value: DirectoryString{node.DefaultDataDir()},
}
+ AncientFlag = DirectoryFlag{
+ Name: "datadir.ancient",
+ Usage: "Data directory for ancient chain segments (default = inside chaindata)",
+ }
KeyStoreDirFlag = DirectoryFlag{
Name: "keystore",
Usage: "Directory for the keystore (default = inside the datadir)",
@@ -1378,6 +1382,9 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *eth.Config) {
cfg.DatabaseCache = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheDatabaseFlag.Name) / 100
}
cfg.DatabaseHandles = makeDatabaseHandles()
+ if ctx.GlobalIsSet(AncientFlag.Name) {
+ cfg.DatabaseFreezer = ctx.GlobalString(AncientFlag.Name)
+ }
if gcmode := ctx.GlobalString(GCModeFlag.Name); gcmode != "full" && gcmode != "archive" {
Fatalf("--%s must be either 'full' or 'archive'", GCModeFlag.Name)
@@ -1566,7 +1573,7 @@ func MakeChainDatabase(ctx *cli.Context, stack *node.Node) ethdb.Database {
if ctx.GlobalString(SyncModeFlag.Name) == "light" {
name = "lightchaindata"
}
- chainDb, err := stack.OpenDatabase(name, cache, handles, "")
+ chainDb, err := stack.OpenDatabaseWithFreezer(name, cache, handles, ctx.GlobalString(AncientFlag.Name), "")
if err != nil {
Fatalf("Could not open database: %v", err)
}