Skip to content

Commit

Permalink
consortium-v2/snapshot: add pruneSnapshotPeriodically
Browse files Browse the repository at this point in the history
pruneSnapshot: delete the nSnapshotsPrune oldest snapshots, keep the latestSnapshotsKeep snapshots
pruneSnapshotPeriodically: prune the snapshots at the start of each pruningPeriod
  • Loading branch information
Francesco4203 committed Jul 8, 2024
1 parent 4bfb2d6 commit 2c4ad2f
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 0 deletions.
7 changes: 7 additions & 0 deletions consensus/consortium/v2/consortium.go
Original file line number Diff line number Diff line change
Expand Up @@ -629,6 +629,9 @@ func (c *Consortium) snapshot(chain consensus.ChainHeaderReader, number uint64,
if err := snap.store(c.db); err != nil {
return nil, err
}
if err := snap.pruneSnapshotPeriodically(c.db, chain); err != nil {
return nil, err
}
log.Info("Stored checkpoint snapshot to disk", "number", number, "hash", hash)
figure.NewColorFigure("Welcome to DPOS", "", "green", true).Print()
break
Expand Down Expand Up @@ -688,6 +691,10 @@ func (c *Consortium) snapshot(chain consensus.ChainHeaderReader, number uint64,
if err = snap.store(c.db); err != nil {
return nil, err
}
// Prune the snapshot periodically
if err := snap.pruneSnapshotPeriodically(c.db, chain); err != nil {
return nil, err
}
log.Trace("Stored snapshot to disk", "number", snap.Number, "hash", snap.Hash)
}
log.Trace("Checking snapshot data", "number", snap.Number, "validators", snap.validators())
Expand Down
48 changes: 48 additions & 0 deletions consensus/consortium/v2/snapshot.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,22 @@ import (
blsCommon "github.com/ethereum/go-ethereum/crypto/bls/common"
"github.com/ethereum/go-ethereum/ethdb"
"github.com/ethereum/go-ethereum/internal/ethapi"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/params"
lru "github.com/hashicorp/golang-lru"
)

const (
blocksPerEpoch = 200
epochsPerPeriod = 144
)

var (
latestSnapshotsKeep = blocksPerEpoch * epochsPerPeriod * 5 // 5 days
snapshotsToBePruned = epochsPerPeriod * 2 // 2 days
pruningPeriod = blocksPerEpoch * epochsPerPeriod * 1 // every 1 day
)

// Snapshot is the state of the authorization validators at a given point in time.
type Snapshot struct {
// private fields are not json.Marshalled
Expand Down Expand Up @@ -112,6 +124,42 @@ func loadSnapshot(
return snap, nil
}

// snapshot pruning
// delete the nSnapshotsPrune oldest snapshots, keep the latestSnapshotsKeep snapshots
func (s *Snapshot) pruneSnapshot(db ethdb.Database, nSnapshotPrune int, chain consensus.ChainHeaderReader) error {
log.Info("Pruning snapshots at block", "block", s.Number, "nSnapshotPrune", nSnapshotPrune)
// Get block number to start pruning
curBlockNumber := s.Number
curBlockNumber -= curBlockNumber % uint64(blocksPerEpoch) // start of the current epoch
curBlockNumber -= uint64(latestSnapshotsKeep) // start of the oldest epoch to keep

// delete nSnapshotPrune snapshots starting from curBlockNumber to the older ones
batch := db.NewBatch()
for nSnapshotPrune > 0 {
nSnapshotPrune--
header := chain.GetHeaderByNumber(curBlockNumber)
if header == nil {
// no more snapshots to prune
break
}
curHash := header.Hash()
if err := batch.Delete(append(rawdb.ConsortiumSnapshotPrefix, curHash[:]...)); err != nil {
return err
}
curBlockNumber -= uint64(blocksPerEpoch)
}
log.Info("Pruned snapshots done")
return batch.Write()
}

// periodically prune the snapshots at the start of each pruningPeriod
func (s *Snapshot) pruneSnapshotPeriodically(db ethdb.Database, chain consensus.ChainHeaderReader) error {
if s.Number%uint64(pruningPeriod) == 0 {
return s.pruneSnapshot(db, snapshotsToBePruned, chain)
}
return nil
}

// store inserts the snapshot into the database.
func (s *Snapshot) store(db ethdb.Database) error {
blob, err := json.Marshal(s)
Expand Down

0 comments on commit 2c4ad2f

Please sign in to comment.