mirror of
https://github.com/sigp/lighthouse.git
synced 2026-07-01 20:04:41 +00:00
Merge remote-tracking branch 'origin/unstable' into tree-states
This commit is contained in:
@@ -55,7 +55,13 @@ pub enum PruningOutcome {
|
||||
Successful {
|
||||
old_finalized_checkpoint: Checkpoint,
|
||||
},
|
||||
DeferredConcurrentMutation,
|
||||
/// The run was aborted because the new finalized checkpoint is older than the previous one.
|
||||
OutOfOrderFinalization {
|
||||
old_finalized_checkpoint: Checkpoint,
|
||||
new_finalized_checkpoint: Checkpoint,
|
||||
},
|
||||
/// The run was aborted due to a concurrent mutation of the head tracker.
|
||||
DeferredConcurrentHeadTrackerMutation,
|
||||
}
|
||||
|
||||
/// Logic errors that can occur during pruning, none of these should ever happen.
|
||||
@@ -68,6 +74,10 @@ pub enum PruningError {
|
||||
MissingInfoForCanonicalChain {
|
||||
slot: Slot,
|
||||
},
|
||||
FinalizedStateOutOfOrder {
|
||||
old_finalized_checkpoint: Checkpoint,
|
||||
new_finalized_checkpoint: Checkpoint,
|
||||
},
|
||||
UnexpectedEqualStateRoots,
|
||||
UnexpectedUnequalStateRoots,
|
||||
}
|
||||
@@ -224,7 +234,7 @@ impl<E: EthSpec, Hot: ItemStore<E>, Cold: ItemStore<E>> BackgroundMigrator<E, Ho
|
||||
Ok(PruningOutcome::Successful {
|
||||
old_finalized_checkpoint,
|
||||
}) => old_finalized_checkpoint,
|
||||
Ok(PruningOutcome::DeferredConcurrentMutation) => {
|
||||
Ok(PruningOutcome::DeferredConcurrentHeadTrackerMutation) => {
|
||||
warn!(
|
||||
log,
|
||||
"Pruning deferred because of a concurrent mutation";
|
||||
@@ -232,8 +242,21 @@ impl<E: EthSpec, Hot: ItemStore<E>, Cold: ItemStore<E>> BackgroundMigrator<E, Ho
|
||||
);
|
||||
return;
|
||||
}
|
||||
Ok(PruningOutcome::OutOfOrderFinalization {
|
||||
old_finalized_checkpoint,
|
||||
new_finalized_checkpoint,
|
||||
}) => {
|
||||
warn!(
|
||||
log,
|
||||
"Ignoring out of order finalization request";
|
||||
"old_finalized_epoch" => old_finalized_checkpoint.epoch,
|
||||
"new_finalized_epoch" => new_finalized_checkpoint.epoch,
|
||||
"message" => "this is expected occasionally due to a (harmless) race condition"
|
||||
);
|
||||
return;
|
||||
}
|
||||
Err(e) => {
|
||||
warn!(log, "Block pruning failed"; "error" => format!("{:?}", e));
|
||||
warn!(log, "Block pruning failed"; "error" => ?e);
|
||||
return;
|
||||
}
|
||||
};
|
||||
@@ -353,6 +376,16 @@ impl<E: EthSpec, Hot: ItemStore<E>, Cold: ItemStore<E>> BackgroundMigrator<E, Ho
|
||||
.into());
|
||||
}
|
||||
|
||||
// The new finalized state must be newer than the previous finalized state.
|
||||
// I think this can happen sometimes currently due to `fork_choice` running in parallel
|
||||
// with itself and sending us notifications out of order.
|
||||
if old_finalized_slot > new_finalized_slot {
|
||||
return Ok(PruningOutcome::OutOfOrderFinalization {
|
||||
old_finalized_checkpoint,
|
||||
new_finalized_checkpoint,
|
||||
});
|
||||
}
|
||||
|
||||
debug!(
|
||||
log,
|
||||
"Starting database pruning";
|
||||
@@ -505,7 +538,7 @@ impl<E: EthSpec, Hot: ItemStore<E>, Cold: ItemStore<E>> BackgroundMigrator<E, Ho
|
||||
// later.
|
||||
for head_hash in &abandoned_heads {
|
||||
if !head_tracker_lock.contains_key(head_hash) {
|
||||
return Ok(PruningOutcome::DeferredConcurrentMutation);
|
||||
return Ok(PruningOutcome::DeferredConcurrentHeadTrackerMutation);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user