From e972db03bd7c4481a0801b4e797a62e7573d839e Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 18 Sep 2020 23:08:34 +0000 Subject: [PATCH] Add blocktime column to blockstore (bp #12336) (#12341) * Add blocktime column to blockstore (#12336) (cherry picked from commit 95ed3641c630d318251f051253bee0610248f3e3) # Conflicts: # ledger/src/blockstore_db.rs * Fix conflict Co-authored-by: Tyera Eulberg Co-authored-by: Tyera Eulberg --- ledger/src/blockstore.rs | 5 ++++ ledger/src/blockstore/blockstore_purge.rs | 8 ++++++ ledger/src/blockstore_db.rs | 34 +++++++++++++++++++---- 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/ledger/src/blockstore.rs b/ledger/src/blockstore.rs index 647853535f..0c0486c94e 100644 --- a/ledger/src/blockstore.rs +++ b/ledger/src/blockstore.rs @@ -123,6 +123,7 @@ pub struct Blockstore { transaction_status_index_cf: LedgerColumn, active_transaction_status_index: RwLock, rewards_cf: LedgerColumn, + _blocktime_cf: LedgerColumn, last_root: Arc>, insert_shreds_lock: Arc>, pub new_shreds_signals: Vec>, @@ -278,6 +279,9 @@ impl Blockstore { let address_signatures_cf = db.column(); let transaction_status_index_cf = db.column(); let rewards_cf = db.column(); + // This column is created (but never populated) in order to maintain compatibility with + // newer versions of Blockstore. + let _blocktime_cf = db.column(); let db = Arc::new(db); @@ -322,6 +326,7 @@ impl Blockstore { transaction_status_index_cf, active_transaction_status_index: RwLock::new(active_transaction_status_index), rewards_cf, + _blocktime_cf, new_shreds_signals: vec![], completed_slots_senders: vec![], insert_shreds_lock: Arc::new(Mutex::new(())), diff --git a/ledger/src/blockstore/blockstore_purge.rs b/ledger/src/blockstore/blockstore_purge.rs index 649fc5f5f3..a20cfdcd47 100644 --- a/ledger/src/blockstore/blockstore_purge.rs +++ b/ledger/src/blockstore/blockstore_purge.rs @@ -133,6 +133,10 @@ impl Blockstore { & self .db .delete_range_cf::(&mut write_batch, from_slot, to_slot) + .is_ok() + & self + .db + .delete_range_cf::(&mut write_batch, from_slot, to_slot) .is_ok(); let mut w_active_transaction_status_index = self.active_transaction_status_index.write().unwrap(); @@ -223,6 +227,10 @@ impl Blockstore { && self .rewards_cf .compact_range(from_slot, to_slot) + .unwrap_or(false) + && self + ._blocktime_cf + .compact_range(from_slot, to_slot) .unwrap_or(false); compact_timer.stop(); if !result { diff --git a/ledger/src/blockstore_db.rs b/ledger/src/blockstore_db.rs index a85e59befb..d71a55fdad 100644 --- a/ledger/src/blockstore_db.rs +++ b/ledger/src/blockstore_db.rs @@ -9,7 +9,11 @@ use rocksdb::{ }; use serde::de::DeserializeOwned; use serde::Serialize; -use solana_sdk::{clock::Slot, pubkey::Pubkey, signature::Signature}; +use solana_sdk::{ + clock::{Slot, UnixTimestamp}, + pubkey::Pubkey, + signature::Signature, +}; use solana_transaction_status::{Rewards, TransactionStatusMeta}; use std::{collections::HashMap, fs, marker::PhantomData, path::Path, sync::Arc}; use thiserror::Error; @@ -45,6 +49,8 @@ const ADDRESS_SIGNATURES_CF: &str = "address_signatures"; const TRANSACTION_STATUS_INDEX_CF: &str = "transaction_status_index"; /// Column family for Rewards const REWARDS_CF: &str = "rewards"; +/// Column family for Blocktime +const BLOCKTIME_CF: &str = "blocktime"; #[derive(Error, Debug)] pub enum BlockstoreError { @@ -127,6 +133,10 @@ pub mod columns { #[derive(Debug)] /// The rewards column pub struct Rewards; + + #[derive(Debug)] + /// The blocktime column + pub struct Blocktime; } pub enum AccessType { @@ -186,8 +196,9 @@ impl Rocks { recovery_mode: Option, ) -> Result { use columns::{ - AddressSignatures, DeadSlots, DuplicateSlots, ErasureMeta, Index, Orphans, Rewards, - Root, ShredCode, ShredData, SlotMeta, TransactionStatus, TransactionStatusIndex, + AddressSignatures, Blocktime, DeadSlots, DuplicateSlots, ErasureMeta, Index, Orphans, + Rewards, Root, ShredCode, ShredData, SlotMeta, TransactionStatus, + TransactionStatusIndex, }; fs::create_dir_all(&path)?; @@ -220,6 +231,8 @@ impl Rocks { let transaction_status_index_cf_descriptor = ColumnFamilyDescriptor::new(TransactionStatusIndex::NAME, get_cf_options()); let rewards_cf_descriptor = ColumnFamilyDescriptor::new(Rewards::NAME, get_cf_options()); + let blocktime_cf_descriptor = + ColumnFamilyDescriptor::new(Blocktime::NAME, get_cf_options()); let cfs = vec![ (SlotMeta::NAME, meta_cf_descriptor), @@ -238,6 +251,7 @@ impl Rocks { transaction_status_index_cf_descriptor, ), (Rewards::NAME, rewards_cf_descriptor), + (Blocktime::NAME, blocktime_cf_descriptor), ]; // Open the database @@ -275,8 +289,9 @@ impl Rocks { fn columns(&self) -> Vec<&'static str> { use columns::{ - AddressSignatures, DeadSlots, DuplicateSlots, ErasureMeta, Index, Orphans, Rewards, - Root, ShredCode, ShredData, SlotMeta, TransactionStatus, TransactionStatusIndex, + AddressSignatures, Blocktime, DeadSlots, DuplicateSlots, ErasureMeta, Index, Orphans, + Rewards, Root, ShredCode, ShredData, SlotMeta, TransactionStatus, + TransactionStatusIndex, }; vec![ @@ -293,6 +308,7 @@ impl Rocks { AddressSignatures::NAME, TransactionStatusIndex::NAME, Rewards::NAME, + Blocktime::NAME, ] } @@ -518,6 +534,14 @@ impl TypedColumn for columns::Rewards { type Type = Rewards; } +impl SlotColumn for columns::Blocktime {} +impl ColumnName for columns::Blocktime { + const NAME: &'static str = BLOCKTIME_CF; +} +impl TypedColumn for columns::Blocktime { + type Type = UnixTimestamp; +} + impl Column for columns::ShredCode { type Index = (u64, u64);