Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 0 additions & 7 deletions cmd/geth/chaincmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -306,11 +306,6 @@ func initGenesis(ctx *cli.Context) error {
utils.Fatalf("Failed to open separate trie database: %v", dbErr)
}
chaindb.SetStateStore(statediskdb)
blockdb, err := stack.OpenDatabaseWithFreezer(name+"/block", 0, 0, "", "", false, false)
if err != nil {
utils.Fatalf("Failed to open separate block database: %v", err)
}
chaindb.SetBlockStore(blockdb)
log.Warn("Multi-database is an experimental feature")
}

Expand Down Expand Up @@ -698,8 +693,6 @@ func dumpGenesis(ctx *cli.Context) error {
if stack.CheckIfMultiDataBase() && err == nil {
stateDiskDb := utils.MakeStateDataBase(ctx, stack, true, false)
db.SetStateStore(stateDiskDb)
blockDb := utils.MakeBlockDatabase(ctx, stack, true, false)
db.SetBlockStore(blockDb)
}

genesis, err = core.ReadGenesis(db)
Expand Down
95 changes: 23 additions & 72 deletions cmd/geth/dbcmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -574,11 +574,8 @@ func checkStateContent(ctx *cli.Context) error {
startTime = time.Now()
lastLog = time.Now()
)
if stack.CheckIfMultiDataBase() {
it = rawdb.NewKeyLengthIterator(db.StateStore().NewIterator(prefix, start), 32)
} else {
it = rawdb.NewKeyLengthIterator(db.NewIterator(prefix, start), 32)
}

it = rawdb.NewKeyLengthIterator(db.GetStateStore().NewIterator(prefix, start), 32)
for it.Next() {
count++
k := it.Key()
Expand Down Expand Up @@ -621,11 +618,9 @@ func dbStats(ctx *cli.Context) error {
defer db.Close()

showDBStats(db)
if stack.CheckIfMultiDataBase() {
if db.HasSeparateStateStore() {
fmt.Println("show stats of state store")
showDBStats(db.StateStore())
fmt.Println("show stats of block store")
showDBStats(db.BlockStore())
showDBStats(db.GetStateStore())
}

return nil
Expand All @@ -640,11 +635,10 @@ func dbCompact(ctx *cli.Context) error {

log.Info("Stats before compaction")
showDBStats(db)

if stack.CheckIfMultiDataBase() {
fmt.Println("show stats of state store")
showDBStats(db.StateStore())
fmt.Println("show stats of block store")
showDBStats(db.BlockStore())
showDBStats(db.GetStateStore())
}

log.Info("Triggering compaction")
Expand All @@ -654,11 +648,7 @@ func dbCompact(ctx *cli.Context) error {
}

if stack.CheckIfMultiDataBase() {
if err := db.StateStore().Compact(nil, nil); err != nil {
log.Error("Compact err", "error", err)
return err
}
if err := db.BlockStore().Compact(nil, nil); err != nil {
if err := db.GetStateStore().Compact(nil, nil); err != nil {
log.Error("Compact err", "error", err)
return err
}
Expand All @@ -668,9 +658,7 @@ func dbCompact(ctx *cli.Context) error {
showDBStats(db)
if stack.CheckIfMultiDataBase() {
fmt.Println("show stats of state store after compaction")
showDBStats(db.StateStore())
fmt.Println("show stats of block store after compaction")
showDBStats(db.BlockStore())
showDBStats(db.GetStateStore())
}
return nil
}
Expand All @@ -692,13 +680,8 @@ func dbGet(ctx *cli.Context) error {
return err
}
opDb := db
if stack.CheckIfMultiDataBase() {
keyType := rawdb.DataTypeByKey(key)
if keyType == rawdb.StateDataType {
opDb = db.StateStore()
} else if keyType == rawdb.BlockDataType {
opDb = db.BlockStore()
}
if stack.CheckIfMultiDataBase() && rawdb.DataTypeByKey(key) == rawdb.StateDataType {
opDb = db.GetStateStore()
}

data, err := opDb.Get(key)
Expand All @@ -720,11 +703,7 @@ func dbTrieGet(ctx *cli.Context) error {

var db ethdb.Database
chaindb := utils.MakeChainDatabase(ctx, stack, true, false)
if chaindb.StateStore() != nil {
db = chaindb.StateStore()
} else {
db = chaindb
}
db = chaindb.GetStateStore()
defer chaindb.Close()

scheme := ctx.String(utils.StateSchemeFlag.Name)
Expand Down Expand Up @@ -792,11 +771,7 @@ func dbTrieDelete(ctx *cli.Context) error {

var db ethdb.Database
chaindb := utils.MakeChainDatabase(ctx, stack, true, false)
if chaindb.StateStore() != nil {
db = chaindb.StateStore()
} else {
db = chaindb
}
db = chaindb.GetStateStore()
defer chaindb.Close()

scheme := ctx.String(utils.StateSchemeFlag.Name)
Expand Down Expand Up @@ -866,13 +841,8 @@ func dbDelete(ctx *cli.Context) error {
return err
}
opDb := db
if stack.CheckIfMultiDataBase() {
keyType := rawdb.DataTypeByKey(key)
if keyType == rawdb.StateDataType {
opDb = db.StateStore()
} else if keyType == rawdb.BlockDataType {
opDb = db.BlockStore()
}
if opDb.HasSeparateStateStore() && rawdb.DataTypeByKey(key) == rawdb.StateDataType {
opDb = db.GetStateStore()
}

data, err := opDb.Get(key)
Expand Down Expand Up @@ -904,7 +874,7 @@ func dbDeleteTrieState(ctx *cli.Context) error {
)

// If separate trie db exists, delete all files in the db folder
if db.StateStore() != nil {
if db.HasSeparateStateStore() {
statePath := filepath.Join(stack.ResolvePath("chaindata"), "state")
log.Info("Removing separate trie database", "path", statePath)
err = filepath.Walk(statePath, func(path string, info os.FileInfo, err error) error {
Expand Down Expand Up @@ -991,13 +961,8 @@ func dbPut(ctx *cli.Context) error {
}

opDb := db
if stack.CheckIfMultiDataBase() {
keyType := rawdb.DataTypeByKey(key)
if keyType == rawdb.StateDataType {
opDb = db.StateStore()
} else if keyType == rawdb.BlockDataType {
opDb = db.BlockStore()
}
if db.HasSeparateStateStore() && rawdb.DataTypeByKey(key) == rawdb.StateDataType {
opDb = db.GetStateStore()
}

data, err = opDb.Get(key)
Expand Down Expand Up @@ -1235,7 +1200,7 @@ func showMetaData(ctx *cli.Context) error {
defer stack.Close()
db := utils.MakeChainDatabase(ctx, stack, true, false)
defer db.Close()
ancients, err := db.BlockStore().Ancients()
ancients, err := db.Ancients()
if err != nil {
fmt.Fprintf(os.Stderr, "Error accessing ancients: %v", err)
}
Expand Down Expand Up @@ -1282,17 +1247,12 @@ func hbss2pbss(ctx *cli.Context) error {
defer stack.Close()

db := utils.MakeChainDatabase(ctx, stack, false, false)
db.BlockStore().SyncAncient()
stateDiskDb := db.StateStore()
db.SyncAncient()
defer db.Close()

// convert hbss trie node to pbss trie node
var lastStateID uint64
if stateDiskDb != nil {
lastStateID = rawdb.ReadPersistentStateID(stateDiskDb)
} else {
lastStateID = rawdb.ReadPersistentStateID(db)
}
lastStateID = rawdb.ReadPersistentStateID(db.GetStateStore())
if lastStateID == 0 || force {
config := triedb.HashDefaults
triedb := triedb.NewDatabase(db, config)
Expand Down Expand Up @@ -1343,19 +1303,14 @@ func hbss2pbss(ctx *cli.Context) error {
log.Info("Convert hbss to pbss success. Nothing to do.")
}

// repair state ancient offset
if stateDiskDb != nil {
lastStateID = rawdb.ReadPersistentStateID(stateDiskDb)
} else {
lastStateID = rawdb.ReadPersistentStateID(db)
}
lastStateID = rawdb.ReadPersistentStateID(db.GetStateStore())

if lastStateID == 0 {
log.Error("Convert hbss to pbss trie node error. The last state id is still 0")
}

var ancient string
if db.StateStore() != nil {
if db.HasSeparateStateStore() {
dirName := filepath.Join(stack.ResolvePath("chaindata"), "state")
ancient = filepath.Join(dirName, "ancient")
} else {
Expand All @@ -1367,11 +1322,7 @@ func hbss2pbss(ctx *cli.Context) error {
return err
}
// prune hbss trie node
if stateDiskDb != nil {
err = rawdb.PruneHashTrieNodeInDataBase(stateDiskDb)
} else {
err = rawdb.PruneHashTrieNodeInDataBase(db)
}
err = rawdb.PruneHashTrieNodeInDataBase(db.GetStateStore())
if err != nil {
log.Error("Prune Hash trie node in database failed", "error", err)
return err
Expand Down
17 changes: 2 additions & 15 deletions cmd/utils/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,8 @@ var (
}
MultiDataBaseFlag = &cli.BoolFlag{
Name: "multidatabase",
Usage: "Enable a separated state and block database, it will be created within two subdirectory called state and block, " +
"Users can copy this state or block directory to another directory or disk, and then create a symbolic link to the state directory under the chaindata",
Usage: "Enable a separated state database, it will be created subdirectory called state, " +
"Users can copy this state directory to another directory or disk, and then create a symbolic link to the state directory under the chaindata",
Category: flags.EthCategory,
}
DirectBroadcastFlag = &cli.BoolFlag{
Expand Down Expand Up @@ -2567,8 +2567,6 @@ func MakeChainDatabase(ctx *cli.Context, stack *node.Node, readonly, disableFree
if stack.CheckIfMultiDataBase() && err == nil {
stateDiskDb := MakeStateDataBase(ctx, stack, readonly, false)
chainDb.SetStateStore(stateDiskDb)
blockDb := MakeBlockDatabase(ctx, stack, readonly, false)
chainDb.SetBlockStore(blockDb)
}
}
if err != nil {
Expand All @@ -2588,17 +2586,6 @@ func MakeStateDataBase(ctx *cli.Context, stack *node.Node, readonly, disableFree
return statediskdb
}

// MakeBlockDatabase open a separate block database using the flags passed to the client and will hard crash if it fails.
func MakeBlockDatabase(ctx *cli.Context, stack *node.Node, readonly, disableFreeze bool) ethdb.Database {
cache := ctx.Int(CacheFlag.Name) * ctx.Int(CacheDatabaseFlag.Name) / 100
handles := MakeDatabaseHandles(ctx.Int(FDLimitFlag.Name)) / 10
blockDb, err := stack.OpenDatabaseWithFreezer("chaindata/block", cache, handles, "", "", readonly, disableFreeze)
if err != nil {
Fatalf("Failed to open separate block database: %v", err)
}
return blockDb
}

func PathDBConfigAddJournalFilePath(stack *node.Node, config *pathdb.Config) *pathdb.Config {
path := fmt.Sprintf("%s/%s", stack.ResolvePath("chaindata"), eth.JournalFileName)
config.JournalFilePath = path
Expand Down
Loading