feat: impl remove_blocks_above to static file service (#9553)

This commit is contained in:
Dan Cline
2024-07-16 16:34:13 -04:00
committed by GitHub
parent d5964cae0e
commit 4381b0cd06
2 changed files with 35 additions and 10 deletions

View File

@ -3,7 +3,9 @@
use reth_db::database::Database; use reth_db::database::Database;
use reth_errors::ProviderResult; use reth_errors::ProviderResult;
use reth_primitives::{SealedBlock, StaticFileSegment, TransactionSignedNoHash, B256, U256}; use reth_primitives::{SealedBlock, StaticFileSegment, TransactionSignedNoHash, B256, U256};
use reth_provider::{ProviderFactory, StaticFileProviderFactory, StaticFileWriter}; use reth_provider::{
ProviderFactory, StaticFileProviderFactory, StaticFileWriter, TransactionsProviderExt,
};
use std::sync::{ use std::sync::{
mpsc::{Receiver, SendError, Sender}, mpsc::{Receiver, SendError, Sender},
Arc, Arc,
@ -162,17 +164,40 @@ where
block_num: u64, block_num: u64,
sender: oneshot::Sender<()>, sender: oneshot::Sender<()>,
) -> ProviderResult<()> { ) -> ProviderResult<()> {
let provider = self.provider.static_file_provider(); let sf_provider = self.provider.static_file_provider();
let db_provider_rw = self.provider.provider_rw()?;
// get highest static file block for the total block range
let highest_static_file_block = sf_provider
.get_highest_static_file_block(StaticFileSegment::Headers)
.expect("todo: error handling, headers should exist");
// Get the total txs for the block range, so we have the correct number of columns for
// receipts and transactions
let tx_range = db_provider_rw
.transaction_range_by_block_range(block_num..=highest_static_file_block)?;
let total_txs = tx_range.end().saturating_sub(*tx_range.start());
// get the writers // get the writers
let mut _header_writer = provider.get_writer(block_num, StaticFileSegment::Headers)?; let mut header_writer = sf_provider.get_writer(block_num, StaticFileSegment::Headers)?;
let mut _transactions_writer = let mut transactions_writer =
provider.get_writer(block_num, StaticFileSegment::Transactions)?; sf_provider.get_writer(block_num, StaticFileSegment::Transactions)?;
let mut _receipts_writer = provider.get_writer(block_num, StaticFileSegment::Receipts)?; let mut receipts_writer = sf_provider.get_writer(block_num, StaticFileSegment::Receipts)?;
// TODO: how do we delete s.t. `block_num` is the start? Additionally, do we need to index // finally actually truncate, these internally commit
// by tx num for the transactions segment? receipts_writer.truncate(StaticFileSegment::Receipts, total_txs, Some(block_num))?;
todo!("implement remove_blocks_above") transactions_writer.truncate(
StaticFileSegment::Transactions,
total_txs,
Some(block_num),
)?;
header_writer.truncate(
StaticFileSegment::Headers,
highest_static_file_block.saturating_sub(block_num),
None,
)?;
Ok(())
} }
} }

View File

@ -338,7 +338,7 @@ impl StaticFileProviderRW {
/// ///
/// # Note /// # Note
/// Commits to the configuration file at the end. /// Commits to the configuration file at the end.
fn truncate( pub fn truncate(
&mut self, &mut self,
segment: StaticFileSegment, segment: StaticFileSegment,
num_rows: u64, num_rows: u64,