Skip to content

Commit 271e5b7

Browse files
authored
cmd/geth: add db-command to inspect freezer index (#22633)
This PR makes it easier to inspect the freezer index, which could be useful to investigate things like #22111
1 parent 6c27d8f commit 271e5b7

File tree

5 files changed

+72
-15
lines changed

5 files changed

+72
-15
lines changed

cmd/geth/dbcmd.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"fmt"
2121
"os"
2222
"path/filepath"
23+
"sort"
2324
"strconv"
2425
"time"
2526

@@ -60,6 +61,7 @@ Remove blockchain and state databases`,
6061
dbDeleteCmd,
6162
dbPutCmd,
6263
dbGetSlotsCmd,
64+
dbDumpFreezerIndex,
6365
},
6466
}
6567
dbInspectCmd = cli.Command{
@@ -177,6 +179,22 @@ WARNING: This is a low-level operation which may cause database corruption!`,
177179
},
178180
Description: "This command looks up the specified database key from the database.",
179181
}
182+
dbDumpFreezerIndex = cli.Command{
183+
Action: utils.MigrateFlags(freezerInspect),
184+
Name: "freezer-index",
185+
Usage: "Dump out the index of a given freezer type",
186+
ArgsUsage: "<type> <start (int)> <end (int)>",
187+
Flags: []cli.Flag{
188+
utils.DataDirFlag,
189+
utils.SyncModeFlag,
190+
utils.MainnetFlag,
191+
utils.RopstenFlag,
192+
utils.RinkebyFlag,
193+
utils.GoerliFlag,
194+
utils.YoloV3Flag,
195+
},
196+
Description: "This command displays information about the freezer index.",
197+
}
180198
)
181199

182200
func removeDB(ctx *cli.Context) error {
@@ -449,3 +467,43 @@ func dbDumpTrie(ctx *cli.Context) error {
449467
}
450468
return it.Err
451469
}
470+
471+
func freezerInspect(ctx *cli.Context) error {
472+
var (
473+
start, end int64
474+
disableSnappy bool
475+
err error
476+
)
477+
if ctx.NArg() < 3 {
478+
return fmt.Errorf("required arguments: %v", ctx.Command.ArgsUsage)
479+
}
480+
kind := ctx.Args().Get(0)
481+
if noSnap, ok := rawdb.FreezerNoSnappy[kind]; !ok {
482+
var options []string
483+
for opt := range rawdb.FreezerNoSnappy {
484+
options = append(options, opt)
485+
}
486+
sort.Strings(options)
487+
return fmt.Errorf("Could read freezer-type '%v'. Available options: %v", kind, options)
488+
} else {
489+
disableSnappy = noSnap
490+
}
491+
if start, err = strconv.ParseInt(ctx.Args().Get(1), 10, 64); err != nil {
492+
log.Info("Could read start-param", "error", err)
493+
return err
494+
}
495+
if end, err = strconv.ParseInt(ctx.Args().Get(2), 10, 64); err != nil {
496+
log.Info("Could read count param", "error", err)
497+
return err
498+
}
499+
stack, _ := makeConfigNode(ctx)
500+
defer stack.Close()
501+
path := filepath.Join(stack.ResolvePath("chaindata"), "ancient")
502+
log.Info("Opening freezer", "location", path, "name", kind)
503+
if f, err := rawdb.NewFreezerTable(path, kind, disableSnappy); err != nil {
504+
return err
505+
} else {
506+
f.DumpIndex(start, end)
507+
}
508+
return nil
509+
}

core/rawdb/freezer.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ func newFreezer(datadir string, namespace string, readonly bool) (*freezer, erro
118118
trigger: make(chan chan struct{}),
119119
quit: make(chan struct{}),
120120
}
121-
for name, disableSnappy := range freezerNoSnappy {
121+
for name, disableSnappy := range FreezerNoSnappy {
122122
table, err := newTable(datadir, name, readMeter, writeMeter, sizeGauge, disableSnappy)
123123
if err != nil {
124124
for _, table := range freezer.tables {

core/rawdb/freezer_table.go

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -636,25 +636,24 @@ func (t *freezerTable) Sync() error {
636636
return t.head.Sync()
637637
}
638638

639-
// printIndex is a debug print utility function for testing
640-
func (t *freezerTable) printIndex() {
639+
// DumpIndex is a debug print utility function, mainly for testing. It can also
640+
// be used to analyse a live freezer table index.
641+
func (t *freezerTable) DumpIndex(start, stop int64) {
641642
buf := make([]byte, indexEntrySize)
642643

643-
fmt.Printf("|-----------------|\n")
644-
fmt.Printf("| fileno | offset |\n")
645-
fmt.Printf("|--------+--------|\n")
644+
fmt.Printf("| number | fileno | offset |\n")
645+
fmt.Printf("|--------|--------|--------|\n")
646646

647-
for i := uint64(0); ; i++ {
647+
for i := uint64(start); ; i++ {
648648
if _, err := t.index.ReadAt(buf, int64(i*indexEntrySize)); err != nil {
649649
break
650650
}
651651
var entry indexEntry
652652
entry.unmarshalBinary(buf)
653-
fmt.Printf("| %03d | %03d | \n", entry.filenum, entry.offset)
654-
if i > 100 {
655-
fmt.Printf(" ... \n")
653+
fmt.Printf("| %03d | %03d | %03d | \n", i, entry.filenum, entry.offset)
654+
if stop > 0 && i >= uint64(stop) {
656655
break
657656
}
658657
}
659-
fmt.Printf("|-----------------|\n")
658+
fmt.Printf("|--------------------------|\n")
660659
}

core/rawdb/freezer_table_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,7 @@ func TestOffset(t *testing.T) {
525525

526526
f.Append(4, getChunk(20, 0xbb))
527527
f.Append(5, getChunk(20, 0xaa))
528-
f.printIndex()
528+
f.DumpIndex(0, 100)
529529
f.Close()
530530
}
531531
// Now crop it.
@@ -572,7 +572,7 @@ func TestOffset(t *testing.T) {
572572
if err != nil {
573573
t.Fatal(err)
574574
}
575-
f.printIndex()
575+
f.DumpIndex(0, 100)
576576
// It should allow writing item 6
577577
f.Append(numDeleted+2, getChunk(20, 0x99))
578578

core/rawdb/schema.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,9 @@ const (
114114
freezerDifficultyTable = "diffs"
115115
)
116116

117-
// freezerNoSnappy configures whether compression is disabled for the ancient-tables.
117+
// FreezerNoSnappy configures whether compression is disabled for the ancient-tables.
118118
// Hashes and difficulties don't compress well.
119-
var freezerNoSnappy = map[string]bool{
119+
var FreezerNoSnappy = map[string]bool{
120120
freezerHeaderTable: false,
121121
freezerHashTable: true,
122122
freezerBodiesTable: false,

0 commit comments

Comments
 (0)