Make pre-migration optional
This commit is contained in:
parent
cde4b804e3
commit
62fedfbce3
@ -1355,7 +1355,7 @@ func ComputeStateHTMLTempl(w io.Writer, ts *types.TipSet, o *api.ComputeStateOut
|
|||||||
"IsSlow": isSlow,
|
"IsSlow": isSlow,
|
||||||
"IsVerySlow": isVerySlow,
|
"IsVerySlow": isVerySlow,
|
||||||
"IntExit": func(i exitcode.ExitCode) int64 { return int64(i) },
|
"IntExit": func(i exitcode.ExitCode) int64 { return int64(i) },
|
||||||
"SumGas": sumGas,
|
"SumGas": SumGas,
|
||||||
"CodeStr": codeStr,
|
"CodeStr": codeStr,
|
||||||
"Call": call,
|
"Call": call,
|
||||||
"PrintTiming": func() bool { return printTiming },
|
"PrintTiming": func() bool { return printTiming },
|
||||||
@ -1423,7 +1423,7 @@ func isVerySlow(t time.Duration) bool {
|
|||||||
return t > 50*time.Millisecond
|
return t > 50*time.Millisecond
|
||||||
}
|
}
|
||||||
|
|
||||||
func sumGas(changes []*types.GasTrace) types.GasTrace {
|
func SumGas(changes []*types.GasTrace) types.GasTrace {
|
||||||
var out types.GasTrace
|
var out types.GasTrace
|
||||||
for _, gc := range changes {
|
for _, gc := range changes {
|
||||||
out.TotalGas += gc.TotalGas
|
out.TotalGas += gc.TotalGas
|
||||||
|
@ -8,14 +8,13 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"text/tabwriter"
|
"text/tabwriter"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-state-types/abi"
|
|
||||||
|
|
||||||
"github.com/filecoin-project/go-state-types/network"
|
|
||||||
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/go-state-types/abi"
|
||||||
|
"github.com/filecoin-project/go-state-types/network"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/build"
|
"github.com/filecoin-project/lotus/build"
|
||||||
"github.com/filecoin-project/lotus/chain/beacon"
|
"github.com/filecoin-project/lotus/chain/beacon"
|
||||||
"github.com/filecoin-project/lotus/chain/beacon/drand"
|
"github.com/filecoin-project/lotus/chain/beacon/drand"
|
||||||
@ -29,9 +28,15 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/storage/sealer/ffiwrapper"
|
"github.com/filecoin-project/lotus/storage/sealer/ffiwrapper"
|
||||||
)
|
)
|
||||||
|
|
||||||
var gasEstimationCmd = &cli.Command{
|
// USAGE: Sync a node, then call migrate-nv17 on some old state. Pass in the cid of the migrated state root,
|
||||||
Name: "estimate-gas",
|
// the epoch you migrated at, the network version you migrated to, and a message hash. You will be able to replay any
|
||||||
Description: "replay a message on the specified stateRoot and network version",
|
// message from between the migration epoch, and where your node originally synced to. Note: You may run into issues
|
||||||
|
// with nonces, or state that changed between the epoch you migrated at, and when the message was originally processed.
|
||||||
|
// This can be avoided by replaying messages from close to the migration epoch, or circumvented by using a custom
|
||||||
|
// FVM bundle.
|
||||||
|
var gasTraceCmd = &cli.Command{
|
||||||
|
Name: "trace-gas",
|
||||||
|
Description: "replay a message on the specified stateRoot and network version to get an execution trace",
|
||||||
ArgsUsage: "[migratedStateRootCid migrationEpoch networkVersion messageHash]",
|
ArgsUsage: "[migratedStateRootCid migrationEpoch networkVersion messageHash]",
|
||||||
Flags: []cli.Flag{
|
Flags: []cli.Flag{
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
@ -56,7 +61,7 @@ var gasEstimationCmd = &cli.Command{
|
|||||||
return fmt.Errorf("failed to parse input: %w", err)
|
return fmt.Errorf("failed to parse input: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
nv, err := strconv.ParseInt(cctx.Args().Get(2), 10, 64)
|
nv, err := strconv.ParseInt(cctx.Args().Get(2), 10, 32)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to parse input: %w", err)
|
return fmt.Errorf("failed to parse input: %w", err)
|
||||||
}
|
}
|
||||||
@ -131,11 +136,12 @@ var gasEstimationCmd = &cli.Command{
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tw := tabwriter.NewWriter(os.Stdout, 2, 2, 2, ' ', 0)
|
tw := tabwriter.NewWriter(os.Stdout, 8, 2, 2, ' ', tabwriter.AlignRight)
|
||||||
res, err := sm.CallAtStateAndVersion(ctx, msg, executionTs, stateRootCid, network.Version(nv))
|
res, err := sm.CallAtStateAndVersion(ctx, msg, executionTs, stateRootCid, network.Version(nv))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
fmt.Println("Total gas used ", res.MsgRct.GasUsed)
|
||||||
printInternalExecutions(0, []types.ExecutionTrace{res.ExecutionTrace}, tw)
|
printInternalExecutions(0, []types.ExecutionTrace{res.ExecutionTrace}, tw)
|
||||||
|
|
||||||
return tw.Flush()
|
return tw.Flush()
|
||||||
@ -144,10 +150,29 @@ var gasEstimationCmd = &cli.Command{
|
|||||||
|
|
||||||
func printInternalExecutions(depth int, trace []types.ExecutionTrace, tw *tabwriter.Writer) {
|
func printInternalExecutions(depth int, trace []types.ExecutionTrace, tw *tabwriter.Writer) {
|
||||||
if depth == 0 {
|
if depth == 0 {
|
||||||
_, _ = fmt.Fprintf(tw, "depth\tFrom\tTo\tValue\tMethod\tGasUsed\tExitCode\tReturn\n")
|
_, _ = fmt.Fprintf(tw, "Depth\tFrom\tTo\tMethod\tTotalGas\tComputeGas\tStorageGas\t\tExitCode\n")
|
||||||
}
|
}
|
||||||
for _, im := range trace {
|
for _, im := range trace {
|
||||||
_, _ = fmt.Fprintf(tw, "%d\t%s\t%s\t%s\t%d\t%d\t%d\t%x\n", depth, im.Msg.From, im.Msg.To, im.Msg.Value, im.Msg.Method, im.MsgRct.GasUsed, im.MsgRct.ExitCode, im.MsgRct.Return)
|
sumGas := lcli.SumGas(im.GasCharges)
|
||||||
|
_, _ = fmt.Fprintf(tw, "%d\t%s\t%s\t%d\t%d\t%d\t%d\t\t%d\n", depth, truncateString(im.Msg.From.String(), 10), truncateString(im.Msg.To.String(), 10), im.Msg.Method, sumGas.TotalGas, sumGas.ComputeGas, sumGas.StorageGas, im.MsgRct.ExitCode)
|
||||||
printInternalExecutions(depth+1, im.Subcalls, tw)
|
printInternalExecutions(depth+1, im.Subcalls, tw)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func truncateString(str string, length int) string {
|
||||||
|
if len(str) <= length {
|
||||||
|
return str
|
||||||
|
}
|
||||||
|
|
||||||
|
truncated := ""
|
||||||
|
count := 0
|
||||||
|
for _, char := range str {
|
||||||
|
truncated += string(char)
|
||||||
|
count++
|
||||||
|
if count >= length {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
truncated += "..."
|
||||||
|
return truncated
|
||||||
|
}
|
||||||
|
@ -76,7 +76,7 @@ func main() {
|
|||||||
msigCmd,
|
msigCmd,
|
||||||
fip36PollCmd,
|
fip36PollCmd,
|
||||||
invariantsCmd,
|
invariantsCmd,
|
||||||
gasEstimationCmd,
|
gasTraceCmd,
|
||||||
}
|
}
|
||||||
|
|
||||||
app := &cli.App{
|
app := &cli.App{
|
||||||
|
@ -53,6 +53,9 @@ var migrationsCmd = &cli.Command{
|
|||||||
Name: "repo",
|
Name: "repo",
|
||||||
Value: "~/.lotus",
|
Value: "~/.lotus",
|
||||||
},
|
},
|
||||||
|
&cli.BoolFlag{
|
||||||
|
Name: "skip-pre-migration",
|
||||||
|
},
|
||||||
&cli.BoolFlag{
|
&cli.BoolFlag{
|
||||||
Name: "check-invariants",
|
Name: "check-invariants",
|
||||||
},
|
},
|
||||||
@ -119,45 +122,8 @@ var migrationsCmd = &cli.Command{
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
ts1, err := cs.GetTipsetByHeight(ctx, blk.Height-240, migrationTs, false)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
startTime := time.Now()
|
startTime := time.Now()
|
||||||
|
|
||||||
err = filcns.PreUpgradeActorsV9(ctx, sm, cache, ts1.ParentState(), ts1.Height()-1, ts1)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
preMigration1Time := time.Since(startTime)
|
|
||||||
|
|
||||||
ts2, err := cs.GetTipsetByHeight(ctx, blk.Height-15, migrationTs, false)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
startTime = time.Now()
|
|
||||||
|
|
||||||
err = filcns.PreUpgradeActorsV9(ctx, sm, cache, ts2.ParentState(), ts2.Height()-1, ts2)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
preMigration2Time := time.Since(startTime)
|
|
||||||
|
|
||||||
startTime = time.Now()
|
|
||||||
|
|
||||||
newCid1, err := filcns.UpgradeActorsV9(ctx, sm, cache, nil, blk.ParentStateRoot, blk.Height-1, migrationTs)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
cachedMigrationTime := time.Since(startTime)
|
|
||||||
|
|
||||||
startTime = time.Now()
|
|
||||||
|
|
||||||
newCid2, err := filcns.UpgradeActorsV9(ctx, sm, nv15.NewMemMigrationCache(), nil, blk.ParentStateRoot, blk.Height-1, migrationTs)
|
newCid2, err := filcns.UpgradeActorsV9(ctx, sm, nv15.NewMemMigrationCache(), nil, blk.ParentStateRoot, blk.Height-1, migrationTs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -165,18 +131,58 @@ var migrationsCmd = &cli.Command{
|
|||||||
|
|
||||||
uncachedMigrationTime := time.Since(startTime)
|
uncachedMigrationTime := time.Since(startTime)
|
||||||
|
|
||||||
if newCid1 != newCid2 {
|
|
||||||
return xerrors.Errorf("got different results with and without the cache: %s, %s", newCid1,
|
|
||||||
newCid2)
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Println("migration height ", blk.Height-1)
|
fmt.Println("migration height ", blk.Height-1)
|
||||||
|
fmt.Println("old cid ", blk.ParentStateRoot)
|
||||||
fmt.Println("new cid ", newCid2)
|
fmt.Println("new cid ", newCid2)
|
||||||
fmt.Println("completed premigration 1, took ", preMigration1Time)
|
|
||||||
fmt.Println("completed premigration 2, took ", preMigration2Time)
|
|
||||||
fmt.Println("completed round actual (with cache), took ", cachedMigrationTime)
|
|
||||||
fmt.Println("completed round actual (without cache), took ", uncachedMigrationTime)
|
fmt.Println("completed round actual (without cache), took ", uncachedMigrationTime)
|
||||||
|
|
||||||
|
if !cctx.IsSet("skip-pre-migration") {
|
||||||
|
startTime = time.Now()
|
||||||
|
|
||||||
|
ts1, err := cs.GetTipsetByHeight(ctx, blk.Height-240, migrationTs, false)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = filcns.PreUpgradeActorsV9(ctx, sm, cache, ts1.ParentState(), ts1.Height()-1, ts1)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
preMigration1Time := time.Since(startTime)
|
||||||
|
|
||||||
|
ts2, err := cs.GetTipsetByHeight(ctx, blk.Height-15, migrationTs, false)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
startTime = time.Now()
|
||||||
|
|
||||||
|
err = filcns.PreUpgradeActorsV9(ctx, sm, cache, ts2.ParentState(), ts2.Height()-1, ts2)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
preMigration2Time := time.Since(startTime)
|
||||||
|
|
||||||
|
startTime = time.Now()
|
||||||
|
|
||||||
|
newCid1, err := filcns.UpgradeActorsV9(ctx, sm, cache, nil, blk.ParentStateRoot, blk.Height-1, migrationTs)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
cachedMigrationTime := time.Since(startTime)
|
||||||
|
|
||||||
|
if newCid1 != newCid2 {
|
||||||
|
return xerrors.Errorf("got different results with and without the cache: %s, %s", newCid1,
|
||||||
|
newCid2)
|
||||||
|
}
|
||||||
|
fmt.Println("completed premigration 1, took ", preMigration1Time)
|
||||||
|
fmt.Println("completed premigration 2, took ", preMigration2Time)
|
||||||
|
fmt.Println("completed round actual (with cache), took ", cachedMigrationTime)
|
||||||
|
}
|
||||||
|
|
||||||
if cctx.Bool("check-invariants") {
|
if cctx.Bool("check-invariants") {
|
||||||
err = checkMigrationInvariants(ctx, blk.ParentStateRoot, newCid2, bs, blk.Height-1)
|
err = checkMigrationInvariants(ctx, blk.ParentStateRoot, newCid2, bs, blk.Height-1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user