core: reinit chain from freezer in batches

This commit is contained in:
Péter Szilágyi 2019-05-21 14:59:52 +03:00
parent a184ab7a61
commit 71f4221fb3
No known key found for this signature in database
GPG key ID: E9AE538CEDF8293D

View file

@ -222,24 +222,30 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *par
if bc.empty() { if bc.empty() {
if frozen, err := bc.db.Ancients(); err == nil && frozen > 0 { if frozen, err := bc.db.Ancients(); err == nil && frozen > 0 {
var ( var (
batch = bc.db.NewBatch()
start = time.Now() start = time.Now()
logged time.Time logged time.Time
) )
for i := uint64(0); i < frozen; i++ { for i := uint64(0); i < frozen; i++ {
// Inject hash<->number mapping. // Retrieve the canonical hash and block for tx index
hash := rawdb.ReadCanonicalHash(bc.db, i) hash := rawdb.ReadCanonicalHash(bc.db, i)
if hash == (common.Hash{}) { if hash == (common.Hash{}) {
return nil, errors.New("broken ancient database") return nil, errors.New("broken ancient database")
} }
rawdb.WriteHeaderNumber(bc.db, hash, i)
// Inject txlookup indexes.
block := rawdb.ReadBlock(bc.db, hash, i) block := rawdb.ReadBlock(bc.db, hash, i)
if block == nil { if block == nil {
return nil, errors.New("broken ancient database") return nil, errors.New("broken ancient database")
} }
rawdb.WriteTxLookupEntries(bc.db, block) // Inject hash<->number mapping and txlookup indexes
rawdb.WriteHeaderNumber(batch, hash, i)
rawdb.WriteTxLookupEntries(batch, block)
if batch.ValueSize() > ethdb.IdealBatchSize || i == frozen-1 {
if err := batch.Write(); err != nil {
return nil, err
}
batch.Reset()
}
// If we've spent too much time already, notify the user of what we're doing // If we've spent too much time already, notify the user of what we're doing
if time.Since(logged) > 8*time.Second { if time.Since(logged) > 8*time.Second {
log.Info("Initializing chain from ancient data", "number", i, "hash", hash, "total", frozen-1, "elapsed", common.PrettyDuration(time.Since(start))) log.Info("Initializing chain from ancient data", "number", i, "hash", hash, "total", frozen-1, "elapsed", common.PrettyDuration(time.Since(start)))