mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-02-26 15:47:21 +00:00
Merge 0633b4b390 into 406a852ec8
This commit is contained in:
commit
9a2b7c718a
2 changed files with 4 additions and 28 deletions
|
|
@ -233,12 +233,9 @@ func (api *ConsensusAPI) forkchoiceUpdated(update engine.ForkchoiceStateV1, payl
|
|||
if res := api.checkInvalidAncestor(update.HeadBlockHash, update.HeadBlockHash); res != nil {
|
||||
return engine.ForkChoiceResponse{PayloadStatus: *res, PayloadID: nil}, nil
|
||||
}
|
||||
// If the head hash is unknown (was not given to us in a newPayload request),
|
||||
// we cannot resolve the header, so not much to do. This could be extended in
|
||||
// the future to resolve from the `eth` network, but it's an unexpected case
|
||||
// that should be fixed, not papered over.
|
||||
header := api.remoteBlocks.get(update.HeadBlockHash)
|
||||
if header == nil {
|
||||
// The head hash is unknown locally, try to resolve it from the `eth` network
|
||||
log.Warn("Fetching the unknown forkchoice head from network", "hash", update.HeadBlockHash)
|
||||
retrievedHead, err := api.eth.Downloader().GetHeader(update.HeadBlockHash)
|
||||
if err != nil {
|
||||
|
|
@ -251,7 +248,9 @@ func (api *ConsensusAPI) forkchoiceUpdated(update engine.ForkchoiceStateV1, payl
|
|||
// If the finalized hash is known, we can direct the downloader to move
|
||||
// potentially more data to the freezer from the get go.
|
||||
finalized := api.remoteBlocks.get(update.FinalizedBlockHash)
|
||||
|
||||
if finalized == nil {
|
||||
finalized = api.eth.BlockChain().GetHeaderByHash(update.FinalizedBlockHash)
|
||||
}
|
||||
// Header advertised via a past newPayload request. Start syncing to it.
|
||||
context := []interface{}{"number", header.Number, "hash", header.Hash()}
|
||||
if update.FinalizedBlockHash != (common.Hash{}) {
|
||||
|
|
|
|||
|
|
@ -959,29 +959,6 @@ func (d *Downloader) processSnapSyncContent() error {
|
|||
} else { // results already piled up, consume before handling pivot move
|
||||
results = append(append([]*fetchResult{oldPivot}, oldTail...), results...)
|
||||
}
|
||||
// Split around the pivot block and process the two sides via snap/full sync
|
||||
if !d.committed.Load() {
|
||||
latest := results[len(results)-1].Header
|
||||
// If the height is above the pivot block by 2 sets, it means the pivot
|
||||
// became stale in the network, and it was garbage collected, move to a
|
||||
// new pivot.
|
||||
//
|
||||
// Note, we have `reorgProtHeaderDelay` number of blocks withheld, Those
|
||||
// need to be taken into account, otherwise we're detecting the pivot move
|
||||
// late and will drop peers due to unavailable state!!!
|
||||
if height := latest.Number.Uint64(); height >= pivot.Number.Uint64()+2*uint64(fsMinFullBlocks)-uint64(reorgProtHeaderDelay) {
|
||||
log.Warn("Pivot became stale, moving", "old", pivot.Number.Uint64(), "new", height-uint64(fsMinFullBlocks)+uint64(reorgProtHeaderDelay))
|
||||
pivot = results[len(results)-1-fsMinFullBlocks+reorgProtHeaderDelay].Header // must exist as lower old pivot is uncommitted
|
||||
|
||||
d.pivotLock.Lock()
|
||||
d.pivotHeader = pivot
|
||||
d.pivotLock.Unlock()
|
||||
|
||||
// Write out the pivot into the database so a rollback beyond it will
|
||||
// reenable snap sync
|
||||
rawdb.WriteLastPivotNumber(d.stateDB, pivot.Number.Uint64())
|
||||
}
|
||||
}
|
||||
P, beforeP, afterP := splitAroundPivot(pivot.Number.Uint64(), results)
|
||||
if err := d.commitSnapSyncData(beforeP, sync); err != nil {
|
||||
return err
|
||||
|
|
|
|||
Loading…
Reference in a new issue