From 04f32ba119913584525f0e91b161734b74d1991e Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Fri, 21 Oct 2022 08:54:55 -0400 Subject: [PATCH 1/3] Add invariant checks to migration --- cmd/lotus-shed/migrations.go | 39 ++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/cmd/lotus-shed/migrations.go b/cmd/lotus-shed/migrations.go index 311823cbb64..9b09c23db46 100644 --- a/cmd/lotus-shed/migrations.go +++ b/cmd/lotus-shed/migrations.go @@ -18,6 +18,7 @@ import ( "github.com/filecoin-project/go-state-types/builtin" market8 "github.com/filecoin-project/go-state-types/builtin/v8/market" adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" + v9 "github.com/filecoin-project/go-state-types/builtin/v9" market9 "github.com/filecoin-project/go-state-types/builtin/v9/market" miner9 "github.com/filecoin-project/go-state-types/builtin/v9/miner" adt9 "github.com/filecoin-project/go-state-types/builtin/v9/util/adt" @@ -216,25 +217,25 @@ func checkMigrationInvariants(ctx context.Context, v8StateRoot cid.Cid, v9StateR } // Load the state root. - //var stateRoot types.StateRoot - //if err := actorStore.Get(ctx, v9StateRoot, &stateRoot); err != nil { - // return xerrors.Errorf("failed to decode state root: %w", err) - //} - // - //actorCodeCids, err := actors.GetActorCodeIDs(actorstypes.Version9) - //if err != nil { - // return err - //} - // - //actorTree, err := builtin.LoadTree(actorStore, stateRoot.Actors) - //messages, err := v9.CheckStateInvariants(actorTree, epoch, actorCodeCids) - //if err != nil { - // return xerrors.Errorf("checking state invariants: %w", err) - //} - // - //for _, message := range messages.Messages() { - // fmt.Println("got the following error: ", message) - //} + var stateRoot types.StateRoot + if err := actorStore.Get(ctx, v9StateRoot, &stateRoot); err != nil { + return xerrors.Errorf("failed to decode state root: %w", err) + } + + actorCodeCids, err := actors.GetActorCodeIDs(actorstypes.Version9) + if err != nil { + return err + } + + actorTree, err := builtin.LoadTree(actorStore, stateRoot.Actors) + messages, err := v9.CheckStateInvariants(actorTree, epoch, actorCodeCids) + if err != nil { + return xerrors.Errorf("checking state invariants: %w", err) + } + + for _, message := range messages.Messages() { + fmt.Println("got the following error: ", message) + } fmt.Println("completed invariant checks, took ", time.Since(startTime)) From 394c3b6deb0636805c8058c897210837981411bc Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Sat, 22 Oct 2022 13:06:01 -0400 Subject: [PATCH 2/3] fix invariant check: number of entries in datacap actor should include verifreg --- cmd/lotus-shed/migrations.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd/lotus-shed/migrations.go b/cmd/lotus-shed/migrations.go index 9b09c23db46..c6e9f924192 100644 --- a/cmd/lotus-shed/migrations.go +++ b/cmd/lotus-shed/migrations.go @@ -253,7 +253,8 @@ func checkDatacaps(stateTreeV8 *state.StateTree, stateTreeV9 *state.StateTree, a return err } - if len(verifregDatacaps) != len(newDatacaps) { + // Should have all the v8 datacaps, plus the verifreg actor itself + if len(verifregDatacaps)+1 != len(newDatacaps) { return xerrors.Errorf("size of datacap maps do not match. verifreg: %d, datacap: %d", len(verifregDatacaps), len(newDatacaps)) } From 65f89ff128cb316b9e09735ed6536537c6f91849 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 24 Oct 2022 13:47:47 -0400 Subject: [PATCH 3/3] Invariant checks: Only include not-activated deals --- cmd/lotus-shed/migrations.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/cmd/lotus-shed/migrations.go b/cmd/lotus-shed/migrations.go index c6e9f924192..fd62da58939 100644 --- a/cmd/lotus-shed/migrations.go +++ b/cmd/lotus-shed/migrations.go @@ -343,6 +343,12 @@ func checkPendingVerifiedDeals(stateTreeV8 *state.StateTree, stateTreeV9 *state. return xerrors.Errorf("failed to get proposals: %w", err) } + // We only want those pending deals that haven't been activated -- an activated deal has an entry in dealStates8 + dealStates8, err := adt9.AsArray(actorStore, marketStateV8.States, market8.StatesAmtBitwidth) + if err != nil { + return xerrors.Errorf("failed to load v8 states array: %w", err) + } + var numPendingVerifiedDeals = 0 var proposal market8.DealProposal err = dealProposalsV8.ForEach(&proposal, func(dealID int64) error { @@ -366,6 +372,17 @@ func checkPendingVerifiedDeals(stateTreeV8 *state.StateTree, stateTreeV9 *state. return nil } + var _dealState8 market8.DealState + found, err := dealStates8.Get(uint64(dealID), &_dealState8) + if err != nil { + return xerrors.Errorf("failed to lookup deal state: %w", err) + } + + // the deal has an entry in deal states, which means it's already been allocated, nothing to do + if found { + return nil + } + numPendingVerifiedDeals++ // Checks if allocation ID is in market map allocationId, err := marketActorV9.GetAllocationIdForPendingDeal(abi.DealID(dealID))