(LedgerStore) Change perf_samples_counter from Arc<AtomicUsize> to AtomicUsize (#25043)

#### Problem
After #25042, each LedgerColumn has its own BlockstoreRocksDbWritePerfMetrics
and BlockstoreRocksDbReadPerfMetrics instances.  As it has total ownership,
its member field does not need to use Arc.

#### Summary of Changes
Change perf_samples_counter from Arc<AtomicUsize> to AtomicUsize
under BlockstoreRocksDbWritePerfMetrics and BlockstoreRocksDbReadPerfMetrics.
This commit is contained in:
Yueh-Hsuan Chiang 2022-05-16 11:31:07 -07:00 committed by GitHub
parent 196de1c043
commit 5625959f7e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 15 deletions

View File

@ -4,8 +4,7 @@ use {
blockstore_meta, blockstore_meta,
blockstore_metrics::{ blockstore_metrics::{
maybe_enable_rocksdb_perf, report_rocksdb_read_perf, report_rocksdb_write_perf, maybe_enable_rocksdb_perf, report_rocksdb_read_perf, report_rocksdb_write_perf,
BlockstoreRocksDbColumnFamilyMetrics, BlockstoreRocksDbPerfSamplingStatus, BlockstoreRocksDbColumnFamilyMetrics, ColumnMetrics, PerfSamplingStatus,
ColumnMetrics,
}, },
rocksdb_metric_header, rocksdb_metric_header,
}, },
@ -308,7 +307,7 @@ struct Rocks {
access_type: AccessType, access_type: AccessType,
oldest_slot: OldestSlot, oldest_slot: OldestSlot,
column_options: LedgerColumnOptions, column_options: LedgerColumnOptions,
write_batch_perf_status: BlockstoreRocksDbPerfSamplingStatus, write_batch_perf_status: PerfSamplingStatus,
} }
impl Rocks { impl Rocks {
@ -340,7 +339,7 @@ impl Rocks {
access_type: access_type.clone(), access_type: access_type.clone(),
oldest_slot, oldest_slot,
column_options, column_options,
write_batch_perf_status: BlockstoreRocksDbPerfSamplingStatus::default(), write_batch_perf_status: PerfSamplingStatus::default(),
}, },
AccessType::Secondary => { AccessType::Secondary => {
let secondary_path = path.join("solana-secondary"); let secondary_path = path.join("solana-secondary");
@ -361,7 +360,7 @@ impl Rocks {
access_type: access_type.clone(), access_type: access_type.clone(),
oldest_slot, oldest_slot,
column_options, column_options,
write_batch_perf_status: BlockstoreRocksDbPerfSamplingStatus::default(), write_batch_perf_status: PerfSamplingStatus::default(),
} }
} }
}; };
@ -985,14 +984,14 @@ impl TypedColumn for columns::ErasureMeta {
type Type = blockstore_meta::ErasureMeta; type Type = blockstore_meta::ErasureMeta;
} }
#[derive(Debug, Clone)] #[derive(Debug)]
pub struct Database { pub struct Database {
backend: Arc<Rocks>, backend: Arc<Rocks>,
path: Arc<Path>, path: Arc<Path>,
column_options: Arc<LedgerColumnOptions>, column_options: Arc<LedgerColumnOptions>,
} }
#[derive(Debug, Clone)] #[derive(Debug)]
pub struct LedgerColumn<C> pub struct LedgerColumn<C>
where where
C: Column + ColumnName + ColumnMetrics, C: Column + ColumnName + ColumnMetrics,
@ -1000,8 +999,8 @@ where
backend: Arc<Rocks>, backend: Arc<Rocks>,
column: PhantomData<C>, column: PhantomData<C>,
pub column_options: Arc<LedgerColumnOptions>, pub column_options: Arc<LedgerColumnOptions>,
read_perf_status: BlockstoreRocksDbPerfSamplingStatus, read_perf_status: PerfSamplingStatus,
write_perf_status: BlockstoreRocksDbPerfSamplingStatus, write_perf_status: PerfSamplingStatus,
} }
impl<C: Column + ColumnName + ColumnMetrics> LedgerColumn<C> { impl<C: Column + ColumnName + ColumnMetrics> LedgerColumn<C> {
@ -1248,8 +1247,8 @@ impl Database {
backend: Arc::clone(&self.backend), backend: Arc::clone(&self.backend),
column: PhantomData, column: PhantomData,
column_options: Arc::clone(&self.column_options), column_options: Arc::clone(&self.column_options),
read_perf_status: BlockstoreRocksDbPerfSamplingStatus::default(), read_perf_status: PerfSamplingStatus::default(),
write_perf_status: BlockstoreRocksDbPerfSamplingStatus::default(), write_perf_status: PerfSamplingStatus::default(),
} }
} }

View File

@ -245,7 +245,7 @@ thread_local! {static PER_THREAD_ROCKS_PERF_CONTEXT: RefCell<PerfContext> = RefC
/// and the PerfContext of the ubsequent RocksDB operation will be collected. /// and the PerfContext of the ubsequent RocksDB operation will be collected.
pub(crate) fn maybe_enable_rocksdb_perf( pub(crate) fn maybe_enable_rocksdb_perf(
sample_interval: usize, sample_interval: usize,
perf_samples_counter: &Arc<AtomicUsize>, perf_samples_counter: &AtomicUsize,
) -> bool { ) -> bool {
if sample_interval == 0 { if sample_interval == 0 {
return false; return false;
@ -512,11 +512,11 @@ pub(crate) fn report_rocksdb_write_perf(metric_header: &'static str) {
}); });
} }
#[derive(Debug, Default, Clone)] #[derive(Debug, Default)]
/// A struct that holds the current status of RocksDB perf sampling. /// A struct that holds the current status of RocksDB perf sampling.
pub struct BlockstoreRocksDbPerfSamplingStatus { pub struct PerfSamplingStatus {
// The number of RocksDB operations since the last perf sample. // The number of RocksDB operations since the last perf sample.
pub(crate) op_count: Arc<AtomicUsize>, pub(crate) op_count: AtomicUsize,
} }
pub trait ColumnMetrics { pub trait ColumnMetrics {