From e08d82f3a0d5801d08a3a91d8be5809f5d85ee04 Mon Sep 17 00:00:00 2001 From: Sina Mahmoodi Date: Thu, 17 Mar 2022 17:58:17 +0100 Subject: [PATCH] speed-up hack for mainnet --- cmd/geth/config.go | 8 +++++++- cmd/geth/dbcmd.go | 35 ++++++++++++++++++++--------------- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/cmd/geth/config.go b/cmd/geth/config.go index d36a716784c2c..9d69344987478 100644 --- a/cmd/geth/config.go +++ b/cmd/geth/config.go @@ -164,7 +164,13 @@ func makeFullNode(ctx *cli.Context) (*node.Node, ethapi.Backend) { backend, eth := utils.RegisterEthService(stack, &cfg.Eth) // Warn users to migrate if they have a legacy freezer format. if eth != nil { - isLegacy, _, err := dbHasLegacyReceipts(eth.ChainDb()) + firstIdx := uint64(0) + // Hack to speed up check for mainnet because we know + // the first non-empty block. + if ctx.GlobalIsSet(utils.MainnetFlag.Name) { + firstIdx = 46147 + } + isLegacy, _, err := dbHasLegacyReceipts(eth.ChainDb(), firstIdx) if err != nil { utils.Fatalf("Failed to check db for legacy receipts: %v", err) } diff --git a/cmd/geth/dbcmd.go b/cmd/geth/dbcmd.go index 4732bd6f2afe4..f7bebf56f97a7 100644 --- a/cmd/geth/dbcmd.go +++ b/cmd/geth/dbcmd.go @@ -787,7 +787,7 @@ func freezerMigrate(ctx *cli.Context) error { return nil } - isFirstLegacy, firstIdx, err := dbHasLegacyReceipts(db) + isFirstLegacy, firstIdx, err := dbHasLegacyReceipts(db, 0) if err != nil { return err } @@ -812,7 +812,7 @@ func freezerMigrate(ctx *cli.Context) error { // dbHasLegacyReceipts checks freezer entries for legacy receipts. It stops at the first // non-empty receipt and checks its format. The index of this first non-empty element is // the second return parameter. -func dbHasLegacyReceipts(db ethdb.Database) (bool, uint64, error) { +func dbHasLegacyReceipts(db ethdb.Database, firstIdx uint64) (bool, uint64, error) { // Check first block for legacy receipt format numAncients, err := db.Ancients() if err != nil { @@ -821,24 +821,29 @@ func dbHasLegacyReceipts(db ethdb.Database) (bool, uint64, error) { if numAncients < 1 { return false, 0, nil } + if firstIdx >= numAncients { + return false, firstIdx, nil + } var ( legacy bool - firstIdx uint64 blob []byte emptyRLPList = []byte{192} ) - // Find first block with non-empty receipt - for i := uint64(0); i < numAncients; i++ { - blob, err = db.Ancient("receipts", i) - if err != nil { - return false, 0, err - } - if len(blob) == 0 { - continue - } - if !bytes.Equal(blob, emptyRLPList) { - firstIdx = i - break + // Find first block with non-empty receipt, only if + // the index is not already provided. + if firstIdx == 0 { + for i := uint64(0); i < numAncients; i++ { + blob, err = db.Ancient("receipts", i) + if err != nil { + return false, 0, err + } + if len(blob) == 0 { + continue + } + if !bytes.Equal(blob, emptyRLPList) { + firstIdx = i + break + } } } // Is first non-empty receipt legacy?