mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-21 22:04:44 +00:00
Pseudo finalization endpoint (#7103)
This is a backport of: - https://github.com/sigp/lighthouse/pull/7059 - https://github.com/sigp/lighthouse/pull/7071 For: - https://github.com/sigp/lighthouse/issues/7039 Introduce a new lighthouse endpoint that allows a user to force a pseudo finalization. This migrates data to the freezer db and prunes sidechains which may help reduce disk space issues on non finalized networks like Holesky We also ban peers that send us blocks that conflict with the manually finalized checkpoint. There were some CI fixes in https://github.com/sigp/lighthouse/pull/7071 that I tried including here Co-authored with: @jimmygchen @pawanjay176 @michaelsproul
This commit is contained in:
@@ -124,14 +124,22 @@ pub enum Notification {
|
||||
Finalization(FinalizationNotification),
|
||||
Reconstruction,
|
||||
PruneBlobs(Epoch),
|
||||
ManualFinalization(ManualFinalizationNotification),
|
||||
}
|
||||
|
||||
pub struct ManualFinalizationNotification {
|
||||
pub state_root: BeaconStateHash,
|
||||
pub checkpoint: Checkpoint,
|
||||
pub head_tracker: Arc<HeadTracker>,
|
||||
pub genesis_block_root: Hash256,
|
||||
}
|
||||
|
||||
pub struct FinalizationNotification {
|
||||
finalized_state_root: BeaconStateHash,
|
||||
finalized_checkpoint: Checkpoint,
|
||||
head_tracker: Arc<HeadTracker>,
|
||||
prev_migration: Arc<Mutex<PrevMigration>>,
|
||||
genesis_block_root: Hash256,
|
||||
pub finalized_state_root: BeaconStateHash,
|
||||
pub finalized_checkpoint: Checkpoint,
|
||||
pub head_tracker: Arc<HeadTracker>,
|
||||
pub prev_migration: Arc<Mutex<PrevMigration>>,
|
||||
pub genesis_block_root: Hash256,
|
||||
}
|
||||
|
||||
impl<E: EthSpec, Hot: ItemStore<E>, Cold: ItemStore<E>> BackgroundMigrator<E, Hot, Cold> {
|
||||
@@ -190,6 +198,14 @@ impl<E: EthSpec, Hot: ItemStore<E>, Cold: ItemStore<E>> BackgroundMigrator<E, Ho
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn process_manual_finalization(&self, notif: ManualFinalizationNotification) {
|
||||
if let Some(Notification::ManualFinalization(notif)) =
|
||||
self.send_background_notification(Notification::ManualFinalization(notif))
|
||||
{
|
||||
Self::run_manual_migration(self.db.clone(), notif, &self.log);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn process_reconstruction(&self) {
|
||||
if let Some(Notification::Reconstruction) =
|
||||
self.send_background_notification(Notification::Reconstruction)
|
||||
@@ -289,6 +305,26 @@ impl<E: EthSpec, Hot: ItemStore<E>, Cold: ItemStore<E>> BackgroundMigrator<E, Ho
|
||||
}
|
||||
}
|
||||
|
||||
fn run_manual_migration(
|
||||
db: Arc<HotColdDB<E, Hot, Cold>>,
|
||||
notif: ManualFinalizationNotification,
|
||||
log: &Logger,
|
||||
) {
|
||||
// We create a "dummy" prev migration
|
||||
let prev_migration = PrevMigration {
|
||||
epoch: Epoch::new(1),
|
||||
epochs_per_migration: 2,
|
||||
};
|
||||
let notif = FinalizationNotification {
|
||||
finalized_state_root: notif.state_root,
|
||||
finalized_checkpoint: notif.checkpoint,
|
||||
head_tracker: notif.head_tracker,
|
||||
prev_migration: Arc::new(prev_migration.into()),
|
||||
genesis_block_root: notif.genesis_block_root,
|
||||
};
|
||||
Self::run_migration(db, notif, log);
|
||||
}
|
||||
|
||||
/// Perform the actual work of `process_finalization`.
|
||||
fn run_migration(
|
||||
db: Arc<HotColdDB<E, Hot, Cold>>,
|
||||
@@ -423,16 +459,27 @@ impl<E: EthSpec, Hot: ItemStore<E>, Cold: ItemStore<E>> BackgroundMigrator<E, Ho
|
||||
while let Ok(notif) = rx.recv() {
|
||||
let mut reconstruction_notif = None;
|
||||
let mut finalization_notif = None;
|
||||
let mut manual_finalization_notif = None;
|
||||
let mut prune_blobs_notif = None;
|
||||
match notif {
|
||||
Notification::Reconstruction => reconstruction_notif = Some(notif),
|
||||
Notification::Finalization(fin) => finalization_notif = Some(fin),
|
||||
Notification::ManualFinalization(fin) => manual_finalization_notif = Some(fin),
|
||||
Notification::PruneBlobs(dab) => prune_blobs_notif = Some(dab),
|
||||
}
|
||||
// Read the rest of the messages in the channel, taking the best of each type.
|
||||
for notif in rx.try_iter() {
|
||||
match notif {
|
||||
Notification::Reconstruction => reconstruction_notif = Some(notif),
|
||||
Notification::ManualFinalization(fin) => {
|
||||
if let Some(current) = manual_finalization_notif.as_mut() {
|
||||
if fin.checkpoint.epoch > current.checkpoint.epoch {
|
||||
*current = fin;
|
||||
}
|
||||
} else {
|
||||
manual_finalization_notif = Some(fin);
|
||||
}
|
||||
}
|
||||
Notification::Finalization(fin) => {
|
||||
if let Some(current) = finalization_notif.as_mut() {
|
||||
if fin.finalized_checkpoint.epoch
|
||||
@@ -455,6 +502,9 @@ impl<E: EthSpec, Hot: ItemStore<E>, Cold: ItemStore<E>> BackgroundMigrator<E, Ho
|
||||
if let Some(fin) = finalization_notif {
|
||||
Self::run_migration(db.clone(), fin, &log);
|
||||
}
|
||||
if let Some(fin) = manual_finalization_notif {
|
||||
Self::run_manual_migration(db.clone(), fin, &log);
|
||||
}
|
||||
if let Some(dab) = prune_blobs_notif {
|
||||
Self::run_prune_blobs(db.clone(), dab, &log);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user