Skip to content

Commit e44d655

Browse files
authored
cmd, core, ethdb, node: move chain freezer one folder deeper (#25487)
* cmd, core, ethdb, node: create chain freezer in a sub folder * core/rawdb: remove unused code * core, ethdb, node: add AncientDatadir API back * cmd, core: extend freezer info dump for sub-ancient-store * core/rawdb: rework freezer inspector * core/rawdb: address comments from Peter * core/rawdb: fix build issue
1 parent f67e54c commit e44d655

File tree

13 files changed

+191
-113
lines changed

13 files changed

+191
-113
lines changed

cmd/geth/dbcmd.go

Lines changed: 22 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import (
2222
"os"
2323
"os/signal"
2424
"path/filepath"
25-
"sort"
2625
"strconv"
2726
"strings"
2827
"syscall"
@@ -160,8 +159,8 @@ WARNING: This is a low-level operation which may cause database corruption!`,
160159
dbDumpFreezerIndex = &cli.Command{
161160
Action: freezerInspect,
162161
Name: "freezer-index",
163-
Usage: "Dump out the index of a given freezer type",
164-
ArgsUsage: "<type> <start (int)> <end (int)>",
162+
Usage: "Dump out the index of a specific freezer table",
163+
ArgsUsage: "<freezer-type> <table-type> <start (int)> <end (int)>",
165164
Flags: flags.Merge([]cli.Flag{
166165
utils.SyncModeFlag,
167166
}, utils.NetworkFlags, utils.DatabasePathFlags),
@@ -275,7 +274,7 @@ func inspect(ctx *cli.Context) error {
275274
start []byte
276275
)
277276
if ctx.NArg() > 2 {
278-
return fmt.Errorf("Max 2 arguments: %v", ctx.Command.ArgsUsage)
277+
return fmt.Errorf("max 2 arguments: %v", ctx.Command.ArgsUsage)
279278
}
280279
if ctx.NArg() >= 1 {
281280
if d, err := hexutil.Decode(ctx.Args().Get(0)); err != nil {
@@ -536,43 +535,35 @@ func dbDumpTrie(ctx *cli.Context) error {
536535
}
537536

538537
func freezerInspect(ctx *cli.Context) error {
539-
var (
540-
start, end int64
541-
disableSnappy bool
542-
err error
543-
)
544-
if ctx.NArg() < 3 {
538+
if ctx.NArg() < 4 {
545539
return fmt.Errorf("required arguments: %v", ctx.Command.ArgsUsage)
546540
}
547-
kind := ctx.Args().Get(0)
548-
if noSnap, ok := rawdb.FreezerNoSnappy[kind]; !ok {
549-
var options []string
550-
for opt := range rawdb.FreezerNoSnappy {
551-
options = append(options, opt)
552-
}
553-
sort.Strings(options)
554-
return fmt.Errorf("Could read freezer-type '%v'. Available options: %v", kind, options)
555-
} else {
556-
disableSnappy = noSnap
557-
}
558-
if start, err = strconv.ParseInt(ctx.Args().Get(1), 10, 64); err != nil {
559-
log.Info("Could read start-param", "error", err)
541+
var (
542+
freezer = ctx.Args().Get(0)
543+
table = ctx.Args().Get(1)
544+
)
545+
start, err := strconv.ParseInt(ctx.Args().Get(2), 10, 64)
546+
if err != nil {
547+
log.Info("Could not read start-param", "err", err)
560548
return err
561549
}
562-
if end, err = strconv.ParseInt(ctx.Args().Get(2), 10, 64); err != nil {
563-
log.Info("Could read count param", "error", err)
550+
end, err := strconv.ParseInt(ctx.Args().Get(3), 10, 64)
551+
if err != nil {
552+
log.Info("Could not read count param", "err", err)
564553
return err
565554
}
566555
stack, _ := makeConfigNode(ctx)
567556
defer stack.Close()
568-
path := filepath.Join(stack.ResolvePath("chaindata"), "ancient")
569-
log.Info("Opening freezer", "location", path, "name", kind)
570-
if f, err := rawdb.NewFreezerTable(path, kind, disableSnappy, true); err != nil {
557+
558+
db := utils.MakeChainDatabase(ctx, stack, true)
559+
defer db.Close()
560+
561+
ancient, err := db.AncientDatadir()
562+
if err != nil {
563+
log.Info("Failed to retrieve ancient root", "err", err)
571564
return err
572-
} else {
573-
f.DumpIndex(start, end)
574565
}
575-
return nil
566+
return rawdb.InspectFreezerTable(ancient, freezer, table, start, end)
576567
}
577568

578569
func importLDBdata(ctx *cli.Context) error {

cmd/utils/flags.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ var (
9191
}
9292
AncientFlag = &flags.DirectoryFlag{
9393
Name: "datadir.ancient",
94-
Usage: "Data directory for ancient chain segments (default = inside chaindata)",
94+
Usage: "Root directory for ancient data (default = inside chaindata)",
9595
Category: flags.EthCategory,
9696
}
9797
MinFreeDiskSpaceFlag = &flags.DirectoryFlag{

core/rawdb/accessors_chain.go

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ import (
3737
func ReadCanonicalHash(db ethdb.Reader, number uint64) common.Hash {
3838
var data []byte
3939
db.ReadAncients(func(reader ethdb.AncientReaderOp) error {
40-
data, _ = reader.Ancient(freezerHashTable, number)
40+
data, _ = reader.Ancient(chainFreezerHashTable, number)
4141
if len(data) == 0 {
4242
// Get it by hash from leveldb
4343
data, _ = db.Get(headerHashKey(number))
@@ -335,7 +335,7 @@ func ReadHeaderRange(db ethdb.Reader, number uint64, count uint64) []rlp.RawValu
335335
}
336336
// read remaining from ancients
337337
max := count * 700
338-
data, err := db.AncientRange(freezerHeaderTable, i+1-count, count, max)
338+
data, err := db.AncientRange(chainFreezerHeaderTable, i+1-count, count, max)
339339
if err == nil && uint64(len(data)) == count {
340340
// the data is on the order [h, h+1, .., n] -- reordering needed
341341
for i := range data {
@@ -352,7 +352,7 @@ func ReadHeaderRLP(db ethdb.Reader, hash common.Hash, number uint64) rlp.RawValu
352352
// First try to look up the data in ancient database. Extra hash
353353
// comparison is necessary since ancient database only maintains
354354
// the canonical data.
355-
data, _ = reader.Ancient(freezerHeaderTable, number)
355+
data, _ = reader.Ancient(chainFreezerHeaderTable, number)
356356
if len(data) > 0 && crypto.Keccak256Hash(data) == hash {
357357
return nil
358358
}
@@ -428,7 +428,7 @@ func deleteHeaderWithoutNumber(db ethdb.KeyValueWriter, hash common.Hash, number
428428
// isCanon is an internal utility method, to check whether the given number/hash
429429
// is part of the ancient (canon) set.
430430
func isCanon(reader ethdb.AncientReaderOp, number uint64, hash common.Hash) bool {
431-
h, err := reader.Ancient(freezerHashTable, number)
431+
h, err := reader.Ancient(chainFreezerHashTable, number)
432432
if err != nil {
433433
return false
434434
}
@@ -444,7 +444,7 @@ func ReadBodyRLP(db ethdb.Reader, hash common.Hash, number uint64) rlp.RawValue
444444
db.ReadAncients(func(reader ethdb.AncientReaderOp) error {
445445
// Check if the data is in ancients
446446
if isCanon(reader, number, hash) {
447-
data, _ = reader.Ancient(freezerBodiesTable, number)
447+
data, _ = reader.Ancient(chainFreezerBodiesTable, number)
448448
return nil
449449
}
450450
// If not, try reading from leveldb
@@ -459,7 +459,7 @@ func ReadBodyRLP(db ethdb.Reader, hash common.Hash, number uint64) rlp.RawValue
459459
func ReadCanonicalBodyRLP(db ethdb.Reader, number uint64) rlp.RawValue {
460460
var data []byte
461461
db.ReadAncients(func(reader ethdb.AncientReaderOp) error {
462-
data, _ = reader.Ancient(freezerBodiesTable, number)
462+
data, _ = reader.Ancient(chainFreezerBodiesTable, number)
463463
if len(data) > 0 {
464464
return nil
465465
}
@@ -527,7 +527,7 @@ func ReadTdRLP(db ethdb.Reader, hash common.Hash, number uint64) rlp.RawValue {
527527
db.ReadAncients(func(reader ethdb.AncientReaderOp) error {
528528
// Check if the data is in ancients
529529
if isCanon(reader, number, hash) {
530-
data, _ = reader.Ancient(freezerDifficultyTable, number)
530+
data, _ = reader.Ancient(chainFreezerDifficultyTable, number)
531531
return nil
532532
}
533533
// If not, try reading from leveldb
@@ -587,7 +587,7 @@ func ReadReceiptsRLP(db ethdb.Reader, hash common.Hash, number uint64) rlp.RawVa
587587
db.ReadAncients(func(reader ethdb.AncientReaderOp) error {
588588
// Check if the data is in ancients
589589
if isCanon(reader, number, hash) {
590-
data, _ = reader.Ancient(freezerReceiptTable, number)
590+
data, _ = reader.Ancient(chainFreezerReceiptTable, number)
591591
return nil
592592
}
593593
// If not, try reading from leveldb
@@ -819,19 +819,19 @@ func WriteAncientBlocks(db ethdb.AncientWriter, blocks []*types.Block, receipts
819819

820820
func writeAncientBlock(op ethdb.AncientWriteOp, block *types.Block, header *types.Header, receipts []*types.ReceiptForStorage, td *big.Int) error {
821821
num := block.NumberU64()
822-
if err := op.AppendRaw(freezerHashTable, num, block.Hash().Bytes()); err != nil {
822+
if err := op.AppendRaw(chainFreezerHashTable, num, block.Hash().Bytes()); err != nil {
823823
return fmt.Errorf("can't add block %d hash: %v", num, err)
824824
}
825-
if err := op.Append(freezerHeaderTable, num, header); err != nil {
825+
if err := op.Append(chainFreezerHeaderTable, num, header); err != nil {
826826
return fmt.Errorf("can't append block header %d: %v", num, err)
827827
}
828-
if err := op.Append(freezerBodiesTable, num, block.Body()); err != nil {
828+
if err := op.Append(chainFreezerBodiesTable, num, block.Body()); err != nil {
829829
return fmt.Errorf("can't append block body %d: %v", num, err)
830830
}
831-
if err := op.Append(freezerReceiptTable, num, receipts); err != nil {
831+
if err := op.Append(chainFreezerReceiptTable, num, receipts); err != nil {
832832
return fmt.Errorf("can't append block %d receipts: %v", num, err)
833833
}
834-
if err := op.Append(freezerDifficultyTable, num, td); err != nil {
834+
if err := op.Append(chainFreezerDifficultyTable, num, td); err != nil {
835835
return fmt.Errorf("can't append block %d total difficulty: %v", num, err)
836836
}
837837
return nil

core/rawdb/ancient_scheme.go

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
// Copyright 2022 The go-ethereum Authors
2+
// This file is part of the go-ethereum library.
3+
//
4+
// The go-ethereum library is free software: you can redistribute it and/or modify
5+
// it under the terms of the GNU Lesser General Public License as published by
6+
// the Free Software Foundation, either version 3 of the License, or
7+
// (at your option) any later version.
8+
//
9+
// The go-ethereum library is distributed in the hope that it will be useful,
10+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
// GNU Lesser General Public License for more details.
13+
//
14+
// You should have received a copy of the GNU Lesser General Public License
15+
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
16+
17+
package rawdb
18+
19+
import "fmt"
20+
21+
// The list of table names of chain freezer.
22+
const (
23+
// chainFreezerHeaderTable indicates the name of the freezer header table.
24+
chainFreezerHeaderTable = "headers"
25+
26+
// chainFreezerHashTable indicates the name of the freezer canonical hash table.
27+
chainFreezerHashTable = "hashes"
28+
29+
// chainFreezerBodiesTable indicates the name of the freezer block body table.
30+
chainFreezerBodiesTable = "bodies"
31+
32+
// chainFreezerReceiptTable indicates the name of the freezer receipts table.
33+
chainFreezerReceiptTable = "receipts"
34+
35+
// chainFreezerDifficultyTable indicates the name of the freezer total difficulty table.
36+
chainFreezerDifficultyTable = "diffs"
37+
)
38+
39+
// chainFreezerNoSnappy configures whether compression is disabled for the ancient-tables.
40+
// Hashes and difficulties don't compress well.
41+
var chainFreezerNoSnappy = map[string]bool{
42+
chainFreezerHeaderTable: false,
43+
chainFreezerHashTable: true,
44+
chainFreezerBodiesTable: false,
45+
chainFreezerReceiptTable: false,
46+
chainFreezerDifficultyTable: true,
47+
}
48+
49+
// The list of identifiers of ancient stores.
50+
var (
51+
chainFreezerName = "chain" // the folder name of chain segment ancient store.
52+
)
53+
54+
// freezers the collections of all builtin freezers.
55+
var freezers = []string{chainFreezerName}
56+
57+
// InspectFreezerTable dumps out the index of a specific freezer table. The passed
58+
// ancient indicates the path of root ancient directory where the chain freezer can
59+
// be opened. Start and end specify the range for dumping out indexes.
60+
// Note this function can only be used for debugging purposes.
61+
func InspectFreezerTable(ancient string, freezerName string, tableName string, start, end int64) error {
62+
var (
63+
path string
64+
tables map[string]bool
65+
)
66+
switch freezerName {
67+
case chainFreezerName:
68+
path, tables = resolveChainFreezerDir(ancient), chainFreezerNoSnappy
69+
default:
70+
return fmt.Errorf("unknown freezer, supported ones: %v", freezers)
71+
}
72+
noSnappy, exist := tables[tableName]
73+
if !exist {
74+
var names []string
75+
for name := range tables {
76+
names = append(names, name)
77+
}
78+
return fmt.Errorf("unknown table, supported ones: %v", names)
79+
}
80+
table, err := newFreezerTable(path, tableName, noSnappy, true)
81+
if err != nil {
82+
return err
83+
}
84+
table.dumpIndexStdout(start, end)
85+
return nil
86+
}

core/rawdb/chain_freezer.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -278,19 +278,19 @@ func (f *chainFreezer) freezeRange(nfdb *nofreezedb, number, limit uint64) (hash
278278
}
279279

280280
// Write to the batch.
281-
if err := op.AppendRaw(freezerHashTable, number, hash[:]); err != nil {
281+
if err := op.AppendRaw(chainFreezerHashTable, number, hash[:]); err != nil {
282282
return fmt.Errorf("can't write hash to Freezer: %v", err)
283283
}
284-
if err := op.AppendRaw(freezerHeaderTable, number, header); err != nil {
284+
if err := op.AppendRaw(chainFreezerHeaderTable, number, header); err != nil {
285285
return fmt.Errorf("can't write header to Freezer: %v", err)
286286
}
287-
if err := op.AppendRaw(freezerBodiesTable, number, body); err != nil {
287+
if err := op.AppendRaw(chainFreezerBodiesTable, number, body); err != nil {
288288
return fmt.Errorf("can't write body to Freezer: %v", err)
289289
}
290-
if err := op.AppendRaw(freezerReceiptTable, number, receipts); err != nil {
290+
if err := op.AppendRaw(chainFreezerReceiptTable, number, receipts); err != nil {
291291
return fmt.Errorf("can't write receipts to Freezer: %v", err)
292292
}
293-
if err := op.AppendRaw(freezerDifficultyTable, number, td); err != nil {
293+
if err := op.AppendRaw(chainFreezerDifficultyTable, number, td); err != nil {
294294
return fmt.Errorf("can't write td to Freezer: %v", err)
295295
}
296296

core/rawdb/chain_iterator.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ func InitDatabaseFromFreezer(db ethdb.Database) {
5050
if i+count > frozen {
5151
count = frozen - i
5252
}
53-
data, err := db.AncientRange(freezerHashTable, i, count, 32*count)
53+
data, err := db.AncientRange(chainFreezerHashTable, i, count, 32*count)
5454
if err != nil {
5555
log.Crit("Failed to init database from freezer", "err", err)
5656
}

0 commit comments

Comments
 (0)