Skip to content

Commit

Permalink
More robust quitting of PoW mining (#4574)
Browse files Browse the repository at this point in the history
* isTrans -> cfg.blockBuilderParameters != nil

* More robust quitting of PoW mining
  • Loading branch information
yperbasis authored Jun 29, 2022
1 parent 6add6ec commit 7cd1951
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 43 deletions.
33 changes: 3 additions & 30 deletions eth/backend.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,6 @@ import (
"github.com/ledgerwatch/erigon/eth/ethutils"
"github.com/ledgerwatch/erigon/eth/protocols/eth"
"github.com/ledgerwatch/erigon/eth/stagedsync"
"github.com/ledgerwatch/erigon/eth/stagedsync/stages"
"github.com/ledgerwatch/erigon/ethdb/privateapi"
"github.com/ledgerwatch/erigon/ethdb/prune"
"github.com/ledgerwatch/erigon/ethstats"
Expand Down Expand Up @@ -110,7 +109,6 @@ type Ethereum struct {
lock sync.RWMutex // Protects the variadic fields (e.g. gas price and etherbase)
chainConfig *params.ChainConfig
genesisHash common.Hash
quitMining chan struct{}
miningSealingQuit chan struct{}
pendingBlocks chan *types.Block
minedBlocks chan *types.Block
Expand Down Expand Up @@ -352,7 +350,6 @@ func New(stack *node.Node, config *ethconfig.Config, logger log.Logger) (*Ethere
}

backend.notifyMiningAboutNewTxs = make(chan struct{}, 1)
backend.quitMining = make(chan struct{})
backend.miningSealingQuit = make(chan struct{})
backend.pendingBlocks = make(chan *types.Block, 1)
backend.minedBlocks = make(chan *types.Block, 1)
Expand Down Expand Up @@ -476,13 +473,13 @@ func New(stack *node.Node, config *ethconfig.Config, logger log.Logger) (*Ethere
if err := miningRPC.(*privateapi.MiningServer).BroadcastPendingBlock(b); err != nil {
log.Error("txpool rpc pending block broadcast", "err", err)
}
case <-backend.quitMining:
case <-backend.sentriesClient.Hd.QuitPoWMining:
return
}
}
}()

if err := backend.StartMining(context.Background(), backend.chainDB, mining, backend.config.Miner, backend.gasPrice, backend.quitMining); err != nil {
if err := backend.StartMining(context.Background(), backend.chainDB, mining, backend.config.Miner, backend.gasPrice, backend.sentriesClient.Hd.QuitPoWMining); err != nil {
return nil, err
}

Expand Down Expand Up @@ -693,12 +690,6 @@ func (s *Ethereum) StartMining(ctx context.Context, db kv.RwDB, mining *stagedsy
var hasWork bool
errc := make(chan error, 1)

tx, err := s.chainDB.BeginRo(ctx)
if err != nil {
log.Warn("mining", "err", err)
return
}

for {
mineEvery.Reset(3 * time.Second)
select {
Expand All @@ -718,21 +709,6 @@ func (s *Ethereum) StartMining(ctx context.Context, db kv.RwDB, mining *stagedsy
case <-quitCh:
return
}
// Check if we transitioned and if we did halt POW mining
headNumber, err := stages.GetStageProgress(tx, stages.Headers)
if err != nil {
log.Warn("mining", "err", err)
return
}

isTrans, err := rawdb.Transitioned(tx, headNumber, s.chainConfig.TerminalTotalDifficulty)
if err != nil {
log.Warn("mining", "err", err)
return
}
if isTrans {
return
}

if !works && hasWork {
works = true
Expand Down Expand Up @@ -880,11 +856,8 @@ func (s *Ethereum) Stop() error {
case <-shutdownDone:
}
}
if s.quitMining != nil {
close(s.quitMining)
}
libcommon.SafeClose(s.sentriesClient.Hd.QuitPoWMining)

//s.miner.Stop()
s.engine.Close()
<-s.waitForStageLoopStop
if s.config.Miner.Enabled {
Expand Down
11 changes: 6 additions & 5 deletions eth/stagedsync/stage_headers.go
Original file line number Diff line number Diff line change
Expand Up @@ -132,12 +132,13 @@ func SpawnStageHeaders(
return finishHandlingForkChoice(unsettledForkChoice, headHeight, s, tx, cfg, useExternalTx)
}

isTrans, err := rawdb.Transitioned(tx, blockNumber, cfg.chainConfig.TerminalTotalDifficulty)
transitionedToPoS, err := rawdb.Transitioned(tx, blockNumber, cfg.chainConfig.TerminalTotalDifficulty)
if err != nil {
return err
}

if isTrans {
if transitionedToPoS {
libcommon.SafeClose(cfg.hd.QuitPoWMining)
return HeadersPOS(s, u, ctx, tx, cfg, useExternalTx)
} else {
return HeadersPOW(s, u, ctx, tx, cfg, initialCycle, test, useExternalTx)
Expand Down Expand Up @@ -771,17 +772,17 @@ func HeadersPOW(
Loop:
for !stopped {

isTrans, err := rawdb.Transitioned(tx, headerProgress, cfg.chainConfig.TerminalTotalDifficulty)
transitionedToPoS, err := rawdb.Transitioned(tx, headerProgress, cfg.chainConfig.TerminalTotalDifficulty)
if err != nil {
return err
}

if isTrans {
if transitionedToPoS {
if err := s.Update(tx, headerProgress); err != nil {
return err
}
break
}

currentTime := time.Now()
req, penalties := cfg.hd.RequestMoreHeaders(currentTime)
if req != nil {
Expand Down
11 changes: 3 additions & 8 deletions eth/stagedsync/stage_mining_create_block.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,13 +115,8 @@ func SpawnMiningCreateBlockStage(s *StageState, tx kv.RwTx, cfg MiningCreateBloc
return fmt.Errorf("wrong head block: %x (current) vs %x (requested)", parent.Hash(), cfg.blockBuilderParameters.ParentHash)
}

isTrans, err := rawdb.Transitioned(tx, executionAt, cfg.chainConfig.TerminalTotalDifficulty)
if err != nil {
return err
}

if cfg.miner.MiningConfig.Etherbase == (common.Address{}) {
if !isTrans {
if cfg.blockBuilderParameters == nil {
return fmt.Errorf("refusing to mine without etherbase")
}
// If we do not have an etherbase, let's use the suggested one
Expand Down Expand Up @@ -199,7 +194,7 @@ func SpawnMiningCreateBlockStage(s *StageState, tx kv.RwTx, cfg MiningCreateBloc

// re-written miner/worker.go:commitNewWork
var timestamp uint64
if !isTrans {
if cfg.blockBuilderParameters == nil {
timestamp = uint64(time.Now().Unix())
if parent.Time >= timestamp {
timestamp = parent.Time + 1
Expand Down Expand Up @@ -230,7 +225,7 @@ func SpawnMiningCreateBlockStage(s *StageState, tx kv.RwTx, cfg MiningCreateBloc
return err
}

if isTrans {
if cfg.blockBuilderParameters != nil {
header.MixDigest = cfg.blockBuilderParameters.PrevRandao

current.Header = header
Expand Down
2 changes: 2 additions & 0 deletions turbo/stages/headerdownload/header_data_struct.go
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,7 @@ type HeaderDownload struct {
fetchingNew bool // Set when the stage that is actively fetching the headers is in progress
topSeenHeightPoW uint64
latestMinedBlockNumber uint64
QuitPoWMining chan struct{}
trace bool
stats Stats

Expand Down Expand Up @@ -349,6 +350,7 @@ func NewHeaderDownload(
anchorQueue: &AnchorQueue{},
seenAnnounces: NewSeenAnnounces(),
DeliveryNotify: make(chan struct{}, 1),
QuitPoWMining: make(chan struct{}),
BeaconRequestList: engineapi.NewRequestList(),
PayloadStatusCh: make(chan privateapi.PayloadStatus, 1),
headerReader: headerReader,
Expand Down

0 comments on commit 7cd1951

Please sign in to comment.