From a6f3393fb6becd18f3fc33fb6a12174ac277b8a7 Mon Sep 17 00:00:00 2001 From: buddh0 Date: Tue, 28 Nov 2023 11:03:06 +0800 Subject: [PATCH] consensus/parlia: recover faster when snapshot of parlia is gone in disk --- consensus/parlia/parlia.go | 10 ++++++---- consensus/parlia/snapshot.go | 3 +++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/consensus/parlia/parlia.go b/consensus/parlia/parlia.go index f6be4a3199..cb61002950 100644 --- a/consensus/parlia/parlia.go +++ b/consensus/parlia/parlia.go @@ -680,7 +680,7 @@ func (p *Parlia) snapshot(chain consensus.ChainHeaderReader, number uint64, hash // If we're at the genesis, snapshot the initial state. Alternatively if we have // piled up more headers than allowed to be reorged (chain reinit from a freezer), // consider the checkpoint trusted and snapshot it. - if number == 0 || (number%p.config.Epoch == 0 && (len(headers) > params.FullImmutabilityThreshold)) { + if number == 0 || (number%p.config.Epoch == 0 && (len(headers) > params.FullImmutabilityThreshold/10)) { checkpoint := chain.GetHeaderByNumber(number) if checkpoint != nil { // get checkpoint data @@ -694,10 +694,12 @@ func (p *Parlia) snapshot(chain consensus.ChainHeaderReader, number uint64, hash // new snapshot snap = newSnapshot(p.config, p.signatures, number, hash, validators, voteAddrs, p.ethAPI) - if err := snap.store(p.db); err != nil { - return nil, err + if snap.Number%checkpointInterval == 0 { // snapshot will only be loaded when snap.Number%checkpointInterval == 0 + if err := snap.store(p.db); err != nil { + return nil, err + } + log.Info("Stored checkpoint snapshot to disk", "number", number, "hash", hash) } - log.Info("Stored checkpoint snapshot to disk", "number", number, "hash", hash) break } } diff --git a/consensus/parlia/snapshot.go b/consensus/parlia/snapshot.go index a7bf16877e..ddfb1811fc 100644 --- a/consensus/parlia/snapshot.go +++ b/consensus/parlia/snapshot.go @@ -199,6 +199,9 @@ func (s *Snapshot) updateAttestation(header *types.Header, chainConfig *params.C } // Update attestation + // Two scenarios for s.Attestation being nil: + // 1) The first attestation is assembled. + // 2) The snapshot on disk is missing, prompting the creation of a new snapshot using `newSnapshot`. if s.Attestation != nil && attestation.Data.SourceNumber+1 != attestation.Data.TargetNumber { s.Attestation.TargetNumber = attestation.Data.TargetNumber s.Attestation.TargetHash = attestation.Data.TargetHash