Merge pull request #6511 from filecoin-project/refactor/itest-deadling-toggling

This commit is contained in:
raulk 2021-06-18 18:29:11 +01:00 committed by GitHub
commit 7c329d43f2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 44 additions and 64 deletions

View File

@ -3,7 +3,6 @@ package itests
import ( import (
"bytes" "bytes"
"context" "context"
"fmt"
"os" "os"
"testing" "testing"
"time" "time"
@ -22,12 +21,11 @@ import (
"github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/actors/builtin/miner"
"github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/extern/sector-storage/mock" "github.com/filecoin-project/lotus/extern/sector-storage/mock"
"github.com/filecoin-project/lotus/itests/kit" "github.com/filecoin-project/lotus/itests/kit2"
"github.com/filecoin-project/lotus/node/impl" "github.com/filecoin-project/lotus/node/impl"
miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner"
"github.com/ipfs/go-cid" "github.com/ipfs/go-cid"
cbor "github.com/ipfs/go-ipld-cbor" cbor "github.com/ipfs/go-ipld-cbor"
logging "github.com/ipfs/go-log/v2"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
@ -58,11 +56,8 @@ func TestDeadlineToggling(t *testing.T) {
if os.Getenv("LOTUS_TEST_DEADLINE_TOGGLING") != "1" { if os.Getenv("LOTUS_TEST_DEADLINE_TOGGLING") != "1" {
t.Skip("this takes a few minutes, set LOTUS_TEST_DEADLINE_TOGGLING=1 to run") t.Skip("this takes a few minutes, set LOTUS_TEST_DEADLINE_TOGGLING=1 to run")
} }
_ = logging.SetLogLevel("miner", "ERROR")
_ = logging.SetLogLevel("chainstore", "ERROR") kit2.QuietMiningLogs()
_ = logging.SetLogLevel("chain", "ERROR")
_ = logging.SetLogLevel("sub", "ERROR")
_ = logging.SetLogLevel("storageminer", "FATAL")
const sectorsC, sectorsD, sectorsB = 10, 9, 8 const sectorsC, sectorsD, sectorsB = 10, 9, 8
@ -75,21 +70,26 @@ func TestDeadlineToggling(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
defer cancel() defer cancel()
n, sn := kit.MockMinerBuilder(t, []kit.FullNodeOpts{kit.FullNodeWithNetworkUpgradeAt(network.Version12, upgradeH)}, kit.OneMiner) var (
client kit2.TestFullNode
minerA kit2.TestMiner
minerB kit2.TestMiner
minerC kit2.TestMiner
minerD kit2.TestMiner
minerE kit2.TestMiner
)
opts := []kit2.NodeOpt{kit2.ConstructorOpts(kit2.NetworkUpgradeAt(network.Version12, upgradeH))}
ens := kit2.NewEnsemble(t, kit2.MockProofs()).
FullNode(&client, opts...).
Miner(&minerA, &client, opts...).
Start().
InterconnectAll()
ens.BeginMining(blocktime)
client := n[0].FullNode.(*impl.FullNodeAPI) opts = append(opts, kit2.OwnerAddr(client.DefaultKey))
minerA := sn[0] ens.Miner(&minerB, &client, opts...).
Miner(&minerC, &client, opts...).
{ Start()
addrinfo, err := client.NetAddrsListen(ctx)
if err != nil {
t.Fatal(err)
}
if err := minerA.NetConnect(ctx, addrinfo); err != nil {
t.Fatal(err)
}
}
defaultFrom, err := client.WalletDefaultAddress(ctx) defaultFrom, err := client.WalletDefaultAddress(ctx)
require.NoError(t, err) require.NoError(t, err)
@ -99,28 +99,6 @@ func TestDeadlineToggling(t *testing.T) {
build.Clock.Sleep(time.Second) build.Clock.Sleep(time.Second)
done := make(chan struct{})
go func() {
defer close(done)
for ctx.Err() == nil {
build.Clock.Sleep(blocktime)
if err := minerA.MineOne(ctx, kit.MineNext); err != nil {
if ctx.Err() != nil {
// context was canceled, ignore the error.
return
}
t.Error(err)
}
}
}()
defer func() {
cancel()
<-done
}()
minerB := n[0].Stb(ctx, t, kit.TestSpt, defaultFrom)
minerC := n[0].Stb(ctx, t, kit.TestSpt, defaultFrom)
maddrB, err := minerB.ActorAddress(ctx) maddrB, err := minerB.ActorAddress(ctx)
require.NoError(t, err) require.NoError(t, err)
maddrC, err := minerC.ActorAddress(ctx) maddrC, err := minerC.ActorAddress(ctx)
@ -131,20 +109,20 @@ func TestDeadlineToggling(t *testing.T) {
// pledge sectors on C, go through a PP, check for power // pledge sectors on C, go through a PP, check for power
{ {
kit.PledgeSectors(t, ctx, minerC, sectorsC, 0, nil) minerC.PledgeSectors(ctx, sectorsC, 0, nil)
di, err := client.StateMinerProvingDeadline(ctx, maddrC, types.EmptyTSK) di, err := client.StateMinerProvingDeadline(ctx, maddrC, types.EmptyTSK)
require.NoError(t, err) require.NoError(t, err)
fmt.Printf("Running one proving period (miner C)\n") t.Log("Running one proving period (miner C)")
fmt.Printf("End for head.Height > %d\n", di.PeriodStart+di.WPoStProvingPeriod*2) t.Logf("End for head.Height > %d", di.PeriodStart+di.WPoStProvingPeriod*2)
for { for {
head, err := client.ChainHead(ctx) head, err := client.ChainHead(ctx)
require.NoError(t, err) require.NoError(t, err)
if head.Height() > di.PeriodStart+provingPeriod*2 { if head.Height() > di.PeriodStart+provingPeriod*2 {
fmt.Printf("Now head.Height = %d\n", head.Height()) t.Logf("Now head.Height = %d", head.Height())
break break
} }
build.Clock.Sleep(blocktime) build.Clock.Sleep(blocktime)
@ -165,7 +143,7 @@ func TestDeadlineToggling(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
if head.Height() > upgradeH+provingPeriod { if head.Height() > upgradeH+provingPeriod {
fmt.Printf("Now head.Height = %d\n", head.Height()) t.Logf("Now head.Height = %d", head.Height())
break break
} }
build.Clock.Sleep(blocktime) build.Clock.Sleep(blocktime)
@ -216,8 +194,9 @@ func TestDeadlineToggling(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
require.GreaterOrEqual(t, nv, network.Version12) require.GreaterOrEqual(t, nv, network.Version12)
minerD := n[0].Stb(ctx, t, kit.TestSpt, defaultFrom) ens.Miner(&minerD, &client, opts...).
minerE := n[0].Stb(ctx, t, kit.TestSpt, defaultFrom) Miner(&minerE, &client, opts...).
Start()
maddrD, err := minerD.ActorAddress(ctx) maddrD, err := minerD.ActorAddress(ctx)
require.NoError(t, err) require.NoError(t, err)
@ -225,7 +204,7 @@ func TestDeadlineToggling(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
// first round of miner checks // first round of miner checks
checkMiner(maddrA, types.NewInt(uint64(ssz)*kit.GenesisPreseals), true, true, types.EmptyTSK) checkMiner(maddrA, types.NewInt(uint64(ssz)*kit2.DefaultPresealsPerBootstrapMiner), true, true, types.EmptyTSK)
checkMiner(maddrC, types.NewInt(uint64(ssz)*sectorsC), true, true, types.EmptyTSK) checkMiner(maddrC, types.NewInt(uint64(ssz)*sectorsC), true, true, types.EmptyTSK)
checkMiner(maddrB, types.NewInt(0), false, false, types.EmptyTSK) checkMiner(maddrB, types.NewInt(0), false, false, types.EmptyTSK)
@ -233,10 +212,10 @@ func TestDeadlineToggling(t *testing.T) {
checkMiner(maddrE, types.NewInt(0), false, false, types.EmptyTSK) checkMiner(maddrE, types.NewInt(0), false, false, types.EmptyTSK)
// pledge sectors on minerB/minerD, stop post on minerC // pledge sectors on minerB/minerD, stop post on minerC
kit.PledgeSectors(t, ctx, minerB, sectorsB, 0, nil) minerB.PledgeSectors(ctx, sectorsB, 0, nil)
checkMiner(maddrB, types.NewInt(0), true, true, types.EmptyTSK) checkMiner(maddrB, types.NewInt(0), true, true, types.EmptyTSK)
kit.PledgeSectors(t, ctx, minerD, sectorsD, 0, nil) minerD.PledgeSectors(ctx, sectorsD, 0, nil)
checkMiner(maddrD, types.NewInt(0), true, true, types.EmptyTSK) checkMiner(maddrD, types.NewInt(0), true, true, types.EmptyTSK)
minerC.StorageMiner.(*impl.StorageMinerAPI).IStorageMgr.(*mock.SectorMgr).Fail() minerC.StorageMiner.(*impl.StorageMinerAPI).IStorageMgr.(*mock.SectorMgr).Fail()
@ -252,7 +231,7 @@ func TestDeadlineToggling(t *testing.T) {
params := &miner.SectorPreCommitInfo{ params := &miner.SectorPreCommitInfo{
Expiration: 2880 * 300, Expiration: 2880 * 300,
SectorNumber: 22, SectorNumber: 22,
SealProof: kit.TestSpt, SealProof: kit2.TestSpt,
SealedCID: cr, SealedCID: cr,
SealRandEpoch: head.Height() - 200, SealRandEpoch: head.Height() - 200,
@ -281,7 +260,7 @@ func TestDeadlineToggling(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
if head.Height() > upgradeH+provingPeriod+(provingPeriod/2) { if head.Height() > upgradeH+provingPeriod+(provingPeriod/2) {
fmt.Printf("Now head.Height = %d\n", head.Height()) t.Logf("Now head.Height = %d", head.Height())
break break
} }
build.Clock.Sleep(blocktime) build.Clock.Sleep(blocktime)
@ -295,14 +274,14 @@ func TestDeadlineToggling(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
if head.Height() > upgradeH+(provingPeriod*3) { if head.Height() > upgradeH+(provingPeriod*3) {
fmt.Printf("Now head.Height = %d\n", head.Height()) t.Logf("Now head.Height = %d", head.Height())
break break
} }
build.Clock.Sleep(blocktime) build.Clock.Sleep(blocktime)
} }
// second round of miner checks // second round of miner checks
checkMiner(maddrA, types.NewInt(uint64(ssz)*kit.GenesisPreseals), true, true, types.EmptyTSK) checkMiner(maddrA, types.NewInt(uint64(ssz)*kit2.DefaultPresealsPerBootstrapMiner), true, true, types.EmptyTSK)
checkMiner(maddrC, types.NewInt(0), true, true, types.EmptyTSK) checkMiner(maddrC, types.NewInt(0), true, true, types.EmptyTSK)
checkMiner(maddrB, types.NewInt(uint64(ssz)*sectorsB), true, true, types.EmptyTSK) checkMiner(maddrB, types.NewInt(uint64(ssz)*sectorsB), true, true, types.EmptyTSK)
checkMiner(maddrD, types.NewInt(uint64(ssz)*sectorsD), true, true, types.EmptyTSK) checkMiner(maddrD, types.NewInt(uint64(ssz)*sectorsD), true, true, types.EmptyTSK)
@ -351,7 +330,7 @@ func TestDeadlineToggling(t *testing.T) {
}, nil) }, nil)
require.NoError(t, err) require.NoError(t, err)
fmt.Println("sent termination message:", smsg.Cid()) t.Log("sent termination message:", smsg.Cid())
r, err := client.StateWaitMsg(ctx, smsg.Cid(), 2, api.LookbackNoLimit, true) r, err := client.StateWaitMsg(ctx, smsg.Cid(), 2, api.LookbackNoLimit, true)
require.NoError(t, err) require.NoError(t, err)
@ -367,13 +346,13 @@ func TestDeadlineToggling(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
if head.Height() > upgradeH+(provingPeriod*5) { if head.Height() > upgradeH+(provingPeriod*5) {
fmt.Printf("Now head.Height = %d\n", head.Height()) t.Logf("Now head.Height = %d", head.Height())
break break
} }
build.Clock.Sleep(blocktime) build.Clock.Sleep(blocktime)
} }
checkMiner(maddrA, types.NewInt(uint64(ssz)*kit.GenesisPreseals), true, true, types.EmptyTSK) checkMiner(maddrA, types.NewInt(uint64(ssz)*kit2.DefaultPresealsPerBootstrapMiner), true, true, types.EmptyTSK)
checkMiner(maddrC, types.NewInt(0), true, true, types.EmptyTSK) checkMiner(maddrC, types.NewInt(0), true, true, types.EmptyTSK)
checkMiner(maddrB, types.NewInt(0), true, true, types.EmptyTSK) checkMiner(maddrB, types.NewInt(0), true, true, types.EmptyTSK)
checkMiner(maddrD, types.NewInt(0), false, false, types.EmptyTSK) checkMiner(maddrD, types.NewInt(0), false, false, types.EmptyTSK)

View File

@ -24,7 +24,7 @@ type ensembleOpts struct {
var DefaultEnsembleOpts = ensembleOpts{ var DefaultEnsembleOpts = ensembleOpts{
pastOffset: 10000000 * time.Second, // time sufficiently in the past to trigger catch-up mining. pastOffset: 10000000 * time.Second, // time sufficiently in the past to trigger catch-up mining.
proofType: abi.RegisteredSealProof_StackedDrg2KiBV1, proofType: abi.RegisteredSealProof_StackedDrg2KiBV1_1, // default _concrete_ proof type for non-genesis miners (notice the _1).
} }
func ProofType(proofType abi.RegisteredSealProof) EnsembleOpt { func ProofType(proofType abi.RegisteredSealProof) EnsembleOpt {

View File

@ -14,6 +14,8 @@ import (
// PresealSectors option. // PresealSectors option.
const DefaultPresealsPerBootstrapMiner = 2 const DefaultPresealsPerBootstrapMiner = 2
const TestSpt = abi.RegisteredSealProof_StackedDrg2KiBV1_1
// nodeOpts is an options accumulating struct, where functional options are // nodeOpts is an options accumulating struct, where functional options are
// merged into. // merged into.
type nodeOpts struct { type nodeOpts struct {

View File

@ -87,5 +87,4 @@ func SDRUpgradeAt(calico, persian abi.ChainEpoch) node.Option {
Network: network.Version8, Network: network.Version8,
Height: persian, Height: persian,
}}) }})
} }