Skip to content
This repository has been archived by the owner on Jun 6, 2023. It is now read-only.

Commit

Permalink
More test fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
Stebalien committed Aug 13, 2020
1 parent 11a2753 commit 075f5eb
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 32 deletions.
15 changes: 14 additions & 1 deletion actors/builtin/miner/deadline_state_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -636,6 +636,7 @@ type expectedDeadlineState struct {
faults bitfield.BitField
recovering bitfield.BitField
terminations bitfield.BitField
unproven bitfield.BitField
posts bitfield.BitField

partitionSectors []bitfield.BitField
Expand Down Expand Up @@ -665,6 +666,12 @@ func (s expectedDeadlineState) withTerminations(terminations ...uint64) expected
return s
}

//nolint:unused
func (s expectedDeadlineState) withUnproven(unproven ...uint64) expectedDeadlineState {
s.unproven = bf(unproven...)
return s
}

//nolint:unused
func (s expectedDeadlineState) withPosts(posts ...uint64) expectedDeadlineState {
s.posts = bf(posts...)
Expand All @@ -679,13 +686,14 @@ func (s expectedDeadlineState) withPartitions(partitions ...bitfield.BitField) e

// Assert that the deadline's state matches the expected state.
func (s expectedDeadlineState) assert(t *testing.T, store adt.Store, dl *miner.Deadline) {
_, faults, recoveries, terminations, partitions := checkDeadlineInvariants(
_, faults, recoveries, terminations, unproven, partitions := checkDeadlineInvariants(
t, store, dl, s.quant, s.sectorSize, s.partitionSize, s.sectors,
)

assertBitfieldsEqual(t, s.faults, faults)
assertBitfieldsEqual(t, s.recovering, recoveries)
assertBitfieldsEqual(t, s.terminations, terminations)
assertBitfieldsEqual(t, s.unproven, unproven)
assertBitfieldsEqual(t, s.posts, dl.PostSubmissions)

require.Equal(t, len(s.partitionSectors), len(partitions), "unexpected number of partitions")
Expand All @@ -706,6 +714,7 @@ func checkDeadlineInvariants(
allFaults bitfield.BitField,
allRecoveries bitfield.BitField,
allTerminations bitfield.BitField,
allUnproven bitfield.BitField,
partitionSectors []bitfield.BitField,
) {
partitions, err := dl.PartitionsArray(store)
Expand All @@ -718,6 +727,7 @@ func checkDeadlineInvariants(
allFaults = bitfield.NewFromSet(nil)
allRecoveries = bitfield.NewFromSet(nil)
allTerminations = bitfield.NewFromSet(nil)
allUnproven = bitfield.NewFromSet(nil)
allFaultyPower := miner.NewPowerPairZero()

expectPartIndex := int64(0)
Expand Down Expand Up @@ -745,6 +755,9 @@ func checkDeadlineInvariants(
allTerminations, err = bitfield.MergeBitFields(allTerminations, partition.Terminated)
require.NoError(t, err)

allUnproven, err = bitfield.MergeBitFields(allUnproven, partition.Unproven)
require.NoError(t, err)

allFaultyPower = allFaultyPower.Add(partition.FaultyPower)

// 1. This will check things like "recoveries is a subset of
Expand Down
9 changes: 8 additions & 1 deletion actors/builtin/miner/miner_state_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -648,7 +648,8 @@ func TestSectorAssignment(t *testing.T) {

newPower, err := harness.s.AssignSectorsToDeadlines(harness.store, 0, sectorInfos, partitionSectors, sectorSize)
require.NoError(t, err)
require.True(t, newPower.Equals(miner.PowerForSectors(sectorSize, sectorInfos)))
require.True(t, newPower.IsZero())
//require.True(t, newPower.Equals(miner.PowerForSectors(sectorSize, sectorInfos)))

dls, err := harness.s.LoadDeadlines(harness.store)
require.NoError(t, err)
Expand All @@ -667,7 +668,13 @@ func TestSectorAssignment(t *testing.T) {
bf := seq(t, start, partitionSectors)
partitions = append(partitions, bf)
}
allSectorBf, err := bitfield.MultiMerge(partitions...)
require.NoError(t, err)
allSectorNos, err := allSectorBf.All(uint64(noSectors))
require.NoError(t, err)

dlState.withQuantSpec(quantSpec).
withUnproven(allSectorNos...).
withPartitions(partitions...).
assert(t, harness.store, dl)

Expand Down
56 changes: 45 additions & 11 deletions actors/builtin/miner/miner_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2806,13 +2806,13 @@ func (h *actorHarness) confirmSectorProofsValid(rt *mock.Runtime, conf proveComm
}
}

if !expectRawPower.IsZero() || !expectQAPower.IsZero() {
pcParams := power.UpdateClaimedPowerParams{
RawByteDelta: expectRawPower,
QualityAdjustedDelta: expectQAPower,
}
rt.ExpectSend(builtin.StoragePowerActorAddr, builtin.MethodsPower.UpdateClaimedPower, &pcParams, big.Zero(), nil, exitcode.Ok)
}
//if !expectRawPower.IsZero() || !expectQAPower.IsZero() {
// pcParams := power.UpdateClaimedPowerParams{
// RawByteDelta: expectRawPower,
// QualityAdjustedDelta: expectQAPower,
// }
// rt.ExpectSend(builtin.StoragePowerActorAddr, builtin.MethodsPower.UpdateClaimedPower, &pcParams, big.Zero(), nil, exitcode.Ok)
//}
if !expectPledge.IsZero() {
rt.ExpectSend(builtin.StoragePowerActorAddr, builtin.MethodsPower.UpdatePledgeTotal, &expectPledge, big.Zero(), nil, exitcode.Ok)
}
Expand Down Expand Up @@ -3375,12 +3375,46 @@ func advanceAndSubmitPoSts(rt *mock.Runtime, h *actorHarness, sectors ...*miner.
for len(deadlines) > 0 {
dlSectors, ok := deadlines[dlinfo.Index]
if ok {
partitions := []miner.PoStPartition{}
sectorNos := bitfield.New()
for _, sector := range dlSectors {
_, pIdx, err := st.FindSector(rt.AdtStore(), sector.SectorNumber)
require.NoError(h.t, err)
partitions = append(partitions, miner.PoStPartition{Index: pIdx, Skipped: bitfield.New()})
sectorNos.Set(uint64(sector.SectorNumber))
}

dlArr, err := st.LoadDeadlines(rt.AdtStore())
require.NoError(h.t, err)
dl, err := dlArr.LoadDeadline(rt.AdtStore(), dlinfo.Index)
require.NoError(h.t, err)
parts, err := dl.PartitionsArray(rt.AdtStore())
require.NoError(h.t, err)

var partition miner.Partition
partitions := []miner.PoStPartition{}
require.NoError(h.t, parts.ForEach(&partition, func(partIdx int64) error {
live, err := partition.LiveSectors()
require.NoError(h.t, err)
toProve, err := bitfield.IntersectBitField(live, sectorNos)
require.NoError(h.t, err)
noProven, err := toProve.IsEmpty()
require.NoError(h.t, err)
if noProven {
// not proving anything in this partition.
return nil
}

toSkip, err := bitfield.SubtractBitField(live, toProve)
require.NoError(h.t, err)

notRecovering, err := bitfield.SubtractBitField(partition.Faults, partition.Recoveries)
require.NoError(h.t, err)

// Don't double-count skips.
toSkip, err = bitfield.SubtractBitField(toSkip, notRecovering)
require.NoError(h.t, err)

partitions = append(partitions, miner.PoStPartition{Index: uint64(partIdx), Skipped: toSkip})
return nil
}))

h.submitWindowPoSt(rt, dlinfo, partitions, dlSectors, nil)
delete(deadlines, dlinfo.Index)
}
Expand Down
43 changes: 24 additions & 19 deletions actors/builtin/miner/partition_state_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,12 @@ func TestPartitions(t *testing.T) {
store := ipld.NewADTStore(context.Background())
partition := emptyPartition(t, store)

// TODO: test unproven
power, err := partition.AddSectors(store, false, sectors, sectorSize, quantSpec)
require.NoError(t, err)
assert.True(t, power.IsZero())

power = partition.ActivateUnproven()
expectedPower := miner.PowerForSectors(sectorSize, sectors)
assert.True(t, expectedPower.Equals(power))

Expand All @@ -45,7 +48,7 @@ func TestPartitions(t *testing.T) {
t.Run("adds sectors and reports sector stats", func(t *testing.T) {
store, partition := setup(t)

assertPartitionState(t, store, partition, quantSpec, sectorSize, sectors, bf(1, 2, 3, 4, 5, 6), bf(), bf(), bf())
assertPartitionState(t, store, partition, quantSpec, sectorSize, sectors, bf(1, 2, 3, 4, 5, 6), bf(), bf(), bf(), bf())

// assert sectors have been arranged into 3 groups
assertPartitionExpirationQueue(t, store, partition, quantSpec, []expectExpirationGroup{
Expand All @@ -72,9 +75,9 @@ func TestPartitions(t *testing.T) {

expectedFaultyPower := miner.PowerForSectors(sectorSize, selectSectors(t, sectors, faultSet))
assert.True(t, expectedFaultyPower.Equals(newFaultyPower))
assert.True(t, powerDelta.Equals(miner.NewPowerPairZero())) // not yet active, so there's no power delta.
assert.True(t, powerDelta.Equals(expectedFaultyPower.Neg()))

assertPartitionState(t, store, partition, quantSpec, sectorSize, sectors, bf(1, 2, 3, 4, 5, 6), bf(4, 5), bf(), bf())
assertPartitionState(t, store, partition, quantSpec, sectorSize, sectors, bf(1, 2, 3, 4, 5, 6), bf(4, 5), bf(), bf(), bf())

// moves faulty sectors after expiration to earlier group
assertPartitionExpirationQueue(t, store, partition, quantSpec, []expectExpirationGroup{
Expand Down Expand Up @@ -104,7 +107,7 @@ func TestPartitions(t *testing.T) {
expectedFaultyPower = miner.PowerForSectors(sectorSize, selectSectors(t, sectors, bf(6)))
assert.True(t, expectedFaultyPower.Equals(newFaultyPower))

assertPartitionState(t, store, partition, quantSpec, sectorSize, sectors, bf(1, 2, 3, 4, 5, 6), bf(4, 5, 6), bf(), bf())
assertPartitionState(t, store, partition, quantSpec, sectorSize, sectors, bf(1, 2, 3, 4, 5, 6), bf(4, 5, 6), bf(), bf(), bf())

// moves newly-faulty sector
assertPartitionExpirationQueue(t, store, partition, quantSpec, []expectExpirationGroup{
Expand Down Expand Up @@ -137,7 +140,7 @@ func TestPartitions(t *testing.T) {
err = partition.DeclareFaultsRecovered(sectorArr, sectorSize, recoverSet)
require.NoError(t, err)

assertPartitionState(t, store, partition, quantSpec, sectorSize, sectors, bf(1, 2, 3, 4, 5, 6), bf(4, 5, 6), bf(4, 5), bf())
assertPartitionState(t, store, partition, quantSpec, sectorSize, sectors, bf(1, 2, 3, 4, 5, 6), bf(4, 5, 6), bf(4, 5), bf(), bf())
})

t.Run("remove recoveries", func(t *testing.T) {
Expand All @@ -159,14 +162,14 @@ func TestPartitions(t *testing.T) {
require.NoError(t, err)
assertBitfieldEmpty(t, newFaults) // no new faults.

assertPartitionState(t, store, partition, quantSpec, sectorSize, sectors, bf(1, 2, 3, 4, 5, 6), bf(4, 5, 6), bf(4, 5), bf())
assertPartitionState(t, store, partition, quantSpec, sectorSize, sectors, bf(1, 2, 3, 4, 5, 6), bf(4, 5, 6), bf(4, 5), bf(), bf())

// removing sector 5 alters recovery set and recovery power
newFaults, _, _, err = partition.DeclareFaults(store, sectorArr, bf(5), abi.ChainEpoch(10), sectorSize, quantSpec)
require.NoError(t, err)
assertBitfieldEmpty(t, newFaults) // these faults aren't new.

assertPartitionState(t, store, partition, quantSpec, sectorSize, sectors, bf(1, 2, 3, 4, 5, 6), bf(4, 5, 6), bf(4), bf())
assertPartitionState(t, store, partition, quantSpec, sectorSize, sectors, bf(1, 2, 3, 4, 5, 6), bf(4, 5, 6), bf(4), bf(), bf())
})

t.Run("recovers faults", func(t *testing.T) {
Expand All @@ -192,7 +195,7 @@ func TestPartitions(t *testing.T) {
assert.True(t, recoveryPower.Equals(recoveredPower))

// state should be as if recovered sectors were never faults
assertPartitionState(t, store, partition, quantSpec, sectorSize, sectors, bf(1, 2, 3, 4, 5, 6), bf(6), bf(), bf())
assertPartitionState(t, store, partition, quantSpec, sectorSize, sectors, bf(1, 2, 3, 4, 5, 6), bf(6), bf(), bf(), bf())

// restores recovered expirations to original state (unrecovered sector 6 still expires early)
assertPartitionExpirationQueue(t, store, partition, quantSpec, []expectExpirationGroup{
Expand Down Expand Up @@ -221,7 +224,7 @@ func TestPartitions(t *testing.T) {
require.NoError(t, err)
assert.True(t, partition.RecoveringPower.Equals(recoveringPower))

assertPartitionState(t, store, partition, quantSpec, sectorSize, sectors, bf(1, 2, 3, 4, 5, 6), bf(4, 5, 6), bf(4, 5, 6), bf())
assertPartitionState(t, store, partition, quantSpec, sectorSize, sectors, bf(1, 2, 3, 4, 5, 6), bf(4, 5, 6), bf(4, 5, 6), bf(), bf())
})

t.Run("missing sectors are not recovered", func(t *testing.T) {
Expand Down Expand Up @@ -259,7 +262,7 @@ func TestPartitions(t *testing.T) {
rescheduled := rescheduleSectors(t, 18, sectors, bf(4, 6))

// partition power and sector categorization should remain the same
assertPartitionState(t, store, partition, quantSpec, sectorSize, rescheduled, bf(1, 2, 3, 4, 5, 6), bf(2), bf(), bf())
assertPartitionState(t, store, partition, quantSpec, sectorSize, rescheduled, bf(1, 2, 3, 4, 5, 6), bf(2), bf(), bf(), bf())

// sectors should move to new expiration group
assertPartitionExpirationQueue(t, store, partition, quantSpec, []expectExpirationGroup{
Expand Down Expand Up @@ -297,7 +300,7 @@ func TestPartitions(t *testing.T) {
// partition state should contain new sectors and not old sectors
allSectors := append(newSectors, sectors[:1]...)
allSectors = append(allSectors, sectors[4:]...)
assertPartitionState(t, store, partition, quantSpec, sectorSize, allSectors, bf(1, 2, 5, 6, 7, 8), bf(), bf(), bf())
assertPartitionState(t, store, partition, quantSpec, sectorSize, allSectors, bf(1, 2, 5, 6, 7, 8), bf(), bf(), bf(), bf())

// sector 2 should be moved, 3 and 4 should be removed, and 7 and 8 added
assertPartitionExpirationQueue(t, store, partition, quantSpec, []expectExpirationGroup{
Expand Down Expand Up @@ -355,7 +358,7 @@ func TestPartitions(t *testing.T) {
assert.True(t, expectedFaultyPower.Equals(removed.FaultyPower))

// expect partition state to no longer reflect power and pledge from terminated sectors and terminations to contain new sectors
assertPartitionState(t, store, partition, quantSpec, sectorSize, sectors, bf(1, 2, 3, 4, 5, 6), bf(4, 6), bf(4), terminations)
assertPartitionState(t, store, partition, quantSpec, sectorSize, sectors, bf(1, 2, 3, 4, 5, 6), bf(4, 6), bf(4), terminations, bf())

// sectors should move to new expiration group
assertPartitionExpirationQueue(t, store, partition, quantSpec, []expectExpirationGroup{
Expand Down Expand Up @@ -448,7 +451,7 @@ func TestPartitions(t *testing.T) {
assert.True(t, expset.FaultyPower.Equals(miner.PowerForSectors(sectorSize, sectors[3:4])))

// expect sectors to be moved to terminations
assertPartitionState(t, store, partition, quantSpec, sectorSize, sectors, bf(1, 2, 3, 4, 5, 6), bf(), bf(), bf(1, 2, 4))
assertPartitionState(t, store, partition, quantSpec, sectorSize, sectors, bf(1, 2, 3, 4, 5, 6), bf(), bf(), bf(1, 2, 4), bf())

// sectors should move to new expiration group
assertPartitionExpirationQueue(t, store, partition, quantSpec, []expectExpirationGroup{
Expand Down Expand Up @@ -509,7 +512,7 @@ func TestPartitions(t *testing.T) {
assert.True(t, expectedFailedRecoveryPower.Equals(failedRecoveryPower))

// everything is now faulty
assertPartitionState(t, store, partition, quantSpec, sectorSize, sectors, bf(1, 2, 3, 4, 5, 6), bf(1, 2, 3, 4, 5, 6), bf(), bf())
assertPartitionState(t, store, partition, quantSpec, sectorSize, sectors, bf(1, 2, 3, 4, 5, 6), bf(1, 2, 3, 4, 5, 6), bf(), bf(), bf())

// everything not in first expiration group is now in second because fault expiration quantized to 9
assertPartitionExpirationQueue(t, store, partition, quantSpec, []expectExpirationGroup{
Expand Down Expand Up @@ -595,13 +598,12 @@ func TestPartitions(t *testing.T) {
power, err := partition.AddSectors(store, false, manySectors, sectorSize, miner.NoQuantization)
require.NoError(t, err)

expectedPower := miner.PowerForSectors(sectorSize, manySectors)
assert.True(t, expectedPower.Equals(power))
assert.True(t, power.IsZero()) // not activated

assertPartitionState(
t, store, partition,
miner.NoQuantization, sectorSize, manySectors,
sectorNos, bf(), bf(), bf(),
sectorNos, bf(), bf(), bf(), sectorNos,
)

// Make sure we can still encode and decode.
Expand All @@ -616,7 +618,7 @@ func TestPartitions(t *testing.T) {
assertPartitionState(
t, store, &newPartition,
miner.NoQuantization, sectorSize, manySectors,
sectorNos, bf(), bf(), bf(),
sectorNos, bf(), bf(), bf(), sectorNos,
)

})
Expand Down Expand Up @@ -814,11 +816,14 @@ func assertPartitionState(t *testing.T,
allSectorIds bitfield.BitField,
faults bitfield.BitField,
recovering bitfield.BitField,
terminations bitfield.BitField) {
terminations bitfield.BitField,
unproven bitfield.BitField,
) {

assertBitfieldsEqual(t, faults, partition.Faults)
assertBitfieldsEqual(t, recovering, partition.Recoveries)
assertBitfieldsEqual(t, terminations, partition.Terminated)
assertBitfieldsEqual(t, unproven, partition.Unproven)
assertBitfieldsEqual(t, allSectorIds, partition.Sectors)

checkPartitionInvariants(t, store, partition, quant, sectorSize, sectors)
Expand Down

0 comments on commit 075f5eb

Please sign in to comment.