(LedgerStore) Convert Rocks from tuple to struct with named fields (#24761)
#### Problem The RocksDB wrapper,`Rocks`, under blockstore_db is currently implemented as a tuple with unnamed fields. Accessing its fields requires syntax like `self.0` which limits readability. #### Summary of Changes This PR converts Rocks from tuple to struct so that it has more human-readable fields.
This commit is contained in:
parent
0e0065a3f2
commit
27efcae16c
|
@ -512,12 +512,12 @@ impl OldestSlot {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct Rocks(
|
struct Rocks {
|
||||||
rocksdb::DB,
|
db: rocksdb::DB,
|
||||||
ActualAccessType,
|
actual_access_type: ActualAccessType,
|
||||||
OldestSlot,
|
oldest_slot: OldestSlot,
|
||||||
LedgerColumnOptions,
|
column_options: LedgerColumnOptions,
|
||||||
);
|
}
|
||||||
|
|
||||||
impl Rocks {
|
impl Rocks {
|
||||||
fn open(path: &Path, options: BlockstoreOptions) -> Result<Rocks> {
|
fn open(path: &Path, options: BlockstoreOptions) -> Result<Rocks> {
|
||||||
|
@ -542,15 +542,20 @@ impl Rocks {
|
||||||
|
|
||||||
// Open the database
|
// Open the database
|
||||||
let db = match access_type {
|
let db = match access_type {
|
||||||
AccessType::PrimaryOnly | AccessType::PrimaryOnlyForMaintenance => Rocks(
|
AccessType::PrimaryOnly | AccessType::PrimaryOnlyForMaintenance => Rocks {
|
||||||
DB::open_cf_descriptors(&db_options, path, cf_descriptors)?,
|
db: DB::open_cf_descriptors(&db_options, path, cf_descriptors)?,
|
||||||
ActualAccessType::Primary,
|
actual_access_type: ActualAccessType::Primary,
|
||||||
oldest_slot,
|
oldest_slot,
|
||||||
column_options,
|
column_options,
|
||||||
),
|
},
|
||||||
AccessType::TryPrimaryThenSecondary => {
|
AccessType::TryPrimaryThenSecondary => {
|
||||||
match DB::open_cf_descriptors(&db_options, path, cf_descriptors) {
|
match DB::open_cf_descriptors(&db_options, path, cf_descriptors) {
|
||||||
Ok(db) => Rocks(db, ActualAccessType::Primary, oldest_slot, column_options),
|
Ok(db) => Rocks {
|
||||||
|
db,
|
||||||
|
actual_access_type: ActualAccessType::Primary,
|
||||||
|
oldest_slot,
|
||||||
|
column_options,
|
||||||
|
},
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
let secondary_path = path.join("solana-secondary");
|
let secondary_path = path.join("solana-secondary");
|
||||||
|
|
||||||
|
@ -558,17 +563,17 @@ impl Rocks {
|
||||||
warn!("Trying as secondary at : {:?}", secondary_path);
|
warn!("Trying as secondary at : {:?}", secondary_path);
|
||||||
warn!("This active secondary db use may temporarily cause the performance of another db use (like by validator) to degrade");
|
warn!("This active secondary db use may temporarily cause the performance of another db use (like by validator) to degrade");
|
||||||
|
|
||||||
Rocks(
|
Rocks {
|
||||||
DB::open_cf_as_secondary(
|
db: DB::open_cf_as_secondary(
|
||||||
&db_options,
|
&db_options,
|
||||||
path,
|
path,
|
||||||
&secondary_path,
|
&secondary_path,
|
||||||
cf_names.clone(),
|
cf_names.clone(),
|
||||||
)?,
|
)?,
|
||||||
ActualAccessType::Secondary,
|
actual_access_type: ActualAccessType::Secondary,
|
||||||
oldest_slot,
|
oldest_slot,
|
||||||
column_options,
|
column_options,
|
||||||
)
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -619,14 +624,15 @@ impl Rocks {
|
||||||
// (= all) of invalidated SST files, when combined with newer writes happening at the opposite
|
// (= all) of invalidated SST files, when combined with newer writes happening at the opposite
|
||||||
// edge of the key space. This causes a long and heavy disk IOs and possible write
|
// edge of the key space. This causes a long and heavy disk IOs and possible write
|
||||||
// stall and ultimately, the deadly Replay/Banking stage stall at higher layers.
|
// stall and ultimately, the deadly Replay/Banking stage stall at higher layers.
|
||||||
db.0.set_options_cf(
|
db.db
|
||||||
db.cf_handle(cf_name),
|
.set_options_cf(
|
||||||
&[(
|
db.cf_handle(cf_name),
|
||||||
"periodic_compaction_seconds",
|
&[(
|
||||||
&format!("{}", PERIODIC_COMPACTION_SECONDS),
|
"periodic_compaction_seconds",
|
||||||
)],
|
&format!("{}", PERIODIC_COMPACTION_SECONDS),
|
||||||
)
|
)],
|
||||||
.unwrap();
|
)
|
||||||
|
.unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -697,23 +703,23 @@ impl Rocks {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn cf_handle(&self, cf: &str) -> &ColumnFamily {
|
fn cf_handle(&self, cf: &str) -> &ColumnFamily {
|
||||||
self.0
|
self.db
|
||||||
.cf_handle(cf)
|
.cf_handle(cf)
|
||||||
.expect("should never get an unknown column")
|
.expect("should never get an unknown column")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_cf(&self, cf: &ColumnFamily, key: &[u8]) -> Result<Option<Vec<u8>>> {
|
fn get_cf(&self, cf: &ColumnFamily, key: &[u8]) -> Result<Option<Vec<u8>>> {
|
||||||
let opt = self.0.get_cf(cf, key)?;
|
let opt = self.db.get_cf(cf, key)?;
|
||||||
Ok(opt)
|
Ok(opt)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn put_cf(&self, cf: &ColumnFamily, key: &[u8], value: &[u8]) -> Result<()> {
|
fn put_cf(&self, cf: &ColumnFamily, key: &[u8], value: &[u8]) -> Result<()> {
|
||||||
self.0.put_cf(cf, key, value)?;
|
self.db.put_cf(cf, key, value)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn delete_cf(&self, cf: &ColumnFamily, key: &[u8]) -> Result<()> {
|
fn delete_cf(&self, cf: &ColumnFamily, key: &[u8]) -> Result<()> {
|
||||||
self.0.delete_cf(cf, key)?;
|
self.db.delete_cf(cf, key)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -730,11 +736,11 @@ impl Rocks {
|
||||||
IteratorMode::Start => RocksIteratorMode::Start,
|
IteratorMode::Start => RocksIteratorMode::Start,
|
||||||
IteratorMode::End => RocksIteratorMode::End,
|
IteratorMode::End => RocksIteratorMode::End,
|
||||||
};
|
};
|
||||||
self.0.iterator_cf(cf, iterator_mode)
|
self.db.iterator_cf(cf, iterator_mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn raw_iterator_cf(&self, cf: &ColumnFamily) -> DBRawIterator {
|
fn raw_iterator_cf(&self, cf: &ColumnFamily) -> DBRawIterator {
|
||||||
self.0.raw_iterator_cf(cf)
|
self.db.raw_iterator_cf(cf)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn batch(&self) -> RWriteBatch {
|
fn batch(&self) -> RWriteBatch {
|
||||||
|
@ -743,12 +749,12 @@ impl Rocks {
|
||||||
|
|
||||||
fn write(&self, batch: RWriteBatch) -> Result<()> {
|
fn write(&self, batch: RWriteBatch) -> Result<()> {
|
||||||
let is_perf_context_enabled = maybe_collect_perf_context();
|
let is_perf_context_enabled = maybe_collect_perf_context();
|
||||||
let result = self.0.write(batch);
|
let result = self.db.write(batch);
|
||||||
if is_perf_context_enabled {
|
if is_perf_context_enabled {
|
||||||
report_write_perf_context(rocksdb_metric_header!(
|
report_write_perf_context(rocksdb_metric_header!(
|
||||||
"blockstore_rocksdb_write_perf,op=write_batch",
|
"blockstore_rocksdb_write_perf,op=write_batch",
|
||||||
"write_batch",
|
"write_batch",
|
||||||
self.3
|
self.column_options
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
match result {
|
match result {
|
||||||
|
@ -758,7 +764,7 @@ impl Rocks {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_primary_access(&self) -> bool {
|
fn is_primary_access(&self) -> bool {
|
||||||
self.1 == ActualAccessType::Primary
|
self.actual_access_type == ActualAccessType::Primary
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Retrieves the specified RocksDB integer property of the current
|
/// Retrieves the specified RocksDB integer property of the current
|
||||||
|
@ -767,7 +773,7 @@ impl Rocks {
|
||||||
/// Full list of properties that return int values could be found
|
/// Full list of properties that return int values could be found
|
||||||
/// [here](https://github.com/facebook/rocksdb/blob/08809f5e6cd9cc4bc3958dd4d59457ae78c76660/include/rocksdb/db.h#L654-L689).
|
/// [here](https://github.com/facebook/rocksdb/blob/08809f5e6cd9cc4bc3958dd4d59457ae78c76660/include/rocksdb/db.h#L654-L689).
|
||||||
fn get_int_property_cf(&self, cf: &ColumnFamily, name: &str) -> Result<i64> {
|
fn get_int_property_cf(&self, cf: &ColumnFamily, name: &str) -> Result<i64> {
|
||||||
match self.0.property_int_value_cf(cf, name) {
|
match self.db.property_int_value_cf(cf, name) {
|
||||||
Ok(Some(value)) => Ok(value.try_into().unwrap()),
|
Ok(Some(value)) => Ok(value.try_into().unwrap()),
|
||||||
Ok(None) => Ok(0),
|
Ok(None) => Ok(0),
|
||||||
Err(e) => Err(BlockstoreError::RocksDb(e)),
|
Err(e) => Err(BlockstoreError::RocksDb(e)),
|
||||||
|
@ -2162,7 +2168,7 @@ impl Database {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_oldest_slot(&self, oldest_slot: Slot) {
|
pub fn set_oldest_slot(&self, oldest_slot: Slot) {
|
||||||
self.backend.2.set(oldest_slot);
|
self.backend.oldest_slot.set(oldest_slot);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2229,7 +2235,7 @@ where
|
||||||
let cf = self.handle();
|
let cf = self.handle();
|
||||||
let from = Some(C::key(C::as_index(from)));
|
let from = Some(C::key(C::as_index(from)));
|
||||||
let to = Some(C::key(C::as_index(to)));
|
let to = Some(C::key(C::as_index(to)));
|
||||||
self.backend.0.compact_range_cf(cf, from, to);
|
self.backend.db.compact_range_cf(cf, from, to);
|
||||||
Ok(true)
|
Ok(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue