erigon-pulse/cmd/state/generate/regenerate_tx_lookup.go
Alex Sharov c3e1cfdac8
Pruning for: exec, log_index, tx_lookup, history stages (#2399)
* Pruning for: exec, log_index, tx_lookup, history stages

* Pruning for: exec, log_index, tx_lookup, history stages

* Pruning for: exec, log_index, tx_lookup, history stages

* Pruning for: exec, log_index, tx_lookup, history stages

* add tvm flag

* save

* db migration for storage mode
add flag --prune=
remove flag --storage-mode=
add flag --experiments=tevm,...
rename integration set_storage_mode to set_prune

* fix

* forward move of stages must skip everything before PruneTo

* keep in db progress of prune method

* keep in db progress of prune method

* simplify logs

* simplify logs

* simplify logs

* fix test

* simplify logs

* simplify logs

* simplify logs

* simplify logs

* remove callTraceSet as dupsort
use etl transform for txlookup prune
remove some logs

* cleanup tests a bit

* print_stages and eth_sync to show prune progress

* fix print_stages

* add readme about --prune.to flag

* more docs

* add --prune.history.older and other flags support

* fix migration on empty db

* better toString

* better toString
2021-07-20 21:03:19 +01:00

59 lines
1.4 KiB
Go

package generate
import (
"context"
"os"
"os/signal"
"time"
"github.com/ledgerwatch/erigon/common/dbutils"
"github.com/ledgerwatch/erigon/eth/stagedsync"
"github.com/ledgerwatch/erigon/eth/stagedsync/stages"
"github.com/ledgerwatch/erigon/ethdb/kv"
"github.com/ledgerwatch/erigon/ethdb/prune"
"github.com/ledgerwatch/erigon/log"
)
func RegenerateTxLookup(chaindata string) error {
db := kv.MustOpen(chaindata)
defer db.Close()
tx, err := db.BeginRw(context.Background())
if err != nil {
return err
}
defer tx.Rollback()
if err := tx.ClearBucket(dbutils.TxLookupPrefix); err != nil {
return err
}
startTime := time.Now()
ch := make(chan os.Signal, 1)
quitCh := make(chan struct{})
signal.Notify(ch, os.Interrupt)
go func() {
<-ch
close(quitCh)
}()
pm, err := prune.Get(tx)
if err != nil {
return err
}
lastExecutedBlock, err := stages.GetStageProgress(tx, stages.Execution)
if err != nil {
//There could be headers without block in the end
log.Error("Cant get last executed block", "err", err)
}
log.Info("TxLookup generation started", "start time", startTime)
err = stagedsync.TxLookupTransform("txlookup", tx,
dbutils.EncodeBlockNumber(pm.TxIndex.PruneTo(lastExecutedBlock)),
dbutils.EncodeBlockNumber(lastExecutedBlock+1),
quitCh,
stagedsync.StageTxLookupCfg(db, pm, os.TempDir()))
if err != nil {
return err
}
log.Info("TxLookup index is successfully regenerated", "it took", time.Since(startTime))
return nil
}