lotus/lotus-soup/common_roles.go

110 lines
2.4 KiB
Go
Raw Normal View History

package main
import (
"context"
2020-06-26 14:27:10 +00:00
"fmt"
"time"
2020-06-26 14:27:10 +00:00
2020-06-26 12:09:58 +00:00
"github.com/filecoin-project/lotus/build"
2020-06-26 14:27:10 +00:00
"github.com/testground/sdk-go/sync"
)
func runBootstrapper(t *TestEnvironment) error {
t.RecordMessage("running bootstrapper")
_, err := prepareBootstrapper(t)
if err != nil {
return err
}
ctx := context.Background()
t.SyncClient.MustSignalAndWait(ctx, stateDone, t.TestInstanceCount)
return nil
}
func runMiner(t *TestEnvironment) error {
t.RecordMessage("running miner")
miner, err := prepareMiner(t)
if err != nil {
return err
}
2020-06-26 12:09:58 +00:00
t.RecordMessage("block delay: %v", build.BlockDelay)
t.D().Gauge("miner.block-delay").Update(build.BlockDelay)
ctx := context.Background()
clients := t.IntParam("clients")
miners := t.IntParam("miners")
2020-06-26 20:07:49 +00:00
myActorAddr, err := miner.minerApi.ActorAddress(ctx)
if err != nil {
return err
}
// mine / stop mining
mine := true
done := make(chan struct{})
2020-06-29 16:32:43 +00:00
if miner.MineOne != nil {
go func() {
defer t.RecordMessage("shutting down mining")
2020-06-29 16:32:43 +00:00
defer close(done)
2020-06-29 16:32:43 +00:00
var i int
for i = 0; mine; i++ {
// synchronize all miners to mine the next block
t.RecordMessage("synchronizing all miners to mine next block [%d]", i)
stateMineNext := sync.State(fmt.Sprintf("mine-block-%d", i))
t.SyncClient.MustSignalAndWait(ctx, stateMineNext, miners)
ch := make(chan struct{})
err := miner.MineOne(ctx, func(mined bool) {
if mined {
t.D().Counter(fmt.Sprintf("block.mine,miner=%s", myActorAddr)).Inc(1)
}
close(ch)
})
if err != nil {
panic(err)
2020-06-29 15:21:50 +00:00
}
2020-06-29 16:32:43 +00:00
<-ch
}
2020-06-26 14:44:40 +00:00
2020-06-29 16:32:43 +00:00
// signal the last block to make sure no miners are left stuck waiting for the next block signal
// while the others have stopped
stateMineLast := sync.State(fmt.Sprintf("mine-block-%d", i))
t.SyncClient.MustSignalEntry(ctx, stateMineLast)
}()
} else {
close(done)
}
// wait for a signal from all clients to stop mining
err = <-t.SyncClient.MustBarrier(ctx, stateStopMining, clients).C
if err != nil {
return err
}
mine = false
<-done
2020-06-29 15:10:31 +00:00
time.Sleep(3600 * time.Second)
t.SyncClient.MustSignalAndWait(ctx, stateDone, t.TestInstanceCount)
return nil
}
func runDrandNode(t *TestEnvironment) error {
t.RecordMessage("running drand node")
2020-06-25 16:38:40 +00:00
dr, err := prepareDrandNode(t)
if err != nil {
return err
}
2020-06-25 16:38:40 +00:00
defer dr.Cleanup()
// TODO add ability to halt / recover on demand
ctx := context.Background()
t.SyncClient.MustSignalAndWait(ctx, stateDone, t.TestInstanceCount)
return nil
}