Skip to content

Commit

Permalink
feat: add tables_to_generic! macro to convert between table values …
Browse files Browse the repository at this point in the history
…and types
  • Loading branch information
DaniPopes committed May 30, 2024
1 parent e89e4c9 commit a2d1774
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 126 deletions.
99 changes: 12 additions & 87 deletions bin/reth/src/commands/db/diff.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ use crate::{
};
use clap::Parser;
use reth_db::{
cursor::DbCursorRO, database::Database, open_db_read_only, table::Table, transaction::DbTx,
AccountChangeSets, AccountsHistory, AccountsTrie, BlockBodyIndices, BlockOmmers, BlockRequests,
BlockWithdrawals, Bytecodes, CanonicalHeaders, DatabaseEnv, HashedAccounts, HashedStorages,
HeaderNumbers, HeaderTerminalDifficulties, Headers, PlainAccountState, PlainStorageState,
PruneCheckpoints, Receipts, StageCheckpointProgresses, StageCheckpoints, StorageChangeSets,
StoragesHistory, StoragesTrie, Tables, TransactionBlocks, TransactionHashNumbers,
TransactionSenders, Transactions, VersionHistory,
cursor::DbCursorRO, database::Database, open_db_read_only, table::Table, tables_to_generic,
transaction::DbTx, AccountChangeSets, AccountsHistory, AccountsTrie, BlockBodyIndices,
BlockOmmers, BlockRequests, BlockWithdrawals, Bytecodes, CanonicalHeaders, DatabaseEnv,
HashedAccounts, HashedStorages, HeaderNumbers, HeaderTerminalDifficulties, Headers,
PlainAccountState, PlainStorageState, PruneCheckpoints, Receipts, StageCheckpointProgresses,
StageCheckpoints, StorageChangeSets, StoragesHistory, StoragesTrie, Tables, TransactionBlocks,
TransactionHashNumbers, TransactionSenders, Transactions, VersionHistory,
};
use std::{
collections::HashMap,
Expand Down Expand Up @@ -78,86 +78,11 @@ impl Command {
secondary_tx.disable_long_read_transaction_safety();

let output_dir = self.output.clone();
match table {
Tables::CanonicalHeaders => {
find_diffs::<CanonicalHeaders>(primary_tx, secondary_tx, output_dir)?
}
Tables::HeaderTerminalDifficulties => {
find_diffs::<HeaderTerminalDifficulties>(primary_tx, secondary_tx, output_dir)?
}
Tables::HeaderNumbers => {
find_diffs::<HeaderNumbers>(primary_tx, secondary_tx, output_dir)?
}
Tables::Headers => find_diffs::<Headers>(primary_tx, secondary_tx, output_dir)?,
Tables::BlockBodyIndices => {
find_diffs::<BlockBodyIndices>(primary_tx, secondary_tx, output_dir)?
}
Tables::BlockOmmers => {
find_diffs::<BlockOmmers>(primary_tx, secondary_tx, output_dir)?
}
Tables::BlockWithdrawals => {
find_diffs::<BlockWithdrawals>(primary_tx, secondary_tx, output_dir)?
}
Tables::BlockRequests => {
find_diffs::<BlockRequests>(primary_tx, secondary_tx, output_dir)?
}
Tables::TransactionBlocks => {
find_diffs::<TransactionBlocks>(primary_tx, secondary_tx, output_dir)?
}
Tables::Transactions => {
find_diffs::<Transactions>(primary_tx, secondary_tx, output_dir)?
}
Tables::TransactionHashNumbers => {
find_diffs::<TransactionHashNumbers>(primary_tx, secondary_tx, output_dir)?
}
Tables::Receipts => find_diffs::<Receipts>(primary_tx, secondary_tx, output_dir)?,
Tables::PlainAccountState => {
find_diffs::<PlainAccountState>(primary_tx, secondary_tx, output_dir)?
}
Tables::PlainStorageState => {
find_diffs::<PlainStorageState>(primary_tx, secondary_tx, output_dir)?
}
Tables::Bytecodes => find_diffs::<Bytecodes>(primary_tx, secondary_tx, output_dir)?,
Tables::AccountsHistory => {
find_diffs::<AccountsHistory>(primary_tx, secondary_tx, output_dir)?
}
Tables::StoragesHistory => {
find_diffs::<StoragesHistory>(primary_tx, secondary_tx, output_dir)?
}
Tables::AccountChangeSets => {
find_diffs::<AccountChangeSets>(primary_tx, secondary_tx, output_dir)?
}
Tables::StorageChangeSets => {
find_diffs::<StorageChangeSets>(primary_tx, secondary_tx, output_dir)?
}
Tables::HashedAccounts => {
find_diffs::<HashedAccounts>(primary_tx, secondary_tx, output_dir)?
}
Tables::HashedStorages => {
find_diffs::<HashedStorages>(primary_tx, secondary_tx, output_dir)?
}
Tables::AccountsTrie => {
find_diffs::<AccountsTrie>(primary_tx, secondary_tx, output_dir)?
}
Tables::StoragesTrie => {
find_diffs::<StoragesTrie>(primary_tx, secondary_tx, output_dir)?
}
Tables::TransactionSenders => {
find_diffs::<TransactionSenders>(primary_tx, secondary_tx, output_dir)?
}
Tables::StageCheckpoints => {
find_diffs::<StageCheckpoints>(primary_tx, secondary_tx, output_dir)?
}
Tables::StageCheckpointProgresses => {
find_diffs::<StageCheckpointProgresses>(primary_tx, secondary_tx, output_dir)?
}
Tables::PruneCheckpoints => {
find_diffs::<PruneCheckpoints>(primary_tx, secondary_tx, output_dir)?
}
Tables::VersionHistory => {
find_diffs::<VersionHistory>(primary_tx, secondary_tx, output_dir)?
}
};
tables_to_generic!(table, |Table| find_diffs::<Table>(
primary_tx,
secondary_tx,
output_dir
))?;
}

Ok(())
Expand Down
44 changes: 5 additions & 39 deletions bin/reth/src/commands/db/stats.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ use eyre::WrapErr;
use human_bytes::human_bytes;
use itertools::Itertools;
use reth_db::{
database::Database, mdbx, static_file::iter_static_files, AccountChangeSets, AccountsHistory,
AccountsTrie, BlockBodyIndices, BlockOmmers, BlockRequests, BlockWithdrawals, Bytecodes,
CanonicalHeaders, DatabaseEnv, HashedAccounts, HashedStorages, HeaderNumbers,
database::Database, mdbx, static_file::iter_static_files, tables_to_generic, AccountChangeSets,
AccountsHistory, AccountsTrie, BlockBodyIndices, BlockOmmers, BlockRequests, BlockWithdrawals,
Bytecodes, CanonicalHeaders, DatabaseEnv, HashedAccounts, HashedStorages, HeaderNumbers,
HeaderTerminalDifficulties, Headers, PlainAccountState, PlainStorageState, PruneCheckpoints,
Receipts, StageCheckpointProgresses, StageCheckpoints, StorageChangeSets, StoragesHistory,
StoragesTrie, Tables, TransactionBlocks, TransactionHashNumbers, TransactionSenders,
Expand Down Expand Up @@ -326,42 +326,8 @@ impl Command {
info!("Calculating checksum for table: {}", db_table);

let viewer = ChecksumViewer::new(tool);
let (checksum, elapsed) = match db_table {
Tables::AccountsHistory => viewer.get_checksum::<AccountsHistory>().unwrap(),
Tables::AccountChangeSets => viewer.get_checksum::<AccountChangeSets>().unwrap(),
Tables::AccountsTrie => viewer.get_checksum::<AccountsTrie>().unwrap(),
Tables::BlockBodyIndices => viewer.get_checksum::<BlockBodyIndices>().unwrap(),
Tables::BlockOmmers => viewer.get_checksum::<BlockOmmers>().unwrap(),
Tables::BlockWithdrawals => viewer.get_checksum::<BlockWithdrawals>().unwrap(),
Tables::BlockRequests => viewer.get_checksum::<BlockRequests>().unwrap(),
Tables::Bytecodes => viewer.get_checksum::<Bytecodes>().unwrap(),
Tables::CanonicalHeaders => viewer.get_checksum::<CanonicalHeaders>().unwrap(),
Tables::HashedAccounts => viewer.get_checksum::<HashedAccounts>().unwrap(),
Tables::HashedStorages => viewer.get_checksum::<HashedStorages>().unwrap(),
Tables::HeaderNumbers => viewer.get_checksum::<HeaderNumbers>().unwrap(),
Tables::HeaderTerminalDifficulties => {
viewer.get_checksum::<HeaderTerminalDifficulties>().unwrap()
}
Tables::Headers => viewer.get_checksum::<Headers>().unwrap(),
Tables::PlainAccountState => viewer.get_checksum::<PlainAccountState>().unwrap(),
Tables::PlainStorageState => viewer.get_checksum::<PlainStorageState>().unwrap(),
Tables::PruneCheckpoints => viewer.get_checksum::<PruneCheckpoints>().unwrap(),
Tables::Receipts => viewer.get_checksum::<Receipts>().unwrap(),
Tables::StageCheckpointProgresses => {
viewer.get_checksum::<StageCheckpointProgresses>().unwrap()
}
Tables::StageCheckpoints => viewer.get_checksum::<StageCheckpoints>().unwrap(),
Tables::StorageChangeSets => viewer.get_checksum::<StorageChangeSets>().unwrap(),
Tables::StoragesHistory => viewer.get_checksum::<StoragesHistory>().unwrap(),
Tables::StoragesTrie => viewer.get_checksum::<StoragesTrie>().unwrap(),
Tables::TransactionBlocks => viewer.get_checksum::<TransactionBlocks>().unwrap(),
Tables::TransactionHashNumbers => {
viewer.get_checksum::<TransactionHashNumbers>().unwrap()
}
Tables::TransactionSenders => viewer.get_checksum::<TransactionSenders>().unwrap(),
Tables::Transactions => viewer.get_checksum::<Transactions>().unwrap(),
Tables::VersionHistory => viewer.get_checksum::<VersionHistory>().unwrap(),
};
let (checksum, elapsed) =
tables_to_generic!(db_table, |Table| viewer.get_checksum::<Table>()).unwrap();

// increment duration for final report
total_elapsed += elapsed;
Expand Down
25 changes: 25 additions & 0 deletions crates/storage/db/src/tables/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,31 @@ macro_rules! tables {
pub(super) const $name: &'static str = stringify!($name);
)*
}

/// Maps a run-time [`Tables`] enum value to its corresponding compile-time [`Table`] type.
///
/// # Examples
///
/// ```
/// use reth_db::tables::{Table, Tables, tables_to_generic};
///
/// let table = Tables::Headers;
/// let result = tables_to_generic!(table, |GenericTable| GenericTable::TABLE);
/// assert_eq!(result, table);
/// ```
#[macro_export]
macro_rules! tables_to_generic {
($table:expr, |$_name:ident| $e:expr) => {
match $table {
$(
Tables::$name => {
use $crate::tables::$table as $_name;
$e
},
)*
}
};
}
};
}

Expand Down

0 comments on commit a2d1774

Please sign in to comment.