From 64ca976b762a1296f936f1c7886896488849a915 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Mon, 20 Sep 2021 23:00:58 +0200 Subject: [PATCH 1/2] core/rawdb: utilize AncientRange when initiating from freezer --- core/rawdb/chain_iterator.go | 51 ++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/core/rawdb/chain_iterator.go b/core/rawdb/chain_iterator.go index ad222005be8d5..dbf5181be28a9 100644 --- a/core/rawdb/chain_iterator.go +++ b/core/rawdb/chain_iterator.go @@ -44,24 +44,29 @@ func InitDatabaseFromFreezer(db ethdb.Database) { logged = start.Add(-7 * time.Second) // Unindex during import is fast, don't double log hash common.Hash ) - for i := uint64(0); i < frozen; i++ { - // Since the freezer has all data in sequential order on a file, - // it would be 'neat' to read more data in one go, and let the - // freezerdb return N items (e.g up to 1000 items per go) - // That would require an API change in Ancients though - if h, err := db.Ancient(freezerHashTable, i); err != nil { + for i := uint64(0); i < frozen; { + // We read 100K hashes at a time, for a total of 3.2M + count := uint64(100_000) + if i+count > frozen { + count = frozen - i + } + data, err := db.AncientRange(freezerHashTable, i, count, 32*count) + if err != nil { log.Crit("Failed to init database from freezer", "err", err) - } else { - hash = common.BytesToHash(h) } - WriteHeaderNumber(batch, hash, i) - // If enough data was accumulated in memory or we're at the last block, dump to disk - if batch.ValueSize() > ethdb.IdealBatchSize { - if err := batch.Write(); err != nil { - log.Crit("Failed to write data to db", "err", err) + for j, h := range data { + number := i + uint64(j) + hash = common.BytesToHash(h) + WriteHeaderNumber(batch, hash, number) + // If enough data was accumulated in memory or we're at the last block, dump to disk + if batch.ValueSize() > ethdb.IdealBatchSize { + if err := batch.Write(); err != nil { + log.Crit("Failed to write data to db", "err", err) + } + batch.Reset() } - batch.Reset() } + i += uint64(len(data)) // If we've spent too much time already, notify the user of what we're doing if time.Since(logged) > 8*time.Second { log.Info("Initializing database from freezer", "total", frozen, "number", i, "hash", hash, "elapsed", common.PrettyDuration(time.Since(start))) @@ -76,6 +81,24 @@ func InitDatabaseFromFreezer(db ethdb.Database) { WriteHeadHeaderHash(db, hash) WriteHeadFastBlockHash(db, hash) log.Info("Initialized database from freezer", "blocks", frozen, "elapsed", common.PrettyDuration(time.Since(start))) + /** + Sanity check + This code should be removed before merging this PR, but it + is useful for validating that things work as expected. + */ + for i := uint64(0); i < frozen; i++ { + h, err := db.Ancient(freezerHashTable, i) + if err != nil { + log.Crit("Something bad happened", "number", i, "err", err) + } + num := ReadHeaderNumber(db, common.BytesToHash(h)) + if num == nil { + log.Crit("Missing hash->number mapping", "number", i, "err", err) + } + if *num != i { + log.Crit("Erroneous hash->number mapping", "number", i) + } + } } type blockTxHashes struct { From f6769d01759ce1396bec55360ad575876f5debd6 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Mon, 25 Oct 2021 16:30:12 +0200 Subject: [PATCH 2/2] core/rawdb: remove debug sanity check --- core/rawdb/chain_iterator.go | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/core/rawdb/chain_iterator.go b/core/rawdb/chain_iterator.go index dbf5181be28a9..daee721594e62 100644 --- a/core/rawdb/chain_iterator.go +++ b/core/rawdb/chain_iterator.go @@ -81,24 +81,6 @@ func InitDatabaseFromFreezer(db ethdb.Database) { WriteHeadHeaderHash(db, hash) WriteHeadFastBlockHash(db, hash) log.Info("Initialized database from freezer", "blocks", frozen, "elapsed", common.PrettyDuration(time.Since(start))) - /** - Sanity check - This code should be removed before merging this PR, but it - is useful for validating that things work as expected. - */ - for i := uint64(0); i < frozen; i++ { - h, err := db.Ancient(freezerHashTable, i) - if err != nil { - log.Crit("Something bad happened", "number", i, "err", err) - } - num := ReadHeaderNumber(db, common.BytesToHash(h)) - if num == nil { - log.Crit("Missing hash->number mapping", "number", i, "err", err) - } - if *num != i { - log.Crit("Erroneous hash->number mapping", "number", i) - } - } } type blockTxHashes struct {