fix: only use tags if they have been set (#10150)

This commit is contained in:
Dan Cline
2024-08-06 15:21:39 -04:00
committed by GitHub
parent 6f4291d94e
commit fbebde6b2e
9 changed files with 33 additions and 18 deletions

View File

@ -131,7 +131,9 @@ where
let last_canonical_hashes = let last_canonical_hashes =
externals.fetch_latest_canonical_hashes(config.num_of_canonical_hashes() as usize)?; externals.fetch_latest_canonical_hashes(config.num_of_canonical_hashes() as usize)?;
let last_finalized_block_number = externals.fetch_latest_finalized_block_number()?; // If we haven't written the finalized block, assume it's zero
let last_finalized_block_number =
externals.fetch_latest_finalized_block_number()?.unwrap_or_default();
Ok(Self { Ok(Self {
externals, externals,

View File

@ -85,7 +85,9 @@ impl<DB: Database, E> TreeExternals<DB, E> {
Ok(hashes) Ok(hashes)
} }
pub(crate) fn fetch_latest_finalized_block_number(&self) -> ProviderResult<BlockNumber> { pub(crate) fn fetch_latest_finalized_block_number(
&self,
) -> ProviderResult<Option<BlockNumber>> {
self.provider_factory.provider()?.last_finalized_block_number() self.provider_factory.provider()?.last_finalized_block_number()
} }

View File

@ -20,8 +20,8 @@ impl ChainInfoTracker {
/// Create a new chain info container for the given canonical head and finalized header if it /// Create a new chain info container for the given canonical head and finalized header if it
/// exists. /// exists.
pub fn new(head: SealedHeader, finalized: Option<SealedHeader>) -> Self { pub fn new(head: SealedHeader, finalized: Option<SealedHeader>) -> Self {
let (finalized_block, _) = watch::channel(finalized.clone()); let (finalized_block, _) = watch::channel(finalized);
let (safe_block, _) = watch::channel(finalized); let (safe_block, _) = watch::channel(None);
Self { Self {
inner: Arc::new(ChainInfoInner { inner: Arc::new(ChainInfoInner {
@ -88,14 +88,12 @@ impl ChainInfoTracker {
} }
/// Returns the safe header of the chain. /// Returns the safe header of the chain.
#[allow(dead_code)]
pub fn get_safe_num_hash(&self) -> Option<BlockNumHash> { pub fn get_safe_num_hash(&self) -> Option<BlockNumHash> {
let h = self.inner.safe_block.borrow(); let h = self.inner.safe_block.borrow();
h.as_ref().map(|h| h.num_hash()) h.as_ref().map(|h| h.num_hash())
} }
/// Returns the finalized header of the chain. /// Returns the finalized header of the chain.
#[allow(dead_code)]
pub fn get_finalized_num_hash(&self) -> Option<BlockNumHash> { pub fn get_finalized_num_hash(&self) -> Option<BlockNumHash> {
let h = self.inner.finalized_block.borrow(); let h = self.inner.finalized_block.borrow();
h.as_ref().map(|h| h.num_hash()) h.as_ref().map(|h| h.num_hash())

View File

@ -96,7 +96,9 @@ impl Command {
let last_saved_finalized_block_number = provider.last_finalized_block_number()?; let last_saved_finalized_block_number = provider.last_finalized_block_number()?;
let range_min = let range_min =
range.clone().min().ok_or(eyre::eyre!("Could not fetch lower range end"))?; range.clone().min().ok_or(eyre::eyre!("Could not fetch lower range end"))?;
if range_min < last_saved_finalized_block_number { if last_saved_finalized_block_number.is_none() ||
Some(range_min) < last_saved_finalized_block_number
{
provider.save_finalized_block_number(BlockNumber::from(range_min))?; provider.save_finalized_block_number(BlockNumber::from(range_min))?;
} }

View File

@ -336,7 +336,12 @@ where
// update finalized block if needed // update finalized block if needed
let last_saved_finalized_block_number = let last_saved_finalized_block_number =
provider_rw.last_finalized_block_number()?; provider_rw.last_finalized_block_number()?;
if checkpoint.block_number < last_saved_finalized_block_number {
// If None, that means the finalized block is not written so we should
// always save in that case
if last_saved_finalized_block_number.is_none() ||
Some(checkpoint.block_number) < last_saved_finalized_block_number
{
provider_rw.save_finalized_block_number(BlockNumber::from( provider_rw.save_finalized_block_number(BlockNumber::from(
checkpoint.block_number, checkpoint.block_number,
))?; ))?;

View File

@ -83,8 +83,11 @@ where
latest: SealedHeader, latest: SealedHeader,
) -> ProviderResult<Self> { ) -> ProviderResult<Self> {
let provider = database.provider()?; let provider = database.provider()?;
let finalized_block_number = provider.last_finalized_block_number()?; let finalized_header = provider
let finalized_header = provider.sealed_header(finalized_block_number)?; .last_finalized_block_number()?
.map(|num| provider.sealed_header(num))
.transpose()?
.flatten();
Ok(Self { Ok(Self {
database, database,
canonical_in_memory_state: CanonicalInMemoryState::with_head(latest, finalized_header), canonical_in_memory_state: CanonicalInMemoryState::with_head(latest, finalized_header),

View File

@ -3663,7 +3663,7 @@ impl<TX: DbTx> StatsReader for DatabaseProvider<TX> {
} }
impl<TX: DbTx> FinalizedBlockReader for DatabaseProvider<TX> { impl<TX: DbTx> FinalizedBlockReader for DatabaseProvider<TX> {
fn last_finalized_block_number(&self) -> ProviderResult<BlockNumber> { fn last_finalized_block_number(&self) -> ProviderResult<Option<BlockNumber>> {
let mut finalized_blocks = self let mut finalized_blocks = self
.tx .tx
.cursor_read::<tables::ChainState>()? .cursor_read::<tables::ChainState>()?
@ -3671,10 +3671,8 @@ impl<TX: DbTx> FinalizedBlockReader for DatabaseProvider<TX> {
.take(1) .take(1)
.collect::<Result<BTreeMap<tables::ChainStateKey, BlockNumber>, _>>()?; .collect::<Result<BTreeMap<tables::ChainStateKey, BlockNumber>, _>>()?;
let last_finalized_block_number = finalized_blocks let last_finalized_block_number = finalized_blocks.pop_first().map(|pair| pair.1);
.pop_first() Ok(last_finalized_block_number)
.unwrap_or((tables::ChainStateKey::LastFinalizedBlock, 0_u64));
Ok(last_finalized_block_number.1)
} }
} }

View File

@ -121,8 +121,11 @@ where
.header_by_number(best.best_number)? .header_by_number(best.best_number)?
.ok_or(ProviderError::HeaderNotFound(best.best_number.into()))?; .ok_or(ProviderError::HeaderNotFound(best.best_number.into()))?;
let finalized_block_number = provider.last_finalized_block_number()?; let finalized_header = provider
let finalized_header = provider.sealed_header(finalized_block_number)?; .last_finalized_block_number()?
.map(|num| provider.sealed_header(num))
.transpose()?
.flatten();
Ok(Self::with_blocks(database, tree, latest_header.seal(best.best_hash), finalized_header)) Ok(Self::with_blocks(database, tree, latest_header.seal(best.best_hash), finalized_header))
} }

View File

@ -4,7 +4,9 @@ use reth_primitives::BlockNumber;
/// Functionality to read the last known finalized block from the database. /// Functionality to read the last known finalized block from the database.
pub trait FinalizedBlockReader: Send + Sync { pub trait FinalizedBlockReader: Send + Sync {
/// Returns the last finalized block number. /// Returns the last finalized block number.
fn last_finalized_block_number(&self) -> ProviderResult<BlockNumber>; ///
/// If no finalized block has been written yet, this returns `None`.
fn last_finalized_block_number(&self) -> ProviderResult<Option<BlockNumber>>;
} }
/// Functionality to write the last known finalized block to the database. /// Functionality to write the last known finalized block to the database.